#ifndef lint static char sccsid[] = "@(#)gsave.c 7.2 87/09/19 Copyright 1985 Sun Micro"; #endif /* * Copyright (c) 1985 by Sun Microsystems, Inc. */ /*- Deal with gsave & grestore gsave.c, Mon Feb 10 12:10:42 1986 James Gosling, Sun Microsystems */ #include #ifdef REF #include #include #endif #include "shape.h" #include "canvas.h" #include "fontcache.h" #include "qalloc.h" cs_gsave(gc) register struct graphics_context *gc; { if (gc->gsave_used >= gc->gsave_size) { if (gc->gsave_used == 0) gc->gsaves = (struct graphics_context *) snoopalloc ("gsave.c", (gc->gsave_size = 2) * sizeof(struct graphics_context)); else gc->gsaves = (struct graphics_context *) snooprealloc ("gsave.c", gc->gsaves, (gc->gsave_size = gc->gsave_used + 2) * sizeof(struct graphics_context)); if (gc->gsaves == 0) malloc_failure("gsave"); } gc->gsaves[gc->gsave_used++] = *gc; if ((struct canvas *) gc->canvas && cv_is_canvas((struct canvas *) gc->canvas)) cv_incref((struct canvas *) gc->canvas); if (gc->shape && gc->shape->refcnt != STATIC_OBJ) sh_incref(gc->shape); if (gc->clip && gc->clip->refcnt != STATIC_OBJ) sh_incref(gc->clip); gc->path.bottompos = gc->path.used; if (gc->font) psf_incref(gc->font); } cs_grestore(gc) register struct graphics_context *gc; { if (gc->gsave_used <= 0) return -1; { register struct graphics_context *g = &gc->gsaves[--gc->gsave_used]; register struct canvas *cv; cv = (struct canvas *) gc->canvas; if (cv && cv_is_canvas(cv)) cv_decref(cv); if (gc->shape && gc->shape->refcnt != STATIC_OBJ) sh_decref(gc->shape); if (gc->clip && gc->clip->refcnt != STATIC_OBJ) sh_decref(gc->clip); if (gc->font) psf_decref(gc->font); g->path.element = gc->path.element; g->path.size = gc->path.size; g->gsaves = gc->gsaves; g->gsave_used = gc->gsave_used; g->gsave_size = gc->gsave_size; *gc = *g; } return 0; } cs_grestoreall(gc) register struct graphics_context *gc; { while (gc->gsave_used>0) cs_grestore(gc); }