2
Copyright (C) 1999. The XFree86 Project Inc.
4
Written by Mark Vojkovich (mvojkovi@ucsd.edu)
6
Pre-fb-write callbacks and RENDER support - Nolan Leake (nolan@vmware.com)
9
/* $XFree86: xc/programs/Xserver/hw/xfree86/shadowfb/shadow.c,v 1.20tsi Exp $ */
11
#ifdef HAVE_XORG_CONFIG_H
12
#include <xorg-config.h>
16
#include <X11/Xproto.h>
18
#include "pixmapstr.h"
20
#include <X11/fonts/font.h>
22
#include "scrnintstr.h"
23
#include "windowstr.h"
25
#include "dixfontstr.h"
26
#include <X11/fonts/fontstruct.h>
32
# include "picturestr.h"
35
#define MIN(a,b) (((a)<(b))?(a):(b))
36
#define MAX(a,b) (((a)>(b))?(a):(b))
38
static Bool ShadowCloseScreen (int i, ScreenPtr pScreen);
39
static void ShadowRestoreAreas (
46
static void ShadowPaintWindow (
51
static void ShadowCopyWindow(
56
static Bool ShadowCreateGC(GCPtr pGC);
57
static Bool ShadowModifyPixmapHeader(
67
static Bool ShadowEnterVT(int index, int flags);
68
static void ShadowLeaveVT(int index, int flags);
71
static void ShadowComposite(
90
RefreshAreaFuncPtr preRefresh;
91
RefreshAreaFuncPtr postRefresh;
92
CloseScreenProcPtr CloseScreen;
93
PaintWindowBackgroundProcPtr PaintWindowBackground;
94
PaintWindowBorderProcPtr PaintWindowBorder;
95
CopyWindowProcPtr CopyWindow;
96
CreateGCProcPtr CreateGC;
97
BackingStoreRestoreAreasProcPtr RestoreAreas;
98
ModifyPixmapHeaderProcPtr ModifyPixmapHeader;
100
CompositeProcPtr Composite;
102
Bool (*EnterVT)(int, int);
103
void (*LeaveVT)(int, int);
105
} ShadowScreenRec, *ShadowScreenPtr;
110
} ShadowGCRec, *ShadowGCPtr;
113
static int ShadowScreenIndex = -1;
114
static int ShadowGCIndex = -1;
115
static unsigned long ShadowGeneration = 0;
117
#define GET_SCREEN_PRIVATE(pScreen) \
118
(ShadowScreenPtr)((pScreen)->devPrivates[ShadowScreenIndex].ptr)
119
#define GET_GC_PRIVATE(pGC) \
120
(ShadowGCPtr)((pGC)->devPrivates[ShadowGCIndex].ptr)
122
#define SHADOW_GC_FUNC_PROLOGUE(pGC)\
123
ShadowGCPtr pGCPriv = GET_GC_PRIVATE(pGC);\
124
(pGC)->funcs = pGCPriv->funcs;\
126
(pGC)->ops = pGCPriv->ops
128
#define SHADOW_GC_FUNC_EPILOGUE(pGC)\
129
pGCPriv->funcs = (pGC)->funcs;\
130
(pGC)->funcs = &ShadowGCFuncs;\
132
pGCPriv->ops = (pGC)->ops;\
133
(pGC)->ops = &ShadowGCOps;\
136
#define SHADOW_GC_OP_PROLOGUE(pGC)\
137
ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pGC->pScreen); \
138
ShadowGCPtr pGCPriv = GET_GC_PRIVATE(pGC);\
139
GCFuncs *oldFuncs = pGC->funcs;\
140
pGC->funcs = pGCPriv->funcs;\
141
pGC->ops = pGCPriv->ops
144
#define SHADOW_GC_OP_EPILOGUE(pGC)\
145
pGCPriv->ops = pGC->ops;\
146
pGC->funcs = oldFuncs;\
147
pGC->ops = &ShadowGCOps
149
#define IS_VISIBLE(pWin) (pPriv->vtSema && \
150
(((WindowPtr)pWin)->visibility != VisibilityFullyObscured))
152
#define TRIM_BOX(box, pGC) { \
153
BoxPtr extents = &pGC->pCompositeClip->extents;\
154
if(box.x1 < extents->x1) box.x1 = extents->x1; \
155
if(box.x2 > extents->x2) box.x2 = extents->x2; \
156
if(box.y1 < extents->y1) box.y1 = extents->y1; \
157
if(box.y2 > extents->y2) box.y2 = extents->y2; \
160
#define TRANSLATE_BOX(box, pDraw) { \
161
box.x1 += pDraw->x; \
162
box.x2 += pDraw->x; \
163
box.y1 += pDraw->y; \
164
box.y2 += pDraw->y; \
167
#define TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC) { \
168
TRANSLATE_BOX(box, pDraw); \
169
TRIM_BOX(box, pGC); \
172
#define BOX_NOT_EMPTY(box) \
173
(((box.x2 - box.x1) > 0) && ((box.y2 - box.y1) > 0))
180
RefreshAreaFuncPtr preRefreshArea,
181
RefreshAreaFuncPtr postRefreshArea
183
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
184
ShadowScreenPtr pPriv;
186
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
189
if(!preRefreshArea && !postRefreshArea) return FALSE;
191
if (ShadowGeneration != serverGeneration) {
192
if(((ShadowScreenIndex = AllocateScreenPrivateIndex ()) < 0) ||
193
((ShadowGCIndex = AllocateGCPrivateIndex()) < 0))
195
ShadowGeneration = serverGeneration;
198
if(!AllocateGCPrivate(pScreen, ShadowGCIndex, sizeof(ShadowGCRec)))
201
if(!(pPriv = (ShadowScreenPtr)xalloc(sizeof(ShadowScreenRec))))
204
pScreen->devPrivates[ShadowScreenIndex].ptr = (pointer)pPriv;
206
pPriv->pScrn = pScrn;
207
pPriv->preRefresh = preRefreshArea;
208
pPriv->postRefresh = postRefreshArea;
209
pPriv->vtSema = TRUE;
211
pPriv->CloseScreen = pScreen->CloseScreen;
212
pPriv->PaintWindowBackground = pScreen->PaintWindowBackground;
213
pPriv->PaintWindowBorder = pScreen->PaintWindowBorder;
214
pPriv->CopyWindow = pScreen->CopyWindow;
215
pPriv->CreateGC = pScreen->CreateGC;
216
pPriv->RestoreAreas = pScreen->BackingStoreFuncs.RestoreAreas;
217
pPriv->ModifyPixmapHeader = pScreen->ModifyPixmapHeader;
219
pPriv->EnterVT = pScrn->EnterVT;
220
pPriv->LeaveVT = pScrn->LeaveVT;
222
pScreen->CloseScreen = ShadowCloseScreen;
223
pScreen->PaintWindowBackground = ShadowPaintWindow;
224
pScreen->PaintWindowBorder = ShadowPaintWindow;
225
pScreen->CopyWindow = ShadowCopyWindow;
226
pScreen->CreateGC = ShadowCreateGC;
227
pScreen->BackingStoreFuncs.RestoreAreas = ShadowRestoreAreas;
228
pScreen->ModifyPixmapHeader = ShadowModifyPixmapHeader;
230
pScrn->EnterVT = ShadowEnterVT;
231
pScrn->LeaveVT = ShadowLeaveVT;
235
pPriv->Composite = ps->Composite;
236
ps->Composite = ShadowComposite;
246
RefreshAreaFuncPtr refreshArea
248
return ShadowFBInit2(pScreen, NULL, refreshArea);
251
/**********************************************************/
254
ShadowEnterVT(int index, int flags)
256
ScrnInfoPtr pScrn = xf86Screens[index];
257
ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScrn->pScreen);
259
if((*pPriv->EnterVT)(index, flags)) {
260
pPriv->vtSema = TRUE;
268
ShadowLeaveVT(int index, int flags)
270
ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(xf86Screens[index]->pScreen);
272
pPriv->vtSema = FALSE;
274
(*pPriv->LeaveVT)(index, flags);
277
/**********************************************************/
281
ShadowCloseScreen (int i, ScreenPtr pScreen)
283
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
284
ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen);
286
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
289
pScreen->CloseScreen = pPriv->CloseScreen;
290
pScreen->PaintWindowBackground = pPriv->PaintWindowBackground;
291
pScreen->PaintWindowBorder = pPriv->PaintWindowBorder;
292
pScreen->CopyWindow = pPriv->CopyWindow;
293
pScreen->CreateGC = pPriv->CreateGC;
294
pScreen->BackingStoreFuncs.RestoreAreas = pPriv->RestoreAreas;
295
pScreen->ModifyPixmapHeader = pPriv->ModifyPixmapHeader;
297
pScrn->EnterVT = pPriv->EnterVT;
298
pScrn->LeaveVT = pPriv->LeaveVT;
302
ps->Composite = pPriv->Composite;
306
xfree((pointer)pPriv);
308
return (*pScreen->CloseScreen) (i, pScreen);
320
ScreenPtr pScreen = pWin->drawable.pScreen;
321
ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen);
324
if(pPriv->vtSema && (num = REGION_NUM_RECTS(prgn)))
325
if(pPriv->preRefresh)
326
(*pPriv->preRefresh)(pPriv->pScrn, num, REGION_RECTS(prgn));
328
pScreen->BackingStoreFuncs.RestoreAreas = pPriv->RestoreAreas;
329
(*pScreen->BackingStoreFuncs.RestoreAreas) (
330
pPixmap, prgn, xorg, yorg, pWin);
331
pScreen->BackingStoreFuncs.RestoreAreas = ShadowRestoreAreas;
333
if(num && pPriv->postRefresh)
334
(*pPriv->postRefresh)(pPriv->pScrn, num, REGION_RECTS(prgn));
344
ScreenPtr pScreen = pWin->drawable.pScreen;
345
ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen);
348
if(pPriv->vtSema && (num = REGION_NUM_RECTS(prgn)))
349
if(pPriv->preRefresh)
350
(*pPriv->preRefresh)(pPriv->pScrn, num, REGION_RECTS(prgn));
352
if(what == PW_BACKGROUND) {
353
pScreen->PaintWindowBackground = pPriv->PaintWindowBackground;
354
(*pScreen->PaintWindowBackground) (pWin, prgn, what);
355
pScreen->PaintWindowBackground = ShadowPaintWindow;
357
pScreen->PaintWindowBorder = pPriv->PaintWindowBorder;
358
(*pScreen->PaintWindowBorder) (pWin, prgn, what);
359
pScreen->PaintWindowBorder = ShadowPaintWindow;
362
if(num && pPriv->postRefresh)
363
(*pPriv->postRefresh)(pPriv->pScrn, num, REGION_RECTS(prgn));
370
DDXPointRec ptOldOrg,
373
ScreenPtr pScreen = pWin->drawable.pScreen;
374
ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen);
379
REGION_NULL(pWin->drawable.pScreen, &rgnDst);
380
REGION_COPY(pWin->drawable.pScreen, &rgnDst, prgn);
382
REGION_TRANSLATE(pWin->drawable.pScreen, &rgnDst,
383
pWin->drawable.x - ptOldOrg.x,
384
pWin->drawable.y - ptOldOrg.y);
385
REGION_INTERSECT(pScreen, &rgnDst, &pWin->borderClip, &rgnDst);
386
if ((num = REGION_NUM_RECTS(&rgnDst))) {
387
if(pPriv->preRefresh)
388
(*pPriv->preRefresh)(pPriv->pScrn, num, REGION_RECTS(&rgnDst));
390
REGION_UNINIT(pWin->drawable.pScreen, &rgnDst);
394
pScreen->CopyWindow = pPriv->CopyWindow;
395
(*pScreen->CopyWindow) (pWin, ptOldOrg, prgn);
396
pScreen->CopyWindow = ShadowCopyWindow;
399
if (pPriv->postRefresh)
400
(*pPriv->postRefresh)(pPriv->pScrn, num, REGION_RECTS(&rgnDst));
401
REGION_UNINIT(pWin->drawable.pScreen, &rgnDst);
406
ShadowModifyPixmapHeader(
418
ShadowScreenPtr pPriv;
420
PixmapPtr pScreenPix;
425
pScreen = pPixmap->drawable.pScreen;
426
pScrn = xf86Screens[pScreen->myNum];
428
pScreenPix = (*pScreen->GetScreenPixmap)(pScreen);
430
if (pPixmap == pScreenPix && !pScrn->vtSema)
431
pScreenPix->devPrivate = pScrn->pixmapPrivate;
433
pPriv = GET_SCREEN_PRIVATE(pScreen);
435
pScreen->ModifyPixmapHeader = pPriv->ModifyPixmapHeader;
436
retval = (*pScreen->ModifyPixmapHeader)(pPixmap,
437
width, height, depth, bitsPerPixel, devKind, pPixData);
438
pScreen->ModifyPixmapHeader = ShadowModifyPixmapHeader;
440
if (pPixmap == pScreenPix && !pScrn->vtSema)
442
pScrn->pixmapPrivate = pScreenPix->devPrivate;
443
pScreenPix->devPrivate.ptr = 0;
464
ScreenPtr pScreen = pDst->pDrawable->pScreen;
465
ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen);
466
PictureScreenPtr ps = GetPictureScreen(pScreen);
469
Bool boxNotEmpty = FALSE;
472
&& pDst->pDrawable->type == DRAWABLE_WINDOW) {
474
box.x1 = pDst->pDrawable->x + xDst;
475
box.y1 = pDst->pDrawable->y + yDst;
476
box.x2 = box.x1 + width;
477
box.y2 = box.y1 + height;
479
extents = &pDst->pCompositeClip->extents;
480
if(box.x1 < extents->x1) box.x1 = extents->x1;
481
if(box.x2 > extents->x2) box.x2 = extents->x2;
482
if(box.y1 < extents->y1) box.y1 = extents->y1;
483
if(box.y2 > extents->y2) box.y2 = extents->y2;
485
if (BOX_NOT_EMPTY(box)) {
486
if (pPriv->preRefresh)
487
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
492
ps->Composite = pPriv->Composite;
493
(*ps->Composite)(op, pSrc, pMask, pDst, xSrc, ySrc,
494
xMask, yMask, xDst, yDst, width, height);
495
ps->Composite = ShadowComposite;
497
if (pPriv->postRefresh && boxNotEmpty) {
498
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
503
/**********************************************************/
505
static void ShadowValidateGC(GCPtr, unsigned long, DrawablePtr);
506
static void ShadowChangeGC(GCPtr, unsigned long);
507
static void ShadowCopyGC(GCPtr, unsigned long, GCPtr);
508
static void ShadowDestroyGC(GCPtr);
509
static void ShadowChangeClip(GCPtr, int, pointer, int);
510
static void ShadowDestroyClip(GCPtr);
511
static void ShadowCopyClip(GCPtr, GCPtr);
513
GCFuncs ShadowGCFuncs = {
514
ShadowValidateGC, ShadowChangeGC, ShadowCopyGC, ShadowDestroyGC,
515
ShadowChangeClip, ShadowDestroyClip, ShadowCopyClip
519
extern GCOps ShadowGCOps;
522
ShadowCreateGC(GCPtr pGC)
524
ScreenPtr pScreen = pGC->pScreen;
525
ShadowScreenPtr pPriv = GET_SCREEN_PRIVATE(pScreen);
526
ShadowGCPtr pGCPriv = GET_GC_PRIVATE(pGC);
529
pScreen->CreateGC = pPriv->CreateGC;
530
if((ret = (*pScreen->CreateGC) (pGC))) {
532
pGCPriv->funcs = pGC->funcs;
533
pGC->funcs = &ShadowGCFuncs;
535
pScreen->CreateGC = ShadowCreateGC;
544
unsigned long changes,
547
SHADOW_GC_FUNC_PROLOGUE (pGC);
548
(*pGC->funcs->ValidateGC)(pGC, changes, pDraw);
549
if(pDraw->type == DRAWABLE_WINDOW)
550
pGCPriv->ops = pGC->ops; /* just so it's not NULL */
553
SHADOW_GC_FUNC_EPILOGUE (pGC);
558
ShadowDestroyGC(GCPtr pGC)
560
SHADOW_GC_FUNC_PROLOGUE (pGC);
561
(*pGC->funcs->DestroyGC)(pGC);
562
SHADOW_GC_FUNC_EPILOGUE (pGC);
570
SHADOW_GC_FUNC_PROLOGUE (pGC);
571
(*pGC->funcs->ChangeGC) (pGC, mask);
572
SHADOW_GC_FUNC_EPILOGUE (pGC);
581
SHADOW_GC_FUNC_PROLOGUE (pGCDst);
582
(*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst);
583
SHADOW_GC_FUNC_EPILOGUE (pGCDst);
593
SHADOW_GC_FUNC_PROLOGUE (pGC);
594
(*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects);
595
SHADOW_GC_FUNC_EPILOGUE (pGC);
599
ShadowCopyClip(GCPtr pgcDst, GCPtr pgcSrc)
601
SHADOW_GC_FUNC_PROLOGUE (pgcDst);
602
(* pgcDst->funcs->CopyClip)(pgcDst, pgcSrc);
603
SHADOW_GC_FUNC_EPILOGUE (pgcDst);
607
ShadowDestroyClip(GCPtr pGC)
609
SHADOW_GC_FUNC_PROLOGUE (pGC);
610
(* pGC->funcs->DestroyClip)(pGC);
611
SHADOW_GC_FUNC_EPILOGUE (pGC);
617
/**********************************************************/
629
SHADOW_GC_OP_PROLOGUE(pGC);
631
if(IS_VISIBLE(pDraw) && nInit) {
632
DDXPointPtr ppt = pptInit;
633
int *pwidth = pwidthInit;
636
Bool boxNotEmpty = FALSE;
639
box.x2 = box.x1 + *pwidth;
640
box.y2 = box.y1 = ppt->y;
645
if(box.x1 > ppt->x) box.x1 = ppt->x;
646
if(box.x2 < (ppt->x + *pwidth))
647
box.x2 = ppt->x + *pwidth;
648
if(box.y1 > ppt->y) box.y1 = ppt->y;
649
else if(box.y2 < ppt->y) box.y2 = ppt->y;
654
if(!pGC->miTranslate) {
655
TRANSLATE_BOX(box, pDraw);
659
if(BOX_NOT_EMPTY(box)) {
660
if(pPriv->preRefresh)
661
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
665
(*pGC->ops->FillSpans)(pDraw, pGC, nInit, pptInit, pwidthInit, fSorted);
667
if(boxNotEmpty && pPriv->postRefresh)
668
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
670
(*pGC->ops->FillSpans)(pDraw, pGC, nInit, pptInit, pwidthInit, fSorted);
672
SHADOW_GC_OP_EPILOGUE(pGC);
685
SHADOW_GC_OP_PROLOGUE(pGC);
687
if(IS_VISIBLE(pDraw) && nspans) {
688
DDXPointPtr ppt = pptInit;
689
int *pwidth = pwidthInit;
692
Bool boxNotEmpty = FALSE;
695
box.x2 = box.x1 + *pwidth;
696
box.y2 = box.y1 = ppt->y;
701
if(box.x1 > ppt->x) box.x1 = ppt->x;
702
if(box.x2 < (ppt->x + *pwidth))
703
box.x2 = ppt->x + *pwidth;
704
if(box.y1 > ppt->y) box.y1 = ppt->y;
705
else if(box.y2 < ppt->y) box.y2 = ppt->y;
710
if(!pGC->miTranslate) {
711
TRANSLATE_BOX(box, pDraw);
715
if(BOX_NOT_EMPTY(box)) {
716
if(pPriv->preRefresh)
717
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
721
(*pGC->ops->SetSpans)(pDraw, pGC, pcharsrc, pptInit,
722
pwidthInit, nspans, fSorted);
724
if(boxNotEmpty && pPriv->postRefresh)
725
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
727
(*pGC->ops->SetSpans)(pDraw, pGC, pcharsrc, pptInit,
728
pwidthInit, nspans, fSorted);
730
SHADOW_GC_OP_EPILOGUE(pGC);
738
int x, int y, int w, int h,
744
Bool boxNotEmpty = FALSE;
746
SHADOW_GC_OP_PROLOGUE(pGC);
748
if(IS_VISIBLE(pDraw)) {
749
box.x1 = x + pDraw->x;
751
box.y1 = y + pDraw->y;
755
if(BOX_NOT_EMPTY(box)) {
756
if(pPriv->preRefresh)
757
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
762
(*pGC->ops->PutImage)(pDraw, pGC, depth, x, y, w, h,
763
leftPad, format, pImage);
765
if(boxNotEmpty && pPriv->postRefresh)
766
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
768
SHADOW_GC_OP_EPILOGUE(pGC);
778
int width, int height,
783
Bool boxNotEmpty = FALSE;
785
SHADOW_GC_OP_PROLOGUE(pGC);
787
if(IS_VISIBLE(pDst)) {
788
box.x1 = dstx + pDst->x;
789
box.x2 = box.x1 + width;
790
box.y1 = dsty + pDst->y;
791
box.y2 = box.y1 + height;
794
if(BOX_NOT_EMPTY(box)) {
795
if(pPriv->preRefresh)
796
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
801
ret = (*pGC->ops->CopyArea)(pSrc, pDst,
802
pGC, srcx, srcy, width, height, dstx, dsty);
804
if(boxNotEmpty && pPriv->postRefresh)
805
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
807
SHADOW_GC_OP_EPILOGUE(pGC);
818
int width, int height,
820
unsigned long bitPlane
824
Bool boxNotEmpty = FALSE;
826
SHADOW_GC_OP_PROLOGUE(pGC);
828
if(IS_VISIBLE(pDst)) {
829
box.x1 = dstx + pDst->x;
830
box.x2 = box.x1 + width;
831
box.y1 = dsty + pDst->y;
832
box.y2 = box.y1 + height;
835
if(BOX_NOT_EMPTY(box)) {
836
if(pPriv->preRefresh)
837
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
842
ret = (*pGC->ops->CopyPlane)(pSrc, pDst,
843
pGC, srcx, srcy, width, height, dstx, dsty, bitPlane);
845
if(boxNotEmpty && pPriv->postRefresh)
846
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
848
SHADOW_GC_OP_EPILOGUE(pGC);
862
Bool boxNotEmpty = FALSE;
864
SHADOW_GC_OP_PROLOGUE(pGC);
866
if(IS_VISIBLE(pDraw) && nptInit) {
867
xPoint *ppt = pptInit;
870
box.x2 = box.x1 = pptInit->x;
871
box.y2 = box.y1 = pptInit->y;
873
/* this could be slow if the points were spread out */
877
if(box.x1 > ppt->x) box.x1 = ppt->x;
878
else if(box.x2 < ppt->x) box.x2 = ppt->x;
879
if(box.y1 > ppt->y) box.y1 = ppt->y;
880
else if(box.y2 < ppt->y) box.y2 = ppt->y;
886
TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC);
887
if(BOX_NOT_EMPTY(box)) {
888
if(pPriv->preRefresh)
889
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
894
(*pGC->ops->PolyPoint)(pDraw, pGC, mode, nptInit, pptInit);
896
if(boxNotEmpty && pPriv->postRefresh)
897
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
899
SHADOW_GC_OP_EPILOGUE(pGC);
911
Bool boxNotEmpty = FALSE;
913
SHADOW_GC_OP_PROLOGUE(pGC);
915
if(IS_VISIBLE(pDraw) && nptInit) {
916
DDXPointPtr ppt = pptInit;
918
int extra = pGC->lineWidth >> 1;
920
box.x2 = box.x1 = pptInit->x;
921
box.y2 = box.y1 = pptInit->y;
924
if(pGC->joinStyle == JoinMiter)
925
extra = 6 * pGC->lineWidth;
926
else if(pGC->capStyle == CapProjecting)
927
extra = pGC->lineWidth;
930
if(mode == CoordModePrevious) {
937
if(box.x1 > x) box.x1 = x;
938
else if(box.x2 < x) box.x2 = x;
939
if(box.y1 > y) box.y1 = y;
940
else if(box.y2 < y) box.y2 = y;
945
if(box.x1 > ppt->x) box.x1 = ppt->x;
946
else if(box.x2 < ppt->x) box.x2 = ppt->x;
947
if(box.y1 > ppt->y) box.y1 = ppt->y;
948
else if(box.y2 < ppt->y) box.y2 = ppt->y;
962
TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC);
963
if(BOX_NOT_EMPTY(box)) {
964
if(pPriv->preRefresh)
965
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
970
(*pGC->ops->Polylines)(pDraw, pGC, mode, nptInit, pptInit);
972
if(boxNotEmpty && pPriv->postRefresh)
973
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
975
SHADOW_GC_OP_EPILOGUE(pGC);
986
Bool boxNotEmpty = FALSE;
988
SHADOW_GC_OP_PROLOGUE(pGC);
990
if(IS_VISIBLE(pDraw) && nsegInit) {
991
int extra = pGC->lineWidth;
992
xSegment *pSeg = pSegInit;
995
if(pGC->capStyle != CapProjecting)
998
if(pSeg->x2 > pSeg->x1) {
1006
if(pSeg->y2 > pSeg->y1) {
1016
if(pSeg->x2 > pSeg->x1) {
1017
if(pSeg->x1 < box.x1) box.x1 = pSeg->x1;
1018
if(pSeg->x2 > box.x2) box.x2 = pSeg->x2;
1020
if(pSeg->x2 < box.x1) box.x1 = pSeg->x2;
1021
if(pSeg->x1 > box.x2) box.x2 = pSeg->x1;
1023
if(pSeg->y2 > pSeg->y1) {
1024
if(pSeg->y1 < box.y1) box.y1 = pSeg->y1;
1025
if(pSeg->y2 > box.y2) box.y2 = pSeg->y2;
1027
if(pSeg->y2 < box.y1) box.y1 = pSeg->y2;
1028
if(pSeg->y1 > box.y2) box.y2 = pSeg->y1;
1042
TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC);
1043
if(BOX_NOT_EMPTY(box)) {
1044
if(pPriv->preRefresh)
1045
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
1050
(*pGC->ops->PolySegment)(pDraw, pGC, nsegInit, pSegInit);
1052
if(boxNotEmpty && pPriv->postRefresh)
1053
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
1055
SHADOW_GC_OP_EPILOGUE(pGC);
1059
ShadowPolyRectangle(
1063
xRectangle *pRectsInit
1066
BoxPtr pBoxInit = NULL;
1067
Bool boxNotEmpty = FALSE;
1070
SHADOW_GC_OP_PROLOGUE(pGC);
1072
if(IS_VISIBLE(pDraw) && nRectsInit) {
1073
xRectangle *pRects = pRectsInit;
1074
int nRects = nRectsInit;
1077
int extra = pGC->lineWidth >> 1;
1080
box.x2 = box.x1 + pRects->width;
1082
box.y2 = box.y1 + pRects->height;
1086
if(box.x1 > pRects->x) box.x1 = pRects->x;
1087
if(box.x2 < (pRects->x + pRects->width))
1088
box.x2 = pRects->x + pRects->width;
1089
if(box.y1 > pRects->y) box.y1 = pRects->y;
1090
if(box.y2 < (pRects->y + pRects->height))
1091
box.y2 = pRects->y + pRects->height;
1104
TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC);
1105
if(BOX_NOT_EMPTY(box)) {
1106
if(pPriv->preRefresh)
1107
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
1112
int offset1, offset2, offset3;
1114
offset2 = pGC->lineWidth;
1115
if(!offset2) offset2 = 1;
1116
offset1 = offset2 >> 1;
1117
offset3 = offset2 - offset1;
1119
pBoxInit = (BoxPtr)ALLOCATE_LOCAL(nRects * 4 * sizeof(BoxRec));
1123
pbox->x1 = pRects->x - offset1;
1124
pbox->y1 = pRects->y - offset1;
1125
pbox->x2 = pbox->x1 + pRects->width + offset2;
1126
pbox->y2 = pbox->y1 + offset2;
1127
TRIM_AND_TRANSLATE_BOX((*pbox), pDraw, pGC);
1128
if(BOX_NOT_EMPTY((*pbox))) {
1133
pbox->x1 = pRects->x - offset1;
1134
pbox->y1 = pRects->y + offset3;
1135
pbox->x2 = pbox->x1 + offset2;
1136
pbox->y2 = pbox->y1 + pRects->height - offset2;
1137
TRIM_AND_TRANSLATE_BOX((*pbox), pDraw, pGC);
1138
if(BOX_NOT_EMPTY((*pbox))) {
1143
pbox->x1 = pRects->x + pRects->width - offset1;
1144
pbox->y1 = pRects->y + offset3;
1145
pbox->x2 = pbox->x1 + offset2;
1146
pbox->y2 = pbox->y1 + pRects->height - offset2;
1147
TRIM_AND_TRANSLATE_BOX((*pbox), pDraw, pGC);
1148
if(BOX_NOT_EMPTY((*pbox))) {
1153
pbox->x1 = pRects->x - offset1;
1154
pbox->y1 = pRects->y + pRects->height - offset1;
1155
pbox->x2 = pbox->x1 + pRects->width + offset2;
1156
pbox->y2 = pbox->y1 + offset2;
1157
TRIM_AND_TRANSLATE_BOX((*pbox), pDraw, pGC);
1158
if(BOX_NOT_EMPTY((*pbox))) {
1167
if(pPriv->preRefresh)
1168
(*pPriv->preRefresh)(pPriv->pScrn, num, pBoxInit);
1170
DEALLOCATE_LOCAL(pBoxInit);
1175
(*pGC->ops->PolyRectangle)(pDraw, pGC, nRectsInit, pRectsInit);
1177
if(boxNotEmpty && pPriv->postRefresh) {
1178
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
1180
if(pPriv->postRefresh)
1181
(*pPriv->postRefresh)(pPriv->pScrn, num, pBoxInit);
1182
DEALLOCATE_LOCAL(pBoxInit);
1185
SHADOW_GC_OP_EPILOGUE(pGC);
1197
Bool boxNotEmpty = FALSE;
1199
SHADOW_GC_OP_PROLOGUE(pGC);
1201
if(IS_VISIBLE(pDraw) && narcsInit) {
1202
int narcs = narcsInit;
1203
xArc *parcs = parcsInit;
1204
int extra = pGC->lineWidth >> 1;
1207
box.x2 = box.x1 + parcs->width;
1209
box.y2 = box.y1 + parcs->height;
1211
/* should I break these up instead ? */
1215
if(box.x1 > parcs->x) box.x1 = parcs->x;
1216
if(box.x2 < (parcs->x + parcs->width))
1217
box.x2 = parcs->x + parcs->width;
1218
if(box.y1 > parcs->y) box.y1 = parcs->y;
1219
if(box.y2 < (parcs->y + parcs->height))
1220
box.y2 = parcs->y + parcs->height;
1233
TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC);
1234
if(BOX_NOT_EMPTY(box)) {
1235
if(pPriv->preRefresh)
1236
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
1241
(*pGC->ops->PolyArc)(pDraw, pGC, narcsInit, parcsInit);
1243
if(boxNotEmpty && pPriv->postRefresh)
1244
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
1246
SHADOW_GC_OP_EPILOGUE(pGC);
1259
SHADOW_GC_OP_PROLOGUE(pGC);
1261
if(IS_VISIBLE(pDraw) && (count > 2)) {
1262
DDXPointPtr ppt = pptInit;
1265
Bool boxNotEmpty = FALSE;
1267
box.x2 = box.x1 = ppt->x;
1268
box.y2 = box.y1 = ppt->y;
1270
if(mode != CoordModeOrigin) {
1277
if(box.x1 > x) box.x1 = x;
1278
else if(box.x2 < x) box.x2 = x;
1279
if(box.y1 > y) box.y1 = y;
1280
else if(box.y2 < y) box.y2 = y;
1285
if(box.x1 > ppt->x) box.x1 = ppt->x;
1286
else if(box.x2 < ppt->x) box.x2 = ppt->x;
1287
if(box.y1 > ppt->y) box.y1 = ppt->y;
1288
else if(box.y2 < ppt->y) box.y2 = ppt->y;
1295
TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC);
1296
if(BOX_NOT_EMPTY(box)) {
1297
if(pPriv->preRefresh)
1298
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
1302
(*pGC->ops->FillPolygon)(pDraw, pGC, shape, mode, count, pptInit);
1304
if(boxNotEmpty && pPriv->postRefresh)
1305
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
1307
(*pGC->ops->FillPolygon)(pDraw, pGC, shape, mode, count, pptInit);
1309
SHADOW_GC_OP_EPILOGUE(pGC);
1318
xRectangle *pRectsInit
1320
SHADOW_GC_OP_PROLOGUE(pGC);
1322
if(IS_VISIBLE(pDraw) && nRectsInit) {
1324
Bool boxNotEmpty = FALSE;
1325
xRectangle *pRects = pRectsInit;
1326
int nRects = nRectsInit;
1329
box.x2 = box.x1 + pRects->width;
1331
box.y2 = box.y1 + pRects->height;
1335
if(box.x1 > pRects->x) box.x1 = pRects->x;
1336
if(box.x2 < (pRects->x + pRects->width))
1337
box.x2 = pRects->x + pRects->width;
1338
if(box.y1 > pRects->y) box.y1 = pRects->y;
1339
if(box.y2 < (pRects->y + pRects->height))
1340
box.y2 = pRects->y + pRects->height;
1343
/* cfb messes with the pRectsInit so we have to do our
1344
calculations first */
1346
TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC);
1347
if(BOX_NOT_EMPTY(box)) {
1348
if(pPriv->preRefresh)
1349
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
1353
(*pGC->ops->PolyFillRect)(pDraw, pGC, nRectsInit, pRectsInit);
1355
if(boxNotEmpty && pPriv->postRefresh)
1356
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
1358
(*pGC->ops->PolyFillRect)(pDraw, pGC, nRectsInit, pRectsInit);
1360
SHADOW_GC_OP_EPILOGUE(pGC);
1372
Bool boxNotEmpty = FALSE;
1374
SHADOW_GC_OP_PROLOGUE(pGC);
1376
if(IS_VISIBLE(pDraw) && narcsInit) {
1377
xArc *parcs = parcsInit;
1378
int narcs = narcsInit;
1381
box.x2 = box.x1 + parcs->width;
1383
box.y2 = box.y1 + parcs->height;
1385
/* should I break these up instead ? */
1389
if(box.x1 > parcs->x) box.x1 = parcs->x;
1390
if(box.x2 < (parcs->x + parcs->width))
1391
box.x2 = parcs->x + parcs->width;
1392
if(box.y1 > parcs->y) box.y1 = parcs->y;
1393
if(box.y2 < (parcs->y + parcs->height))
1394
box.y2 = parcs->y + parcs->height;
1397
TRIM_AND_TRANSLATE_BOX(box, pDraw, pGC);
1398
if(BOX_NOT_EMPTY(box)) {
1399
if(pPriv->preRefresh)
1400
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
1405
(*pGC->ops->PolyFillArc)(pDraw, pGC, narcsInit, parcsInit);
1407
if(boxNotEmpty && pPriv->postRefresh)
1408
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
1410
SHADOW_GC_OP_EPILOGUE(pGC);
1414
ShadowTextExtent(FontPtr pFont, int count, char* chars,
1415
FontEncoding fontEncoding, BoxPtr box)
1419
CharInfoPtr charinfo[255]; /* encoding only has 1 byte for count */
1421
GetGlyphs(pFont, (unsigned long)count, (unsigned char *)chars,
1422
fontEncoding, &n, charinfo);
1424
for (i=0; i < n; i++) {
1425
w += charinfo[i]->metrics.characterWidth;
1428
w += charinfo[i - 1]->metrics.rightSideBearing;
1433
if (charinfo[0]->metrics.leftSideBearing < 0) {
1434
box->x1 = charinfo[0]->metrics.leftSideBearing;
1438
box->y1 = -FONTMAXBOUNDS(pFont,ascent);
1439
box->y2 = FONTMAXBOUNDS(pFont,descent);
1445
ShadowFontToBox(BoxPtr BB, DrawablePtr pDrawable, GCPtr pGC, int x, int y,
1446
int count, char *chars, int wide)
1451
if (pFont->info.constantWidth) {
1452
int ascent, descent, left, right = 0;
1454
ascent = MAX(pFont->info.fontAscent, pFont->info.maxbounds.ascent);
1455
descent = MAX(pFont->info.fontDescent, pFont->info.maxbounds.descent);
1456
left = pFont->info.maxbounds.leftSideBearing;
1458
right = (count - 1) * pFont->info.maxbounds.characterWidth;
1460
right += pFont->info.maxbounds.rightSideBearing;
1462
MAX(pDrawable->x + x - left, (REGION_EXTENTS(pGC->pScreen,
1463
&((WindowPtr) pDrawable)->winSize))->x1);
1465
MAX(pDrawable->y + y - ascent,
1466
(REGION_EXTENTS(pGC->pScreen,
1467
&((WindowPtr) pDrawable)->winSize))->y1);
1469
MIN(pDrawable->x + x + right,
1470
(REGION_EXTENTS(pGC->pScreen,
1471
&((WindowPtr) pDrawable)->winSize))->x2);
1473
MIN(pDrawable->y + y + descent,
1474
(REGION_EXTENTS(pGC->pScreen,
1475
&((WindowPtr) pDrawable)->winSize))->y2);
1477
ShadowTextExtent(pFont, count, chars, wide ? (FONTLASTROW(pFont) == 0)
1478
? Linear16Bit : TwoD16Bit : Linear8Bit, BB);
1480
MAX(pDrawable->x + x + BB->x1, (REGION_EXTENTS(pGC->pScreen,
1481
&((WindowPtr) pDrawable)->winSize))->x1);
1483
MAX(pDrawable->y + y + BB->y1,
1484
(REGION_EXTENTS(pGC->pScreen,
1485
&((WindowPtr) pDrawable)->winSize))->y1);
1487
MIN(pDrawable->x + x + BB->x2,
1488
(REGION_EXTENTS(pGC->pScreen,
1489
&((WindowPtr) pDrawable)->winSize))->x2);
1491
MIN(pDrawable->y + y + BB->y2,
1492
(REGION_EXTENTS(pGC->pScreen,
1493
&((WindowPtr) pDrawable)->winSize))->y2);
1508
Bool boxNotEmpty = FALSE;
1510
SHADOW_GC_OP_PROLOGUE(pGC);
1512
if(IS_VISIBLE(pDraw)) {
1513
ShadowFontToBox(&box, pDraw, pGC, x, y, count, chars, 0);
1516
if(BOX_NOT_EMPTY(box)) {
1517
if(pPriv->preRefresh)
1518
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
1523
width = (*pGC->ops->PolyText8)(pDraw, pGC, x, y, count, chars);
1525
if(boxNotEmpty && pPriv->postRefresh)
1526
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
1528
SHADOW_GC_OP_EPILOGUE(pGC);
1540
unsigned short *chars
1544
Bool boxNotEmpty = FALSE;
1546
SHADOW_GC_OP_PROLOGUE(pGC);
1548
if(IS_VISIBLE(pDraw)) {
1549
ShadowFontToBox(&box, pDraw, pGC, x, y, count, (char*)chars, 1);
1552
if(BOX_NOT_EMPTY(box)) {
1553
if(pPriv->preRefresh)
1554
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
1559
width = (*pGC->ops->PolyText16)(pDraw, pGC, x, y, count, chars);
1561
if(boxNotEmpty && pPriv->postRefresh)
1562
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
1564
SHADOW_GC_OP_EPILOGUE(pGC);
1579
Bool boxNotEmpty = FALSE;
1580
SHADOW_GC_OP_PROLOGUE(pGC);
1582
if(IS_VISIBLE(pDraw) && count) {
1583
int top, bot, Min, Max;
1585
top = max(FONTMAXBOUNDS(pGC->font, ascent), FONTASCENT(pGC->font));
1586
bot = max(FONTMAXBOUNDS(pGC->font, descent), FONTDESCENT(pGC->font));
1588
Min = count * FONTMINBOUNDS(pGC->font, characterWidth);
1589
if(Min > 0) Min = 0;
1590
Max = count * FONTMAXBOUNDS(pGC->font, characterWidth);
1591
if(Max < 0) Max = 0;
1594
box.x1 = pDraw->x + x + Min +
1595
FONTMINBOUNDS(pGC->font, leftSideBearing);
1596
box.x2 = pDraw->x + x + Max +
1597
FONTMAXBOUNDS(pGC->font, rightSideBearing);
1599
box.y1 = pDraw->y + y - top;
1600
box.y2 = pDraw->y + y + bot;
1603
if(BOX_NOT_EMPTY(box)) {
1604
if(pPriv->preRefresh)
1605
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
1610
(*pGC->ops->ImageText8)(pDraw, pGC, x, y, count, chars);
1612
if(boxNotEmpty && pPriv->postRefresh)
1613
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
1615
SHADOW_GC_OP_EPILOGUE(pGC);
1624
unsigned short *chars
1627
Bool boxNotEmpty = FALSE;
1628
SHADOW_GC_OP_PROLOGUE(pGC);
1630
if(IS_VISIBLE(pDraw) && count) {
1631
int top, bot, Min, Max;
1633
top = max(FONTMAXBOUNDS(pGC->font, ascent), FONTASCENT(pGC->font));
1634
bot = max(FONTMAXBOUNDS(pGC->font, descent), FONTDESCENT(pGC->font));
1636
Min = count * FONTMINBOUNDS(pGC->font, characterWidth);
1637
if(Min > 0) Min = 0;
1638
Max = count * FONTMAXBOUNDS(pGC->font, characterWidth);
1639
if(Max < 0) Max = 0;
1642
box.x1 = pDraw->x + x + Min +
1643
FONTMINBOUNDS(pGC->font, leftSideBearing);
1644
box.x2 = pDraw->x + x + Max +
1645
FONTMAXBOUNDS(pGC->font, rightSideBearing);
1647
box.y1 = pDraw->y + y - top;
1648
box.y2 = pDraw->y + y + bot;
1651
if(BOX_NOT_EMPTY(box)) {
1652
if(pPriv->preRefresh)
1653
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
1658
(*pGC->ops->ImageText16)(pDraw, pGC, x, y, count, chars);
1660
if(boxNotEmpty && pPriv->postRefresh)
1661
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
1663
SHADOW_GC_OP_EPILOGUE(pGC);
1668
ShadowImageGlyphBlt(
1672
unsigned int nglyphInit,
1673
CharInfoPtr *ppciInit,
1677
Bool boxNotEmpty = FALSE;
1678
SHADOW_GC_OP_PROLOGUE(pGC);
1680
if(IS_VISIBLE(pDraw) && nglyphInit) {
1681
CharInfoPtr *ppci = ppciInit;
1682
unsigned int nglyph = nglyphInit;
1683
int top, bot, width = 0;
1685
top = max(FONTMAXBOUNDS(pGC->font, ascent), FONTASCENT(pGC->font));
1686
bot = max(FONTMAXBOUNDS(pGC->font, descent), FONTDESCENT(pGC->font));
1688
box.x1 = ppci[0]->metrics.leftSideBearing;
1689
if(box.x1 > 0) box.x1 = 0;
1690
box.x2 = ppci[nglyph - 1]->metrics.rightSideBearing -
1691
ppci[nglyph - 1]->metrics.characterWidth;
1692
if(box.x2 < 0) box.x2 = 0;
1694
box.x2 += pDraw->x + x;
1695
box.x1 += pDraw->x + x;
1698
width += (*ppci)->metrics.characterWidth;
1707
box.y1 = pDraw->y + y - top;
1708
box.y2 = pDraw->y + y + bot;
1711
if(BOX_NOT_EMPTY(box)) {
1712
if(pPriv->preRefresh)
1713
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
1718
(*pGC->ops->ImageGlyphBlt)(pDraw, pGC, x, y, nglyphInit,
1719
ppciInit, pglyphBase);
1721
if(boxNotEmpty && pPriv->postRefresh)
1722
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
1724
SHADOW_GC_OP_EPILOGUE(pGC);
1732
unsigned int nglyphInit,
1733
CharInfoPtr *ppciInit,
1737
Bool boxNotEmpty = FALSE;
1739
SHADOW_GC_OP_PROLOGUE(pGC);
1741
if(IS_VISIBLE(pDraw) && nglyphInit) {
1742
CharInfoPtr *ppci = ppciInit;
1743
unsigned int nglyph = nglyphInit;
1746
box.x1 = pDraw->x + x + ppci[0]->metrics.leftSideBearing;
1747
box.x2 = pDraw->x + x + ppci[nglyph - 1]->metrics.rightSideBearing;
1753
width += (*ppci)->metrics.characterWidth;
1757
if(width > 0) box.x2 += width;
1758
else box.x1 += width;
1761
box.y1 = pDraw->y + y - FONTMAXBOUNDS(pGC->font, ascent);
1762
box.y2 = pDraw->y + y + FONTMAXBOUNDS(pGC->font, descent);
1765
if(BOX_NOT_EMPTY(box)) {
1766
if(pPriv->preRefresh)
1767
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
1772
(*pGC->ops->PolyGlyphBlt)(pDraw, pGC, x, y, nglyphInit,
1773
ppciInit, pglyphBase);
1775
if(boxNotEmpty && pPriv->postRefresh)
1776
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
1778
SHADOW_GC_OP_EPILOGUE(pGC);
1786
int dx, int dy, int xOrg, int yOrg
1789
Bool boxNotEmpty = FALSE;
1791
SHADOW_GC_OP_PROLOGUE(pGC);
1793
if(IS_VISIBLE(pDraw)) {
1797
if(!pGC->miTranslate) {
1802
box.x2 = box.x1 + dx;
1803
box.y2 = box.y1 + dy;
1806
if(BOX_NOT_EMPTY(box)) {
1807
if(pPriv->preRefresh)
1808
(*pPriv->preRefresh)(pPriv->pScrn, 1, &box);
1813
(*pGC->ops->PushPixels)(pGC, pBitMap, pDraw, dx, dy, xOrg, yOrg);
1815
if(boxNotEmpty && pPriv->postRefresh)
1816
(*pPriv->postRefresh)(pPriv->pScrn, 1, &box);
1818
SHADOW_GC_OP_EPILOGUE(pGC);
1822
GCOps ShadowGCOps = {
1823
ShadowFillSpans, ShadowSetSpans,
1824
ShadowPutImage, ShadowCopyArea,
1825
ShadowCopyPlane, ShadowPolyPoint,
1826
ShadowPolylines, ShadowPolySegment,
1827
ShadowPolyRectangle, ShadowPolyArc,
1828
ShadowFillPolygon, ShadowPolyFillRect,
1829
ShadowPolyFillArc, ShadowPolyText8,
1830
ShadowPolyText16, ShadowImageText8,
1831
ShadowImageText16, ShadowImageGlyphBlt,
1832
ShadowPolyGlyphBlt, ShadowPushPixels,
1833
#ifdef NEED_LINEHELPER
1836
{NULL} /* devPrivate */