summaryrefslogtreecommitdiff
path: root/source/fitz/device.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/fitz/device.c')
-rw-r--r--source/fitz/device.c85
1 files changed, 47 insertions, 38 deletions
diff --git a/source/fitz/device.c b/source/fitz/device.c
index 2d042ade..79f2f42a 100644
--- a/source/fitz/device.c
+++ b/source/fitz/device.c
@@ -19,7 +19,7 @@ fz_free_device(fz_device *dev)
return;
if (dev->free_user)
dev->free_user(dev);
- fz_free(dev->ctx, dev->scissor);
+ fz_free(dev->ctx, dev->container);
fz_free(dev->ctx, dev);
}
@@ -50,24 +50,26 @@ fz_end_page(fz_device *dev)
}
static void
-push_clip_stack(fz_device *dev, const fz_rect *rect)
+push_clip_stack(fz_device *dev, const fz_rect *rect, int flags)
{
- if (dev->scissor_len == dev->scissor_cap)
+ if (dev->container_len == dev->container_cap)
{
- int newmax = dev->scissor_cap * 2;
+ int newmax = dev->container_cap * 2;
if (newmax == 0)
newmax = 4;
- dev->scissor = fz_resize_array(dev->ctx, dev->scissor, newmax, sizeof(*dev->scissor));
- dev->scissor_cap = newmax;
+ dev->container = fz_resize_array(dev->ctx, dev->container, newmax, sizeof(*dev->container));
+ dev->container_cap = newmax;
}
- if (dev->scissor_len == 0)
- dev->scissor[0] = *rect;
+ if (dev->container_len == 0)
+ dev->container[0].scissor = *rect;
else
{
- dev->scissor[dev->scissor_len] = dev->scissor[dev->scissor_len-1];
- fz_intersect_rect(&dev->scissor[dev->scissor_len], rect);
+ dev->container[dev->container_len].scissor = dev->container[dev->container_len-1].scissor;
+ fz_intersect_rect(&dev->container[dev->container_len].scissor, rect);
}
- dev->scissor_len++;
+ dev->container[dev->container_len].flags = flags;
+ dev->container[dev->container_len].user = 0;
+ dev->container_len++;
}
static void
@@ -76,31 +78,33 @@ push_clip_stack_accumulate(fz_device *dev, const fz_rect *rect, int accumulate)
if (accumulate <= 1)
{
dev->scissor_accumulator = *rect;
- if (dev->scissor_len == dev->scissor_cap)
+ if (dev->container_len == dev->container_cap)
{
- int newmax = dev->scissor_cap * 2;
+ int newmax = dev->container_cap * 2;
if (newmax == 0)
newmax = 4;
- dev->scissor = fz_resize_array(dev->ctx, dev->scissor, newmax, sizeof(*dev->scissor));
- dev->scissor_cap = newmax;
+ dev->container = fz_resize_array(dev->ctx, dev->container, newmax, sizeof(*dev->container));
+ dev->container_cap = newmax;
}
- fz_intersect_rect(&dev->scissor[dev->scissor_len], rect);
- dev->scissor_len++;
+ 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->scissor_len <= 0)
+ if (dev->container_len <= 0)
return;
fz_union_rect(&dev->scissor_accumulator, rect);
- fz_intersect_rect(&dev->scissor[dev->scissor_len-1], &dev->scissor_accumulator);
+ fz_intersect_rect(&dev->container[dev->container_len-1].scissor, &dev->scissor_accumulator);
}
}
static void
pop_clip_stack(fz_device *dev)
{
- if (dev->scissor_len > 0)
- dev->scissor_len--;
+ if (dev->container_len > 0)
+ dev->container_len--;
}
void
@@ -136,16 +140,16 @@ fz_clip_path(fz_device *dev, fz_path *path, const fz_rect *rect, int even_odd, c
fz_try(ctx)
{
- if (dev->hints & FZ_MAINTAIN_SCISSOR_STACK)
+ if (dev->hints & FZ_MAINTAIN_CONTAINER_STACK)
{
if (rect == NULL)
{
fz_rect bbox;
fz_bound_path(ctx, path, NULL, ctm, &bbox);
- push_clip_stack(dev, &bbox);
+ push_clip_stack(dev, &bbox, fz_device_container_stack_is_clip_path);
}
else
- push_clip_stack(dev, rect);
+ push_clip_stack(dev, rect, fz_device_container_stack_is_clip_path);
}
if (dev->clip_path)
dev->clip_path(dev, path, rect, even_odd, ctm);
@@ -171,16 +175,16 @@ fz_clip_stroke_path(fz_device *dev, fz_path *path, const fz_rect *rect, fz_strok
fz_try(ctx)
{
- if (dev->hints & FZ_MAINTAIN_SCISSOR_STACK)
+ if (dev->hints & FZ_MAINTAIN_CONTAINER_STACK)
{
if (rect == NULL)
{
fz_rect bbox;
fz_bound_path(ctx, path, stroke, ctm, &bbox);
- push_clip_stack(dev, &bbox);
+ push_clip_stack(dev, &bbox, fz_device_container_stack_is_clip_stroke_path);
}
else
- push_clip_stack(dev, rect);
+ push_clip_stack(dev, rect, fz_device_container_stack_is_clip_stroke_path);
}
if (dev->clip_stroke_path)
dev->clip_stroke_path(dev, path, rect, stroke, ctm);
@@ -227,7 +231,7 @@ fz_clip_text(fz_device *dev, fz_text *text, const fz_matrix *ctm, int accumulate
fz_try(ctx)
{
- if (dev->hints & FZ_MAINTAIN_SCISSOR_STACK)
+ if (dev->hints & FZ_MAINTAIN_CONTAINER_STACK)
{
fz_rect bbox;
fz_bound_text(ctx, text, NULL, ctm, &bbox);
@@ -259,11 +263,11 @@ fz_clip_stroke_text(fz_device *dev, fz_text *text, fz_stroke_state *stroke, cons
fz_try(ctx)
{
- if (dev->hints & FZ_MAINTAIN_SCISSOR_STACK)
+ if (dev->hints & FZ_MAINTAIN_CONTAINER_STACK)
{
fz_rect bbox;
fz_bound_text(ctx, text, stroke, ctm, &bbox);
- push_clip_stack_accumulate(dev, &bbox, 0);
+ push_clip_stack(dev, &bbox, fz_device_container_stack_is_clip_stroke_text);
}
if (dev->clip_stroke_text)
dev->clip_stroke_text(dev, text, stroke, ctm);
@@ -295,7 +299,7 @@ fz_pop_clip(fz_device *dev)
fz_throw(dev->ctx, FZ_ERROR_GENERIC, "%s", dev->errmess);
return;
}
- if (dev->hints & FZ_MAINTAIN_SCISSOR_STACK)
+ if (dev->hints & FZ_MAINTAIN_CONTAINER_STACK)
pop_clip_stack(dev);
if (dev->pop_clip)
dev->pop_clip(dev);
@@ -342,8 +346,8 @@ fz_clip_image_mask(fz_device *dev, fz_image *image, const fz_rect *rect, const f
fz_try(ctx)
{
- if (dev->hints & FZ_MAINTAIN_SCISSOR_STACK)
- push_clip_stack(dev, rect);
+ if (dev->hints & FZ_MAINTAIN_CONTAINER_STACK)
+ push_clip_stack(dev, rect, fz_device_container_stack_is_clip_image_mask);
if (dev->clip_image_mask)
dev->clip_image_mask(dev, image, rect, ctm);
}
@@ -368,8 +372,8 @@ fz_begin_mask(fz_device *dev, const fz_rect *area, int luminosity, fz_colorspace
fz_try(ctx)
{
- if (dev->hints & FZ_MAINTAIN_SCISSOR_STACK)
- push_clip_stack(dev, area);
+ if (dev->hints & FZ_MAINTAIN_CONTAINER_STACK)
+ push_clip_stack(dev, area, fz_device_container_stack_in_mask);
if (dev->begin_mask)
dev->begin_mask(dev, area, luminosity, colorspace, bc);
}
@@ -389,6 +393,11 @@ fz_end_mask(fz_device *dev)
/* Converts from mask to clip, so no change in stack depth */
return;
}
+ if (dev->hints & FZ_MAINTAIN_CONTAINER_STACK)
+ {
+ dev->container[dev->container_len-1].flags &= ~fz_device_container_stack_in_mask;
+ dev->container[dev->container_len-1].flags |= fz_device_container_stack_is_mask;
+ }
if (dev->end_mask)
dev->end_mask(dev);
}
@@ -406,8 +415,8 @@ fz_begin_group(fz_device *dev, const fz_rect *area, int isolated, int knockout,
fz_try(ctx)
{
- if (dev->hints & FZ_MAINTAIN_SCISSOR_STACK)
- push_clip_stack(dev, area);
+ if (dev->hints & FZ_MAINTAIN_CONTAINER_STACK)
+ push_clip_stack(dev, area, fz_device_container_stack_is_group);
if (dev->begin_group)
dev->begin_group(dev, area, isolated, knockout, blendmode, alpha);
}
@@ -431,7 +440,7 @@ fz_end_group(fz_device *dev)
}
if (dev->end_group)
dev->end_group(dev);
- if (dev->hints & FZ_MAINTAIN_SCISSOR_STACK)
+ if (dev->hints & FZ_MAINTAIN_CONTAINER_STACK)
pop_clip_stack(dev);
}