1fda9279dSmrg/*
2fda9279dSmrg * Copyright 2008 Maarten Maathuis
3fda9279dSmrg *
4fda9279dSmrg * Permission is hereby granted, free of charge, to any person obtaining a
5fda9279dSmrg * copy of this software and associated documentation files (the "Software"),
6fda9279dSmrg * to deal in the Software without restriction, including without limitation
7fda9279dSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8fda9279dSmrg * and/or sell copies of the Software, and to permit persons to whom the
9fda9279dSmrg * Software is furnished to do so, subject to the following conditions:
10fda9279dSmrg *
11fda9279dSmrg * The above copyright notice and this permission notice shall be included in
12fda9279dSmrg * all copies or substantial portions of the Software.
13fda9279dSmrg *
14fda9279dSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15fda9279dSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16fda9279dSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17fda9279dSmrg * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18fda9279dSmrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19fda9279dSmrg * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20fda9279dSmrg * SOFTWARE.
21fda9279dSmrg */
22fda9279dSmrg
23fda9279dSmrg/* Ternary Raster Operations as defined by GDI
24fda9279dSmrg * 0 = black
25fda9279dSmrg * 1 = white
26fda9279dSmrg * D = destination
27fda9279dSmrg * S = source
28fda9279dSmrg * P = pattern
29fda9279dSmrg * o = bitwise OR
30fda9279dSmrg * a = bitwise AND
31fda9279dSmrg * n = bitwise inverse
32fda9279dSmrg * x = bitwise XOR
33fda9279dSmrg *
34fda9279dSmrg * The notation is reverse polish.
35fda9279dSmrg * Example:
36fda9279dSmrg * ROP_PDSonon: !(P | !(D | S))
37fda9279dSmrg*/
38fda9279dSmrg
39fda9279dSmrg#define ROP_0		0x00
40fda9279dSmrg#define ROP_DPSoon	0x01
41fda9279dSmrg#define ROP_DPSona	0x02
42fda9279dSmrg#define ROP_PSon	0x03
43fda9279dSmrg#define ROP_SDPona	0x04
44fda9279dSmrg#define ROP_DPon	0x05
45fda9279dSmrg#define ROP_PDSxnon	0x06
46fda9279dSmrg#define ROP_PDSaon	0x07
47fda9279dSmrg#define ROP_SDPnaa	0x08
48fda9279dSmrg#define ROP_PDSxon	0x09
49fda9279dSmrg#define ROP_DPna	0x0A
50fda9279dSmrg#define ROP_PSDnaon	0x0B
51fda9279dSmrg#define ROP_SPna	0x0C
52fda9279dSmrg#define ROP_PDSnaon	0x0D
53fda9279dSmrg#define ROP_PDSonon	0x0E
54fda9279dSmrg#define ROP_Pn		0x0F
55fda9279dSmrg#define ROP_PDSona	0x10
56fda9279dSmrg#define ROP_DSon	0x11
57fda9279dSmrg#define ROP_SDPxnon	0x12
58fda9279dSmrg#define ROP_SDPaon	0x13
59fda9279dSmrg#define ROP_DPSxnon	0x14
60fda9279dSmrg#define ROP_DPSaon	0x15
61fda9279dSmrg#define ROP_PSDPSanaxx	0x16
62fda9279dSmrg#define ROP_SSPxDSxaxn	0x17
63fda9279dSmrg#define ROP_SPxPDxa	0x18
64fda9279dSmrg#define ROP_SDPSanaxn	0x19
65fda9279dSmrg#define ROP_PDSPaox	0x1A
66fda9279dSmrg#define ROP_SDPSxaxn	0x1B
67fda9279dSmrg#define ROP_PSDPaox	0x1C
68fda9279dSmrg#define ROP_DSPDxaxn	0x1D
69fda9279dSmrg#define ROP_PDSox	0x1E
70fda9279dSmrg#define ROP_PDSoan	0x1F
71fda9279dSmrg#define ROP_DPSnaa	0x20
72fda9279dSmrg#define ROP_SDPxon	0x21
73fda9279dSmrg#define ROP_DSna	0x22
74fda9279dSmrg#define ROP_SPDnaon	0x23
75fda9279dSmrg#define ROP_SPxDSxa	0x24
76fda9279dSmrg#define ROP_PDSPanaxn	0x25
77fda9279dSmrg#define ROP_SDPSaox	0x26
78fda9279dSmrg#define ROP_SDPSxnox	0x27
79fda9279dSmrg#define ROP_DPSxa	0x28
80fda9279dSmrg#define ROP_PSDPSaoxxn	0x29
81fda9279dSmrg#define ROP_DPSana	0x2A
82fda9279dSmrg#define ROP_SSPxPDxaxn	0x2B
83fda9279dSmrg#define ROP_SPDSoax	0x2C
84fda9279dSmrg#define ROP_PSDnox	0x2D
85fda9279dSmrg#define ROP_PSDPxox	0x2E
86fda9279dSmrg#define ROP_PSDnoan	0x2F
87fda9279dSmrg#define ROP_PSna	0x30
88fda9279dSmrg#define ROP_SDPnaon	0x31
89fda9279dSmrg#define ROP_SDPSoox	0x32
90fda9279dSmrg#define ROP_Sn		0x33
91fda9279dSmrg#define ROP_SPDSaox	0x34
92fda9279dSmrg#define ROP_SPDSxnox	0x35
93fda9279dSmrg#define ROP_SDPox	0x36
94fda9279dSmrg#define ROP_SDPoan	0x37
95fda9279dSmrg#define ROP_PSDPoax	0x38
96fda9279dSmrg#define ROP_SPDnox	0x39
97fda9279dSmrg#define ROP_SPDSxox	0x3A
98fda9279dSmrg#define ROP_SPDnoan	0x3B
99fda9279dSmrg#define ROP_PSx		0x3C
100fda9279dSmrg#define ROP_SPDSonox	0x3D
101fda9279dSmrg#define ROP_SPDSnaox	0x3E
102fda9279dSmrg#define ROP_PSan	0x3F
103fda9279dSmrg#define ROP_PSDnaa	0x40
104fda9279dSmrg#define ROP_DPSxon	0x41
105fda9279dSmrg#define ROP_SDxPDxa	0x42
106fda9279dSmrg#define ROP_SPDSanaxn	0x43
107fda9279dSmrg#define ROP_SDna	0x44
108fda9279dSmrg#define ROP_DPSnaon	0x45
109fda9279dSmrg#define ROP_DSPDaox	0x46
110fda9279dSmrg#define ROP_PSDPxaxn	0x47
111fda9279dSmrg#define ROP_SDPxa	0x48
112fda9279dSmrg#define ROP_PDSPDaoxxn	0x49
113fda9279dSmrg#define ROP_DPSDoax	0x4A
114fda9279dSmrg#define ROP_PDSnox	0x4B
115fda9279dSmrg#define ROP_SDPana	0x4C
116fda9279dSmrg#define ROP_SSPxDSxoxn	0x4D
117fda9279dSmrg#define ROP_PDSPxox	0x4E
118fda9279dSmrg#define ROP_PDSnoan	0x4F
119fda9279dSmrg#define ROP_PDna	0x50
120fda9279dSmrg#define ROP_DSPnaon	0x51
121fda9279dSmrg#define ROP_DPSDaox	0x52
122fda9279dSmrg#define ROP_SPDSxaxn	0x53
123fda9279dSmrg#define ROP_DPSonon	0x54
124fda9279dSmrg#define ROP_Dn		0x55
125fda9279dSmrg#define ROP_DPSox	0x56
126fda9279dSmrg#define ROP_DPSoan	0x57
127fda9279dSmrg#define ROP_PDSPoax	0x58
128fda9279dSmrg#define ROP_DPSnox	0x59
129fda9279dSmrg#define ROP_DPx		0x5A
130fda9279dSmrg#define ROP_DPSDonox	0x5B
131fda9279dSmrg#define ROP_DPSDxox	0x5C
132fda9279dSmrg#define ROP_DPSnoan	0x5D
133fda9279dSmrg#define ROP_DPSDnaox	0x5E
134fda9279dSmrg#define ROP_DPan	0x5F
135fda9279dSmrg#define ROP_PDSxa	0x60
136fda9279dSmrg#define ROP_DSPDSaoxxn	0x61
137fda9279dSmrg#define ROP_DSPDoax	0x62
138fda9279dSmrg#define ROP_SDPnox	0x63
139fda9279dSmrg#define ROP_SDPSoax	0x64
140fda9279dSmrg#define ROP_DSPnox	0x65
141fda9279dSmrg#define ROP_DSx		0x66
142fda9279dSmrg#define ROP_SDPSonox	0x67
143fda9279dSmrg#define ROP_DSPDSonoxxn	0x68
144fda9279dSmrg#define ROP_PDSxxn	0x69
145fda9279dSmrg#define ROP_DPSax	0x6A
146fda9279dSmrg#define ROP_PSDPSoaxxn	0x6B
147fda9279dSmrg#define ROP_SDPax	0x6C
148fda9279dSmrg#define ROP_PDSPDoaxxn	0x6D
149fda9279dSmrg#define ROP_SDPSnoax	0x6E
150fda9279dSmrg#define ROP_PDSxnan	0x6F
151fda9279dSmrg#define ROP_PDSana	0x70
152fda9279dSmrg#define ROP_SSDxPDxaxn	0x71
153fda9279dSmrg#define ROP_SDPSxox	0x72
154fda9279dSmrg#define ROP_SDPnoan	0x73
155fda9279dSmrg#define ROP_DSPDxox	0x74
156fda9279dSmrg#define ROP_DSPnoan	0x75
157fda9279dSmrg#define ROP_SDPSnaox	0x76
158fda9279dSmrg#define ROP_DSan	0x77
159fda9279dSmrg#define ROP_PDSax	0x78
160fda9279dSmrg#define ROP_DSPDSoaxxn	0x79
161fda9279dSmrg#define ROP_DPSDnoax	0x7A
162fda9279dSmrg#define ROP_SDPxnan	0x7B
163fda9279dSmrg#define ROP_SPDSnoax	0x7C
164fda9279dSmrg#define ROP_DPSxnan	0x7D
165fda9279dSmrg#define ROP_SPxDSxo	0x7E
166fda9279dSmrg#define ROP_DPSaan	0x7F
167fda9279dSmrg#define ROP_DPSaa	0x80
168fda9279dSmrg#define ROP_SPxDSxon	0x81
169fda9279dSmrg#define ROP_DPSxna	0x82
170fda9279dSmrg#define ROP_SPDSnoaxn	0x83
171fda9279dSmrg#define ROP_SDPxna	0x84
172fda9279dSmrg#define ROP_PDSPnoaxn	0x85
173fda9279dSmrg#define ROP_DSPDSoaxx	0x86
174fda9279dSmrg#define ROP_PDSaxn	0x87
175fda9279dSmrg#define ROP_DSa		0x88
176fda9279dSmrg#define ROP_SDPSnaoxn	0x89
177fda9279dSmrg#define ROP_DSPnoa	0x8A
178fda9279dSmrg#define ROP_DSPDxoxn	0x8B
179fda9279dSmrg#define ROP_SDPnoa	0x8C
180fda9279dSmrg#define ROP_SDPSxoxn	0x8D
181fda9279dSmrg#define ROP_SSDxPDxax	0x8E
182fda9279dSmrg#define ROP_PDSanan	0x8F
183fda9279dSmrg#define ROP_PDSxna	0x90
184fda9279dSmrg#define ROP_SDPSnoaxn	0x91
185fda9279dSmrg#define ROP_DPSDPoaxx	0x92
186fda9279dSmrg#define ROP_SPDaxn	0x93
187fda9279dSmrg#define ROP_PSDPSoaxx	0x94
188fda9279dSmrg#define ROP_DPSaxn	0x95
189fda9279dSmrg#define ROP_DPSxx	0x96
190fda9279dSmrg#define ROP_PSDPSonoxx	0x97
191fda9279dSmrg#define ROP_SDPSonoxn	0x98
192fda9279dSmrg#define ROP_DSxn	0x99
193fda9279dSmrg#define ROP_DPSnax	0x9A
194fda9279dSmrg#define ROP_SDPSoaxn	0x9B
195fda9279dSmrg#define ROP_SPDnax	0x9C
196fda9279dSmrg#define ROP_DSPDoaxn	0x9D
197fda9279dSmrg#define ROP_DSPDSaoxx	0x9E
198fda9279dSmrg#define ROP_PDSxan	0x9F
199fda9279dSmrg#define ROP_DPa		0xA0
200fda9279dSmrg#define ROP_PDSPnaoxn	0xA1
201fda9279dSmrg#define ROP_DPSnoa	0xA2
202fda9279dSmrg#define ROP_DPSDxoxn	0xA3
203fda9279dSmrg#define ROP_PDSPonoxn	0xA4
204fda9279dSmrg#define ROP_PDxn	0xA5
205fda9279dSmrg#define ROP_DSPnax	0xA6
206fda9279dSmrg#define ROP_PDSPoaxn	0xA7
207fda9279dSmrg#define ROP_DPSoa	0xA8
208fda9279dSmrg#define ROP_DPSoxn	0xA9
209fda9279dSmrg#define ROP_D		0xAA
210fda9279dSmrg#define ROP_DPSono	0xAB
211fda9279dSmrg#define ROP_SPDSxax	0xAC
212fda9279dSmrg#define ROP_DPSDaoxn	0xAD
213fda9279dSmrg#define ROP_DSPnao	0xAE
214fda9279dSmrg#define ROP_DPno	0xAF
215fda9279dSmrg#define ROP_PDSnoa	0xB0
216fda9279dSmrg#define ROP_PDSPxoxn	0xB1
217fda9279dSmrg#define ROP_SSPxDSxox	0xB2
218fda9279dSmrg#define ROP_SDPanan	0xB3
219fda9279dSmrg#define ROP_PSDnax	0xB4
220fda9279dSmrg#define ROP_DPSDoaxn	0xB5
221fda9279dSmrg#define ROP_DPSDPaoxx	0xB6
222fda9279dSmrg#define ROP_SDPxan	0xB7
223fda9279dSmrg#define ROP_PSDPxax	0xB8
224fda9279dSmrg#define ROP_DSPDaoxn	0xB9
225fda9279dSmrg#define ROP_DPSnao	0xBA
226fda9279dSmrg#define ROP_DSno	0xBB
227fda9279dSmrg#define ROP_SPDSanax	0xBC
228fda9279dSmrg#define ROP_SDxPDxan	0xBD
229fda9279dSmrg#define ROP_DPSxo	0xBE
230fda9279dSmrg#define ROP_DPSano	0xBF
231fda9279dSmrg#define ROP_Psa		0xC0
232fda9279dSmrg#define ROP_SPDSnaoxn	0xC1
233fda9279dSmrg#define ROP_SPDSonoxn	0xC2
234fda9279dSmrg#define ROP_PSxn	0xC3
235fda9279dSmrg#define ROP_SPDnoa	0xC4
236fda9279dSmrg#define ROP_SPDSxoxn	0xC5
237fda9279dSmrg#define ROP_SDPnax	0xC6
238fda9279dSmrg#define ROP_PSDPoaxn	0xC7
239fda9279dSmrg#define ROP_SDPoa	0xC8
240fda9279dSmrg#define ROP_SPDoxn	0xC9
241fda9279dSmrg#define ROP_DPSDxax	0xCA
242fda9279dSmrg#define ROP_SPDSaoxn	0xCB
243fda9279dSmrg#define ROP_S		0xCC
244fda9279dSmrg#define ROP_SDPono	0xCD
245fda9279dSmrg#define ROP_SDPnao	0xCE
246fda9279dSmrg#define ROP_SPno	0xCF
247fda9279dSmrg#define ROP_PSDnoa	0xD0
248fda9279dSmrg#define ROP_PSDPxoxn	0xD1
249fda9279dSmrg#define ROP_PDSnax	0xD2
250fda9279dSmrg#define ROP_SPDSoaxn	0xD3
251fda9279dSmrg#define ROP_SSPxPDxax	0xD4
252fda9279dSmrg#define ROP_DPSanan	0xD5
253fda9279dSmrg#define ROP_PSDPSaoxx	0xD6
254fda9279dSmrg#define ROP_DPSxan	0xD7
255fda9279dSmrg#define ROP_PDSPxax	0xD8
256fda9279dSmrg#define ROP_SDPSaoxn	0xD9
257fda9279dSmrg#define ROP_DPSDanax	0xDA
258fda9279dSmrg#define ROP_SPxDSxan	0xDB
259fda9279dSmrg#define ROP_SPDnao	0xDC
260fda9279dSmrg#define ROP_SDno	0xDD
261fda9279dSmrg#define ROP_SDPxo	0xDE
262fda9279dSmrg#define ROP_SDPano	0xDF
263fda9279dSmrg#define ROP_PDSoa	0xE0
264fda9279dSmrg#define ROP_PDSoxn	0xE1
265fda9279dSmrg#define ROP_DSPDxax	0xE2
266fda9279dSmrg#define ROP_PSDPaoxn	0xE3
267fda9279dSmrg#define ROP_SDPSxax	0xE4
268fda9279dSmrg#define ROP_PDSPaoxn	0xE5
269fda9279dSmrg#define ROP_SDPSanax	0xE6
270fda9279dSmrg#define ROP_SPxPDxan	0xE7
271fda9279dSmrg#define ROP_SSPxDSxax	0xE8
272fda9279dSmrg#define ROP_DSPDSanaxxn	0xE9
273fda9279dSmrg#define ROP_DPSao	0xEA
274fda9279dSmrg#define ROP_DPSxno	0xEB
275fda9279dSmrg#define ROP_SDPao	0xEC
276fda9279dSmrg#define ROP_SDPxno	0xED
277fda9279dSmrg#define ROP_DSo		0xEE
278fda9279dSmrg#define ROP_SDPnoo	0xEF
279fda9279dSmrg#define ROP_P		0xF0
280fda9279dSmrg#define ROP_PDSono	0xF1
281fda9279dSmrg#define ROP_PDSnao	0xF2
282fda9279dSmrg#define ROP_PSno	0xF3
283fda9279dSmrg#define ROP_PSDnao	0xF4
284fda9279dSmrg#define ROP_PDno	0xF5
285fda9279dSmrg#define ROP_PDSxo	0xF6
286fda9279dSmrg#define ROP_PDSano	0xF7
287fda9279dSmrg#define ROP_PDSao	0xF8
288fda9279dSmrg#define ROP_PDSxno	0xF9
289fda9279dSmrg#define ROP_DPo		0xFA
290fda9279dSmrg#define ROP_DPSnoo	0xFB
291fda9279dSmrg#define ROP_PSo		0xFC
292fda9279dSmrg#define ROP_PSDnoo	0xFD
293fda9279dSmrg#define ROP_DPSoo	0xFE
294fda9279dSmrg#define ROP_1		0xFF
295fda9279dSmrg
296fda9279dSmrg/* derived from XAA */
297fda9279dSmrgstatic struct {
298fda9279dSmrg	int copy;
299fda9279dSmrg	int copy_planemask;
300fda9279dSmrg	int pattern;
301fda9279dSmrg	int pattern_planemask;
302fda9279dSmrg} NVROP[] = {
303fda9279dSmrg	{ ROP_0,    ROP_0,       ROP_0,    ROP_DPna    }, /* GXclear        */
304fda9279dSmrg	{ ROP_DSa,  ROP_DSPnoa,  ROP_DPa,  ROP_DPSnoa  }, /* GXand          */
305fda9279dSmrg	{ ROP_SDna, ROP_DPSnaon, ROP_PDna, ROP_DSPnaon }, /* GXandReverse   */
306fda9279dSmrg	{ ROP_S,    ROP_DPSDxax, ROP_P,    ROP_DSPDxax }, /* GXcopy         */
307fda9279dSmrg	{ ROP_DSna, ROP_DPSana,  ROP_DPna, ROP_DPSana  }, /* GXandInverted  */
308fda9279dSmrg	{ ROP_D,    ROP_D,       ROP_D,    ROP_D       }, /* GXnoop         */
309fda9279dSmrg	{ ROP_DSx,  ROP_DPSax,   ROP_DPx,  ROP_DPSax   }, /* GXxor          */
310fda9279dSmrg	{ ROP_DSo,  ROP_DPSao,   ROP_DPo,  ROP_DPSao   }, /* GXor           */
311fda9279dSmrg	{ ROP_DSon, ROP_DPSaon,  ROP_DPon, ROP_DPSaon  }, /* GXnor          */
312fda9279dSmrg	{ ROP_DSxn, ROP_DPSaxn,  ROP_PDxn, ROP_DPSaxn  }, /* GXequiv        */
313fda9279dSmrg	{ ROP_Dn,   ROP_Dn,      ROP_Dn,   ROP_DPx     }, /* GXinvert       */
314fda9279dSmrg	{ ROP_SDno, ROP_DPSanan, ROP_PDno, ROP_DPSanan }, /* GXorReverse    */
315fda9279dSmrg	{ ROP_Sn,   ROP_PSDPxox, ROP_Pn,   ROP_SPDSxox }, /* GXcopyInverted */
316fda9279dSmrg	{ ROP_DSno, ROP_DPSnao,  ROP_DPno, ROP_DSPnao  }, /* GXorInverted   */
317fda9279dSmrg	{ ROP_DSan, ROP_DSPnoan, ROP_DPan, ROP_DPSnoan }, /* GXnand         */
318fda9279dSmrg	{ ROP_1,    ROP_1,       ROP_1,    ROP_DPo     }  /* GXset          */
319fda9279dSmrg};
320