diff options
author | Robin Watts <robin.watts@artifex.com> | 2015-03-05 17:31:05 -0700 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2015-03-24 19:50:00 +0000 |
commit | 5f161e45d5daacb696d02b8fad23d0c23f5bc8bc (patch) | |
tree | 6e8d84a383d580ee38b23dfb345bc96d0ba1e63e /source/fitz/trace-device.c | |
parent | 563c482145d65c4006f5842c8860ab1b09f5a229 (diff) | |
download | mupdf-5f161e45d5daacb696d02b8fad23d0c23f5bc8bc.tar.xz |
Path rework for improved memory usage.
Firstly, we make the definition of the path structures local to
path.c. This is achieved by using an fz_path_processor function to
step through paths enumerating each section using callback functions.
Next, we extend the internal path representation to include other
section types, including quads, beziers with common control points
rectangles, horizontal, vertical and degenerate lines. We also roll
close path sections up into the previous sections commands.
The hairiest part of this is that fz_transform_path has to cope with
changing the path commands depending on the matrix. This is a
relatively rare operation though.
Diffstat (limited to 'source/fitz/trace-device.c')
-rw-r--r-- | source/fitz/trace-device.c | 98 |
1 files changed, 59 insertions, 39 deletions
diff --git a/source/fitz/trace-device.c b/source/fitz/trace-device.c index 97dd4f79..105f7e6b 100644 --- a/source/fitz/trace-device.c +++ b/source/fitz/trace-device.c @@ -27,42 +27,62 @@ fz_trace_color(fz_colorspace *colorspace, float *color, float alpha) } static void -fz_trace_path(fz_path *path, int indent) +trace_moveto(fz_context *ctx, void *arg, float x, float y) { - float x, y; - int i = 0, k = 0, n; - while (i < path->cmd_len) - { - for (n = 0; n < indent; n++) - putchar(' '); - switch (path->cmds[i++]) - { - case FZ_MOVETO: - x = path->coords[k++]; - y = path->coords[k++]; - printf("<moveto x=\"%g\" y=\"%g\"/>\n", x, y); - break; - case FZ_LINETO: - x = path->coords[k++]; - y = path->coords[k++]; - printf("<lineto x=\"%g\" y=\"%g\"/>\n", x, y); - break; - case FZ_CURVETO: - x = path->coords[k++]; - y = path->coords[k++]; - printf("<curveto x1=\"%g\" y1=\"%g\"", x, y); - x = path->coords[k++]; - y = path->coords[k++]; - printf(" x2=\"%g\" y2=\"%g\"", x, y); - x = path->coords[k++]; - y = path->coords[k++]; - printf(" x3=\"%g\" y3=\"%g\"/>\n", x, y); - break; - case FZ_CLOSE_PATH: - printf("<closepath/>\n"); - break; - } - } + int indent = (int)(intptr_t)arg; + int n; + + for (n = 0; n < indent; n++) + putchar(' '); + printf("<moveto x=\"%g\" y=\"%g\"/>\n", x, y); +} + +static void +trace_lineto(fz_context *ctx, void *arg, float x, float y) +{ + int indent = (int)(intptr_t)arg; + int n; + + for (n = 0; n < indent; n++) + putchar(' '); + printf("<lineto x=\"%g\" y=\"%g\"/>\n", x, y); +} + +static void +trace_curveto(fz_context *ctx, void *arg, float x1, float y1, float x2, float y2, float x3, float y3) +{ + int indent = (int)(intptr_t)arg; + int n; + + for (n = 0; n < indent; n++) + putchar(' '); + printf("<curveto x1=\"%g\" y1=\"%g\" x2=\"%g\" y2=\"%g\" x3=\"%g\" y3=\"%g\"/>\n", x1, y1, x2, y2, x3, y3); +} + +static void +trace_close(fz_context *ctx, void *arg) +{ + int indent = (int)(intptr_t)arg; + int n; + + for (n = 0; n < indent; n++) + putchar(' '); + printf("<closepath/>\n"); +} + + +static const fz_path_processor trace_path_proc = +{ + trace_moveto, + trace_lineto, + trace_curveto, + trace_close +}; + +static void +fz_trace_path(fz_context *ctx, fz_path *path, int indent) +{ + fz_process_path(ctx, &trace_path_proc, (void *)(intptr_t)indent, path); } static void @@ -91,7 +111,7 @@ fz_trace_fill_path(fz_context *ctx, fz_device *dev, fz_path *path, int even_odd, fz_trace_color(colorspace, color, alpha); fz_trace_matrix(ctm); printf(">\n"); - fz_trace_path(path, 0); + fz_trace_path(ctx, path, 0); printf("</fill_path>\n"); } @@ -119,7 +139,7 @@ fz_trace_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, fz_stroke_s fz_trace_matrix(ctm); printf(">\n"); - fz_trace_path(path, 0); + fz_trace_path(ctx, path, 0); printf("</stroke_path>\n"); } @@ -137,7 +157,7 @@ fz_trace_clip_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect printf(" contentbbox=\"%g %g %g %g\">\n", rect->x0, rect->y0, rect->x1, rect->y1); else printf(">\n"); - fz_trace_path(path, 0); + fz_trace_path(ctx, path, 0); printf("</clip_path>\n"); } @@ -147,7 +167,7 @@ fz_trace_clip_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, const printf("<clip_stroke_path"); fz_trace_matrix(ctm); printf(">\n"); - fz_trace_path(path, 0); + fz_trace_path(ctx, path, 0); printf("</clip_stroke_path>\n"); } |