summaryrefslogtreecommitdiff
path: root/tree
diff options
context:
space:
mode:
Diffstat (limited to 'tree')
-rw-r--r--tree/blend.c53
-rw-r--r--tree/cache.c98
-rw-r--r--tree/debug.c74
-rw-r--r--tree/form.c30
-rw-r--r--tree/image.c49
-rw-r--r--tree/mask.c50
-rw-r--r--tree/meta.c37
-rw-r--r--tree/node.c148
-rw-r--r--tree/node1.c165
-rw-r--r--tree/node2.c304
-rw-r--r--tree/over.c50
-rw-r--r--tree/path.c58
-rw-r--r--tree/solid.c33
-rw-r--r--tree/text.c18
-rw-r--r--tree/transform.c35
-rw-r--r--tree/tree.c57
16 files changed, 572 insertions, 687 deletions
diff --git a/tree/blend.c b/tree/blend.c
deleted file mode 100644
index d2154240..00000000
--- a/tree/blend.c
+++ /dev/null
@@ -1,53 +0,0 @@
-#include <fitz.h>
-
-fz_error *
-fz_newblend(fz_node **nodep, fz_blendkind b, int k, int i)
-{
- fz_blend *node;
-
- node = fz_malloc(sizeof (fz_blend));
- if (!node)
- return fz_outofmem;
- *nodep = (fz_node*)node;
-
- fz_initnode((fz_node*)node, FZ_NBLEND);
- node->child = nil;
- node->mode = b;
- node->knockout = k;
- node->isolated = i;
-
- return nil;
-}
-
-void
-fz_freeblend(fz_blend *node)
-{
- if (node->child)
- fz_freenode(node->child);
- fz_free(node);
-}
-
-fz_rect
-fz_boundblend(fz_blend *node, fz_matrix ctm)
-{
- fz_node *child;
- fz_rect bbox;
- fz_rect r;
-
- bbox = FZ_INFRECT;
-
- for (child = node->child; child; child = child->next)
- {
- r = fz_boundnode(child, ctm);
- if (r.max.x >= r.min.x)
- {
- if (bbox.max.x >= bbox.min.x)
- bbox = fz_mergerects(r, bbox);
- else
- bbox = r;
- }
- }
-
- return bbox;
-}
-
diff --git a/tree/cache.c b/tree/cache.c
deleted file mode 100644
index f4544844..00000000
--- a/tree/cache.c
+++ /dev/null
@@ -1,98 +0,0 @@
-#include <fitz.h>
-
-static int
-hash(fz_cachekey *k)
-{
- int h;
- int i;
-
- h = (int)k->tree ^ (int)k->node ^ k->tag;
-
- /* http://www.cs.yorku.ca/~oz/hash.html -- sdbm */
- for (i = 0; i < k->len; i++)
- h = k->key[i] + (h << 6) + (h << 16) - h;
-
- return h;
-}
-
-static int
-equal(fz_cachekey *a, fz_cachekey *b)
-{
- if (a->tree != b->tree) return 0;
- if (a->node != b->node) return 0;
- if (a->tag != b->tag) return 0;
- if (a->len != b->len) return 0;
- return memcmp(a->key, b->key, a->len) == 0;
-}
-
-fz_cache *
-fz_newcache(int maxentries, int maxdatasize)
-{
- fz_cache *cache;
- int i;
-
- cache = fz_malloc(sizeof(fz_cache));
- if (!cache) return nil;
-
- cache->maxsize = maxdatasize;
- cache->cursize = 0;
- cache->len = maxentries;
- cache->table = fz_malloc(sizeof(fz_cachebucket) * maxentries);
- if (!cache->table) {
- fz_free(cache);
- return nil;
- }
-
- for (i = 0; i < cache->len; i++) {
- cache->table[i].val = nil;
- }
-
- return cache;
-}
-
-void *
-fz_findincache(fz_cache *cache, fz_cachekey *key)
-{
- int h;
- int i;
-
- h = hash(key);
-
- i = h % cache->len;
- if (equal(key, &cache->table[i].key))
- return cache->table[i].val;
- return nil;
-}
-
-int
-fz_insertincache(fz_cache *cache, fz_cachekey *key, void *data, int size)
-{
- int h;
- int i;
-
- h = hash(key);
- i = h % cache->len;
-
- if (cache->table[i].val)
- fz_free(cache->table[i].val);
- cache->table[i].key = *key;
-
- return FZ_OKAY;
-}
-
-int
-fz_evictfromcache(fz_cache *cache, fz_cachekey *key)
-{
- /* TODO */
- return FZ_OKAY;
-}
-
-void
-fz_freecache(fz_cache *cache)
-{
- /* FIXME evict everything from cache first? */
- if (cache->table)
- fz_free(cache->table);
- fz_free(cache);
-}
-
diff --git a/tree/debug.c b/tree/debug.c
index 2e7cfc4f..8e16c612 100644
--- a/tree/debug.c
+++ b/tree/debug.c
@@ -8,77 +8,77 @@ static void indent(int level)
static void lispnode(fz_node *node, int level);
-static void lispmeta(fz_meta *node, int level)
+static void lispmeta(fz_metanode *node, int level)
{
fz_node *child;
indent(level);
printf("(meta ");
fz_debugobj(node->info);
printf("\n");
- for (child = node->child; child; child = child->next)
+ for (child = node->super.child; child; child = child->next)
lispnode(child, level + 1);
indent(level);
printf(")\n");
}
-static void lispover(fz_over *node, int level)
+static void lispover(fz_overnode *node, int level)
{
fz_node *child;
indent(level);
printf("(over\n");
- for (child = node->child; child; child = child->next)
+ for (child = node->super.child; child; child = child->next)
lispnode(child, level + 1);
indent(level);
printf(")\n");
}
-static void lispmask(fz_mask *node, int level)
+static void lispmask(fz_masknode *node, int level)
{
fz_node *child;
indent(level);
printf("(mask\n");
- for (child = node->child; child; child = child->next)
+ for (child = node->super.child; child; child = child->next)
lispnode(child, level + 1);
indent(level);
printf(")\n");
}
-static void lispblend(fz_blend *node, int level)
+static void lispblend(fz_blendnode *node, int level)
{
fz_node *child;
indent(level);
printf("(blend-%d\n", node->mode);
- for (child = node->child; child; child = child->next)
+ for (child = node->super.child; child; child = child->next)
lispnode(child, level + 1);
indent(level);
printf(")\n");
}
-static void lisptransform(fz_transform *node, int level)
+static void lisptransform(fz_transformnode *node, int level)
{
indent(level);
printf("(transform %g %g %g %g %g %g\n",
node->m.a, node->m.b,
node->m.c, node->m.d,
node->m.e, node->m.f);
- lispnode(node->child, level + 1);
+ lispnode(node->super.child, level + 1);
indent(level);
printf(")\n");
}
-static void lispsolid(fz_solid *node, int level)
+static void lispcolor(fz_colornode *node, int level)
{
indent(level);
- printf("(solid %g %g %g)\n", node->r, node->g, node->b);
+ printf("(color %g %g %g)\n", node->r, node->g, node->b);
}
-static void lispform(fz_form *node, int level)
+static void lisplink(fz_linknode *node, int level)
{
indent(level);
- printf("(form %p)\n", node->tree);
+ printf("(link %p)\n", node->tree);
}
-static void lisppath(fz_path *node, int level)
+static void lisppath(fz_pathnode *node, int level)
{
int i;
@@ -87,10 +87,10 @@ static void lisppath(fz_path *node, int level)
if (node->paint == FZ_STROKE)
{
printf("(path 'stroke %d %d %g %g ",
- node->stroke->linecap,
- node->stroke->linejoin,
- node->stroke->linewidth,
- node->stroke->miterlimit);
+ node->linecap,
+ node->linejoin,
+ node->linewidth,
+ node->miterlimit);
if (node->dash)
{
printf("%g '( ", node->dash->phase);
@@ -107,13 +107,13 @@ static void lisppath(fz_path *node, int level)
}
printf("\n");
- fz_debugpath(node);
+ fz_debugpathnode(node);
indent(level);
printf(")\n");
}
-static void lisptext(fz_text *node, int level)
+static void lisptext(fz_textnode *node, int level)
{
int i;
@@ -131,18 +131,10 @@ static void lisptext(fz_text *node, int level)
printf(")\n");
}
-static void lispimage(fz_image *node, int level)
+static void lispimage(fz_imagenode *node, int level)
{
indent(level);
- printf("(image %d %d %d %d '", node->w, node->h, node->n, node->bpc);
- switch (node->cs)
- {
- case FZ_CSGRAY: printf("gray"); break;
- case FZ_CSRGB: printf("rgb"); break;
- case FZ_CSCMYK: printf("cmyk"); break;
- default: printf("unknown"); break;
- }
- printf(")\n");
+ printf("(image %d %d %d %d)\n", node->w, node->h, node->n, node->a);
}
static void lispnode(fz_node *node, int level)
@@ -156,16 +148,16 @@ static void lispnode(fz_node *node, int level)
switch (node->kind)
{
- case FZ_NMETA: lispmeta((fz_meta*)node, level); break;
- case FZ_NOVER: lispover((fz_over*)node, level); break;
- case FZ_NMASK: lispmask((fz_mask*)node, level); break;
- case FZ_NBLEND: lispblend((fz_blend*)node, level); break;
- case FZ_NTRANSFORM: lisptransform((fz_transform*)node, level); break;
- case FZ_NSOLID: lispsolid((fz_solid*)node, level); break;
- case FZ_NPATH: lisppath((fz_path*)node, level); break;
- case FZ_NTEXT: lisptext((fz_text*)node, level); break;
- case FZ_NIMAGE: lispimage((fz_image*)node, level); break;
- case FZ_NFORM: lispform((fz_form*)node, level); break;
+ case FZ_NMETA: lispmeta((fz_metanode*)node, level); break;
+ case FZ_NOVER: lispover((fz_overnode*)node, level); break;
+ case FZ_NMASK: lispmask((fz_masknode*)node, level); break;
+ case FZ_NBLEND: lispblend((fz_blendnode*)node, level); break;
+ case FZ_NTRANSFORM: lisptransform((fz_transformnode*)node, level); break;
+ case FZ_NCOLOR: lispcolor((fz_colornode*)node, level); break;
+ case FZ_NPATH: lisppath((fz_pathnode*)node, level); break;
+ case FZ_NTEXT: lisptext((fz_textnode*)node, level); break;
+ case FZ_NIMAGE: lispimage((fz_imagenode*)node, level); break;
+ case FZ_NLINK: lisplink((fz_linknode*)node, level); break;
}
}
diff --git a/tree/form.c b/tree/form.c
deleted file mode 100644
index dd45aad9..00000000
--- a/tree/form.c
+++ /dev/null
@@ -1,30 +0,0 @@
-#include <fitz.h>
-
-fz_error *
-fz_newform(fz_node **nodep, fz_tree *child)
-{
- fz_form *node;
-
- node = fz_malloc(sizeof (fz_form));
- if (!node)
- return fz_outofmem;
- *nodep = (fz_node*)node;
-
- fz_initnode((fz_node*)node, FZ_NFORM);
- node->tree = child;
-
- return nil;
-}
-
-void
-fz_freeform(fz_form *node)
-{
- fz_free(node);
-}
-
-fz_rect
-fz_boundform(fz_form *node, fz_matrix ctm)
-{
- return fz_boundtree(node->tree, ctm);
-}
-
diff --git a/tree/image.c b/tree/image.c
deleted file mode 100644
index 7991ded3..00000000
--- a/tree/image.c
+++ /dev/null
@@ -1,49 +0,0 @@
-#include <fitz.h>
-
-fz_error *
-fz_newimage(fz_node **nodep, int w, int h, int n, int bpc, int cs)
-{
- fz_image *node;
-
- node = fz_malloc(sizeof (fz_image));
- if (!node)
- return fz_outofmem;
- *nodep = (fz_node*)node;
-
- fz_initnode((fz_node*)node, FZ_NIMAGE);
- node->w = w;
- node->h = h;
- node->n = n;
- node->bpc = bpc;
- node->cs = cs;
- node->data = nil;
-
- return nil;
-}
-
-void
-fz_freeimage(fz_image *node)
-{
- fz_free(node->data);
- fz_free(node);
-}
-
-fz_rect
-fz_boundimage(fz_image *node, fz_matrix ctm)
-{
- fz_point ll, lr, ul, ur;
- fz_rect r;
-
- ll = fz_transformpoint(ctm, (fz_point){0,0});
- lr = fz_transformpoint(ctm, (fz_point){1,0});
- ul = fz_transformpoint(ctm, (fz_point){0,1});
- ur = fz_transformpoint(ctm, (fz_point){1,1});
-
- r.min.x = MIN4(ll.x, lr.x, ul.x, ur.x);
- r.min.y = MIN4(ll.y, lr.y, ul.y, ur.y);
- r.max.x = MAX4(ll.x, lr.x, ul.x, ur.x);
- r.max.y = MAX4(ll.y, lr.y, ul.y, ur.y);
-
- return r;
-}
-
diff --git a/tree/mask.c b/tree/mask.c
deleted file mode 100644
index 62a469ff..00000000
--- a/tree/mask.c
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <fitz.h>
-
-fz_error *
-fz_newmask(fz_node **nodep)
-{
- fz_mask *node;
-
- node = fz_malloc(sizeof (fz_mask));
- if (!node)
- return fz_outofmem;
- *nodep = (fz_node*)node;
-
- fz_initnode((fz_node*)node, FZ_NMASK);
- node->child = nil;
-
- return nil;
-}
-
-void
-fz_freemask(fz_mask *node)
-{
- if (node->child)
- fz_freenode(node->child);
- fz_free(node);
-}
-
-fz_rect
-fz_boundmask(fz_mask* node, fz_matrix ctm)
-{
- fz_node *child;
- fz_rect bbox;
- fz_rect r;
-
- bbox = FZ_INFRECT;
-
- for (child = node->child; child; child = child->next)
- {
- r = fz_boundnode(child, ctm);
- if (r.max.x >= r.min.x)
- {
- if (bbox.max.x >= bbox.min.x)
- bbox = fz_intersectrects(r, bbox);
- else
- bbox = r;
- }
- }
-
- return bbox;
-}
-
diff --git a/tree/meta.c b/tree/meta.c
deleted file mode 100644
index 4d3a2a74..00000000
--- a/tree/meta.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <fitz.h>
-
-fz_error *
-fz_newmeta(fz_node **nodep, fz_obj *info)
-{
- fz_meta *node;
-
- node = fz_malloc(sizeof (fz_meta));
- if (!node)
- return fz_outofmem;
- *nodep = (fz_node*)node;
-
- fz_initnode((fz_node*)node, FZ_NMETA);
- node->info = fz_keepobj(info);
- node->child = nil;
-
- return nil;
-}
-
-void
-fz_freemeta(fz_meta *node)
-{
- if (node->child)
- fz_freenode(node->child);
- if (node->info)
- fz_dropobj(node->info);
- fz_free(node);
-}
-
-fz_rect
-fz_boundmeta(fz_meta *node, fz_matrix ctm)
-{
- if (!node->child)
- return FZ_INFRECT;
- return fz_boundnode(node->child, ctm);
-}
-
diff --git a/tree/node.c b/tree/node.c
deleted file mode 100644
index 8b9d48cc..00000000
--- a/tree/node.c
+++ /dev/null
@@ -1,148 +0,0 @@
-#include <fitz.h>
-
-void fz_freeover(fz_over* node);
-void fz_freemask(fz_mask* node);
-void fz_freeblend(fz_blend* node);
-void fz_freetransform(fz_transform* node);
-void fz_freeform(fz_form* node);
-void fz_freesolid(fz_solid* node);
-void fz_freepath(fz_path* node);
-void fz_freetext(fz_text* node);
-void fz_freeimage(fz_image* node);
-
-fz_rect fz_boundover(fz_over* node, fz_matrix ctm);
-fz_rect fz_boundmask(fz_mask* node, fz_matrix ctm);
-fz_rect fz_boundblend(fz_blend* node, fz_matrix ctm);
-fz_rect fz_boundtransform(fz_transform* node, fz_matrix ctm);
-fz_rect fz_boundform(fz_form* node, fz_matrix ctm);
-fz_rect fz_boundsolid(fz_solid* node, fz_matrix ctm);
-fz_rect fz_boundpath(fz_path* node, fz_matrix ctm);
-fz_rect fz_boundtext(fz_text* node, fz_matrix ctm);
-fz_rect fz_boundimage(fz_image* node, fz_matrix ctm);
-
-void
-fz_initnode(fz_node *node, fz_nodekind kind)
-{
- node->kind = kind;
- node->parent = nil;
-}
-
-void
-fz_freenode(fz_node *node)
-{
- if (node->next)
- fz_freenode(node->next);
-
- switch (node->kind)
- {
- case FZ_NOVER:
- fz_freeover((fz_over *) node);
- break;
- case FZ_NMASK:
- fz_freemask((fz_mask *) node);
- break;
- case FZ_NBLEND:
- fz_freeblend((fz_blend *) node);
- break;
- case FZ_NTRANSFORM:
- fz_freetransform((fz_transform *) node);
- break;
- case FZ_NFORM:
- fz_freeform((fz_form *) node);
- break;
- case FZ_NSOLID:
- fz_freesolid((fz_solid *) node);
- break;
- case FZ_NPATH:
- fz_freepath((fz_path *) node);
- break;
- case FZ_NTEXT:
- fz_freetext((fz_text *) node);
- break;
- case FZ_NIMAGE:
- fz_freeimage((fz_image *) node);
- break;
- }
-}
-
-fz_rect
-fz_boundnode(fz_node *node, fz_matrix ctm)
-{
- switch (node->kind)
- {
- case FZ_NOVER:
- return fz_boundover((fz_over *) node, ctm);
- case FZ_NMASK:
- return fz_boundmask((fz_mask *) node, ctm);
- case FZ_NBLEND:
- return fz_boundblend((fz_blend *) node, ctm);
- case FZ_NTRANSFORM:
- return fz_boundtransform((fz_transform *) node, ctm);
- case FZ_NFORM:
- return fz_boundform((fz_form *) node, ctm);
- case FZ_NSOLID:
- return fz_boundsolid((fz_solid *) node, ctm);
- case FZ_NPATH:
- return fz_boundpath((fz_path *) node, ctm);
- case FZ_NTEXT:
- return fz_boundtext((fz_text *) node, ctm);
- case FZ_NIMAGE:
- return fz_boundimage((fz_image *) node, ctm);
- }
- return FZ_INFRECT;
-}
-
-int
-fz_isover(fz_node *node)
-{
- return node ? node->kind == FZ_NOVER : 0;
-}
-
-int
-fz_ismask(fz_node *node)
-{
- return node ? node->kind == FZ_NMASK : 0;
-}
-
-int
-fz_isblend(fz_node *node)
-{
- return node ? node->kind == FZ_NBLEND : 0;
-}
-
-int
-fz_istransform(fz_node *node)
-{
- return node ? node->kind == FZ_NTRANSFORM : 0;
-}
-
-int
-fz_isform(fz_node *node)
-{
- return node ? node->kind == FZ_NFORM : 0;
-}
-
-int
-fz_issolid(fz_node *node)
-{
- return node ? node->kind == FZ_NSOLID : 0;
-}
-
-int
-fz_ispath(fz_node *node)
-{
- return node ? node->kind == FZ_NPATH : 0;
-}
-
-int
-fz_istext(fz_node *node)
-{
- return node ? node->kind == FZ_NTEXT : 0;
-}
-
-int
-fz_isimage(fz_node *node)
-{
- return node ? node->kind == FZ_NIMAGE : 0;
-}
-
diff --git a/tree/node1.c b/tree/node1.c
new file mode 100644
index 00000000..c24b974a
--- /dev/null
+++ b/tree/node1.c
@@ -0,0 +1,165 @@
+#include <fitz.h>
+
+void fz_freemetanode(fz_metanode* node);
+void fz_freelinknode(fz_linknode* node);
+void fz_freepathnode(fz_pathnode* node);
+void fz_freetextnode(fz_textnode* node);
+void fz_freeimagenode(fz_imagenode* node);
+
+fz_rect fz_boundtransformnode(fz_transformnode* node, fz_matrix ctm);
+fz_rect fz_boundovernode(fz_overnode* node, fz_matrix ctm);
+fz_rect fz_boundmasknode(fz_masknode* node, fz_matrix ctm);
+fz_rect fz_boundblendnode(fz_blendnode* node, fz_matrix ctm);
+fz_rect fz_boundcolornode(fz_colornode* node, fz_matrix ctm);
+fz_rect fz_boundpathnode(fz_pathnode* node, fz_matrix ctm);
+fz_rect fz_boundtextnode(fz_textnode* node, fz_matrix ctm);
+fz_rect fz_boundimagenode(fz_imagenode* node, fz_matrix ctm);
+fz_rect fz_boundshadenode(fz_shadenode* node, fz_matrix ctm);
+fz_rect fz_boundlinknode(fz_linknode* node, fz_matrix ctm);
+fz_rect fz_boundmetanode(fz_metanode* node, fz_matrix ctm);
+
+void
+fz_initnode(fz_node *node, fz_nodekind kind)
+{
+ node->kind = kind;
+ node->parent = nil;
+ node->child = nil;
+ node->next = nil;
+}
+
+void
+fz_freenode(fz_node *node)
+{
+ if (node->child)
+ fz_freenode(node->child);
+ if (node->next)
+ fz_freenode(node->next);
+
+ switch (node->kind)
+ {
+ case FZ_NTRANSFORM:
+ case FZ_NOVER:
+ case FZ_NMASK:
+ case FZ_NBLEND:
+ case FZ_NCOLOR:
+ break;
+ case FZ_NPATH:
+ fz_freepathnode((fz_pathnode *) node);
+ break;
+ case FZ_NTEXT:
+ fz_freetextnode((fz_textnode *) node);
+ break;
+ case FZ_NIMAGE:
+ fz_freeimagenode((fz_imagenode *) node);
+ break;
+ case FZ_NSHADE:
+ // XXX fz_freeshadenode((fz_shadenode *) node);
+ break;
+ case FZ_NLINK:
+ fz_freelinknode((fz_linknode *) node);
+ break;
+ case FZ_NMETA:
+ fz_freemetanode((fz_metanode *) node);
+ break;
+ }
+
+ fz_free(node);
+}
+
+fz_rect
+fz_boundnode(fz_node *node, fz_matrix ctm)
+{
+ switch (node->kind)
+ {
+ case FZ_NTRANSFORM:
+ return fz_boundtransformnode((fz_transformnode *) node, ctm);
+ case FZ_NOVER:
+ return fz_boundovernode((fz_overnode *) node, ctm);
+ case FZ_NMASK:
+ return fz_boundmasknode((fz_masknode *) node, ctm);
+ case FZ_NBLEND:
+ return fz_boundblendnode((fz_blendnode *) node, ctm);
+ case FZ_NCOLOR:
+ return fz_boundcolornode((fz_colornode *) node, ctm);
+ case FZ_NPATH:
+ return fz_boundpathnode((fz_pathnode *) node, ctm);
+ case FZ_NTEXT:
+ return fz_boundtextnode((fz_textnode *) node, ctm);
+ case FZ_NIMAGE:
+ return fz_boundimagenode((fz_imagenode *) node, ctm);
+ case FZ_NSHADE:
+ // XXX return fz_boundshadenode((fz_shadenode *) node, ctm);
+ case FZ_NLINK:
+ return fz_boundlinknode((fz_linknode *) node, ctm);
+ case FZ_NMETA:
+ return fz_boundmetanode((fz_metanode *) node, ctm);
+ }
+ return FZ_INFRECT;
+}
+
+int
+fz_istransformnode(fz_node *node)
+{
+ return node ? node->kind == FZ_NTRANSFORM : 0;
+}
+
+int
+fz_isovernode(fz_node *node)
+{
+ return node ? node->kind == FZ_NOVER : 0;
+}
+
+int
+fz_ismasknode(fz_node *node)
+{
+ return node ? node->kind == FZ_NMASK : 0;
+}
+
+int
+fz_isblendnode(fz_node *node)
+{
+ return node ? node->kind == FZ_NBLEND : 0;
+}
+
+int
+fz_iscolornode(fz_node *node)
+{
+ return node ? node->kind == FZ_NCOLOR : 0;
+}
+
+int
+fz_ispathnode(fz_node *node)
+{
+ return node ? node->kind == FZ_NPATH : 0;
+}
+
+int
+fz_istextnode(fz_node *node)
+{
+ return node ? node->kind == FZ_NTEXT : 0;
+}
+
+int
+fz_isimagenode(fz_node *node)
+{
+ return node ? node->kind == FZ_NIMAGE : 0;
+}
+
+int
+fz_isshadenode(fz_node *node)
+{
+ return node ? node->kind == FZ_NSHADE : 0;
+}
+
+int
+fz_islinknode(fz_node *node)
+{
+ return node ? node->kind == FZ_NLINK : 0;
+}
+
+int
+fz_ismetanode(fz_node *node)
+{
+ return node ? node->kind == FZ_NMETA : 0;
+}
+
diff --git a/tree/node2.c b/tree/node2.c
new file mode 100644
index 00000000..dc82265d
--- /dev/null
+++ b/tree/node2.c
@@ -0,0 +1,304 @@
+#include <fitz.h>
+
+/*
+ * Over
+ */
+
+fz_error *
+fz_newovernode(fz_node **nodep)
+{
+ fz_node *node;
+
+ node = *nodep = fz_malloc(sizeof (fz_overnode));
+ if (!node)
+ return fz_outofmem;
+
+ fz_initnode(node, FZ_NOVER);
+
+ return nil;
+}
+
+fz_rect
+fz_boundovernode(fz_overnode *node, fz_matrix ctm)
+{
+ fz_node *child;
+ fz_rect bbox;
+ fz_rect r;
+
+ bbox = FZ_INFRECT;
+
+ for (child = node->super.child; child; child = child->next)
+ {
+ r = fz_boundnode(child, ctm);
+ if (r.max.x >= r.min.x)
+ {
+ if (bbox.max.x >= bbox.min.x)
+ bbox = fz_mergerects(r, bbox);
+ else
+ bbox = r;
+ }
+ }
+
+ return bbox;
+}
+
+/*
+ * Mask
+ */
+
+fz_error *
+fz_newmasknode(fz_node **nodep)
+{
+ fz_node *node;
+
+ node = *nodep = fz_malloc(sizeof (fz_masknode));
+ if (!node)
+ return fz_outofmem;
+
+ fz_initnode(node, FZ_NMASK);
+
+ return nil;
+}
+
+fz_rect
+fz_boundmasknode(fz_masknode *node, fz_matrix ctm)
+{
+ fz_node *child;
+ fz_rect bbox;
+ fz_rect r;
+
+ bbox = FZ_INFRECT;
+
+ for (child = node->super.child; child; child = child->next)
+ {
+ r = fz_boundnode(child, ctm);
+ if (r.max.x >= r.min.x)
+ {
+ if (bbox.max.x >= bbox.min.x)
+ bbox = fz_intersectrects(r, bbox);
+ else
+ bbox = r;
+ }
+ }
+
+ return bbox;
+}
+
+/*
+ * Blend
+ */
+
+fz_error *
+fz_newblendnode(fz_node **nodep, fz_blendkind b, int k, int i)
+{
+ fz_blendnode *node;
+
+ node = fz_malloc(sizeof (fz_blendnode));
+ if (!node)
+ return fz_outofmem;
+ *nodep = (fz_node*)node;
+
+ fz_initnode((fz_node*)node, FZ_NBLEND);
+ node->mode = b;
+ node->knockout = k;
+ node->isolated = i;
+
+ return nil;
+}
+
+fz_rect
+fz_boundblendnode(fz_blendnode *node, fz_matrix ctm)
+{
+ fz_node *child;
+ fz_rect bbox;
+ fz_rect r;
+
+ bbox = FZ_INFRECT;
+
+ for (child = node->super.child; child; child = child->next)
+ {
+ r = fz_boundnode(child, ctm);
+ if (r.max.x >= r.min.x)
+ {
+ if (bbox.max.x >= bbox.min.x)
+ bbox = fz_mergerects(r, bbox);
+ else
+ bbox = r;
+ }
+ }
+
+ return bbox;
+}
+
+/*
+ * Transform
+ */
+
+fz_error *
+fz_newtransformnode(fz_node **nodep, fz_matrix m)
+{
+ fz_transformnode *node;
+
+ node = fz_malloc(sizeof (fz_transformnode));
+ if (!node)
+ return fz_outofmem;
+ *nodep = (fz_node*)node;
+
+ fz_initnode((fz_node*)node, FZ_NTRANSFORM);
+ node->m = m;
+
+ return nil;
+}
+
+fz_rect
+fz_boundtransformnode(fz_transformnode *node, fz_matrix ctm)
+{
+ if (!node->super.child)
+ return FZ_INFRECT;
+ return fz_boundnode(node->super.child, fz_concat(node->m, ctm));
+}
+
+/*
+ * Meta info
+ */
+
+fz_error *
+fz_newmetanode(fz_node **nodep, fz_obj *info)
+{
+ fz_metanode *node;
+
+ node = fz_malloc(sizeof (fz_metanode));
+ if (!node)
+ return fz_outofmem;
+ *nodep = (fz_node*)node;
+
+ fz_initnode((fz_node*)node, FZ_NMETA);
+ node->info = fz_keepobj(info);
+
+ return nil;
+}
+
+void
+fz_freemetanode(fz_metanode *node)
+{
+ if (node->info)
+ fz_dropobj(node->info);
+}
+
+fz_rect
+fz_boundmetanode(fz_metanode *node, fz_matrix ctm)
+{
+ if (!node->super.child)
+ return FZ_INFRECT;
+ return fz_boundnode(node->super.child, ctm);
+}
+
+/*
+ * Link to tree
+ */
+
+fz_error *
+fz_newlinknode(fz_node **nodep, fz_tree *subtree)
+{
+ fz_linknode *node;
+
+ node = fz_malloc(sizeof (fz_linknode));
+ if (!node)
+ return fz_outofmem;
+ *nodep = (fz_node*)node;
+
+ fz_initnode((fz_node*)node, FZ_NLINK);
+ node->tree = fz_keeptree(subtree);
+
+ return nil;
+}
+
+void
+fz_freelinknode(fz_linknode *node)
+{
+ fz_droptree(node->tree);
+}
+
+fz_rect
+fz_boundlinknode(fz_linknode *node, fz_matrix ctm)
+{
+ return fz_boundtree(node->tree, ctm);
+}
+
+/*
+ * Solid color
+ */
+
+fz_error *
+fz_newcolornode(fz_node **nodep, float r, float g, float b)
+{
+ fz_colornode *node;
+
+ node = fz_malloc(sizeof (fz_colornode));
+ if (!node)
+ return fz_outofmem;
+ *nodep = (fz_node*)node;
+
+ fz_initnode((fz_node*)node, FZ_NCOLOR);
+ node->r = r;
+ node->g = g;
+ node->b = b;
+
+ return nil;
+}
+
+fz_rect
+fz_boundcolornode(fz_colornode *node, fz_matrix ctm)
+{
+ /* min > max => no bounds */
+ return (fz_rect) { {1,1}, {-1,-1} };
+}
+
+/*
+ * Image node
+ */
+
+fz_error *
+fz_newimagenode(fz_node **nodep, int w, int h, int n, int a)
+{
+ fz_imagenode *node;
+
+ node = fz_malloc(sizeof (fz_imagenode));
+ if (!node)
+ return fz_outofmem;
+ *nodep = (fz_node*)node;
+
+ fz_initnode((fz_node*)node, FZ_NIMAGE);
+ node->w = w;
+ node->h = h;
+ node->n = n;
+ node->a = a;
+
+ return nil;
+}
+
+void
+fz_freeimagenode(fz_imagenode *node)
+{
+ // XXX fz_dropimage(node->image);
+}
+
+fz_rect
+fz_boundimagenode(fz_imagenode *node, fz_matrix ctm)
+{
+ fz_point ll, lr, ul, ur;
+ fz_rect r;
+
+ ll = fz_transformpoint(ctm, (fz_point){0,0});
+ lr = fz_transformpoint(ctm, (fz_point){1,0});
+ ul = fz_transformpoint(ctm, (fz_point){0,1});
+ ur = fz_transformpoint(ctm, (fz_point){1,1});
+
+ r.min.x = MIN4(ll.x, lr.x, ul.x, ur.x);
+ r.min.y = MIN4(ll.y, lr.y, ul.y, ur.y);
+ r.max.x = MAX4(ll.x, lr.x, ul.x, ur.x);
+ r.max.y = MAX4(ll.y, lr.y, ul.y, ur.y);
+
+ return r;
+}
+
diff --git a/tree/over.c b/tree/over.c
deleted file mode 100644
index d55bb297..00000000
--- a/tree/over.c
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <fitz.h>
-
-fz_error *
-fz_newover(fz_node **nodep)
-{
- fz_over *node;
-
- node = fz_malloc(sizeof (fz_over));
- if (!node)
- return fz_outofmem;
- *nodep = (fz_node*)node;
-
- fz_initnode((fz_node*)node, FZ_NOVER);
- node->child = nil;
-
- return nil;
-}
-
-void
-fz_freeover(fz_over *node)
-{
- if (node->child)
- fz_freenode(node->child);
- fz_free(node);
-}
-
-fz_rect
-fz_boundover(fz_over* node, fz_matrix ctm)
-{
- fz_node *child;
- fz_rect bbox;
- fz_rect r;
-
- bbox = FZ_INFRECT;
-
- for (child = node->child; child; child = child->next)
- {
- r = fz_boundnode(child, ctm);
- if (r.max.x >= r.min.x)
- {
- if (bbox.max.x >= bbox.min.x)
- bbox = fz_mergerects(r, bbox);
- else
- bbox = r;
- }
- }
-
- return bbox;
-}
-
diff --git a/tree/path.c b/tree/path.c
index d21fda56..bab84401 100644
--- a/tree/path.c
+++ b/tree/path.c
@@ -1,18 +1,21 @@
#include <fitz.h>
fz_error *
-fz_newpath(fz_path **pathp)
+fz_newpathnode(fz_pathnode **pathp)
{
- fz_path *path;
+ fz_pathnode *path;
- path = *pathp = fz_malloc(sizeof(fz_path));
+ path = *pathp = fz_malloc(sizeof(fz_pathnode));
if (!path)
return fz_outofmem;
fz_initnode((fz_node*)path, FZ_NPATH);
path->paint = FZ_FILL;
- path->stroke = nil;
+ path->linecap = 0;
+ path->linejoin = 0;
+ path->linewidth = 1.0;
+ path->miterlimit = 10.0;
path->dash = nil;
path->len = 0;
path->cap = 0;
@@ -22,18 +25,21 @@ fz_newpath(fz_path **pathp)
}
fz_error *
-fz_clonepath(fz_path **pathp, fz_path *oldpath)
+fz_clonepath(fz_pathnode **pathp, fz_pathnode *oldpath)
{
- fz_path *path;
+ fz_pathnode *path;
- path = *pathp = fz_malloc(sizeof(fz_path));
+ path = *pathp = fz_malloc(sizeof(fz_pathnode));
if (!path)
return fz_outofmem;
fz_initnode((fz_node*)path, FZ_NPATH);
path->paint = FZ_FILL;
- path->stroke = nil;
+ path->linecap = 0;
+ path->linejoin = 0;
+ path->linewidth = 1.0;
+ path->miterlimit = 10.0;
path->dash = nil;
path->len = oldpath->len;
path->cap = oldpath->len;
@@ -49,16 +55,14 @@ fz_clonepath(fz_path **pathp, fz_path *oldpath)
}
void
-fz_freepath(fz_path *node)
+fz_freepathnode(fz_pathnode *node)
{
- fz_free(node->stroke);
fz_free(node->dash);
fz_free(node->els);
- fz_free(node);
}
static fz_error *
-growpath(fz_path *path, int n)
+growpath(fz_pathnode *path, int n)
{
int newcap;
fz_pathel *newels;
@@ -77,7 +81,7 @@ growpath(fz_path *path, int n)
}
fz_error *
-fz_moveto(fz_path *path, float x, float y)
+fz_moveto(fz_pathnode *path, float x, float y)
{
if (growpath(path, 3) != nil)
return fz_outofmem;
@@ -88,7 +92,7 @@ fz_moveto(fz_path *path, float x, float y)
}
fz_error *
-fz_lineto(fz_path *path, float x, float y)
+fz_lineto(fz_pathnode *path, float x, float y)
{
if (growpath(path, 3) != nil)
return fz_outofmem;
@@ -99,7 +103,7 @@ fz_lineto(fz_path *path, float x, float y)
}
fz_error *
-fz_curveto(fz_path *path,
+fz_curveto(fz_pathnode *path,
float x1, float y1,
float x2, float y2,
float x3, float y3)
@@ -117,7 +121,7 @@ fz_curveto(fz_path *path,
}
fz_error *
-fz_curvetov(fz_path *path, float x2, float y2, float x3, float y3)
+fz_curvetov(fz_pathnode *path, float x2, float y2, float x3, float y3)
{
float x1 = path->els[path->len-2].v;
float y1 = path->els[path->len-1].v;
@@ -125,13 +129,13 @@ fz_curvetov(fz_path *path, float x2, float y2, float x3, float y3)
}
fz_error *
-fz_curvetoy(fz_path *path, float x1, float y1, float x3, float y3)
+fz_curvetoy(fz_pathnode *path, float x1, float y1, float x3, float y3)
{
return fz_curveto(path, x1, y1, x3, y3, x3, y3);
}
fz_error *
-fz_closepath(fz_path *path)
+fz_closepath(fz_pathnode *path)
{
if (growpath(path, 1) != nil)
return fz_outofmem;
@@ -140,7 +144,7 @@ fz_closepath(fz_path *path)
}
fz_error *
-fz_endpath(fz_path *path, fz_pathkind paint, fz_stroke *stroke, fz_dash *dash)
+fz_endpath(fz_pathnode *path, fz_pathkind paint, fz_stroke *stroke, fz_dash *dash)
{
fz_pathel *newels;
@@ -150,8 +154,14 @@ fz_endpath(fz_path *path, fz_pathkind paint, fz_stroke *stroke, fz_dash *dash)
path->els = newels;
path->paint = paint;
- path->stroke = stroke;
path->dash = dash;
+ if (stroke)
+ {
+ path->linecap = stroke->linecap;
+ path->linejoin = stroke->linejoin;
+ path->linewidth = stroke->linewidth;
+ path->miterlimit = stroke->miterlimit;
+ }
return nil;
}
@@ -174,7 +184,7 @@ static inline fz_rect boundexpand(fz_rect r, fz_point p)
}
fz_rect
-fz_boundpath(fz_path *path, fz_matrix ctm)
+fz_boundpathnode(fz_pathnode *path, fz_matrix ctm)
{
fz_point p;
fz_rect r = FZ_INFRECT;
@@ -204,8 +214,8 @@ fz_boundpath(fz_path *path, fz_matrix ctm)
if (path->paint == FZ_STROKE)
{
- float miterlength = sin(path->stroke->miterlimit / 2.0);
- float linewidth = path->stroke->linewidth;
+ float miterlength = sin(path->miterlimit / 2.0);
+ float linewidth = path->linewidth;
float expand = MAX(miterlength, linewidth) / 2.0;
r.min.x -= expand;
r.min.y -= expand;
@@ -217,7 +227,7 @@ fz_boundpath(fz_path *path, fz_matrix ctm)
}
void
-fz_debugpath(fz_path *path)
+fz_debugpathnode(fz_pathnode *path)
{
float x, y;
int i = 0;
diff --git a/tree/solid.c b/tree/solid.c
deleted file mode 100644
index 37ff55eb..00000000
--- a/tree/solid.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <fitz.h>
-
-fz_error *
-fz_newsolid(fz_node **nodep, float r, float g, float b)
-{
- fz_solid *node;
-
- node = fz_malloc(sizeof (fz_solid));
- if (!node)
- return fz_outofmem;
- *nodep = (fz_node*)node;
-
- fz_initnode((fz_node*)node, FZ_NSOLID);
- node->r = r;
- node->g = g;
- node->b = b;
-
- return nil;
-}
-
-void
-fz_freesolid(fz_solid *node)
-{
- fz_free(node);
-}
-
-fz_rect
-fz_boundsolid(fz_solid *node, fz_matrix ctm)
-{
- /* min > max => no bounds */
- return (fz_rect) { {1,1}, {-1,-1} };
-}
-
diff --git a/tree/text.c b/tree/text.c
index 312e3bde..f1992ade 100644
--- a/tree/text.c
+++ b/tree/text.c
@@ -1,11 +1,11 @@
#include <fitz.h>
fz_error *
-fz_newtext(fz_text **textp, fz_font *font)
+fz_newtextnode(fz_textnode **textp, fz_font *font)
{
- fz_text *text;
+ fz_textnode *text;
- text = *textp = fz_malloc(sizeof(fz_text));
+ text = *textp = fz_malloc(sizeof(fz_textnode));
if (!text)
return fz_outofmem;
@@ -21,21 +21,21 @@ fz_newtext(fz_text **textp, fz_font *font)
}
void
-fz_freetext(fz_text *text)
+fz_freetextnode(fz_textnode *text)
{
fz_free(text->els);
- fz_free(text);
-};
+}
fz_rect
-fz_boundtext(fz_text *text, fz_matrix ctm)
+fz_boundtextnode(fz_textnode *text, fz_matrix ctm)
{
+ // FIXME convolve font bbox to all glyph x,y pairs
/* fz_rect bounds = fz_boundglyph(text->font, text->els[0], ctm); */
return FZ_INFRECT;
}
static fz_error *
-growtext(fz_text *text, int n)
+growtext(fz_textnode *text, int n)
{
int newcap;
fz_textel *newels;
@@ -54,7 +54,7 @@ growtext(fz_text *text, int n)
}
fz_error *
-fz_addtext(fz_text *text, int g, float x, float y)
+fz_addtext(fz_textnode *text, int g, float x, float y)
{
if (growtext(text, 1) != nil)
return fz_outofmem;
diff --git a/tree/transform.c b/tree/transform.c
deleted file mode 100644
index 18910d6b..00000000
--- a/tree/transform.c
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <fitz.h>
-
-fz_error *
-fz_newtransform(fz_node **nodep, fz_matrix m)
-{
- fz_transform *node;
-
- node = fz_malloc(sizeof (fz_transform));
- if (!node)
- return fz_outofmem;
- *nodep = (fz_node*)node;
-
- fz_initnode((fz_node*)node, FZ_NTRANSFORM);
- node->child = nil;
- node->m = m;
-
- return nil;
-}
-
-void
-fz_freetransform(fz_transform *node)
-{
- if (node->child)
- fz_freenode(node->child);
- fz_free(node);
-}
-
-fz_rect
-fz_boundtransform(fz_transform *node, fz_matrix ctm)
-{
- if (!node->child)
- return FZ_INFRECT;
- return fz_boundnode(node->child, fz_concat(node->m, ctm));
-}
-
diff --git a/tree/tree.c b/tree/tree.c
index 1a96ec38..7de88e11 100644
--- a/tree/tree.c
+++ b/tree/tree.c
@@ -9,18 +9,31 @@ fz_newtree(fz_tree **treep)
if (!tree)
return fz_outofmem;
+ tree->refcount = 1;
tree->root = nil;
tree->head = nil;
return nil;
}
+fz_tree *
+fz_keeptree(fz_tree *tree)
+{
+ tree->refcount ++;
+ return tree;
+}
+
void
-fz_freetree(fz_tree *tree)
+fz_droptree(fz_tree *tree)
{
- if (tree->root)
- fz_freenode(tree->root);
- fz_free(tree);
+ tree->refcount --;
+
+ if (tree->refcount == 0)
+ {
+ if (tree->root)
+ fz_freenode(tree->root);
+ fz_free(tree);
+ }
}
fz_rect
@@ -32,32 +45,16 @@ fz_boundtree(fz_tree *tree, fz_matrix ctm)
}
void
-fz_insertnode(fz_node *node, fz_node *child)
+fz_insertnode(fz_node *parent, fz_node *child)
{
- child->parent = node;
-
- if (fz_isover(node))
- {
- child->next = ((fz_over*)node)->child;
- ((fz_over*)node)->child = child;
- }
-
- if (fz_ismask(node))
- {
- child->next = ((fz_mask*)node)->child;
- ((fz_mask*)node)->child = child;
- }
-
- if (fz_isblend(node))
- {
- child->next = ((fz_blend*)node)->child;
- ((fz_blend*)node)->child = child;
- }
-
- if (fz_istransform(node))
- {
- child->next = ((fz_transform*)node)->child;
- ((fz_transform*)node)->child = child;
- }
+ assert(fz_istransformnode(parent) ||
+ fz_isovernode(parent) ||
+ fz_ismasknode(parent) ||
+ fz_isblendnode(parent) ||
+ fz_ismetanode(parent));
+
+ child->parent = parent;
+ child->next = parent->child;
+ parent->child = child;
}