|
|
1.1 ! root 1: #include "copyright.h" ! 2: ! 3: /* $Header: XCrGC.c,v 11.21 87/09/09 15:58:25 newman Exp $ */ ! 4: /* Copyright Massachusetts Institute of Technology 1986 */ ! 5: ! 6: #include "Xlibint.h" ! 7: ! 8: static XGCValues initial_GC = { ! 9: GXcopy, /* function */ ! 10: AllPlanes, /* plane_mask */ ! 11: 0L, /* foreground */ ! 12: 1L, /* background */ ! 13: 0, /* line_width */ ! 14: LineSolid, /* line_style */ ! 15: CapButt, /* cap_style */ ! 16: JoinMiter, /* join_style */ ! 17: FillSolid, /* fill_style */ ! 18: EvenOddRule,/* fill_rule */ ! 19: ArcPieSlice,/* arc_mode */ ! 20: ~0, /* tile, impossible (unknown) resource */ ! 21: ~0, /* stipple, impossible (unknown) resource */ ! 22: 0, /* ts_x_origin */ ! 23: 0, /* ts_y_origin */ ! 24: ~0, /* font, impossible (unknown) resource */ ! 25: ClipByChildren, /* subwindow_mode */ ! 26: True, /* graphics_exposures */ ! 27: 0, /* clip_x_origin */ ! 28: 0, /* clip_y_origin */ ! 29: None, /* clip_mask */ ! 30: 0, /* dash_offset */ ! 31: 4 /* dashes (list [4,4]) */ ! 32: }; ! 33: ! 34: GC XCreateGC (dpy, d, valuemask, values) ! 35: register Display *dpy; ! 36: Drawable d; /* Window or Pixmap for which depth matches */ ! 37: unsigned long valuemask; /* which ones to set initially */ ! 38: XGCValues *values; /* the values themselves */ ! 39: { ! 40: register GC gc; ! 41: register xCreateGCReq *req; ! 42: register _XExtension *ext; ! 43: ! 44: LockDisplay(dpy); ! 45: if ((gc = (GC)Xmalloc (sizeof(struct _XGC))) == NULL) { ! 46: errno = ENOMEM; ! 47: (*_XIOErrorFunction)(dpy); ! 48: UnlockDisplay(dpy); ! 49: return (NULL); ! 50: } ! 51: gc->rects = 0; ! 52: gc->dashes = 0; ! 53: gc->ext_data = NULL; ! 54: gc->values = initial_GC; ! 55: gc->dirty = 0L; ! 56: ! 57: if (valuemask) _XUpdateGCCache (gc, valuemask, values); ! 58: ! 59: GetReq(CreateGC, req); ! 60: req->drawable = d; ! 61: req->gc = gc->gid = XAllocID(dpy); ! 62: ! 63: if (req->mask = gc->dirty) ! 64: _XGenerateGCList (dpy, gc, (xReq *) req); ! 65: ext = dpy->ext_procs; ! 66: while (ext) { /* call out to any extensions interested */ ! 67: if (ext->create_GC != NULL) (*ext->create_GC)(dpy, gc, &ext->codes); ! 68: ext = ext->next; ! 69: } ! 70: UnlockDisplay(dpy); ! 71: SyncHandle(); ! 72: return (gc); ! 73: } ! 74: ! 75: /* ! 76: * GenerateGCList looks at the GC dirty bits, and appends all the required ! 77: * long words to the request being generated. Clears the dirty bits in ! 78: * the GC. ! 79: */ ! 80: ! 81: _XGenerateGCList (dpy, gc, req) ! 82: register Display *dpy; ! 83: xReq *req; ! 84: GC gc; ! 85: { ! 86: /* Warning! This code assumes that "unsigned long" is 32-bits wide */ ! 87: ! 88: unsigned long values[32]; ! 89: register unsigned long *value = values; ! 90: long nvalues; ! 91: register XGCValues *gv = &gc->values; ! 92: register unsigned long dirty = gc->dirty; ! 93: ! 94: /* ! 95: * Note: The order of these tests are critical; the order must be the ! 96: * same as the GC mask bits in the word. ! 97: */ ! 98: if (dirty & GCFunction) *value++ = gv->function; ! 99: if (dirty & GCPlaneMask) *value++ = gv->plane_mask; ! 100: if (dirty & GCForeground) *value++ = gv->foreground; ! 101: if (dirty & GCBackground) *value++ = gv->background; ! 102: if (dirty & GCLineWidth) *value++ = gv->line_width; ! 103: if (dirty & GCLineStyle) *value++ = gv->line_style; ! 104: if (dirty & GCCapStyle) *value++ = gv->cap_style; ! 105: if (dirty & GCJoinStyle) *value++ = gv->join_style; ! 106: if (dirty & GCFillStyle) *value++ = gv->fill_style; ! 107: if (dirty & GCFillRule) *value++ = gv->fill_rule; ! 108: if (dirty & GCTile) *value++ = gv->tile; ! 109: if (dirty & GCStipple) *value++ = gv->stipple; ! 110: if (dirty & GCTileStipXOrigin) *value++ = gv->ts_x_origin; ! 111: if (dirty & GCTileStipYOrigin) *value++ = gv->ts_y_origin; ! 112: if (dirty & GCFont) *value++ = gv->font; ! 113: if (dirty & GCSubwindowMode) *value++ = gv->subwindow_mode; ! 114: if (dirty & GCGraphicsExposures) *value++ = gv->graphics_exposures; ! 115: if (dirty & GCClipXOrigin) *value++ = gv->clip_x_origin; ! 116: if (dirty & GCClipYOrigin) *value++ = gv->clip_y_origin; ! 117: if (dirty & GCClipMask) *value++ = gv->clip_mask; ! 118: if (dirty & GCDashOffset) *value++ = gv->dash_offset; ! 119: if (dirty & GCDashList) *value++ = gv->dashes; ! 120: if (dirty & GCArcMode) *value++ = gv->arc_mode; ! 121: ! 122: req->length += (nvalues = value - values); ! 123: ! 124: /* ! 125: * note: Data is a macro that uses its arguments multiple ! 126: * times, so "nvalues" is changed in a separate assignment ! 127: * statement ! 128: */ ! 129: ! 130: nvalues <<= 2; ! 131: Data (dpy, (char *) values, nvalues); ! 132: gc->dirty = 0L; ! 133: ! 134: } ! 135: ! 136: ! 137: _XUpdateGCCache (gc, mask, att) ! 138: register long mask; ! 139: register XGCValues *att; ! 140: register GC gc; ! 141: { ! 142: register XGCValues *gv = &gc->values; ! 143: ! 144: if (mask & GCFunction) ! 145: if (gv->function != att->function) { ! 146: gv->function = att->function; ! 147: gc->dirty |= GCFunction; ! 148: } ! 149: ! 150: if (mask & GCPlaneMask) ! 151: if (gv->plane_mask != att->plane_mask) { ! 152: gv->plane_mask = att->plane_mask; ! 153: gc->dirty |= GCPlaneMask; ! 154: } ! 155: ! 156: if (mask & GCForeground) ! 157: if (gv->foreground != att->foreground) { ! 158: gv->foreground = att->foreground; ! 159: gc->dirty |= GCForeground; ! 160: } ! 161: ! 162: if (mask & GCBackground) ! 163: if (gv->background != att->background) { ! 164: gv->background = att->background; ! 165: gc->dirty |= GCBackground; ! 166: } ! 167: ! 168: if (mask & GCLineWidth) ! 169: if (gv->line_width != att->line_width) { ! 170: gv->line_width = att->line_width; ! 171: gc->dirty |= GCLineWidth; ! 172: } ! 173: ! 174: if (mask & GCLineStyle) ! 175: if (gv->line_style != att->line_style) { ! 176: gv->line_style = att->line_style; ! 177: gc->dirty |= GCLineStyle; ! 178: } ! 179: ! 180: if (mask & GCCapStyle) ! 181: if (gv->cap_style != att->cap_style) { ! 182: gv->cap_style = att->cap_style; ! 183: gc->dirty |= GCCapStyle; ! 184: } ! 185: ! 186: if (mask & GCJoinStyle) ! 187: if (gv->join_style != att->join_style) { ! 188: gv->join_style = att->join_style; ! 189: gc->dirty |= GCJoinStyle; ! 190: } ! 191: ! 192: if (mask & GCFillStyle) ! 193: if (gv->fill_style != att->fill_style) { ! 194: gv->fill_style = att->fill_style; ! 195: gc->dirty |= GCFillStyle; ! 196: } ! 197: ! 198: if (mask & GCFillRule) ! 199: if (gv->fill_rule != att->fill_rule) { ! 200: gv->fill_rule = att->fill_rule; ! 201: gc->dirty |= GCFillRule; ! 202: } ! 203: ! 204: if (mask & GCArcMode) ! 205: if (gv->arc_mode != att->arc_mode) { ! 206: gv->arc_mode = att->arc_mode; ! 207: gc->dirty |= GCArcMode; ! 208: } ! 209: ! 210: /* always write through resource ID changes */ ! 211: if (mask & GCTile) { ! 212: gv->tile = att->tile; ! 213: gc->dirty |= GCTile; ! 214: } ! 215: ! 216: /* always write through resource ID changes */ ! 217: if (mask & GCStipple) { ! 218: gv->stipple = att->stipple; ! 219: gc->dirty |= GCStipple; ! 220: } ! 221: ! 222: if (mask & GCTileStipXOrigin) ! 223: if (gv->ts_x_origin != att->ts_x_origin) { ! 224: gv->ts_x_origin = att->ts_x_origin; ! 225: gc->dirty |= GCTileStipXOrigin; ! 226: } ! 227: ! 228: if (mask & GCTileStipYOrigin) ! 229: if (gv->ts_y_origin != att->ts_y_origin) { ! 230: gv->ts_y_origin = att->ts_y_origin; ! 231: gc->dirty |= GCTileStipYOrigin; ! 232: } ! 233: ! 234: /* always write through resource ID changes */ ! 235: if (mask & GCFont) { ! 236: gv->font = att->font; ! 237: gc->dirty |= GCFont; ! 238: } ! 239: ! 240: if (mask & GCSubwindowMode) ! 241: if (gv->subwindow_mode != att->subwindow_mode) { ! 242: gv->subwindow_mode = att->subwindow_mode; ! 243: gc->dirty |= GCSubwindowMode; ! 244: } ! 245: ! 246: if (mask & GCGraphicsExposures) ! 247: if (gv->graphics_exposures != att->graphics_exposures) { ! 248: gv->graphics_exposures = att->graphics_exposures; ! 249: gc->dirty |= GCGraphicsExposures; ! 250: } ! 251: ! 252: if (mask & GCClipXOrigin) ! 253: if (gv->clip_x_origin != att->clip_x_origin) { ! 254: gv->clip_x_origin = att->clip_x_origin; ! 255: gc->dirty |= GCClipXOrigin; ! 256: } ! 257: ! 258: if (mask & GCClipYOrigin) ! 259: if (gv->clip_y_origin != att->clip_y_origin) { ! 260: gv->clip_y_origin = att->clip_y_origin; ! 261: gc->dirty |= GCClipYOrigin; ! 262: } ! 263: ! 264: if (mask & GCClipMask) ! 265: if ((gv->clip_mask != att->clip_mask) || (gc->rects == True)) { ! 266: gv->clip_mask = att->clip_mask; ! 267: gc->dirty |= GCClipMask; ! 268: gc->rects = 0; ! 269: } ! 270: ! 271: if (mask & GCDashOffset) ! 272: if (gv->dash_offset != att->dash_offset) { ! 273: gv->dash_offset = att->dash_offset; ! 274: gc->dirty |= GCDashOffset; ! 275: } ! 276: ! 277: if (mask & GCDashList) ! 278: if ((gv->dashes != att->dashes) || (gc->dashes == True)) { ! 279: gv->dashes = att->dashes; ! 280: gc->dirty |= GCDashList; ! 281: gc->dashes = 0; ! 282: } ! 283: return; ! 284: } ! 285: ! 286: /* can only call when display is already locked. */ ! 287: ! 288: _XFlushGCCache(dpy, gc) ! 289: Display *dpy; ! 290: GC gc; ! 291: { ! 292: register xChangeGCReq *req; ! 293: register _XExtension *ext; ! 294: ! 295: if (gc->dirty) { ! 296: GetReq(ChangeGC, req); ! 297: req->gc = gc->gid; ! 298: req->mask = gc->dirty; ! 299: _XGenerateGCList (dpy, gc, (xReq *) req); ! 300: ext = dpy->ext_procs; ! 301: while (ext) { /* call out to any extensions interested */ ! 302: if (ext->flush_GC != NULL) (*ext->flush_GC)(dpy, gc, &ext->codes); ! 303: ext = ext->next; ! 304: } ! 305: } ! 306: } ! 307: ! 308: GContext XGContextFromGC(gc) ! 309: GC gc; ! 310: { return (gc->gid); }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.