summaryrefslogtreecommitdiff
path: root/source/fitz/svg-device.c
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2018-01-22 18:43:01 +0000
committerTor Andersson <tor.andersson@artifex.com>2018-02-13 14:45:02 +0100
commit60aa2d2f7109bc8e975f949d88729f1f3e4e7ac3 (patch)
tree67ab8847fcf4d2a7ba8928227b3a561c46a5a7d8 /source/fitz/svg-device.c
parent4e928c68b1852b860122bac28cc0f3af96c3156e (diff)
downloadmupdf-60aa2d2f7109bc8e975f949d88729f1f3e4e7ac3.tar.xz
Add fz_begin_layer/fz_end_layer.
Call these from the PDF interpreter. Make the DisplayList and Trace devices cope. Use these in the SVG output device.
Diffstat (limited to 'source/fitz/svg-device.c')
-rw-r--r--source/fitz/svg-device.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/source/fitz/svg-device.c b/source/fitz/svg-device.c
index 7c8dfd50..c5905938 100644
--- a/source/fitz/svg-device.c
+++ b/source/fitz/svg-device.c
@@ -66,6 +66,8 @@ struct svg_device_s
int num_images;
int max_images;
image *images;
+
+ int layers;
};
/* SVG is awkward about letting us define things within symbol definitions
@@ -1163,10 +1165,40 @@ svg_dev_end_tile(fz_context *ctx, fz_device *dev)
}
static void
+svg_dev_begin_layer(fz_context *ctx, fz_device *dev, const char *name)
+{
+ svg_device *sdev = (svg_device*)dev;
+ fz_output *out = sdev->out;
+
+ sdev->layers++;
+ fz_write_printf(ctx, out, "<g id=\"Layer-%d\" data-name=\"%s\">\n", sdev->layers, name);
+}
+
+static void
+svg_dev_end_layer(fz_context *ctx, fz_device *dev)
+{
+ svg_device *sdev = (svg_device*)dev;
+ fz_output *out = sdev->out;
+
+ if (sdev->layers == 0)
+ return;
+
+ sdev->layers--;
+ fz_write_printf(ctx, out, "</g>\n");
+}
+
+static void
svg_dev_close_device(fz_context *ctx, fz_device *dev)
{
svg_device *sdev = (svg_device*)dev;
fz_output *out = sdev->out;
+
+ while (sdev->layers > 0)
+ {
+ fz_write_printf(ctx, out, "</g>\n");
+ sdev->layers--;
+ }
+
fz_write_printf(ctx, out, "</svg>\n");
}
@@ -1225,11 +1257,15 @@ fz_device *fz_new_svg_device(fz_context *ctx, fz_output *out, float page_width,
dev->super.begin_tile = svg_dev_begin_tile;
dev->super.end_tile = svg_dev_end_tile;
+ dev->super.begin_layer = svg_dev_begin_layer;
+ dev->super.end_layer = svg_dev_end_layer;
+
dev->super.hints |= FZ_MAINTAIN_CONTAINER_STACK;
dev->out = out;
dev->out_store = out;
dev->id = 0;
+ dev->layers = 0;
dev->text_as_text = (text_format == FZ_SVG_TEXT_AS_TEXT);
dev->reuse_images = reuse_images;