summaryrefslogtreecommitdiff
path: root/tree/node2.c
diff options
context:
space:
mode:
Diffstat (limited to 'tree/node2.c')
-rw-r--r--tree/node2.c304
1 files changed, 304 insertions, 0 deletions
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;
+}
+