|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.