static void fz_draw_pop_clip(fz_context *ctx, void *user) { fz_draw_device *dev = user; fz_pixmap *mask, *dest, *shape; if (dev->top > 0) { dev->top--; dev->scissor = dev->stack[dev->top].scissor; mask = dev->stack[dev->top].mask; dest = dev->stack[dev->top].dest; shape = dev->stack[dev->top].shape; dev->blendmode = dev->stack[dev->top].blendmode; /* We can get here with mask == NULL if the clipping actually * resolved to a rectangle earlier. In this case, we will * have a dest, and the shape will be unchanged. */ if (mask) { assert(dest); #ifdef DUMP_GROUP_BLENDS dump_spaces(dev->top, ""); fz_dump_blend(dev->dest, "Clipping "); if (dev->shape) fz_dump_blend(dev->shape, "/"); fz_dump_blend(dest, " onto "); if (shape) fz_dump_blend(shape, "/"); fz_dump_blend(mask, " with "); #endif fz_paint_pixmap_with_mask(dest, dev->dest, mask); if (shape != NULL) { assert(shape != dev->shape); fz_paint_pixmap_with_mask(shape, dev->shape, mask); fz_drop_pixmap(ctx, dev->shape); dev->shape = shape; } fz_drop_pixmap(ctx, mask); fz_drop_pixmap(ctx, dev->dest); dev->dest = dest; #ifdef DUMP_GROUP_BLENDS fz_dump_blend(dev->dest, " to get "); if (dev->shape) fz_dump_blend(dev->shape, "/"); printf("\n"); #endif } else { #ifdef DUMP_GROUP_BLENDS dump_spaces(dev->top, "Clip End\n"); #endif assert(dest == NULL); assert(shape == dev->shape); } } }
static void fz_draw_pop_clip(fz_device *devp) { fz_draw_device *dev = devp->user; fz_context *ctx = dev->ctx; fz_draw_state *state; if (dev->top == 0) { fz_warn(ctx, "Unexpected pop clip"); return; } state = &dev->stack[--dev->top]; /* We can get here with state[1].mask == NULL if the clipping actually * resolved to a rectangle earlier. */ if (state[1].mask) { #ifdef DUMP_GROUP_BLENDS dump_spaces(dev->top, ""); fz_dump_blend(dev->ctx, state[1].dest, "Clipping "); if (state[1].shape) fz_dump_blend(dev->ctx, state[1].shape, "/"); fz_dump_blend(dev->ctx, state[0].dest, " onto "); if (state[0].shape) fz_dump_blend(dev->ctx, state[0].shape, "/"); fz_dump_blend(dev->ctx, state[1].mask, " with "); #endif fz_paint_pixmap_with_mask(state[0].dest, state[1].dest, state[1].mask); if (state[0].shape != state[1].shape) { fz_paint_pixmap_with_mask(state[0].shape, state[1].shape, state[1].mask); fz_drop_pixmap(dev->ctx, state[1].shape); } fz_drop_pixmap(dev->ctx, state[1].mask); fz_drop_pixmap(dev->ctx, state[1].dest); #ifdef DUMP_GROUP_BLENDS fz_dump_blend(dev->ctx, state[0].dest, " to get "); if (state[0].shape) fz_dump_blend(dev->ctx, state[0].shape, "/"); printf("\n"); #endif } else { #ifdef DUMP_GROUP_BLENDS dump_spaces(dev->top, "Clip end\n"); #endif } }
static void fz_draw_pop_clip(void *user) { fz_draw_device *dev = user; fz_pixmap *mask, *dest; if (dev->top > 0) { dev->top--; dev->scissor = dev->stack[dev->top].scissor; mask = dev->stack[dev->top].mask; dest = dev->stack[dev->top].dest; if (mask && dest) { fz_pixmap *scratch = dev->dest; fz_paint_pixmap_with_mask(dest, scratch, mask); fz_drop_pixmap(mask); fz_drop_pixmap(scratch); dev->dest = dest; } } }