diff options
Diffstat (limited to 'tree')
-rw-r--r-- | tree/cmap.c | 26 | ||||
-rw-r--r-- | tree/colorspace.c | 18 | ||||
-rw-r--r-- | tree/font.c | 31 | ||||
-rw-r--r-- | tree/image.c | 19 | ||||
-rw-r--r-- | tree/tree.c | 8 |
5 files changed, 73 insertions, 29 deletions
diff --git a/tree/cmap.c b/tree/cmap.c index d44ac117..532246bc 100644 --- a/tree/cmap.c +++ b/tree/cmap.c @@ -15,6 +15,7 @@ struct fz_range_s struct fz_cmap_s { + int nrefs; char cmapname[32]; char usecmapname[32]; @@ -45,6 +46,7 @@ fz_newcmap(fz_cmap **cmapp) if (!cmap) return fz_outofmem; + cmap->nrefs = 1; strcpy(cmap->cmapname, ""); strcpy(cmap->usecmapname, ""); @@ -65,14 +67,24 @@ fz_newcmap(fz_cmap **cmapp) return nil; } +fz_cmap * +fz_keepcmap(fz_cmap *cmap) +{ + cmap->nrefs ++; + return cmap; +} + void fz_dropcmap(fz_cmap *cmap) { - if (cmap->usecmap) - fz_dropcmap(cmap->usecmap); - fz_free(cmap->ranges); - fz_free(cmap->lookup); - fz_free(cmap); + if (--cmap->nrefs == 0) + { + if (cmap->usecmap) + fz_dropcmap(cmap->usecmap); + fz_free(cmap->ranges); + fz_free(cmap->lookup); + fz_free(cmap); + } } char * @@ -114,7 +126,9 @@ fz_setusecmap(fz_cmap *cmap, fz_cmap *usecmap) { int i; - cmap->usecmap = usecmap; + if (cmap->usecmap) + fz_dropcmap(cmap->usecmap); + cmap->usecmap = fz_keepcmap(usecmap); if (cmap->ncspace == 0) { diff --git a/tree/colorspace.c b/tree/colorspace.c index 70456aae..a8aff2c2 100644 --- a/tree/colorspace.c +++ b/tree/colorspace.c @@ -1,13 +1,23 @@ #include <fitz.h> +fz_colorspace * +fz_keepcolorspace(fz_colorspace *cs) +{ + cs->nrefs ++; + return cs; +} + void fz_dropcolorspace(fz_colorspace *cs) { - if (cs->frozen) + if (cs->nrefs < 0) return; - if (cs->drop) - cs->drop(cs); - fz_free(cs); + if (--cs->nrefs == 0) + { + if (cs->drop) + cs->drop(cs); + fz_free(cs); + } } void diff --git a/tree/font.c b/tree/font.c index 16626651..91ba7954 100644 --- a/tree/font.c +++ b/tree/font.c @@ -3,6 +3,7 @@ void fz_initfont(fz_font *font, char *name) { + font->nrefs = 1; strlcpy(font->name, name, sizeof font->name); font->wmode = 0; @@ -30,6 +31,26 @@ fz_initfont(fz_font *font, char *name) font->dvmtx.w = -1000; } +fz_font * +fz_keepfont(fz_font *font) +{ + font->nrefs ++; + return font; +} + +void +fz_dropfont(fz_font *font) +{ + if (--font->nrefs == 0) + { + if (font->drop) + font->drop(font); + fz_free(font->hmtx); + fz_free(font->vmtx); + fz_free(font); + } +} + void fz_setfontwmode(fz_font *font, int wmode) { @@ -216,16 +237,6 @@ notfound: } void -fz_dropfont(fz_font *font) -{ - if (font->drop) - font->drop(font); - fz_free(font->hmtx); - fz_free(font->vmtx); - fz_free(font); -} - -void fz_debugfont(fz_font *font) { int i; diff --git a/tree/image.c b/tree/image.c index 16a1c817..c448f41a 100644 --- a/tree/image.c +++ b/tree/image.c @@ -1,9 +1,20 @@ #include <fitz.h> -void fz_dropimage(fz_image *image) +fz_image * +fz_keepimage(fz_image *image) { - if (image->drop) - image->drop(image); - fz_free(image); + image->nrefs ++; + return image; +} + +void +fz_dropimage(fz_image *image) +{ + if (--image->nrefs == 0) + { + if (image->drop) + image->drop(image); + fz_free(image); + } } diff --git a/tree/tree.c b/tree/tree.c index 85521cdc..4d76b70e 100644 --- a/tree/tree.c +++ b/tree/tree.c @@ -9,7 +9,7 @@ fz_newtree(fz_tree **treep) if (!tree) return fz_outofmem; - tree->refcount = 1; + tree->nrefs = 1; tree->root = nil; tree->head = nil; @@ -19,16 +19,14 @@ fz_newtree(fz_tree **treep) fz_tree * fz_keeptree(fz_tree *tree) { - tree->refcount ++; + tree->nrefs ++; return tree; } void fz_droptree(fz_tree *tree) { - tree->refcount --; - - if (tree->refcount == 0) + if (--tree->nrefs == 0) { if (tree->root) fz_dropnode(tree->root); |