Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

560 lines
25 KiB

  1. /*++
  2. Copyright (c) 1990-2003 Microsoft Corporation
  3. Module Name:
  4. ropblt.h
  5. Abstract:
  6. This module contains all raster operation codes, #defines and structures.
  7. Author:
  8. 07-Jan-1994 Fri 13:05:10 created
  9. [Environment:]
  10. GDI Device Driver - Plotter.
  11. [Notes:]
  12. Revision History:
  13. --*/
  14. #ifndef _ROPBLT_
  15. #define _ROPBLT_
  16. //
  17. // This table defines the Raster Operations. They are listed in RPN and
  18. //
  19. // D = Destination surface
  20. // S = Source surface
  21. // P = Pattern
  22. // o = OR operator
  23. // a = AND operator
  24. // n = NOT operator
  25. // x = XOR operator
  26. //
  27. //*****************************************************************************
  28. // R A S T E R O P E R A T I O N S
  29. //*****************************************************************************
  30. //
  31. //
  32. // Dec Hex Logical Operations RPN notation Common name
  33. // -----------------------------------------------------------------------
  34. // 0-0x00 0 0
  35. // 1-0x01 ~(D | (P | S)) DPSoon
  36. // 2-0x02 D & ~(P | S) DPSona
  37. // 3-0x03 ~(P | S) PSon
  38. // 4-0x04 S & ~(D | P) SDPona
  39. // 5-0x05 ~(D | P) DPon
  40. // 6-0x06 ~(P | ~(D ^ S)) PDSxnon
  41. // 7-0x07 ~(P | (D & S)) PDSaon
  42. // 8-0x08 S & (D & ~P) SDPnaa
  43. // 9-0x09 ~(P | (D ^ S)) PDSxon
  44. // 10-0x0a D & ~P DPna
  45. // 11-0x0b ~(P | (S & ~D)) PSDnaon
  46. // 12-0x0c S & ~P SPna
  47. // 13-0x0d ~(P | (D & ~S)) PDSnaon
  48. // 14-0x0e ~(P | ~(D | S)) PDSonon
  49. // 15-0x0f ~P Pn
  50. // 16-0x10 P & ~(D | S) PDSona
  51. // 17-0x11 ~(D | S) DSon NOTSRCERASE
  52. // 18-0x12 ~(S | ~(D ^ P)) SDPxnon
  53. // 19-0x13 ~(S | (D & P)) SDPaon
  54. // 20-0x14 ~(D | ~(P ^ S)) DPSxnon
  55. // 21-0x15 ~(D | (P & S)) DPSaon
  56. // 22-0x16 P ^ (S ^ (D & ~(P & S))) PSDPSanaxx
  57. // 23-0x17 ~(S ^ ((S ^ P) & (D ^ S))) SSPxDSxaxn
  58. // 24-0x18 (S ^ P) & (P ^ D) SPxPDxa
  59. // 25-0x19 ~(S ^ (D & ~(P & S))) SDPSanaxn
  60. // 26-0x1a P ^ (D | (S & P)) PDSPaox
  61. // 27-0x1b ~(S ^ (D & (P ^ S))) SDPSxaxn
  62. // 28-0x1c P ^ (S | (D & P)) PSDPaox
  63. // 29-0x1d ~(D ^ (S & (P ^ D))) DSPDxaxn
  64. // 30-0x1e P ^ (D | S) PDSox
  65. // 31-0x1f ~(P & (D | S)) PDSoan
  66. // 32-0x20 D & (P & ~S) DPSnaa
  67. // 33-0x21 ~(S | (D ^ P)) SDPxon
  68. // 34-0x22 D & ~S DSna
  69. // 35-0x23 ~(S | (P & ~D)) SPDnaon
  70. // 36-0x24 (S ^ P) & (D ^ S) SPxDSxa
  71. // 37-0x25 ~(P ^ (D & ~(S & P))) PDSPanaxn
  72. // 38-0x26 S ^ (D | (P & S)) SDPSaox
  73. // 39-0x27 S ^ (D | ~(P ^ S)) SDPSxnox
  74. // 40-0x28 D & (P ^ S) DPSxa
  75. // 41-0x29 ~(P ^ (S ^ (D | (P & S)))) PSDPSaoxxn
  76. // 42-0x2a D & ~(P & S) DPSana
  77. // 43-0x2b ~(S ^ ((S ^ P) & (P ^ D))) SSPxPDxaxn
  78. // 44-0x2c S ^ (P & (D | S)) SPDSoax
  79. // 45-0x2d P ^ (S | ~D) PSDnox
  80. // 46-0x2e P ^ (S | (D ^ P)) PSDPxox
  81. // 47-0x2f ~(P & (S | ~D)) PSDnoan
  82. // 48-0x30 P & ~S PSna
  83. // 49-0x31 ~(S | (D & ~P)) SDPnaon
  84. // 50-0x32 S ^ (D | (P | S)) SDPSoox
  85. // 51-0x33 ~S Sn NOTSRCCOPY
  86. // 52-0x34 S ^ (P | (D & S)) SPDSaox
  87. // 53-0x35 S ^ (P | ~(D ^ S)) SPDSxnox
  88. // 54-0x36 S ^ (D | P) SDPox
  89. // 55-0x37 ~(S & (D | P)) SDPoan
  90. // 56-0x38 P ^ (S & (D | P)) PSDPoax
  91. // 57-0x39 S ^ (P | ~D) SPDnox
  92. // 58-0x3a S ^ (P | (D ^ S)) SPDSxox
  93. // 59-0x3b ~(S & (P | ~D)) SPDnoan
  94. // 60-0x3c P ^ S PSx
  95. // 61-0x3d S ^ (P | ~(D | S)) SPDSonox
  96. // 62-0x3e S ^ (P | (D & ~S)) SPDSnaox
  97. // 63-0x3f ~(P & S) PSan
  98. // 64-0x40 P & (S & ~D) PSDnaa
  99. // 65-0x41 ~(D | (P ^ S)) DPSxon
  100. // 66-0x42 (S ^ D) & (P ^ D) SDxPDxa
  101. // 67-0x43 ~(S ^ (P & ~(D & S))) SPDSanaxn
  102. // 68-0x44 S & ~D SDna SRCERASE
  103. // 69-0x45 ~(D | (P & ~S)) DPSnaon
  104. // 70-0x46 D ^ (S | (P & D)) DSPDaox
  105. // 71-0x47 ~(P ^ (S & (D ^ P))) PSDPxaxn
  106. // 72-0x48 S & (D ^ P) SDPxa
  107. // 73-0x49 ~(P ^ (D ^ (S | (P & D)))) PDSPDaoxxn
  108. // 74-0x4a D ^ (P & (S | D)) DPSDoax
  109. // 75-0x4b P ^ (D | ~S) PDSnox
  110. // 76-0x4c S & ~(D & P) SDPana
  111. // 77-0x4d ~(S ^ ((S ^ P) | (D ^ S))) SSPxDSxoxn
  112. // 78-0x4e P ^ (D | (S ^ P)) PDSPxox
  113. // 79-0x4f ~(P & (D | ~S)) PDSnoan
  114. // 80-0x50 P & ~D PDna
  115. // 81-0x51 ~(D | (S & ~P)) DSPnaon
  116. // 82-0x52 D ^ (P | (S & D)) DPSDaox
  117. // 83-0x53 ~(S ^ (P & (D ^ S))) SPDSxaxn
  118. // 84-0x54 ~(D | ~(P | S)) DPSonon
  119. // 85-0x55 ~D Dn DSTINVERT
  120. // 86-0x56 D ^ (P | S) DPSox
  121. // 87-0x57 ~(D & (P | S)) DPSoan
  122. // 88-0x58 P ^ (D & (S | P)) PDSPoax
  123. // 89-0x59 D ^ (P | ~S) DPSnox
  124. // 90-0x5a D ^ P DPx PATINVERT
  125. // 91-0x5b D ^ (P | ~(S | D)) DPSDonox
  126. // 92-0x5c D ^ (P | (S ^ D)) DPSDxox
  127. // 93-0x5d ~(D & (P | ~S)) DPSnoan
  128. // 94-0x5e D ^ (P | (S & ~D)) DPSDnaox
  129. // 95-0x5f ~(D & P) DPan
  130. // 96-0x60 P & (D ^ S) PDSxa
  131. // 97-0x61 ~(D ^ (S ^ (P | (D & S)))) DSPDSaoxxn
  132. // 98-0x62 D ^ (S & (P | D)) DSPDoax
  133. // 99-0x63 S ^ (D | ~P) SDPnox
  134. // 100-0x64 S ^ (D & (P | S)) SDPSoax
  135. // 101-0x65 D ^ (S | ~P) DSPnox
  136. // 102-0x66 D ^ S DSx SRCINVERT
  137. // 103-0x67 S ^ (D | ~(P | S)) SDPSonox
  138. // 104-0x68 ~(D ^ (S ^ (P | ~(D | S)))) DSPDSonoxxn
  139. // 105-0x69 ~(P ^ (D ^ S)) PDSxxn
  140. // 106-0x6a D ^ (P & S) DPSax
  141. // 107-0x6b ~(P ^ (S ^ (D & (P | S)))) PSDPSoaxxn
  142. // 108-0x6c S ^ (D & P) SDPax
  143. // 109-0x6d ~(P ^ (D ^ (S & (P | D)))) PDSPDoaxxn
  144. // 110-0x6e S ^ (D & (P | ~S)) SDPSnoax
  145. // 111-0x6f ~(P & ~(D ^ S)) PDSxnan
  146. // 112-0x70 P & ~(D & S) PDSana
  147. // 113-0x71 ~(S ^ ((S ^ D) & (P ^ D))) SSDxPDxaxn
  148. // 114-0x72 S ^ (D | (P ^ S)) SDPSxox
  149. // 115-0x73 ~(S & (D | ~P)) SDPnoan
  150. // 116-0x74 D ^ (S | (P ^ D)) DSPDxox
  151. // 117-0x75 ~(D & (S | ~P)) DSPnoan
  152. // 118-0x76 S ^ (D | (P & ~S)) SDPSnaox
  153. // 119-0x77 ~(D & S) DSan
  154. // 120-0x78 P ^ (D & S) PDSax
  155. // 121-0x79 ~(D ^ (S ^ (P & (D | S)))) DSPDSoaxxn
  156. // 122-0x7a D ^ (P & (S | ~D)) DPSDnoax
  157. // 123-0x7b ~(S & ~(D ^ P)) SDPxnan
  158. // 124-0x7c S ^ (P & (D | ~S)) SPDSnoax
  159. // 125-0x7d ~(D & ~(P ^ S)) DPSxnan
  160. // 126-0x7e (S ^ P) | (D ^ S) SPxDSxo
  161. // 127-0x7f ~(D & (P & S)) DPSaan
  162. // 128-0x80 D & (P & S) DPSaa
  163. // 129-0x81 ~((S ^ P) | (D ^ S)) SPxDSxon
  164. // 130-0x82 D & ~(P ^ S) DPSxna
  165. // 131-0x83 ~(S ^ (P & (D | ~S))) SPDSnoaxn
  166. // 132-0x84 S & ~(D ^ P) SDPxna
  167. // 133-0x85 ~(P ^ (D & (S | ~P))) PDSPnoaxn
  168. // 134-0x86 D ^ (S ^ (P & (D | S))) DSPDSoaxx
  169. // 135-0x87 ~(P ^ (D & S)) PDSaxn
  170. // 136-0x88 D & S DSa SRCAND
  171. // 137-0x89 ~(S ^ (D | (P & ~S))) SDPSnaoxn
  172. // 138-0x8a D & (S | ~P) DSPnoa
  173. // 139-0x8b ~(D ^ (S | (P ^ D))) DSPDxoxn
  174. // 140-0x8c S & (D | ~P) SDPnoa
  175. // 141-0x8d ~(S ^ (D | (P ^ S))) SDPSxoxn
  176. // 142-0x8e S ^ ((S ^ D) & (P ^ D)) SSDxPDxax
  177. // 143-0x8f ~(P & ~(D & S)) PDSanan
  178. // 144-0x90 P & ~(D ^ S) PDSxna
  179. // 145-0x91 ~(S ^ (D & (P | ~S))) SDPSnoaxn
  180. // 146-0x92 D ^ (P ^ (S & (D | P))) DPSDPoaxx
  181. // 147-0x93 ~(S ^ (P & D)) SPDaxn
  182. // 148-0x94 P ^ (S ^ (D & (P | S))) PSDPSoaxx
  183. // 149-0x95 ~(D ^ (P & S)) DPSaxn
  184. // 150-0x96 D ^ (P ^ S) DPSxx
  185. // 151-0x97 P ^ (S ^ (D | ~(P | S))) PSDPSonoxx
  186. // 152-0x98 ~(S ^ (D | ~(P | S))) SDPSonoxn
  187. // 153-0x99 ~(D ^ S) DSxn
  188. // 154-0x9a D ^ (P & ~S) DPSnax
  189. // 155-0x9b ~(S ^ (D & (P | S))) SDPSoaxn
  190. // 156-0x9c S ^ (P & ~D) SPDnax
  191. // 157-0x9d ~(D ^ (S & (P | D))) DSPDoaxn
  192. // 158-0x9e D ^ (S ^ (P | (D & S))) DSPDSaoxx
  193. // 159-0x9f ~(P & (D ^ S)) PDSxan
  194. // 160-0xa0 D & P DPa
  195. // 161-0xa1 ~(P ^ (D | (S & ~P))) PDSPnaoxn
  196. // 162-0xa2 D & (P | ~S) DPSnoa
  197. // 163-0xa3 ~(D ^ (P | (S ^ D))) DPSDxoxn
  198. // 164-0xa4 ~(P ^ (D | ~(S | P))) PDSPonoxn
  199. // 165-0xa5 ~(P ^ D) PDxn
  200. // 166-0xa6 D ^ (S & ~P) DSPnax
  201. // 167-0xa7 ~(P ^ (D & (S | P))) PDSPoaxn
  202. // 168-0xa8 D & (P | S) DPSoa
  203. // 169-0xa9 ~(D ^ (P | S)) DPSoxn
  204. // 170-0xaa D D
  205. // 171-0xab D | ~(P | S) DPSono
  206. // 172-0xac S ^ (P & (D ^ S)) SPDSxax
  207. // 173-0xad ~(D ^ (P | (S & D))) DPSDaoxn
  208. // 174-0xae D | (S & ~P) DSPnao
  209. // 175-0xaf D | ~P DPno
  210. // 176-0xb0 P & (D | ~S) PDSnoa
  211. // 177-0xb1 ~(P ^ (D | (S ^ P))) PDSPxoxn
  212. // 178-0xb2 S ^ ((S ^ P) | (D ^ S)) SSPxDSxox
  213. // 179-0xb3 ~(S & ~(D & P)) SDPanan
  214. // 180-0xb4 P ^ (S & ~D) PSDnax
  215. // 181-0xb5 ~(D ^ (P & (S | D))) DPSDoaxn
  216. // 182-0xb6 D ^ (P ^ (S | (D & P))) DPSDPaoxx
  217. // 183-0xb7 ~(S & (D ^ P)) SDPxan
  218. // 184-0xb8 P ^ (S & (D ^ P)) PSDPxax
  219. // 185-0xb9 ~(D ^ (S | (P & D))) DSPDaoxn
  220. // 186-0xba D | (P & ~S) DPSnao
  221. // 187-0xbb D | ~S DSno MERGEPAINT
  222. // 188-0xbc S ^ (P & ~(D & S)) SPDSanax
  223. // 189-0xbd ~((S ^ D) & (P ^ D)) SDxPDxan
  224. // 190-0xbe D | (P ^ S) DPSxo
  225. // 191-0xbf D | ~(P & S) DPSano
  226. // 192-0xc0 P & S PSa MERGECOPY
  227. // 193-0xc1 ~(S ^ (P | (D & ~S))) SPDSnaoxn
  228. // 194-0xc2 ~(S ^ (P | ~(D | S))) SPDSonoxn
  229. // 195-0xc3 ~(P ^ S) PSxn
  230. // 196-0xc4 S & (P | ~D) SPDnoa
  231. // 197-0xc5 ~(S ^ (P | (D ^ S))) SPDSxoxn
  232. // 198-0xc6 S ^ (D & ~P) SDPnax
  233. // 199-0xc7 ~(P ^ (S & (D | P))) PSDPoaxn
  234. // 200-0xc8 S & (D | P) SDPoa
  235. // 201-0xc9 ~(S ^ (P | D)) SPDoxn
  236. // 202-0xca D ^ (P & (S ^ D)) DPSDxax
  237. // 203-0xcb ~(S ^ (P | (D & S))) SPDSaoxn
  238. // 204-0xcc S S SRCCOPY
  239. // 205-0xcd S | ~(D | P) SDPono
  240. // 206-0xce S | (D & ~P) SDPnao
  241. // 207-0xcf S | ~P SPno
  242. // 208-0xd0 P & (S | ~D) PSDnoa
  243. // 209-0xd1 ~(P ^ (S | (D ^ P))) PSDPxoxn
  244. // 210-0xd2 P ^ (D & ~S) PDSnax
  245. // 211-0xd3 ~(S ^ (P & (D | S))) SPDSoaxn
  246. // 212-0xd4 S ^ ((S ^ P) & (P ^ D)) SSPxPDxax
  247. // 213-0xd5 ~(D & ~(P & S)) DPSanan
  248. // 214-0xd6 P ^ (S ^ (D | (P & S))) PSDPSaoxx
  249. // 215-0xd7 ~(D & (P ^ S)) DPSxan
  250. // 216-0xd8 P ^ (D & (S ^ P)) PDSPxax
  251. // 217-0xd9 ~(S ^ (D | (P & S))) SDPSaoxn
  252. // 218-0xda D ^ (P & ~(S & D)) DPSDanax
  253. // 219-0xdb ~((S ^ P) & (D ^ S)) SPxDSxan
  254. // 220-0xdc S | (P & ~D) SPDnao
  255. // 221-0xdd S | ~D SDno
  256. // 222-0xde S | (D ^ P) SDPxo
  257. // 223-0xdf S | ~(D & P) SDPano
  258. // 224-0xe0 P & (D | S) PDSoa
  259. // 225-0xe1 ~(P ^ (D | S)) PDSoxn
  260. // 226-0xe2 D ^ (S & (P ^ D)) DSPDxax
  261. // 227-0xe3 ~(P ^ (S | (D & P))) PSDPaoxn
  262. // 228-0xe4 S ^ (D & (P ^ S)) SDPSxax
  263. // 229-0xe5 ~(P ^ (D | (S & P))) PDSPaoxn
  264. // 230-0xe6 S ^ (D & ~(P & S)) SDPSanax
  265. // 231-0xe7 ~((S ^ P) & (P ^ D)) SPxPDxan
  266. // 232-0xe8 S ^ ((S ^ P) & (D ^ S)) SSPxDSxax
  267. // 233-0xe9 ~(D ^ (S ^ (P & ~(D & S)))) DSPDSanaxxn
  268. // 234-0xea D | (P & S) DPSao
  269. // 235-0xeb D | ~(P ^ S) DPSxno
  270. // 236-0xec S | (D & P) SDPao
  271. // 237-0xed S | ~(D ^ P) SDPxno
  272. // 238-0xee D | S DSo SRCPAINT
  273. // 239-0xef S | (D | ~P) SDPnoo
  274. // 240-0xf0 P P PATCOPY
  275. // 241-0xf1 P | ~(D | S) PDSono
  276. // 242-0xf2 P | (D & ~S) PDSnao
  277. // 243-0xf3 P | ~S PSno
  278. // 244-0xf4 P | (S & ~D) PSDnao
  279. // 245-0xf5 P | ~D PDno
  280. // 246-0xf6 P | (D ^ S) PDSxo
  281. // 247-0xf7 P | ~(D & S) PDSano
  282. // 248-0xf8 P | (D & S) PDSao
  283. // 249-0xf9 P | ~(D ^ S) PDSxno
  284. // 250-0xfa D | P DPo
  285. // 251-0xfb D | (P | ~S) DPSnoo PATPAINT
  286. // 252-0xfc P | S PSo
  287. // 253-0xfd P | (S | ~D) PSDnoo
  288. // 254-0xfe D | (P | S) DPSoo
  289. // 255-0xff 1 1 WHITENESS
  290. //
  291. //
  292. // ********* ALL ROP3/ROP2 CODES are SYMMETRIC ************
  293. //
  294. // Raster Operation Index required [NONE]
  295. //
  296. // 0x00: 0 [INV] 0xff: 1
  297. //
  298. // Raster Operation Index required [DST ]
  299. //
  300. // 0x55: ~D [INV] 0xaa: D
  301. //
  302. // Raster Operation Index required [SRC ]
  303. //
  304. // 0x33: ~S [INV] 0xcc: S
  305. //
  306. // Raster Operation Index required [SRC DST ]
  307. //
  308. // 0x11: ~(D | S) [INV] 0xee: D | S
  309. // 0x22: D & ~S [INV] 0xdd: S | ~D
  310. // 0x44: S & ~D [INV] 0xbb: D | ~S
  311. // 0x66: D ^ S [INV] 0x99: ~(D ^ S)
  312. // 0x77: ~(D & S) [INV] 0x88: D & S
  313. //
  314. // Raster Operation Index required [PAT ]
  315. //
  316. // 0x0f: ~P [INV] 0xf0: P
  317. //
  318. // Raster Operation Index required [PAT DST ]
  319. //
  320. // 0x05: ~(D | P) [INV] 0xfa: D | P
  321. // 0x0a: D & ~P [INV] 0xf5: P | ~D
  322. // 0x50: P & ~D [INV] 0xaf: D | ~P
  323. // 0x5a: D ^ P [INV] 0xa5: ~(P ^ D)
  324. // 0x5f: ~(D & P) [INV] 0xa0: D & P
  325. //
  326. // Raster Operation Index required [PAT SRC ]
  327. //
  328. // 0x03: ~(P | S) [INV] 0xfc: P | S
  329. // 0x0c: S & ~P [INV] 0xf3: P | ~S
  330. // 0x30: P & ~S [INV] 0xcf: S | ~P
  331. // 0x3c: P ^ S [INV] 0xc3: ~(P ^ S)
  332. // 0x3f: ~(P & S) [INV] 0xc0: P & S
  333. //
  334. // Raster Operation Index required [PAT SRC DST ]
  335. //
  336. // 0x01: ~(D | (P | S)) [INV] 0xfe: D | (P | S)
  337. // 0x02: D & ~(P | S) [INV] 0xfd: P | (S | ~D)
  338. // 0x04: S & ~(D | P) [INV] 0xfb: D | (P | ~S)
  339. // 0x06: ~(P | ~(D ^ S)) [INV] 0xf9: P | ~(D ^ S)
  340. // 0x07: ~(P | (D & S)) [INV] 0xf8: P | (D & S)
  341. // 0x08: S & (D & ~P) [INV] 0xf7: P | ~(D & S)
  342. // 0x09: ~(P | (D ^ S)) [INV] 0xf6: P | (D ^ S)
  343. // 0x0b: ~(P | (S & ~D)) [INV] 0xf4: P | (S & ~D)
  344. // 0x0d: ~(P | (D & ~S)) [INV] 0xf2: P | (D & ~S)
  345. // 0x0e: ~(P | ~(D | S)) [INV] 0xf1: P | ~(D | S)
  346. // 0x10: P & ~(D | S) [INV] 0xef: S | (D | ~P)
  347. // 0x12: ~(S | ~(D ^ P)) [INV] 0xed: S | ~(D ^ P)
  348. // 0x13: ~(S | (D & P)) [INV] 0xec: S | (D & P)
  349. // 0x14: ~(D | ~(P ^ S)) [INV] 0xeb: D | ~(P ^ S)
  350. // 0x15: ~(D | (P & S)) [INV] 0xea: D | (P & S)
  351. // 0x16: P ^ (S ^ (D & ~(P & S))) [INV] 0xe9: ~(D ^ (S ^ (P & ~(D & S))))
  352. // 0x17: ~(S ^ ((S ^ P) & (D ^ S))) [INV] 0xe8: S ^ ((S ^ P) & (D ^ S))
  353. // 0x18: (S ^ P) & (P ^ D) [INV] 0xe7: ~((S ^ P) & (P ^ D))
  354. // 0x19: ~(S ^ (D & ~(P & S))) [INV] 0xe6: S ^ (D & ~(P & S))
  355. // 0x1a: P ^ (D | (S & P)) [INV] 0xe5: ~(P ^ (D | (S & P)))
  356. // 0x1b: ~(S ^ (D & (P ^ S))) [INV] 0xe4: S ^ (D & (P ^ S))
  357. // 0x1c: P ^ (S | (D & P)) [INV] 0xe3: ~(P ^ (S | (D & P)))
  358. // 0x1d: ~(D ^ (S & (P ^ D))) [INV] 0xe2: D ^ (S & (P ^ D))
  359. // 0x1e: P ^ (D | S) [INV] 0xe1: ~(P ^ (D | S))
  360. // 0x1f: ~(P & (D | S)) [INV] 0xe0: P & (D | S)
  361. // 0x20: D & (P & ~S) [INV] 0xdf: S | ~(D & P)
  362. // 0x21: ~(S | (D ^ P)) [INV] 0xde: S | (D ^ P)
  363. // 0x23: ~(S | (P & ~D)) [INV] 0xdc: S | (P & ~D)
  364. // 0x24: (S ^ P) & (D ^ S) [INV] 0xdb: ~((S ^ P) & (D ^ S))
  365. // 0x25: ~(P ^ (D & ~(S & P))) [INV] 0xda: D ^ (P & ~(S & D))
  366. // 0x26: S ^ (D | (P & S)) [INV] 0xd9: ~(S ^ (D | (P & S)))
  367. // 0x27: S ^ (D | ~(P ^ S)) [INV] 0xd8: P ^ (D & (S ^ P))
  368. // 0x28: D & (P ^ S) [INV] 0xd7: ~(D & (P ^ S))
  369. // 0x29: ~(P ^ (S ^ (D | (P & S)))) [INV] 0xd6: P ^ (S ^ (D | (P & S)))
  370. // 0x2a: D & ~(P & S) [INV] 0xd5: ~(D & ~(P & S))
  371. // 0x2b: ~(S ^ ((S ^ P) & (P ^ D))) [INV] 0xd4: S ^ ((S ^ P) & (P ^ D))
  372. // 0x2c: S ^ (P & (D | S)) [INV] 0xd3: ~(S ^ (P & (D | S)))
  373. // 0x2d: P ^ (S | ~D) [INV] 0xd2: P ^ (D & ~S)
  374. // 0x2e: P ^ (S | (D ^ P)) [INV] 0xd1: ~(P ^ (S | (D ^ P)))
  375. // 0x2f: ~(P & (S | ~D)) [INV] 0xd0: P & (S | ~D)
  376. // 0x31: ~(S | (D & ~P)) [INV] 0xce: S | (D & ~P)
  377. // 0x32: S ^ (D | (P | S)) [INV] 0xcd: S | ~(D | P)
  378. // 0x34: S ^ (P | (D & S)) [INV] 0xcb: ~(S ^ (P | (D & S)))
  379. // 0x35: S ^ (P | ~(D ^ S)) [INV] 0xca: D ^ (P & (S ^ D))
  380. // 0x36: S ^ (D | P) [INV] 0xc9: ~(S ^ (P | D))
  381. // 0x37: ~(S & (D | P)) [INV] 0xc8: S & (D | P)
  382. // 0x38: P ^ (S & (D | P)) [INV] 0xc7: ~(P ^ (S & (D | P)))
  383. // 0x39: S ^ (P | ~D) [INV] 0xc6: S ^ (D & ~P)
  384. // 0x3a: S ^ (P | (D ^ S)) [INV] 0xc5: ~(S ^ (P | (D ^ S)))
  385. // 0x3b: ~(S & (P | ~D)) [INV] 0xc4: S & (P | ~D)
  386. // 0x3d: S ^ (P | ~(D | S)) [INV] 0xc2: ~(S ^ (P | ~(D | S)))
  387. // 0x3e: S ^ (P | (D & ~S)) [INV] 0xc1: ~(S ^ (P | (D & ~S)))
  388. // 0x40: P & (S & ~D) [INV] 0xbf: D | ~(P & S)
  389. // 0x41: ~(D | (P ^ S)) [INV] 0xbe: D | (P ^ S)
  390. // 0x42: (S ^ D) & (P ^ D) [INV] 0xbd: ~((S ^ D) & (P ^ D))
  391. // 0x43: ~(S ^ (P & ~(D & S))) [INV] 0xbc: S ^ (P & ~(D & S))
  392. // 0x45: ~(D | (P & ~S)) [INV] 0xba: D | (P & ~S)
  393. // 0x46: D ^ (S | (P & D)) [INV] 0xb9: ~(D ^ (S | (P & D)))
  394. // 0x47: ~(P ^ (S & (D ^ P))) [INV] 0xb8: P ^ (S & (D ^ P))
  395. // 0x48: S & (D ^ P) [INV] 0xb7: ~(S & (D ^ P))
  396. // 0x49: ~(P ^ (D ^ (S | (P & D)))) [INV] 0xb6: D ^ (P ^ (S | (D & P)))
  397. // 0x4a: D ^ (P & (S | D)) [INV] 0xb5: ~(D ^ (P & (S | D)))
  398. // 0x4b: P ^ (D | ~S) [INV] 0xb4: P ^ (S & ~D)
  399. // 0x4c: S & ~(D & P) [INV] 0xb3: ~(S & ~(D & P))
  400. // 0x4d: ~(S ^ ((S ^ P) | (D ^ S))) [INV] 0xb2: S ^ ((S ^ P) | (D ^ S))
  401. // 0x4e: P ^ (D | (S ^ P)) [INV] 0xb1: ~(P ^ (D | (S ^ P)))
  402. // 0x4f: ~(P & (D | ~S)) [INV] 0xb0: P & (D | ~S)
  403. // 0x51: ~(D | (S & ~P)) [INV] 0xae: D | (S & ~P)
  404. // 0x52: D ^ (P | (S & D)) [INV] 0xad: ~(D ^ (P | (S & D)))
  405. // 0x53: ~(S ^ (P & (D ^ S))) [INV] 0xac: S ^ (P & (D ^ S))
  406. // 0x54: ~(D | ~(P | S)) [INV] 0xab: D | ~(P | S)
  407. // 0x56: D ^ (P | S) [INV] 0xa9: ~(D ^ (P | S))
  408. // 0x57: ~(D & (P | S)) [INV] 0xa8: D & (P | S)
  409. // 0x58: P ^ (D & (S | P)) [INV] 0xa7: ~(P ^ (D & (S | P)))
  410. // 0x59: D ^ (P | ~S) [INV] 0xa6: D ^ (S & ~P)
  411. // 0x5b: D ^ (P | ~(S | D)) [INV] 0xa4: ~(P ^ (D | ~(S | P)))
  412. // 0x5c: D ^ (P | (S ^ D)) [INV] 0xa3: ~(D ^ (P | (S ^ D)))
  413. // 0x5d: ~(D & (P | ~S)) [INV] 0xa2: D & (P | ~S)
  414. // 0x5e: D ^ (P | (S & ~D)) [INV] 0xa1: ~(P ^ (D | (S & ~P)))
  415. // 0x60: P & (D ^ S) [INV] 0x9f: ~(P & (D ^ S))
  416. // 0x61: ~(D ^ (S ^ (P | (D & S)))) [INV] 0x9e: D ^ (S ^ (P | (D & S)))
  417. // 0x62: D ^ (S & (P | D)) [INV] 0x9d: ~(D ^ (S & (P | D)))
  418. // 0x63: S ^ (D | ~P) [INV] 0x9c: S ^ (P & ~D)
  419. // 0x64: S ^ (D & (P | S)) [INV] 0x9b: ~(S ^ (D & (P | S)))
  420. // 0x65: D ^ (S | ~P) [INV] 0x9a: D ^ (P & ~S)
  421. // 0x67: S ^ (D | ~(P | S)) [INV] 0x98: ~(S ^ (D | ~(P | S)))
  422. // 0x68: ~(D ^ (S ^ (P | ~(D | S)))) [INV] 0x97: P ^ (S ^ (D | ~(P | S)))
  423. // 0x69: ~(P ^ (D ^ S)) [INV] 0x96: D ^ (P ^ S)
  424. // 0x6a: D ^ (P & S) [INV] 0x95: ~(D ^ (P & S))
  425. // 0x6b: ~(P ^ (S ^ (D & (P | S)))) [INV] 0x94: P ^ (S ^ (D & (P | S)))
  426. // 0x6c: S ^ (D & P) [INV] 0x93: ~(S ^ (P & D))
  427. // 0x6d: ~(P ^ (D ^ (S & (P | D)))) [INV] 0x92: D ^ (P ^ (S & (D | P)))
  428. // 0x6e: S ^ (D & (P | ~S)) [INV] 0x91: ~(S ^ (D & (P | ~S)))
  429. // 0x6f: ~(P & ~(D ^ S)) [INV] 0x90: P & ~(D ^ S)
  430. // 0x70: P & ~(D & S) [INV] 0x8f: ~(P & ~(D & S))
  431. // 0x71: ~(S ^ ((S ^ D) & (P ^ D))) [INV] 0x8e: S ^ ((S ^ D) & (P ^ D))
  432. // 0x72: S ^ (D | (P ^ S)) [INV] 0x8d: ~(S ^ (D | (P ^ S)))
  433. // 0x73: ~(S & (D | ~P)) [INV] 0x8c: S & (D | ~P)
  434. // 0x74: D ^ (S | (P ^ D)) [INV] 0x8b: ~(D ^ (S | (P ^ D)))
  435. // 0x75: ~(D & (S | ~P)) [INV] 0x8a: D & (S | ~P)
  436. // 0x76: S ^ (D | (P & ~S)) [INV] 0x89: ~(S ^ (D | (P & ~S)))
  437. // 0x78: P ^ (D & S) [INV] 0x87: ~(P ^ (D & S))
  438. // 0x79: ~(D ^ (S ^ (P & (D | S)))) [INV] 0x86: D ^ (S ^ (P & (D | S)))
  439. // 0x7a: D ^ (P & (S | ~D)) [INV] 0x85: ~(P ^ (D & (S | ~P)))
  440. // 0x7b: ~(S & ~(D ^ P)) [INV] 0x84: S & ~(D ^ P)
  441. // 0x7c: S ^ (P & (D | ~S)) [INV] 0x83: ~(S ^ (P & (D | ~S)))
  442. // 0x7d: ~(D & ~(P ^ S)) [INV] 0x82: D & ~(P ^ S)
  443. // 0x7e: (S ^ P) | (D ^ S) [INV] 0x81: ~((S ^ P) | (D ^ S))
  444. // 0x7f: ~(D & (P & S)) [INV] 0x80: D & (P & S)
  445. //
  446. //
  447. // The following macros will tell us if we need to use a 'mask' for ROP4
  448. // and define if S / P / D are in a ROP3
  449. //
  450. #define ROP4_NEED_MASK(Rop4) (((Rop4 >> 8) & 0xFF) != (Rop4 & 0xFF))
  451. #define ROP3_NEED_PAT(Rop3) (((Rop3 >> 4) & 0x0F) != (Rop3 & 0x0F))
  452. #define ROP3_NEED_SRC(Rop3) (((Rop3 >> 2) & 0x33) != (Rop3 & 0x33))
  453. #define ROP3_NEED_DST(Rop3) (((Rop3 >> 1) & 0x55) != (Rop3 & 0x55))
  454. #define ROP4_FG_ROP(Rop4) (Rop4 & 0xFF)
  455. #define ROP4_BG_ROP(Rop4) ((Rop4 >> 8) & 0xFF)
  456. #define CSI_SRC 0
  457. #define CSI_PAT 1
  458. #define CSI_TMP 2
  459. #define CSI_TOTAL 3
  460. typedef struct _CLONESO {
  461. SURFOBJ *pso;
  462. HBITMAP hBmp;
  463. } CLONESO, *PCLONESO;
  464. typedef struct _SDINFO {
  465. SURFOBJ *psoDst; // detination to write BITMAP or DEVICE
  466. SURFOBJ *psoSrc; // source to read must be BITMAP
  467. PRECTL prclDst; // destination rectangle
  468. PRECTL prclSrc; // source rectangle
  469. PPOINTL pptlSrcOrg; // brush origin start
  470. } SDINFO, *PSDINFO;
  471. //
  472. // Function prototypes
  473. //
  474. BOOL
  475. CloneBitBltSURFOBJ(
  476. PPDEV pPDev,
  477. SURFOBJ *psoDst,
  478. SURFOBJ *psoSrc,
  479. SURFOBJ *psoMask,
  480. XLATEOBJ *pxlo,
  481. PRECTL prclDst,
  482. PRECTL prclSrc,
  483. PRECTL prclMask,
  484. BRUSHOBJ *pbo,
  485. PCLONESO pCloneSO,
  486. DWORD RopBG,
  487. DWORD RopFG
  488. );
  489. BOOL
  490. DoSpecialRop3(
  491. SURFOBJ *psoDst,
  492. CLIPOBJ *pco,
  493. PRECTL prclDst,
  494. DWORD Rop3
  495. );
  496. BOOL
  497. DoMix2(
  498. PPDEV pPDev,
  499. SURFOBJ *psoDst,
  500. SURFOBJ *psoSrc,
  501. CLIPOBJ *pco,
  502. XLATEOBJ *pxlo,
  503. PRECTL prclDst,
  504. PRECTL prclSrc,
  505. PPOINTL pptlSrcOrg,
  506. DWORD Mix2
  507. );
  508. BOOL
  509. DoRop3(
  510. PPDEV pPDev,
  511. SURFOBJ *psoDst,
  512. SURFOBJ *psoSrc,
  513. SURFOBJ *psoPat,
  514. SURFOBJ *psoTmp,
  515. CLIPOBJ *pco,
  516. XLATEOBJ *pxlo,
  517. PRECTL prclDst,
  518. PRECTL prclSrc,
  519. PRECTL prclPat,
  520. PPOINTL pptlPatOrg,
  521. BRUSHOBJ *pbo,
  522. DWORD Rop3
  523. );
  524. #endif // _ROPBLT_