1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
|
The X Rendering Extension
Version 0.0.15
2000-11-19
Keith Packard
keithp@xfree86.org
1. Introduction
The X Rendering Extension (Render) introduces digital image composition as
the foundation of a new rendering model within the X Window System.
Rendering geometric figures is accomplished by client-side tesselation into
either triangles or trapezoids. Text is drawn by loading glyphs into the
server and rendering sets of them.
2. Acknowledgments
This extension was the work of many people, in particular:
+ Thomas Porter and Tom Duff for their formal description
of image compositing.
+ Rob Pike and Russ Cox who designed the Plan 9 window system from
which the compositing model was lifted.
+ Juliusz Chroboczek and Raph Levien whose proposal for client-side
glyph management eliminated font handling from the X server.
+ Jon Leech, Brad Grantham and Allen Akin for patiently explaining
how OpenGL works.
3. Rendering Model
Render provides a single rendering operation which can be used in a variety of
ways to generate images:
dest = (source IN mask) OP dest
Where 'IN' is the Porter/Duff operator of that name and 'OP' is any of the
list of compositing operators described below, among which can be found all
of the Porter/Duff binary operators.
To use this operator several additional values are required:
+ The destination rectangle. This is a subset of the destination
within which the rendering is performed.
+ The source location. This identifies the coordinate in the
source aligned with the upper left corner of the
destination rectangle.
+ The mask location. This identifies the coordinate in the
mask aligned with the upper left corner of the
destination rectangle.
+ A clip list. This limits the rendering to the intersection of the
destination rectangle with this clip list.
+ The OP to use
+ Whether the source should be repeated to cover the destination
rectangle or whether rendering should be clipped by the source
+ Whether the mask should be repeated to cover the destination
rectangle or whether rendering should be clipped by the mask
+ Whether the mask has a single alpha value for all four channels or
whether each mask channel should affect the associated source/dest
channels.
These parameters are variously attached to the operands or included in each
rendering request.
4. Data types
The core protocol rendering system uses a pixel model and applies color only
in the final generation of the video signal. A compositing model operates
on colors, not pixel values so a new datatype is needed to interpret data as
color instead of just bits.
The "PictFormat" object holds information needed to translate pixel values
into red, green, blue and alpha channels. The server has a list of picture
formats corresponding to the various visuals on the screen. There are two
classes of formats, Indexed and Direct. Indexed PictFormats hold a list of
pixel values and RGBA values while Direct PictFormats hold bit masks for each
of R, G, B and A.
The "Picture" object contains a Drawable, a PictFormat and some
rendering state. More than one Picture can refer to the same Drawable.
5. Errors
Errors are sent using core X error reports.
PictFormat
A value for a PICTFORMAT argument does not name a defined PICTFORMAT.
Picture
A value for a PICTURE argument does not name a defined PICTURE.
PictOp
A value for a PICTOP argument does not name a defined PICTOP.
GlyphSet
A value for a GLYPHSET argument does not name a defined GLYPHSET.
Glyph
A value for a GLYPH argument does not name a defined GLYPH in the
glyphset.
6. Protocol Types
PICTURE 32-bit value (top three bits guaranteed to be zero)
PICTFORMAT 32-bit value (top three bits guaranteed to be zero)
PICTTYPE { Indexed, Direct }
PICTOP { Clear, Src, Dst, Over, OverReverse, In, InReverse,
Out, OutReverse, Atop, AtopReverse, Xor, Add, Saturate }
COLOR [
red, green, blue, alpha: CARD16
]
CHANNELMASK [
shift, mask: CARD16
]
DIRECTFORMAT [
red, green, blue, alpha: CHANNELMASK
]
INDEXVALUE [
pixel: Pixel;
red, green, blue, alpha: CARD16
]
PICTFORMINFO [
id: PICTFORMAT
type: PICTTYPE
depth: CARD8
direct: DIRECTFORMAT
colormap: COLORMAP or None
]
PICTVISUAL [
visual: VISUALID or None
format: PICTFORMAT
]
PICTDEPTH [
depth: CARD8
visuals: LISTofPICTVISUAL
]
PICTSCREEN LISTofPICTDEPTH
DITHERINFO [
name: ATOM
format: PICTFORMAT
width: CARD16
height: CARD16
]
FIXED 32-bit value (top 24 are integer portion, bottom 8 are fraction)
POINTFIX [
x, y: FIXED
]
POLYEDGE { Sharp, Smooth }
POLYMODE { Precise, Imprecise }
COLORPOINT [
point: POINTFIX
color: COLOR
]
SPANFIX [
left, right, y: FIXED
]
COLORSPANFIX [
left, right, y: FIXED
left_color: COLOR
right_color: COLOR
QUAD [
p1, p2, p3, p4: POINTFIX
]
TRIANGLE [
p1, p2, p3: POINTFIX
]
TRAP [
top, bottom: SPANFIX
]
COLORTRIANGLE [
p1, p2, p3: COLORPOINT
]
COLORTRAP [
top, bottom: COLORSPANFIX
]
GLYPHSET 32-bit value (top three bits guaranteed to be zero)
GLYPH 32-bit value
GLYPHINFO [
width, height: CARD16
x, y: INT16
off-x, off-y: INT16
]
PICTGLYPH [
info: GLYPHINFO
x, y: INT16
]
GLYPHABLE GLYPHSET or FONTABLE
GLYPHELT8 [
dx, dy: INT16
glyphs: LISTofCARD8
]
GLYPHITEM8 GLYPHELT8 or GLYPHABLE
GLYPHELT16 [
dx, dy: INT16
glyphs: LISTofCARD16
]
GLYPHITEM16 GLYPHELT16 or GLYPHABLE
GLYPHELT32 [
dx, dy: INT16
glyphs: LISTofCARD32
]
GLYPHITEM32 GLYPHELT32 or GLYPHABLE
7. Standard PictFormats
The server must support a Direct PictFormat with 8 bits each of red, green,
blue and alpha as well as a Direct PictFormat with 8 bits of red, green and
blue and 0 bits of alpha. The server must also support Direct PictFormats
with 1, 4 and 8 bits of alpha and 0 bits of r, g and b.
Pixel component values lie in the close range [0,1]. These values are
encoded in a varying number of bits. Values are encoded in a straight
forward manner. For a component encoded in m bits, a binary encoding b
is equal to a component value of b/(2^m-1).
A Direct PictFormat with zero bits of alpha component is declared to have
alpha == 1 everywhere. A Direct PictFormat with zero bits of red, green and
blue is declared to have red, green, blue == 0 everywhere. If any of red,
green or blue components are of zero size, all are of zero size. Direct
PictFormats never have colormaps and are therefore screen independent.
Indexed PictFormats never have alpha channels and the direct component is all
zeros. Indexed PictFormats always have a colormap in which the specified
colors are allocated read-only and are therefore screen dependent.
8. Compositing Operators
For each pixel, the four channels of the image are computed with:
C = Ca * Fa + Cb * Fb
where C, Ca, Cb are the values of the respective channels and Fa and Fb
come from the following table:
PictOp Fa Fb
------------------------------------------
Clear 0 0
Src 1 0
Dst 0 1
Over 1 1-Aa
OverReverse 1-Ab 1
In Ab 0
InReverse 0 Aa
Out 1-Ab 0
OutReverse 0 1-Aa
Atop Ab 1-Aa
AtopReverse 1-Ab Aa
Xor 1-Ab 1-Aa
Add 1 1
Saturate min(1,(1-Ab)/Aa) 1
---
Saturate matches GL with FUNC_ADD, SRC_ALPHA_SATURATE, ONE, except
that it uses premultiplied alphas while GL uses non-premultiplied alphas.
Remember the idea is to apply (src In mask) Saturate Dst so that
computing (src In mask) effectively applies alpha values of 'mask' to
src; the server could 'short circuit' that computation by only multiplying
the alpha channel and then applying the regular GL SRC_ALPHA_SATURATE
operator.
---
The result of any compositing operator is always limited to the range
[0,1] for each component. Components whose value would be greater than 1
are set to 1.
When the mask contains separate alpha values for each channel, the
alpha value resulting from the combination of that value with the source
alpha channel is used in the final image composition.
9. Polygon Rasterization
All polygons must be convex. Rendering of concave polygons is unspecified
except that the result must obey the clipping rules.
Each polygon request fills the region closed by the specified path. The
path is automatically closed if the last point does not coincide with the
first point.
A point is infinitely small and the path is an infinitely thin line. A
pixel is inside if the center point of the pixel is inside and the center
point is not on the boundary. If the center point is on the boundary, the
pixel is inside if and only if the polygon interior is immediately to its
right (x increasing direction). Pixels with centers along a horizontal edge
are a special case and are inside if and only if the polygon interior is
immediately below (y increasing direction). A polygon contains a pixel if
the pixel is inside the polygon.
Polygons are rasterized by implicit generating an alpha mask and using that
in the general compositing operator along with a supplied source image:
tmp = Rasterize (polygon)
Composite (op, dst, src, tmp)
When rasterized with Sharp edges, the mask is generated by setting pixels
inside the polygon to 1 and pixels outside the mask to 0.
When rasterized with Smooth edges, the mask is generated by creating a square
around each pixel coordinate and computing the amount of that square covered
by the polygon. Yes, this ignores sampling theory but it provides a precise
definition which is close to the right answer. This value is truncated to
the alpha width in the fallback format before application of the compositing
operator.
When rasterized in Precise mode, the pixelization will match this
specification exactly.
When rasterized in Imprecise mode, the pixelization may deviate from this
specification by up to 1/2 pixel along any edge subject to the following
constraints:
+ Abutting edges must match precisely. When specifying two polygons
abutting along a common edge, if that edge is specified with the
same coordinates in each polygon then the sum of alpha values for
pixels inside the union of the two polygons must be precisely one.
+ Translationally invarient. The pixelization of the polygon must
be the same when either the polygon or the target drawable
are translated by any whole number of pixels in any direction.
+ Sharp edges are honored. When the polygon is rasterized with Sharp
edges, the implicit alpha mask will contain only 1 or 0 for
each pixel.
+ Order independent. Two identical polygons specified with vertices
in different orders must generate identical results.
Polygons can also be specified with colors for each vertex. These color
values are interpolated along the edges and across each scanline.
When rasterized in Precise mode, the interpolated colors are exact.
When rasterized in Imprecise mode, the color of each pixel may optionally be
interpolated from a triangle containing the pixel which is formed from any
three polygon vertices. Any interpolated color value can err up to 1 lsb in
each channel.
10. Glyph Rendering
Glyphs are small alpha masks which can be stored in the X server and
rendered by referring to them by name. A set of glyphs can be rendered in a
single request. Glyphs are positioned by subtracting the x, y elements of
the GLYPHINFO from the requested rendering position. The next glyph
rendering position is set to the current rendering position plus the off-x
and off-y elements.
Glyphs are stored in GlyphSets and are named within the GlyphSet with
client-specified 32-bit numbers.
Glyphs can be stored in any PictFormat supported by the server. All glyphs
in a GlyphSet are stored in the same format.
11. Dithering
Each screen supports a list of dithers. There are several standard dithers
with defined pixelization, the server is free to offer others as well. The
width and height of the dither are a hint about the size of the matrix used
if the dither is ordered. An unordered dither will have zero in these
fields.
The standard dithers are:
"Standard2x2"
"Standard4x4"
"Standard128x128"
---
Need a notation for specifying pixelization of dithers.
---
12. Extension Initialization
The client must negotiate the version of the extension before executing
extension requests. Behavior of the server is undefined otherwise.
QueryVersion
client-major-version: CARD32
client-minor-version: CARD32
->
major-version: CARD32
minor-version: CARD32
The client sends the highest supported version to the server and
the server sends the highest version it supports, but no higher than
the requested version. Major versions changes can introduce
incompatibilities in existing functionality, minor version
changes introduce only backward compatible changes. It is
the clients responsibility to ensure that the server supports
a version which is compatible with its expectations.
QueryPictFormats
->
fallback: PICTFORMAT
formats: LISTofPICTFORMINFO
screens: LISTofPICTSCREEN
The server responds with a list of supported PictFormats and
a list of which PictFormat goes with each visual on each screen.
Every PictFormat must match a supported depth, but not every
PictFormat need have a matching visual.
The fallback format is used as an intermediate representation
in cases where there is no ideal choice.
QueryPictIndexValues
format: PICTFORMAT
->
values: LISTofINDEXVALUE
Errors:
PictFormat, Match
Returns the mapping from pixel values to RGBA values for the
specified Indexed PictFormat. If 'format' does not refer to
an Indexed PictFormat a Match error is generated.
QueryDithers
drawable: DRAWABLE
->
dithers: LISTofDITHERINFO
Returns all of the supported dithers on the screen specified by
drawable.
13. Extension Requests
CreatePicture
pid: PICTURE
drawable: DRAWABLE
format: PICTFORMAT
value-mask: BITMASK
value-list: LISTofVALUE
Errors:
Alloc, Drawable, IDChoice, Match, Pixmap, Picture,
PictFormat, Value
This request creates a Picture object associated with the specified
drawable and assigns the identifier pid to it. Pixel data in the
image are interpreted according to 'format'. It is a Match error
to specify a format with a different depth than the drawable. If
the drawable is a Window then the Red, Green and Blue masks must
match those in the visual for the window else a Match error is
generated.
The value-mask and value-list specify attributes of the picture that
are to be explicitly initialized. The possible values are:
repeat: BOOL
alpha-map: PICTURE or None
alpha-x-origin: INT16
alpha-y-origin: INT16
clip-x-origin: INT16
clip-y-origin: INT16
clip-mask: PIXMAP or None
graphics-exposures: BOOL
subwindow-mode: { ClipByChildren, IncludeInferiors }
poly-edge: POLYEDGE
poly-mode: POLYMODE
dither: ATOM or None
component-alpha: BOOL
The repeat value controls whether the image is replicated
when used as the source or mask in a rendering operation. When
True, the contents are tiled over the destination instead of clipping
to the geometry of the drawable.
The alpha channel of alpha-map is used in place of any alpha channel
contained within the drawable for all rendering operations. The
alpha-mask origin is interpreted relative to the origin of drawable.
Rendering is additionally clipped by the geometry of alpha-map.
Exposures to the window do not affect the contents of alpha-map.
Alpha-map must refer to a picture containing a Pixmap, not a Window
(or a Match error results).
The clip-mask restricts reads and writes to drawable. Only pixels
where the clip-mask has bits set to 1 are read or written. Pixels
are not accessed outside the area covered by the clip-mask or where
the clip-mask has bits set to 0. The clip-mask affects all graphics
requests, including sources. The clip-mask origin is interpreted
relative to the origin of drawable. If a pixmap is specified as the
clip-mask, it must have depth 1 and have the same root as the
drawable (or a Match error results). If clip-mask is None, then
pixels are always drawn, regardless of the clip origin. The
clip-mask can also be set with the SetPictureClipRectangles request.
For ClipByChildren, both source and destination windows are
additionally clipped by all viewable InputOutput children. For
IncludeInferiors , neither source nor destination window is clipped
by inferiors. This will result in including subwindow contents in
the source and drawing through subwindow boundaries of the
destination. The use of IncludeInferiors with a source or
destination window of one depth with mapped inferiors of differing
depth is not illegal, but the semantics are undefined by this
extension.
The graphics-exposures flag controls GraphicsExposure event
generation for Composite and Transform requests (and any similar
requests defined by additional extensions).
Poly-edge and poly-mode control the rasterization of polygons
as described above.
Dither selects which of the available dither patterns should
be used. If dither is None, no dithering will be done.
Component-alpha indicates whether each image component is
intended as a separate alpha value when the picture is used
as a mask operand.
The default component values are
Component Default
-------------------------------
op Over
repeat False
clip-x-origin 0
clip-y-origin 0
clip-mask None
graphics-exposures True
subwindow-mode ClipByChildren
poly-edge Smooth
poly-mode Precise
dither None
component-alpha False
ChangePicture
pid: PICTURE
value-mask: BITMASK
value-list: LISTofVALUE
Errors:
Picture, Alloc, Pixmap, PictOp, Value
The value-mask and value-list specify which attributes are to be
changed. The values and restrictions are the same as for
CreatePicture.
SetPictureClipRectangles
picture: PICTURE
clip-x-origin: INT16
clip-y-origin: INT16
rectangles: LISTofRECTANGLE
Errors:
Alloc, Picture
This request changes clip-mask in picture to the specified list of
rectangles and sets the clip origin. Input and output will be
clipped to remain contained within the rectangles. The clip origin
is interpreted relative to the origin of the drawable associated
with picture. The rectangle coordinates are interpreted relative to
the clip origin. Note that the list of rectangles can be empty,
which effectively disables output. This is the opposite of passing
None as the clip-mask in CreatePicture and ChangePicture.
Note that output is clipped to the union of all of the rectangles
and that no particular ordering among the rectangles is required.
FreePicture
pid: PICTURE
Errors:
Picture
This request deletes the association between the resource ID and the
picture and destroys the picture.
Composite
op: PICTOP
src: PICTURE
mask: PICTURE or None
dst: PICTURE
src-x, src-y: INT16
mask-x, mask-y: INT16
dst-x, dst-y: INT16
width, height: CARD16
This request combines the specified rectangle of src and mask with
the specified rectangle of dst using op as the compositing
operator. The coordinates are relative their respective drawable's
origin. Rendering is clipped to the geometry of the dst drawable
and then to the dst clip-list, the src clip-list and the mask
clip-list.
If the specified rectangle extends beyond src, then if src has
the repeat attribute set, the src picture will be tiled to
fill the specified rectangle, otherwise rendering is clipped to
the src geometry.
If the specified rectangle extends beyond mask, then if mask has
the repeat attribute set, the mask picture will be tiled to
fill the specified rectangle, otherwise rendering is clipped to
the mask geometry.
If src, mask and dst are not in the same format, and one of their
formats can hold all without loss of precision, they are converted
to that format. Alternatively, the server will convert each
operand to the fallback format.
If mask is None, it is replaced by a constant alpha value of 1.
When dst has clip-notify set, a NoExpose event is sent if the
rendering operation was not clipped by either src or mask, otherwise
a sequence of GraphicsExpose events are sent covering areas in dst
where rendering was clipped by src or mask.
Scale
color-scale: CARD32
alpha-scale: CARD32
src: PICTURE
dst: PICTURE
src-x, src-y: INT16
dst-x, dst-y: INT16
width, height: CARD16
This request replaces the specified rectangle in dst with
the specified rectangle of src with the components multiplied
in the following fashion:
dst-red = src-red * color-scale / 65536
dst-green = src-green * color-scale / 65536
dst-blue = src-blue * color-scale / 65536
dst-alpha = src-alpha * alpha-scale / 65536
The coordinates are relative their respective drawable's
origin. Rendering is clipped to the geometry of the dst drawable
and then to the dst clip-list, the src clip-list and the mask
clip-list.
If the specified rectangle extends beyond src, then if src has
the repeat attribute set, the src picture will be tiled to
fill the specified rectangle, otherwise rendering is clipped to
the src geometry.
FillRectangles
op: PICTOP
dst: PICTURE
color: COLOR
rects: LISTofRECTANGLE
This request combines color with the destination drawable in the
area specified by rects. Each rectangle is combined separately;
overlapping areas will be rendered multiple times. The effect is
equivalent to compositing with a repeating source picture filled with
the specified color.
Trapezoids
op: PICTOP
src: PICTURE
src-x, src-y: INT16
dst: PICTURE
traps: LISTofTRAP
This request rasterizes the list of trapezoids. For each span, the
left coordinate must be less than or equal to the right coordinate.
The y coordinate of the top span must be less than or equal to the
y coordinate of the bottom span. Results are undefined otherwise.
Triangles
op: PICTOP
src: PICTURE
src-x, src-y: INT16
dst: PICTURE
traps: LISTofTRIANGLE
This request rasterizes the list of triangles in the order they
occur in the list.
TriStrip
op: PICTOP
src: PICTURE
src-x, src-y: INT16
dst: PICTURE
points: LISTofPOINTFIX
Triangles are formed by initially using the first three points and
then by eliminating the first point and appending the next point in
the list. If fewer than three points are provided, this request does
nothing.
TriFan
op: PICTOP
src: PICTURE
src-x, src-y: INT16
dst: PICTURE
points: LISTofPOINTFIX
Triangles are formed by initially using the first three points and
then by eliminating the second point and appending the next point
int the list. If fewer than three points are provided, this request
does nothing.
???
Should I bother with these two compressed triangle representations?
???
ColorTrapezoids
op: PICTOP
dst: PICTURE
triangles: LISTofCOLORTRAP
The geometry of the trapezoids must meet the same requirements as
for the Trapezoids request. The trapezoids are filled in the order
they occur in the list.
ColorTriangles
op: PICTOP
dst: PICTURE
triangles: LISTofCOLORTRIANGLE
The colored triangles are rasterized in the order they occur in the
list.
???
Should I included compressed triangle representations here?
???
Transform
op: PICTOP
src: PICTURE
dst: PICTURE
src-quad: QUAD
dst-quad: QUAD
filter: { Nearest, ... }
Errors:
Picture, Value
This request combines the specified quadrilateral of src with the
specified quadrilateral of dst using op as the compositing operator.
The coordinates are relative their respective drawable's origin.
Rendering is clipped to the geometry of the dst drawable and then to
the dst clip-list and the src clip-list.
If the specified rectangle extends beyond src, then if src has
the repeat attribute set, the src picture will be tiled to
fill the specified rectangle, otherwise rendering is clipped to
the src geometry.
If the specified rectangle extends beyond mask, then if mask has
the repeat attribute set, the mask picture will be tiled to
fill the specified rectangle, otherwise rendering is clipped to
the mask geometry.
The effect of this request is:
tmp_image = affine-transform (src, src-quad * dst-quad)
tmp_mask = render (dst-quad)
Composite (op, dst, tmp_image, tmp_mask)
That is, the entire transformed source image is masked by an
image of the destination quadrilateral and rendered using the Composite
operator.
If the specified quadrilateral extends beyond src, then if src has
the repeat attribute set, the src picture will be tiled to
fill the specified rectangle, otherwise rendering is clipped to
the src geometry.
It is a Value error to specify a self intersecting quadrilateral for
either src-quad or dst-quad.
If src and dst are not in the same format, and one of their formats
can hold both without loss of precision, they are converted to that
format. Alternatively, the server will convert each operand to the
fallback format.
The compositing operator from the src picture is used to merge the
images together.
If filter is Nearest, then the nearest (converted) pixel values to
each destination pixel is used without averaging.
When dst has clip-notify set, a NoExpose event is sent if the
rendering operation was not clipped by src, otherwise a sequence of
GraphicsExpose events are sent covering areas in dst where rendering
was clipped by src.
???
What (small) set of filters should be included
???
---
Need to describe in more detail the semantics here
Looks like the geometric extension needs to be tied to the
compositing extension (sigh).
---
CreateGlyphSet
gsid: GLYPHSET
format: PICTFORMAT
Errors:
Alloc, IDChoice, PictFormat, Match
This request creates a container for glyphs. The glyphset and
all contained glyphs are destroyed when gsid and any other names
for the glyphset are freed. Format must be a Direct format, when
it contains RGB values, the glyphs are composited using
component-alpha True, otherwise they are composited using
component-alpha False.
ReferenceGlyphSet
gsid: GLYPHSET
existing: GLYPHSET
Errors:
Alloc, IDChoice, GlyphSet
This request creates an additional name for the existing glyphset.
The glyphset will not be freed until all references to it are
destroyed.
FreeGlyphSet
glyphset: GLYPHSET
Errors:
GlyphSet
This request frees the name for the glyphset. When all names have
been freed, the glyphset and all contained glyphs are freed.
AddGlyphs
glyphset: GLYPHSET
glyphids: LISTofCARD32
glyphs: LISTofGLYPHINFO
data: LISTofBYTE
Errors:
GlyphSet, Alloc
This request adds glyphs to glyphset. The image for the glyphs
are stored with each glyph in a separate Z-format image padded to a
32-bit boundary. Existing glyphs with the same names are replaced.
AddGlyphsFromPicture
glyphset: GLYPHSET
src: PICTURE
glyphs: LISTofPICTGLYPH
Errors:
GlyphSet, Alloc
This request adds glyphs to glyphset by copying them from src from
the locations included in glyphs. Existing glyphs with the same
names are replaced. Src may be in a different PictFormat than
glyphset, in which case the images are converted to the glyphset
format.
FreeGlyphs
glyphset: GLYPHSET
glyphs: LISTofGLYPH
Errors:
GlyphSet, Match
This request removes glyphs from glyphset. Each glyph must exist
in glyphset (else a Match error results).
CompositeGlyphs8
CompositeGlyphs16
CompositeGlyphs32
op: PICTOP
src: PICTURE
dst: PICTURE
mask-format: PICTFORMAT or None
glyphset: GLYPHABLE
src-x, src-y: INT16
dst-x, dst-y: INT16
glyphcmds: LISTofGLYPHITEM8 CompositeGlyphs8
glyphcmds: LISTofGLYPHITEM16 CompositeGlyphs16
glyphcmds: LISTofGLYPHITEM32 CompositeGlyphs32
Errors:
Picture, PictOp, PictFormat, GlyphSet, Glyph
The dst-x and dst-y coordinates are relative to the drawable's
origin and specify the baseline starting position (the initial glyph
origin). Each glyph item is processed in turn. A glyphset item
causes the glyhpset to be used for subsequent glyphs. Switching
among glyphsets does not affect the next glyph origin. A glyph
element delta-x and delta-y specify additional changes in the
position along the x and y axes before the string is drawn; the
deltas are always added to the glyph origin.
All contained GLYPHSETs are always transmitted most significant byte
first.
If a GlyphSet error is generated for an item, the previous items may
have been drawn.
When mask-format is not None, glyphs are rendered in the following
way with the effective mask computed in mask-format:
tmp = temporary alpha picture
Combine (Zero, tmp, tmp, None)
for each glyph
Combine (Add, tmp, glyph, None)
Combine (op, dst, source, tmp)
When mask-format is None, glyphs are rendered in the order specified
directly to the destination:
for each glyph
Combine (op, dst, source, glyph)
|