|
|
1.1 ! root 1: /*********************************************************** ! 2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts, ! 3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts. ! 4: ! 5: All Rights Reserved ! 6: ! 7: Permission to use, copy, modify, and distribute this software and its ! 8: documentation for any purpose and without fee is hereby granted, ! 9: provided that the above copyright notice appear in all copies and that ! 10: both that copyright notice and this permission notice appear in ! 11: supporting documentation, and that the names of Digital or MIT not be ! 12: used in advertising or publicity pertaining to distribution of the ! 13: software without specific, written prior permission. ! 14: ! 15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ! 16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ! 17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ! 18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ! 19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ! 20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ! 21: SOFTWARE. ! 22: ! 23: ******************************************************************/ ! 24: ! 25: #include "X.h" ! 26: #include "scrnintstr.h" ! 27: #include "windowstr.h" ! 28: #include "cfb.h" ! 29: #include "mistruct.h" ! 30: #include "regionstr.h" ! 31: ! 32: extern WindowRec WindowTable[]; ! 33: ! 34: Bool cfbCreateWindow(pWin) ! 35: WindowPtr pWin; ! 36: { ! 37: cfbPrivWin *pPrivWin; ! 38: ! 39: pWin->ClearToBackground = miClearToBackground; ! 40: pWin->PaintWindowBackground = cfbPaintAreaNone; ! 41: pWin->PaintWindowBorder = cfbPaintAreaPR; ! 42: pWin->CopyWindow = cfbCopyWindow; ! 43: pPrivWin = (cfbPrivWin *)Xalloc(sizeof(cfbPrivWin)); ! 44: pWin->devPrivate = (pointer)pPrivWin; ! 45: pPrivWin->pRotatedBorder = NullPixmap; ! 46: pPrivWin->pRotatedBackground = NullPixmap; ! 47: pPrivWin->fastBackground = 0; ! 48: pPrivWin->fastBorder = 0; ! 49: ! 50: /* backing store stuff ! 51: is this ever called with backing store turned on ??? ! 52: */ ! 53: if ((pWin->backingStore == WhenMapped) || ! 54: (pWin->backingStore == Always)) ! 55: { ! 56: } ! 57: else ! 58: { ! 59: } ! 60: return TRUE; ! 61: } ! 62: ! 63: Bool cfbDestroyWindow(pWin) ! 64: WindowPtr pWin; ! 65: { ! 66: cfbPrivWin *pPrivWin; ! 67: ! 68: pPrivWin = (cfbPrivWin *)(pWin->devPrivate); ! 69: ! 70: /* cfbDestroyPixmap() deals with any NULL pointers */ ! 71: cfbDestroyPixmap(pPrivWin->pRotatedBorder); ! 72: cfbDestroyPixmap(pPrivWin->pRotatedBackground); ! 73: Xfree(pWin->devPrivate); ! 74: } ! 75: ! 76: Bool cfbMapWindow(pWindow) ! 77: WindowPtr pWindow; ! 78: { ! 79: } ! 80: ! 81: /* (x, y) is the upper left corner of the window on the screen ! 82: do we really need to pass this? (is it a;ready in pWin->absCorner?) ! 83: we only do the rotation for pixmaps that are 32 bits wide (padded ! 84: or otherwise.) ! 85: cfbChangeWindowAttributes() has already put a copy of the pixmap ! 86: in pPrivWin->pRotated* ! 87: ! 88: HACK ALERT ! 89: the '> 4' is a messy hack, which ought to be cleaner ! 90: */ ! 91: Bool cfbPositionWindow(pWin, x, y) ! 92: WindowPtr pWin; ! 93: int x, y; ! 94: { ! 95: cfbPrivWin *pPrivWin; ! 96: ! 97: pPrivWin = (cfbPrivWin *)(pWin->devPrivate); ! 98: if (((unsigned)(pWin->backgroundTile) > 4 ) && ! 99: (pPrivWin->fastBackground != 0)) ! 100: { ! 101: cfbXRotatePixmap(pPrivWin->pRotatedBackground, ! 102: pWin->absCorner.x - pPrivWin->oldRotate.x); ! 103: cfbYRotatePixmap(pPrivWin->pRotatedBackground, ! 104: pWin->absCorner.y - pPrivWin->oldRotate.y); ! 105: } ! 106: ! 107: if (((unsigned)(pWin->borderTile) > 4 ) && ! 108: (pPrivWin->fastBorder != 0)) ! 109: { ! 110: cfbXRotatePixmap(pPrivWin->pRotatedBorder, ! 111: pWin->absCorner.x - pPrivWin->oldRotate.x); ! 112: cfbYRotatePixmap(pPrivWin->pRotatedBorder, ! 113: pWin->absCorner.y - pPrivWin->oldRotate.y); ! 114: } ! 115: if ( (((unsigned)(pWin->borderTile) > 4) && ! 116: (pPrivWin->fastBorder != 0)) ! 117: || ! 118: (((unsigned)(pWin->backgroundTile) > 4) && ! 119: (pPrivWin->fastBackground != 0))) ! 120: { ! 121: pPrivWin->oldRotate.x = pWin->absCorner.x; ! 122: pPrivWin->oldRotate.y = pWin->absCorner.y; ! 123: } ! 124: } ! 125: ! 126: Bool cfbUnmapWindow(pWindow, x, y) ! 127: WindowPtr pWindow; ! 128: int x, y; ! 129: { ! 130: } ! 131: ! 132: /* UNCLEAN! ! 133: this code calls the bitblt helper code directly. ! 134: ! 135: cfbCopyWindow copies only the parts of the destination that are ! 136: visible in the source. ! 137: */ ! 138: ! 139: ! 140: void ! 141: cfbCopyWindow(pWin, ptOldOrg, prgnSrc) ! 142: WindowPtr pWin; ! 143: DDXPointRec ptOldOrg; ! 144: RegionPtr prgnSrc; ! 145: { ! 146: DDXPointPtr pptSrc; ! 147: register DDXPointPtr ppt; ! 148: RegionPtr prgnDst; ! 149: register BoxPtr pbox; ! 150: register int dx, dy; ! 151: register int i, nbox; ! 152: WindowPtr pwinRoot; ! 153: ! 154: pwinRoot = &WindowTable[pWin->drawable.pScreen->myNum]; ! 155: ! 156: prgnDst = (* pWin->drawable.pScreen->RegionCreate)(NULL, ! 157: pWin->borderClip->numRects); ! 158: ! 159: dx = ptOldOrg.x - pWin->absCorner.x; ! 160: dy = ptOldOrg.y - pWin->absCorner.y; ! 161: (* pWin->drawable.pScreen->TranslateRegion)(prgnSrc, -dx, -dy); ! 162: (* pWin->drawable.pScreen->Intersect)(prgnDst, pWin->borderClip, prgnSrc); ! 163: ! 164: pbox = prgnDst->rects; ! 165: nbox = prgnDst->numRects; ! 166: if(!(pptSrc = (DDXPointPtr )ALLOCATE_LOCAL( prgnDst->numRects * ! 167: sizeof(DDXPointRec)))) ! 168: return; ! 169: ppt = pptSrc; ! 170: ! 171: for (i=0; i<nbox; i++, ppt++, pbox++) ! 172: { ! 173: ppt->x = pbox->x1 + dx; ! 174: ppt->y = pbox->y1 + dy; ! 175: } ! 176: ! 177: cfbDoBitblt(pwinRoot, pwinRoot, GXcopy, prgnDst, pptSrc); ! 178: DEALLOCATE_LOCAL(pptSrc); ! 179: (* pWin->drawable.pScreen->RegionDestroy)(prgnDst); ! 180: } ! 181: ! 182: ! 183: ! 184: /* swap in correct PaintWindow* routine. If we can use a fast output ! 185: routine (i.e. the pixmap is paddable to 32 bits), also pre-rotate a copy ! 186: of it in devPrivate. ! 187: */ ! 188: Bool ! 189: cfbChangeWindowAttributes(pWin, mask) ! 190: WindowPtr pWin; ! 191: int mask; ! 192: { ! 193: register int index; ! 194: register cfbPrivWin *pPrivWin; ! 195: ! 196: pPrivWin = (cfbPrivWin *)(pWin->devPrivate); ! 197: while(mask) ! 198: { ! 199: index = ffs(mask) -1; ! 200: mask &= ~(index = 1 << index); ! 201: switch(index) ! 202: { ! 203: case CWBackingStore: ! 204: /* ! 205: if ((pWin->backingStore == WhenMapped) || ! 206: (pWin->backingStore == Always)) ! 207: { ! 208: if (!pWin->devBackingStore) ! 209: { ! 210: pWin->devBackingStore = (pointer)miInitBackingStore(pWin); ! 211: if (!pWin->backStorage) ! 212: pWin->backStorage = ! 213: (BackingStorePtr)Xalloc(sizeof(BackingStoreRec)); ! 214: pWin->backStorage->SaveDoomedAreas = miSaveAreas; ! 215: pWin->backStorage->RestoreAreas = miRestoreAreas; ! 216: pWin->backStorage->TranslateBackingStore = ! 217: miTranslateBackingStore; ! 218: } ! 219: } ! 220: else ! 221: { ! 222: if (pWin->devBackingStore) ! 223: miRemoveBackingStore(pWin); ! 224: } ! 225: */ ! 226: break; ! 227: ! 228: case CWBackPixmap: ! 229: switch((int)pWin->backgroundTile) ! 230: { ! 231: case None: ! 232: pWin->PaintWindowBackground = cfbPaintAreaNone; ! 233: pPrivWin->fastBackground = 0; ! 234: break; ! 235: case ParentRelative: ! 236: pWin->PaintWindowBackground = cfbPaintAreaPR; ! 237: pPrivWin->fastBackground = 0; ! 238: break; ! 239: default: ! 240: if(cfbPadPixmap(pWin->backgroundTile)) ! 241: { ! 242: pPrivWin->fastBackground = 1; ! 243: pPrivWin->oldRotate.x = pWin->absCorner.x; ! 244: pPrivWin->oldRotate.y = pWin->absCorner.y; ! 245: if (pPrivWin->pRotatedBackground) ! 246: cfbDestroyPixmap(pPrivWin->pRotatedBackground); ! 247: pPrivWin->pRotatedBackground = ! 248: cfbCopyPixmap(pWin->backgroundTile); ! 249: cfbXRotatePixmap(pPrivWin->pRotatedBackground, ! 250: pWin->absCorner.x); ! 251: cfbYRotatePixmap(pPrivWin->pRotatedBackground, ! 252: pWin->absCorner.y); ! 253: pWin->PaintWindowBackground = cfbPaintArea32; ! 254: } ! 255: else ! 256: { ! 257: pPrivWin->fastBackground = 0; ! 258: pWin->PaintWindowBackground = miPaintWindow; ! 259: } ! 260: break; ! 261: } ! 262: break; ! 263: ! 264: case CWBackPixel: ! 265: pWin->PaintWindowBackground = cfbPaintAreaSolid; ! 266: pPrivWin->fastBackground = 0; ! 267: break; ! 268: ! 269: case CWBorderPixmap: ! 270: switch((int)pWin->borderTile) ! 271: { ! 272: case None: ! 273: pWin->PaintWindowBorder = cfbPaintAreaNone; ! 274: pPrivWin->fastBorder = 0; ! 275: break; ! 276: case ParentRelative: ! 277: pWin->PaintWindowBorder = cfbPaintAreaPR; ! 278: pPrivWin->fastBorder = 0; ! 279: break; ! 280: default: ! 281: if(cfbPadPixmap(pWin->borderTile)) ! 282: { ! 283: pPrivWin->fastBorder = 1; ! 284: pPrivWin->oldRotate.x = pWin->absCorner.x; ! 285: pPrivWin->oldRotate.y = pWin->absCorner.y; ! 286: if (pPrivWin->pRotatedBorder) ! 287: cfbDestroyPixmap(pPrivWin->pRotatedBorder); ! 288: pPrivWin->pRotatedBorder = ! 289: cfbCopyPixmap(pWin->borderTile); ! 290: cfbXRotatePixmap(pPrivWin->pRotatedBorder, ! 291: pWin->absCorner.x); ! 292: cfbYRotatePixmap(pPrivWin->pRotatedBorder, ! 293: pWin->absCorner.y); ! 294: pWin->PaintWindowBorder = cfbPaintArea32; ! 295: } ! 296: else ! 297: { ! 298: pPrivWin->fastBorder = 0; ! 299: pWin->PaintWindowBorder = cfbPaintAreaOther; ! 300: } ! 301: break; ! 302: } ! 303: break; ! 304: case CWBorderPixel: ! 305: pWin->PaintWindowBorder = cfbPaintAreaSolid; ! 306: pPrivWin->fastBorder = 0; ! 307: break; ! 308: ! 309: } ! 310: } ! 311: } ! 312:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.