带样式的装饰线条

DrvStrokePath 函数必须支持使用纯色画笔通过任意剪裁绘制修饰线。 驱动程序可以调用 GDI 服务 PATHOBJ_vEnumStartClipLines 来预计算剪辑。

修饰线的样式类似于几何宽线的样式,因为它由重复数组指定。 对于带样式的修饰线,数组条目是包含样式步骤中的长度的 LONG 值。 样式步骤和像素之间的关系由 DrvEnablePDEV 函数返回的 GDIINFO 结构中的 xStyleStepyStyleStepdenStyleStep 字段定义。

当驱动程序调用 PATHOBJ_bEnumClipLines时,为了通过复杂剪裁处理带样式的修饰线,GDI 会修改 CLIPLINE 结构的 iStyleState 成员的值来表示样式状态。 样式状态是回到线段的第一个像素的偏移量;即,如果未剪裁线条,将呈现的第一个像素。 样式状态由两个打包到 ULONG 值的 16 位值组成。 如果 HIGH 和 LOW 是样式状态的高阶和低序 16 位,则样式状态的小数版本(称为样式位置)可以计算为:

style position = HIGH + LOW/denStyleStep

例如,如果 iStyleState 中的值为 1 和 2,denStyleStep 为 3,则样式位置为 5/3。 若要确切确定样式的绘制开始于样式数组的位置,请获取以下产品:

style position * denStyleStep

在此示例中, 如果 denStyleStep 值为 3,则计算绘图位置以排除样式数组的前五个 (5/3 * 3) 像素。 也就是说,绘制从此剪裁线的样式数组中的第六个像素开始。

有 y 样式的修饰线和 x 样式的修饰线。 如果一条线在 x 方向扩展 dx 设备单位,在 y 方向扩展 dy 单位,则当以下情况成立时,该线条将采用 y 样式:

(dy * yStyleStep) >= (dx * xStyleStep)

在本例中,yStyleStep denStyleStep 针对 y方向上前进的每个像素,样式位置是高级的。/

相反,如果以下情况成立,则 x 方向上每个像素的样式位置为 x 样式,并且由 xStyleStep/denStyleStep 提升样式位置:

(dx * xStyleStep) > (dy * yStyleStep)

当样式位置前进到新整数时,样式步骤在样式数组中前进一个单位。

下图显示了多个具有不同斜率的修饰样式线条。

显示非方形像素网格上具有不同斜率的各种样式修饰线的示意图。

在此图中,显示的像素网格不是方形的,而是与 EGA 显示器一样,其中 x 方向的四个像素表示与 y 方向上的三个像素的距离相同。 GDIINFO 结构中的样式步骤可确保在像素不是正方形的显示器上任何斜率上设置样式的线条都相同。 在此图中,由 LINEATTRS 结构的 pstyle 成员定义的样式数组) (为 {1,1},它是具有相同大小的点和间距的断线。 xStyleStep 的驱动程序值为 3,yStyleStep4,denStyleStep 为 12。

为了进一步说明,假设点阵打印机的水平分辨率为 144 dpi,垂直分辨率为 72 dpi。 此外,假设最小点的点长度为 1/24 英寸。 若要支持此打印机,请为 xStyleStepyStyleStep 选择可补偿打印机纵横比的最小数字,例如 1( xStyleStep )和 2 (144/72) (对于 yStyleStep),为 denStyleStep 选择 6 (144/24) 。

如果在 LINEATTRS 结构的 标志中设置了LA_ALTERNATE位,则会对修饰线使用特殊样式。 在这种情况下,无论方向或纵横比如何,其他每个像素都处于打开的状态。 样式状态将返回,就好像样式数组为 {1,1} , xStyleStepyStyleStepdenStyleStep 都是一个。 换句话说,如果 lStyleState 为零,则第一个像素处于打开状态;如果 lStyleState 为 1,则第一个像素处于关闭状态。

如果在 LINEATTRS 标志中设置了LA_STARTGAP位,则样式数组中元素的感觉将反转。 第一个数组条目指定第一个间隔的长度,第二个条目指定第一个短划线的长度,依此类推。