[gs-commits] ghostpdl branch, pdfi, updated. jbig2dec-0.14-2327-g56435c0
[email protected] (Nancy Durgin) Thu, 3 Oct 2019 22:19:28 +0000 (UTC)
| Newsgroups | gmane.comp.printing.ghostscript.cvs |
|---|---|
| Message-ID | <[email protected]> |
The ghostpdl branch, pdfi has been updated
via 56435c081040403fb513244a37f08f5feb2451a1 (commit)
via 7171c39581d97b3f60b6ea5981a63604cd195339 (commit)
from d0bf928a84a194f5bb83a3959ada38be667d2a5c (commit)
----------------------------------------------------------------------
commit 56435c081040403fb513244a37f08f5feb2451a1
Author: Nancy Durgin <[email protected]>
Date: Thu Oct 3 12:47:38 2019 -0700
Implement TR transfer function for SMask
diff --git a/pdf/pdf_trans.c b/pdf/pdf_trans.c
index 59e8aff..32dab15 100644
--- a/pdf/pdf_trans.c
+++ b/pdf/pdf_trans.c
@@ -25,9 +25,20 @@
#include "pdf_image.h"
#include "pdf_device.h"
#include "pdf_misc.h"
+#include "pdf_func.h"
#include "gstparam.h"
+/* Implement the TransferFunction using a Function. */
+static int
+pdfi_tf_using_function(double in_val, float *out, void *proc_data)
+{
+ float in = in_val;
+ gs_function_t *const pfn = proc_data;
+
+ return gs_function_evaluate(pfn, &in, out);
+}
+
/* (see pdf_draw.ps/execmaskgroup) */
static int pdfi_trans_set_mask(pdf_context *ctx, pdfi_int_gstate *igs, int colorindex)
{
@@ -42,6 +53,8 @@ static int pdfi_trans_set_mask(pdf_context *ctx, pdfi_int_gstate *igs, int color
pdf_array *BC = NULL;
pdf_dict *G_dict = NULL;
pdf_dict *Group = NULL;
+ pdf_obj *TR;
+ gs_function_t *gsfunc = NULL;
pdf_name *n = NULL;
pdf_name *S = NULL;
pdf_obj *CS = NULL;
@@ -103,6 +116,22 @@ static int pdfi_trans_set_mask(pdf_context *ctx, pdfi_int_gstate *igs, int color
dmprintf(ctx->memory, "WARNING: Unknown subtype 'S' in SMask (defaulting to Luminosity)\n");
}
+ /* TR is transfer function (Optional) */
+ code = pdfi_dict_knownget(ctx, SMask, "TR", (pdf_obj **)&TR);
+ if (code > 0) {
+ if (TR->type == PDF_DICT) {
+ code = pdfi_build_function(ctx, &gsfunc, NULL, 1, (pdf_dict *)TR, NULL);
+ if (code < 0)
+ goto exit;
+ } else if (TR->type == PDF_NAME) {
+ if (!pdfi_name_is((pdf_name *)TR, "Identity")) {
+ dmprintf(ctx->memory, "WARNING: Unknown TR in SMask\n");
+ }
+ } else {
+ dmprintf(ctx->memory, "WARNING: Ignoring invalid TR in SMask\n");
+ }
+ }
+
/* BC is Background Color array (Optional) */
code = pdfi_dict_knownget_type(ctx, SMask, "BC", PDF_ARRAY, (pdf_obj **)&BC);
if (code < 0)
@@ -133,6 +162,10 @@ static int pdfi_trans_set_mask(pdf_context *ctx, pdfi_int_gstate *igs, int color
gs_trans_mask_params_init(¶ms, subtype);
params.replacing = true;
+ if (gsfunc) {
+ params.TransferFunction = pdfi_tf_using_function;
+ params.TransferFunction_data = gsfunc;
+ }
/* Need to set just the ctm (GroupMat) from the saved GroupGState, to
have gs_begin_transparency_mask work correctly. Or at least that's
@@ -222,6 +255,8 @@ static int pdfi_trans_set_mask(pdf_context *ctx, pdfi_int_gstate *igs, int color
}
exit:
+ if (gsfunc)
+ pdfi_free_function(ctx, gsfunc);
if (pcs)
rc_decrement_cs(pcs, "pdfi_trans_set_mask");
pdfi_countdown(n);
----------------------------------------------------------------------
commit 7171c39581d97b3f60b6ea5981a63604cd195339
Author: Nancy Durgin <[email protected]>
Date: Wed Oct 2 13:01:52 2019 -0700
Fixes for applying the matrix with a group
Change pdfi_form_execgroup() so concat with matrix is optional.
Change pdfi_do_form() to concat the matrix before starting the group.
Clean up/simplify the code.
diff --git a/pdf/pdf_image.c b/pdf/pdf_image.c
index d314db7..6996924 100644
--- a/pdf/pdf_image.c
+++ b/pdf/pdf_image.c
@@ -1330,20 +1330,12 @@ int pdfi_EI(pdf_context *ctx)
}
/* see .execgroup */
-int pdfi_form_execgroup(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *xobject_dict, gs_gstate *GroupGState)
+int pdfi_form_execgroup(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *xobject_dict,
+ gs_gstate *GroupGState, gs_matrix *matrix)
{
int code;
- pdf_array *FormMatrix = NULL;
- gs_matrix m;
pdfi_int_gstate *igs = (pdfi_int_gstate *)ctx->pgs->client_data;
- code = pdfi_dict_knownget_type(ctx, xobject_dict, "Matrix", PDF_ARRAY, (pdf_obj **)&FormMatrix);
- if (code < 0)
- goto exit;
- code = pdfi_array_to_gs_matrix(ctx, FormMatrix, &m);
- if (code < 0)
- goto exit;
-
code = pdfi_gsave(ctx);
if (code < 0)
goto exit;
@@ -1351,7 +1343,7 @@ int pdfi_form_execgroup(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *xobject
if (GroupGState) {
code = gs_setgstate(ctx->pgs, GroupGState);
if (code < 0)
- goto exit;
+ goto exit2;
}
/* Disable the SMask */
@@ -1363,11 +1355,11 @@ int pdfi_form_execgroup(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *xobject
gs_setstrokeconstantalpha(ctx->pgs, 1.0);
gs_setfillconstantalpha(ctx->pgs, 1.0);
- code = gs_concat(ctx->pgs, &m);
+ if (matrix)
+ code = gs_concat(ctx->pgs, matrix);
if (code < 0) {
goto exit2;
}
-
code = pdfi_run_context(ctx, xobject_dict, page_dict, false, "FORM");
exit2:
@@ -1376,13 +1368,12 @@ int pdfi_form_execgroup(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *xobject
else
code = pdfi_grestore(ctx);
exit:
- pdfi_countdown(FormMatrix);
return code;
}
static int pdfi_do_form(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *form_dict)
{
- int code;
+ int code, code1 = 0;
bool group_known = false;
bool do_group = false;
pdf_array *FormMatrix = NULL;
@@ -1401,17 +1392,6 @@ static int pdfi_do_form(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *form_di
if (code < 0)
goto exit1;
- if (do_group) {
- code = pdfi_loop_detector_mark(ctx);
- if (code < 0)
- goto exit1;
-
- code = pdfi_trans_begin_form_group(ctx, page_dict, form_dict);
- (void)pdfi_loop_detector_cleartomark(ctx);
- if (code < 0)
- goto exit1;
- }
-
code = pdfi_dict_knownget_type(ctx, form_dict, "Matrix", PDF_ARRAY, (pdf_obj **)&FormMatrix);
if (code < 0)
goto exit1;
@@ -1426,13 +1406,9 @@ static int pdfi_do_form(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *form_di
if (code < 0)
goto exit1;
- code = pdfi_gsave(ctx);
- if (code < 0)
- goto exit1;
-
code = gs_concat(ctx->pgs, &m);
if (code < 0) {
- goto exit2;
+ goto exit1;
}
code = gs_rectclip(ctx->pgs, &bbox, 1);
@@ -1440,24 +1416,22 @@ static int pdfi_do_form(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *form_di
goto exit1;
if (do_group) {
- code = pdfi_form_execgroup(ctx, page_dict, form_dict, NULL);
+ code = pdfi_loop_detector_mark(ctx);
+ if (code < 0)
+ goto exit1;
+
+ code = pdfi_trans_begin_form_group(ctx, page_dict, form_dict);
+ (void)pdfi_loop_detector_cleartomark(ctx);
+ if (code < 0)
+ goto exit1;
+ code = pdfi_form_execgroup(ctx, page_dict, form_dict, NULL, NULL);
+ code1 = pdfi_trans_end_group(ctx);
+ if (code < 0)
+ code = code1;
} else {
code = pdfi_interpret_inner_content_stream(ctx, form_dict, page_dict, false, "FORM");
}
- exit2:
- if (code != 0)
- (void)pdfi_grestore(ctx);
- else
- code = pdfi_grestore(ctx);
-
- if (do_group) {
- if (code < 0)
- (void)pdfi_trans_end_group(ctx);
- else
- code = pdfi_trans_end_group(ctx);
- }
-
exit1:
if (code != 0)
(void)pdfi_op_Q(ctx);
diff --git a/pdf/pdf_image.h b/pdf/pdf_image.h
index 5c5f0fa..2f98eeb 100644
--- a/pdf/pdf_image.h
+++ b/pdf/pdf_image.h
@@ -23,6 +23,7 @@ int pdfi_EI(pdf_context *ctx);
int pdfi_ID(pdf_context *ctx, pdf_dict *stream_dict, pdf_dict *page_dict, pdf_stream *source);
int pdfi_Do(pdf_context *ctx, pdf_dict *stream_dict, pdf_dict *page_dict);
int pdfi_do_image_or_form(pdf_context *ctx, pdf_dict *stream_dict, pdf_dict *page_dict, pdf_dict *xobject_dict);
-int pdfi_form_execgroup(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *xobject_dict, gs_gstate *GroupGState);
+int pdfi_form_execgroup(pdf_context *ctx, pdf_dict *page_dict, pdf_dict *xobject_dict,
+ gs_gstate *GroupGState, gs_matrix *matrix);
#endif
diff --git a/pdf/pdf_trans.c b/pdf/pdf_trans.c
index 8599404..59e8aff 100644
--- a/pdf/pdf_trans.c
+++ b/pdf/pdf_trans.c
@@ -205,7 +205,7 @@ static int pdfi_trans_set_mask(pdf_context *ctx, pdfi_int_gstate *igs, int color
if (code < 0)
goto exit;
- code = pdfi_form_execgroup(ctx, ctx->CurrentPageDict, G_dict, igs->GroupGState);
+ code = pdfi_form_execgroup(ctx, ctx->CurrentPageDict, G_dict, igs->GroupGState, &group_Matrix);
code1 = gs_end_transparency_mask(ctx->pgs, colorindex);
if (code != 0)
code = code1;
Summary of changes:
pdf/pdf_image.c | 64 +++++++++++++++++----------------------------------------
pdf/pdf_image.h | 3 ++-
pdf/pdf_trans.c | 37 ++++++++++++++++++++++++++++++++-
3 files changed, 57 insertions(+), 47 deletions(-)