190b17f1bSmrg/*
290b17f1bSmrg * Copyright 2008 Maarten Maathuis
390b17f1bSmrg *
490b17f1bSmrg * Permission is hereby granted, free of charge, to any person obtaining a
590b17f1bSmrg * copy of this software and associated documentation files (the "Software"),
690b17f1bSmrg * to deal in the Software without restriction, including without limitation
790b17f1bSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
890b17f1bSmrg * and/or sell copies of the Software, and to permit persons to whom the
990b17f1bSmrg * Software is furnished to do so, subject to the following conditions:
1090b17f1bSmrg *
1190b17f1bSmrg * The above copyright notice and this permission notice shall be included in
1290b17f1bSmrg * all copies or substantial portions of the Software.
1390b17f1bSmrg *
1490b17f1bSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1590b17f1bSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1690b17f1bSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1790b17f1bSmrg * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
1890b17f1bSmrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
1990b17f1bSmrg * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
2090b17f1bSmrg * SOFTWARE.
2190b17f1bSmrg */
2290b17f1bSmrg
2390b17f1bSmrg/* Ternary Raster Operations as defined by GDI
2490b17f1bSmrg * 0 = black
2590b17f1bSmrg * 1 = white
2690b17f1bSmrg * D = destination
2790b17f1bSmrg * S = source
2890b17f1bSmrg * P = pattern
2990b17f1bSmrg * o = bitwise OR
3090b17f1bSmrg * a = bitwise AND
3190b17f1bSmrg * n = bitwise inverse
3290b17f1bSmrg * x = bitwise XOR
3390b17f1bSmrg *
3490b17f1bSmrg * The notation is reverse polish.
3590b17f1bSmrg * Example:
3690b17f1bSmrg * ROP_PDSonon: !(P | !(D | S))
3790b17f1bSmrg*/
3890b17f1bSmrg
3990b17f1bSmrg#define ROP_0		0x00
4090b17f1bSmrg#define ROP_DPSoon	0x01
4190b17f1bSmrg#define ROP_DPSona	0x02
4290b17f1bSmrg#define ROP_PSon	0x03
4390b17f1bSmrg#define ROP_SDPona	0x04
4490b17f1bSmrg#define ROP_DPon	0x05
4590b17f1bSmrg#define ROP_PDSxnon	0x06
4690b17f1bSmrg#define ROP_PDSaon	0x07
4790b17f1bSmrg#define ROP_SDPnaa	0x08
4890b17f1bSmrg#define ROP_PDSxon	0x09
4990b17f1bSmrg#define ROP_DPna	0x0A
5090b17f1bSmrg#define ROP_PSDnaon	0x0B
5190b17f1bSmrg#define ROP_SPna	0x0C
5290b17f1bSmrg#define ROP_PDSnaon	0x0D
5390b17f1bSmrg#define ROP_PDSonon	0x0E
5490b17f1bSmrg#define ROP_Pn		0x0F
5590b17f1bSmrg#define ROP_PDSona	0x10
5690b17f1bSmrg#define ROP_DSon	0x11
5790b17f1bSmrg#define ROP_SDPxnon	0x12
5890b17f1bSmrg#define ROP_SDPaon	0x13
5990b17f1bSmrg#define ROP_DPSxnon	0x14
6090b17f1bSmrg#define ROP_DPSaon	0x15
6190b17f1bSmrg#define ROP_PSDPSanaxx	0x16
6290b17f1bSmrg#define ROP_SSPxDSxaxn	0x17
6390b17f1bSmrg#define ROP_SPxPDxa	0x18
6490b17f1bSmrg#define ROP_SDPSanaxn	0x19
6590b17f1bSmrg#define ROP_PDSPaox	0x1A
6690b17f1bSmrg#define ROP_SDPSxaxn	0x1B
6790b17f1bSmrg#define ROP_PSDPaox	0x1C
6890b17f1bSmrg#define ROP_DSPDxaxn	0x1D
6990b17f1bSmrg#define ROP_PDSox	0x1E
7090b17f1bSmrg#define ROP_PDSoan	0x1F
7190b17f1bSmrg#define ROP_DPSnaa	0x20
7290b17f1bSmrg#define ROP_SDPxon	0x21
7390b17f1bSmrg#define ROP_DSna	0x22
7490b17f1bSmrg#define ROP_SPDnaon	0x23
7590b17f1bSmrg#define ROP_SPxDSxa	0x24
7690b17f1bSmrg#define ROP_PDSPanaxn	0x25
7790b17f1bSmrg#define ROP_SDPSaox	0x26
7890b17f1bSmrg#define ROP_SDPSxnox	0x27
7990b17f1bSmrg#define ROP_DPSxa	0x28
8090b17f1bSmrg#define ROP_PSDPSaoxxn	0x29
8190b17f1bSmrg#define ROP_DPSana	0x2A
8290b17f1bSmrg#define ROP_SSPxPDxaxn	0x2B
8390b17f1bSmrg#define ROP_SPDSoax	0x2C
8490b17f1bSmrg#define ROP_PSDnox	0x2D
8590b17f1bSmrg#define ROP_PSDPxox	0x2E
8690b17f1bSmrg#define ROP_PSDnoan	0x2F
8790b17f1bSmrg#define ROP_PSna	0x30
8890b17f1bSmrg#define ROP_SDPnaon	0x31
8990b17f1bSmrg#define ROP_SDPSoox	0x32
9090b17f1bSmrg#define ROP_Sn		0x33
9190b17f1bSmrg#define ROP_SPDSaox	0x34
9290b17f1bSmrg#define ROP_SPDSxnox	0x35
9390b17f1bSmrg#define ROP_SDPox	0x36
9490b17f1bSmrg#define ROP_SDPoan	0x37
9590b17f1bSmrg#define ROP_PSDPoax	0x38
9690b17f1bSmrg#define ROP_SPDnox	0x39
9790b17f1bSmrg#define ROP_SPDSxox	0x3A
9890b17f1bSmrg#define ROP_SPDnoan	0x3B
9990b17f1bSmrg#define ROP_PSx		0x3C
10090b17f1bSmrg#define ROP_SPDSonox	0x3D
10190b17f1bSmrg#define ROP_SPDSnaox	0x3E
10290b17f1bSmrg#define ROP_PSan	0x3F
10390b17f1bSmrg#define ROP_PSDnaa	0x40
10490b17f1bSmrg#define ROP_DPSxon	0x41
10590b17f1bSmrg#define ROP_SDxPDxa	0x42
10690b17f1bSmrg#define ROP_SPDSanaxn	0x43
10790b17f1bSmrg#define ROP_SDna	0x44
10890b17f1bSmrg#define ROP_DPSnaon	0x45
10990b17f1bSmrg#define ROP_DSPDaox	0x46
11090b17f1bSmrg#define ROP_PSDPxaxn	0x47
11190b17f1bSmrg#define ROP_SDPxa	0x48
11290b17f1bSmrg#define ROP_PDSPDaoxxn	0x49
11390b17f1bSmrg#define ROP_DPSDoax	0x4A
11490b17f1bSmrg#define ROP_PDSnox	0x4B
11590b17f1bSmrg#define ROP_SDPana	0x4C
11690b17f1bSmrg#define ROP_SSPxDSxoxn	0x4D
11790b17f1bSmrg#define ROP_PDSPxox	0x4E
11890b17f1bSmrg#define ROP_PDSnoan	0x4F
11990b17f1bSmrg#define ROP_PDna	0x50
12090b17f1bSmrg#define ROP_DSPnaon	0x51
12190b17f1bSmrg#define ROP_DPSDaox	0x52
12290b17f1bSmrg#define ROP_SPDSxaxn	0x53
12390b17f1bSmrg#define ROP_DPSonon	0x54
12490b17f1bSmrg#define ROP_Dn		0x55
12590b17f1bSmrg#define ROP_DPSox	0x56
12690b17f1bSmrg#define ROP_DPSoan	0x57
12790b17f1bSmrg#define ROP_PDSPoax	0x58
12890b17f1bSmrg#define ROP_DPSnox	0x59
12990b17f1bSmrg#define ROP_DPx		0x5A
13090b17f1bSmrg#define ROP_DPSDonox	0x5B
13190b17f1bSmrg#define ROP_DPSDxox	0x5C
13290b17f1bSmrg#define ROP_DPSnoan	0x5D
13390b17f1bSmrg#define ROP_DPSDnaox	0x5E
13490b17f1bSmrg#define ROP_DPan	0x5F
13590b17f1bSmrg#define ROP_PDSxa	0x60
13690b17f1bSmrg#define ROP_DSPDSaoxxn	0x61
13790b17f1bSmrg#define ROP_DSPDoax	0x62
13890b17f1bSmrg#define ROP_SDPnox	0x63
13990b17f1bSmrg#define ROP_SDPSoax	0x64
14090b17f1bSmrg#define ROP_DSPnox	0x65
14190b17f1bSmrg#define ROP_DSx		0x66
14290b17f1bSmrg#define ROP_SDPSonox	0x67
14390b17f1bSmrg#define ROP_DSPDSonoxxn	0x68
14490b17f1bSmrg#define ROP_PDSxxn	0x69
14590b17f1bSmrg#define ROP_DPSax	0x6A
14690b17f1bSmrg#define ROP_PSDPSoaxxn	0x6B
14790b17f1bSmrg#define ROP_SDPax	0x6C
14890b17f1bSmrg#define ROP_PDSPDoaxxn	0x6D
14990b17f1bSmrg#define ROP_SDPSnoax	0x6E
15090b17f1bSmrg#define ROP_PDSxnan	0x6F
15190b17f1bSmrg#define ROP_PDSana	0x70
15290b17f1bSmrg#define ROP_SSDxPDxaxn	0x71
15390b17f1bSmrg#define ROP_SDPSxox	0x72
15490b17f1bSmrg#define ROP_SDPnoan	0x73
15590b17f1bSmrg#define ROP_DSPDxox	0x74
15690b17f1bSmrg#define ROP_DSPnoan	0x75
15790b17f1bSmrg#define ROP_SDPSnaox	0x76
15890b17f1bSmrg#define ROP_DSan	0x77
15990b17f1bSmrg#define ROP_PDSax	0x78
16090b17f1bSmrg#define ROP_DSPDSoaxxn	0x79
16190b17f1bSmrg#define ROP_DPSDnoax	0x7A
16290b17f1bSmrg#define ROP_SDPxnan	0x7B
16390b17f1bSmrg#define ROP_SPDSnoax	0x7C
16490b17f1bSmrg#define ROP_DPSxnan	0x7D
16590b17f1bSmrg#define ROP_SPxDSxo	0x7E
16690b17f1bSmrg#define ROP_DPSaan	0x7F
16790b17f1bSmrg#define ROP_DPSaa	0x80
16890b17f1bSmrg#define ROP_SPxDSxon	0x81
16990b17f1bSmrg#define ROP_DPSxna	0x82
17090b17f1bSmrg#define ROP_SPDSnoaxn	0x83
17190b17f1bSmrg#define ROP_SDPxna	0x84
17290b17f1bSmrg#define ROP_PDSPnoaxn	0x85
17390b17f1bSmrg#define ROP_DSPDSoaxx	0x86
17490b17f1bSmrg#define ROP_PDSaxn	0x87
17590b17f1bSmrg#define ROP_DSa		0x88
17690b17f1bSmrg#define ROP_SDPSnaoxn	0x89
17790b17f1bSmrg#define ROP_DSPnoa	0x8A
17890b17f1bSmrg#define ROP_DSPDxoxn	0x8B
17990b17f1bSmrg#define ROP_SDPnoa	0x8C
18090b17f1bSmrg#define ROP_SDPSxoxn	0x8D
18190b17f1bSmrg#define ROP_SSDxPDxax	0x8E
18290b17f1bSmrg#define ROP_PDSanan	0x8F
18390b17f1bSmrg#define ROP_PDSxna	0x90
18490b17f1bSmrg#define ROP_SDPSnoaxn	0x91
18590b17f1bSmrg#define ROP_DPSDPoaxx	0x92
18690b17f1bSmrg#define ROP_SPDaxn	0x93
18790b17f1bSmrg#define ROP_PSDPSoaxx	0x94
18890b17f1bSmrg#define ROP_DPSaxn	0x95
18990b17f1bSmrg#define ROP_DPSxx	0x96
19090b17f1bSmrg#define ROP_PSDPSonoxx	0x97
19190b17f1bSmrg#define ROP_SDPSonoxn	0x98
19290b17f1bSmrg#define ROP_DSxn	0x99
19390b17f1bSmrg#define ROP_DPSnax	0x9A
19490b17f1bSmrg#define ROP_SDPSoaxn	0x9B
19590b17f1bSmrg#define ROP_SPDnax	0x9C
19690b17f1bSmrg#define ROP_DSPDoaxn	0x9D
19790b17f1bSmrg#define ROP_DSPDSaoxx	0x9E
19890b17f1bSmrg#define ROP_PDSxan	0x9F
19990b17f1bSmrg#define ROP_DPa		0xA0
20090b17f1bSmrg#define ROP_PDSPnaoxn	0xA1
20190b17f1bSmrg#define ROP_DPSnoa	0xA2
20290b17f1bSmrg#define ROP_DPSDxoxn	0xA3
20390b17f1bSmrg#define ROP_PDSPonoxn	0xA4
20490b17f1bSmrg#define ROP_PDxn	0xA5
20590b17f1bSmrg#define ROP_DSPnax	0xA6
20690b17f1bSmrg#define ROP_PDSPoaxn	0xA7
20790b17f1bSmrg#define ROP_DPSoa	0xA8
20890b17f1bSmrg#define ROP_DPSoxn	0xA9
20990b17f1bSmrg#define ROP_D		0xAA
21090b17f1bSmrg#define ROP_DPSono	0xAB
21190b17f1bSmrg#define ROP_SPDSxax	0xAC
21290b17f1bSmrg#define ROP_DPSDaoxn	0xAD
21390b17f1bSmrg#define ROP_DSPnao	0xAE
21490b17f1bSmrg#define ROP_DPno	0xAF
21590b17f1bSmrg#define ROP_PDSnoa	0xB0
21690b17f1bSmrg#define ROP_PDSPxoxn	0xB1
21790b17f1bSmrg#define ROP_SSPxDSxox	0xB2
21890b17f1bSmrg#define ROP_SDPanan	0xB3
21990b17f1bSmrg#define ROP_PSDnax	0xB4
22090b17f1bSmrg#define ROP_DPSDoaxn	0xB5
22190b17f1bSmrg#define ROP_DPSDPaoxx	0xB6
22290b17f1bSmrg#define ROP_SDPxan	0xB7
22390b17f1bSmrg#define ROP_PSDPxax	0xB8
22490b17f1bSmrg#define ROP_DSPDaoxn	0xB9
22590b17f1bSmrg#define ROP_DPSnao	0xBA
22690b17f1bSmrg#define ROP_DSno	0xBB
22790b17f1bSmrg#define ROP_SPDSanax	0xBC
22890b17f1bSmrg#define ROP_SDxPDxan	0xBD
22990b17f1bSmrg#define ROP_DPSxo	0xBE
23090b17f1bSmrg#define ROP_DPSano	0xBF
23190b17f1bSmrg#define ROP_Psa		0xC0
23290b17f1bSmrg#define ROP_SPDSnaoxn	0xC1
23390b17f1bSmrg#define ROP_SPDSonoxn	0xC2
23490b17f1bSmrg#define ROP_PSxn	0xC3
23590b17f1bSmrg#define ROP_SPDnoa	0xC4
23690b17f1bSmrg#define ROP_SPDSxoxn	0xC5
23790b17f1bSmrg#define ROP_SDPnax	0xC6
23890b17f1bSmrg#define ROP_PSDPoaxn	0xC7
23990b17f1bSmrg#define ROP_SDPoa	0xC8
24090b17f1bSmrg#define ROP_SPDoxn	0xC9
24190b17f1bSmrg#define ROP_DPSDxax	0xCA
24290b17f1bSmrg#define ROP_SPDSaoxn	0xCB
24390b17f1bSmrg#define ROP_S		0xCC
24490b17f1bSmrg#define ROP_SDPono	0xCD
24590b17f1bSmrg#define ROP_SDPnao	0xCE
24690b17f1bSmrg#define ROP_SPno	0xCF
24790b17f1bSmrg#define ROP_PSDnoa	0xD0
24890b17f1bSmrg#define ROP_PSDPxoxn	0xD1
24990b17f1bSmrg#define ROP_PDSnax	0xD2
25090b17f1bSmrg#define ROP_SPDSoaxn	0xD3
25190b17f1bSmrg#define ROP_SSPxPDxax	0xD4
25290b17f1bSmrg#define ROP_DPSanan	0xD5
25390b17f1bSmrg#define ROP_PSDPSaoxx	0xD6
25490b17f1bSmrg#define ROP_DPSxan	0xD7
25590b17f1bSmrg#define ROP_PDSPxax	0xD8
25690b17f1bSmrg#define ROP_SDPSaoxn	0xD9
25790b17f1bSmrg#define ROP_DPSDanax	0xDA
25890b17f1bSmrg#define ROP_SPxDSxan	0xDB
25990b17f1bSmrg#define ROP_SPDnao	0xDC
26090b17f1bSmrg#define ROP_SDno	0xDD
26190b17f1bSmrg#define ROP_SDPxo	0xDE
26290b17f1bSmrg#define ROP_SDPano	0xDF
26390b17f1bSmrg#define ROP_PDSoa	0xE0
26490b17f1bSmrg#define ROP_PDSoxn	0xE1
26590b17f1bSmrg#define ROP_DSPDxax	0xE2
26690b17f1bSmrg#define ROP_PSDPaoxn	0xE3
26790b17f1bSmrg#define ROP_SDPSxax	0xE4
26890b17f1bSmrg#define ROP_PDSPaoxn	0xE5
26990b17f1bSmrg#define ROP_SDPSanax	0xE6
27090b17f1bSmrg#define ROP_SPxPDxan	0xE7
27190b17f1bSmrg#define ROP_SSPxDSxax	0xE8
27290b17f1bSmrg#define ROP_DSPDSanaxxn	0xE9
27390b17f1bSmrg#define ROP_DPSao	0xEA
27490b17f1bSmrg#define ROP_DPSxno	0xEB
27590b17f1bSmrg#define ROP_SDPao	0xEC
27690b17f1bSmrg#define ROP_SDPxno	0xED
27790b17f1bSmrg#define ROP_DSo		0xEE
27890b17f1bSmrg#define ROP_SDPnoo	0xEF
27990b17f1bSmrg#define ROP_P		0xF0
28090b17f1bSmrg#define ROP_PDSono	0xF1
28190b17f1bSmrg#define ROP_PDSnao	0xF2
28290b17f1bSmrg#define ROP_PSno	0xF3
28390b17f1bSmrg#define ROP_PSDnao	0xF4
28490b17f1bSmrg#define ROP_PDno	0xF5
28590b17f1bSmrg#define ROP_PDSxo	0xF6
28690b17f1bSmrg#define ROP_PDSano	0xF7
28790b17f1bSmrg#define ROP_PDSao	0xF8
28890b17f1bSmrg#define ROP_PDSxno	0xF9
28990b17f1bSmrg#define ROP_DPo		0xFA
29090b17f1bSmrg#define ROP_DPSnoo	0xFB
29190b17f1bSmrg#define ROP_PSo		0xFC
29290b17f1bSmrg#define ROP_PSDnoo	0xFD
29390b17f1bSmrg#define ROP_DPSoo	0xFE
29490b17f1bSmrg#define ROP_1		0xFF
29590b17f1bSmrg
29690b17f1bSmrg/* derived from XAA */
29790b17f1bSmrgstatic struct {
29890b17f1bSmrg	int copy;
29990b17f1bSmrg	int copy_planemask;
30090b17f1bSmrg	int pattern;
30190b17f1bSmrg	int pattern_planemask;
30290b17f1bSmrg} VIAROP[] = {
30390b17f1bSmrg	{ ROP_0,    ROP_0,       ROP_0,    ROP_DPna    }, /* GXclear        */
30490b17f1bSmrg	{ ROP_DSa,  ROP_DSPnoa,  ROP_DPa,  ROP_DPSnoa  }, /* GXand          */
30590b17f1bSmrg	{ ROP_SDna, ROP_DPSnaon, ROP_PDna, ROP_DSPnaon }, /* GXandReverse   */
30690b17f1bSmrg	{ ROP_S,    ROP_DPSDxax, ROP_P,    ROP_DSPDxax }, /* GXcopy         */
30790b17f1bSmrg	{ ROP_DSna, ROP_DPSana,  ROP_DPna, ROP_DPSana  }, /* GXandInverted  */
30890b17f1bSmrg	{ ROP_D,    ROP_D,       ROP_D,    ROP_D       }, /* GXnoop         */
30990b17f1bSmrg	{ ROP_DSx,  ROP_DPSax,   ROP_DPx,  ROP_DPSax   }, /* GXxor          */
31090b17f1bSmrg	{ ROP_DSo,  ROP_DPSao,   ROP_DPo,  ROP_DPSao   }, /* GXor           */
31190b17f1bSmrg	{ ROP_DSon, ROP_DPSaon,  ROP_DPon, ROP_DPSaon  }, /* GXnor          */
31290b17f1bSmrg	{ ROP_DSxn, ROP_DPSaxn,  ROP_PDxn, ROP_DPSaxn  }, /* GXequiv        */
31390b17f1bSmrg	{ ROP_Dn,   ROP_Dn,      ROP_Dn,   ROP_DPx     }, /* GXinvert       */
31490b17f1bSmrg	{ ROP_SDno, ROP_DPSanan, ROP_PDno, ROP_DPSanan }, /* GXorReverse    */
31590b17f1bSmrg	{ ROP_Sn,   ROP_PSDPxox, ROP_Pn,   ROP_SPDSxox }, /* GXcopyInverted */
31690b17f1bSmrg	{ ROP_DSno, ROP_DPSnao,  ROP_DPno, ROP_DSPnao  }, /* GXorInverted   */
31790b17f1bSmrg	{ ROP_DSan, ROP_DSPnoan, ROP_DPan, ROP_DPSnoan }, /* GXnand         */
31890b17f1bSmrg	{ ROP_1,    ROP_1,       ROP_1,    ROP_DPo     }  /* GXset          */
31990b17f1bSmrg};
32090b17f1bSmrg
32190b17f1bSmrg#define VIAACCELCOPYROP(vRop) (VIAROP[vRop].copy << 24)
32290b17f1bSmrg#define VIAACCELPATTERNROP(vRop) (VIAROP[vRop].pattern << 24)
323