]> git.sesse.net Git - rdpsrv/blob - Xserver/programs/Xserver/cfb/cfbrrop.h
Support RDP5 logon packets.
[rdpsrv] / Xserver / programs / Xserver / cfb / cfbrrop.h
1 /*
2  * $XConsortium: cfbrrop.h,v 1.10 95/06/08 23:20:39 gildea Exp $
3  * $XFree86: xc/programs/Xserver/cfb/cfbrrop.h,v 3.2 1997/01/08 20:32:41 dawes Exp $
4  *
5 Copyright (c) 1989  X Consortium
6
7 Permission is hereby granted, free of charge, to any person obtaining a copy
8 of this software and associated documentation files (the "Software"), to deal
9 in the Software without restriction, including without limitation the rights
10 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 copies of the Software, and to permit persons to whom the Software is
12 furnished to do so, subject to the following conditions:
13
14 The above copyright notice and this permission notice shall be included in
15 all copies or substantial portions of the Software.
16
17 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
20 X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
24 Except as contained in this notice, the name of the X Consortium shall not be
25 used in advertising or otherwise to promote the sale, use or other dealings
26 in this Software without prior written authorization from the X Consortium.
27  *
28  * Author:  Keith Packard, MIT X Consortium
29  */
30
31 #ifndef GXcopy
32 #include "X.h"
33 #endif
34
35 #define RROP_FETCH_GC(gc) \
36     RROP_FETCH_GCPRIV(((cfbPrivGCPtr)(gc)->devPrivates[cfbGCPrivateIndex].ptr))
37
38 #ifndef RROP
39 #define RROP GXset
40 #endif
41
42 #if RROP == GXcopy
43 #if PSZ == 24
44 #define RROP_DECLARE    register unsigned long  rrop_xor; \
45     unsigned long piQxelXor[3], spiQxelXor[8];
46 #define RROP_FETCH_GCPRIV(devPriv)  rrop_xor = (devPriv)->xor; \
47     spiQxelXor[0] = rrop_xor & 0xFFFFFF; \
48     spiQxelXor[2] = rrop_xor << 24; \
49     spiQxelXor[3] = (rrop_xor & 0xFFFF00)>> 8; \
50     spiQxelXor[4] = rrop_xor << 16; \
51     spiQxelXor[5] = (rrop_xor & 0xFF0000)>> 16; \
52     spiQxelXor[6] = rrop_xor << 8; \
53     spiQxelXor[1] = spiQxelXor[7] = 0; \
54     piQxelXor[0] = (rrop_xor & 0xFFFFFF)|(rrop_xor << 24); \
55     piQxelXor[1] = (rrop_xor << 16)|((rrop_xor & 0xFFFF00)>> 8); \
56     piQxelXor[2] = (rrop_xor << 8)|((rrop_xor & 0xFF0000)>> 16);
57 #define RROP_SOLID24(dst,index)     {\
58             register int idx = ((index) & 3)<< 1; \
59             *(dst) = (*(dst) & cfbrmask[idx])|spiQxelXor[idx]; \
60             if (idx == 2  ||  idx == 4){ \
61               idx++; \
62               *((dst)+1) = (*((dst)+1) & cfbrmask[idx])|spiQxelXor[idx]; \
63             } \
64         }
65 #define RROP_SOLID(dst, idx) \
66             (*(dst) = piQxelXor[(idx)])
67 #define RROP_SOLID_MASK(dst,mask,idx) \
68             (*(dst) = (*(dst) & ~(mask))|(piQxelXor[(idx)] & (mask)))
69 #else
70 #define RROP_FETCH_GCPRIV(devPriv)  rrop_xor = (devPriv)->xor;
71 #define RROP_DECLARE    register unsigned long  rrop_xor;
72 #define RROP_SOLID(dst)     (*(dst) = (rrop_xor))
73 #define RROP_SOLID_MASK(dst,mask) (*(dst) = (*(dst) & ~(mask)) | ((rrop_xor) & (mask)))
74 #define RROP_SOLID_lu(dst)          stl_u(rrop_xor, dst)
75 #define RROP_SOLID_MASK_lu(dst,mask) stl_u((ldl_u(dst) & ~(mask)) | ((rrop_xor) & (mask)), dst)
76 #endif
77 #define RROP_NAME(prefix)   RROP_NAME_CAT(prefix,Copy)
78 #endif /* GXcopy */
79
80 #if RROP == GXxor
81 #if PSZ == 24
82 #define RROP_DECLARE    register unsigned long  rrop_xor; \
83     unsigned long piQxelXor[3], spiQxelXor[8];
84 #define RROP_FETCH_GCPRIV(devPriv)  rrop_xor = (devPriv)->xor; \
85     spiQxelXor[0] = rrop_xor & 0xFFFFFF; \
86     spiQxelXor[2] = rrop_xor << 24; \
87     spiQxelXor[3] = (rrop_xor & 0xFFFF00)>> 8; \
88     spiQxelXor[4] = rrop_xor << 16; \
89     spiQxelXor[5] = (rrop_xor & 0xFF0000)>> 16; \
90     spiQxelXor[6] = rrop_xor << 8; \
91     spiQxelXor[1] = spiQxelXor[7] = 0; \
92     piQxelXor[0] = (rrop_xor & 0xFFFFFF)|(rrop_xor << 24); \
93     piQxelXor[1] = (rrop_xor << 16)|((rrop_xor & 0xFFFF00)>> 8); \
94     piQxelXor[2] = (rrop_xor << 8)|((rrop_xor & 0xFF0000)>> 16);
95 #define RROP_SOLID24(dst,index)      {\
96             register int idx = ((index) & 3)<< 1; \
97             *(dst) ^= spiQxelXor[idx]; \
98             if (idx == 2  ||  idx == 4) \
99               *((dst)+1) ^= spiQxelXor[idx+1]; \
100         }
101 #define RROP_SOLID(dst,idx) \
102             (*(dst) ^= piQxelXor[(idx)])
103 #define RROP_SOLID_MASK(dst,mask,idx) \
104             (*(dst) ^= (piQxelXor[(idx)] & (mask)))
105 #else
106 #define RROP_DECLARE    register unsigned long  rrop_xor;
107 #define RROP_FETCH_GCPRIV(devPriv)  rrop_xor = (devPriv)->xor;
108 #define RROP_SOLID(dst)     (*(dst) ^= (rrop_xor))
109 #define RROP_SOLID_MASK(dst,mask) (*(dst) ^= ((rrop_xor) & (mask)))
110 #endif
111 #define RROP_NAME(prefix)   RROP_NAME_CAT(prefix,Xor)
112 #endif /* GXxor */
113
114 #if RROP == GXand
115 #if PSZ == 24
116 #define RROP_DECLARE    register unsigned long  rrop_and; \
117     unsigned long piQxelAnd[3], spiQxelAnd[6];
118 #define RROP_FETCH_GCPRIV(devPriv)  rrop_and = (devPriv)->and; \
119     spiQxelAnd[0] = (rrop_and & 0xFFFFFF) | 0xFF000000; \
120     spiQxelAnd[2] = (rrop_and << 24) | 0xFFFFFF; \
121     spiQxelAnd[3] = ((rrop_and & 0xFFFF00)>> 8) | 0xFFFF0000; \
122     spiQxelAnd[4] = (rrop_and << 16) | 0xFFFF; \
123     spiQxelAnd[5] = ((rrop_and & 0xFF0000)>> 16) | 0xFFFFFF00; \
124     spiQxelAnd[1] = (rrop_and << 8) | 0xFF; \
125     piQxelAnd[0] = (rrop_and & 0xFFFFFF)|(rrop_and << 24); \
126     piQxelAnd[1] = (rrop_and << 16)|((rrop_and & 0xFFFF00)>> 8); \
127     piQxelAnd[2] = (rrop_and << 8)|((rrop_and & 0xFF0000)>> 16); 
128 #define RROP_SOLID24(dst,index)     {\
129             switch((index) & 3){ \
130             case 0: \
131               *(dst) &= spiQxelAnd[0]; \
132               break; \
133             case 3: \
134               *(dst) &= spiQxelAnd[1]; \
135               break; \
136             case 1: \
137               *(dst) &= spiQxelAnd[2]; \
138               *((dst)+1) &= spiQxelAnd[3]; \
139               break; \
140             case 2: \
141               *(dst) &= spiQxelAnd[4]; \
142               *((dst)+1) &= spiQxelAnd[5]; \
143               break; \
144             } \
145             }
146 #define RROP_SOLID(dst,idx) \
147             (*(dst) &= piQxelAnd[(idx)])
148 #define RROP_SOLID_MASK(dst,mask,idx) \
149             (*(dst) &= (piQxelAnd[(idx)] | ~(mask)))
150 #else
151 #define RROP_DECLARE    register unsigned long  rrop_and;
152 #define RROP_FETCH_GCPRIV(devPriv)  rrop_and = (devPriv)->and;
153 #define RROP_SOLID(dst)     (*(dst) &= (rrop_and))
154 #define RROP_SOLID_MASK(dst,mask) (*(dst) &= ((rrop_and) | ~(mask)))
155 #endif
156 #define RROP_NAME(prefix)   RROP_NAME_CAT(prefix,And)
157 #endif /* GXand */
158
159 #if RROP == GXor
160 #if PSZ == 24
161 #define RROP_DECLARE    register unsigned long  rrop_or; \
162     unsigned long piQxelOr[3], spiQxelOr[6];
163 #define RROP_FETCH_GCPRIV(devPriv)  rrop_or = (devPriv)->xor; \
164     spiQxelOr[0] = rrop_or & 0xFFFFFF; \
165     spiQxelOr[1] = rrop_or << 24; \
166     spiQxelOr[2] = rrop_or << 16; \
167     spiQxelOr[3] = rrop_or << 8; \
168     spiQxelOr[4] = (rrop_or & 0xFFFF00)>> 8; \
169     spiQxelOr[5] = (rrop_or & 0xFF0000)>> 16; \
170     piQxelOr[0] = (rrop_or & 0xFFFFFF)|(rrop_or << 24); \
171     piQxelOr[1] = (rrop_or << 16)|((rrop_or & 0xFFFF00)>> 8); \
172     piQxelOr[2] = (rrop_or << 8)|((rrop_or & 0xFF0000)>> 16);
173 #define RROP_SOLID24(dst,index)      {\
174             switch((index) & 3){ \
175             case 0: \
176               *(dst) |= spiQxelOr[0]; \
177               break; \
178             case 3: \
179               *(dst) |= spiQxelOr[3]; \
180               break; \
181             case 1: \
182               *(dst) |= spiQxelOr[1]; \
183               *((dst)+1) |= spiQxelOr[4]; \
184               break; \
185             case 2: \
186               *(dst) |= spiQxelOr[2]; \
187               *((dst)+1) |= spiQxelOr[5]; \
188               break; \
189             } \
190             }
191 #define RROP_SOLID(dst,idx) \
192             (*(dst) |= piQxelOr[(idx)])
193 #define RROP_SOLID_MASK(dst,mask,idx) \
194             (*(dst) |= (piQxelOr[(idx)] & (mask)))
195 #else
196 #define RROP_DECLARE    register unsigned long  rrop_or;
197 #define RROP_FETCH_GCPRIV(devPriv)  rrop_or = (devPriv)->xor;
198 #define RROP_SOLID(dst)     (*(dst) |= (rrop_or))
199 #define RROP_SOLID_MASK(dst,mask) (*(dst) |= ((rrop_or) & (mask)))
200 #endif
201 #define RROP_NAME(prefix)   RROP_NAME_CAT(prefix,Or)
202 #endif /* GXor */
203
204 #if RROP == GXnoop
205 #define RROP_DECLARE
206 #define RROP_FETCH_GCPRIV(devPriv)
207 #define RROP_SOLID(dst)
208 #define RROP_SOLID_MASK(dst,mask)
209 #define RROP_NAME(prefix)   RROP_NAME_CAT(prefix,Noop)
210 #endif /* GXnoop */
211
212 #if RROP ==  GXset
213 #if PSZ == 24
214 #define RROP_DECLARE        register unsigned long      rrop_and, rrop_xor; \
215     unsigned long piQxelAnd[3], piQxelXor[3],  spiQxelAnd[6], spiQxelXor[6];
216 #define RROP_FETCH_GCPRIV(devPriv)  rrop_and = (devPriv)->and; \
217                                     rrop_xor = (devPriv)->xor; \
218     spiQxelXor[0] = rrop_xor & 0xFFFFFF; \
219     spiQxelXor[1] = rrop_xor << 24; \
220     spiQxelXor[2] = rrop_xor << 16; \
221     spiQxelXor[3] = rrop_xor << 8; \
222     spiQxelXor[4] = (rrop_xor & 0xFFFF00)>> 8; \
223     spiQxelXor[5] = (rrop_xor & 0xFF0000)>> 16; \
224     spiQxelAnd[0] = (rrop_and & 0xFFFFFF) | 0xFF000000; \
225     spiQxelAnd[1] = (rrop_and << 24) | 0xFFFFFF; \
226     spiQxelAnd[2] = (rrop_and << 16) | 0xFFFF; \
227     spiQxelAnd[3] = (rrop_and << 8) | 0xFF; \
228     spiQxelAnd[4] = ((rrop_and & 0xFFFF00)>> 8) | 0xFFFF0000; \
229     spiQxelAnd[5] = ((rrop_and & 0xFF0000)>> 16) | 0xFFFFFF00; \
230     piQxelAnd[0] = (rrop_and & 0xFFFFFF)|(rrop_and << 24); \
231     piQxelAnd[1] = (rrop_and << 16)|((rrop_and & 0xFFFF00)>> 8); \
232     piQxelAnd[2] = (rrop_and << 8)|((rrop_and & 0xFF0000)>> 16); \
233     piQxelXor[0] = (rrop_xor & 0xFFFFFF)|(rrop_xor << 24); \
234     piQxelXor[1] = (rrop_xor << 16)|((rrop_xor & 0xFFFF00)>> 8); \
235     piQxelXor[2] = (rrop_xor << 8)|((rrop_xor & 0xFF0000)>> 16);
236 #define RROP_SOLID24(dst,index)      {\
237             switch((index) & 3){ \
238             case 0: \
239               *(dst) = ((*(dst) & (piQxelAnd[0] |0xFF000000))^(piQxelXor[0] & 0xFFFFFF)); \
240               break; \
241             case 3: \
242               *(dst) = ((*(dst) & (piQxelAnd[2]|0xFF))^(piQxelXor[2] & 0xFFFFFF00)); \
243               break; \
244             case 1: \
245               *(dst) = ((*(dst) & (piQxelAnd[0]|0xFFFFFF))^(piQxelXor[0] & 0xFF000000)); \
246               *((dst)+1) = ((*((dst)+1) & (piQxelAnd[1]|0xFFFF0000))^(piQxelXor[1] & 0xFFFF)); \
247               break; \
248             case 2: \
249               *(dst) = ((*(dst) & (piQxelAnd[1]|0xFFFF))^(piQxelXor[1] & 0xFFFF0000)); \
250               *((dst)+1) = ((*((dst)+1) & (piQxelAnd[2]|0xFFFFFF00))^(piQxelXor[2] & 0xFF)); \
251               break; \
252             } \
253             }
254 #define RROP_SOLID(dst,idx) \
255             (*(dst) = DoRRop (*(dst), piQxelAnd[(idx)], piQxelXor[(idx)]))
256 #define RROP_SOLID_MASK(dst,mask,idx) \
257             (*(dst) = DoMaskRRop (*(dst), piQxelAnd[(idx)], piQxelXor[(idx)], (mask)))
258 #else
259 #define RROP_DECLARE        register unsigned long      rrop_and, rrop_xor;
260 #define RROP_FETCH_GCPRIV(devPriv)  rrop_and = (devPriv)->and; \
261                                     rrop_xor = (devPriv)->xor;
262 #define RROP_SOLID(dst)     (*(dst) = DoRRop (*(dst), rrop_and, rrop_xor))
263 #define RROP_SOLID_MASK(dst,mask)   (*(dst) = DoMaskRRop (*(dst), rrop_and, rrop_xor, (mask)))
264 #endif
265 #define RROP_NAME(prefix)   RROP_NAME_CAT(prefix,General)
266 #endif /* GXset */
267
268 #define RROP_UNROLL_CASE1(p,i)    case (i): RROP_SOLID((p) - (i));
269 #define RROP_UNROLL_CASE2(p,i)    RROP_UNROLL_CASE1(p,(i)+1) RROP_UNROLL_CASE1(p,i)
270 #define RROP_UNROLL_CASE4(p,i)    RROP_UNROLL_CASE2(p,(i)+2) RROP_UNROLL_CASE2(p,i)
271 #define RROP_UNROLL_CASE8(p,i)    RROP_UNROLL_CASE4(p,(i)+4) RROP_UNROLL_CASE4(p,i)
272 #define RROP_UNROLL_CASE16(p,i)   RROP_UNROLL_CASE8(p,(i)+8) RROP_UNROLL_CASE8(p,i)
273 #define RROP_UNROLL_CASE3(p)    RROP_UNROLL_CASE2(p,2) RROP_UNROLL_CASE1(p,1)
274 #define RROP_UNROLL_CASE7(p)    RROP_UNROLL_CASE4(p,4) RROP_UNROLL_CASE3(p)
275 #define RROP_UNROLL_CASE15(p)   RROP_UNROLL_CASE8(p,8) RROP_UNROLL_CASE7(p)
276 #define RROP_UNROLL_CASE31(p)   RROP_UNROLL_CASE16(p,16) RROP_UNROLL_CASE15(p)
277 #ifdef LONG64
278 #define RROP_UNROLL_CASE63(p)   RROP_UNROLL_CASE32(p,32) RROP_UNROLL_CASE31(p)
279 #endif /* LONG64 */
280
281 #define RROP_UNROLL_LOOP1(p,i) RROP_SOLID((p) + (i));
282 #define RROP_UNROLL_LOOP2(p,i) RROP_UNROLL_LOOP1(p,(i)) RROP_UNROLL_LOOP1(p,(i)+1)
283 #define RROP_UNROLL_LOOP4(p,i) RROP_UNROLL_LOOP2(p,(i)) RROP_UNROLL_LOOP2(p,(i)+2)
284 #define RROP_UNROLL_LOOP8(p,i) RROP_UNROLL_LOOP4(p,(i)) RROP_UNROLL_LOOP4(p,(i)+4)
285 #define RROP_UNROLL_LOOP16(p,i) RROP_UNROLL_LOOP8(p,(i)) RROP_UNROLL_LOOP8(p,(i)+8)
286 #define RROP_UNROLL_LOOP32(p,i) RROP_UNROLL_LOOP16(p,(i)) RROP_UNROLL_LOOP16(p,(i)+16)
287 #ifdef LONG64
288 #define RROP_UNROLL_LOOP64(p,i) RROP_UNROLL_LOOP32(p,(i)) RROP_UNROLL_LOOP32(p,(i)+32)
289 #endif /* LONG64 */
290
291 #if defined (FAST_CONSTANT_OFFSET_MODE) && defined (SHARED_IDCACHE) && (RROP == GXcopy)
292
293 #ifdef LONG64
294 #define RROP_UNROLL_SHIFT       6
295 #define RROP_UNROLL_CASE(p)     RROP_UNROLL_CASE63(p)
296 #define RROP_UNROLL_LOOP(p)     RROP_UNROLL_LOOP64(p,-64)
297 #else /* not LONG64 */
298 #define RROP_UNROLL_SHIFT       5
299 #define RROP_UNROLL_CASE(p)     RROP_UNROLL_CASE31(p)
300 #define RROP_UNROLL_LOOP(p)     RROP_UNROLL_LOOP32(p,-32)
301 #endif /* LONG64 */
302 #define RROP_UNROLL             (1<<RROP_UNROLL_SHIFT)
303 #define RROP_UNROLL_MASK        (RROP_UNROLL-1)
304
305 #define RROP_SPAN(pdst,nmiddle) {\
306     int part = (nmiddle) & RROP_UNROLL_MASK; \
307     (nmiddle) >>= RROP_UNROLL_SHIFT; \
308     (pdst) += part * (sizeof (unsigned long) / sizeof (*pdst)); \
309     switch (part) {\
310         RROP_UNROLL_CASE((unsigned long *) (pdst)) \
311     } \
312     while (--(nmiddle) >= 0) { \
313         (pdst) += RROP_UNROLL * (sizeof (unsigned long) / sizeof (*pdst)); \
314         RROP_UNROLL_LOOP((unsigned long *) (pdst)) \
315     } \
316 }
317 #else
318 #define RROP_SPAN(pdst,nmiddle) \
319     while (--(nmiddle) >= 0) { \
320         RROP_SOLID((unsigned long *) (pdst)); \
321         (pdst) += sizeof (unsigned long) / sizeof (*pdst); \
322     }
323 #define RROP_SPAN_lu(pdst,nmiddle) \
324     while (--(nmiddle) >= 0) { \
325         RROP_SOLID_lu((unsigned long *) (pdst)); \
326         (pdst) += sizeof (unsigned long) / sizeof (*pdst); \
327     }
328 #endif
329
330 #if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP)
331 #define RROP_NAME_CAT(prefix,suffix)    prefix##suffix
332 #else
333 #define RROP_NAME_CAT(prefix,suffix)    prefix/**/suffix
334 #endif