diff options
Diffstat (limited to 'fitz/node_toxml.c')
-rw-r--r-- | fitz/node_toxml.c | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/fitz/node_toxml.c b/fitz/node_toxml.c new file mode 100644 index 00000000..04a00423 --- /dev/null +++ b/fitz/node_toxml.c @@ -0,0 +1,206 @@ +#include <fitz.h> + +static void indent(int level) +{ + while (level--) + putchar(' '); +} + +static void xmlnode(fz_node *node, int level); + +static void xmlmeta(fz_metanode *node, int level) +{ + fz_node *child; + + indent(level); + printf("<meta"); + if (node->name) + { + printf(" name=\""); + fz_debugobj(node->name); + printf("\" "); + } + printf(">\n"); + + for (child = node->super.first; child; child = child->next) + xmlnode(child, level + 1); + + indent(level); + printf("</meta>\n"); +} + +static void xmlover(fz_overnode *node, int level) +{ + fz_node *child; + indent(level); + printf("<over>\n"); + for (child = node->super.first; child; child = child->next) + xmlnode(child, level + 1); + indent(level); + printf("</over>\n"); +} + +static void xmlmask(fz_masknode *node, int level) +{ + fz_node *child; + indent(level); + printf("<mask>\n"); + for (child = node->super.first; child; child = child->next) + xmlnode(child, level + 1); + indent(level); + printf("</mask>\n"); +} + +static void xmlblend(fz_blendnode *node, int level) +{ + fz_node *child; + indent(level); + printf("<blend mode=\"%d\">\n", node->mode); + for (child = node->super.first; child; child = child->next) + xmlnode(child, level + 1); + indent(level); + printf("</blend>\n"); +} + +static void xmltransform(fz_transformnode *node, int level) +{ + indent(level); + printf("<transform matrix=\"%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); + xmlnode(node->super.first, level + 1); + indent(level); + printf("</transform>\n"); +} + +static void xmlcolor(fz_colornode *node, int level) +{ + int i; + indent(level); + printf("<solid colorspace=\"%s\" v=\"", node->cs->name); + for (i = 0; i < node->n; i++) + { + printf("%g", node->samples[i]); + if (i < node->n - 1) + putchar(' '); + } + printf("\" />\n"); +} + +static void xmllink(fz_linknode *node, int level) +{ + indent(level); + printf("<link name=\"%p\" />\n", node->tree); +} + +static void xmlpath(fz_pathnode *node, int level) +{ + int i; + + indent(level); + + if (node->paint == FZ_STROKE) + { + printf("<path fill=\"stroke\" cap=\"%d\" join=\"%d\" width=\"%g\" miter=\"%g\"", + node->linecap, + node->linejoin, + node->linewidth, + node->miterlimit); + if (node->dash) + { + printf(" phase=\"%g\" array=\"", node->dash->phase); + for (i = 0; i < node->dash->len; i++) + printf("%g ", node->dash->array[i]); + printf("\""); + } + printf(">\n"); + } + else + { + printf("<path fill=\"%s\">\n", + node->paint == FZ_FILL ? "nonzero" : "evenodd"); + } + + fz_debugpathnode(node); + + indent(level); + printf("</path>\n"); +} + +static void xmltext(fz_textnode *node, int level) +{ + int i; + + indent(level); + printf("<text font=\"%s\" matrix=\"%g %g %g %g\">\n", node->font->name, + node->trm.a, node->trm.b, node->trm.c, node->trm.d); + + for (i = 0; i < node->len; i++) + { + indent(level + 1); + if (node->els[i].cid >= 32 && node->els[i].cid < 128) + printf("<g c=\"%c\" x=\"%g\" y=\"%g\" />\n", + node->els[i].cid, node->els[i].x, node->els[i].y); + else + printf("<g c=\"<%04x>\" x=\"%g\" y=\"%g\" />\n", + node->els[i].cid, node->els[i].x, node->els[i].y); + } + + indent(level); + printf("</text>\n"); +} + +static void xmlimage(fz_imagenode *node, int level) +{ + fz_image *image = node->image; + indent(level); + printf("<image w=\"%d\" h=\"%d\" n=\"%d\" a=\"%d\" />\n", + image->w, image->h, image->n, image->a); +} + +static void xmlshade(fz_shadenode *node, int level) +{ + indent(level); + printf("<shade />\n"); +} + +static void xmlnode(fz_node *node, int level) +{ + if (!node) + { + indent(level); + printf("<nil />\n"); + return; + } + + switch (node->kind) + { + case FZ_NMETA: xmlmeta((fz_metanode*)node, level); break; + case FZ_NOVER: xmlover((fz_overnode*)node, level); break; + case FZ_NMASK: xmlmask((fz_masknode*)node, level); break; + case FZ_NBLEND: xmlblend((fz_blendnode*)node, level); break; + case FZ_NTRANSFORM: xmltransform((fz_transformnode*)node, level); break; + case FZ_NCOLOR: xmlcolor((fz_colornode*)node, level); break; + case FZ_NPATH: xmlpath((fz_pathnode*)node, level); break; + case FZ_NTEXT: xmltext((fz_textnode*)node, level); break; + case FZ_NIMAGE: xmlimage((fz_imagenode*)node, level); break; + case FZ_NSHADE: xmlshade((fz_shadenode*)node, level); break; + case FZ_NLINK: xmllink((fz_linknode*)node, level); break; + } +} + +void +fz_debugnode(fz_node *node) +{ + xmlnode(node, 0); +} + +void +fz_debugtree(fz_tree *tree) +{ + printf("<tree>\n"); + xmlnode(tree->root, 1); + printf("</tree>\n"); +} + |