diff options
Diffstat (limited to 'fitz/dev_list.c')
-rw-r--r-- | fitz/dev_list.c | 92 |
1 files changed, 53 insertions, 39 deletions
diff --git a/fitz/dev_list.c b/fitz/dev_list.c index 826d0c46..44a9161f 100644 --- a/fitz/dev_list.c +++ b/fitz/dev_list.c @@ -6,6 +6,8 @@ typedef struct fz_display_node_s fz_display_node; typedef enum fz_display_command_e { + FZ_CMD_BEGIN_PAGE, + FZ_CMD_END_PAGE, FZ_CMD_FILL_PATH, FZ_CMD_STROKE_PATH, FZ_CMD_CLIP_PATH, @@ -210,6 +212,8 @@ fz_free_display_node(fz_context *ctx, fz_display_node *node) case FZ_CMD_END_GROUP: case FZ_CMD_BEGIN_TILE: case FZ_CMD_END_TILE: + case FZ_CMD_BEGIN_PAGE: + case FZ_CMD_END_PAGE: break; } if (node->stroke) @@ -220,6 +224,24 @@ fz_free_display_node(fz_context *ctx, fz_display_node *node) } static void +fz_list_begin_page(fz_device *dev, const fz_rect *mediabox, const fz_matrix *ctm) +{ + fz_context *ctx = dev->ctx; + 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); +} + +static void +fz_list_end_page(fz_device *dev) +{ + fz_context *ctx = dev->ctx; + 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); +} + +static void fz_list_fill_path(fz_device *dev, fz_path *path, int even_odd, const fz_matrix *ctm, fz_colorspace *colorspace, float *color, float alpha) { @@ -532,6 +554,9 @@ fz_new_list_device(fz_context *ctx, fz_display_list *list) { fz_device *dev = fz_new_device(ctx, list); + dev->begin_page = fz_list_begin_page; + dev->end_page = fz_list_end_page; + dev->fill_path = fz_list_fill_path; dev->stroke_path = fz_list_stroke_path; dev->clip_path = fz_list_clip_path; @@ -627,7 +652,6 @@ fz_run_display_list(fz_display_list *list, fz_device *dev, const fz_matrix *top_ fz_matrix ctm; int clipped = 0; int tiled = 0; - int empty; int progress = 0; fz_context *ctx = dev->ctx; @@ -642,6 +666,11 @@ fz_run_display_list(fz_display_list *list, fz_device *dev, const fz_matrix *top_ for (node = list->first; node; node = node->next) { + int empty; + + fz_rect node_rect = node->rect; + fz_transform_rect(&node_rect, top_ctm); + /* Check the cookie for aborting */ if (cookie) { @@ -652,14 +681,16 @@ fz_run_display_list(fz_display_list *list, fz_device *dev, const fz_matrix *top_ /* cull objects to draw using a quick visibility test */ - if (tiled || node->cmd == FZ_CMD_BEGIN_TILE || node->cmd == FZ_CMD_END_TILE) + if (tiled || + node->cmd == FZ_CMD_BEGIN_TILE || node->cmd == FZ_CMD_END_TILE || + node->cmd == FZ_CMD_BEGIN_PAGE || node->cmd == FZ_CMD_END_PAGE) { empty = 0; } else { - fz_rect rect = node->rect; - fz_intersect_rect(fz_transform_rect(&rect, top_ctm), scissor); + fz_rect rect = node_rect; + fz_intersect_rect(&rect, scissor); empty = fz_is_empty_rect(&rect); } @@ -698,10 +729,17 @@ fz_run_display_list(fz_display_list *list, fz_device *dev, const fz_matrix *top_ visible: fz_concat(&ctm, &node->ctm, top_ctm); + fz_try(ctx) { switch (node->cmd) { + case FZ_CMD_BEGIN_PAGE: + fz_begin_page(dev, &node_rect, &ctm); + break; + case FZ_CMD_END_PAGE: + fz_end_page(dev); + break; case FZ_CMD_FILL_PATH: fz_fill_path(dev, node->item.path, node->flag, &ctm, node->colorspace, node->color, node->alpha); @@ -711,19 +749,11 @@ visible: node->colorspace, node->color, node->alpha); break; case FZ_CMD_CLIP_PATH: - { - fz_rect rect = node->rect; - fz_transform_rect(&rect, top_ctm); - fz_clip_path(dev, node->item.path, &rect, node->flag, &ctm); + fz_clip_path(dev, node->item.path, &node_rect, node->flag, &ctm); break; - } case FZ_CMD_CLIP_STROKE_PATH: - { - fz_rect rect = node->rect; - fz_transform_rect(&rect, top_ctm); - fz_clip_stroke_path(dev, node->item.path, &rect, node->stroke, &ctm); + fz_clip_stroke_path(dev, node->item.path, &node_rect, node->stroke, &ctm); break; - } case FZ_CMD_FILL_TEXT: fz_fill_text(dev, node->item.text, &ctm, node->colorspace, node->color, node->alpha); @@ -755,54 +785,38 @@ visible: node->colorspace, node->color, node->alpha); break; case FZ_CMD_CLIP_IMAGE_MASK: - { if ((dev->hints & FZ_IGNORE_IMAGE) == 0) - { - fz_rect rect = node->rect; - fz_transform_rect(&rect, top_ctm); - fz_clip_image_mask(dev, node->item.image, &rect, &ctm); - } + fz_clip_image_mask(dev, node->item.image, &node_rect, &ctm); break; - } case FZ_CMD_POP_CLIP: fz_pop_clip(dev); break; case FZ_CMD_BEGIN_MASK: - { - fz_rect rect = node->rect; - fz_transform_rect(&rect, top_ctm); - fz_begin_mask(dev, &rect, node->flag, node->colorspace, node->color); + fz_begin_mask(dev, &node_rect, node->flag, node->colorspace, node->color); break; - } case FZ_CMD_END_MASK: fz_end_mask(dev); break; case FZ_CMD_BEGIN_GROUP: - { - fz_rect rect = node->rect; - fz_transform_rect(&rect, top_ctm); - fz_begin_group(dev, &rect, + fz_begin_group(dev, &node_rect, (node->flag & ISOLATED) != 0, (node->flag & KNOCKOUT) != 0, node->item.blendmode, node->alpha); break; - } case FZ_CMD_END_GROUP: fz_end_group(dev); break; case FZ_CMD_BEGIN_TILE: { int cached; - fz_rect rect; + fz_rect tile_rect; tiled++; - rect.x0 = node->color[2]; - rect.y0 = node->color[3]; - rect.x1 = node->color[4]; - rect.y1 = node->color[5]; - cached = fz_begin_tile_id(dev, &node->rect, &rect, node->color[0], node->color[1], &ctm, node->flag); + tile_rect.x0 = node->color[2]; + tile_rect.y0 = node->color[3]; + tile_rect.x1 = node->color[4]; + tile_rect.y1 = node->color[5]; + cached = fz_begin_tile_id(dev, &node_rect, &tile_rect, node->color[0], node->color[1], &ctm, node->flag); if (cached) - { node = skip_to_end_tile(node, &progress); - } break; } case FZ_CMD_END_TILE: |