[gs-commits] ghostpdl branch, pdfi, updated. jbig2dec-0.14-2110-g86f4720
[email protected] (Nancy Durgin)
| Newsgroups | gmane.comp.printing.ghostscript.cvs |
|---|---|
| Message-ID | <[email protected]> |
The ghostpdl branch, pdfi has been updated
via 86f47207b9e2a97fd8cb2880539ba70367140b8d (commit)
from fcfe32152f00ade7e009eabf2952e27edafdf7c1 (commit)
----------------------------------------------------------------------
commit 86f47207b9e2a97fd8cb2880539ba70367140b8d
Author: Nancy Durgin <[email protected]>
Date: Wed Aug 14 13:23:01 2019 -0700
Fixes to DefaultQState context, SMask Group color, Form BBox
Added pdfi_run_context which saves/restores DefaultQState for each
inner context. Used by forms and probably fonts?
For SMask, was getting the color from the wrong place.
Get correct BBox for form group.
Fix unitialized transparency variable for patterns (why didn't gcc catch this?)
Also, only check pattern for transparency if we know the page has transparency.
diff --git a/pdf/pdf_gstate.c b/pdf/pdf_gstate.c
index 1a6aafa..5bd2b77 100644
--- a/pdf/pdf_gstate.c
+++ b/pdf/pdf_gstate.c
@@ -927,6 +927,8 @@ int pdfi_set_DefaultQState(pdf_context *ctx, gs_gstate *pgs)
{
pdfi_free_DefaultQState(ctx);
ctx->DefaultQState = gs_gstate_copy(ctx->pgs, ctx->memory);
+ if (ctx->DefaultQState == NULL)
+ return_error(gs_error_VMerror);
return 0;
}
@@ -934,3 +936,23 @@ gs_gstate *pdfi_get_DefaultQState(pdf_context *ctx)
{
return ctx->DefaultQState;
}
+
+int pdfi_copy_DefaultQState(pdf_context *ctx, gs_gstate **pgs)
+{
+ *pgs = gs_gstate_copy(ctx->DefaultQState, ctx->memory);
+ if (*pgs == NULL)
+ return_error(gs_error_VMerror);
+ return 0;
+}
+
+int pdfi_restore_DefaultQState(pdf_context *ctx, gs_gstate **pgs)
+{
+ int code;
+
+ code = pdfi_set_DefaultQState(ctx, *pgs);
+ if (code < 0)
+ return code;
+ code = gs_gstate_free(*pgs);
+ *pgs = NULL;
+ return code;
+}
diff --git a/pdf/pdf_gstate.h b/pdf/pdf_gstate.h
index 08e90ec..b78e464 100644
--- a/pdf/pdf_gstate.h
+++ b/pdf/pdf_gstate.h
@@ -41,5 +41,7 @@ int pdfi_setgstate(pdf_context *ctx, pdf_dict *stream_dict, pdf_dict *page_dict)
int pdfi_free_DefaultQState(pdf_context *ctx);
int pdfi_set_DefaultQState(pdf_context *ctx, gs_gstate *pgs);
gs_gstate *pdfi_get_DefaultQState(pdf_context *ctx);
+int pdfi_copy_DefaultQState(pdf_context *ctx, gs_gstate **pgs);
+int pdfi_restore_DefaultQState(pdf_context *ctx, gs_gstate **pgs);
#endif
diff --git a/pdf/pdf_image.c b/pdf/pdf_image.c
index 282dc29..44a8191 100644
--- a/pdf/pdf_image.c
+++ b/pdf/pdf_image.c
@@ -1327,7 +1327,7 @@ int pdfi_form_execgroup(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *xobject
goto exit2;
}
- code = pdfi_interpret_inner_content_stream(ctx, xobject_dict, page_dict, false, "FORM");
+ code = pdfi_run_context(ctx, xobject_dict, page_dict, false, "FORM");
exit2:
if (code != 0)
@@ -1347,6 +1347,7 @@ static int pdfi_do_form(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *form_di
pdf_array *FormMatrix = NULL;
gs_matrix m;
+ dbgmprintf(ctx->memory, "pdfi_do_form BEGIN\n");
code = pdfi_dict_known(form_dict, "Group", &group_known);
if (code < 0)
goto exit;
@@ -1364,7 +1365,7 @@ static int pdfi_do_form(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *form_di
if (code < 0)
goto exit1;
- code = pdfi_trans_begin_group(ctx, page_dict, form_dict);
+ code = pdfi_trans_begin_form_group(ctx, page_dict, form_dict);
(void)pdfi_loop_detector_cleartomark(ctx);
if (code < 0)
goto exit1;
@@ -1415,6 +1416,7 @@ static int pdfi_do_form(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *form_di
if (code < 0) {
return code;
}
+ dbgmprintf(ctx->memory, "pdfi_do_form END\n");
return 0;
}
diff --git a/pdf/pdf_int.c b/pdf/pdf_int.c
index e62c908..2cb8aeb 100644
--- a/pdf/pdf_int.c
+++ b/pdf/pdf_int.c
@@ -3383,7 +3383,6 @@ void local_restore_stream_state(pdf_context *ctx, stream_save *local_save)
ctx->current_stream_save.gsave_level = local_save->gsave_level;
ctx->current_stream_save.stack_count = local_save->stack_count;
ctx->current_stream_save.group_depth = local_save->group_depth;
-
}
void initialise_stream_save(pdf_context *ctx)
@@ -3394,6 +3393,21 @@ void initialise_stream_save(pdf_context *ctx)
ctx->current_stream_save.stack_count = pdfi_count_total_stack(ctx);
}
+/* Run a stream in a sub-context (saves/restores DefaultQState) */
+int pdfi_run_context(pdf_context *ctx, pdf_dict *stream_dict,
+ pdf_dict *page_dict, bool stoponerror, const char *desc)
+{
+ int code;
+ gs_gstate *DefaultQState;
+
+ pdfi_copy_DefaultQState(ctx, &DefaultQState);
+ pdfi_set_DefaultQState(ctx, ctx->pgs);
+ code = pdfi_interpret_inner_content_stream(ctx, stream_dict, page_dict, stoponerror, desc);
+ pdfi_restore_DefaultQState(ctx, &DefaultQState);
+ return code;
+}
+
+
/* Interpret a sub-content stream, with some handling of error recovery, clearing stack, etc.
* This temporarily turns on pdfstoponerror if requested.
* It will make sure the stack is cleared and the gstate is matched.
diff --git a/pdf/pdf_int.h b/pdf/pdf_int.h
index 2f94f64..07fe592 100644
--- a/pdf/pdf_int.h
+++ b/pdf/pdf_int.h
@@ -51,6 +51,8 @@ void local_save_stream_state(pdf_context *ctx, stream_save *local_save);
void local_restore_stream_state(pdf_context *ctx, stream_save *local_save);
void cleanup_context_interpretation(pdf_context *ctx, stream_save *local_save);
void initialise_stream_save(pdf_context *ctx);
+int pdfi_run_context(pdf_context *ctx, pdf_dict *stream_dict,
+ pdf_dict *page_dict, bool stoponerror, const char *desc);
int pdfi_interpret_inner_content_stream(pdf_context *ctx, pdf_dict *stream_dict,
pdf_dict *page_dict, bool stoponerror, const char *desc);
int pdfi_interpret_content_stream(pdf_context *ctx, pdf_dict *stream_dict, pdf_dict *page_dict);
diff --git a/pdf/pdf_pattern.c b/pdf/pdf_pattern.c
index 69a30bf..8212bd1 100644
--- a/pdf/pdf_pattern.c
+++ b/pdf/pdf_pattern.c
@@ -305,6 +305,8 @@ pdfi_pattern_gset(pdf_context *ctx)
fillalpha = gs_getfillconstantalpha(ctx->pgs);
/* This will preserve the ->level and a couple other things */
+ dbgmprintf2(ctx->memory, "PATTERN setting DefaultQState, old device=%s, new device=%s\n",
+ ctx->pgs->device->dname, ctx->DefaultQState->device->dname);
code = gs_setgstate(ctx->pgs, pdfi_get_DefaultQState(ctx));
if (code < 0)
@@ -362,7 +364,7 @@ pdfi_setpattern_type1(pdf_context *ctx, pdf_dict *stream_dict, pdf_dict *page_di
double XStep, YStep;
pdf_dict *Resources = NULL;
pdf_array *Matrix = NULL;
- bool transparency;
+ bool transparency = false;
dbgmprintf(ctx->memory, "PATTERN: Type 1 pattern\n");
@@ -409,9 +411,11 @@ pdfi_setpattern_type1(pdf_context *ctx, pdf_dict *stream_dict, pdf_dict *page_di
}
/* See if pattern uses transparency */
- code = pdfi_check_Pattern(ctx, pdict, page_dict, &transparency, NULL);
- if (code < 0)
- goto exit;
+ if (ctx->page_has_transparency) {
+ code = pdfi_check_Pattern(ctx, pdict, page_dict, &transparency, NULL);
+ if (code < 0)
+ goto exit;
+ }
/* TODO: Resources? Maybe I should check that they are all valid before proceeding, or something? */
diff --git a/pdf/pdf_trans.c b/pdf/pdf_trans.c
index 18f0c79..f7dd276 100644
--- a/pdf/pdf_trans.c
+++ b/pdf/pdf_trans.c
@@ -36,8 +36,9 @@ static int pdfi_trans_set_mask(pdf_context *ctx, pdf_dict *SMask)
pdf_array *BBox = NULL;
pdf_array *a = NULL;
pdf_dict *G_dict = NULL;
+ pdf_dict *Group = NULL;
pdf_name *n = NULL;
- pdf_name *CS = NULL;
+ pdf_obj *CS = NULL;
double f;
code = pdfi_dict_knownget_type(ctx, SMask, "Type", PDF_NAME, (pdf_obj **)&n);
@@ -74,18 +75,30 @@ static int pdfi_trans_set_mask(pdf_context *ctx, pdf_dict *SMask)
/* TODO: GroupGState, GMatrix ? */
- /* TODO: Stuff with colorspace, see .execmaskgroup */
- code = pdfi_dict_knownget_type(ctx, G_dict, "CS", PDF_NAME, (pdf_obj **)&CS);
+ /* CS is in the dict "Group" inside the dict "G" */
+ /* TODO: Not sure if this is a required thing or just one possibility */
+ code = pdfi_dict_knownget_type(ctx, G_dict, "Group", PDF_DICT, (pdf_obj **)&Group);
if (code < 0)
goto exit;
if (code > 0) {
- code = pdfi_create_colorspace(ctx, (pdf_obj *)CS, (pdf_dict *)ctx->main_stream,
+ /* TODO: Stuff with colorspace, see .execmaskgroup */
+ code = pdfi_dict_knownget(ctx, Group, "CS", &CS);
+ if (code < 0)
+ goto exit;
+ if (code > 0) {
+ code = pdfi_create_colorspace(ctx, CS, (pdf_dict *)ctx->main_stream,
ctx->CurrentPageDict, &pcs, false);
- params.ColorSpace = pcs;
- if (code < 0)
- goto exit;
+ params.ColorSpace = pcs;
+ if (code < 0)
+ goto exit;
+ } else {
+ /* Inherit current colorspace */
+ params.ColorSpace = ctx->pgs->color[0].color_space; /* 0 or 1 ? */
+ }
} else {
- /* Inherit current colorspace */
+ /* TODO: Is this an error or what?
+ Inherit current colorspace
+ */
params.ColorSpace = ctx->pgs->color[0].color_space; /* 0 or 1 ? */
}
@@ -104,6 +117,7 @@ static int pdfi_trans_set_mask(pdf_context *ctx, pdf_dict *SMask)
if (pcs)
rc_decrement_cs(pcs, "pdfi_trans_set_mask");
pdfi_countdown(n);
+ pdfi_countdown(Group);
pdfi_countdown(G_dict);
pdfi_countdown(a);
pdfi_countdown(BBox);
@@ -185,10 +199,11 @@ int pdfi_trans_begin_page_group(pdf_context *ctx, pdf_dict *page_dict, pdf_dict
return code;
}
-int pdfi_trans_begin_group(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *form_dict)
+int pdfi_trans_begin_form_group(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *form_dict)
{
pdf_dict *group_dict = NULL;
gs_rect bbox;
+ pdf_array *BBox = NULL;
int code;
code = pdfi_dict_get_type(ctx, form_dict, "Group", PDF_DICT, (pdf_obj **)&group_dict);
@@ -196,10 +211,19 @@ int pdfi_trans_begin_group(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *form
return_error(code);
code = pdfi_gsave(ctx);
- bbox.p.x = ctx->PageSize[0];
- bbox.p.y = ctx->PageSize[1];
- bbox.q.x = ctx->PageSize[2];
- bbox.q.y = ctx->PageSize[3];
+ code = pdfi_dict_knownget_type(ctx, form_dict, "BBox", PDF_ARRAY, (pdf_obj **)&BBox);
+ if (code < 0)
+ goto exit;
+ if (code > 0) {
+ code = pdfi_array_to_gs_rect(ctx, BBox, &bbox);
+ if (code < 0)
+ goto exit;
+ } else {
+ bbox.p.x = 0;
+ bbox.p.y = 0;
+ bbox.q.x = 0;
+ bbox.q.y = 0;
+ }
code = pdfi_transparency_group_common(ctx, page_dict, group_dict, &bbox, PDF14_BEGIN_TRANS_GROUP);
if (code < 0)
@@ -207,6 +231,8 @@ int pdfi_trans_begin_group(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *form
else
ctx->current_stream_save.group_depth++;
+ exit:
+ pdfi_countdown(BBox);
pdfi_countdown(group_dict);
return code;
}
diff --git a/pdf/pdf_trans.h b/pdf/pdf_trans.h
index 1d0c2e3..0d57a3b 100644
--- a/pdf/pdf_trans.h
+++ b/pdf/pdf_trans.h
@@ -17,7 +17,7 @@
#define PDF_TRANSPARENCY_OPERATORS
int pdfi_trans_begin_page_group(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *group_dict);
-int pdfi_trans_begin_group(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *form_dict);
+int pdfi_trans_begin_form_group(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *form_dict);
int pdfi_trans_end_group(pdf_context *ctx);
int pdfi_trans_set_params(pdf_context *ctx, double alpha);
int pdfi_trans_begin_isolated_group(pdf_context *ctx, bool image_with_SMask);
Summary of changes:
pdf/pdf_gstate.c | 22 ++++++++++++++++++++++
pdf/pdf_gstate.h | 2 ++
pdf/pdf_image.c | 6 ++++--
pdf/pdf_int.c | 16 +++++++++++++++-
pdf/pdf_int.h | 2 ++
pdf/pdf_pattern.c | 12 ++++++++----
pdf/pdf_trans.c | 50 ++++++++++++++++++++++++++++++++++++++------------
pdf/pdf_trans.h | 2 +-
8 files changed, 92 insertions(+), 20 deletions(-)