diff options
Diffstat (limited to 'xlib')
-rw-r--r-- | xlib/xgc.c | 121 |
1 files changed, 83 insertions, 38 deletions
@@ -9,7 +9,7 @@ * 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.13 2007/07/02 13:04:07 das Exp $ + * RCS: @(#) $Id: xgc.c,v 1.14 2007/10/12 03:13:55 das Exp $ */ #include <tkInt.h> @@ -18,11 +18,71 @@ # include <X11/Xlib.h> #endif #ifdef MAC_OSX_TK +# include <tkMacOSXInt.h> # include <X11/Xlib.h> # include <X11/X.h> # define Cursor XCursor # define Region XRegion #endif + + +/* + *---------------------------------------------------------------------- + * + * 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; + } +} /* *---------------------------------------------------------------------- @@ -92,12 +152,12 @@ XCreateGC( InitField(dashes, GCDashList, 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; @@ -180,9 +240,7 @@ void XFreeGC( GC gc) { if (gc != None) { - if (gc->clip_mask != None) { - ckfree((char*) gc->clip_mask); - } + FreeClipMask(gc); ckfree((char *) gc); } } @@ -344,9 +402,9 @@ XSetClipOrigin( * 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. @@ -363,22 +421,17 @@ TkSetRegion( 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 @@ -387,22 +440,14 @@ XSetClipMask( 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; } /* |