三元光栅操作


作者 孙天胜



   
本文列出了供BitBltPatBltStretchBlt函数使用的三元光栅操作码。三元光栅操作码定义了如何合并源位图和目的位图的位。
   
每一光栅操作码都提供了一个布尔操作,也就是如何合并源位图中的象素、选中的画刷和目的位图中的象素。下面是这些操作中所用到的操作对象:

操作对象

意义

D

目的位图

P

选中的画刷 (也叫模式)

S

源位图


下面是这些操作中所用到的布尔操作符:

操作符

意义

a

AND(按位与)

n

NOT(按位取反)

o

OR (按位或)

x

XOR(按位异或)


所有的布尔操作都采用逆波兰表示法。例如,下面的操作将使用源位图象素和画刷的合并来替换目的位图中的象素:

PSo

下面的操作将使源位图中的象素与画刷的合并再合并上目的位图中的象素(同一功能有很多可变的拼写方法,因此,一个特殊的拼写方法可能没有罗列出来,而与之等价的一种格式可能罗列出来了):

DPSoo

每一光栅操作码是一32位整数,其高位字(high-order word)是布尔操作索引,其低位字(low-order word)是操作码。16位的操作索引从0开始,8位值表示预定画刷、源位图和目的位图进行布尔操作的结果。例如,PSoDPSoo的操作索引如下:

P

S

D

PSo

DPSoo

0

0

0

0

0

0

0

1

0

1

0

1

0

1

1

0

1

1

1

1

1

0

0

1

1

1

0

1

1

1

1

1

0

1

1

1

1

1

1

1

操作索引:

 

 

00FCh

00FEh


因此, PSo的操作索引是00FC (从最底行读出); DPSoo 的操作索引是 00FE。这些值定义了相应的光栅操作码的位置,如表A.1,所示,"光栅操作码"PSo 操作在第252 (00FCh) ; DPSoo 操作在第254 (00FEh)行。 最常用的光栅操作已经在SDK头文件WINDOWS.H中给出指定的名字。你应该在你的程序里使用这些名字。 当源位图和目的位图是单色的时候,位值0表示黑色象素,位值1表示白色象素。当源位图和目的位图是彩色的时候,这些颜色表示RGB值。有关RGB值的详细信息,请参见RGB

光栅操作码:

布尔 功能 (十六进制)

光栅操作 (十六进制)

逆波兰式的布尔功能

常用名称

描述

00

00000042

0

BLACKNESS

将目的设置成黑色

01

00010289

DPSoon

Dest=NOT ((Patten OR Src) OR Dest)

02

00020C89

DPSona

Dest=(NOT (Patten OR Src)) AND Dest

03

000300AA

PSon

Dest=NOT (Patten OR Src)

04

00040C88

SDPona

Dest=(NOT (Patten OR Dest)) AND Src

05

000500A9

DPon

Dest=NOT (Patten OR Dest)

06

00060865

PDSxnon

Dest=NOT ((NOT (Dest XOR Src)) OR Patten)

07

000702C5

PDSaon

Dest=NOT ((Dest AND Src) OR Patten)

08

00080F08

SDPnaa

Dest=(NOT Patten) AND Dest AND Src

09

00090245

PDSxon

Dest=NOT ((Dest XOR Src) OR Patten)

0A

000A0329

DPna

Dest=(NOT Patten) AND Dest

0B

000B0B2A

PSDnaon

Dest=NOT (((NOT Dest) AND Src) OR Patten)

0C

000C0324

SPna

Dest=(NOT Patten) AND Src

0D

000D0B25

PDSnaon

Dest=NOT (((NOT Src) AND Dest) OR Patten)

0E

000E08A5

PDSonon

Dest=NOT ((NOT (Dest OR Src)) OR Patten)

0F

000F0001

Pn

Dest=NOT Patten

10

00100C85

PDSona

Dest=(NOT (Dest OR Src)) AND Patten

11

001100A6

DSon

NOTSRCERASE

Dest=NOT (Dest OR Src)

12

00120868

SDPxnon

Dest=NOT ((NOT (Dest XOR Patten)) OR Src)

13

001302C8

SDPaon

Dest=NOT ((Dest AND Patten) OR Src)

14

00140869

DPSxnon

Dest=NOT ((NOT (Patten XOR Src)) OR Dest)

15

001502C9

DPSaon

Dest=NOT ((Patten AND Src) OR Dest)

16

00165CCA

PSDPSanaxx

Dest=(((NOT (Patten AND Src)) AND Dest) XOR Src) XOR Patten

17

00171D54

SSPxDSxaxn

Dest=NOT (((Src XOR Patten) AND (Dest XOR Src)) XOR Src)

18

00180D59

SPxPDxa

Dest=(Src XOR Patten) AND (Dest XOR Patten)

19

00191CC8

SDPSanaxn

Dest=NOT (((NOT (Patten AND Src)) AND Dest) XOR Src)

1A

001A06C5

PDSPaox

Dest=((Src AND Patten) OR Dest) XOR Patten

1B

001B0768

SDPSxaxn

Dest=NOT (((Patten XOR Src) AND Dest) XOR Src)

1C

001C06CA

PSDPaox

Dest=((Dest AND Patten) OR Src) XOR Patten

1D

001D0766

DSPDxaxn

Dest=NOT (((Patten XOR Dest) AND Src) XOR Dest)

1E

001E01A5

PDSox

Dest=(Dest OR Src) XOR Patten

1F

001F0385

PDSoan

Dest=NOT ((Dest OR Src) AND Patten)

20

00200F09

DPSnaa

Dest=(NOT Src) AND Patten AND Dest

21

00210248

SDPxon

Dest=NOT ((Dest XOR Patten) OR Src)

22

00220326

DSna

Dest=(NOT Src) AND Dest

23

00230B24

SPDnaon

Dest=NOT (((NOT Dest) AND Patten) OR Src)

24

00240D55

SPxDSxa

Dest=(Src XOR Patten) AND (Dest XOR Src)

25

00251CC5

PDSPanaxn

Dest=NOT (((NOT (Src AND Patten)) AND Dest) XOR Patten)

26

002606C8

SDPSaox

Dest=((Patten AND Src) OR Dest) XOR Src

27

00271868

SDPSxnox

Dest=((NOT (Patten XOR Src)) OR Dest) XOR Src

28

00280369

DPSxa

Dest=(Patten XOR Src) AND Dest

29

002916CA

PSDPSaoxxn

Dest=NOT ((((Patten AND Src) OR Dest) XOR Src) XOR Patten)

2A

002A0CC9

DPSana

Dest=(NOT (Patten AND Src)) AND Dest

2B

002B1D58

SSPxPDxaxn

Dest=NOT (((Src XOR Patten) AND (Patten XOR Dest)) XOR Src)

2C

002C0784

SPDSoax

Dest=((Dest OR Src) AND Patten) XOR Src

2D

002D060A

PSDnox

Dest=((NOT Dest) OR Src) XOR Patten

2E

002E064A

PSDPxox

Dest=((Dest XOR Patten) OR Src) XOR Patten

2F

002F0E2A

PSDnoan

Dest=NOT (((NOT Dest) OR Src) AND Patten)

30

0030032A

PSna

Dest=(NOT Src) AND Patten

31

00310B28

SDPnaon

Dest=NOT (((NOT Patten) AND Dest) OR Src)

32

00320688

SDPSoox

Dest=((Patten OR Src) OR Dest) XOR Src

33

00330008

Sn

NOTSRCCOPY

Dest= NOT Src

34

003406C4

SPDSaox

Dest=((Dest AND Src) OR Patten) XOR Src

35

00351864

SPDSxnox

Dest=((NOT (Dest XOR Src)) OR Patten) XOR Src

36

003601A8

SDPox

Dest=(Dest OR Patten) XOR Src

37

00370388

SDPoan

Dest=NOT ((Dest OR Patten) AND Src)

38

0038078A

PSDPoax

Dest=((Dest OR Patten) AND Src) XOR Patten

39

00390604

SPDnox

Dest=((NOT Dest) OR Patten) XOR Src

3A

003A0644

SPDSxox

Dest=((Dest XOR Src) OR Patten) XOR Src

3B

003B0E24

SPDnoan

Dest=NOT (((NOT Dest) OR Patten) AND Src)

3C

003C004A

PSx

Dest=Patten XOR Src

3D

003D18A4

SPDSonox

Dest=((NOT (Dest OR Src)) OR Patten) XOR Src

3E

003E1B24

SPDSnaox

Dest=(((NOT Src) AND Dest) OR Patten) XOR Src

3F

003F00EA

PSan

Dest=NOT (Patten AND Src)

40

00400F0A

PSDnaa

Dest=(NOT Dest) AND Src AND Patten

41

00410249

DPSxon

Dest=NOT ((Patten XOR Src) OR Dest)

42

00420D5D

SDxPDxa

Dest=(Src XOR Dest) AND (Patten XOR Dest)

43

00431CC4

SPDSanaxn

Dest=NOT (((NOT (Dest AND Src)) AND Patten) XOR Src)

44

00440328

SDna

SRCERASE

Dest=(NOT Dest) AND Src

45

00450B29

DPSnaon

Dest=NOT (((NOT Src) AND Patten) OR Dest)

46

004606C6

DSPDaox

Dest=((Patten AND Dest) OR Src) XOR Dest

47

0047076A

PSDPxaxn

Dest=NOT (((Dest XOR Patten) AND Src) XOR Patten)

48

00480368

SDPxa

Dest=(Dest XOR Patten) AND Src

49

004916C5

PDSPDaoxxn

Dest=NOT (((Patten AND Dest) OR Src) XOR Dest XOR Patten)

4A

004A0789

DPSDoax

Dest=((Src OR Dest) AND Patten) XOR Dest

4B

004B0605

PDSnox

Dest=((NOT Src) OR Dest) XOR Patten

4C

004C0CC8

SDPana

Dest=(NOT (Dest AND Patten)) AND Src

4D

004D1954

SSPxDSxoxn

Dest=NOT (((Src XOR Patten) OR (Src XOR Dest)) XOR Src)

4E

004E0645

PDSPxox

Dest=((Src XOR Patten) OR Dest) XOR Patten

4F

004F0E25

PDSnoan

Dest=NOT (((NOT Src) OR Dest) AND Patten)

50

00500325

PDna

Dest=(NOT Dest) AND Patten

51

00510B26

DSPnaon

Dest=NOT (((NOT Patten) AND Src) OR Dest)

52

005206C9

DPSDaox

Dest=((Src AND Dest) OR Patten) XOR Dest

53

00530764

SPDSxaxn

Dest=NOT (((Dest XOR Src) AND Patten) XOR Src)

54

005408A9

DPSonon

Dest=NOT ((NOT (Patten OR Src)) OR Dest)

55

00550009

Dn

DSTINVERT

Dest=NOT Dest

56

005601A9

DPSox

Dest=(Patten OR Src) XOR Dest

57

00570389

DPSoan

Dest=NOT ((Patten OR Src) AND Dest)

58

00580785

PDSPoax

Dest=((Src OR Patten) AND Dest) XOR Patten

59

00590609

DPSnox

Dest=((NOT Src) OR Patten) XOR Dest

5A

005A0049

DPx

PATINVERT

Dest=Dest XOR Patten

5B

005B18A9

DPSDonox

Dest=((NOT (Src OR Dest)) OR Patten) XOR Dest

5C

005C0649

DPSDxox

Dest=((Src XOR Dest) OR Patten) XOR Dest

5D

005D0E29

DPSnoan

Dest=NOT (((NOT Src) OR Patten) AND Dest)

5E

005E1B29

DPSDnaox

Dest=(((NOT Dest) AND Src) OR Patten) XOR Dest

5F