|
|
1.1 ! root 1: #ifndef lint ! 2: static char *rcsid_tile_c = "$Header: tile.c,v 10.2 86/02/01 16:21:30 tony Rel $"; ! 3: #endif lint ! 4: #ifdef sun ! 5: /* ! 6: * The Sun X drivers are a product of Sun Microsystems, Inc. and are provided ! 7: * for unrestricted use provided that this legend is included on all tape ! 8: * media and as a part of the software program in whole or part. Users ! 9: * may copy or modify these drivers without charge, but are not authorized ! 10: * to license or distribute them to anyone else except as part of a product or ! 11: * program developed by the user. ! 12: * ! 13: * THE SUN X DRIVERS ARE PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND ! 14: * INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A ! 15: * PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE ! 16: * PRACTICE. ! 17: * ! 18: * The Sun X Drivers are provided with no support and without any obligation ! 19: * on the part of Sun Microsystems, Inc. to assist in their use, correction, ! 20: * modification or enhancement. ! 21: * ! 22: * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE ! 23: * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THE SUN X ! 24: * DRIVERS OR ANY PART THEREOF. ! 25: * ! 26: * In no event will Sun Microsystems, Inc. be liable for any lost revenue ! 27: * or profits or other special, indirect and consequential damages, even if ! 28: * Sun has been advised of the possibility of such damages. ! 29: * ! 30: * Sun Microsystems, Inc. ! 31: * 2550 Garcia Avenue ! 32: * Mountain View, California 94043 ! 33: */ ! 34: ! 35: #ifndef lint ! 36: static char sccsid[] = "@(#)tile.c 2.1 86/01/28 Copyright 1986 Sun Micro"; ! 37: #endif ! 38: ! 39: /*- ! 40: * Copyright (c) 1986 by Sun Microsystems, Inc. ! 41: */ ! 42: ! 43: /* tile.c Perform a raster operation involving a pattern ! 44: * ! 45: * TileFill Patterns a portion of the screen ! 46: * DrawFilled Draw a filled generalized line/polygon/combination ! 47: * ! 48: */ ! 49: ! 50: /* ! 51: * ToDo: ! 52: * Implement draw filled ! 53: * Implement tile fill with xymap ! 54: * Use static pixrects ! 55: */ ! 56: ! 57: #include "Xsun.h" ! 58: ! 59: extern struct pixrect *PixRect; ! 60: ! 61: char *Xalloc(); ! 62: ! 63: static ! 64: PixrectFill(Tile, xymask, dstx, dsty, width, height, op, clips, clipcount, xoff, yoff) ! 65: struct pixrect *Tile; ! 66: BITMAP *xymask; ! 67: int dstx, dsty, width, height; ! 68: unsigned op; ! 69: CLIP *clips; ! 70: int clipcount; ! 71: int xoff, yoff; ! 72: { ! 73: if (xymask == NULL) { ! 74: /* spread tile from (dstx,dsty) by (width,height) */ ! 75: do { ! 76: int cleft, ctop, cwidth, cheight; ! 77: ! 78: GetNextClip(clips, cleft, ctop, cwidth, cheight); ! 79: if (OverLap(cleft, ctop, cwidth, cheight, dstx, dsty, width, height)) { ! 80: int tleft = (cleft > dstx ? cleft : dstx); ! 81: int ttop = (ctop > dsty ? ctop : dsty); ! 82: int twidth = (cleft + cwidth < dstx + width ? cleft + cwidth : dstx + width) - tleft; ! 83: int theight = (ctop + cheight < dsty + height ? ctop + cheight : dsty + height) - ttop; ! 84: /* XXX - is this the right tile mode? */ ! 85: CheckCursor(tleft, ttop, twidth, theight); ! 86: pr_replrop(PixRect, tleft, ttop, twidth, theight, op, ! 87: Tile, tleft - xoff, ttop - yoff); ! 88: } ! 89: } while (--clipcount > 0); ! 90: } ! 91: else { ! 92: /* spread tile thru xymask */ ! 93: struct pixrect *stencil = mem_point(xymask->width, xymask->width, 1, xymask->data); ! 94: ! 95: #ifdef notdef ! 96: do { ! 97: int cleft, ctop, cwidth, cheight; ! 98: ! 99: GetNextClip(clips, cleft, ctop, cwidth, cheight); ! 100: if (OverLap(cleft, ctop, cwidth, cheight, dstx, dsty, width, height)) { ! 101: int tleft = (cleft > dstx ? cleft : dstx); ! 102: int ttop = (ctop > dsty ? ctop : dsty); ! 103: int twidth = (cleft + cwidth < dstx + width ? cleft + cwidth : dstx + width) - tleft; ! 104: int theight = (ctop + cheight < dsty + height ? ctop + cheight : dsty + height) - ttop; ! 105: CheckCursor(tleft, ttop, twidth, theight); ! 106: /* XXX - need combination of stencil & replrop */ ! 107: pr_stencil(PixRect, tleft, ttop, twidth, theight, op, &stencil, tleft, ttop, NULL, 0, 0); ! 108: } ! 109: } while (--clipcount > 0); ! 110: #endif ! 111: pr_destroy(stencil); ! 112: } ! 113: } ! 114: ! 115: static ! 116: ConstantFill(tile, xymask, dstx, dsty, width, height, op, clips, clipcount) ! 117: PIXMAP *tile; ! 118: BITMAP *xymask; ! 119: int dstx, dsty, width, height; ! 120: unsigned op; ! 121: CLIP *clips; ! 122: int clipcount; ! 123: { ! 124: op |= PIX_COLOR((PINVERT(tile) ^ (int) tile->data)); ! 125: if (xymask == NULL) { ! 126: /* spread constant from (dstx,dsty) by (width,height) */ ! 127: do { ! 128: int cleft, ctop, cwidth, cheight; ! 129: ! 130: GetNextClip(clips, cleft, ctop, cwidth, cheight); ! 131: if (OverLap(cleft, ctop, cwidth, cheight, dstx, dsty, width, height)) { ! 132: int tleft = (cleft > dstx ? cleft : dstx); ! 133: int ttop = (ctop > dsty ? ctop : dsty); ! 134: int twidth = (cleft + cwidth < dstx + width ? cleft + cwidth : dstx + width) - tleft; ! 135: int theight = (ctop + cheight < dsty + height ? ctop + cheight : dsty + height) - ttop; ! 136: CheckCursor(tleft, ttop, twidth, theight); ! 137: /* XXX - is this the right tile mode? */ ! 138: pr_rop(PixRect, tleft, ttop, twidth, theight, op, NULL, 0, 0); ! 139: } ! 140: } while (--clipcount > 0); ! 141: } ! 142: else { ! 143: /* spread constant thru xymask */ ! 144: struct pixrect *stencil = mem_point(xymask->width, xymask->width, 1, xymask->data); ! 145: ! 146: do { ! 147: int cleft, ctop, cwidth, cheight; ! 148: ! 149: GetNextClip(clips, cleft, ctop, cwidth, cheight); ! 150: if (OverLap(cleft, ctop, cwidth, cheight, dstx, dsty, width, height)) { ! 151: int tleft = (cleft > dstx ? cleft : dstx); ! 152: int ttop = (ctop > dsty ? ctop : dsty); ! 153: int twidth = (cleft + cwidth < dstx + width ? cleft + cwidth : dstx + width) - tleft; ! 154: int theight = (ctop + cheight < dsty + height ? ctop + cheight : dsty + height) - ttop; ! 155: ! 156: CheckCursor(tleft, ttop, twidth, theight); ! 157: pr_stencil(PixRect, tleft, ttop, twidth, theight, op, stencil, tleft, ttop, NULL, 0, 0); ! 158: } ! 159: } while (--clipcount > 0); ! 160: pr_destroy(stencil); ! 161: } ! 162: } ! 163: ! 164: ! 165: /*ARGSUSED*/ ! 166: TileFill (tile, xoff, yoff, xymask, dstx, dsty, width, height, ! 167: clips, clipcount, func, zmask) ! 168: PIXMAP *tile; ! 169: BITMAP *xymask; ! 170: int xoff, yoff, dstx, dsty, width, height, zmask; ! 171: register int func; ! 172: CLIP *clips; ! 173: { ! 174: int op = SUN_FROM_X_OP(func) | PIX_DONTCLIP; ! 175: int allmask = -1; ! 176: ! 177: if ((PixRect->pr_depth == 1) && !(zmask & 1)) ! 178: return; ! 179: SetZmask(PixRect, &zmask); ! 180: switch (PTYPE(tile)) { ! 181: case BitmapPixmap: ! 182: { ! 183: struct pixrect *Tile = ! 184: mem_point(tile->width, tile->height, 1, ((BITMAP *) tile->data)->data); /* XXX - slow !!! */ ! 185: ! 186: PixrectFill(Tile, xymask, dstx, dsty, width, height, op, clips, clipcount, xoff, yoff); ! 187: pr_destroy(Tile); ! 188: } ! 189: break; ! 190: case ConstantPixmap: ! 191: ConstantFill(tile, xymask, dstx, dsty, width, height, op, clips, clipcount); ! 192: break; ! 193: case XYColorPixmap: ! 194: /* XXX - not yet implemented - do plane by plane */ ! 195: break; ! 196: case ZColorPixmap: ! 197: { ! 198: struct pixrect *Tile = ! 199: mem_point(tile->width, tile->height, PixRect->pr_depth, tile->data); /* XXX - slow !!! */ ! 200: ! 201: PixrectFill(Tile, xymask, dstx, dsty, width, height, op, clips, clipcount, xoff, yoff); ! 202: pr_destroy(Tile); ! 203: } ! 204: break; ! 205: } ! 206: SetZmask(PixRect, &allmask); ! 207: RestoreCursor(); ! 208: } ! 209: ! 210: /*ARGSUSED*/ ! 211: DrawFilled (verts, vertcount, xbase, ybase, srcpix, tile, xoff, yoff, ! 212: clips, clipcount, func, zmask) ! 213: Vertex *verts; ! 214: register PIXMAP *tile; ! 215: int vertcount, xbase, ybase, srcpix, xoff, yoff, clipcount, zmask; ! 216: register int func; ! 217: CLIP *clips; ! 218: { ! 219: /* XXX - need pr_polygon_2() */ ! 220: } ! 221: #endif sun
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.