diff options
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) { |