summaryrefslogtreecommitdiff
path: root/source/fitz/list-device.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/fitz/list-device.c')
-rw-r--r--source/fitz/list-device.c56
1 files changed, 53 insertions, 3 deletions
diff --git a/source/fitz/list-device.c b/source/fitz/list-device.c
index 7a1f67ee..39314b54 100644
--- a/source/fitz/list-device.c
+++ b/source/fitz/list-device.c
@@ -31,7 +31,9 @@ typedef enum fz_display_command_e
FZ_CMD_BEGIN_TILE,
FZ_CMD_END_TILE,
FZ_CMD_RENDER_FLAGS,
- FZ_CMD_DEFAULT_COLORSPACES
+ FZ_CMD_DEFAULT_COLORSPACES,
+ FZ_CMD_BEGIN_LAYER,
+ FZ_CMD_END_LAYER
} fz_display_command;
/* The display list is a list of nodes.
@@ -165,7 +167,7 @@ fz_append_display_node(
const float *alpha,
const fz_matrix *ctm,
const fz_stroke_state *stroke,
- void *private_data,
+ const void *private_data,
int private_data_len)
{
fz_display_node node = { 0 };
@@ -1262,6 +1264,44 @@ fz_list_set_default_colorspaces(fz_context *ctx, fz_device *dev, fz_default_colo
}
static void
+fz_list_begin_layer(fz_context *ctx, fz_device *dev, const char *layer_name)
+{
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_BEGIN_LAYER,
+ 0, /* flags */
+ NULL,
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ NULL, /* alpha */
+ NULL,
+ NULL, /* stroke */
+ layer_name, /* private_data */
+ 1+strlen(layer_name)); /* private_data_len */
+}
+
+static void
+fz_list_end_layer(fz_context *ctx, fz_device *dev)
+{
+ fz_append_display_node(
+ ctx,
+ dev,
+ FZ_CMD_END_LAYER,
+ 0, /* flags */
+ NULL,
+ NULL, /* path */
+ NULL, /* color */
+ NULL, /* colorspace */
+ NULL, /* alpha */
+ NULL, /* ctm */
+ NULL, /* stroke */
+ NULL, /* private_data */
+ 0); /* private_data_len */
+}
+
+static void
fz_list_drop_device(fz_context *ctx, fz_device *dev)
{
fz_list_device *writer = (fz_list_device *)dev;
@@ -1307,6 +1347,9 @@ fz_new_list_device(fz_context *ctx, fz_display_list *list)
dev->super.render_flags = fz_list_render_flags;
dev->super.set_default_colorspaces = fz_list_set_default_colorspaces;
+ dev->super.begin_layer = fz_list_begin_layer;
+ dev->super.end_layer = fz_list_end_layer;
+
dev->super.drop_device = fz_list_drop_device;
dev->list = list;
@@ -1645,7 +1688,8 @@ fz_run_display_list(fz_context *ctx, fz_display_list *list, fz_device *dev, cons
if (tiled ||
n.cmd == FZ_CMD_BEGIN_TILE || n.cmd == FZ_CMD_END_TILE ||
- n.cmd == FZ_CMD_RENDER_FLAGS || n.cmd == FZ_CMD_DEFAULT_COLORSPACES)
+ n.cmd == FZ_CMD_RENDER_FLAGS || n.cmd == FZ_CMD_DEFAULT_COLORSPACES ||
+ n.cmd == FZ_CMD_BEGIN_LAYER || n.cmd == FZ_CMD_END_LAYER)
{
empty = 0;
}
@@ -1778,6 +1822,12 @@ visible:
case FZ_CMD_DEFAULT_COLORSPACES:
fz_set_default_colorspaces(ctx, dev, *(fz_default_colorspaces **)node);
break;
+ case FZ_CMD_BEGIN_LAYER:
+ fz_begin_layer(ctx, dev, (const char *)node);
+ break;
+ case FZ_CMD_END_LAYER:
+ fz_end_layer(ctx, dev);
+ break;
}
}
fz_catch(ctx)