summaryrefslogtreecommitdiff
path: root/tree
diff options
context:
space:
mode:
Diffstat (limited to 'tree')
-rw-r--r--tree/cmap.c26
-rw-r--r--tree/colorspace.c18
-rw-r--r--tree/font.c31
-rw-r--r--tree/image.c19
-rw-r--r--tree/tree.c8
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);