From 3bcee7eb19d9bdae30ba4e6c3574441c38df9db7 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Fri, 9 Oct 2015 11:23:57 +0200 Subject: Remove text clip accumulation. We can now group all clipped text into one fz_text object and simplify the device interface. --- source/fitz/bbox-device.c | 9 +++---- source/fitz/device.c | 43 +++-------------------------- source/fitz/draw-device.c | 67 +++++++++++++++------------------------------- source/fitz/list-device.c | 23 +++++----------- source/fitz/stext-device.c | 2 +- source/fitz/svg-device.c | 2 +- source/fitz/trace-device.c | 2 +- 7 files changed, 38 insertions(+), 110 deletions(-) (limited to 'source/fitz') diff --git a/source/fitz/bbox-device.c b/source/fitz/bbox-device.c index 2c639499..fcab733f 100644 --- a/source/fitz/bbox-device.c +++ b/source/fitz/bbox-device.c @@ -102,13 +102,10 @@ fz_bbox_clip_stroke_path(fz_context *ctx, fz_device *dev, fz_path *path, const f } static void -fz_bbox_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate) +fz_bbox_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm) { - fz_rect r = fz_infinite_rect; - if (accumulate) - fz_bbox_add_rect(ctx, dev, &r, accumulate != 2); - else - fz_bbox_add_rect(ctx, dev, fz_bound_text(ctx, text, NULL, ctm, &r), 1); + fz_rect r; + fz_bbox_add_rect(ctx, dev, fz_bound_text(ctx, text, NULL, ctm, &r), 1); } static void diff --git a/source/fitz/device.c b/source/fitz/device.c index 6df650f4..cd3435c9 100644 --- a/source/fitz/device.c +++ b/source/fitz/device.c @@ -66,38 +66,6 @@ push_clip_stack(fz_context *ctx, fz_device *dev, const fz_rect *rect, int flags) dev->container_len++; } -static void -push_clip_stack_accumulate(fz_context *ctx, fz_device *dev, const fz_rect *rect, int accumulate) -{ - if (accumulate <= 1) - { - dev->scissor_accumulator = *rect; - if (dev->container_len == dev->container_cap) - { - int newmax = dev->container_cap * 2; - if (newmax == 0) - newmax = 4; - dev->container = fz_resize_array(ctx, dev->container, newmax, sizeof(*dev->container)); - dev->container_cap = newmax; - } - if (dev->container_len > 0) - dev->container[dev->container_len].scissor = dev->container[dev->container_len-1].scissor; - else - dev->container[dev->container_len].scissor = fz_infinite_rect; - fz_intersect_rect(&dev->container[dev->container_len].scissor, rect); - dev->container[dev->container_len].flags = fz_device_container_stack_is_clip_text; - dev->container[dev->container_len].user = 0; - dev->container_len++; - } - else - { - if (dev->container_len <= 0) - return; - fz_union_rect(&dev->scissor_accumulator, rect); - fz_intersect_rect(&dev->container[dev->container_len-1].scissor, &dev->scissor_accumulator); - } -} - static void pop_clip_stack(fz_context *ctx, fz_device *dev) { @@ -212,12 +180,11 @@ fz_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_state * } void -fz_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate) +fz_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm) { if (dev->error_depth) { - if (accumulate == 0 || accumulate == 1) - dev->error_depth++; + dev->error_depth++; return; } @@ -227,15 +194,13 @@ fz_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ct { fz_rect bbox; fz_bound_text(ctx, text, NULL, ctm, &bbox); - push_clip_stack_accumulate(ctx, dev, &bbox, accumulate); + push_clip_stack(ctx, dev, &bbox, fz_device_container_stack_is_clip_text); } if (dev->clip_text) - dev->clip_text(ctx, dev, text, ctm, accumulate); + dev->clip_text(ctx, dev, text, ctm); } fz_catch(ctx) { - if (accumulate == 2) - fz_rethrow(ctx); dev->error_depth = 1; strcpy(dev->errmess, fz_caught_message(ctx)); /* Error swallowed */ diff --git a/source/fitz/draw-device.c b/source/fitz/draw-device.c index ab6ebbe7..065daaa9 100644 --- a/source/fitz/draw-device.c +++ b/source/fitz/draw-device.c @@ -708,7 +708,7 @@ fz_draw_stroke_text(fz_context *ctx, fz_device *devp, fz_text *text, fz_stroke_s } static void -fz_draw_clip_text(fz_context *ctx, fz_device *devp, fz_text *text, const fz_matrix *ctm, int accumulate) +fz_draw_clip_text(fz_context *ctx, fz_device *devp, fz_text *text, const fz_matrix *ctm) { fz_draw_device *dev = (fz_draw_device*)devp; fz_irect bbox; @@ -719,60 +719,38 @@ fz_draw_clip_text(fz_context *ctx, fz_device *devp, fz_text *text, const fz_matr fz_draw_state *state; fz_colorspace *model; fz_text_span *span; - - /* If accumulate == 0 then this text object is guaranteed complete */ - /* If accumulate == 1 then this text object is the first (or only) in a sequence */ - /* If accumulate == 2 then this text object is a continuation */ + fz_rect rect; state = push_stack(ctx, dev); STACK_PUSHED("clip text"); model = state->dest->colorspace; - if (accumulate == 0) - { - /* make the mask the exact size needed */ - fz_rect rect; - - fz_irect_from_rect(&bbox, fz_bound_text(ctx, text, NULL, ctm, &rect)); - fz_intersect_irect(&bbox, &state->scissor); - } - else - { - /* be conservative about the size of the mask needed */ - bbox = state->scissor; - } + /* make the mask the exact size needed */ + fz_irect_from_rect(&bbox, fz_bound_text(ctx, text, NULL, ctm, &rect)); + fz_intersect_irect(&bbox, &state->scissor); fz_try(ctx) { - if (accumulate == 0 || accumulate == 1) + mask = fz_new_pixmap_with_bbox(ctx, NULL, &bbox); + fz_clear_pixmap(ctx, mask); + dest = fz_new_pixmap_with_bbox(ctx, model, &bbox); + fz_clear_pixmap(ctx, dest); + if (state->shape) { - mask = fz_new_pixmap_with_bbox(ctx, NULL, &bbox); - fz_clear_pixmap(ctx, mask); - dest = fz_new_pixmap_with_bbox(ctx, model, &bbox); - fz_clear_pixmap(ctx, dest); - if (state->shape) - { - shape = fz_new_pixmap_with_bbox(ctx, NULL, &bbox); - fz_clear_pixmap(ctx, shape); - } - else - shape = NULL; + shape = fz_new_pixmap_with_bbox(ctx, NULL, &bbox); + fz_clear_pixmap(ctx, shape); + } + else + shape = NULL; - state[1].blendmode |= FZ_BLEND_ISOLATED; - state[1].scissor = bbox; - state[1].dest = dest; - state[1].mask = mask; - state[1].shape = shape; + state[1].blendmode |= FZ_BLEND_ISOLATED; + state[1].scissor = bbox; + state[1].dest = dest; + state[1].mask = mask; + state[1].shape = shape; #ifdef DUMP_GROUP_BLENDS - dump_spaces(dev->top-1, "Clip (text) begin\n"); + dump_spaces(dev->top-1, "Clip (text) begin\n"); #endif - } - else - { - mask = state->mask; - dev->top--; - STACK_POPPED("clip text"); - } if (!fz_is_empty_irect(&bbox) && mask) { @@ -837,8 +815,7 @@ fz_draw_clip_text(fz_context *ctx, fz_device *devp, fz_text *text, const fz_matr } fz_catch(ctx) { - if (accumulate == 0 || accumulate == 1) - emergency_pop_stack(ctx, dev, state); + emergency_pop_stack(ctx, dev, state); fz_rethrow(ctx); } } diff --git a/source/fitz/list-device.c b/source/fitz/list-device.c index ea61b3d2..14e2278c 100644 --- a/source/fitz/list-device.c +++ b/source/fitz/list-device.c @@ -194,12 +194,8 @@ fz_append_display_node( } writer->top++; break; - case FZ_CMD_CLIP_TEXT: - /* don't reset the clip rect for accumulated text */ - if (flags == 2) - break; - /* fallthrough */ case FZ_CMD_END_MASK: + case FZ_CMD_CLIP_TEXT: case FZ_CMD_CLIP_STROKE_TEXT: if (writer->top < STACK_SIZE) { @@ -840,22 +836,19 @@ fz_list_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_st } static void -fz_list_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate) +fz_list_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm) { fz_rect rect; fz_text *cloned_text = fz_keep_text(ctx, text); fz_try(ctx) { - if (accumulate) - rect = fz_infinite_rect; - else - fz_bound_text(ctx, text, NULL, ctm, &rect); + fz_bound_text(ctx, text, NULL, ctm, &rect); fz_append_display_node( ctx, dev, FZ_CMD_CLIP_TEXT, - accumulate, /* flags */ + 0, /* flags */ &rect, NULL, /* path */ NULL, /* color */ @@ -1636,17 +1629,13 @@ fz_run_display_list(fz_context *ctx, fz_display_list *list, fz_device *dev, cons { case FZ_CMD_CLIP_PATH: case FZ_CMD_CLIP_STROKE_PATH: + case FZ_CMD_CLIP_TEXT: case FZ_CMD_CLIP_STROKE_TEXT: case FZ_CMD_CLIP_IMAGE_MASK: case FZ_CMD_BEGIN_MASK: case FZ_CMD_BEGIN_GROUP: clipped++; continue; - case FZ_CMD_CLIP_TEXT: - /* Accumulated text has no extra pops */ - if (n.flags != 2) - clipped++; - continue; case FZ_CMD_POP_CLIP: case FZ_CMD_END_GROUP: if (!clipped) @@ -1694,7 +1683,7 @@ visible: fz_stroke_text(ctx, dev, *(fz_text **)node, stroke, &trans_ctm, colorspace, color, alpha); break; case FZ_CMD_CLIP_TEXT: - fz_clip_text(ctx, dev, *(fz_text **)node, &trans_ctm, n.flags); + fz_clip_text(ctx, dev, *(fz_text **)node, &trans_ctm); break; case FZ_CMD_CLIP_STROKE_TEXT: fz_clip_stroke_text(ctx, dev, *(fz_text **)node, stroke, &trans_ctm); diff --git a/source/fitz/stext-device.c b/source/fitz/stext-device.c index 060311d3..a9dadc9b 100644 --- a/source/fitz/stext-device.c +++ b/source/fitz/stext-device.c @@ -854,7 +854,7 @@ fz_stext_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_s } static void -fz_stext_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate) +fz_stext_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm) { fz_stext_device *tdev = (fz_stext_device*)dev; fz_stext_style *style; diff --git a/source/fitz/svg-device.c b/source/fitz/svg-device.c index a2cc5ed1..879b3bd0 100644 --- a/source/fitz/svg-device.c +++ b/source/fitz/svg-device.c @@ -603,7 +603,7 @@ svg_dev_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_st } static void -svg_dev_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate) +svg_dev_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm) { svg_device *sdev = (svg_device*)dev; fz_output *out = sdev->out; diff --git a/source/fitz/trace-device.c b/source/fitz/trace-device.c index df2f6455..1f972642 100644 --- a/source/fitz/trace-device.c +++ b/source/fitz/trace-device.c @@ -218,7 +218,7 @@ fz_trace_stroke_text(fz_context *ctx, fz_device *dev, fz_text *text, fz_stroke_s } static void -fz_trace_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate) +fz_trace_clip_text(fz_context *ctx, fz_device *dev, fz_text *text, const fz_matrix *ctm) { fz_output *out = ((fz_trace_device*)dev)->out; fz_printf(ctx, out, "