diff options
author | Tor Andersson <tor@ghostscript.com> | 2004-12-02 06:55:46 +0100 |
---|---|---|
committer | Tor Andersson <tor@ghostscript.com> | 2004-12-02 06:55:46 +0100 |
commit | 5c335f9337724f61c14af143b18f0891c58dbacd (patch) | |
tree | be1c7eef2412c09d4ae0caebd933a17e4b8b80f0 /tree | |
parent | 615d27315a131bea0df699c3daa1102289b433c6 (diff) | |
download | mupdf-5c335f9337724f61c14af143b18f0891c58dbacd.tar.xz |
optimise object store. refcount resources. colorkeyed transparency. font bbox.
Diffstat (limited to 'tree')
-rw-r--r-- | tree/colorspace.c | 2 | ||||
-rw-r--r-- | tree/image.c | 2 | ||||
-rw-r--r-- | tree/node2.c | 40 | ||||
-rw-r--r-- | tree/text.c | 3 |
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); } |