summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--base/error.c2
-rw-r--r--include/fitz/cmap.h1
-rw-r--r--include/fitz/colorspace.h3
-rw-r--r--include/fitz/font.h2
-rw-r--r--include/fitz/image.h2
-rw-r--r--include/fitz/object.h2
-rw-r--r--include/fitz/tree.h2
-rw-r--r--mupdf/colorspace.c8
-rw-r--r--mupdf/font.c8
-rw-r--r--object/simple.c3
-rw-r--r--render/renderpath.c2
-rw-r--r--test/x11pdf.c2
-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
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);