summaryrefslogtreecommitdiff
path: root/tree
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2004-12-02 06:55:46 +0100
committerTor Andersson <tor@ghostscript.com>2004-12-02 06:55:46 +0100
commit5c335f9337724f61c14af143b18f0891c58dbacd (patch)
treebe1c7eef2412c09d4ae0caebd933a17e4b8b80f0 /tree
parent615d27315a131bea0df699c3daa1102289b433c6 (diff)
downloadmupdf-5c335f9337724f61c14af143b18f0891c58dbacd.tar.xz
optimise object store. refcount resources. colorkeyed transparency. font bbox.
Diffstat (limited to 'tree')
-rw-r--r--tree/colorspace.c2
-rw-r--r--tree/image.c2
-rw-r--r--tree/node2.c40
-rw-r--r--tree/text.c3
4 files changed, 41 insertions, 6 deletions
diff --git a/tree/colorspace.c b/tree/colorspace.c
index aabf531b..65909bfe 100644
--- a/tree/colorspace.c
+++ b/tree/colorspace.c
@@ -15,6 +15,8 @@ fz_convertcolor(fz_colorspace *srcs, float *srcv, fz_colorspace *dsts, float *ds
fz_colorspace *
fz_keepcolorspace(fz_colorspace *cs)
{
+ if (cs->refs < 0)
+ return cs;
cs->refs ++;
return cs;
}
diff --git a/tree/image.c b/tree/image.c
index 3b0a3594..dbeb1fd8 100644
--- a/tree/image.c
+++ b/tree/image.c
@@ -14,6 +14,8 @@ fz_dropimage(fz_image *image)
{
if (image->drop)
image->drop(image);
+ if (image->cs)
+ fz_dropcolorspace(image->cs);
fz_free(image);
}
}
diff --git a/tree/node2.c b/tree/node2.c
index ceb59ad6..f21ebf36 100644
--- a/tree/node2.c
+++ b/tree/node2.c
@@ -90,7 +90,7 @@ fz_newblendnode(fz_node **nodep, fz_colorspace *cs, fz_blendkind b, int k, int i
*nodep = (fz_node*)node;
fz_initnode((fz_node*)node, FZ_NBLEND);
- node->cs = cs;
+ node->cs = fz_keepcolorspace(cs);
node->mode = b;
node->knockout = k;
node->isolated = i;
@@ -101,7 +101,31 @@ fz_newblendnode(fz_node **nodep, fz_colorspace *cs, fz_blendkind b, int k, int i
fz_rect
fz_boundblendnode(fz_blendnode *node, fz_matrix ctm)
{
- return fz_emptyrect;
+ fz_node *child;
+ fz_rect bbox;
+ fz_rect temp;
+
+ child = node->super.first;
+ if (!child)
+ return fz_emptyrect;
+
+ bbox = fz_boundnode(child, ctm);
+
+ child = child->next;
+ while (child)
+ {
+ temp = fz_boundnode(child, ctm);
+ bbox = fz_mergerects(temp, bbox);
+ child = child->next;
+ }
+
+ return bbox;
+}
+
+void
+fz_dropblendnode(fz_blendnode *node)
+{
+ fz_dropcolorspace(node->cs);
}
/*
@@ -223,7 +247,7 @@ fz_newcolornode(fz_node **nodep, fz_colorspace *cs, int n, float *v)
*nodep = (fz_node*)node;
fz_initnode((fz_node*)node, FZ_NCOLOR);
- node->cs = cs;
+ node->cs = fz_keepcolorspace(cs);
node->n = n;
for (i = 0; i < n; i++)
node->samples[i] = v[i];
@@ -237,6 +261,12 @@ fz_boundcolornode(fz_colornode *node, fz_matrix ctm)
return fz_infiniterect;
}
+void
+fz_dropcolornode(fz_colornode *node)
+{
+ fz_dropcolorspace(node->cs);
+}
+
/*
* Image node
*/
@@ -252,7 +282,7 @@ fz_newimagenode(fz_node **nodep, fz_image *image)
*nodep = (fz_node*)node;
fz_initnode((fz_node*)node, FZ_NIMAGE);
- node->image = image;
+ node->image = fz_keepimage(image);
return nil;
}
@@ -289,7 +319,7 @@ fz_newshadenode(fz_node **nodep, fz_shade *shade)
*nodep = (fz_node*)node;
fz_initnode((fz_node*)node, FZ_NSHADE);
- node->shade = shade;
+ node->shade = fz_keepshade(shade);
return nil;
}
diff --git a/tree/text.c b/tree/text.c
index ef77f530..b94664b5 100644
--- a/tree/text.c
+++ b/tree/text.c
@@ -11,7 +11,7 @@ fz_newtextnode(fz_textnode **textp, fz_font *font)
fz_initnode((fz_node*)text, FZ_NTEXT);
- text->font = font;
+ text->font = fz_keepfont(font);
text->trm = fz_identity();
text->len = 0;
text->cap = 0;
@@ -23,6 +23,7 @@ fz_newtextnode(fz_textnode **textp, fz_font *font)
void
fz_droptextnode(fz_textnode *text)
{
+ fz_dropfont(text->font);
fz_free(text->els);
}