diff options
-rw-r--r-- | Resource/Init/pdf_draw.ps | 4 | ||||
-rw-r--r-- | Resource/Init/pdf_ops.ps | 20 | ||||
-rw-r--r-- | base/gsstate.c | 39 | ||||
-rw-r--r-- | base/gsstate.h | 5 | ||||
-rw-r--r-- | base/gxgstate.h | 6 | ||||
-rw-r--r-- | psi/zcssepr.c | 50 |
6 files changed, 111 insertions, 13 deletions
diff --git a/Resource/Init/pdf_draw.ps b/Resource/Init/pdf_draw.ps index dbe31706f..485369869 100644 --- a/Resource/Init/pdf_draw.ps +++ b/Resource/Init/pdf_draw.ps @@ -35,12 +35,12 @@ pdfdict begin % not set them. /FillColor //sc1 /FillColorSpace { /FillColorSpace gput } bind - /FillOverprint //op +% /FillOverprint //op /SoftMask //SMask % /StrokeConstantAlpha //CA /StrokeColor //SC1 /StrokeColorSpace { /StrokeColorSpace gput } bind - /StrokeOverprint //OP +% /StrokeOverprint //OP % /TextSpacing //Tc % We can't use //Tz as we've stored the value we actually use, % not value * 100 (see /Tz in pdf_ops.ps) diff --git a/Resource/Init/pdf_ops.ps b/Resource/Init/pdf_ops.ps index 46af59331..4d1039d91 100644 --- a/Resource/Init/pdf_ops.ps +++ b/Resource/Init/pdf_ops.ps @@ -217,6 +217,8 @@ currentdict /gput_always_allow .undef currentsmoothness currentflat currentoverprint + .currentstrokeoverprint + .currentfilloverprint currentstrokeadjust currentdash currentmiterlimit @@ -244,6 +246,8 @@ currentdict /gput_always_allow .undef setmiterlimit setdash setstrokeadjust + .setfilloverprint + .setstrokeoverprint setoverprint setflat setsmoothness @@ -364,8 +368,10 @@ currentdict /gput_always_allow .undef % ---------------- Overprint/transparency setting ---------------- % -/op { /FillOverprint gput } bdef % NB pdf_draw:gsparamdict handled /OP with no /op -/OP { /StrokeOverprint gput } bdef +/op { .setfilloverprint %/FillOverprint gput +} bdef % NB pdf_draw:gsparamdict handled /OP with no /op +/OP { .setstrokeoverprint %/StrokeOverprint gput +} bdef /OPM { /.setoverprintmode where { pop dup .setoverprintmode .swapcolors .setoverprintmode .swapcolors } { pop } ifelse } bdef @@ -422,7 +428,7 @@ currentdict /gput_always_allow .undef } bdef % (Non-mask) images must execute setfillblend. /setfillblend { - FillOverprint setoverprint +% FillOverprint setoverprint .getFillConstantAlpha SoftMask .settransparencyparams } def @@ -432,7 +438,7 @@ currentdict /gput_always_allow .undef /setstrokestate { .swapcolors - StrokeColor StrokeColorSpace setgcolor StrokeOverprint setoverprint + StrokeColor StrokeColorSpace setgcolor %StrokeOverprint setoverprint .getStrokeConstantAlpha SoftMask .settransparencyparams .swapcolors @@ -595,8 +601,10 @@ end def pop currentcolorspace 1 get % use the base space } if known { - /stroke ne { FillOverprint } { StrokeOverprint } ifelse - .currentblendmode dup /Normal eq exch /Compatible eq or not and + /stroke ne { .currentfilloverprint %FillOverprint + } { .currentstrokeoverprint %StrokeOverprint + } ifelse + .currentblendmode dup /Normal eq exch /Compatible eq or not and } { pop //false } ifelse diff --git a/base/gsstate.c b/base/gsstate.c index f8f1a56d7..d7cc7dc04 100644 --- a/base/gsstate.c +++ b/base/gsstate.c @@ -671,6 +671,7 @@ gs_setoverprint(gs_gstate * pgs, bool ovp) bool prior_ovp = pgs->overprint; pgs->overprint = ovp; + pgs->overprint_stroke = ovp; if (prior_ovp != ovp) (void)gs_do_set_overprint(pgs); } @@ -682,6 +683,40 @@ gs_currentoverprint(const gs_gstate * pgs) return pgs->overprint; } +/* setstrokeoverprint */ +void +gs_setstrokeoverprint(gs_gstate * pgs, bool ovp) +{ + bool prior_ovp = pgs->overprint_stroke; + + pgs->overprint_stroke = ovp; +} + +/* currentstrokeoverprint */ +bool +gs_currentstrokeoverprint(const gs_gstate * pgs) +{ + return pgs->overprint_stroke; +} + +/* setstrokeoverprint */ +void +gs_setfilloverprint(gs_gstate * pgs, bool ovp) +{ + bool prior_ovp = pgs->overprint; + + pgs->overprint = ovp; + if (prior_ovp != ovp) + (void)gs_do_set_overprint(pgs); +} + +/* currentstrokeoverprint */ +bool +gs_currentfilloverprint(const gs_gstate * pgs) +{ + return pgs->overprint; +} + /* setoverprintmode */ int gs_setoverprintmode(gs_gstate * pgs, int mode) @@ -1309,8 +1344,8 @@ void gs_swapcolors_quick(gs_gstate *pgs) pgs->color_component_map_alt = tmp_ccm; tmp = pgs->overprint; - pgs->overprint = pgs->overprint_alt; - pgs->overprint_alt = tmp; + pgs->overprint = pgs->overprint_stroke; + pgs->overprint_stroke = tmp; tmp = pgs->overprint_mode; pgs->overprint_mode = pgs->overprint_mode_alt; diff --git a/base/gsstate.h b/base/gsstate.h index 752689ba3..fad48d4bc 100644 --- a/base/gsstate.h +++ b/base/gsstate.h @@ -49,6 +49,11 @@ int gs_copygstate(gs_gstate * /*to */ , const gs_gstate * /*from */ ), int gs_gstate_update_overprint(gs_gstate *, const gs_overprint_params_t *); bool gs_currentoverprint(const gs_gstate *); void gs_setoverprint(gs_gstate *, bool); +bool gs_currentstrokeoverprint(const gs_gstate *); +void gs_setstrokeoverprint(gs_gstate *, bool); +bool gs_currentfilloverprint(const gs_gstate *); +void gs_setfilloverprint(gs_gstate *, bool); + int gs_currentoverprintmode(const gs_gstate *); int gs_setoverprintmode(gs_gstate *, int); diff --git a/base/gxgstate.h b/base/gxgstate.h index f39a4fe41..e98d885d0 100644 --- a/base/gxgstate.h +++ b/base/gxgstate.h @@ -321,7 +321,7 @@ struct gs_gstate_s { bool overprint; int overprint_mode; int effective_overprint_mode; - bool overprint_alt; + bool overprint_stroke; int overprint_mode_alt; int effective_overprint_mode_alt; float flatness; @@ -367,7 +367,7 @@ struct gs_gstate_s { void *SMask; /* void *BM; Already handled (.setblendmode) */ bool AIS; - bool OP; /* Stroke overprint, for fill we will use existing overprint */ +/* bool OP; /* Stroke overprint, for fill we will use existing overprint */ /* bool TK; Already handled (.settextknockout) */ float Tc; float TL; @@ -434,7 +434,7 @@ struct gs_gstate_s { s->overprint = __state_init.overprint; \ s->overprint_mode = __state_init.overprint_mode; \ s->effective_overprint_mode = __state_init.effective_overprint_mode; \ - s->overprint_alt = __state_init.overprint_alt; \ + s->overprint_stroke = __state_init.overprint_stroke; \ s->overprint_mode_alt = __state_init.overprint_mode_alt; \ s->effective_overprint_mode_alt = __state_init.effective_overprint_mode_alt; \ s->flatness = __state_init.flatness; \ diff --git a/psi/zcssepr.c b/psi/zcssepr.c index 9c3b52b3f..9d7011882 100644 --- a/psi/zcssepr.c +++ b/psi/zcssepr.c @@ -73,6 +73,52 @@ zsetoverprint(i_ctx_t *i_ctx_p) return 0; } +/* - currentstrokeoverprint <bool> */ +static int +zcurrentstrokeoverprint(i_ctx_t *i_ctx_p) +{ + os_ptr op = osp; + + push(1); + make_bool(op, gs_currentstrokeoverprint(igs)); + return 0; +} + +/* <bool> setstrokeoverprint - */ +static int +zsetstrokeoverprint(i_ctx_t *i_ctx_p) +{ + os_ptr op = osp; + + check_type(*op, t_boolean); + gs_setstrokeoverprint(igs, op->value.boolval); + pop(1); + return 0; +} + +/* - currentfilloverprint <bool> */ +static int +zcurrentfilloverprint(i_ctx_t *i_ctx_p) +{ + os_ptr op = osp; + + push(1); + make_bool(op, gs_currentfilloverprint(igs)); + return 0; +} + +/* <bool> setfilloverprint - */ +static int +zsetfilloverprint(i_ctx_t *i_ctx_p) +{ + os_ptr op = osp; + + check_type(*op, t_boolean); + gs_setfilloverprint(igs, op->value.boolval); + pop(1); + return 0; +} + /* - .currentoverprintmode <int> */ static int zcurrentoverprintmode(i_ctx_t *i_ctx_p) @@ -107,5 +153,9 @@ const op_def zcssepr_l2_op_defs[] = {"0.currentoverprintmode", zcurrentoverprintmode}, {"1setoverprint", zsetoverprint}, {"1.setoverprintmode", zsetoverprintmode}, + {"0.currentstrokeoverprint", zcurrentstrokeoverprint}, + {"1.setstrokeoverprint", zsetstrokeoverprint}, + {"0.currentfilloverprint", zcurrentfilloverprint}, + {"1.setfilloverprint", zsetfilloverprint}, op_def_end(0) }; |