diff options
Diffstat (limited to 'pdf/pdf_path.c')
-rw-r--r-- | pdf/pdf_path.c | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/pdf/pdf_path.c b/pdf/pdf_path.c index ef6f1328d..d35cf4424 100644 --- a/pdf/pdf_path.c +++ b/pdf/pdf_path.c @@ -120,22 +120,28 @@ static int pdfi_fill_inner(pdf_context *ctx, bool use_eofill) if (pdfi_oc_is_off(ctx)) goto exit; - code = pdfi_gsave(ctx); - if (code < 0) goto exit; - code = pdfi_trans_setup(ctx, &state, NULL, TRANSPARENCY_Caller_Fill); if (code == 0) { + /* If we don't gsave/grestore round the fill, then the file + * /tests_private/pdf/sumatra/954_-_dashed_lines_hardly_visible.pdf renders + * incorrectly. However we must not gsave/grestore round the trans_setup + * trans_teardown, because that might set pgs->soft_mask_id and if we restore + * back to a point where that is not set then pdfwrite doesn't work properly. + */ + code = pdfi_gsave(ctx); + if (code < 0) goto exit; + if (use_eofill) code = gs_eofill(ctx->pgs); else code = gs_fill(ctx->pgs); + code1 = pdfi_grestore(ctx); + if (code == 0) code = code1; + code1 = pdfi_trans_teardown(ctx, &state); if (code == 0) code = code1; } - code1 = pdfi_grestore(ctx); - if (code == 0) code = code1; - exit: code1 = pdfi_newpath(ctx); if (code == 0) code = code1; @@ -164,20 +170,27 @@ int pdfi_stroke(pdf_context *ctx) if (pdfi_oc_is_off(ctx)) goto exit; - code = pdfi_gsave(ctx); - if (code < 0) goto exit; +/* code = pdfi_gsave(ctx); + if (code < 0) goto exit;*/ gs_swapcolors_quick(ctx->pgs); code = pdfi_trans_setup(ctx, &state, NULL, TRANSPARENCY_Caller_Stroke); if (code == 0) { + code = pdfi_gsave(ctx); + if (code < 0) goto exit; + code = gs_stroke(ctx->pgs); + + code1 = pdfi_grestore(ctx); + if (code == 0) code = code1; + code1 = pdfi_trans_teardown(ctx, &state); if (code == 0) code = code1; } gs_swapcolors_quick(ctx->pgs); - code1 = pdfi_grestore(ctx); - if (code == 0) code = code1; +/* code1 = pdfi_grestore(ctx); + if (code == 0) code = code1;*/ exit: code1 = pdfi_newpath(ctx); @@ -378,22 +391,23 @@ static int pdfi_B_inner(pdf_context *ctx, bool use_eofill) if (pdfi_oc_is_off(ctx)) goto exit; - code = pdfi_gsave(ctx); - if (code < 0) goto exit; - code = pdfi_trans_setup(ctx, &state, NULL, TRANSPARENCY_Caller_FillStroke); if (code == 0) { + code = pdfi_gsave(ctx); + if (code < 0) goto exit; + if (use_eofill) code = gs_eofillstroke(ctx->pgs, &code1); else code = gs_fillstroke(ctx->pgs, &code1); + + code1 = pdfi_grestore(ctx); + if (code == 0) code = code1; + code1 = pdfi_trans_teardown(ctx, &state); if (code >= 0) code = code1; } - code1 = pdfi_grestore(ctx); - if (code == 0) code = code1; - exit: code1 = pdfi_newpath(ctx); if (code == 0) code = code1; |