picturestr.h revision 35c4bbdf
1/*
2 * Copyright © 2000 SuSE, Inc.
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of SuSE not be used in advertising or
9 * publicity pertaining to distribution of the software without specific,
10 * written prior permission.  SuSE makes no representations about the
11 * suitability of this software for any purpose.  It is provided "as is"
12 * without express or implied warranty.
13 *
14 * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE
16 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
18 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
19 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 *
21 * Author:  Keith Packard, SuSE, Inc.
22 */
23
24#ifndef _PICTURESTR_H_
25#define _PICTURESTR_H_
26
27#include "scrnintstr.h"
28#include "glyphstr.h"
29#include "resource.h"
30#include "privates.h"
31
32typedef struct _DirectFormat {
33    CARD16 red, redMask;
34    CARD16 green, greenMask;
35    CARD16 blue, blueMask;
36    CARD16 alpha, alphaMask;
37} DirectFormatRec;
38
39typedef struct _IndexFormat {
40    VisualID vid;
41    ColormapPtr pColormap;
42    int nvalues;
43    xIndexValue *pValues;
44    void *devPrivate;
45} IndexFormatRec;
46
47typedef struct _PictFormat {
48    CARD32 id;
49    CARD32 format;              /* except bpp */
50    unsigned char type;
51    unsigned char depth;
52    DirectFormatRec direct;
53    IndexFormatRec index;
54} PictFormatRec;
55
56typedef struct pixman_vector PictVector, *PictVectorPtr;
57typedef struct pixman_transform PictTransform, *PictTransformPtr;
58
59#define pict_f_vector pixman_f_vector
60#define pict_f_transform pixman_f_transform
61
62#define PICT_GRADIENT_STOPTABLE_SIZE 1024
63#define SourcePictTypeSolidFill 0
64#define SourcePictTypeLinear 1
65#define SourcePictTypeRadial 2
66#define SourcePictTypeConical 3
67
68typedef struct _PictSolidFill {
69    unsigned int type;
70    CARD32 color;
71} PictSolidFill, *PictSolidFillPtr;
72
73typedef struct _PictGradientStop {
74    xFixed x;
75    xRenderColor color;
76} PictGradientStop, *PictGradientStopPtr;
77
78typedef struct _PictGradient {
79    unsigned int type;
80    int nstops;
81    PictGradientStopPtr stops;
82} PictGradient, *PictGradientPtr;
83
84typedef struct _PictLinearGradient {
85    unsigned int type;
86    int nstops;
87    PictGradientStopPtr stops;
88    xPointFixed p1;
89    xPointFixed p2;
90} PictLinearGradient, *PictLinearGradientPtr;
91
92typedef struct _PictCircle {
93    xFixed x;
94    xFixed y;
95    xFixed radius;
96} PictCircle, *PictCirclePtr;
97
98typedef struct _PictRadialGradient {
99    unsigned int type;
100    int nstops;
101    PictGradientStopPtr stops;
102    PictCircle c1;
103    PictCircle c2;
104} PictRadialGradient, *PictRadialGradientPtr;
105
106typedef struct _PictConicalGradient {
107    unsigned int type;
108    int nstops;
109    PictGradientStopPtr stops;
110    xPointFixed center;
111    xFixed angle;
112} PictConicalGradient, *PictConicalGradientPtr;
113
114typedef union _SourcePict {
115    unsigned int type;
116    PictSolidFill solidFill;
117    PictGradient gradient;
118    PictLinearGradient linear;
119    PictRadialGradient radial;
120    PictConicalGradient conical;
121} SourcePict, *SourcePictPtr;
122
123typedef struct _Picture {
124    DrawablePtr pDrawable;
125    PictFormatPtr pFormat;
126    PictFormatShort format;     /* PICT_FORMAT */
127    int refcnt;
128    CARD32 id;
129    unsigned int repeat:1;
130    unsigned int graphicsExposures:1;
131    unsigned int subWindowMode:1;
132    unsigned int polyEdge:1;
133    unsigned int polyMode:1;
134    unsigned int freeCompClip:1;
135    unsigned int componentAlpha:1;
136    unsigned int repeatType:2;
137    unsigned int filter:3;
138    unsigned int stateChanges:CPLastBit;
139    unsigned int unused:18 - CPLastBit;
140
141    PicturePtr pNext;           /* chain on same drawable */
142
143    PicturePtr alphaMap;
144    DDXPointRec alphaOrigin;
145
146    DDXPointRec clipOrigin;
147    RegionPtr clientClip;
148
149    unsigned long serialNumber;
150
151    RegionPtr pCompositeClip;
152
153    PrivateRec *devPrivates;
154
155    PictTransform *transform;
156
157    SourcePictPtr pSourcePict;
158    xFixed *filter_params;
159    int filter_nparams;
160} PictureRec;
161
162typedef Bool (*PictFilterValidateParamsProcPtr) (ScreenPtr pScreen, int id,
163                                                 xFixed * params, int nparams,
164                                                 int *width, int *height);
165typedef struct {
166    char *name;
167    int id;
168    PictFilterValidateParamsProcPtr ValidateParams;
169    int width, height;
170} PictFilterRec, *PictFilterPtr;
171
172#define PictFilterNearest	0
173#define PictFilterBilinear	1
174
175#define PictFilterFast		2
176#define PictFilterGood		3
177#define PictFilterBest		4
178
179#define PictFilterConvolution	5
180/* if you add an 8th filter, expand the filter bitfield above */
181
182typedef struct {
183    char *alias;
184    int alias_id;
185    int filter_id;
186} PictFilterAliasRec, *PictFilterAliasPtr;
187
188typedef int (*CreatePictureProcPtr) (PicturePtr pPicture);
189typedef void (*DestroyPictureProcPtr) (PicturePtr pPicture);
190typedef int (*ChangePictureClipProcPtr) (PicturePtr pPicture,
191                                         int clipType, void *value, int n);
192typedef void (*DestroyPictureClipProcPtr) (PicturePtr pPicture);
193
194typedef int (*ChangePictureTransformProcPtr) (PicturePtr pPicture,
195                                              PictTransform * transform);
196
197typedef int (*ChangePictureFilterProcPtr) (PicturePtr pPicture,
198                                           int filter,
199                                           xFixed * params, int nparams);
200
201typedef void (*DestroyPictureFilterProcPtr) (PicturePtr pPicture);
202
203typedef void (*ChangePictureProcPtr) (PicturePtr pPicture, Mask mask);
204typedef void (*ValidatePictureProcPtr) (PicturePtr pPicture, Mask mask);
205typedef void (*CompositeProcPtr) (CARD8 op,
206                                  PicturePtr pSrc,
207                                  PicturePtr pMask,
208                                  PicturePtr pDst,
209                                  INT16 xSrc,
210                                  INT16 ySrc,
211                                  INT16 xMask,
212                                  INT16 yMask,
213                                  INT16 xDst,
214                                  INT16 yDst, CARD16 width, CARD16 height);
215
216typedef void (*GlyphsProcPtr) (CARD8 op,
217                               PicturePtr pSrc,
218                               PicturePtr pDst,
219                               PictFormatPtr maskFormat,
220                               INT16 xSrc,
221                               INT16 ySrc,
222                               int nlists,
223                               GlyphListPtr lists, GlyphPtr * glyphs);
224
225typedef void (*CompositeRectsProcPtr) (CARD8 op,
226                                       PicturePtr pDst,
227                                       xRenderColor * color,
228                                       int nRect, xRectangle *rects);
229
230typedef void (*RasterizeTrapezoidProcPtr) (PicturePtr pMask,
231                                           xTrapezoid * trap,
232                                           int x_off, int y_off);
233
234typedef void (*TrapezoidsProcPtr) (CARD8 op,
235                                   PicturePtr pSrc,
236                                   PicturePtr pDst,
237                                   PictFormatPtr maskFormat,
238                                   INT16 xSrc,
239                                   INT16 ySrc, int ntrap, xTrapezoid * traps);
240
241typedef void (*TrianglesProcPtr) (CARD8 op,
242                                  PicturePtr pSrc,
243                                  PicturePtr pDst,
244                                  PictFormatPtr maskFormat,
245                                  INT16 xSrc,
246                                  INT16 ySrc, int ntri, xTriangle * tris);
247
248typedef void (*TriStripProcPtr) (CARD8 op,
249                                 PicturePtr pSrc,
250                                 PicturePtr pDst,
251                                 PictFormatPtr maskFormat,
252                                 INT16 xSrc,
253                                 INT16 ySrc, int npoint, xPointFixed * points);
254
255typedef void (*TriFanProcPtr) (CARD8 op,
256                               PicturePtr pSrc,
257                               PicturePtr pDst,
258                               PictFormatPtr maskFormat,
259                               INT16 xSrc,
260                               INT16 ySrc, int npoint, xPointFixed * points);
261
262typedef Bool (*InitIndexedProcPtr) (ScreenPtr pScreen, PictFormatPtr pFormat);
263
264typedef void (*CloseIndexedProcPtr) (ScreenPtr pScreen, PictFormatPtr pFormat);
265
266typedef void (*UpdateIndexedProcPtr) (ScreenPtr pScreen,
267                                      PictFormatPtr pFormat,
268                                      int ndef, xColorItem * pdef);
269
270typedef void (*AddTrapsProcPtr) (PicturePtr pPicture,
271                                 INT16 xOff,
272                                 INT16 yOff, int ntrap, xTrap * traps);
273
274typedef void (*AddTrianglesProcPtr) (PicturePtr pPicture,
275                                     INT16 xOff,
276                                     INT16 yOff, int ntri, xTriangle * tris);
277
278typedef Bool (*RealizeGlyphProcPtr) (ScreenPtr pScreen, GlyphPtr glyph);
279
280typedef void (*UnrealizeGlyphProcPtr) (ScreenPtr pScreen, GlyphPtr glyph);
281
282typedef struct _PictureScreen {
283    PictFormatPtr formats;
284    PictFormatPtr fallback;
285    int nformats;
286
287    CreatePictureProcPtr CreatePicture;
288    DestroyPictureProcPtr DestroyPicture;
289    ChangePictureClipProcPtr ChangePictureClip;
290    DestroyPictureClipProcPtr DestroyPictureClip;
291
292    ChangePictureProcPtr ChangePicture;
293    ValidatePictureProcPtr ValidatePicture;
294
295    CompositeProcPtr Composite;
296    GlyphsProcPtr Glyphs;       /* unused */
297    CompositeRectsProcPtr CompositeRects;
298
299    DestroyWindowProcPtr DestroyWindow;
300    CloseScreenProcPtr CloseScreen;
301
302    StoreColorsProcPtr StoreColors;
303
304    InitIndexedProcPtr InitIndexed;
305    CloseIndexedProcPtr CloseIndexed;
306    UpdateIndexedProcPtr UpdateIndexed;
307
308    int subpixel;
309
310    PictFilterPtr filters;
311    int nfilters;
312    PictFilterAliasPtr filterAliases;
313    int nfilterAliases;
314
315    /**
316     * Called immediately after a picture's transform is changed through the
317     * SetPictureTransform request.  Not called for source-only pictures.
318     */
319    ChangePictureTransformProcPtr ChangePictureTransform;
320
321    /**
322     * Called immediately after a picture's transform is changed through the
323     * SetPictureFilter request.  Not called for source-only pictures.
324     */
325    ChangePictureFilterProcPtr ChangePictureFilter;
326
327    DestroyPictureFilterProcPtr DestroyPictureFilter;
328
329    TrapezoidsProcPtr Trapezoids;
330    TrianglesProcPtr Triangles;
331
332    RasterizeTrapezoidProcPtr RasterizeTrapezoid;
333
334    AddTrianglesProcPtr AddTriangles;
335
336    AddTrapsProcPtr AddTraps;
337
338    RealizeGlyphProcPtr RealizeGlyph;
339    UnrealizeGlyphProcPtr UnrealizeGlyph;
340
341#define PICTURE_SCREEN_VERSION 2
342    TriStripProcPtr TriStrip;
343    TriFanProcPtr TriFan;
344} PictureScreenRec, *PictureScreenPtr;
345
346extern _X_EXPORT DevPrivateKeyRec PictureScreenPrivateKeyRec;
347#define PictureScreenPrivateKey (&PictureScreenPrivateKeyRec)
348
349extern _X_EXPORT DevPrivateKeyRec PictureWindowPrivateKeyRec;
350#define	PictureWindowPrivateKey (&PictureWindowPrivateKeyRec)
351
352extern RESTYPE PictureType;
353extern RESTYPE PictFormatType;
354extern RESTYPE GlyphSetType;
355
356#define GetPictureScreen(s) ((PictureScreenPtr)dixLookupPrivate(&(s)->devPrivates, PictureScreenPrivateKey))
357#define GetPictureScreenIfSet(s) (dixPrivateKeyRegistered(PictureScreenPrivateKey) ? GetPictureScreen(s) : NULL)
358#define SetPictureScreen(s,p) dixSetPrivate(&(s)->devPrivates, PictureScreenPrivateKey, p)
359#define GetPictureWindow(w) ((PicturePtr)dixLookupPrivate(&(w)->devPrivates, PictureWindowPrivateKey))
360#define SetPictureWindow(w,p) dixSetPrivate(&(w)->devPrivates, PictureWindowPrivateKey, p)
361
362#define VERIFY_PICTURE(pPicture, pid, client, mode) {\
363    int tmprc = dixLookupResourceByType((void *)&(pPicture), pid,\
364	                                PictureType, client, mode);\
365    if (tmprc != Success)\
366	return tmprc;\
367}
368
369#define VERIFY_ALPHA(pPicture, pid, client, mode) {\
370    if (pid == None) \
371	pPicture = 0; \
372    else { \
373	VERIFY_PICTURE(pPicture, pid, client, mode); \
374    } \
375} \
376
377extern _X_EXPORT PictFormatPtr
378 PictureWindowFormat(WindowPtr pWindow);
379
380extern _X_EXPORT Bool
381 PictureSetSubpixelOrder(ScreenPtr pScreen, int subpixel);
382
383extern _X_EXPORT int
384 PictureGetSubpixelOrder(ScreenPtr pScreen);
385
386extern _X_EXPORT PictFormatPtr
387PictureMatchVisual(ScreenPtr pScreen, int depth, VisualPtr pVisual);
388
389extern _X_EXPORT PictFormatPtr
390PictureMatchFormat(ScreenPtr pScreen, int depth, CARD32 format);
391
392extern _X_EXPORT Bool
393 PictureInit(ScreenPtr pScreen, PictFormatPtr formats, int nformats);
394
395extern _X_EXPORT int
396 PictureGetFilterId(const char *filter, int len, Bool makeit);
397
398extern _X_EXPORT char *PictureGetFilterName(int id);
399
400extern _X_EXPORT int
401PictureAddFilter(ScreenPtr pScreen,
402                 const char *filter,
403                 PictFilterValidateParamsProcPtr ValidateParams,
404                 int width, int height);
405
406extern _X_EXPORT Bool
407PictureSetFilterAlias(ScreenPtr pScreen, const char *filter, const char *alias);
408
409extern _X_EXPORT Bool
410 PictureSetDefaultFilters(ScreenPtr pScreen);
411
412extern _X_EXPORT void
413 PictureResetFilters(ScreenPtr pScreen);
414
415extern _X_EXPORT PictFilterPtr
416PictureFindFilter(ScreenPtr pScreen, char *name, int len);
417
418extern _X_EXPORT int
419SetPicturePictFilter(PicturePtr pPicture, PictFilterPtr pFilter,
420                     xFixed * params, int nparams);
421
422extern _X_EXPORT int
423SetPictureFilter(PicturePtr pPicture, char *name, int len,
424                 xFixed * params, int nparams);
425
426extern _X_EXPORT Bool
427 PictureFinishInit(void);
428
429extern _X_EXPORT PicturePtr
430CreatePicture(Picture pid,
431              DrawablePtr pDrawable,
432              PictFormatPtr pFormat,
433              Mask mask, XID *list, ClientPtr client, int *error);
434
435extern _X_EXPORT int
436ChangePicture(PicturePtr pPicture,
437              Mask vmask, XID *vlist, DevUnion *ulist, ClientPtr client);
438
439extern _X_EXPORT int
440
441SetPictureClipRects(PicturePtr pPicture,
442                    int xOrigin, int yOrigin, int nRect, xRectangle *rects);
443
444extern _X_EXPORT int
445SetPictureClipRegion(PicturePtr pPicture,
446                     int xOrigin, int yOrigin, RegionPtr pRegion);
447
448extern _X_EXPORT int
449 SetPictureTransform(PicturePtr pPicture, PictTransform * transform);
450
451extern _X_EXPORT void
452 ValidatePicture(PicturePtr pPicture);
453
454extern _X_EXPORT int
455 FreePicture(void *pPicture, XID pid);
456
457extern _X_EXPORT void
458CompositePicture(CARD8 op,
459                 PicturePtr pSrc,
460                 PicturePtr pMask,
461                 PicturePtr pDst,
462                 INT16 xSrc,
463                 INT16 ySrc,
464                 INT16 xMask,
465                 INT16 yMask,
466                 INT16 xDst, INT16 yDst, CARD16 width, CARD16 height);
467
468extern _X_EXPORT void
469CompositeGlyphs(CARD8 op,
470                PicturePtr pSrc,
471                PicturePtr pDst,
472                PictFormatPtr maskFormat,
473                INT16 xSrc,
474                INT16 ySrc, int nlist, GlyphListPtr lists, GlyphPtr * glyphs);
475
476extern _X_EXPORT void
477CompositeRects(CARD8 op,
478               PicturePtr pDst,
479               xRenderColor * color, int nRect, xRectangle *rects);
480
481extern _X_EXPORT void
482CompositeTrapezoids(CARD8 op,
483                    PicturePtr pSrc,
484                    PicturePtr pDst,
485                    PictFormatPtr maskFormat,
486                    INT16 xSrc, INT16 ySrc, int ntrap, xTrapezoid * traps);
487
488extern _X_EXPORT void
489CompositeTriangles(CARD8 op,
490                   PicturePtr pSrc,
491                   PicturePtr pDst,
492                   PictFormatPtr maskFormat,
493                   INT16 xSrc,
494                   INT16 ySrc, int ntriangles, xTriangle * triangles);
495
496extern _X_EXPORT void
497CompositeTriStrip(CARD8 op,
498                  PicturePtr pSrc,
499                  PicturePtr pDst,
500                  PictFormatPtr maskFormat,
501                  INT16 xSrc, INT16 ySrc, int npoints, xPointFixed * points);
502
503extern _X_EXPORT void
504CompositeTriFan(CARD8 op,
505                PicturePtr pSrc,
506                PicturePtr pDst,
507                PictFormatPtr maskFormat,
508                INT16 xSrc, INT16 ySrc, int npoints, xPointFixed * points);
509
510Bool
511 AnimCurInit(ScreenPtr pScreen);
512
513int
514AnimCursorCreate(CursorPtr *cursors, CARD32 *deltas, int ncursor,
515                 CursorPtr *ppCursor, ClientPtr client, XID cid);
516
517extern _X_EXPORT void
518AddTraps(PicturePtr pPicture,
519         INT16 xOff, INT16 yOff, int ntraps, xTrap * traps);
520
521extern _X_EXPORT PicturePtr
522CreateSolidPicture(Picture pid, xRenderColor * color, int *error);
523
524extern _X_EXPORT PicturePtr
525CreateLinearGradientPicture(Picture pid,
526                            xPointFixed * p1,
527                            xPointFixed * p2,
528                            int nStops,
529                            xFixed * stops, xRenderColor * colors, int *error);
530
531extern _X_EXPORT PicturePtr
532CreateRadialGradientPicture(Picture pid,
533                            xPointFixed * inner,
534                            xPointFixed * outer,
535                            xFixed innerRadius,
536                            xFixed outerRadius,
537                            int nStops,
538                            xFixed * stops, xRenderColor * colors, int *error);
539
540extern _X_EXPORT PicturePtr
541CreateConicalGradientPicture(Picture pid,
542                             xPointFixed * center,
543                             xFixed angle,
544                             int nStops,
545                             xFixed * stops, xRenderColor * colors, int *error);
546
547#ifdef PANORAMIX
548extern void PanoramiXRenderInit(void);
549extern void PanoramiXRenderReset(void);
550#endif
551
552/*
553 * matrix.c
554 */
555
556extern _X_EXPORT void
557PictTransform_from_xRenderTransform(PictTransformPtr pict,
558                                    xRenderTransform * render);
559
560extern _X_EXPORT void
561xRenderTransform_from_PictTransform(xRenderTransform * render,
562                                    PictTransformPtr pict);
563
564extern _X_EXPORT Bool
565 PictureTransformPoint(PictTransformPtr transform, PictVectorPtr vector);
566
567extern _X_EXPORT Bool
568 PictureTransformPoint3d(PictTransformPtr transform, PictVectorPtr vector);
569
570#endif                          /* _PICTURESTR_H_ */
571