diff options
Diffstat (limited to 'source/pdf/pdf-op-run.c')
-rw-r--r-- | source/pdf/pdf-op-run.c | 98 |
1 files changed, 62 insertions, 36 deletions
diff --git a/source/pdf/pdf-op-run.c b/source/pdf/pdf-op-run.c index fddc9b91..f028732e 100644 --- a/source/pdf/pdf-op-run.c +++ b/source/pdf/pdf-op-run.c @@ -36,6 +36,7 @@ struct pdf_material_s pdf_pattern *pattern; fz_shade *shade; int gstate_num; + fz_color_params color_params; float alpha; float v[FZ_MAX_COLORS]; }; @@ -148,7 +149,7 @@ begin_softmask(fz_context *ctx, pdf_run_processor *pr, softmask_save *save) fz_try(ctx) { - fz_begin_mask(ctx, pr->dev, &mask_bbox, gstate->luminosity, mask_colorspace, gstate->softmask_bc); + fz_begin_mask(ctx, pr->dev, &mask_bbox, gstate->luminosity, mask_colorspace, gstate->softmask_bc, &gstate->fill.color_params); pdf_run_xobject(ctx, pr, softmask, save->page_resources, &fz_identity); } fz_always(ctx) @@ -224,7 +225,7 @@ pdf_show_shade(fz_context *ctx, pdf_run_processor *pr, fz_shade *shd) /* FIXME: The gstate->ctm in the next line may be wrong; maybe * it should be the parent gstates ctm? */ - fz_fill_shade(ctx, pr->dev, shd, &gstate->ctm, gstate->fill.alpha); + fz_fill_shade(ctx, pr->dev, shd, &gstate->ctm, gstate->fill.alpha, &gstate->fill.color_params); pdf_end_group(ctx, pr, &softmask); } @@ -540,7 +541,7 @@ pdf_show_image(fz_context *ctx, pdf_run_processor *pr, fz_image *image) break; case PDF_MAT_COLOR: fz_fill_image_mask(ctx, pr->dev, image, &image_ctm, - gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha); + gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha, &gstate->fill.color_params); break; case PDF_MAT_PATTERN: if (gstate->fill.pattern) @@ -554,7 +555,7 @@ pdf_show_image(fz_context *ctx, pdf_run_processor *pr, fz_image *image) if (gstate->fill.shade) { fz_clip_image_mask(ctx, pr->dev, image, &image_ctm, &bbox); - fz_fill_shade(ctx, pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha); + fz_fill_shade(ctx, pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha, &gstate->fill.color_params); fz_pop_clip(ctx, pr->dev); } break; @@ -562,7 +563,7 @@ pdf_show_image(fz_context *ctx, pdf_run_processor *pr, fz_image *image) } else { - fz_fill_image(ctx, pr->dev, image, &image_ctm, gstate->fill.alpha); + fz_fill_image(ctx, pr->dev, image, &image_ctm, gstate->fill.alpha, &gstate->fill.color_params); } if (image->mask) @@ -646,7 +647,7 @@ pdf_show_path(fz_context *ctx, pdf_run_processor *pr, int doclose, int dofill, i break; case PDF_MAT_COLOR: fz_fill_path(ctx, pr->dev, path, even_odd, &gstate->ctm, - gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha); + gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha, &gstate->fill.color_params); break; case PDF_MAT_PATTERN: if (gstate->fill.pattern) @@ -661,7 +662,7 @@ pdf_show_path(fz_context *ctx, pdf_run_processor *pr, int doclose, int dofill, i { fz_clip_path(ctx, pr->dev, path, even_odd, &gstate->ctm, &bbox); /* The cluster and page 2 of patterns.pdf shows that fz_fill_shade should NOT be called with gstate->ctm. */ - fz_fill_shade(ctx, pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha); + fz_fill_shade(ctx, pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha, &gstate->fill.color_params); fz_pop_clip(ctx, pr->dev); } break; @@ -676,7 +677,7 @@ pdf_show_path(fz_context *ctx, pdf_run_processor *pr, int doclose, int dofill, i break; case PDF_MAT_COLOR: fz_stroke_path(ctx, pr->dev, path, gstate->stroke_state, &gstate->ctm, - gstate->stroke.colorspace, gstate->stroke.v, gstate->stroke.alpha); + gstate->stroke.colorspace, gstate->stroke.v, gstate->stroke.alpha, &gstate->stroke.color_params); break; case PDF_MAT_PATTERN: if (gstate->stroke.pattern) @@ -690,7 +691,7 @@ pdf_show_path(fz_context *ctx, pdf_run_processor *pr, int doclose, int dofill, i if (gstate->stroke.shade) { fz_clip_stroke_path(ctx, pr->dev, path, gstate->stroke_state, &gstate->ctm, &bbox); - fz_fill_shade(ctx, pr->dev, gstate->stroke.shade, &pr->gstate[gstate->stroke.gstate_num].ctm, gstate->stroke.alpha); + fz_fill_shade(ctx, pr->dev, gstate->stroke.shade, &pr->gstate[gstate->stroke.gstate_num].ctm, gstate->stroke.alpha, &gstate->stroke.color_params); fz_pop_clip(ctx, pr->dev); } break; @@ -794,7 +795,7 @@ pdf_flush_text(fz_context *ctx, pdf_run_processor *pr) break; case PDF_MAT_COLOR: fz_fill_text(ctx, pr->dev, text, &gstate->ctm, - gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha); + gstate->fill.colorspace, gstate->fill.v, gstate->fill.alpha, &gstate->fill.color_params); break; case PDF_MAT_PATTERN: if (gstate->fill.pattern) @@ -809,7 +810,7 @@ pdf_flush_text(fz_context *ctx, pdf_run_processor *pr) { fz_clip_text(ctx, pr->dev, text, &gstate->ctm, &tb); /* Page 2 of patterns.pdf shows that fz_fill_shade should NOT be called with gstate->ctm */ - fz_fill_shade(ctx, pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha); + fz_fill_shade(ctx, pr->dev, gstate->fill.shade, &pr->gstate[gstate->fill.gstate_num].ctm, gstate->fill.alpha, &gstate->fill.color_params); fz_pop_clip(ctx, pr->dev); } break; @@ -824,7 +825,7 @@ pdf_flush_text(fz_context *ctx, pdf_run_processor *pr) break; case PDF_MAT_COLOR: fz_stroke_text(ctx, pr->dev, text, gstate->stroke_state, &gstate->ctm, - gstate->stroke.colorspace, gstate->stroke.v, gstate->stroke.alpha); + gstate->stroke.colorspace, gstate->stroke.v, gstate->stroke.alpha, &gstate->stroke.color_params); break; case PDF_MAT_PATTERN: if (gstate->stroke.pattern) @@ -838,7 +839,7 @@ pdf_flush_text(fz_context *ctx, pdf_run_processor *pr) if (gstate->stroke.shade) { fz_clip_stroke_text(ctx, pr->dev, text, gstate->stroke_state, &gstate->ctm, &tb); - fz_fill_shade(ctx, pr->dev, gstate->stroke.shade, &pr->gstate[gstate->stroke.gstate_num].ctm, gstate->stroke.alpha); + fz_fill_shade(ctx, pr->dev, gstate->stroke.shade, &pr->gstate[gstate->stroke.gstate_num].ctm, gstate->stroke.alpha, &gstate->stroke.color_params); fz_pop_clip(ctx, pr->dev); } break; @@ -1085,6 +1086,9 @@ pdf_init_gstate(fz_context *ctx, pdf_gstate *gs, const fz_matrix *ctm) gs->softmask_resources = NULL; gs->softmask_ctm = fz_identity; gs->luminosity = 0; + + gs->fill.color_params = *fz_default_color_params(ctx); + gs->stroke.color_params = *fz_default_color_params(ctx); } static void @@ -1133,7 +1137,6 @@ pdf_set_color(fz_context *ctx, pdf_run_processor *pr, int what, float *v) { pdf_gstate *gstate = pr->gstate + pr->gtop; pdf_material *mat; - int i, n; gstate = pdf_flush_text(ctx, pr); @@ -1143,25 +1146,7 @@ pdf_set_color(fz_context *ctx, pdf_run_processor *pr, int what, float *v) { case PDF_MAT_PATTERN: case PDF_MAT_COLOR: - /* ICC Colorspaces would be handled here too, if we handled them */ - if (fz_colorspace_is_indexed(ctx, mat->colorspace)) - { - mat->v[0] = fz_clamp(v[0], 0, 1) / 255; - break; - } - else if (fz_colorspace_is_lab(ctx, mat->colorspace)) - { - n = fz_colorspace_n(ctx, mat->colorspace); - /* input is in range (0..100, -128..127, -128..127) not (0..1, 0..1, 0..1) */ - for (i = 0; i < n; i++) - mat->v[i] = fz_clamp(v[i], i ? -128 : 0, i ? 127 : 100); - } - else - { - n = fz_colorspace_n(ctx, mat->colorspace); - for (i = 0; i < n; i++) - mat->v[i] = fz_clamp(v[i], 0, 1); - } + fz_clamp_color(ctx, mat->colorspace, v, mat->v); break; default: fz_warn(ctx, "color incompatible with material"); @@ -1435,6 +1420,44 @@ static void pdf_run_d(fz_context *ctx, pdf_processor *proc, pdf_obj *array, floa static void pdf_run_ri(fz_context *ctx, pdf_processor *proc, const char *intent) { + pdf_run_processor *pr = (pdf_run_processor *)proc; + pdf_gstate *gstate = pdf_flush_text(ctx, pr); + gstate->fill.color_params.ri = fz_lookup_rendering_intent(intent); + gstate->stroke.color_params.ri = gstate->fill.color_params.ri; +} + +static void pdf_run_gs_OP(fz_context *ctx, pdf_processor *proc, int b) +{ + pdf_run_processor *pr = (pdf_run_processor *)proc; + pdf_gstate *gstate = pdf_flush_text(ctx, pr); + gstate->stroke.color_params.op = b; + gstate->fill.color_params.op = b; +} + +static void pdf_run_gs_op(fz_context *ctx, pdf_processor *proc, int b) +{ + pdf_run_processor *pr = (pdf_run_processor *)proc; + pdf_gstate *gstate = pdf_flush_text(ctx, pr); + gstate->fill.color_params.op = b; +} + +static void pdf_run_gs_OPM(fz_context *ctx, pdf_processor *proc, int i) +{ + pdf_run_processor *pr = (pdf_run_processor *)proc; + pdf_gstate *gstate = pdf_flush_text(ctx, pr); + gstate->stroke.color_params.opm = i; + gstate->fill.color_params.opm = i; +} + +static void pdf_run_gs_UseBlackPtComp(fz_context *ctx, pdf_processor *proc, pdf_obj *obj) +{ + pdf_run_processor *pr = (pdf_run_processor *)proc; + pdf_gstate *gstate = pdf_flush_text(ctx, pr); + int on = pdf_name_eq(ctx, obj, PDF_NAME_ON); + /* The spec says that "ON" means on, "OFF" means "Off", and + * "Default" or anything else means "Meh, do what you want." */ + gstate->stroke.color_params.bp = on; + gstate->fill.color_params.bp = on; } static void pdf_run_i(fz_context *ctx, pdf_processor *proc, float flatness) @@ -1491,10 +1514,7 @@ static void pdf_run_gs_SMask(fz_context *ctx, pdf_processor *proc, pdf_xobject * fz_colorspace *cs = pdf_xobject_colorspace(ctx, smask); int cs_n = 1; if (cs) - { cs_n = fz_colorspace_n(ctx, cs); - fz_drop_colorspace(ctx, cs); - } gstate->softmask_ctm = gstate->ctm; gstate->softmask = pdf_keep_xobject(ctx, smask); gstate->softmask_resources = pdf_keep_obj(ctx, page_resources); @@ -2149,6 +2169,12 @@ pdf_new_run_processor(fz_context *ctx, fz_device *dev, const fz_matrix *ctm, con proc->super.op_BX = pdf_run_BX; proc->super.op_EX = pdf_run_EX; + /* extgstate */ + proc->super.op_gs_OP = pdf_run_gs_OP; + proc->super.op_gs_op = pdf_run_gs_op; + proc->super.op_gs_OPM = pdf_run_gs_OPM; + proc->super.op_gs_UseBlackPtComp = pdf_run_gs_UseBlackPtComp; + proc->super.op_END = pdf_run_END; } |