diff options
-rw-r--r-- | base/error.c | 2 | ||||
-rw-r--r-- | include/fitz/cmap.h | 1 | ||||
-rw-r--r-- | include/fitz/colorspace.h | 3 | ||||
-rw-r--r-- | include/fitz/font.h | 2 | ||||
-rw-r--r-- | include/fitz/image.h | 2 | ||||
-rw-r--r-- | include/fitz/object.h | 2 | ||||
-rw-r--r-- | include/fitz/tree.h | 2 | ||||
-rw-r--r-- | mupdf/colorspace.c | 8 | ||||
-rw-r--r-- | mupdf/font.c | 8 | ||||
-rw-r--r-- | object/simple.c | 3 | ||||
-rw-r--r-- | render/renderpath.c | 2 | ||||
-rw-r--r-- | test/x11pdf.c | 2 | ||||
-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 |
17 files changed, 94 insertions, 45 deletions
diff --git a/base/error.c b/base/error.c index 489dcc40..d7065dbd 100644 --- a/base/error.c +++ b/base/error.c @@ -12,7 +12,7 @@ fz_warn(char *fmt, ...) } fz_error * -fz_throwMS(char *fmt, ...) +fz_throw1(char *fmt, ...) { va_list ap; fz_error *eo; diff --git a/include/fitz/cmap.h b/include/fitz/cmap.h index b076d749..768d896a 100644 --- a/include/fitz/cmap.h +++ b/include/fitz/cmap.h @@ -2,6 +2,7 @@ typedef struct fz_cmap_s fz_cmap; fz_error *fz_newcmap(fz_cmap **cmapp); void fz_debugcmap(fz_cmap *cmap); +fz_cmap *fz_keepcmap(fz_cmap *cmap); void fz_dropcmap(fz_cmap *cmap); char *fz_getcmapname(fz_cmap *cmap); diff --git a/include/fitz/colorspace.h b/include/fitz/colorspace.h index 9b5a5dbb..ec4d019c 100644 --- a/include/fitz/colorspace.h +++ b/include/fitz/colorspace.h @@ -6,8 +6,8 @@ typedef struct fz_colorcube4_s fz_colorcube4; struct fz_colorspace_s { + int nrefs; char name[16]; - int frozen; int n; void (*toxyz)(fz_colorspace *, float *src, float *xyz); void (*fromxyz)(fz_colorspace *, float *xyz, float *dst); @@ -25,6 +25,7 @@ struct fz_colorcube_s void **subcube; /* dst->n * colorcube(src->n) */ }; +fz_colorspace *fz_keepcolorspace(fz_colorspace *cs); void fz_dropcolorspace(fz_colorspace *cs); void fz_convertcolor(fz_colorspace *srcs, float *srcv, fz_colorspace *dsts, float *dstv); diff --git a/include/fitz/font.h b/include/fitz/font.h index a3caec7f..fb29e1c2 100644 --- a/include/fitz/font.h +++ b/include/fitz/font.h @@ -22,6 +22,7 @@ struct fz_vmtx_s struct fz_font_s { + int nrefs; char name[32]; fz_error* (*render)(fz_glyph*, fz_font*, int, fz_matrix); @@ -46,6 +47,7 @@ struct fz_glyph_s }; void fz_initfont(fz_font *font, char *name); +fz_font *fz_keepfont(fz_font *font); void fz_dropfont(fz_font *font); void fz_debugfont(fz_font *font); void fz_setfontwmode(fz_font *font, int wmode); diff --git a/include/fitz/image.h b/include/fitz/image.h index cfbba169..6debfaa5 100644 --- a/include/fitz/image.h +++ b/include/fitz/image.h @@ -4,11 +4,13 @@ typedef struct fz_image_s fz_image; struct fz_image_s { + int nrefs; fz_error* (*loadtile)(fz_image*,fz_pixmap*); void (*drop)(fz_image*); fz_colorspace *cs; int w, h, n, a; }; +fz_image *fz_keepimage(fz_image *img); void fz_dropimage(fz_image *img); diff --git a/include/fitz/object.h b/include/fitz/object.h index d24b8a7a..014dc33d 100644 --- a/include/fitz/object.h +++ b/include/fitz/object.h @@ -71,7 +71,7 @@ fz_error *fz_deepcopyarray(fz_obj **op, fz_obj *array); fz_error *fz_deepcopydict(fz_obj **op, fz_obj *dict); fz_obj *fz_keepobj(fz_obj *obj); -fz_obj *fz_dropobj(fz_obj *obj); +void fz_dropobj(fz_obj *obj); /* type queries */ int fz_isnull(fz_obj *obj); diff --git a/include/fitz/tree.h b/include/fitz/tree.h index a14de20d..af9fc36c 100644 --- a/include/fitz/tree.h +++ b/include/fitz/tree.h @@ -3,7 +3,7 @@ typedef struct fz_node_s fz_node; struct fz_tree_s { - int refcount; + int nrefs; fz_node *root; fz_node *head; }; diff --git a/mupdf/colorspace.c b/mupdf/colorspace.c index eed3cc1d..437455f0 100644 --- a/mupdf/colorspace.c +++ b/mupdf/colorspace.c @@ -7,7 +7,7 @@ static void initcs(fz_colorspace *cs, char *name, int n, void(*drop)(fz_colorspace*)) { strlcpy(cs->name, name, sizeof cs->name); - cs->frozen = 0; + cs->nrefs = 1; cs->n = n; cs->toxyz = to; cs->fromxyz = from; @@ -80,7 +80,7 @@ static void xyztogray(fz_colorspace *fzcs, float *xyz, float *gray) static struct calgray kdevicegray = { - { "DeviceGray", 1, 1, graytoxyz, xyztogray, nil }, + { -1, "DeviceGray", 1, graytoxyz, xyztogray, nil }, { 1.0000, 1.0000, 1.0000 }, { 0.0000, 0.0000, 0.0000 }, 2.2000 @@ -189,7 +189,7 @@ static void xyztorgb(fz_colorspace *fzcs, float *xyz, float *rgb) static struct calrgb kdevicergb = { - { "DeviceRGB", 1, 3, rgbtoxyz, xyztorgb, nil }, + { -1, "DeviceRGB", 3, rgbtoxyz, xyztorgb, nil }, { 1.0000, 1.0000, 1.0000 }, { 0.0000, 0.0000, 0.0000 }, { 2.2000, 2.2000, 2.2000 }, @@ -322,7 +322,7 @@ static void xyztodevicecmyk(fz_colorspace *cs, float *xyz, float *cmyk) static fz_colorspace kdevicecmyk = { - "DeviceCMYK", 1, 4, devicecmyktoxyz, xyztodevicecmyk, nil + -1, "DeviceCMYK", 4, devicecmyktoxyz, xyztodevicecmyk, nil }; fz_colorspace *pdf_devicecmyk = &kdevicecmyk; diff --git a/mupdf/font.c b/mupdf/font.c index 8d3b70b1..ddd5dec2 100644 --- a/mupdf/font.c +++ b/mupdf/font.c @@ -458,7 +458,7 @@ printf(" symbolic cmap\n"); } } - encoding = fz_dropobj(encoding); + fz_dropobj(encoding); } else @@ -506,7 +506,7 @@ printf(" widths vector %d to %d\n", first, last); goto cleanup; } - widths = fz_dropobj(widths); + fz_dropobj(widths); } else { @@ -730,7 +730,7 @@ printf(" cidtogidmap %d\n", len / 2); } } - widths = fz_dropobj(widths); + fz_dropobj(widths); } error = fz_endhmtx((fz_font*)font); @@ -799,7 +799,7 @@ printf(" cidtogidmap %d\n", len / 2); } } - widths = fz_dropobj(widths); + fz_dropobj(widths); } error = fz_endvmtx((fz_font*)font); diff --git a/object/simple.c b/object/simple.c index b06c77d7..0755a795 100644 --- a/object/simple.c +++ b/object/simple.c @@ -82,7 +82,7 @@ fz_keepobj(fz_obj *o) return o; } -fz_obj * +void fz_dropobj(fz_obj *o) { if (--o->nrefs == 0) @@ -94,7 +94,6 @@ fz_dropobj(fz_obj *o) else fz_free(o); } - return nil; } int diff --git a/render/renderpath.c b/render/renderpath.c index a83505f9..498c3a63 100644 --- a/render/renderpath.c +++ b/render/renderpath.c @@ -5,7 +5,7 @@ enum { HS = 17, VS = 15, SF = 1 }; static fz_error *pathtogel(fz_gel *gel, fz_pathnode *path, fz_matrix ctm) { - float flatness = 0.3 / ctm.a; + float flatness = 0.3 / sqrt(fabs(ctm.a * ctm.d - ctm.b * ctm.c)); if (flatness < 0.1) flatness = 0.1; if (path->paint == FZ_STROKE) diff --git a/test/x11pdf.c b/test/x11pdf.c index d6cbb28a..60f25d65 100644 --- a/test/x11pdf.c +++ b/test/x11pdf.c @@ -160,7 +160,7 @@ static void showpage(void) ctm = fz_identity(); ctm = fz_concat(ctm, fz_translate(0, -page->mediabox.max.y)); ctm = fz_concat(ctm, fz_scale(zoom, -zoom)); - ctm = fz_concat(ctm, fz_rotate(rotate)); + ctm = fz_concat(ctm, fz_rotate(rotate + page->rotate)); bbox = fz_transformaabb(ctm, page->mediabox); 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); |