diff options
author | Tor Andersson <tor@ghostscript.com> | 2004-11-11 07:52:33 +0100 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2004-11-11 07:52:33 +0100 |
commit | 1be84ed1d4fbe44387222995a124a4f84ee55210 (patch) | |
tree | 4748ea9933e543fbde652857444b416cc16361d0 /tree/cmap.c | |
parent | 58de1fff510078e3d2d8cfce033c87299adf78f0 (diff) | |
download | mupdf-1be84ed1d4fbe44387222995a124a4f84ee55210.tar.xz |
fitz tree resource reference counting
Diffstat (limited to 'tree/cmap.c')
-rw-r--r-- | tree/cmap.c | 26 |
1 files changed, 20 insertions, 6 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) { |