1 /*
2  * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
3  * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  */
24 
25 #include <stdio.h>
26 #include <X11/X.h>
27 #include <X11/Xproto.h>
28 #define _RENDER_SERVER_
29 #include "scope.h"
30 #include "x11.h"
31 #include "renderscope.h"
32 #include "extensions.h"
33 
34 static unsigned char RENDERRequest, RENDERError;
35 
36 #define RENDERNError	5
37 
38 static void
render_decode_req(FD fd,const unsigned char * buf)39 render_decode_req(FD fd, const unsigned char *buf)
40 {
41     short Major = IByte(&buf[0]);
42     short Minor = IByte(&buf[1]);
43 
44     switch (Minor) {
45     case 0:
46         RenderQueryVersion(fd, buf);
47         ExtendedReplyExpected(fd, Major, Minor);
48         break;
49     case 1:
50         RenderQueryPictFormats(fd, buf);
51         ExtendedReplyExpected(fd, Major, Minor);
52         break;
53     case 2:
54         RenderQueryPictIndexValues(fd, buf);
55         ExtendedReplyExpected(fd, Major, Minor);
56         break;
57     case 3:
58         RenderQueryDithers(fd, buf);
59         ExtendedReplyExpected(fd, Major, Minor);
60         break;
61     case 4:
62         RenderCreatePicture(fd, buf);
63         break;
64     case 5:
65         RenderChangePicture(fd, buf);
66         break;
67     case 6:
68         RenderSetPictureClipRectangles(fd, buf);
69         break;
70     case 7:
71         RenderFreePicture(fd, buf);
72         break;
73     case 8:
74         RenderComposite(fd, buf);
75         break;
76     case 9:
77         RenderScale(fd, buf);
78         break;
79     case 10:
80         RenderTrapezoids(fd, buf);
81         break;
82     case 11:
83         RenderTriangles(fd, buf);
84         break;
85     case 12:
86         RenderTriStrip(fd, buf);
87         break;
88     case 13:
89         RenderTriFan(fd, buf);
90         break;
91     case 14:
92         RenderColorTrapezoids(fd, buf);
93         break;
94     case 15:
95         RenderColorTriangles(fd, buf);
96         break;
97     case 16:
98         RenderTransform(fd, buf);
99         break;
100     case 17:
101         RenderCreateGlyphSet(fd, buf);
102         break;
103     case 18:
104         RenderReferenceGlyphSet(fd, buf);
105         break;
106     case 19:
107         RenderFreeGlyphSet(fd, buf);
108         break;
109     case 20:
110         RenderAddGlyphs(fd, buf);
111         break;
112     case 21:
113         RenderAddGlyphsFromPicture(fd, buf);
114         break;
115     case 22:
116         RenderFreeGlyphs(fd, buf);
117         break;
118     case 23:
119         RenderCompositeGlyphs8(fd, buf);
120         break;
121     case 24:
122         RenderCompositeGlyphs16(fd, buf);
123         break;
124     case 25:
125         RenderCompositeGlyphs32(fd, buf);
126         break;
127     case 26:
128         RenderFillRectangles(fd, buf);
129         break;
130     case 27:
131         RenderCreateCursor(fd, buf);
132         break;
133     case 28:
134         RenderSetPictureTransform(fd, buf);
135         break;
136     case 29:
137         RenderQueryFilters(fd, buf);
138         ExtendedReplyExpected(fd, Major, Minor);
139         break;
140     case 30:
141         RenderSetPictureFilter(fd, buf);
142         break;
143     case 31:
144         RenderCreateAnimCursor(fd, buf);
145         break;
146     case 32:
147         RenderAddTraps(fd, buf);
148         break;
149     case 33:
150         RenderCreateSolidFill(fd, buf);
151         break;
152     case 34:
153         RenderCreateLinearGradient(fd, buf);
154         break;
155     case 35:
156         RenderCreateRadialGradient(fd, buf);
157         break;
158     case 36:
159         RenderCreateConicalGradient(fd, buf);
160         break;
161     default:
162         ExtendedRequest(fd, buf);
163         ExtendedReplyExpected(fd, Major, Minor);
164         break;
165     }
166 }
167 
168 static void
render_decode_reply(FD fd,const unsigned char * buf,short RequestMinor)169 render_decode_reply(FD fd, const unsigned char *buf, short RequestMinor)
170 {
171     switch (RequestMinor) {
172     case 0:
173         RenderQueryVersionReply(fd, buf);
174         break;
175     case 1:
176         RenderQueryPictFormatsReply(fd, buf);
177         break;
178     case 2:
179         RenderQueryPictIndexValuesReply(fd, buf);
180         break;
181     case 3:
182         RenderQueryDithersReply(fd, buf);
183         break;
184     case 29:
185         RenderQueryFiltersReply(fd, buf);
186         break;
187     default:
188         UnknownReply(buf);
189         break;
190     }
191 }
192 
193 static void
render_decode_error(FD fd,const unsigned char * buf)194 render_decode_error(FD fd, const unsigned char *buf)
195 {
196     short error = IByte(&buf[1]) - RENDERError;
197 
198     switch (error) {
199     case 0:
200         RenderPictFormatError(fd, buf);
201         break;
202     case 1:
203         RenderPictureError(fd, buf);
204         break;
205     case 2:
206         RenderPictOpError(fd, buf);
207         break;
208     case 3:
209         RenderGlyphSetError(fd, buf);
210         break;
211     case 4:
212         RenderGlyphError(fd, buf);
213         break;
214     default:
215         break;
216     }
217 }
218 
219 static int
PrintPICTURE(const unsigned char * buf)220 PrintPICTURE(const unsigned char *buf)
221 {
222     /* print a WINDOW -- CARD32  plus 0 = None */
223     long n = ILong(buf);
224 
225     if (n == 0)
226         fprintf(stdout, "None");
227     else
228         fprintf(stdout, "PICTURE %08lx", n);
229     return (4);
230 }
231 
232 static int
PrintPICTFORMAT(const unsigned char * buf)233 PrintPICTFORMAT(const unsigned char *buf)
234 {
235     /* print a WINDOW -- CARD32  plus 0 = None */
236     long n = ILong(buf);
237 
238     if (n == 0)
239         fprintf(stdout, "None");
240     else
241         fprintf(stdout, "PICTFORMAT %08lx", n);
242     return (4);
243 }
244 
245 static int
PrintPICTFORMINFO(const unsigned char * buf)246 PrintPICTFORMINFO(const unsigned char *buf)
247 {
248     /* print a PictFormInfo */
249     long n = ILong(buf);
250     short t = IByte(buf + 4);
251     short d = IByte(buf + 5);
252 
253     fprintf(stdout, "PICTFORMINFO %08lx %s %d ",
254             n, t == 0 ? "Indexed" : "Direct", d);
255     if (t == 0) {
256         long c = ILong(buf + 20);
257 
258         fprintf(stdout, "cmap %08lx", c);
259     }
260     else {
261         short r = IShort(buf + 8);
262         short g = IShort(buf + 12);
263         short b = IShort(buf + 16);
264         short a = IShort(buf + 20);
265 
266         fprintf(stdout, "%d %d %d %d", a, r, g, b);
267     }
268     return (28);
269 }
270 
271 static int
PrintGLYPHSET(const unsigned char * buf)272 PrintGLYPHSET(const unsigned char *buf)
273 {
274     /* print a GLYPHSET -- CARD32  plus 0 = None */
275     long n = ILong(buf);
276 
277     if (n == 0)
278         fprintf(stdout, "None");
279     else
280         fprintf(stdout, "GLYPHSET %08lx", n);
281     return (4);
282 }
283 
284 static int
PrintRENDERCOLOR(const unsigned char * buf)285 PrintRENDERCOLOR(const unsigned char *buf)
286 {
287     /* print a RENDERCOLOR */
288     unsigned short r, g, b, a;
289 
290     r = IShort(buf);
291     g = IShort(buf + 2);
292     b = IShort(buf + 4);
293     a = IShort(buf + 6);
294     fprintf(stdout, "COLOR r:%04x g:%04x b:%04x a:%04x", r, g, b, a);
295     return (8);
296 }
297 
298 static int
PrintFIXED(const unsigned char * buf)299 PrintFIXED(const unsigned char *buf)
300 {
301     /* print a PICTURE */
302     long n = ILong(buf);
303 
304     fprintf(stdout, "FIXED %7.2f", n / 65536.0);
305     return 4;
306 }
307 
308 static int
PrintPOINTFIXED(const unsigned char * buf)309 PrintPOINTFIXED(const unsigned char *buf)
310 {
311     long x = ILong(buf);
312     long y = ILong(buf + 4);
313 
314     fprintf(stdout, "POINT %7.2f, %7.2f", x / 65536.0, y / 65536.0);
315     return 8;
316 }
317 
318 static int
PrintTRAPEZOID(const unsigned char * buf)319 PrintTRAPEZOID(const unsigned char *buf)
320 {
321     /* print a TRAPEZOID */
322     PrintField(buf, 0, 4, FIXED, "top");
323     PrintField(buf, 4, 4, FIXED, "bottom");
324     PrintField(buf, 8, 8, POINTFIXED, "left top");
325     PrintField(buf, 16, 8, POINTFIXED, "left bottom");
326     PrintField(buf, 24, 8, POINTFIXED, "right top");
327     PrintField(buf, 32, 8, POINTFIXED, "right bottom");
328     return 40;
329 }
330 
331 static int
PrintTRIANGLE(const unsigned char * buf)332 PrintTRIANGLE(const unsigned char *buf)
333 {
334     /* print a TRIANGLE */
335     PrintField(buf, 0, 8, POINTFIXED, "p1");
336     PrintField(buf, 8, 8, POINTFIXED, "p2");
337     PrintField(buf, 16, 8, POINTFIXED, "p3");
338     return 24;
339 }
340 
341 static int
PrintFILTERALIAS(const unsigned char * buf)342 PrintFILTERALIAS(const unsigned char *buf)
343 {
344     /* print a FILTERALIAS -- CARD16  plus -1 = None */
345     short n = IShort(buf);
346 
347     if (n == -1)
348         fprintf(stdout, "AliasNone");
349     else
350         fprintf(stdout, "FILTERALIAS %04x", n);
351     return (2);
352 }
353 
354 static int
PrintRENDERTRANSFORM(const unsigned char * buf)355 PrintRENDERTRANSFORM(const unsigned char *buf)
356 {
357     const unsigned char *next = buf;
358     int i, j;
359 
360     for (i = 0; i < 3; i++) {
361         for (j = 0; j < 3; j++) {
362             long f = ILong(next);
363 
364             next += 4;
365             fprintf(stdout, " %7.2f", f / 65536.0);
366         }
367         if (i < 2) {
368             fprintf(stdout, "\n%s%20s  ", Leader, "");
369         }
370         else {
371             fprintf(stdout, "\n");
372         }
373     }
374     return (next - buf);
375 }
376 
377 void
InitializeRENDER(const unsigned char * buf)378 InitializeRENDER(const unsigned char *buf)
379 {
380     TYPE p;
381     int errcode;
382 
383     RENDERRequest = (unsigned char) (buf[9]);
384     RENDERError = (unsigned char) (buf[11]);
385 
386     DefineEValue(&TD[REQUEST], (unsigned long) RENDERRequest, "RenderRequest");
387     DefineEValue(&TD[REPLY], (unsigned long) RENDERRequest, "RenderReply");
388 
389     DefineEValue(&TD[ERROR], (unsigned long) RENDERError + 0, "BadPictFormat");
390     DefineEValue(&TD[ERROR], (unsigned long) RENDERError + 1, "BadPicture");
391     DefineEValue(&TD[ERROR], (unsigned long) RENDERError + 2, "BadPictOp");
392     DefineEValue(&TD[ERROR], (unsigned long) RENDERError + 3, "BadGlyphSet");
393     DefineEValue(&TD[ERROR], (unsigned long) RENDERError + 4, "BadGlyph");
394 
395     p = DefineType(RENDERREQUEST, ENUMERATED, "RENDERREQUEST",
396                    (PrintProcType) PrintENUMERATED);
397     DefineEValue(p, 0L, "RenderQueryVersion");
398     DefineEValue(p, 1L, "RenderQueryPictFormats");
399     DefineEValue(p, 2L, "RenderQueryPictIndexValues");
400     DefineEValue(p, 3L, "RenderQueryDithers");
401     DefineEValue(p, 4L, "RenderCreatePicture");
402     DefineEValue(p, 5L, "RenderChangePicture");
403     DefineEValue(p, 6L, "RenderSetPictureClipRectangles");
404     DefineEValue(p, 7L, "RenderFreePicture");
405     DefineEValue(p, 8L, "RenderComposite");
406     DefineEValue(p, 9L, "RenderScale");
407     DefineEValue(p, 10L, "RenderTrapezoids");
408     DefineEValue(p, 11L, "RenderTriangles");
409     DefineEValue(p, 12L, "RenderTriStrip");
410     DefineEValue(p, 13L, "RenderTriFan");
411     DefineEValue(p, 14L, "RenderColorTrapezoids");
412     DefineEValue(p, 15L, "RenderColorTriangles");
413     DefineEValue(p, 16L, "RenderTransform");
414     DefineEValue(p, 17L, "RenderCreateGlyphSet");
415     DefineEValue(p, 18L, "RenderReferenceGlyphSet");
416     DefineEValue(p, 19L, "RenderFreeGlyphSet");
417     DefineEValue(p, 20L, "RenderAddGlyphs");
418     DefineEValue(p, 21L, "RenderAddGlyphsFromPicture");
419     DefineEValue(p, 22L, "RenderFreeGlyphs");
420     DefineEValue(p, 23L, "RenderCompositeGlyphs8");
421     DefineEValue(p, 24L, "RenderCompositeGlyphs16");
422     DefineEValue(p, 25L, "RenderCompositeGlyphs32");
423     DefineEValue(p, 26L, "RenderFillRectangles");
424     /* Added in 0.5: */
425     DefineEValue(p, 27L, "RenderCreateCursor");
426     /* Added in 0.6: */
427     DefineEValue(p, 28L, "RenderSetPictureTransform");
428     DefineEValue(p, 29L, "RenderQueryFilters");
429     DefineEValue(p, 30L, "RenderSetPictureFilter");
430     /* Added in 0.8: */
431     DefineEValue(p, 31L, "RenderCreateAnimCursor");
432     /* Added in 0.9: */
433     DefineEValue(p, 32L, "RenderAddTraps");
434     /* Added in 0.10: */
435     DefineEValue(p, 33L, "RenderCreateSolidFill");
436     DefineEValue(p, 34L, "RenderCreateLinearGradient");
437     DefineEValue(p, 35L, "RenderCreateRadialGradient");
438     DefineEValue(p, 36L, "RenderCreateConicalGradient");
439     /* no new requests in 0.11 */
440 
441     p = DefineType(RENDERREPLY, ENUMERATED, "RENDERREPLY",
442                    (PrintProcType) PrintENUMERATED);
443     DefineEValue(p, 0L, "QueryVersion");
444     DefineEValue(p, 1L, "QueryPictFormats");
445     DefineEValue(p, 2L, "QueryPictIndexValues");
446     DefineEValue(p, 3L, "QueryDithers");
447     /* Added in 0.6: */
448     DefineEValue(p, 29L, "QueryFilters");
449 
450     DefineType(PICTURE, BUILTIN, "PICTURE", PrintPICTURE);
451     DefineType(PICTFORMAT, BUILTIN, "PICTFORMAT", PrintPICTFORMAT);
452     DefineType(GLYPHSET, BUILTIN, "GLYPHSET", PrintGLYPHSET);
453     DefineType(RENDERCOLOR, BUILTIN, "RENDERCOLOR", PrintRENDERCOLOR);
454     DefineType(PICTFORMINFO, BUILTIN, "PICTFORMINFO", PrintPICTFORMINFO);
455 
456     p = DefineType(PICTURE_BITMASK, SET, "PICTURE_BITMASK",
457                    (PrintProcType) PrintSET);
458 
459     DefineValues(p, 0x00000001L, 1, BOOL, "repeat");
460     DefineValues(p, 0x00000002L, 1, PICTURE, "alpha-map");
461     DefineValues(p, 0x00000004L, 1, INT16, "alpha-x-origin");
462 
463     DefineValues(p, 0x00000008L, 1, INT16, "alpha-y-origin");
464 
465     DefineValues(p, 0x00000010L, 1, INT16, "clip-x-origin");
466 
467     DefineValues(p, 0x00000020L, 1, INT16, "clip-y-origin");
468 
469     DefineValues(p, 0x00000040L, 1, PIXMAP, "clip-mask");
470     DefineValues(p, 0x00000080L, 1, BOOL, "graphics-exposures");
471     DefineValues(p, 0x00000100L, 1, SUBWINMODE, "repeat");
472     DefineValues(p, 0x00000200L, 1, BOOL, "poly-edge");
473     DefineValues(p, 0x00000400L, 1, BOOL, "poly-mode");
474     DefineValues(p, 0x00000800L, 1, ATOM, "dither");
475     DefineValues(p, 0x00001000L, 1, BOOL, "component-alpha");
476 
477     p = DefineType(PICTOP, ENUMERATED, "PICTOP",
478                    (PrintProcType) PrintENUMERATED);
479     DefineEValue(p, 0L, "Clear");
480     DefineEValue(p, 1L, "Src");
481     DefineEValue(p, 2L, "Dst");
482     DefineEValue(p, 3L, "Over");
483     DefineEValue(p, 4L, "OverReverse");
484     DefineEValue(p, 5L, "In");
485     DefineEValue(p, 6L, "InReverse");
486     DefineEValue(p, 7L, "Out");
487     DefineEValue(p, 8L, "OutReverse");
488     DefineEValue(p, 9L, "Atop");
489     DefineEValue(p, 10L, "AtopReverse");
490     DefineEValue(p, 11L, "Xor");
491     DefineEValue(p, 12L, "Add");
492     DefineEValue(p, 13L, "Saturate");
493 
494     /* Operators only available in version 0.2 */
495     DefineEValue(p, 0x10, "PictOpDisjointClear");
496     DefineEValue(p, 0x11, "PictOpDisjointSrc");
497     DefineEValue(p, 0x12, "PictOpDisjointDst");
498     DefineEValue(p, 0x13, "PictOpDisjointOver");
499     DefineEValue(p, 0x14, "PictOpDisjointOverReverse");
500     DefineEValue(p, 0x15, "PictOpDisjointIn");
501     DefineEValue(p, 0x16, "PictOpDisjointInReverse");
502     DefineEValue(p, 0x17, "PictOpDisjointOut");
503     DefineEValue(p, 0x18, "PictOpDisjointOutReverse");
504     DefineEValue(p, 0x19, "PictOpDisjointAtop");
505     DefineEValue(p, 0x1a, "PictOpDisjointAtopReverse");
506     DefineEValue(p, 0x1b, "PictOpDisjointXor");
507 
508     DefineEValue(p, 0x20, "PictOpConjointClear");
509     DefineEValue(p, 0x21, "PictOpConjointSrc");
510     DefineEValue(p, 0x22, "PictOpConjointDst");
511     DefineEValue(p, 0x23, "PictOpConjointOver");
512     DefineEValue(p, 0x24, "PictOpConjointOverReverse");
513     DefineEValue(p, 0x25, "PictOpConjointIn");
514     DefineEValue(p, 0x26, "PictOpConjointInReverse");
515     DefineEValue(p, 0x27, "PictOpConjointOut");
516     DefineEValue(p, 0x28, "PictOpConjointOutReverse");
517     DefineEValue(p, 0x29, "PictOpConjointAtop");
518     DefineEValue(p, 0x2a, "PictOpConjointAtopReverse");
519     DefineEValue(p, 0x2b, "PictOpConjointXor");
520 
521     /* Operators only available in version 0.11 */
522     DefineEValue(p, 0x30, "PictOpMultiply");
523     DefineEValue(p, 0x31, "PictOpScreen");
524     DefineEValue(p, 0x32, "PictOpOverlay");
525     DefineEValue(p, 0x33, "PictOpDarken");
526     DefineEValue(p, 0x34, "PictOpLighten");
527     DefineEValue(p, 0x35, "PictOpColorDodge");
528     DefineEValue(p, 0x36, "PictOpColorBurn");
529     DefineEValue(p, 0x37, "PictOpHardLight");
530     DefineEValue(p, 0x38, "PictOpSoftLight");
531     DefineEValue(p, 0x39, "PictOpDifference");
532     DefineEValue(p, 0x3a, "PictOpExclusion");
533     DefineEValue(p, 0x3b, "PictOpHSLHue");
534     DefineEValue(p, 0x3c, "PictOpHSLSaturation");
535     DefineEValue(p, 0x3d, "PictOpHSLColor");
536     DefineEValue(p, 0x3e, "PictOpHSLLuminosity");
537 
538     DefineType(FIXED, BUILTIN, "FIXED", PrintFIXED);
539     DefineType(POINTFIXED, BUILTIN, "POINTFIXED", PrintPOINTFIXED);
540     DefineType(TRIANGLE, RECORD, "TRIANGLE", PrintTRIANGLE);
541     DefineType(TRAPEZOID, RECORD, "TRAPEZOID", PrintTRAPEZOID);
542     DefineType(FILTERALIAS, BUILTIN, "FILTERALIAS", PrintFILTERALIAS);
543 
544     InitializeCommonRenderTypes();
545 
546     InitializeExtensionDecoder(RENDERRequest, render_decode_req,
547                                render_decode_reply);
548     for (errcode = RENDERError; errcode < (RENDERError + RENDERNError);
549          errcode++) {
550         InitializeExtensionErrorDecoder(errcode, render_decode_error);
551     }
552 }
553 
554 /*
555   Types originally defined by Render but now shared with other extensions
556   which may need to initialize the definitions even if the client hasn't
557   made any Render extension calls
558 */
559 void
InitializeCommonRenderTypes(void)560 InitializeCommonRenderTypes(void)
561 {
562     static Boolean initialized;
563     TYPE p;
564 
565     if (initialized)
566         return;
567     initialized = true;
568 
569     DefineType(RENDERTRANSFORM, BUILTIN, "RENDERTRANSFORM",
570                PrintRENDERTRANSFORM);
571 
572     /* Subpixel orders included in 0.6 */
573     p = DefineType(SUBPIXEL, ENUMERATED, "SUBPIXEL",
574                    (PrintProcType) PrintENUMERATED);
575     DefineEValue(p, 0L, "Unknown");
576     DefineEValue(p, 1L, "SubPixelHorizontalRGB");
577     DefineEValue(p, 2L, "SubPixelHorizontalBGR");
578     DefineEValue(p, 3L, "SubPixelVerticalRGB");
579     DefineEValue(p, 4L, "SubPixelVerticalBGR");
580     DefineEValue(p, 5L, "SubPixelNone");
581 }
582