装饰线条

整形线始终为一个像素宽,并使用纯色画笔绘制。 它根据网格交集量化 (GIQ) 菱形约定进行呈现,该约定确定应打开哪些像素来呈现修饰线。

下图显示了一条叠加在矩形网格上的线条,其中像素位于网格交点处。 若要确定应照亮哪些像素,请想象一个菱形,以线条为中心,沿它滑动。 菱形的宽度和高度完全等于相邻像素中心之间的距离。 当菱形沿线移动时,将打开中心完全覆盖菱形的任何像素。 如果一条线穿过两个相邻像素之间的一个点,则要打开的像素取决于线条的斜率和相邻像素的方向方式:水平 (并排) ,或垂直 (另一个) 。

下表总结了这些情况。

直线 (绝对值) 的斜率 相邻像素方向 结果

斜率 < 1

斜率 > 1

水平旋转

点亮菱形左顶点的像素。

斜率 < 1

斜率 > 1

垂直

点亮菱形顶点的像素。

斜率 = 1

水平旋转

点亮菱形顶点的像素。

斜率 = 1

垂直

点亮菱形右顶点的像素。

对于斜率介于 -1 和 1 之间的线条,菱形约定为每个列中的一个像素点亮;对于绝对值斜率大于 1 的线条,每行中为一个像素。 这样,将呈现无间隙的修饰线。

修饰线的开始和结束像素也由菱形约定决定。 整形线是第一个像素(非独占像素)和“最后像素排他性”;也就是说,如果线条从某个像素的菱形内部开始,该像素将被照亮。 同样,如果线条在菱形内结束一个像素,则不会照亮该像素。

下图演示了整形线的菱形约定。

说明用于呈现修饰线的 GIQ 菱形约定的示意图。

对于呈现修饰线, DrvStrokePath 函数遵循 GIQ 菱形约定。 DrvLineTo 函数是一个可选的入口点,驱动程序可以提供该入口点作为对 Microsoft Win32 LineTo 函数的应用程序调用的优化。 DrvLineToDrvStrokePath 更简单,因为它仅支持整数终点和实线整形线。

对于支持R2_NOT混合模式的光栅设备(将目标颜色更改为反的二进制光栅操作),驱动程序必须使用精确呈现。 对于需要通过 GDI 和驱动程序进行呈现的设备,呈现也应该是精确的。 这包括 GDI 在某些位图上绘制的设备,驱动程序在 (的其他图面上绘制,除非像素太小而无法) 产生任何明显差异。 这还包括请求 GDI 处理复杂剪辑的设备。