1706f2543Smrg/*
2706f2543Smrg * Copyright © 2004 Eric Anholt
3706f2543Smrg *
4706f2543Smrg * Permission to use, copy, modify, distribute, and sell this software and its
5706f2543Smrg * documentation for any purpose is hereby granted without fee, provided that
6706f2543Smrg * the above copyright notice appear in all copies and that both that
7706f2543Smrg * copyright notice and this permission notice appear in supporting
8706f2543Smrg * documentation, and that the name of Eric Anholt not be used in
9706f2543Smrg * advertising or publicity pertaining to distribution of the software without
10706f2543Smrg * specific, written prior permission.  Eric Anholt makes no
11706f2543Smrg * representations about the suitability of this software for any purpose.  It
12706f2543Smrg * is provided "as is" without express or implied warranty.
13706f2543Smrg *
14706f2543Smrg * ERIC ANHOLT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15706f2543Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16706f2543Smrg * EVENT SHALL ERIC ANHOLT BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17706f2543Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18706f2543Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19706f2543Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20706f2543Smrg * PERFORMANCE OF THIS SOFTWARE.
21706f2543Smrg */
22706f2543Smrg
23706f2543Smrg#ifdef HAVE_DIX_CONFIG_H
24706f2543Smrg#include <dix-config.h>
25706f2543Smrg#endif
26706f2543Smrg
27706f2543Smrg#include <stdlib.h>
28706f2543Smrg
29706f2543Smrg#include "gcstruct.h"
30706f2543Smrg#include "pixmapstr.h"
31706f2543Smrg#include "cw.h"
32706f2543Smrg#include "mi.h"
33706f2543Smrg
34706f2543Smrg#define SETUP_BACKING_DST(_pDst, _pGC) \
35706f2543Smrg    cwGCPtr pGCPrivate = getCwGC (_pGC); \
36706f2543Smrg    int dst_off_x, dst_off_y; \
37706f2543Smrg    DrawablePtr pBackingDst = cwGetBackingDrawable(pDst, &dst_off_x, \
38706f2543Smrg	&dst_off_y); \
39706f2543Smrg    GCPtr pBackingGC = pGCPrivate->pBackingGC ? pGCPrivate->pBackingGC : _pGC
40706f2543Smrg
41706f2543Smrg#define SETUP_BACKING_SRC(pSrc, pGC) \
42706f2543Smrg    int src_off_x, src_off_y; \
43706f2543Smrg    DrawablePtr pBackingSrc = cwGetBackingDrawable(pSrc, &src_off_x, \
44706f2543Smrg	&src_off_y)
45706f2543Smrg
46706f2543Smrg#define PROLOGUE(pGC) do { \
47706f2543Smrg    if (pBackingGC->serialNumber != pBackingDst->serialNumber) { \
48706f2543Smrg	ValidateGC(pBackingDst, pBackingGC); \
49706f2543Smrg    } \
50706f2543Smrg    pGC->funcs = pGCPrivate->wrapFuncs;\
51706f2543Smrg    pGC->ops = pGCPrivate->wrapOps;\
52706f2543Smrg} while (0)
53706f2543Smrg
54706f2543Smrg#define EPILOGUE(pGC) do { \
55706f2543Smrg    pGCPrivate->wrapFuncs = (pGC)->funcs; \
56706f2543Smrg    pGCPrivate->wrapOps = (pGC)->ops; \
57706f2543Smrg    (pGC)->funcs = &cwGCFuncs; \
58706f2543Smrg    (pGC)->ops = &cwGCOps; \
59706f2543Smrg} while (0)
60706f2543Smrg
61706f2543Smrgextern GCFuncs cwGCFuncs;
62706f2543Smrg
63706f2543Smrg/*
64706f2543Smrg * GC ops -- wrap each GC operation with our own function
65706f2543Smrg */
66706f2543Smrg
67706f2543Smrgstatic void cwFillSpans(DrawablePtr pDst, GCPtr pGC, int nInit,
68706f2543Smrg			DDXPointPtr pptInit, int *pwidthInit, int fSorted);
69706f2543Smrgstatic void cwSetSpans(DrawablePtr pDst, GCPtr pGC, char *psrc,
70706f2543Smrg		       DDXPointPtr ppt, int *pwidth, int nspans, int fSorted);
71706f2543Smrgstatic void cwPutImage(DrawablePtr pDst, GCPtr pGC, int depth,
72706f2543Smrg		       int x, int y, int w, int h, int leftPad, int format,
73706f2543Smrg		       char *pBits);
74706f2543Smrgstatic RegionPtr cwCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
75706f2543Smrg			    int srcx, int srcy, int w, int h,
76706f2543Smrg			    int dstx, int dsty);
77706f2543Smrgstatic RegionPtr cwCopyPlane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
78706f2543Smrg			     int srcx, int srcy, int w, int h,
79706f2543Smrg			     int dstx, int dsty, unsigned long plane);
80706f2543Smrgstatic void cwPolyPoint(DrawablePtr pDst, GCPtr pGC, int mode, int npt,
81706f2543Smrg			xPoint *pptInit);
82706f2543Smrgstatic void cwPolylines(DrawablePtr pDst, GCPtr pGC, int mode, int npt,
83706f2543Smrg			DDXPointPtr pptInit);
84706f2543Smrgstatic void cwPolySegment(DrawablePtr pDst, GCPtr pGC, int nseg,
85706f2543Smrg			  xSegment *pSegs);
86706f2543Smrgstatic void cwPolyRectangle(DrawablePtr pDst, GCPtr pGC,
87706f2543Smrg			    int nrects, xRectangle *pRects);
88706f2543Smrgstatic void cwPolyArc(DrawablePtr pDst, GCPtr pGC, int narcs, xArc *parcs);
89706f2543Smrgstatic void cwFillPolygon(DrawablePtr pDst, GCPtr pGC, int shape, int mode,
90706f2543Smrg			  int count, DDXPointPtr pPts);
91706f2543Smrgstatic void cwPolyFillRect(DrawablePtr pDst, GCPtr pGC,
92706f2543Smrg			   int nrectFill, xRectangle *prectInit);
93706f2543Smrgstatic void cwPolyFillArc(DrawablePtr pDst, GCPtr pGC,
94706f2543Smrg			  int narcs, xArc *parcs);
95706f2543Smrgstatic int cwPolyText8(DrawablePtr pDrawable, GCPtr pGC, int x, int y,
96706f2543Smrg		       int count, char *chars);
97706f2543Smrgstatic int cwPolyText16(DrawablePtr pDst, GCPtr pGC, int x, int y,
98706f2543Smrg			int count, unsigned short *chars);
99706f2543Smrgstatic void cwImageText8(DrawablePtr pDst, GCPtr pGC, int x, int y,
100706f2543Smrg			 int count, char *chars);
101706f2543Smrgstatic void cwImageText16(DrawablePtr pDst, GCPtr pGC, int x, int y,
102706f2543Smrg			  int count, unsigned short *chars);
103706f2543Smrgstatic void cwImageGlyphBlt(DrawablePtr pDst, GCPtr pGC, int x, int y,
104706f2543Smrg			    unsigned int nglyph, CharInfoPtr *ppci,
105706f2543Smrg			    pointer pglyphBase);
106706f2543Smrgstatic void cwPolyGlyphBlt(DrawablePtr pDst, GCPtr pGC, int x, int y,
107706f2543Smrg			   unsigned int nglyph, CharInfoPtr *ppci,
108706f2543Smrg			   pointer pglyphBase);
109706f2543Smrgstatic void cwPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst,
110706f2543Smrg			 int w, int h, int x, int y);
111706f2543Smrg
112706f2543SmrgGCOps cwGCOps = {
113706f2543Smrg	cwFillSpans,
114706f2543Smrg	cwSetSpans,
115706f2543Smrg	cwPutImage,
116706f2543Smrg	cwCopyArea,
117706f2543Smrg	cwCopyPlane,
118706f2543Smrg	cwPolyPoint,
119706f2543Smrg	cwPolylines,
120706f2543Smrg	cwPolySegment,
121706f2543Smrg	cwPolyRectangle,
122706f2543Smrg	cwPolyArc,
123706f2543Smrg	cwFillPolygon,
124706f2543Smrg	cwPolyFillRect,
125706f2543Smrg	cwPolyFillArc,
126706f2543Smrg	cwPolyText8,
127706f2543Smrg	cwPolyText16,
128706f2543Smrg	cwImageText8,
129706f2543Smrg	cwImageText16,
130706f2543Smrg	cwImageGlyphBlt,
131706f2543Smrg	cwPolyGlyphBlt,
132706f2543Smrg	cwPushPixels
133706f2543Smrg};
134706f2543Smrg
135706f2543Smrgstatic void
136706f2543SmrgcwFillSpans(DrawablePtr pDst, GCPtr pGC, int nspans, DDXPointPtr ppt,
137706f2543Smrg	    int *pwidth, int fSorted)
138706f2543Smrg{
139706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
140706f2543Smrg
141706f2543Smrg    PROLOGUE(pGC);
142706f2543Smrg
143706f2543Smrg    CW_OFFSET_XYPOINTS(ppt, nspans);
144706f2543Smrg
145706f2543Smrg    (*pBackingGC->ops->FillSpans)(pBackingDst, pBackingGC, nspans, ppt,
146706f2543Smrg				  pwidth, fSorted);
147706f2543Smrg
148706f2543Smrg    EPILOGUE(pGC);
149706f2543Smrg}
150706f2543Smrg
151706f2543Smrgstatic void
152706f2543SmrgcwSetSpans(DrawablePtr pDst, GCPtr pGC, char *psrc, DDXPointPtr ppt,
153706f2543Smrg	   int *pwidth, int nspans, int fSorted)
154706f2543Smrg{
155706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
156706f2543Smrg
157706f2543Smrg    PROLOGUE(pGC);
158706f2543Smrg
159706f2543Smrg    CW_OFFSET_XYPOINTS(ppt, nspans);
160706f2543Smrg
161706f2543Smrg    (*pBackingGC->ops->SetSpans)(pBackingDst, pBackingGC, psrc, ppt, pwidth,
162706f2543Smrg				 nspans, fSorted);
163706f2543Smrg
164706f2543Smrg    EPILOGUE(pGC);
165706f2543Smrg}
166706f2543Smrg
167706f2543Smrgstatic void
168706f2543SmrgcwPutImage(DrawablePtr pDst, GCPtr pGC, int depth, int x, int y, int w, int h,
169706f2543Smrg	   int leftPad, int format, char *pBits)
170706f2543Smrg{
171706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
172706f2543Smrg
173706f2543Smrg    PROLOGUE(pGC);
174706f2543Smrg
175706f2543Smrg    CW_OFFSET_XY_DST(x, y);
176706f2543Smrg
177706f2543Smrg    (*pBackingGC->ops->PutImage)(pBackingDst, pBackingGC, depth, x, y, w, h,
178706f2543Smrg				 leftPad, format, pBits);
179706f2543Smrg
180706f2543Smrg    EPILOGUE(pGC);
181706f2543Smrg}
182706f2543Smrg
183706f2543Smrgstatic RegionPtr
184706f2543SmrgcwCopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy,
185706f2543Smrg	   int w, int h, int dstx, int dsty)
186706f2543Smrg{
187706f2543Smrg    int		odstx, odsty;
188706f2543Smrg    int		osrcx, osrcy;
189706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
190706f2543Smrg    SETUP_BACKING_SRC(pSrc, pGC);
191706f2543Smrg
192706f2543Smrg    PROLOGUE(pGC);
193706f2543Smrg
194706f2543Smrg    odstx = dstx;
195706f2543Smrg    odsty = dsty;
196706f2543Smrg    osrcx = srcx;
197706f2543Smrg    osrcy = srcy;
198706f2543Smrg    CW_OFFSET_XY_DST(dstx, dsty);
199706f2543Smrg    CW_OFFSET_XY_SRC(srcx, srcy);
200706f2543Smrg
201706f2543Smrg    (*pBackingGC->ops->CopyArea)(pBackingSrc, pBackingDst,
202706f2543Smrg				 pBackingGC, srcx, srcy, w, h,
203706f2543Smrg				 dstx, dsty);
204706f2543Smrg
205706f2543Smrg    EPILOGUE(pGC);
206706f2543Smrg
207706f2543Smrg    return miHandleExposures(pSrc, pDst, pGC,
208706f2543Smrg			     osrcx, osrcy, w, h,
209706f2543Smrg			     odstx, odsty, 0);
210706f2543Smrg}
211706f2543Smrg
212706f2543Smrgstatic RegionPtr
213706f2543SmrgcwCopyPlane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy,
214706f2543Smrg	    int w, int h, int dstx, int dsty, unsigned long plane)
215706f2543Smrg{
216706f2543Smrg    int		odstx, odsty;
217706f2543Smrg    int		osrcx, osrcy;
218706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
219706f2543Smrg    SETUP_BACKING_SRC(pSrc, pGC);
220706f2543Smrg
221706f2543Smrg    PROLOGUE(pGC);
222706f2543Smrg
223706f2543Smrg    odstx = dstx;
224706f2543Smrg    odsty = dsty;
225706f2543Smrg    osrcx = srcx;
226706f2543Smrg    osrcy = srcy;
227706f2543Smrg    CW_OFFSET_XY_DST(dstx, dsty);
228706f2543Smrg    CW_OFFSET_XY_SRC(srcx, srcy);
229706f2543Smrg
230706f2543Smrg    (*pBackingGC->ops->CopyPlane)(pBackingSrc, pBackingDst,
231706f2543Smrg				  pBackingGC, srcx, srcy, w, h,
232706f2543Smrg				  dstx, dsty, plane);
233706f2543Smrg
234706f2543Smrg    EPILOGUE(pGC);
235706f2543Smrg
236706f2543Smrg    return miHandleExposures(pSrc, pDst, pGC,
237706f2543Smrg			     osrcx, osrcy, w, h,
238706f2543Smrg			     odstx, odsty, plane);
239706f2543Smrg}
240706f2543Smrg
241706f2543Smrgstatic void
242706f2543SmrgcwPolyPoint(DrawablePtr pDst, GCPtr pGC, int mode, int npt, xPoint *ppt)
243706f2543Smrg{
244706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
245706f2543Smrg
246706f2543Smrg    PROLOGUE(pGC);
247706f2543Smrg
248706f2543Smrg    if (mode == CoordModeOrigin)
249706f2543Smrg	CW_OFFSET_XYPOINTS(ppt, npt);
250706f2543Smrg    else
251706f2543Smrg	CW_OFFSET_XYPOINTS(ppt, 1);
252706f2543Smrg
253706f2543Smrg    (*pBackingGC->ops->PolyPoint)(pBackingDst, pBackingGC, mode, npt, ppt);
254706f2543Smrg
255706f2543Smrg    EPILOGUE(pGC);
256706f2543Smrg}
257706f2543Smrg
258706f2543Smrgstatic void
259706f2543SmrgcwPolylines(DrawablePtr pDst, GCPtr pGC, int mode, int npt, DDXPointPtr ppt)
260706f2543Smrg{
261706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
262706f2543Smrg
263706f2543Smrg    PROLOGUE(pGC);
264706f2543Smrg
265706f2543Smrg    if (mode == CoordModeOrigin)
266706f2543Smrg	CW_OFFSET_XYPOINTS(ppt, npt);
267706f2543Smrg    else
268706f2543Smrg	CW_OFFSET_XYPOINTS(ppt, 1);
269706f2543Smrg
270706f2543Smrg    (*pBackingGC->ops->Polylines)(pBackingDst, pBackingGC, mode, npt, ppt);
271706f2543Smrg
272706f2543Smrg    EPILOGUE(pGC);
273706f2543Smrg}
274706f2543Smrg
275706f2543Smrgstatic void
276706f2543SmrgcwPolySegment(DrawablePtr pDst, GCPtr pGC, int nseg, xSegment *pSegs)
277706f2543Smrg{
278706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
279706f2543Smrg
280706f2543Smrg    PROLOGUE(pGC);
281706f2543Smrg
282706f2543Smrg    CW_OFFSET_XYPOINTS(pSegs, nseg * 2);
283706f2543Smrg
284706f2543Smrg    (*pBackingGC->ops->PolySegment)(pBackingDst, pBackingGC, nseg, pSegs);
285706f2543Smrg
286706f2543Smrg    EPILOGUE(pGC);
287706f2543Smrg}
288706f2543Smrg
289706f2543Smrgstatic void
290706f2543SmrgcwPolyRectangle(DrawablePtr pDst, GCPtr pGC, int nrects, xRectangle *pRects)
291706f2543Smrg{
292706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
293706f2543Smrg
294706f2543Smrg    PROLOGUE(pGC);
295706f2543Smrg
296706f2543Smrg    CW_OFFSET_RECTS(pRects, nrects);
297706f2543Smrg
298706f2543Smrg    (*pBackingGC->ops->PolyRectangle)(pBackingDst, pBackingGC, nrects, pRects);
299706f2543Smrg
300706f2543Smrg    EPILOGUE(pGC);
301706f2543Smrg}
302706f2543Smrg
303706f2543Smrgstatic void
304706f2543SmrgcwPolyArc(DrawablePtr pDst, GCPtr pGC, int narcs, xArc *pArcs)
305706f2543Smrg{
306706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
307706f2543Smrg
308706f2543Smrg    PROLOGUE(pGC);
309706f2543Smrg
310706f2543Smrg    CW_OFFSET_RECTS(pArcs, narcs);
311706f2543Smrg
312706f2543Smrg    (*pBackingGC->ops->PolyArc)(pBackingDst, pBackingGC, narcs, pArcs);
313706f2543Smrg
314706f2543Smrg    EPILOGUE(pGC);
315706f2543Smrg}
316706f2543Smrg
317706f2543Smrgstatic void
318706f2543SmrgcwFillPolygon(DrawablePtr pDst, GCPtr pGC, int shape, int mode, int npt,
319706f2543Smrg	      DDXPointPtr ppt)
320706f2543Smrg{
321706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
322706f2543Smrg
323706f2543Smrg    PROLOGUE(pGC);
324706f2543Smrg
325706f2543Smrg    if (mode == CoordModeOrigin)
326706f2543Smrg	CW_OFFSET_XYPOINTS(ppt, npt);
327706f2543Smrg    else
328706f2543Smrg	CW_OFFSET_XYPOINTS(ppt, 1);
329706f2543Smrg
330706f2543Smrg    (*pBackingGC->ops->FillPolygon)(pBackingDst, pBackingGC, shape, mode, npt,
331706f2543Smrg				    ppt);
332706f2543Smrg
333706f2543Smrg    EPILOGUE(pGC);
334706f2543Smrg}
335706f2543Smrg
336706f2543Smrgstatic void
337706f2543SmrgcwPolyFillRect(DrawablePtr pDst, GCPtr pGC, int nrects, xRectangle *pRects)
338706f2543Smrg{
339706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
340706f2543Smrg
341706f2543Smrg    PROLOGUE(pGC);
342706f2543Smrg
343706f2543Smrg    CW_OFFSET_RECTS(pRects, nrects);
344706f2543Smrg
345706f2543Smrg    (*pBackingGC->ops->PolyFillRect)(pBackingDst, pBackingGC, nrects, pRects);
346706f2543Smrg
347706f2543Smrg    EPILOGUE(pGC);
348706f2543Smrg}
349706f2543Smrg
350706f2543Smrgstatic void
351706f2543SmrgcwPolyFillArc(DrawablePtr pDst, GCPtr pGC, int narcs, xArc *parcs)
352706f2543Smrg{
353706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
354706f2543Smrg
355706f2543Smrg    PROLOGUE(pGC);
356706f2543Smrg
357706f2543Smrg    CW_OFFSET_RECTS(parcs, narcs);
358706f2543Smrg
359706f2543Smrg    (*pBackingGC->ops->PolyFillArc)(pBackingDst, pBackingGC, narcs, parcs);
360706f2543Smrg
361706f2543Smrg    EPILOGUE(pGC);
362706f2543Smrg}
363706f2543Smrg
364706f2543Smrgstatic int
365706f2543SmrgcwPolyText8(DrawablePtr pDst, GCPtr pGC, int x, int y, int count, char *chars)
366706f2543Smrg{
367706f2543Smrg    int result;
368706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
369706f2543Smrg
370706f2543Smrg    PROLOGUE(pGC);
371706f2543Smrg
372706f2543Smrg    CW_OFFSET_XY_DST(x, y);
373706f2543Smrg
374706f2543Smrg    result = (*pBackingGC->ops->PolyText8)(pBackingDst, pBackingGC, x, y,
375706f2543Smrg					   count, chars);
376706f2543Smrg
377706f2543Smrg    EPILOGUE(pGC);
378706f2543Smrg
379706f2543Smrg    return result;
380706f2543Smrg}
381706f2543Smrg
382706f2543Smrgstatic int
383706f2543SmrgcwPolyText16(DrawablePtr pDst, GCPtr pGC, int x, int y, int count,
384706f2543Smrg	     unsigned short *chars)
385706f2543Smrg{
386706f2543Smrg    int result;
387706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
388706f2543Smrg
389706f2543Smrg    PROLOGUE(pGC);
390706f2543Smrg
391706f2543Smrg    CW_OFFSET_XY_DST(x, y);
392706f2543Smrg
393706f2543Smrg    result = (*pBackingGC->ops->PolyText16)(pBackingDst, pBackingGC, x, y,
394706f2543Smrg					    count, chars);
395706f2543Smrg
396706f2543Smrg    EPILOGUE(pGC);
397706f2543Smrg    return result;
398706f2543Smrg}
399706f2543Smrg
400706f2543Smrgstatic void
401706f2543SmrgcwImageText8(DrawablePtr pDst, GCPtr pGC, int x, int y, int count, char *chars)
402706f2543Smrg{
403706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
404706f2543Smrg
405706f2543Smrg    PROLOGUE(pGC);
406706f2543Smrg
407706f2543Smrg    CW_OFFSET_XY_DST(x, y);
408706f2543Smrg
409706f2543Smrg    (*pBackingGC->ops->ImageText8)(pBackingDst, pBackingGC, x, y, count,
410706f2543Smrg				   chars);
411706f2543Smrg
412706f2543Smrg    EPILOGUE(pGC);
413706f2543Smrg}
414706f2543Smrg
415706f2543Smrgstatic void
416706f2543SmrgcwImageText16(DrawablePtr pDst, GCPtr pGC, int x, int y, int count,
417706f2543Smrg	     unsigned short *chars)
418706f2543Smrg{
419706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
420706f2543Smrg
421706f2543Smrg    PROLOGUE(pGC);
422706f2543Smrg
423706f2543Smrg    CW_OFFSET_XY_DST(x, y);
424706f2543Smrg
425706f2543Smrg    (*pBackingGC->ops->ImageText16)(pBackingDst, pBackingGC, x, y, count,
426706f2543Smrg				    chars);
427706f2543Smrg
428706f2543Smrg    EPILOGUE(pGC);
429706f2543Smrg}
430706f2543Smrg
431706f2543Smrgstatic void
432706f2543SmrgcwImageGlyphBlt(DrawablePtr pDst, GCPtr pGC, int x, int y, unsigned int nglyph,
433706f2543Smrg		CharInfoPtr *ppci, pointer pglyphBase)
434706f2543Smrg{
435706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
436706f2543Smrg
437706f2543Smrg    PROLOGUE(pGC);
438706f2543Smrg
439706f2543Smrg    CW_OFFSET_XY_DST(x, y);
440706f2543Smrg
441706f2543Smrg    (*pBackingGC->ops->ImageGlyphBlt)(pBackingDst, pBackingGC, x, y, nglyph,
442706f2543Smrg				      ppci, pglyphBase);
443706f2543Smrg
444706f2543Smrg    EPILOGUE(pGC);
445706f2543Smrg}
446706f2543Smrg
447706f2543Smrgstatic void
448706f2543SmrgcwPolyGlyphBlt(DrawablePtr pDst, GCPtr pGC, int x, int y, unsigned int nglyph,
449706f2543Smrg	       CharInfoPtr *ppci, pointer pglyphBase)
450706f2543Smrg{
451706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
452706f2543Smrg
453706f2543Smrg    PROLOGUE(pGC);
454706f2543Smrg
455706f2543Smrg    CW_OFFSET_XY_DST(x, y);
456706f2543Smrg
457706f2543Smrg    (*pBackingGC->ops->PolyGlyphBlt)(pBackingDst, pBackingGC, x, y, nglyph,
458706f2543Smrg				      ppci, pglyphBase);
459706f2543Smrg
460706f2543Smrg    EPILOGUE(pGC);
461706f2543Smrg}
462706f2543Smrg
463706f2543Smrgstatic void
464706f2543SmrgcwPushPixels(GCPtr pGC, PixmapPtr pBitMap, DrawablePtr pDst, int w, int h,
465706f2543Smrg	     int x, int y)
466706f2543Smrg{
467706f2543Smrg    SETUP_BACKING_DST(pDst, pGC);
468706f2543Smrg
469706f2543Smrg    PROLOGUE(pGC);
470706f2543Smrg
471706f2543Smrg    CW_OFFSET_XY_DST(x, y);
472706f2543Smrg
473706f2543Smrg    (*pBackingGC->ops->PushPixels)(pBackingGC, pBitMap, pBackingDst, w, h,
474706f2543Smrg				   x, y);
475706f2543Smrg
476706f2543Smrg    EPILOGUE(pGC);
477706f2543Smrg}
478706f2543Smrg
479