diff options
Diffstat (limited to 'source/fitz/list-device.c')
-rw-r--r-- | source/fitz/list-device.c | 105 |
1 files changed, 58 insertions, 47 deletions
diff --git a/source/fitz/list-device.c b/source/fitz/list-device.c index f56bc879..72a63ef4 100644 --- a/source/fitz/list-device.c +++ b/source/fitz/list-device.c @@ -2,6 +2,12 @@ typedef struct fz_display_node_s fz_display_node; +typedef struct fz_list_device_s +{ + fz_device super; + fz_display_list *list; +} fz_list_device; + #define STACK_SIZE 96 typedef enum fz_display_command_e @@ -101,8 +107,11 @@ fz_new_display_node(fz_context *ctx, fz_display_command cmd, const fz_matrix *ct } static void -fz_append_display_node(fz_display_list *list, fz_display_node *node) +fz_append_display_node(fz_context *ctx, fz_device *dev_, fz_display_node *node) { + fz_list_device *dev = (fz_list_device*)dev_; + fz_display_list *list = dev->list; + switch (node->cmd) { case FZ_CMD_CLIP_PATH: @@ -234,14 +243,14 @@ fz_list_begin_page(fz_context *ctx, fz_device *dev, const fz_rect *mediabox, con fz_display_node *node = fz_new_display_node(ctx, FZ_CMD_BEGIN_PAGE, ctm, NULL, NULL, 0); node->rect = *mediabox; fz_transform_rect(&node->rect, ctm); - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void fz_list_end_page(fz_context *ctx, fz_device *dev) { fz_display_node *node = fz_new_display_node(ctx, FZ_CMD_END_PAGE, &fz_identity, NULL, NULL, 0); - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -261,7 +270,7 @@ fz_list_fill_path(fz_context *ctx, fz_device *dev, fz_path *path, int even_odd, fz_free_display_node(ctx, node); fz_rethrow(ctx); } - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -281,7 +290,7 @@ fz_list_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, fz_stroke_st fz_free_display_node(ctx, node); fz_rethrow(ctx); } - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -302,7 +311,7 @@ fz_list_clip_path(fz_context *ctx, fz_device *dev, fz_path *path, const fz_rect fz_free_display_node(ctx, node); fz_rethrow(ctx); } - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -323,7 +332,7 @@ fz_list_clip_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, const f fz_free_display_node(ctx, node); fz_rethrow(ctx); } - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -342,7 +351,7 @@ fz_list_fill_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matri fz_free_display_node(ctx, node); fz_rethrow(ctx); } - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -363,7 +372,7 @@ fz_list_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_st fz_free_display_node(ctx, node); fz_rethrow(ctx); } - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -385,7 +394,7 @@ fz_list_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matri fz_free_display_node(ctx, node); fz_rethrow(ctx); } - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -404,7 +413,7 @@ fz_list_clip_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stro fz_free_display_node(ctx, node); fz_rethrow(ctx); } - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -422,7 +431,7 @@ fz_list_ignore_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_mat fz_free_display_node(ctx, node); fz_rethrow(ctx); } - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -430,7 +439,7 @@ fz_list_pop_clip(fz_context *ctx, fz_device *dev) { fz_display_node *node; node = fz_new_display_node(ctx, FZ_CMD_POP_CLIP, &fz_identity, NULL, NULL, 0); - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -440,7 +449,7 @@ fz_list_fill_shade(fz_context *ctx, fz_device *dev, fz_shade *shade, const fz_ma node = fz_new_display_node(ctx, FZ_CMD_FILL_SHADE, ctm, NULL, NULL, alpha); fz_bound_shade(ctx, shade, ctm, &node->rect); node->item.shade = fz_keep_shade(ctx, shade); - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -451,7 +460,7 @@ fz_list_fill_image(fz_context *ctx, fz_device *dev, fz_image *image, const fz_ma node->rect = fz_unit_rect; fz_transform_rect(&node->rect, ctm); node->item.image = fz_keep_image(ctx, image); - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -463,7 +472,7 @@ fz_list_fill_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const node->rect = fz_unit_rect; fz_transform_rect(&node->rect, ctm); node->item.image = fz_keep_image(ctx, image); - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -476,7 +485,7 @@ fz_list_clip_image_mask(fz_context *ctx, fz_device *dev, fz_image *image, const if (rect) fz_intersect_rect(&node->rect, rect); node->item.image = fz_keep_image(ctx, image); - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -486,7 +495,7 @@ fz_list_begin_mask(fz_context *ctx, fz_device *dev, const fz_rect *rect, int lum node = fz_new_display_node(ctx, FZ_CMD_BEGIN_MASK, &fz_identity, colorspace, color, 0); node->rect = *rect; node->flag = luminosity; - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -494,7 +503,7 @@ fz_list_end_mask(fz_context *ctx, fz_device *dev) { fz_display_node *node; node = fz_new_display_node(ctx, FZ_CMD_END_MASK, &fz_identity, NULL, NULL, 0); - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -506,7 +515,7 @@ fz_list_begin_group(fz_context *ctx, fz_device *dev, const fz_rect *rect, int is node->item.blendmode = blendmode; node->flag |= isolated ? ISOLATED : 0; node->flag |= knockout ? KNOCKOUT : 0; - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static void @@ -514,7 +523,7 @@ fz_list_end_group(fz_context *ctx, fz_device *dev) { fz_display_node *node; node = fz_new_display_node(ctx, FZ_CMD_END_GROUP, &fz_identity, NULL, NULL, 0); - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } static int @@ -530,7 +539,7 @@ fz_list_begin_tile(fz_context *ctx, fz_device *dev, const fz_rect *area, const f node->color[3] = view->y0; node->color[4] = view->x1; node->color[5] = view->y1; - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); return 0; } @@ -539,44 +548,46 @@ fz_list_end_tile(fz_context *ctx, fz_device *dev) { fz_display_node *node; node = fz_new_display_node(ctx, FZ_CMD_END_TILE, &fz_identity, NULL, NULL, 0); - fz_append_display_node(dev->user, node); + fz_append_display_node(ctx, dev, node); } fz_device * fz_new_list_device(fz_context *ctx, fz_display_list *list) { - fz_device *dev = fz_new_device(ctx, list); + fz_list_device *dev = fz_new_device(ctx, sizeof *dev); + + dev->super.begin_page = fz_list_begin_page; + dev->super.end_page = fz_list_end_page; - dev->begin_page = fz_list_begin_page; - dev->end_page = fz_list_end_page; + dev->super.fill_path = fz_list_fill_path; + dev->super.stroke_path = fz_list_stroke_path; + dev->super.clip_path = fz_list_clip_path; + dev->super.clip_stroke_path = fz_list_clip_stroke_path; - dev->fill_path = fz_list_fill_path; - dev->stroke_path = fz_list_stroke_path; - dev->clip_path = fz_list_clip_path; - dev->clip_stroke_path = fz_list_clip_stroke_path; + dev->super.fill_text = fz_list_fill_text; + dev->super.stroke_text = fz_list_stroke_text; + dev->super.clip_text = fz_list_clip_text; + dev->super.clip_stroke_text = fz_list_clip_stroke_text; + dev->super.ignore_text = fz_list_ignore_text; - dev->fill_text = fz_list_fill_text; - dev->stroke_text = fz_list_stroke_text; - dev->clip_text = fz_list_clip_text; - dev->clip_stroke_text = fz_list_clip_stroke_text; - dev->ignore_text = fz_list_ignore_text; + dev->super.fill_shade = fz_list_fill_shade; + dev->super.fill_image = fz_list_fill_image; + dev->super.fill_image_mask = fz_list_fill_image_mask; + dev->super.clip_image_mask = fz_list_clip_image_mask; - dev->fill_shade = fz_list_fill_shade; - dev->fill_image = fz_list_fill_image; - dev->fill_image_mask = fz_list_fill_image_mask; - dev->clip_image_mask = fz_list_clip_image_mask; + dev->super.pop_clip = fz_list_pop_clip; - dev->pop_clip = fz_list_pop_clip; + dev->super.begin_mask = fz_list_begin_mask; + dev->super.end_mask = fz_list_end_mask; + dev->super.begin_group = fz_list_begin_group; + dev->super.end_group = fz_list_end_group; - dev->begin_mask = fz_list_begin_mask; - dev->end_mask = fz_list_end_mask; - dev->begin_group = fz_list_begin_group; - dev->end_group = fz_list_end_group; + dev->super.begin_tile = fz_list_begin_tile; + dev->super.end_tile = fz_list_end_tile; - dev->begin_tile = fz_list_begin_tile; - dev->end_tile = fz_list_end_tile; + dev->list = list; - return dev; + return (fz_device*)dev; } static void |