Annotation of researchv9/X11/src/X.V11R1/server/ddx/sun/sunGC.c, revision 1.1

1.1     ! root        1: /*-
        !             2:  * sunGC.c --
        !             3:  *     Functions to support the meddling with GC's we do to preserve
        !             4:  *     the software cursor...
        !             5:  *
        !             6:  * Copyright (c) 1987 by the Regents of the University of California
        !             7:  *
        !             8:  * Permission to use, copy, modify, and distribute this
        !             9:  * software and its documentation for any purpose and without
        !            10:  * fee is hereby granted, provided that the above copyright
        !            11:  * notice appear in all copies.  The University of California
        !            12:  * makes no representations about the suitability of this
        !            13:  * software for any purpose.  It is provided "as is" without
        !            14:  * express or implied warranty.
        !            15:  *
        !            16:  *
        !            17:  */
        !            18: #ifndef lint
        !            19: static char rcsid[] =
        !            20:        "$Header: sunGC.c,v 4.2 87/09/12 21:43:53 sun Exp $ SPRITE (Berkeley)";
        !            21: #endif lint
        !            22: 
        !            23: #include    "sun.h"
        !            24: 
        !            25: #include    "X.h"
        !            26: #include    "Xmd.h"
        !            27: #include    "extnsionst.h"
        !            28: #include    "regionstr.h"
        !            29: #include    "windowstr.h"
        !            30: #include    "fontstruct.h"
        !            31: #include    "dixfontstr.h"
        !            32: #include    "../mi/mifpoly.h"          /* for SppPointPtr */
        !            33: 
        !            34: /*
        !            35:  * Overlap BoxPtr and Box elements
        !            36:  */
        !            37: #define BOX_OVERLAP(pCbox,X1,Y1,X2,Y2) \
        !            38:        (((pCbox)->x1 <= (X2)) && ((X1) <= (pCbox)->x2) && \
        !            39:         ((pCbox)->y1 <= (Y2)) && ((Y1) <= (pCbox)->y2))
        !            40: 
        !            41: /*
        !            42:  * Overlap BoxPtr, origins, and rectangle
        !            43:  */
        !            44: #define ORG_OVERLAP(pCbox,xorg,yorg,x,y,w,h) \
        !            45:     BOX_OVERLAP((pCbox),(x)+(xorg),(y)+(yorg),(x)+(xorg)+(w),(y)+(yorg)+(h))
        !            46: 
        !            47: /*
        !            48:  * Overlap BoxPtr, origins and RectPtr
        !            49:  */
        !            50: #define ORGRECT_OVERLAP(pCbox,xorg,yorg,pRect) \
        !            51:     ORG_OVERLAP((pCbox),(xorg),(yorg),(pRect)->x,(pRect)->y,(pRect)->width, \
        !            52:                (pRect)->height)
        !            53: /*
        !            54:  * Overlap BoxPtr and horizontal span
        !            55:  */
        !            56: #define SPN_OVERLAP(pCbox,y,x,w) BOX_OVERLAP((pCbox),(x),(y),(x)+(w),(y))
        !            57: 
        !            58: 
        !            59: #ifdef notdef
        !            60: #define        COMPARE_GCS(g1, g2)     compare_gcs(g1, g2)
        !            61: 
        !            62: static
        !            63: compare_gcs(g1, g2)
        !            64: GCPtr g1, g2;
        !            65: {
        !            66:     if (g1->pScreen != g2->pScreen) FatalError("GC and Shadow mis-match - pScreen\n");
        !            67:     if (g1->depth != g2->depth) FatalError("GC and Shadow mis-match - depth\n");
        !            68: #ifdef notdef
        !            69:     if (g1->serialNumber != g2->serialNumber) FatalError("GC and Shadow mis-match - serialNumber\n");
        !            70: #endif
        !            71:     if (g1->alu != g2->alu) FatalError("GC and Shadow mis-match - alu\n");
        !            72:     if (g1->planemask != g2->planemask) FatalError("GC and Shadow mis-match - planemask\n");
        !            73:     if (g1->fgPixel != g2->fgPixel) FatalError("GC and Shadow mis-match - fgPixel\n");
        !            74:     if (g1->bgPixel != g2->bgPixel) FatalError("GC and Shadow mis-match - bgPixel\n");
        !            75:     if (g1->lineWidth != g2->lineWidth) FatalError("GC and Shadow mis-match - lineWidth\n");
        !            76:     if (g1->lineStyle != g2->lineStyle) FatalError("GC and Shadow mis-match - lineStyle\n");
        !            77:     if (g1->capStyle != g2->capStyle) FatalError("GC and Shadow mis-match - capStyle\n");
        !            78:     if (g1->joinStyle != g2->joinStyle) FatalError("GC and Shadow mis-match - joinStyle\n");
        !            79:     if (g1->fillStyle != g2->fillStyle) FatalError("GC and Shadow mis-match - fillStyle\n");
        !            80:     if (g1->fillRule != g2->fillRule) FatalError("GC and Shadow mis-match - fillRule\n");
        !            81:     if (g1->arcMode != g2->arcMode) FatalError("GC and Shadow mis-match - arcMode\n");
        !            82:     if (g1->tile != g2->tile) FatalError("GC and Shadow mis-match - tile\n");
        !            83:     if (g1->stipple != g2->stipple) FatalError("GC and Shadow mis-match - stipple\n");
        !            84:     if (g1->patOrg.x != g2->patOrg.x) FatalError("GC and Shadow mis-match - patOrg.x\n");
        !            85:     if (g1->patOrg.y != g2->patOrg.y) FatalError("GC and Shadow mis-match - patOrg.y\n");
        !            86:     if (g1->font != g2->font) FatalError("GC and Shadow mis-match - font\n");
        !            87:     if (g1->subWindowMode != g2->subWindowMode) FatalError("GC and Shadow mis-match - subWindowMode\n");
        !            88:     if (g1->graphicsExposures != g2->graphicsExposures) FatalError("GC and Shadow mis-match - graphicsExposures\n");
        !            89:     if (g1->clipOrg.x != g2->clipOrg.x) FatalError("GC and Shadow mis-match - clipOrg.x\n");
        !            90:     if (g1->clipOrg.y != g2->clipOrg.y) FatalError("GC and Shadow mis-match - clipOrg.y\n");
        !            91: #ifdef notdef
        !            92:     if (g1->clientClip != g2->clientClip) FatalError("GC and Shadow mis-match - clientClip\n");
        !            93: #endif
        !            94:     if (g1->clientClipType != g2->clientClipType) FatalError("GC and Shadow mis-match - clientClipType\n");
        !            95:     if (g1->dashOffset != g2->dashOffset) FatalError("GC and Shadow mis-match - dashOffset\n");
        !            96:     if (g1->numInDashList != g2->numInDashList) FatalError("GC and Shadow mis-match - numInDashList\n");
        !            97: #ifdef notdef
        !            98:     if (g1->dash != g2->dash) FatalError("GC and Shadow mis-match - dash\n");
        !            99:     if (g1->stateChanges != g2->stateChanges) FatalError("GC and Shadow mis-match - stateChanges\n");
        !           100: #endif
        !           101:     if (g1->lastWinOrg.x != g2->lastWinOrg.x) FatalError("GC and Shadow mis-match - lastWinOrg.x\n");
        !           102:     if (g1->lastWinOrg.y != g2->lastWinOrg.y) FatalError("GC and Shadow mis-match - lastWinOrg.y\n");
        !           103:     if (g1->miTranslate != g2->miTranslate) FatalError("GC and Shadow mis-match - miTranslate\n");
        !           104: 
        !           105: }
        !           106: #else
        !           107: #define        COMPARE_GCS(g1, g2)
        !           108: #endif
        !           109: 
        !           110: 
        !           111: /*-
        !           112:  *-----------------------------------------------------------------------
        !           113:  * sunSaveCursorBox --
        !           114:  *     Given an array of points, figure out the bounding box for the
        !           115:  *     series and remove the cursor if it overlaps that box.
        !           116:  *
        !           117:  * Results:
        !           118:  *
        !           119:  * Side Effects:
        !           120:  *
        !           121:  *-----------------------------------------------------------------------
        !           122:  */
        !           123: void
        !           124: sunSaveCursorBox (xorg, yorg, mode, pPts, nPts, pCursorBox)
        !           125:     register int           xorg;           /* X-Origin for points */
        !           126:     register int           yorg;           /* Y-Origin for points */
        !           127:     int                            mode;           /* CoordModeOrigin or
        !           128:                                             * CoordModePrevious */
        !           129:     register DDXPointPtr    pPts;          /* Array of points */
        !           130:     int                            nPts;           /* Number of points */
        !           131:     register BoxPtr        pCursorBox;     /* Bounding box for cursor */
        !           132: {
        !           133:     register int           minx,
        !           134:                            miny,
        !           135:                            maxx,
        !           136:                            maxy;
        !           137: 
        !           138:     minx = maxx = pPts->x + xorg;
        !           139:     miny = maxy = pPts->y + yorg;
        !           140: 
        !           141:     pPts++;
        !           142:     nPts--;
        !           143: 
        !           144:     if (mode == CoordModeOrigin) {
        !           145:        while (nPts--) {
        !           146:            minx = min(minx, pPts->x + xorg);
        !           147:            maxx = max(maxx, pPts->x + xorg);
        !           148:            miny = min(miny, pPts->y + yorg);
        !           149:            maxy = max(maxy, pPts->y + yorg);
        !           150:            pPts++;
        !           151:        }
        !           152:     } else {
        !           153:        xorg = minx;
        !           154:        yorg = miny;
        !           155:        while (nPts--) {
        !           156:            minx = min(minx, pPts->x + xorg);
        !           157:            maxx = max(maxx, pPts->x + xorg);
        !           158:            miny = min(miny, pPts->y + yorg);
        !           159:            maxy = max(maxy, pPts->y + yorg);
        !           160:            xorg += pPts->x;
        !           161:            yorg += pPts->y;
        !           162:            pPts++;
        !           163:        }
        !           164:     }
        !           165:     if (BOX_OVERLAP(pCursorBox,minx,miny,maxx,maxy)) {
        !           166:        sunRemoveCursor();
        !           167:     }
        !           168: }
        !           169:                       
        !           170: /*-
        !           171:  *-----------------------------------------------------------------------
        !           172:  * sunFillSpans --
        !           173:  *     Remove the cursor if any of the spans overlaps the area covered
        !           174:  *     by the cursor. This assumes the points have been translated
        !           175:  *     already, though perhaps it shouldn't...
        !           176:  *
        !           177:  * Results:
        !           178:  *     None.
        !           179:  *
        !           180:  * Side Effects:
        !           181:  *
        !           182:  *-----------------------------------------------------------------------
        !           183:  */
        !           184: void
        !           185: sunFillSpans(pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted)
        !           186:     DrawablePtr pDrawable;
        !           187:     GCPtr      pGC;
        !           188:     int                nInit;                  /* number of spans to fill */
        !           189:     DDXPointPtr pptInit;               /* pointer to list of start points */
        !           190:     int                *pwidthInit;            /* pointer to list of n widths */
        !           191:     int        fSorted;
        !           192: {
        !           193:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !           194: 
        !           195:     if (pDrawable->type == DRAWABLE_WINDOW) {
        !           196:        BoxRec    cursorBox;
        !           197: 
        !           198:        if (sunCursorLoc (pDrawable->pScreen, &cursorBox)) {
        !           199:            register DDXPointPtr    pts;
        !           200:            register int            *widths;
        !           201:            register int            nPts;
        !           202: 
        !           203:            for (pts = pptInit, widths = pwidthInit, nPts = nInit;
        !           204:                 nPts--;
        !           205:                 pts++, widths++) {
        !           206:                     if (SPN_OVERLAP(&cursorBox,pts->y,pts->x,*widths)) {
        !           207:                         sunRemoveCursor();
        !           208:                         break;
        !           209:                     }
        !           210:            }
        !           211:        }
        !           212:     }
        !           213: 
        !           214:     COMPARE_GCS(pGC,pShadowGC);
        !           215:     (* pShadowGC->FillSpans)(pDrawable, pShadowGC, nInit, pptInit,
        !           216:                             pwidthInit, fSorted);
        !           217: }
        !           218: 
        !           219: /*-
        !           220:  *-----------------------------------------------------------------------
        !           221:  * sunSetSpans --
        !           222:  *     Remove the cursor if any of the horizontal segments overlaps
        !           223:  *     the area covered by the cursor. This also assumes the spans
        !           224:  *     have been translated from the window's coordinates to the
        !           225:  *     screen's.
        !           226:  * Results:
        !           227:  *     None.
        !           228:  *
        !           229:  * Side Effects:
        !           230:  *
        !           231:  *-----------------------------------------------------------------------
        !           232:  */
        !           233: void
        !           234: sunSetSpans(pDrawable, pGC, psrc, ppt, pwidth, nspans, fSorted)
        !           235:     DrawablePtr                pDrawable;
        !           236:     GCPtr              pGC;
        !           237:     int                        *psrc;
        !           238:     register DDXPointPtr ppt;
        !           239:     int                        *pwidth;
        !           240:     int                        nspans;
        !           241:     int                        fSorted;
        !           242: {
        !           243:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !           244: 
        !           245:     if (pDrawable->type == DRAWABLE_WINDOW) {
        !           246:        BoxRec    cursorBox;
        !           247: 
        !           248:        if (sunCursorLoc (pDrawable->pScreen, &cursorBox)) {
        !           249:            register DDXPointPtr    pts;
        !           250:            register int            *widths;
        !           251:            register int            nPts;
        !           252: 
        !           253:            for (pts = ppt, widths = pwidth, nPts = nspans;
        !           254:                 nPts--;
        !           255:                 pts++, widths++) {
        !           256:                     if (SPN_OVERLAP(&cursorBox,pts->y,pts->x,*widths)) {
        !           257:                         sunRemoveCursor();
        !           258:                         break;
        !           259:                     }
        !           260:            }
        !           261:        }
        !           262:     }
        !           263: 
        !           264:     COMPARE_GCS(pGC,pShadowGC);
        !           265:     (* pShadowGC->SetSpans) (pDrawable, pShadowGC, psrc, ppt, pwidth,
        !           266:                             nspans, fSorted);
        !           267: }
        !           268: 
        !           269: /*-
        !           270:  *-----------------------------------------------------------------------
        !           271:  * sunGetSpans --
        !           272:  *     Remove the cursor if any of the desired spans overlaps the cursor.
        !           273:  *
        !           274:  * Results:
        !           275:  *
        !           276:  * Side Effects:
        !           277:  *
        !           278:  *-----------------------------------------------------------------------
        !           279:  */
        !           280: unsigned int *
        !           281: sunGetSpans(pDrawable, wMax, ppt, pwidth, nspans)
        !           282:     DrawablePtr                pDrawable;      /* drawable from which to get bits */
        !           283:     int                        wMax;           /* largest value of all *pwidths */
        !           284:     register DDXPointPtr ppt;          /* points to start copying from */
        !           285:     int                        *pwidth;        /* list of number of bits to copy */
        !           286:     int                        nspans;         /* number of scanlines to copy */
        !           287: {
        !           288:     if (pDrawable->type == DRAWABLE_WINDOW) {
        !           289:        BoxRec    cursorBox;
        !           290: 
        !           291:        if (sunCursorLoc (pDrawable->pScreen, &cursorBox)) {
        !           292:            register DDXPointPtr    pts;
        !           293:            register int            *widths;
        !           294:            register int            nPts;
        !           295:            register int            xorg,
        !           296:                                    yorg;
        !           297: 
        !           298:            xorg = ((WindowPtr)pDrawable)->absCorner.x;
        !           299:            yorg = ((WindowPtr)pDrawable)->absCorner.y;
        !           300: 
        !           301:            for (pts = ppt, widths = pwidth, nPts = nspans;
        !           302:                 nPts--;
        !           303:                 pts++, widths++) {
        !           304:                     if (SPN_OVERLAP(&cursorBox,pts->y+yorg,
        !           305:                                     pts->x+xorg,*widths)) {
        !           306:                                         sunRemoveCursor();
        !           307:                                         break;
        !           308:                     }
        !           309:            }
        !           310:        }
        !           311:     }
        !           312: 
        !           313:     /*
        !           314:      * XXX: Because we have no way to get at the GC used to call us,
        !           315:      * we must rely on the GetSpans vector never changing and stick it
        !           316:      * in the fbFd structure. Gross.
        !           317:      */
        !           318:     return (* sunFbs[pDrawable->pScreen->myNum].GetSpans)(pDrawable, wMax,
        !           319:                                                          ppt, pwidth, nspans);
        !           320: }
        !           321: 
        !           322: /*-
        !           323:  *-----------------------------------------------------------------------
        !           324:  * sunPutImage --
        !           325:  *     Remove the cursor if it is in the way of the image to be
        !           326:  *     put down...
        !           327:  *
        !           328:  * Results:
        !           329:  *     None.
        !           330:  *
        !           331:  * Side Effects:
        !           332:  *
        !           333:  *-----------------------------------------------------------------------
        !           334:  */
        !           335: void
        !           336: sunPutImage(pDst, pGC, depth, x, y, w, h, leftPad, format, pBits)
        !           337:     DrawablePtr          pDst;
        !           338:     GCPtr        pGC;
        !           339:     int                  depth;
        !           340:     int                  x;
        !           341:     int                  y;
        !           342:     int                  w;
        !           343:     int                  h;
        !           344:     int                  format;
        !           345:     char         *pBits;
        !           346: {
        !           347:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !           348: 
        !           349:     if (pDst->type == DRAWABLE_WINDOW) {
        !           350:        BoxRec    cursorBox;
        !           351:        if (sunCursorLoc (pDst->pScreen, &cursorBox)) {
        !           352:            register WindowPtr pWin = (WindowPtr)pDst;
        !           353: 
        !           354:            if (ORG_OVERLAP(&cursorBox,pWin->absCorner.x,pWin->absCorner.y,
        !           355:                            x,y,w,h)) {
        !           356:                                sunRemoveCursor();
        !           357:            }
        !           358:        }
        !           359:     }
        !           360: 
        !           361:     COMPARE_GCS(pGC,pShadowGC);
        !           362:     (* pShadowGC->PutImage) (pDst, pShadowGC, depth, x, y, w, h,
        !           363:                             leftPad, format, pBits);
        !           364: }
        !           365: 
        !           366: /*-
        !           367:  *-----------------------------------------------------------------------
        !           368:  * sunGetImage --
        !           369:  *     Remove the cursor if it overlaps the image to be gotten.
        !           370:  *
        !           371:  * Results:
        !           372:  *     None.
        !           373:  *
        !           374:  * Side Effects:
        !           375:  *
        !           376:  *-----------------------------------------------------------------------
        !           377:  */
        !           378: void
        !           379: sunGetImage (pSrc, x, y, w, h, format, planeMask, pBits)
        !           380:     DrawablePtr          pSrc;
        !           381:     int                  x;
        !           382:     int                  y;
        !           383:     int                  w;
        !           384:     int                  h;
        !           385:     unsigned int  format;
        !           386:     unsigned int  planeMask;
        !           387:     int                  *pBits;
        !           388: {
        !           389:     if (pSrc->type == DRAWABLE_WINDOW) {
        !           390:        BoxRec    cursorBox;
        !           391: 
        !           392:        if (sunCursorLoc(pSrc->pScreen, &cursorBox)) {
        !           393:            register WindowPtr  pWin = (WindowPtr)pSrc;
        !           394: 
        !           395:            if (ORG_OVERLAP(&cursorBox,pWin->absCorner.x,pWin->absCorner.y,
        !           396:                            x,y,w,h)) {
        !           397:                                sunRemoveCursor();
        !           398:            }
        !           399:        }
        !           400:     }
        !           401: 
        !           402:     (* sunFbs[pSrc->pScreen->myNum].GetImage) (pSrc, x, y, w, h, format,
        !           403:                                               planeMask, pBits);
        !           404: }
        !           405: 
        !           406: /*-
        !           407:  *-----------------------------------------------------------------------
        !           408:  * sunCopyArea --
        !           409:  *     Remove the cursor if it overlaps either the source or destination
        !           410:  *     drawables, then call the screen-specific CopyArea routine.
        !           411:  *
        !           412:  * Results:
        !           413:  *     None.
        !           414:  *
        !           415:  * Side Effects:
        !           416:  *
        !           417:  *-----------------------------------------------------------------------
        !           418:  */
        !           419: void
        !           420: sunCopyArea (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty)
        !           421:     DrawablePtr          pSrc;
        !           422:     DrawablePtr          pDst;
        !           423:     GCPtr        pGC;
        !           424:     int                  srcx;
        !           425:     int                  srcy;
        !           426:     int                  w;
        !           427:     int                  h;
        !           428:     int                  dstx;
        !           429:     int                  dsty;
        !           430: {
        !           431:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !           432:     BoxRec       cursorBox;
        !           433:     register WindowPtr pWin;
        !           434:     int                  out = FALSE;
        !           435: 
        !           436:     if (pSrc->type == DRAWABLE_WINDOW &&
        !           437:        sunCursorLoc(pSrc->pScreen, &cursorBox)) {
        !           438:            pWin = (WindowPtr)pSrc;
        !           439: 
        !           440:            if (ORG_OVERLAP(&cursorBox,pWin->absCorner.x,pWin->absCorner.y,
        !           441:                            srcx, srcy, w, h)) {
        !           442:                                sunRemoveCursor();
        !           443:                                out = TRUE;
        !           444:            }
        !           445:     }
        !           446: 
        !           447:     if (!out && pDst->type == DRAWABLE_WINDOW &&
        !           448:        sunCursorLoc(pDst->pScreen, &cursorBox)) {
        !           449:            pWin = (WindowPtr)pDst;
        !           450:            
        !           451:            if (ORG_OVERLAP(&cursorBox,pWin->absCorner.x,pWin->absCorner.y,
        !           452:                            dstx, dsty, w, h)) {
        !           453:                                sunRemoveCursor();
        !           454:            }
        !           455:     }
        !           456: 
        !           457:     COMPARE_GCS(pGC,pShadowGC);
        !           458:     (* pShadowGC->CopyArea) (pSrc, pDst, pShadowGC, srcx, srcy,
        !           459:                             w, h, dstx, dsty);
        !           460: }
        !           461: 
        !           462: /*-
        !           463:  *-----------------------------------------------------------------------
        !           464:  * sunCopyPlane --
        !           465:  *     Remove the cursor as necessary and call the screen-specific
        !           466:  *     CopyPlane function.
        !           467:  *
        !           468:  * Results:
        !           469:  *     None.
        !           470:  *
        !           471:  * Side Effects:
        !           472:  *
        !           473:  *-----------------------------------------------------------------------
        !           474:  */
        !           475: void
        !           476: sunCopyPlane (pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty, plane)
        !           477:     DrawablePtr          pSrc;
        !           478:     DrawablePtr          pDst;
        !           479:     register GC   *pGC;
        !           480:     int          srcx,
        !           481:                  srcy;
        !           482:     int          w,
        !           483:                  h;
        !           484:     int          dstx,
        !           485:                  dsty;
        !           486:     unsigned int  plane;
        !           487: {
        !           488:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !           489:     BoxRec       cursorBox;
        !           490:     register WindowPtr pWin;
        !           491:     int                  out = FALSE;
        !           492: 
        !           493:     if (pSrc->type == DRAWABLE_WINDOW &&
        !           494:        sunCursorLoc(pSrc->pScreen, &cursorBox)) {
        !           495:            pWin = (WindowPtr)pSrc;
        !           496: 
        !           497:            if (ORG_OVERLAP(&cursorBox,pWin->absCorner.x,pWin->absCorner.y,
        !           498:                            srcx, srcy, w, h)) {
        !           499:                                sunRemoveCursor();
        !           500:                                out = TRUE;
        !           501:            }
        !           502:     }
        !           503: 
        !           504:     if (!out && pDst->type == DRAWABLE_WINDOW &&
        !           505:        sunCursorLoc(pDst->pScreen, &cursorBox)) {
        !           506:            pWin = (WindowPtr)pDst;
        !           507:            
        !           508:            if (ORG_OVERLAP(&cursorBox,pWin->absCorner.x,pWin->absCorner.y,
        !           509:                            dstx, dsty, w, h)) {
        !           510:                                sunRemoveCursor();
        !           511:            }
        !           512:     }
        !           513: 
        !           514: 
        !           515:     COMPARE_GCS(pGC,pShadowGC);
        !           516:     (* pShadowGC->CopyPlane) (pSrc, pDst, pShadowGC, srcx, srcy, w, h,
        !           517:                              dstx, dsty, plane);
        !           518: }
        !           519: 
        !           520: /*-
        !           521:  *-----------------------------------------------------------------------
        !           522:  * sunPolyPoint --
        !           523:  *     See if any of the points lies within the area covered by the
        !           524:  *     cursor and remove the cursor if one does. Then put the points
        !           525:  *     down.
        !           526:  *
        !           527:  * Results:
        !           528:  *     None.
        !           529:  *
        !           530:  * Side Effects:
        !           531:  *
        !           532:  *-----------------------------------------------------------------------
        !           533:  */
        !           534: void
        !           535: sunPolyPoint (pDrawable, pGC, mode, npt, pptInit)
        !           536:     DrawablePtr pDrawable;
        !           537:     GCPtr      pGC;
        !           538:     int                mode;           /* Origin or Previous */
        !           539:     int                npt;
        !           540:     xPoint     *pptInit;
        !           541: {
        !           542:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           543:     register xPoint    *pts;
        !           544:     register int       nPts;
        !           545:     register int       xorg;
        !           546:     register int       yorg;
        !           547:     BoxRec             cursorBox;
        !           548: 
        !           549:     if (pDrawable->type == DRAWABLE_WINDOW &&
        !           550:        sunCursorLoc (pDrawable->pScreen, &cursorBox)) {
        !           551:            xorg = ((WindowPtr)pDrawable)->absCorner.x;
        !           552:            yorg = ((WindowPtr)pDrawable)->absCorner.y;
        !           553: 
        !           554:            if (mode == CoordModeOrigin) {
        !           555:                for (pts = pptInit, nPts = npt; nPts--; pts++) {
        !           556:                    if (ORG_OVERLAP(&cursorBox,xorg,yorg,pts->x,pts->y,0,0)){
        !           557:                        sunRemoveCursor();
        !           558:                        break;
        !           559:                    }
        !           560:                }
        !           561:            } else {
        !           562:                for (pts = pptInit, nPts = npt; nPts--; pts++) {
        !           563:                    if (ORG_OVERLAP(&cursorBox,xorg,yorg,pts->x,pts->y,0,0)){
        !           564:                        sunRemoveCursor();
        !           565:                        break;
        !           566:                    } else {
        !           567:                        xorg += pts->x;
        !           568:                        yorg += pts->y;
        !           569:                    }
        !           570:                }
        !           571:            }
        !           572:     }
        !           573: 
        !           574:     COMPARE_GCS(pGC,pShadowGC);
        !           575:     (* pShadowGC->PolyPoint) (pDrawable, pShadowGC, mode, npt, pptInit);
        !           576: }
        !           577: 
        !           578: /*-
        !           579:  *-----------------------------------------------------------------------
        !           580:  * sunPolylines --
        !           581:  *     Find the bounding box of the lines and remove the cursor if
        !           582:  *     the box overlaps the area covered by the cursor. Then call
        !           583:  *     the screen's Polylines function to draw the lines themselves.
        !           584:  *
        !           585:  * Results:
        !           586:  *
        !           587:  * Side Effects:
        !           588:  *
        !           589:  *-----------------------------------------------------------------------
        !           590:  */
        !           591: void
        !           592: sunPolylines (pDrawable, pGC, mode, npt, pptInit)
        !           593:     DrawablePtr          pDrawable;
        !           594:     GCPtr        pGC;
        !           595:     int                  mode;
        !           596:     int                  npt;
        !           597:     DDXPointPtr          pptInit;
        !           598: {
        !           599:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !           600:     BoxRec       cursorBox;
        !           601: 
        !           602:     if (pDrawable->type == DRAWABLE_WINDOW &&
        !           603:        sunCursorLoc (pDrawable->pScreen, &cursorBox)) {
        !           604:            sunSaveCursorBox(((WindowPtr)pDrawable)->absCorner.x,
        !           605:                             ((WindowPtr)pDrawable)->absCorner.y,
        !           606:                             mode,
        !           607:                             pptInit,
        !           608:                             npt,
        !           609:                             &cursorBox);
        !           610:     }
        !           611:     COMPARE_GCS(pGC,pShadowGC);
        !           612:     (*pShadowGC->Polylines) (pDrawable, pShadowGC, mode, npt, pptInit);
        !           613: }
        !           614: 
        !           615: /*-
        !           616:  *-----------------------------------------------------------------------
        !           617:  * sunPolySegment --
        !           618:  *     Treat each segment as a box and remove the cursor if any box
        !           619:  *     overlaps the cursor's area. Then draw the segments. Note that
        !           620:  *     the endpoints of the segments are in no way guaranteed to be
        !           621:  *     in the right order, so we find the bounding box of the segment
        !           622:  *     in two comparisons and use that to figure things out.
        !           623:  *
        !           624:  * Results:
        !           625:  *     None.
        !           626:  *
        !           627:  * Side Effects:
        !           628:  *
        !           629:  *-----------------------------------------------------------------------
        !           630:  */
        !           631: void
        !           632: sunPolySegment(pDraw, pGC, nseg, pSegs)
        !           633:     DrawablePtr pDraw;
        !           634:     GCPtr      pGC;
        !           635:     int                nseg;
        !           636:     xSegment   *pSegs;
        !           637: {
        !           638:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           639:     register xSegment  *pSeg;
        !           640:     register int       nSeg;
        !           641:     register int       xorg,
        !           642:                        yorg;
        !           643:     BoxRec             cursorBox;
        !           644:     Bool               nuke = FALSE;
        !           645: 
        !           646:     if (pDraw->type == DRAWABLE_WINDOW &&
        !           647:        sunCursorLoc (pDraw->pScreen, &cursorBox)) {
        !           648:            xorg = ((WindowPtr)pDraw)->absCorner.x;
        !           649:            yorg = ((WindowPtr)pDraw)->absCorner.y;
        !           650: 
        !           651:            for (nSeg = nseg, pSeg = pSegs; nSeg--; pSeg++) {
        !           652:                if (pSeg->x1 < pSeg->x2) {
        !           653:                    if (pSeg->y1 < pSeg->y2) {
        !           654:                        nuke = BOX_OVERLAP(&cursorBox,
        !           655:                                           pSeg->x1+xorg,pSeg->y1+yorg,
        !           656:                                           pSeg->x2+xorg,pSeg->y2+yorg);
        !           657:                    } else {
        !           658:                        nuke = BOX_OVERLAP(&cursorBox,
        !           659:                                           pSeg->x1+xorg,pSeg->y2+yorg,
        !           660:                                           pSeg->x2+xorg,pSeg->y1+yorg);
        !           661:                    }
        !           662:                } else if (pSeg->y1 < pSeg->y2) {
        !           663:                    nuke = BOX_OVERLAP(&cursorBox,
        !           664:                                       pSeg->x2+xorg,pSeg->y1+yorg,
        !           665:                                       pSeg->x1+xorg,pSeg->y2+yorg);
        !           666:                } else {
        !           667:                    nuke = BOX_OVERLAP(&cursorBox,
        !           668:                                       pSeg->x2+xorg,pSeg->y2+yorg,
        !           669:                                       pSeg->x1+xorg,pSeg->y1+yorg);
        !           670:                }
        !           671:                if (nuke) {
        !           672:                    sunRemoveCursor();
        !           673:                    break;
        !           674:                }
        !           675:            }
        !           676:     }
        !           677: 
        !           678:     COMPARE_GCS(pGC,pShadowGC);
        !           679:     (* pShadowGC->PolySegment) (pDraw, pShadowGC, nseg, pSegs);
        !           680: }
        !           681: 
        !           682: /*-
        !           683:  *-----------------------------------------------------------------------
        !           684:  * sunPolyRectangle --
        !           685:  *     Remove the cursor if it overlaps any of the rectangles to be
        !           686:  *     drawn, then draw them.
        !           687:  *
        !           688:  * Results:
        !           689:  *     None
        !           690:  *
        !           691:  * Side Effects:
        !           692:  *
        !           693:  *-----------------------------------------------------------------------
        !           694:  */
        !           695: void
        !           696: sunPolyRectangle(pDraw, pGC, nrects, pRects)
        !           697:     DrawablePtr        pDraw;
        !           698:     GCPtr      pGC;
        !           699:     int                nrects;
        !           700:     xRectangle *pRects;
        !           701: {
        !           702:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           703:     register xRectangle        *pRect;
        !           704:     register int       nRect;
        !           705:     register int       xorg,
        !           706:                        yorg;
        !           707:     BoxRec             cursorBox;
        !           708: 
        !           709:     if (pDraw->type == DRAWABLE_WINDOW &&
        !           710:        sunCursorLoc (pDraw->pScreen, &cursorBox)) {
        !           711:            xorg = ((WindowPtr)pDraw)->absCorner.x;
        !           712:            yorg = ((WindowPtr)pDraw)->absCorner.y;
        !           713: 
        !           714:            for (nRect = nrects, pRect = pRects; nRect--; pRect++) {
        !           715:                if (ORGRECT_OVERLAP(&cursorBox,xorg,yorg,pRect)){
        !           716:                    sunRemoveCursor();
        !           717:                    break;
        !           718:                }
        !           719:            }
        !           720:     }
        !           721: 
        !           722:     COMPARE_GCS(pGC,pShadowGC);
        !           723:     (* pShadowGC->PolyRectangle) (pDraw, pShadowGC, nrects, pRects);
        !           724: }
        !           725: 
        !           726: /*-
        !           727:  *-----------------------------------------------------------------------
        !           728:  * sunPolyArc --
        !           729:  *     Using the bounding rectangle of each arc, remove the cursor
        !           730:  *     if it overlaps any arc, then draw all the arcs.
        !           731:  *
        !           732:  * Results:
        !           733:  *
        !           734:  * Side Effects:
        !           735:  *
        !           736:  *-----------------------------------------------------------------------
        !           737:  */
        !           738: void
        !           739: sunPolyArc(pDraw, pGC, narcs, parcs)
        !           740:     DrawablePtr        pDraw;
        !           741:     GCPtr      pGC;
        !           742:     int                narcs;
        !           743:     xArc       *parcs;
        !           744: {
        !           745:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           746:     register xArc      *pArc;
        !           747:     register int       nArc;
        !           748:     register int       xorg,
        !           749:                        yorg;
        !           750:     BoxRec             cursorBox;
        !           751: 
        !           752:     if (pDraw->type == DRAWABLE_WINDOW &&
        !           753:        sunCursorLoc (pDraw->pScreen, &cursorBox)) {
        !           754:            xorg = ((WindowPtr)pDraw)->absCorner.x;
        !           755:            yorg = ((WindowPtr)pDraw)->absCorner.y;
        !           756: 
        !           757:            for (nArc = narcs, pArc = parcs; nArc--; pArc++) {
        !           758:                if (ORGRECT_OVERLAP(&cursorBox,xorg,yorg,pArc)){
        !           759:                    sunRemoveCursor();
        !           760:                    break;
        !           761:                }
        !           762:            }
        !           763:     }
        !           764: 
        !           765:     COMPARE_GCS(pGC,pShadowGC);
        !           766:     (* pShadowGC->PolyArc) (pDraw, pShadowGC, narcs, parcs);
        !           767: }
        !           768: 
        !           769: /*-
        !           770:  *-----------------------------------------------------------------------
        !           771:  * sunFillPolygon --
        !           772:  *     Find the bounding box of the polygon to fill and remove the
        !           773:  *     cursor if it overlaps this box...
        !           774:  *
        !           775:  * Results:
        !           776:  *     None.
        !           777:  *
        !           778:  * Side Effects:
        !           779:  *
        !           780:  *-----------------------------------------------------------------------
        !           781:  */
        !           782: void
        !           783: sunFillPolygon(pDraw, pGC, shape, mode, count, pPts)
        !           784:     DrawablePtr                pDraw;
        !           785:     register GCPtr     pGC;
        !           786:     int                        shape, mode;
        !           787:     register int       count;
        !           788:     DDXPointPtr                pPts;
        !           789: {
        !           790:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           791:     BoxRec             cursorBox;
        !           792: 
        !           793:     if (pDraw->type == DRAWABLE_WINDOW &&
        !           794:        sunCursorLoc (pDraw->pScreen, &cursorBox)) {
        !           795:            sunSaveCursorBox(((WindowPtr)pDraw)->absCorner.x,
        !           796:                             ((WindowPtr)pDraw)->absCorner.y,
        !           797:                             mode,
        !           798:                             pPts,
        !           799:                             count,
        !           800:                             &cursorBox);
        !           801:     }
        !           802: 
        !           803:     COMPARE_GCS(pGC,pShadowGC);
        !           804:     (* pShadowGC->FillPolygon) (pDraw, pShadowGC, shape, mode, count, pPts);
        !           805: }
        !           806: 
        !           807: /*-
        !           808:  *-----------------------------------------------------------------------
        !           809:  * sunPolyFillRect --
        !           810:  *     Remove the cursor if it overlaps any of the filled rectangles
        !           811:  *     to be drawn by the output routines.
        !           812:  *
        !           813:  * Results:
        !           814:  *     None.
        !           815:  *
        !           816:  * Side Effects:
        !           817:  *
        !           818:  *-----------------------------------------------------------------------
        !           819:  */
        !           820: void
        !           821: sunPolyFillRect(pDrawable, pGC, nrectFill, prectInit)
        !           822:     DrawablePtr pDrawable;
        !           823:     GCPtr      pGC;
        !           824:     int                nrectFill;      /* number of rectangles to fill */
        !           825:     xRectangle *prectInit;     /* Pointer to first rectangle to fill */
        !           826: {
        !           827:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           828:     register xRectangle        *pRect;
        !           829:     register int       nRect;
        !           830:     register int       xorg,
        !           831:                        yorg;
        !           832:     BoxRec             cursorBox;
        !           833: 
        !           834:     if (pDrawable->type == DRAWABLE_WINDOW &&
        !           835:        sunCursorLoc (pDrawable->pScreen, &cursorBox)) {
        !           836:            xorg = ((WindowPtr)pDrawable)->absCorner.x;
        !           837:            yorg = ((WindowPtr)pDrawable)->absCorner.y;
        !           838: 
        !           839:            for (nRect = nrectFill, pRect = prectInit; nRect--; pRect++) {
        !           840:                if (ORGRECT_OVERLAP(&cursorBox,xorg,yorg,pRect)){
        !           841:                    sunRemoveCursor();
        !           842:                    break;
        !           843:                }
        !           844:            }
        !           845:     }
        !           846: 
        !           847:     COMPARE_GCS(pGC,pShadowGC);
        !           848:     (* pShadowGC->PolyFillRect) (pDrawable, pShadowGC, nrectFill, prectInit);
        !           849: }
        !           850: 
        !           851: /*-
        !           852:  *-----------------------------------------------------------------------
        !           853:  * sunPolyFillArc --
        !           854:  *     See if the cursor overlaps any of the bounding boxes for the
        !           855:  *     filled arc and remove it if it does.
        !           856:  *
        !           857:  * Results:
        !           858:  *     None.
        !           859:  *
        !           860:  * Side Effects:
        !           861:  *
        !           862:  *-----------------------------------------------------------------------
        !           863:  */
        !           864: void
        !           865: sunPolyFillArc(pDraw, pGC, narcs, parcs)
        !           866:     DrawablePtr        pDraw;
        !           867:     GCPtr      pGC;
        !           868:     int                narcs;
        !           869:     xArc       *parcs;
        !           870: {
        !           871:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           872:     register xArc      *pArc;
        !           873:     register int       nArc;
        !           874:     register int       xorg,
        !           875:                        yorg;
        !           876:     BoxRec             cursorBox;
        !           877: 
        !           878:     if (pDraw->type == DRAWABLE_WINDOW &&
        !           879:        sunCursorLoc (pDraw->pScreen, &cursorBox)) {
        !           880:            xorg = ((WindowPtr)pDraw)->absCorner.x;
        !           881:            yorg = ((WindowPtr)pDraw)->absCorner.y;
        !           882: 
        !           883:            for (nArc = narcs, pArc = parcs; nArc--; pArc++) {
        !           884:                if (ORGRECT_OVERLAP(&cursorBox,xorg,yorg,pArc)){
        !           885:                    sunRemoveCursor();
        !           886:                    break;
        !           887:                }
        !           888:            }
        !           889:     }
        !           890: 
        !           891:     COMPARE_GCS(pGC,pShadowGC);
        !           892:     (* pShadowGC->PolyFillArc) (pDraw, pShadowGC, narcs, parcs);
        !           893: }
        !           894: 
        !           895: /*-
        !           896:  *-----------------------------------------------------------------------
        !           897:  * sunText --
        !           898:  *     Find the extent of a text operation and remove the cursor if they
        !           899:  *     overlap. pDraw is assumed to be a window.
        !           900:  *
        !           901:  * Results:
        !           902:  *
        !           903:  * Side Effects:
        !           904:  *
        !           905:  *-----------------------------------------------------------------------
        !           906:  */
        !           907: int
        !           908: sunText(pDraw, pGC, x, y, count, chars, fontEncoding, drawFunc)
        !           909:     DrawablePtr   pDraw;
        !           910:     GCPtr        pGC;
        !           911:     int                  x,
        !           912:                  y;
        !           913:     int                  count;
        !           914:     char         *chars;
        !           915:     FontEncoding  fontEncoding;
        !           916:     void         (*drawFunc)();
        !           917: {
        !           918:     CharInfoPtr *charinfo;
        !           919:     unsigned int n, w = 0;
        !           920:     register int xorg, yorg;
        !           921:     ExtentInfoRec extents;
        !           922:     BoxRec      cursorBox;
        !           923: 
        !           924:     charinfo = (CharInfoPtr *) ALLOCATE_LOCAL(count * sizeof(CharInfoPtr));
        !           925:     if (charinfo == (CharInfoPtr *) NULL) {
        !           926:        return x;
        !           927:     }
        !           928: 
        !           929:     GetGlyphs(pGC->font, count, chars, fontEncoding, &n, charinfo);
        !           930: 
        !           931:     if (n != 0) {
        !           932:        QueryGlyphExtents(pGC->font, charinfo, n, &extents);
        !           933:        w = extents.overallWidth;
        !           934: 
        !           935:        if (sunCursorLoc(pDraw->pScreen, &cursorBox)) {
        !           936:            xorg = ((WindowPtr) pDraw)->absCorner.x;
        !           937:            yorg = ((WindowPtr) pDraw)->absCorner.y;
        !           938: 
        !           939:            if (BOX_OVERLAP(&cursorBox,
        !           940:                            x + xorg + extents.overallLeft,
        !           941:                            y + yorg - extents.overallAscent,
        !           942:                            x + xorg + extents.overallRight,
        !           943:                            y + yorg + extents.overallDescent)) {
        !           944:                sunRemoveCursor();
        !           945:            }
        !           946:        }
        !           947: 
        !           948:        (*drawFunc) (pDraw, pGC, x, y, n, charinfo, pGC->font->pGlyphs);
        !           949: 
        !           950:     }
        !           951:     DEALLOCATE_LOCAL(charinfo);
        !           952:     return x + w;
        !           953: }
        !           954: 
        !           955: /*-
        !           956:  *-----------------------------------------------------------------------
        !           957:  * sunPolyText8 --
        !           958:  *
        !           959:  * Results:
        !           960:  *
        !           961:  * Side Effects:
        !           962:  *
        !           963:  *-----------------------------------------------------------------------
        !           964:  */
        !           965: int
        !           966: sunPolyText8(pDraw, pGC, x, y, count, chars)
        !           967:     DrawablePtr pDraw;
        !           968:     GCPtr      pGC;
        !           969:     int                x, y;
        !           970:     int        count;
        !           971:     char       *chars;
        !           972: {
        !           973:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !           974: 
        !           975:     COMPARE_GCS(pGC,pShadowGC);
        !           976:     if (pDraw->type == DRAWABLE_WINDOW) {
        !           977:        return sunText (pDraw, pShadowGC, x, y, count, chars, Linear8Bit,
        !           978:                        pShadowGC->PolyGlyphBlt);
        !           979:     } else {
        !           980:        return (* pShadowGC->PolyText8)(pDraw, pShadowGC, x, y, count, chars);
        !           981:     }
        !           982: }
        !           983: 
        !           984: /*-
        !           985:  *-----------------------------------------------------------------------
        !           986:  * sunPolyText16 --
        !           987:  *
        !           988:  * Results:
        !           989:  *
        !           990:  * Side Effects:
        !           991:  *
        !           992:  *-----------------------------------------------------------------------
        !           993:  */
        !           994: int
        !           995: sunPolyText16(pDraw, pGC, x, y, count, chars)
        !           996:     DrawablePtr pDraw;
        !           997:     GCPtr      pGC;
        !           998:     int                x, y;
        !           999:     int                count;
        !          1000:     unsigned short *chars;
        !          1001: {
        !          1002:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !          1003: 
        !          1004:     COMPARE_GCS(pGC,pShadowGC);
        !          1005:     if (pDraw->type == DRAWABLE_WINDOW) {
        !          1006:        return sunText (pDraw, pShadowGC, x, y, count, chars,
        !          1007:                        (pShadowGC->font->pFI->lastRow == 0 ?
        !          1008:                         Linear16Bit : TwoD16Bit),
        !          1009:                        pShadowGC->PolyGlyphBlt);
        !          1010:     } else {
        !          1011:        return (* pShadowGC->PolyText16) (pDraw, pShadowGC, x, y,
        !          1012:                                          count, chars);
        !          1013:     }
        !          1014: }
        !          1015: 
        !          1016: /*-
        !          1017:  *-----------------------------------------------------------------------
        !          1018:  * sunImageText8 --
        !          1019:  *
        !          1020:  * Results:
        !          1021:  *
        !          1022:  * Side Effects:
        !          1023:  *
        !          1024:  *-----------------------------------------------------------------------
        !          1025:  */
        !          1026: void
        !          1027: sunImageText8(pDraw, pGC, x, y, count, chars)
        !          1028:     DrawablePtr pDraw;
        !          1029:     GCPtr      pGC;
        !          1030:     int                x, y;
        !          1031:     int                count;
        !          1032:     char       *chars;
        !          1033: {
        !          1034:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !          1035: 
        !          1036:     COMPARE_GCS(pGC,pShadowGC);
        !          1037:     if (pDraw->type == DRAWABLE_WINDOW) {
        !          1038:        (void) sunText (pDraw, pShadowGC, x, y, count, chars,
        !          1039:                        Linear8Bit, pShadowGC->ImageGlyphBlt);
        !          1040:     } else {
        !          1041:        (* pShadowGC->ImageText8) (pDraw, pShadowGC, x, y, count, chars);
        !          1042:     }
        !          1043: }
        !          1044: 
        !          1045: /*-
        !          1046:  *-----------------------------------------------------------------------
        !          1047:  * sunImageText16 --
        !          1048:  *
        !          1049:  * Results:
        !          1050:  *
        !          1051:  * Side Effects:
        !          1052:  *
        !          1053:  *-----------------------------------------------------------------------
        !          1054:  */
        !          1055: void
        !          1056: sunImageText16(pDraw, pGC, x, y, count, chars)
        !          1057:     DrawablePtr pDraw;
        !          1058:     GCPtr      pGC;
        !          1059:     int                x, y;
        !          1060:     int                count;
        !          1061:     unsigned short *chars;
        !          1062: {
        !          1063:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !          1064: 
        !          1065:     COMPARE_GCS(pGC,pShadowGC);
        !          1066:     if (pDraw->type == DRAWABLE_WINDOW) {
        !          1067:        (void) sunText (pDraw, pShadowGC, x, y, count, chars,
        !          1068:                        (pShadowGC->font->pFI->lastRow == 0 ?
        !          1069:                         Linear16Bit : TwoD16Bit),
        !          1070:                        pShadowGC->ImageGlyphBlt);
        !          1071:     } else {
        !          1072:        (* pShadowGC->ImageText16) (pDraw, pShadowGC, x, y, count, chars);
        !          1073:     }
        !          1074: }
        !          1075: 
        !          1076: /*-
        !          1077:  *-----------------------------------------------------------------------
        !          1078:  * sunImageGlyphBlt --
        !          1079:  *
        !          1080:  * Results:
        !          1081:  *
        !          1082:  * Side Effects:
        !          1083:  *
        !          1084:  *-----------------------------------------------------------------------
        !          1085:  */
        !          1086: void
        !          1087: sunImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase)
        !          1088:     DrawablePtr pDrawable;
        !          1089:     GC                 *pGC;
        !          1090:     int        x, y;
        !          1091:     unsigned int nglyph;
        !          1092:     CharInfoPtr *ppci;         /* array of character info */
        !          1093:     pointer    pglyphBase;     /* start of array of glyphs */
        !          1094: {
        !          1095:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !          1096:     BoxRec             cursorBox;
        !          1097:     ExtentInfoRec      extents;
        !          1098:     register int       xorg,
        !          1099:                        yorg;
        !          1100: 
        !          1101:     if (pDrawable->type == DRAWABLE_WINDOW &&
        !          1102:        sunCursorLoc (pDrawable->pScreen, &cursorBox)) {
        !          1103:            QueryGlyphExtents (pGC->font, ppci, nglyph, &extents);
        !          1104:            xorg = ((WindowPtr)pDrawable)->absCorner.x + x;
        !          1105:            yorg = ((WindowPtr)pDrawable)->absCorner.y + y;
        !          1106:            if (BOX_OVERLAP(&cursorBox,xorg+extents.overallLeft,
        !          1107:                            yorg+extents.overallAscent,
        !          1108:                            xorg+extents.overallRight,
        !          1109:                            yorg+extents.overallDescent)) {
        !          1110:                                sunRemoveCursor();
        !          1111:            }
        !          1112:     }
        !          1113: 
        !          1114:     COMPARE_GCS(pGC,pShadowGC);
        !          1115:     (* pShadowGC->ImageGlyphBlt) (pDrawable, pShadowGC, x, y, nglyph,
        !          1116:                                  ppci, pglyphBase);
        !          1117: }
        !          1118: 
        !          1119: /*-
        !          1120:  *-----------------------------------------------------------------------
        !          1121:  * sunPolyGlyphBlt --
        !          1122:  *
        !          1123:  * Results:
        !          1124:  *
        !          1125:  * Side Effects:
        !          1126:  *
        !          1127:  *-----------------------------------------------------------------------
        !          1128:  */
        !          1129: void
        !          1130: sunPolyGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase)
        !          1131:     DrawablePtr pDrawable;
        !          1132:     GCPtr      pGC;
        !          1133:     int        x, y;
        !          1134:     unsigned int nglyph;
        !          1135:     CharInfoPtr *ppci;         /* array of character info */
        !          1136:     char       *pglyphBase;    /* start of array of glyphs */
        !          1137: {
        !          1138:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !          1139:     BoxRec             cursorBox;
        !          1140:     ExtentInfoRec      extents;
        !          1141:     register int       xorg,
        !          1142:                        yorg;
        !          1143: 
        !          1144:     if (pDrawable->type == DRAWABLE_WINDOW &&
        !          1145:        sunCursorLoc (pDrawable->pScreen, &cursorBox)) {
        !          1146:            QueryGlyphExtents (pGC->font, ppci, nglyph, &extents);
        !          1147:            xorg = ((WindowPtr)pDrawable)->absCorner.x + x;
        !          1148:            yorg = ((WindowPtr)pDrawable)->absCorner.y + y;
        !          1149:            if (BOX_OVERLAP(&cursorBox,xorg+extents.overallLeft,
        !          1150:                            yorg+extents.overallAscent,
        !          1151:                            xorg+extents.overallRight,
        !          1152:                            yorg+extents.overallDescent)){
        !          1153:                                sunRemoveCursor();
        !          1154:            }
        !          1155:     }
        !          1156: 
        !          1157:     COMPARE_GCS(pGC,pShadowGC);
        !          1158:     (* pShadowGC->PolyGlyphBlt) (pDrawable, pShadowGC, x, y,
        !          1159:                                nglyph, ppci, pglyphBase);
        !          1160: }
        !          1161: 
        !          1162: /*-
        !          1163:  *-----------------------------------------------------------------------
        !          1164:  * sunPushPixels --
        !          1165:  *
        !          1166:  * Results:
        !          1167:  *
        !          1168:  * Side Effects:
        !          1169:  *
        !          1170:  *-----------------------------------------------------------------------
        !          1171:  */
        !          1172: void
        !          1173: sunPushPixels(pGC, pBitMap, pDst, w, h, x, y)
        !          1174:     GCPtr      pGC;
        !          1175:     PixmapPtr  pBitMap;
        !          1176:     DrawablePtr pDst;
        !          1177:     int                w, h, x, y;
        !          1178: {
        !          1179: 
        !          1180:     register GCPtr     pShadowGC = (GCPtr) pGC->devPriv;
        !          1181:     BoxRec             cursorBox;
        !          1182:     register int       xorg,
        !          1183:                        yorg;
        !          1184: 
        !          1185:     if (pDst->type == DRAWABLE_WINDOW &&
        !          1186:        sunCursorLoc (pDst->pScreen, &cursorBox)) {
        !          1187:            xorg = ((WindowPtr)pDst)->absCorner.x + x;
        !          1188:            yorg = ((WindowPtr)pDst)->absCorner.y + y;
        !          1189: 
        !          1190:            if (BOX_OVERLAP(&cursorBox,xorg,yorg,xorg+w,yorg+h)){
        !          1191:                sunRemoveCursor();
        !          1192:            }
        !          1193:     }
        !          1194: 
        !          1195:     COMPARE_GCS(pGC,pShadowGC);
        !          1196:     (* pShadowGC->PushPixels) (pShadowGC, pBitMap, pDst, w, h, x, y);
        !          1197: }
        !          1198: 
        !          1199: /*-
        !          1200:  *-----------------------------------------------------------------------
        !          1201:  * sunLineHelper --
        !          1202:  *
        !          1203:  * Results:
        !          1204:  *
        !          1205:  * Side Effects:
        !          1206:  *
        !          1207:  *-----------------------------------------------------------------------
        !          1208:  */
        !          1209: void
        !          1210: sunLineHelper (pDraw, pGC, caps, npt, pPts, xOrg, yOrg)
        !          1211:     DrawablePtr pDraw;
        !          1212:     GCPtr      pGC;
        !          1213:     int                caps;
        !          1214:     int                npt;
        !          1215:     SppPointPtr pPts;
        !          1216:     int                xOrg, yOrg;
        !          1217: {
        !          1218:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !          1219: 
        !          1220:     COMPARE_GCS(pGC,pShadowGC);
        !          1221:     (* pShadowGC->LineHelper) (pDraw, pShadowGC, caps, npt, pPts, xOrg, yOrg);
        !          1222: }
        !          1223: 
        !          1224: /*-
        !          1225:  *-----------------------------------------------------------------------
        !          1226:  * sunChangeClip --
        !          1227:  *     Front end for changing the clip in the GC. Just passes the command
        !          1228:  *     on through the shadow GC.
        !          1229:  *
        !          1230:  *
        !          1231:  * Results:
        !          1232:  *     None.
        !          1233:  *
        !          1234:  * Side Effects:
        !          1235:  *     ???
        !          1236:  *
        !          1237:  *-----------------------------------------------------------------------
        !          1238:  */
        !          1239: void
        !          1240: sunChangeClip (pGC, type, pValue, numRects)
        !          1241:     GCPtr        pGC;
        !          1242:     int                  type;
        !          1243:     pointer      pValue;
        !          1244:     int                  numRects;
        !          1245: {
        !          1246:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !          1247: 
        !          1248:     COMPARE_GCS(pGC,pShadowGC);
        !          1249:     (* pShadowGC->ChangeClip) (pShadowGC, type, pValue, numRects);
        !          1250:     /*
        !          1251:      * Now copy the clip info back from the shadow to the real
        !          1252:      * GC so that if we use it as the source for a CopyGC,
        !          1253:      * the clip info will get copied along with everything
        !          1254:      * else.
        !          1255:      */
        !          1256:     pGC->clientClip = pShadowGC->clientClip;
        !          1257:     pGC->clientClipType = pShadowGC->clientClipType;
        !          1258: }
        !          1259: 
        !          1260: /*-
        !          1261:  *-----------------------------------------------------------------------
        !          1262:  * sunDestroyClip --
        !          1263:  *     Ditto for destroying the clipping region of the GC.
        !          1264:  *
        !          1265:  * Results:
        !          1266:  *     None.
        !          1267:  *
        !          1268:  * Side Effects:
        !          1269:  *     ???
        !          1270:  *
        !          1271:  *-----------------------------------------------------------------------
        !          1272:  */
        !          1273: void
        !          1274: sunDestroyClip (pGC)
        !          1275:     GCPtr   pGC;
        !          1276: {
        !          1277:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !          1278: 
        !          1279:     COMPARE_GCS(pGC,pShadowGC);
        !          1280:     (* pShadowGC->DestroyClip) (pShadowGC);
        !          1281: }
        !          1282: 
        !          1283: /*-
        !          1284:  *-----------------------------------------------------------------------
        !          1285:  * sunCopyClip --
        !          1286:  *     Ditto for copying the clipping region of the GC.
        !          1287:  *
        !          1288:  * Results:
        !          1289:  *     None.
        !          1290:  *
        !          1291:  * Side Effects:
        !          1292:  *     ???
        !          1293:  *
        !          1294:  *-----------------------------------------------------------------------
        !          1295:  */
        !          1296: void
        !          1297: sunCopyClip (pgcDst, pgcSrc)
        !          1298:     GCPtr   pgcDst, pgcSrc;
        !          1299: {
        !          1300:     register GCPtr pShadowSrcGC = (GCPtr) pgcSrc->devPriv;
        !          1301:     register GCPtr pShadowDstGC = (GCPtr) pgcDst->devPriv;
        !          1302: 
        !          1303:     COMPARE_GCS(pgcSrc, pShadowSrcGC);
        !          1304:     COMPARE_GCS(pgcDst, pShadowDstGC);
        !          1305:     (* pShadowDstGC->CopyClip) (pShadowDstGC, pShadowSrcGC);
        !          1306: }
        !          1307: 
        !          1308: /*-
        !          1309:  *-----------------------------------------------------------------------
        !          1310:  * sunDestroyGC --
        !          1311:  *     Function called when a GC is being freed. Simply unlinks and frees
        !          1312:  *     the GCInterest structure.
        !          1313:  *
        !          1314:  * Results:
        !          1315:  *     None.
        !          1316:  *
        !          1317:  * Side Effects:
        !          1318:  *     The GCInterest structure is removed from the chain but its own
        !          1319:  *     links are untouched (so FreeGC has something to follow...)
        !          1320:  *
        !          1321:  *-----------------------------------------------------------------------
        !          1322:  */
        !          1323: void
        !          1324: sunDestroyGC (pGC, pGCI)
        !          1325:     GCPtr         pGC; /* GC pGCI is attached to */
        !          1326:     GCInterestPtr  pGCI;       /* GCInterest being destroyed */
        !          1327: {
        !          1328:     if (pGC->devPriv)
        !          1329:        FreeGC ((GCPtr)pGC->devPriv);
        !          1330:     Xfree (pGCI);
        !          1331: }
        !          1332: 
        !          1333: /*-
        !          1334:  *-----------------------------------------------------------------------
        !          1335:  * sunValidateGC --
        !          1336:  *     Called when a GC is about to be used for drawing. Copies all
        !          1337:  *     changes from the GC to its shadow and validates the shadow.
        !          1338:  *
        !          1339:  * Results:
        !          1340:  *     TRUE, for no readily apparent reason.
        !          1341:  *
        !          1342:  * Side Effects:
        !          1343:  *     Vectors in the shadow GC will likely be changed.
        !          1344:  *
        !          1345:  *-----------------------------------------------------------------------
        !          1346:  */
        !          1347: /*ARGSUSED*/
        !          1348: static void
        !          1349: sunValidateGC (pGC, pGCI, changes, pDrawable)
        !          1350:     GCPtr        pGC;
        !          1351:     GCInterestPtr pGCI;
        !          1352:     Mask         changes;
        !          1353:     DrawablePtr          pDrawable;
        !          1354: {
        !          1355:     register GCPtr pShadowGC = (GCPtr) pGC->devPriv;
        !          1356: 
        !          1357:     if ( pGC->depth != pDrawable->depth )
        !          1358:        FatalError( "sunValidateGC: depth mismatch.\n" );
        !          1359: 
        !          1360: /*
        !          1361:  *  sunValidateGC copies the GC to the shadow.  Alas,
        !          1362:  *  sunChangeClip has stored the new clip in the shadow,
        !          1363:  *  where it will be overwritten,  unless we pretend
        !          1364:  *  that the clip hasn't changed.
        !          1365:  */
        !          1366:     changes &= ~GCClipMask;
        !          1367: 
        !          1368:     CopyGC (pGC, pShadowGC, changes);
        !          1369:     pShadowGC->serialNumber = pGC->serialNumber;
        !          1370:     COMPARE_GCS(pGC,pShadowGC);
        !          1371:     ValidateGC (pDrawable, pShadowGC);
        !          1372: }
        !          1373:        
        !          1374: /*-
        !          1375:  *-----------------------------------------------------------------------
        !          1376:  * sunCopyGC --
        !          1377:  *     Called when a GC with its shadow is the destination of a copy.
        !          1378:  *     Calls CopyGC to transfer the changes to the shadow GC as well.
        !          1379:  *     Should not be used for the CopyGCSource since we like to copy from
        !          1380:  *     the real GC to the shadow using CopyGC...
        !          1381:  *
        !          1382:  * Results:
        !          1383:  *     None.
        !          1384:  *
        !          1385:  * Side Effects:
        !          1386:  *     Any changes in the real GC are copied to the shadow.
        !          1387:  *
        !          1388:  *-----------------------------------------------------------------------
        !          1389:  */
        !          1390: /*ARGSUSED*/
        !          1391: void
        !          1392: sunCopyGC (pGCDst, pGCI, changes, pGCSrc)
        !          1393:     GCPtr        pGCDst;
        !          1394:     GCInterestPtr pGCI;
        !          1395:     int          changes;
        !          1396:     GCPtr        pGCSrc;
        !          1397: {
        !          1398:     CopyGC (pGCSrc, (GCPtr) pGCDst->devPriv, changes);
        !          1399:     COMPARE_GCS(pGCSrc,(GCPtr) pGCDst->devPriv);
        !          1400: }
        !          1401: 
        !          1402: /*
        !          1403:  * Array of functions to replace the functions in the GC.
        !          1404:  * Caveat: Depends on the ordering of functions in the GC structure.
        !          1405:  */
        !          1406: static void (* sunGCFuncs[]) () = {
        !          1407:     sunFillSpans,
        !          1408:     sunSetSpans,
        !          1409: 
        !          1410:     sunPutImage,
        !          1411:     sunCopyArea,
        !          1412:     sunCopyPlane,
        !          1413:     sunPolyPoint,
        !          1414:     sunPolylines,
        !          1415:     sunPolySegment,
        !          1416:     sunPolyRectangle,
        !          1417:     sunPolyArc,
        !          1418:     sunFillPolygon,
        !          1419:     sunPolyFillRect,
        !          1420:     sunPolyFillArc,
        !          1421:     (void(*)())sunPolyText8,
        !          1422:     (void(*)())sunPolyText16,
        !          1423:     sunImageText8,
        !          1424:     sunImageText16,
        !          1425:     sunImageGlyphBlt,
        !          1426:     sunPolyGlyphBlt,
        !          1427:     sunPushPixels,
        !          1428:     sunLineHelper,
        !          1429:     sunChangeClip,
        !          1430:     sunDestroyClip,
        !          1431:     sunCopyClip,
        !          1432: };
        !          1433: 
        !          1434: /*-
        !          1435:  *-----------------------------------------------------------------------
        !          1436:  * sunCreatePrivGC --
        !          1437:  *     Create a GC private to the Sun DDX code. Such a GC is unhampered
        !          1438:  *     by any shadow GC and should only be used by functions which know
        !          1439:  *     what they are doing. This substitutes the old CreateGC function
        !          1440:  *     in the drawable's screen's vector and calls the DIX CreateGC
        !          1441:  *     function. Once done, it restores the CreateGC vector to its
        !          1442:  *     proper state and returns the GCPtr CreateGC gave back.
        !          1443:  *
        !          1444:  * Results:
        !          1445:  *     A pointer to the new GC.
        !          1446:  *
        !          1447:  * Side Effects:
        !          1448:  *     The GC's graphicsExposures field is set FALSE.
        !          1449:  *
        !          1450:  *-----------------------------------------------------------------------
        !          1451:  */
        !          1452: /*ARGSUSED*/
        !          1453: GCPtr
        !          1454: sunCreatePrivGC(pDrawable, mask, pval, pStatus)
        !          1455:     DrawablePtr          pDrawable;
        !          1456:     BITS32       mask;
        !          1457:     long         *pval;
        !          1458:     BITS32       *pStatus;
        !          1459: {
        !          1460:     fbFd         *fb;
        !          1461:     GCPtr        pGC;
        !          1462:     BITS32       ge = FALSE;
        !          1463: 
        !          1464:     fb = &sunFbs[pDrawable->pScreen->myNum];
        !          1465:     pDrawable->pScreen->CreateGC = fb->CreateGC;
        !          1466: 
        !          1467:     pGC = GetScratchGC (pDrawable->depth, pDrawable->pScreen);
        !          1468:     ChangeGC (pGC, mask, pval);
        !          1469:     ChangeGC (pGC, GCGraphicsExposures, &ge);
        !          1470: 
        !          1471:     pDrawable->pScreen->CreateGC = sunCreateGC;
        !          1472: 
        !          1473:     return pGC;
        !          1474: }
        !          1475: 
        !          1476: /*-
        !          1477:  *-----------------------------------------------------------------------
        !          1478:  * sunCreateGC --
        !          1479:  *     This function is used to get our own validation hooks into each
        !          1480:  *     GC to preserve the cursor. It calls the regular creation routine
        !          1481:  *     for the screen and then, if that was successful, tacks another
        !          1482:  *     GCInterest structure onto the GC *after* the one placed on by
        !          1483:  *     the screen-specific CreateGC...
        !          1484:  *
        !          1485:  * Results:
        !          1486:  *     TRUE if created ok. FALSE otherwise.
        !          1487:  *
        !          1488:  * Side Effects:
        !          1489:  *     A GCInterest structure is stuck on the end of the GC's list.
        !          1490:  *
        !          1491:  *-----------------------------------------------------------------------
        !          1492:  */
        !          1493: Bool
        !          1494: sunCreateGC (pGC)
        !          1495:     GCPtr      pGC;    /* The GC to play with */
        !          1496: {
        !          1497:     GCInterestPtr      pGCI;
        !          1498:     register GCPtr     pShadowGC;
        !          1499:     int        i;
        !          1500:     
        !          1501:     if ((*sunFbs[pGC->pScreen->myNum].CreateGC) (pGC)) {
        !          1502: 
        !          1503:        if (pGC->depth != pGC->pScreen->rootDepth) {
        !          1504:            /* This GC will never be used for painting the screen,  so no shadow needed */
        !          1505:            return TRUE;
        !          1506:        }
        !          1507: 
        !          1508:        pShadowGC = (GCPtr) Xalloc (sizeof (GC));
        !          1509:        if (pShadowGC == (GCPtr)NULL) {
        !          1510:            return FALSE;
        !          1511:        }
        !          1512:        
        !          1513:        *pShadowGC = *pGC;
        !          1514:        pGC->devPriv = (pointer)pShadowGC;
        !          1515:        bcopy (sunGCFuncs, &pGC->FillSpans, sizeof (sunGCFuncs));
        !          1516:        
        !          1517:        pGCI = (GCInterestPtr) Xalloc (sizeof (GCInterestRec));
        !          1518:        if (!pGCI) {
        !          1519:            return FALSE;
        !          1520:        }
        !          1521: 
        !          1522:        /*
        !          1523:         * Any structure being shared between these two GCs must have its
        !          1524:         * reference count incremented. This includes:
        !          1525:         *  font, tile, stipple.
        !          1526:         * Anything which doesn't have a reference count must be duplicated:
        !          1527:         *  pCompositeClip, pAbsClientRegion.
        !          1528:         * 
        !          1529:         */
        !          1530:        if (pGC->font) {
        !          1531:            pGC->font->refcnt++;
        !          1532:        }
        !          1533:        if (pGC->tile) {
        !          1534:            pGC->tile->refcnt++;
        !          1535:        }
        !          1536:        if (pGC->stipple) {
        !          1537:            pGC->stipple->refcnt++;
        !          1538:        }
        !          1539:        pShadowGC->dash = (unsigned char *)
        !          1540:                Xalloc(2 * sizeof(unsigned char));
        !          1541:        for (i=0; i<pGC->numInDashList; i++)
        !          1542:            pShadowGC->dash[i] = pGC->dash[i];
        !          1543: 
        !          1544: #ifdef notdef
        !          1545:        if (pGC->pCompositeClip) {
        !          1546:            pShadowGC->pCompositeClip =
        !          1547:                (* pGC->pScreen->RegionCreate) (NULL, 1);
        !          1548:            (* pGC->pScreen->RegionCopy) (pShadowGC->pCompositeClip,
        !          1549:                                          pGC->pCompositeClip);
        !          1550:        }
        !          1551:        if (pGC->pAbsClientRegion) {
        !          1552:            pShadowGC->pAbsClientRegion=
        !          1553:                (* pGC->pScreen->RegionCreate) (NULL, 1);
        !          1554:            (* pGC->pScreen->RegionCopy) (pShadowGC->pAbsClientRegion,
        !          1555:                                          pGC->pAbsClientRegion);
        !          1556:        }
        !          1557: #endif notdef
        !          1558:        
        !          1559:        pGC->pNextGCInterest = pGCI;
        !          1560:        pGC->pLastGCInterest = pGCI;
        !          1561:        pGCI->pNextGCInterest = (GCInterestPtr) &pGC->pNextGCInterest;
        !          1562:        pGCI->pLastGCInterest = (GCInterestPtr) &pGC->pNextGCInterest;
        !          1563:        pGCI->length = sizeof(GCInterestRec);
        !          1564:        pGCI->owner = 0;                    /* server owns this */
        !          1565:        pGCI->ValInterestMask = ~0;         /* interested in everything */
        !          1566:        pGCI->ValidateGC = sunValidateGC;
        !          1567:        pGCI->ChangeInterestMask = 0;       /* interested in nothing */
        !          1568:        pGCI->ChangeGC = (int (*)()) NULL;
        !          1569:        pGCI->CopyGCSource = (void (*)())NULL;
        !          1570:        pGCI->CopyGCDest = sunCopyGC;
        !          1571:        pGCI->DestroyGC = sunDestroyGC;
        !          1572:        
        !          1573: 
        !          1574:        /*
        !          1575:         * Because of this weird way of handling the GCInterest lists,
        !          1576:         * we need to modify the output library's GCInterest structure to
        !          1577:         * point to the pNextGCInterest field of the shadow GC...
        !          1578:         */
        !          1579:        pGCI = pShadowGC->pNextGCInterest;
        !          1580:        pGCI->pLastGCInterest = pGCI->pNextGCInterest =
        !          1581:            (GCInterestPtr) &pShadowGC->pNextGCInterest;
        !          1582: 
        !          1583:        return TRUE;
        !          1584:     } else {
        !          1585:        return FALSE;
        !          1586:     }
        !          1587: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.