[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(&params, 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(-)