1/*
2 * Copyright © 2004 Eric Anholt
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 Eric Anholt not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission.  Eric Anholt makes no
11 * representations about the suitability of this software for any purpose.  It
12 * is provided "as is" without express or implied warranty.
13 *
14 * ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL ERIC ANHOLT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
21 */
22
23#ifdef HAVE_DIX_CONFIG_H
24#include <dix-config.h>
25#endif
26
27#include "gcstruct.h"
28#include "picturestr.h"
29#include "privates.h"
30
31/*
32 * One of these structures is allocated per GC that gets used with a window with
33 * backing pixmap.
34 */
35
36typedef struct {
37    GCPtr	    pBackingGC;	    /* Copy of the GC but with graphicsExposures
38				     * set FALSE and the clientClip set to
39				     * clip output to the valid regions of the
40				     * backing pixmap. */
41    unsigned long   serialNumber;   /* clientClip computed time */
42    unsigned long   stateChanges;   /* changes in parent gc since last copy */
43    GCOps	    *wrapOps;	    /* wrapped ops */
44    GCFuncs	    *wrapFuncs;	    /* wrapped funcs */
45} cwGCRec, *cwGCPtr;
46
47extern _X_EXPORT DevPrivateKeyRec cwGCKeyRec;
48#define cwGCKey (&cwGCKeyRec)
49
50#define getCwGC(pGC) ((cwGCPtr)dixLookupPrivate(&(pGC)->devPrivates, cwGCKey))
51#define setCwGC(pGC,p) dixSetPrivate(&(pGC)->devPrivates, cwGCKey, p)
52
53/*
54 * One of these structures is allocated per Picture that gets used with a
55 * window with a backing pixmap
56 */
57
58typedef struct {
59    PicturePtr	    pBackingPicture;
60    unsigned long   serialNumber;
61    unsigned long   stateChanges;
62} cwPictureRec, *cwPicturePtr;
63
64extern _X_EXPORT DevPrivateKeyRec cwPictureKeyRec;
65#define cwPictureKey (&cwPictureKeyRec)
66
67#define getCwPicture(pPicture) (pPicture->pDrawable ? \
68    (cwPicturePtr)dixLookupPrivate(&(pPicture)->devPrivates, cwPictureKey) : 0)
69#define setCwPicture(pPicture,p) dixSetPrivate(&(pPicture)->devPrivates, cwPictureKey, p)
70
71extern _X_EXPORT DevPrivateKeyRec cwWindowKeyRec;
72#define cwWindowKey (&cwWindowKeyRec)
73
74#define cwWindowPrivate(pWin) dixLookupPrivate(&(pWin)->devPrivates, cwWindowKey)
75#define getCwPixmap(pWindow)	    ((PixmapPtr) cwWindowPrivate(pWindow))
76#define setCwPixmap(pWindow,pPixmap) \
77    dixSetPrivate(&(pWindow)->devPrivates, cwWindowKey, pPixmap)
78
79#define cwDrawableIsRedirWindow(pDraw)					\
80	((pDraw)->type == DRAWABLE_WINDOW &&				\
81	 getCwPixmap((WindowPtr) (pDraw)) != NULL)
82
83typedef struct {
84    /*
85     * screen func wrappers
86     */
87    CloseScreenProcPtr		CloseScreen;
88    GetImageProcPtr		GetImage;
89    GetSpansProcPtr		GetSpans;
90    CreateGCProcPtr		CreateGC;
91
92    CopyWindowProcPtr		CopyWindow;
93
94    GetWindowPixmapProcPtr	GetWindowPixmap;
95    SetWindowPixmapProcPtr	SetWindowPixmap;
96
97    DestroyPictureProcPtr	DestroyPicture;
98    ChangePictureClipProcPtr	ChangePictureClip;
99    DestroyPictureClipProcPtr	DestroyPictureClip;
100
101    ChangePictureProcPtr	ChangePicture;
102    ValidatePictureProcPtr	ValidatePicture;
103
104    CompositeProcPtr		Composite;
105    CompositeRectsProcPtr	CompositeRects;
106
107    TrapezoidsProcPtr		Trapezoids;
108    TrianglesProcPtr		Triangles;
109    TriStripProcPtr		TriStrip;
110    TriFanProcPtr		TriFan;
111
112    RasterizeTrapezoidProcPtr	RasterizeTrapezoid;
113} cwScreenRec, *cwScreenPtr;
114
115extern _X_EXPORT DevPrivateKeyRec cwScreenKeyRec;
116#define cwScreenKey (&cwScreenKeyRec)
117
118#define getCwScreen(pScreen) ((cwScreenPtr)dixLookupPrivate(&(pScreen)->devPrivates, cwScreenKey))
119#define setCwScreen(pScreen,p) dixSetPrivate(&(pScreen)->devPrivates, cwScreenKey, p)
120
121#define CW_OFFSET_XYPOINTS(ppt, npt) do { \
122    DDXPointPtr _ppt = (DDXPointPtr)(ppt); \
123    int _i; \
124    for (_i = 0; _i < npt; _i++) { \
125	_ppt[_i].x += dst_off_x; \
126	_ppt[_i].y += dst_off_y; \
127    } \
128} while (0)
129
130#define CW_OFFSET_RECTS(prect, nrect) do { \
131    int _i; \
132    for (_i = 0; _i < nrect; _i++) { \
133	(prect)[_i].x += dst_off_x; \
134	(prect)[_i].y += dst_off_y; \
135    } \
136} while (0)
137
138#define CW_OFFSET_ARCS(parc, narc) do { \
139    int _i; \
140    for (_i = 0; _i < narc; _i++) { \
141	(parc)[_i].x += dst_off_x; \
142	(parc)[_i].y += dst_off_y; \
143    } \
144} while (0)
145
146#define CW_OFFSET_XY_DST(x, y) do { \
147    (x) = (x) + dst_off_x; \
148    (y) = (y) + dst_off_y; \
149} while (0)
150
151#define CW_OFFSET_XY_SRC(x, y) do { \
152    (x) = (x) + src_off_x; \
153    (y) = (y) + src_off_y; \
154} while (0)
155
156/* cw.c */
157extern _X_EXPORT DrawablePtr
158cwGetBackingDrawable(DrawablePtr pDrawable, int *x_off, int *y_off);
159
160/* cw_render.c */
161
162extern _X_EXPORT void
163cwInitializeRender (ScreenPtr pScreen);
164
165extern _X_EXPORT void
166cwFiniRender (ScreenPtr pScreen);
167
168/* cw.c */
169
170extern _X_EXPORT void
171miInitializeCompositeWrapper(ScreenPtr pScreen);
172