summaryrefslogtreecommitdiffstats
path: root/xlib/xgc.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlib/xgc.c')
-rw-r--r--xlib/xgc.c353
1 files changed, 353 insertions, 0 deletions
diff --git a/xlib/xgc.c b/xlib/xgc.c
new file mode 100644
index 0000000..cdd1021
--- /dev/null
+++ b/xlib/xgc.c
@@ -0,0 +1,353 @@
+/*
+ * xgc.c --
+ *
+ * This file contains generic routines for manipulating X graphics
+ * contexts.
+ *
+ * Copyright (c) 1995-1996 Sun Microsystems, Inc.
+ *
+ * See the file "license.terms" for information on usage and redistribution
+ * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
+ *
+ * SCCS: @(#) xgc.c 1.8 96/10/11 14:59:39
+ */
+
+#include <tkInt.h>
+
+#ifdef MAC_TCL
+# include <Xlib.h>
+#else
+# include <X11/Xlib.h>
+#endif
+
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * XCreateGC --
+ *
+ * Allocate a new GC, and initialize the specified fields.
+ *
+ * Results:
+ * Returns a newly allocated GC.
+ *
+ * Side effects:
+ * None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+GC
+XCreateGC(display, d, mask, values)
+ Display* display;
+ Drawable d;
+ unsigned long mask;
+ XGCValues* values;
+{
+ GC gp;
+
+ gp = (XGCValues *)ckalloc(sizeof(XGCValues));
+ if (!gp) {
+ return None;
+ }
+
+ gp->function = (mask & GCFunction) ?values->function :GXcopy;
+ gp->plane_mask = (mask & GCPlaneMask) ?values->plane_mask :~0;
+ gp->foreground = (mask & GCForeground) ?values->foreground :0;
+ gp->background = (mask & GCBackground) ?values->background :0xffffff;
+ gp->line_width = (mask & GCLineWidth) ?values->line_width :0;
+ gp->line_style = (mask & GCLineStyle) ?values->line_style :LineSolid;
+ gp->cap_style = (mask & GCCapStyle) ?values->cap_style :0;
+ gp->join_style = (mask & GCJoinStyle) ?values->join_style :0;
+ gp->fill_style = (mask & GCFillStyle) ?values->fill_style :FillSolid;
+ gp->fill_rule = (mask & GCFillRule) ?values->fill_rule :WindingRule;
+ gp->arc_mode = (mask & GCArcMode) ?values->arc_mode :ArcPieSlice;
+ gp->tile = (mask & GCTile) ?values->tile :None;
+ gp->stipple = (mask & GCStipple) ?values->stipple :None;
+ gp->ts_x_origin = (mask & GCTileStipXOrigin) ?values->ts_x_origin:0;
+ gp->ts_y_origin = (mask & GCTileStipYOrigin) ?values->ts_y_origin:0;
+ gp->font = (mask & GCFont) ?values->font :None;
+ gp->subwindow_mode = (mask & GCSubwindowMode)?values->subwindow_mode:ClipByChildren;
+ gp->graphics_exposures = (mask & GCGraphicsExposures)?values->graphics_exposures:True;
+ gp->clip_x_origin = (mask & GCClipXOrigin) ?values->clip_x_origin :0;
+ gp->clip_y_origin = (mask & GCClipYOrigin) ?values->clip_y_origin :0;
+ gp->dash_offset = (mask & GCDashOffset) ?values->dash_offset :0;
+ gp->dashes = (mask & GCDashList) ?values->dashes :4;
+
+ if (mask & GCClipMask) {
+ gp->clip_mask = (Pixmap)ckalloc(sizeof(TkpClipMask));
+ ((TkpClipMask*)gp->clip_mask)->type = TKP_CLIP_PIXMAP;
+ ((TkpClipMask*)gp->clip_mask)->value.pixmap = values->clip_mask;
+ } else {
+ gp->clip_mask = None;
+ }
+
+ return gp;
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * XChangeGC --
+ *
+ * Changes the GC components specified by valuemask for the
+ * specified GC.
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * Updates the specified GC.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+XChangeGC(d, gc, mask, values)
+ Display * d;
+ GC gc;
+ unsigned long mask;
+ XGCValues *values;
+{
+ if (mask & GCFunction) { gc->function = values->function; }
+ if (mask & GCPlaneMask) { gc->plane_mask = values->plane_mask; }
+ if (mask & GCForeground) { gc->foreground = values->foreground; }
+ if (mask & GCBackground) { gc->background = values->background; }
+ if (mask & GCLineWidth) { gc->line_width = values->line_width; }
+ if (mask & GCLineStyle) { gc->line_style = values->line_style; }
+ if (mask & GCCapStyle) { gc->cap_style = values->cap_style; }
+ if (mask & GCJoinStyle) { gc->join_style = values->join_style; }
+ if (mask & GCFillStyle) { gc->fill_style = values->fill_style; }
+ if (mask & GCFillRule) { gc->fill_rule = values->fill_rule; }
+ if (mask & GCArcMode) { gc->arc_mode = values->arc_mode; }
+ if (mask & GCTile) { gc->tile = values->tile; }
+ if (mask & GCStipple) { gc->stipple = values->stipple; }
+ if (mask & GCTileStipXOrigin) { gc->ts_x_origin = values->ts_x_origin; }
+ if (mask & GCTileStipYOrigin) { gc->ts_y_origin = values->ts_y_origin; }
+ if (mask & GCFont) { gc->font = values->font; }
+ if (mask & GCSubwindowMode) { gc->subwindow_mode = values->subwindow_mode; }
+ if (mask & GCGraphicsExposures) { gc->graphics_exposures = values->graphics_exposures; }
+ if (mask & GCClipXOrigin) { gc->clip_x_origin = values->clip_x_origin; }
+ if (mask & GCClipYOrigin) { gc->clip_y_origin = values->clip_y_origin; }
+ if (mask & GCClipMask) { XSetClipMask(d, gc, values->clip_mask); }
+ if (mask & GCDashOffset) { gc->dash_offset = values->dash_offset; }
+ if (mask & GCDashList) { gc->dashes = values->dashes; }
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * XFreeGC --
+ *
+ * Deallocates the specified graphics context.
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * None.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+XFreeGC(d, gc)
+ Display * d;
+ GC gc;
+{
+ if (gc != None) {
+ if (gc->clip_mask != None) {
+ ckfree((char*) gc->clip_mask);
+ }
+ ckfree((char *) gc);
+ }
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * XSetForeground, etc. --
+ *
+ * The following functions are simply accessor functions for
+ * the GC slots.
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * Each function sets some slot in the GC.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+XSetForeground(display, gc, foreground)
+ Display *display;
+ GC gc;
+ unsigned long foreground;
+{
+ gc->foreground = foreground;
+}
+
+void
+XSetBackground(display, gc, background)
+ Display *display;
+ GC gc;
+ unsigned long background;
+{
+ gc->background = background;
+}
+
+void
+XSetFunction(display, gc, function)
+ Display *display;
+ GC gc;
+ int function;
+{
+ gc->function = function;
+}
+
+void
+XSetFillRule(display, gc, fill_rule)
+ Display *display;
+ GC gc;
+ int fill_rule;
+{
+ gc->fill_rule = fill_rule;
+}
+
+void
+XSetFillStyle(display, gc, fill_style)
+ Display *display;
+ GC gc;
+ int fill_style;
+{
+ gc->fill_style = fill_style;
+}
+
+void
+XSetTSOrigin(display, gc, x, y)
+ Display *display;
+ GC gc;
+ int x, y;
+{
+ gc->ts_x_origin = x;
+ gc->ts_y_origin = y;
+}
+
+void
+XSetFont(display, gc, font)
+ Display *display;
+ GC gc;
+ Font font;
+{
+ gc->font = font;
+}
+
+void
+XSetArcMode(display, gc, arc_mode)
+ Display *display;
+ GC gc;
+ int arc_mode;
+{
+ gc->arc_mode = arc_mode;
+}
+
+void
+XSetStipple(display, gc, stipple)
+ Display *display;
+ GC gc;
+ Pixmap stipple;
+{
+ gc->stipple = stipple;
+}
+
+void
+XSetLineAttributes(display, gc, line_width, line_style, cap_style,
+ join_style)
+ Display *display;
+ GC gc;
+ unsigned int line_width;
+ int line_style;
+ int cap_style;
+ int join_style;
+{
+ gc->line_width = line_width;
+ gc->line_style = line_style;
+ gc->cap_style = cap_style;
+ gc->join_style = join_style;
+}
+
+void
+XSetClipOrigin(display, gc, clip_x_origin, clip_y_origin)
+ Display* display;
+ GC gc;
+ int clip_x_origin;
+ int clip_y_origin;
+{
+ gc->clip_x_origin = clip_x_origin;
+ gc->clip_y_origin = clip_y_origin;
+}
+
+/*
+ *----------------------------------------------------------------------
+ *
+ * TkSetRegion, XSetClipMask --
+ *
+ * Sets the clipping region/pixmap for a GC.
+ *
+ * Note that unlike the Xlib equivalent, it is not safe to delete
+ * the region after setting it into the GC. The only use of
+ * TkSetRegion is currently in ImgPhotoDisplay, which uses the GC
+ * immediately.
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * Allocates or dealloates a TkpClipMask.
+ *
+ *----------------------------------------------------------------------
+ */
+
+void
+TkSetRegion(display, gc, r)
+ Display* display;
+ GC gc;
+ TkRegion r;
+{
+ if (r == None) {
+ if (gc->clip_mask) {
+ ckfree((char*) gc->clip_mask);
+ gc->clip_mask = None;
+ }
+ return;
+ }
+
+ if (gc->clip_mask == None) {
+ gc->clip_mask = (Pixmap)ckalloc(sizeof(TkpClipMask));
+ }
+ ((TkpClipMask*)gc->clip_mask)->type = TKP_CLIP_REGION;
+ ((TkpClipMask*)gc->clip_mask)->value.region = r;
+}
+
+void
+XSetClipMask(display, gc, pixmap)
+ Display* display;
+ GC gc;
+ Pixmap pixmap;
+{
+ if (pixmap == None) {
+ if (gc->clip_mask) {
+ ckfree((char*) gc->clip_mask);
+ gc->clip_mask = None;
+ }
+ return;
+ }
+
+ if (gc->clip_mask == None) {
+ gc->clip_mask = (Pixmap)ckalloc(sizeof(TkpClipMask));
+ }
+ ((TkpClipMask*)gc->clip_mask)->type = TKP_CLIP_PIXMAP;
+ ((TkpClipMask*)gc->clip_mask)->value.pixmap = pixmap;
+}