二进制光栅操作

本部分列出了 GetROP2SetROP2 函数使用的二进制光栅操作代码。 光栅操作代码定义 GDI 如何将所选笔中的位与目标位图中的位组合在一起。

每个光栅操作代码都表示一个布尔运算,在该运算中,所选笔中的像素值和目标位图组合在一起。 下面是这些操作中使用的两个操作数。

操作数 含义
P 所选笔
D 目标位图

 

这些操作中使用的布尔运算符如下所示。

运算符 含义
a 位与
n 按位不 (逆)
o 按位“或”
x 按位异或 (XOR)

 

所有布尔运算都以相反的波兰表示法表示。 例如,以下操作将目标位图中的像素值替换为笔和所选画笔的像素值的组合:

DPo 

每个光栅操作代码都是一个 32 位整数,其高阶字是布尔运算索引,低位字是操作代码。 16 位操作索引是一个零扩展的 8 位值,它表示对两个参数的布尔运算产生的所有可能结果 (在本例中,笔值和目标值) 。 例如,DPo 和 DPan 操作的操作索引显示在以下列表中。

P D DPo Dpan
0 0 0 1
0 1 1 1
1 0 1 1
1 1 1 0

 

以下列表概述了绘制模式及其表示的布尔运算。

光栅操作 布尔运算
R2_BLACK 0
R2_COPYPEN P
R2_MASKNOTPEN DPna
R2_MASKPEN Dpa
R2_MASKPENNOT PDna
R2_MERGENOTPEN DPno
R2_MERGEPEN DPo
R2_MERGEPENNOT PDno
R2_NOP D
R2_NOT Dn
R2_NOTCOPYPEN Pn
R2_NOTMASKPEN DPan
R2_NOTMERGEPEN DPon
R2_NOTXORPEN DPxn
R2_WHITE 1
R2_XORPEN DPx

 

对于单色设备,GDI 将值 0 映射到黑色,将值 1 映射到白色。 如果应用程序尝试使用可用的二进制光栅操作在白色目标上使用黑色笔进行绘制,则会发生以下结果。

光栅操作 结果
R2_BLACK 可见黑线
R2_COPYPEN 可见黑线
R2_MASKNOTPEN 无可见行
R2_MASKPEN 可见黑线
R2_MASKPENNOT 可见黑线
R2_MERGENOTPEN 无可见行
R2_MERGEPEN 可见黑线
R2_MERGEPENNOT 可见黑线
R2_NOP 无可见行
R2_NOT 可见黑线
R2_NOTCOPYPEN 无可见行
R2_NOTMASKPEN 无可见行
R2_NOTMERGEPEN 可见黑线
R2_NOTXORPEN 可见黑线
R2_WHITE 无可见行
R2_XORPEN 无可见行

 

对于颜色设备,GDI 使用 RGB 值来表示笔和目标的颜色。 RGB 颜色值是一个长整数,其中包含红色、绿色和蓝色颜色字段,每个字段指定指定颜色的强度。 强度范围为 0 到 255。 这些值打包在长整数的三个低序字节中。 笔的颜色始终是纯色,但目标颜色可以是任意两种或三种颜色的混合。 如果应用程序尝试使用可用的二进制光栅操作在蓝色目标上使用白色笔进行绘制,则会出现以下结果。

光栅操作 结果
R2_BLACK 可见黑线
R2_COPYPEN 可见白线
R2_MASKNOTPEN 可见黑线
R2_MASKPEN 不可见蓝线
R2_MASKPENNOT 可见的红/绿线
R2_MERGENOTPEN 不可见蓝线
R2_MERGEPEN 可见白线
R2_MERGEPENNOT 可见白线
R2_NOP 不可见蓝线
R2_NOT 可见的红/绿线
R2_NOTCOPYPEN 可见黑线
R2_NOTMASKPEN 可见的红/绿线
R2_NOTMERGEPEN 可见黑线
R2_NOTXORPEN 不可见蓝线
R2_WHITE 可见白线
R2_XORPEN 可见的红/绿线