|
|
1.1 root 1: #ifndef lint
2: static char rcsid[] = "$Header: GCManager.c,v 1.12 87/09/13 16:44:10 newman Exp $";
3: #endif lint
4:
5: /*
6: * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
7: *
8: * All Rights Reserved
9: *
10: * Permission to use, copy, modify, and distribute this software and its
11: * documentation for any purpose and without fee is hereby granted,
12: * provided that the above copyright notice appear in all copies and that
13: * both that copyright notice and this permission notice appear in
14: * supporting documentation, and that the name of Digital Equipment
15: * Corporation not be used in advertising or publicity pertaining to
16: * distribution of the software without specific, written prior permission.
17: *
18: *
19: * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
20: * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
21: * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
22: * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
23: * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
24: * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
25: * SOFTWARE.
26: */
27: #include "Intrinsic.h"
28:
29: typedef struct _GCrec {
30: Display *dpy; /* Display for GC */
31: Screen *screen; /* Screen for GC */
32: int depth; /* Depth for GC */
33: int ref_count; /* # of shareholders */
34: GC gc; /* The GC itself. */
35: int valueMask; /* What fields are being used right now. */
36: XGCValues values; /* What values those fields have. */
37: struct _GCrec *next; /* Next GC for this widgetkind. */
38: } GCrec, *GCptr;
39:
40:
41: static GCrec *GClist = NULL;
42:
43: static int Matches(ptr,widget, valueMask, v)
44: GCptr ptr;
45: Widget widget;
46: unsigned long valueMask;
47: register XGCValues *v;
48: {
49: #define CheckGCField(MaskBit,fieldName) \
50: if (m & MaskBit) if (p->fieldName != v->fieldName) return 0
51:
52: register int m = ptr->valueMask & valueMask;
53: register XGCValues *p = &(ptr->values);
54:
55: if (ptr->valueMask != valueMask) return 0;
56: if (ptr->depth != widget->core.depth) return 0;
57: if (ptr->screen != XtScreen(widget)) return 0;
58:
59: CheckGCField( GCFunction, function);
60: CheckGCField( GCPlaneMask, plane_mask);
61: CheckGCField( GCForeground, foreground);
62: CheckGCField( GCBackground, background);
63: CheckGCField( GCLineWidth, line_width);
64: CheckGCField( GCLineStyle, line_style);
65: CheckGCField( GCCapStyle, cap_style);
66: CheckGCField( GCJoinStyle, join_style);
67: CheckGCField( GCFillStyle, fill_style);
68: CheckGCField( GCFillRule, fill_rule);
69: CheckGCField( GCArcMode, arc_mode);
70: CheckGCField( GCTile, tile);
71: CheckGCField( GCStipple, stipple);
72: CheckGCField( GCTileStipXOrigin, ts_x_origin);
73: CheckGCField( GCTileStipYOrigin, ts_y_origin);
74: CheckGCField( GCFont, font);
75: CheckGCField( GCSubwindowMode, subwindow_mode);
76: CheckGCField( GCGraphicsExposures, graphics_exposures);
77: CheckGCField( GCClipXOrigin, clip_x_origin);
78: CheckGCField( GCClipYOrigin, clip_y_origin);
79: CheckGCField( GCClipMask, clip_mask);
80: CheckGCField( GCDashOffset, dash_offset);
81: CheckGCField( GCDashList, dashes);
82: #undef CheckGCField
83: return 1;
84: }
85:
86: static void SetFields(ptr, valueMask, v)
87: GCptr ptr;
88: register unsigned long valueMask;
89: register XGCValues *v;
90: {
91: #define SetGCField(MaskBit,fieldName) \
92: if (valueMask & MaskBit) p->fieldName = v->fieldName
93:
94: register XGCValues *p = &(ptr->values);
95:
96: SetGCField( GCFunction, function);
97: SetGCField( GCPlaneMask, plane_mask);
98: SetGCField( GCForeground, foreground);
99: SetGCField( GCBackground, background);
100: SetGCField( GCLineWidth, line_width);
101: SetGCField( GCLineStyle, line_style);
102: SetGCField( GCCapStyle, cap_style);
103: SetGCField( GCJoinStyle, join_style);
104: SetGCField( GCFillStyle, fill_style);
105: SetGCField( GCFillRule, fill_rule);
106: SetGCField( GCArcMode, arc_mode);
107: SetGCField( GCTile, tile);
108: SetGCField( GCStipple, stipple);
109: SetGCField( GCTileStipXOrigin, ts_x_origin);
110: SetGCField( GCTileStipYOrigin, ts_y_origin);
111: SetGCField( GCFont, font);
112: SetGCField( GCSubwindowMode, subwindow_mode);
113: SetGCField( GCGraphicsExposures, graphics_exposures);
114: SetGCField( GCClipXOrigin, clip_x_origin);
115: SetGCField( GCClipYOrigin, clip_y_origin);
116: SetGCField( GCClipMask, clip_mask);
117: SetGCField( GCDashOffset, dash_offset);
118: SetGCField( GCDashList, dashes);
119: ptr->valueMask |= valueMask;
120: XChangeGC(ptr->dpy, ptr->gc, valueMask, p);
121: #undef SetGCField
122: }
123:
124:
125: /*
126: * Return a read-only GC with the given values.
127: */
128:
129: GC XtGetGC(widget, valueMask, values)
130: Widget widget;
131: XtGCMask valueMask;
132: XGCValues *values;
133: {
134: GCptr first=GClist;
135: register GCptr cur;
136: Drawable drawable;
137:
138: for (cur = first; cur != NULL; cur = cur->next) {
139: if (Matches(cur, widget,valueMask, values)) {
140: valueMask &= ~cur->valueMask;
141: if (valueMask) SetFields(cur, valueMask, values);
142: cur->ref_count++;
143: return cur->gc;
144: }
145: }
146: cur = (GCptr) XtMalloc((unsigned)sizeof(GCrec));
147: cur->dpy = XtDisplay(widget);
148: cur->screen = XtScreen(widget);
149: cur->depth = widget->core.depth;
150: cur->ref_count = 1;
151: if (XtWindow(widget) == NULL)
152: drawable = XCreatePixmap(XtDisplay(widget), XtScreen(widget)->root,
153: 1,1,widget->core.depth);
154: else drawable = XtWindow(widget);
155: cur->gc = XCreateGC(XtDisplay(widget), drawable, valueMask, values);
156: cur->valueMask = valueMask;
157: cur->values = *values;
158: cur->next = first;
159: GClist = cur;
160: return cur->gc;
161: }
162:
163: void XtDestroyGC(gc)
164: GC gc;
165: {
166: GCptr first=GClist;
167: GCptr cur;
168:
169: for (cur = first; cur != NULL; cur = cur->next)
170: if (cur->gc == gc)
171: if (--(cur->ref_count) == 0) XFreeGC(cur->dpy, gc);
172: return;
173: }
174:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.