SmartPDF - lightweight pdf viewer app for rosapps
[reactos.git] / rosapps / smartpdf / fitz / world / node_toxml.c
1 #include "fitz-base.h"
2 #include "fitz-world.h"
3
4 static void indent(int level)
5 {
6 while (level--)
7 putchar(' ');
8 }
9
10 static void xmlnode(fz_node *node, int level);
11
12 static void xmlmeta(fz_metanode *node, int level)
13 {
14 fz_node *child;
15
16 indent(level);
17 printf("<meta name=\"%s\">\n", node->name);
18
19 for (child = node->super.first; child; child = child->next)
20 xmlnode(child, level + 1);
21
22 indent(level);
23 printf("</meta>\n");
24 }
25
26 static void xmlover(fz_overnode *node, int level)
27 {
28 fz_node *child;
29 indent(level);
30 printf("<over>\n");
31 for (child = node->super.first; child; child = child->next)
32 xmlnode(child, level + 1);
33 indent(level);
34 printf("</over>\n");
35 }
36
37 static void xmlmask(fz_masknode *node, int level)
38 {
39 fz_node *child;
40 indent(level);
41 printf("<mask>\n");
42 for (child = node->super.first; child; child = child->next)
43 xmlnode(child, level + 1);
44 indent(level);
45 printf("</mask>\n");
46 }
47
48 static void xmlblend(fz_blendnode *node, int level)
49 {
50 fz_node *child;
51 indent(level);
52 printf("<blend mode=\"%d\">\n", node->mode);
53 for (child = node->super.first; child; child = child->next)
54 xmlnode(child, level + 1);
55 indent(level);
56 printf("</blend>\n");
57 }
58
59 static void xmltransform(fz_transformnode *node, int level)
60 {
61 indent(level);
62 printf("<transform matrix=\"%g %g %g %g %g %g\">\n",
63 node->m.a, node->m.b,
64 node->m.c, node->m.d,
65 node->m.e, node->m.f);
66 xmlnode(node->super.first, level + 1);
67 indent(level);
68 printf("</transform>\n");
69 }
70
71 static void xmlsolid(fz_solidnode *node, int level)
72 {
73 int i;
74 indent(level);
75 printf("<solid colorspace=\"%s\" v=\"", node->cs->name);
76 for (i = 0; i < node->n; i++)
77 {
78 printf("%g", node->samples[i]);
79 if (i < node->n - 1)
80 putchar(' ');
81 }
82 printf("\" />\n");
83 }
84
85 static void xmllink(fz_linknode *node, int level)
86 {
87 indent(level);
88 printf("<link name=\"%p\" />\n", node->tree);
89 }
90
91 static void xmlpath(fz_pathnode *node, int level)
92 {
93 int i;
94
95 indent(level);
96
97 if (node->paint == FZ_STROKE)
98 {
99 printf("<path fill=\"stroke\" cap=\"%d\" join=\"%d\" width=\"%g\" miter=\"%g\"",
100 node->linecap,
101 node->linejoin,
102 node->linewidth,
103 node->miterlimit);
104 if (node->dash)
105 {
106 printf(" phase=\"%g\" array=\"", node->dash->phase);
107 for (i = 0; i < node->dash->len; i++)
108 printf("%g ", node->dash->array[i]);
109 printf("\"");
110 }
111 printf(">\n");
112 }
113 else
114 {
115 printf("<path fill=\"%s\">\n",
116 node->paint == FZ_FILL ? "nonzero" : "evenodd");
117 }
118
119 fz_debugpathnode(node);
120
121 indent(level);
122 printf("</path>\n");
123 }
124
125 static void xmltext(fz_textnode *node, int level)
126 {
127 int i;
128
129 indent(level);
130 printf("<text font=\"%s\" matrix=\"%g %g %g %g\">\n", node->font->name,
131 node->trm.a, node->trm.b, node->trm.c, node->trm.d);
132
133 for (i = 0; i < node->len; i++)
134 {
135 indent(level + 1);
136 if (node->els[i].cid >= 32 && node->els[i].cid < 128)
137 printf("<g c=\"%c\" x=\"%g\" y=\"%g\" />\n",
138 node->els[i].cid, node->els[i].x, node->els[i].y);
139 else
140 printf("<g c=\"<%04x>\" x=\"%g\" y=\"%g\" />\n",
141 node->els[i].cid, node->els[i].x, node->els[i].y);
142 }
143
144 indent(level);
145 printf("</text>\n");
146 }
147
148 static void xmlimage(fz_imagenode *node, int level)
149 {
150 fz_image *image = node->image;
151 indent(level);
152 printf("<image w=\"%d\" h=\"%d\" n=\"%d\" a=\"%d\" />\n",
153 image->w, image->h, image->n, image->a);
154 }
155
156 static void xmlshade(fz_shadenode *node, int level)
157 {
158 indent(level);
159 printf("<shade />\n");
160 }
161
162 static void xmlnode(fz_node *node, int level)
163 {
164 if (!node)
165 {
166 indent(level);
167 printf("<nil />\n");
168 return;
169 }
170
171 switch (node->kind)
172 {
173 case FZ_NMETA: xmlmeta((fz_metanode*)node, level); break;
174 case FZ_NOVER: xmlover((fz_overnode*)node, level); break;
175 case FZ_NMASK: xmlmask((fz_masknode*)node, level); break;
176 case FZ_NBLEND: xmlblend((fz_blendnode*)node, level); break;
177 case FZ_NTRANSFORM: xmltransform((fz_transformnode*)node, level); break;
178 case FZ_NCOLOR: xmlsolid((fz_solidnode*)node, level); break;
179 case FZ_NPATH: xmlpath((fz_pathnode*)node, level); break;
180 case FZ_NTEXT: xmltext((fz_textnode*)node, level); break;
181 case FZ_NIMAGE: xmlimage((fz_imagenode*)node, level); break;
182 case FZ_NSHADE: xmlshade((fz_shadenode*)node, level); break;
183 case FZ_NLINK: xmllink((fz_linknode*)node, level); break;
184 }
185 }
186
187 void
188 fz_debugnode(fz_node *node)
189 {
190 xmlnode(node, 0);
191 }
192
193 void
194 fz_debugtree(fz_tree *tree)
195 {
196 printf("<tree>\n");
197 xmlnode(tree->root, 1);
198 printf("</tree>\n");
199 }
200