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