diff options
Diffstat (limited to 'xlib')
-rw-r--r-- | xlib/xgc.c | 121 |
1 files changed, 83 insertions, 38 deletions
@@ -5,11 +5,12 @@ * contexts. * * Copyright (c) 1995-1996 Sun Microsystems, Inc. + * Copyright (c) 2002-2007 Daniel A. Steffen <das@users.sourceforge.net> * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: xgc.c,v 1.6.2.5 2007/07/02 13:27:04 das Exp $ + * RCS: @(#) $Id: xgc.c,v 1.6.2.6 2007/11/09 06:26:57 das Exp $ */ #include <tkInt.h> @@ -24,6 +25,7 @@ # define Region XRegion #endif #ifdef MAC_OSX_TK +# include <tkMacOSXInt.h> # include <X11/Xlib.h> # include <X11/X.h> # define Cursor XCursor @@ -34,6 +36,64 @@ /* *---------------------------------------------------------------------- * + * AllocClipMask -- + * + * Static helper proc to allocate new or clear existing TkpClipMask. + * + * Results: + * Returns ptr to the new/cleared TkpClipMask. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +static TkpClipMask *AllocClipMask(GC gc) { + TkpClipMask *clip_mask = (TkpClipMask*) gc->clip_mask; + + if (clip_mask == None) { + clip_mask = (TkpClipMask*) ckalloc(sizeof(TkpClipMask)); + gc->clip_mask = (Pixmap) clip_mask; +#ifdef MAC_OSX_TK + } else if (clip_mask->type == TKP_CLIP_REGION) { + TkpReleaseRegion(clip_mask->value.region); +#endif + } + return clip_mask; +} + +/* + *---------------------------------------------------------------------- + * + * FreeClipMask -- + * + * Static helper proc to free TkpClipMask. + * + * Results: + * None. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +static void FreeClipMask(GC gc) { + if (gc->clip_mask != None) { +#ifdef MAC_OSX_TK + if (((TkpClipMask*) gc->clip_mask)->type == TKP_CLIP_REGION) { + TkpReleaseRegion(((TkpClipMask*) gc->clip_mask)->value.region); + } +#endif + ckfree((char*) gc->clip_mask); + gc->clip_mask = None; + } +} + +/* + *---------------------------------------------------------------------- + * * XCreateGC -- * * Allocate a new GC, and initialize the specified fields. @@ -95,12 +155,12 @@ XCreateGC(display, d, mask, values) gp->dashes = (mask & GCDashList) ?values->dashes :4; (&(gp->dashes))[1] = 0; + gp->clip_mask = None; 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; + TkpClipMask *clip_mask = AllocClipMask(gp); + + clip_mask->type = TKP_CLIP_PIXMAP; + clip_mask->value.pixmap = values->clip_mask; } return gp; @@ -176,9 +236,7 @@ void XFreeGC(d, gc) GC gc; { if (gc != None) { - if (gc->clip_mask != None) { - ckfree((char*) gc->clip_mask); - } + FreeClipMask(gc); ckfree((char *) gc); } } @@ -341,9 +399,9 @@ XSetClipOrigin(display, gc, clip_x_origin, clip_y_origin) * 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 uses of TkSetRegion - * are currently in DisplayFrame and in ImgPhotoDisplay, which use the - * GC immediately. + * region after setting it into the GC (except on Mac OS X). The only + * uses of TkSetRegion are currently in DisplayFrame and in + * ImgPhotoDisplay, which use the GC immediately. * * Results: * None. @@ -360,22 +418,17 @@ TkSetRegion(display, gc, r) GC gc; TkRegion r; { - TkpClipMask *clip_mask; - if (r == None) { - if (gc->clip_mask) { - ckfree((char*) gc->clip_mask); - gc->clip_mask = None; - } - return; - } + FreeClipMask(gc); + } else { + TkpClipMask *clip_mask = AllocClipMask(gc); - if (gc->clip_mask == None) { - gc->clip_mask = (Pixmap)ckalloc(sizeof(TkpClipMask)); + clip_mask->type = TKP_CLIP_REGION; + clip_mask->value.region = r; +#ifdef MAC_OSX_TK + TkpRetainRegion(r); +#endif } - clip_mask = (TkpClipMask*) gc->clip_mask; - clip_mask->type = TKP_CLIP_REGION; - clip_mask->value.region = r; } void @@ -384,22 +437,14 @@ XSetClipMask(display, gc, pixmap) GC gc; Pixmap pixmap; { - TkpClipMask *clip_mask; - if (pixmap == None) { - if (gc->clip_mask) { - ckfree((char*) gc->clip_mask); - gc->clip_mask = None; - } - return; - } + FreeClipMask(gc); + } else { + TkpClipMask *clip_mask = AllocClipMask(gc); - if (gc->clip_mask == None) { - gc->clip_mask = (Pixmap)ckalloc(sizeof(TkpClipMask)); + clip_mask->type = TKP_CLIP_PIXMAP; + clip_mask->value.pixmap = pixmap; } - clip_mask = (TkpClipMask*) gc->clip_mask; - clip_mask->type = TKP_CLIP_PIXMAP; - clip_mask->value.pixmap = pixmap; } /* |