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