[gs-commits] ghostpdl branch, master, updated. ghostpdl-9.02-992-g0611ef4

Henry Stiles henrys at ghostscript.com
Wed Mar 7 01:44:45 UTC 2012


The ghostpdl branch, master has been updated
       via  0611ef428368816b4f123003df98263e674eab5a (commit)
      from  e954dd4683c35dbd66de3e045d979ebbf20c4d72 (commit)

----------------------------------------------------------------------
commit 0611ef428368816b4f123003df98263e674eab5a
Author: Henry Stiles <henry.stiles at artifex.com>
Date:   Thu Mar 1 13:47:18 2012 -0700

    Add command line parsing for icc user parameters.

diff --git a/pcl/pctop.c b/pcl/pctop.c
index c270196..3cd9d3a 100644
--- a/pcl/pctop.c
+++ b/pcl/pctop.c
@@ -339,6 +339,36 @@ pcl_get_personality(pl_interp_instance_t *instance, gx_device *device)
         return pcl5c;
 }
 
+static int
+pcl_set_icc_params(pl_interp_instance_t *instance, gs_state *pgs)
+{
+    gs_param_string p;
+    
+    int code = 0;
+
+    if (instance->pdefault_gray_icc) {
+        param_string_from_transient_string(p, instance->pdefault_gray_icc);
+        code = gs_setdefaultgrayicc(pgs, &p);
+        if (code < 0)
+            return gs_throw_code(gs_error_Fatal);
+    }
+
+    if (instance->pdefault_rgb_icc) {
+        param_string_from_transient_string(p, instance->pdefault_rgb_icc);
+        code = gs_setdefaultrgbicc(pgs, &p);
+        if (code < 0)
+            return gs_throw_code(gs_error_Fatal);
+    }
+
+    if (instance->piccdir) {
+        param_string_from_transient_string(p, instance->piccdir);
+        code = gs_seticcdirectory(pgs, &p);
+        if (code < 0)
+            return gs_throw_code(gs_error_Fatal);
+    }
+    return code;
+}
+
 static bool
 pcl_get_interpolation(pl_interp_instance_t *instance)
 {
@@ -406,6 +436,10 @@ pcl_impl_set_device(
     if (code < 0)
         goto pisdEnd;
 
+    code = pcl_set_icc_params(instance, pcli->pcs.pgs);
+    if (code < 0)
+        goto pisdEnd;
+
     stage = Sgsave1;
     if ( (code = gs_gsave(pcli->pcs.pgs)) < 0 )
         goto pisdEnd;
diff --git a/pl/plmain.c b/pl/plmain.c
index 25401ce..60c66ea 100644
--- a/pl/plmain.c
+++ b/pl/plmain.c
@@ -725,6 +725,11 @@ pl_main_universe_select(
         universe->curr_instance->interpolate = pti->interpolate;
         universe->curr_instance->page_set_on_command_line = pti->page_set_on_command_line;
         universe->curr_instance->res_set_on_command_line = pti->res_set_on_command_line;                
+        universe->curr_instance->piccdir = pti->piccdir;
+        universe->curr_instance->pdefault_gray_icc = pti->pdefault_gray_icc;
+        universe->curr_instance->pdefault_rgb_icc = pti->pdefault_rgb_icc;
+        universe->curr_instance->pdefault_cmyk_icc = pti->pdefault_cmyk_icc;
+
 
         /* Select curr/new device into PDL instance */
         if ( pl_set_device(universe->curr_instance, universe->curr_device) < 0 ) {
@@ -794,6 +799,10 @@ pl_main_init_instance(pl_main_instance_t *pti, gs_memory_t *mem)
     pti->interpolate = false;
     pti->page_set_on_command_line = false;
     pti->res_set_on_command_line = false;
+    pti->piccdir = NULL;
+    pti->pdefault_gray_icc = NULL;
+    pti->pdefault_rgb_icc = NULL;
+    pti->pdefault_cmyk_icc = NULL;
     strncpy(&pti->pcl_personality[0], "PCL", sizeof(pti->pcl_personality)-1);
 }
 
@@ -1136,7 +1145,7 @@ pl_main_process_options(pl_main_instance_t *pmi, arg_list *pal,
             break;
         case 's':
         case 'S':
-            { /* We're setting a device parameter to a string. */
+            { /* We're setting a device or user parameter to a string. */
                 char *eqp;
                 const char *value;
                 gs_param_string str;
@@ -1151,9 +1160,18 @@ pl_main_process_options(pl_main_instance_t *pmi, arg_list *pal,
                         pl_top_create_device(pmi,
                                              get_device_index(pmi->memory, value),
                                              false);
-                    if ( code < 0 ) return code;
-                }
-                else {
+                    if ( code < 0 ) 
+                        return code;
+                    /* check for icc settings */
+                } else if (!strncmp(arg, "DefaultGrayProfile", strlen("DefaultGrayProfile"))) {
+                    pmi->pdefault_gray_icc = arg_heap_copy(value);
+                } else if (!strncmp(arg, "DefaultRGBProfile", strlen("DefaultRGBProfile"))) {
+                    pmi->pdefault_rgb_icc = arg_heap_copy(value);
+                } else if (!strncmp(arg, "DefaultCMYKProfile", strlen("DefaultCMYKProfile"))) {
+                    pmi->pdefault_cmyk_icc = arg_heap_copy(value);
+                } else if (!strncmp(arg, "ICCProfileDir", strlen("ICCProfileDir"))) {
+                    pmi->piccdir = arg_heap_copy(value);
+                } else {
                     char buffer[128];
                     strncpy(buffer, arg, eqp - arg);
                     buffer[eqp - arg] = '\0';
diff --git a/pl/plmain.h b/pl/plmain.h
index d29c14e..e99aa9b 100644
--- a/pl/plmain.h
+++ b/pl/plmain.h
@@ -19,6 +19,7 @@
 
 #include "gsargs.h"
 #include "gsgc.h"
+
 /*
  * Define the parameters for running the interpreter.
  */
@@ -55,6 +56,13 @@ typedef struct pl_main_instance_s {
     bool interpolate;
     bool page_set_on_command_line;
     bool res_set_on_command_line;
+    
+    /* we have to store these in the main instance until the languages
+       state is sufficiently initialized to set the parameters. */
+    char *piccdir;
+    char *pdefault_gray_icc;
+    char *pdefault_rgb_icc;
+    char *pdefault_cmyk_icc;
 } pl_main_instance_t;
 
 /* initialize gs_stdin, gs_stdout, and gs_stderr.  Eventually the gs
diff --git a/pl/pltop.h b/pl/pltop.h
index 831d2aa..8493398 100644
--- a/pl/pltop.h
+++ b/pl/pltop.h
@@ -37,12 +37,16 @@ typedef struct pl_interp_s {
 } pl_interp_t;
 
 typedef struct pl_interp_instance_s {
-    pl_interp_t     *interp;            /* interpreter instance refers to */
+    pl_interp_t*    interp;            /* interpreter instance refers to */
     vm_spaces       spaces;             /* spaces for GC */
     char *          pcl_personality;
     bool            interpolate;
     bool            page_set_on_command_line;
     bool            res_set_on_command_line;
+    char *          piccdir;
+    char *          pdefault_gray_icc;
+    char *          pdefault_rgb_icc;
+    char *          pdefault_cmyk_icc;
 } pl_interp_instance_t;
 
 /* Param data types */
diff --git a/pxl/pxtop.c b/pxl/pxtop.c
index 55319ba..062cf51 100644
--- a/pxl/pxtop.c
+++ b/pxl/pxtop.c
@@ -297,6 +297,35 @@ pxl_impl_set_post_page_action(
         return 0;
 }
 
+static int
+pxl_set_icc_params(pl_interp_instance_t *instance, gs_state *pgs)
+{
+    gs_param_string p;
+    int code = 0;
+
+    if (instance->pdefault_gray_icc) {
+        param_string_from_transient_string(p, instance->pdefault_gray_icc);
+        code = gs_setdefaultgrayicc(pgs, &p);
+        if (code < 0)
+            return gs_throw_code(gs_error_Fatal);
+    }
+
+    if (instance->pdefault_rgb_icc) {
+        param_string_from_transient_string(p, instance->pdefault_rgb_icc);
+        code = gs_setdefaultrgbicc(pgs, &p);
+        if (code < 0)
+            return gs_throw_code(gs_error_Fatal);
+    }
+
+    if (instance->piccdir) {
+        param_string_from_transient_string(p, instance->piccdir);
+        code = gs_seticcdirectory(pgs, &p);
+        if (code < 0)
+            return gs_throw_code(gs_error_Fatal);
+    }
+    return code;
+}
+
 static bool
 pxl_get_interpolation(pl_interp_instance_t *instance)
 {
@@ -335,6 +364,10 @@ pxl_impl_set_device(
         if ((code = px_initgraphics(pxli->pxs)) < 0)
           goto pisdEnd;
 
+        code = pxl_set_icc_params(instance, pxli->pgs);
+        if (code < 0)
+            goto pisdEnd;
+
         /* Do inits of gstate that may be reset by setdevice */
         gs_setaccuratecurves(pxli->pgs, true);	/* All H-P languages want accurate curves. */
         /* disable hinting at high res */
diff --git a/xps/xpstop.c b/xps/xpstop.c
index 3effd01..1538b9c 100644
--- a/xps/xpstop.c
+++ b/xps/xpstop.c
@@ -81,6 +81,38 @@ xps_imp_allocate_interp(pl_interp_t **ppinterp,
     return 0;
 }
 
+static int
+xps_set_icc_user_params(pl_interp_instance_t *instance, gs_state *pgs)
+{    gs_param_string p;
+    int code = 0;
+
+    if (instance->pdefault_gray_icc) {
+        param_string_from_transient_string(p, instance->pdefault_gray_icc);
+        code = gs_setdefaultgrayicc(pgs, &p);
+        if (code < 0)
+            return gs_throw_code(gs_error_Fatal);
+    }
+    if (instance->pdefault_rgb_icc) {
+        param_string_from_transient_string(p, instance->pdefault_rgb_icc);
+        code = gs_setdefaultrgbicc(pgs, &p);
+        if (code < 0)
+            return gs_throw_code(gs_error_Fatal);
+    }
+    if (instance->pdefault_cmyk_icc) {
+        param_string_from_transient_string(p, instance->pdefault_cmyk_icc);
+        code = gs_setdefaultcmykicc(pgs, &p);
+        if (code < 0)
+            return gs_throw_code(gs_error_Fatal);
+    }
+    if (instance->piccdir) {
+        param_string_from_transient_string(p, instance->piccdir);
+        code = gs_seticcdirectory(pgs, &p);
+        if (code < 0)
+            return gs_throw_code(gs_error_Fatal);
+    }
+    return code;
+}
+    
 /* Do per-instance interpreter allocation/init. No device is set yet */
 static int
 xps_imp_allocate_interp_instance(pl_interp_instance_t **ppinstance,
@@ -145,6 +177,7 @@ xps_imp_allocate_interp_instance(pl_interp_instance_t **ppinstance,
     gs_setaligntopixels(ctx->fontdir, 1); /* no subpixels */
     gs_setgridfittt(ctx->fontdir, 1); /* see gx_ttf_outline in gxttfn.c for values */
 
+    (void)xps_set_icc_user_params((pl_interp_instance_t *)instance, ctx->pgs);
     *ppinstance = (pl_interp_instance_t *)instance;
 
     return 0;


Summary of changes:
 pcl/pctop.c  |   34 ++++++++++++++++++++++++++++++++++
 pl/plmain.c  |   26 ++++++++++++++++++++++----
 pl/plmain.h  |    8 ++++++++
 pl/pltop.h   |    6 +++++-
 pxl/pxtop.c  |   33 +++++++++++++++++++++++++++++++++
 xps/xpstop.c |   33 +++++++++++++++++++++++++++++++++
 6 files changed, 135 insertions(+), 5 deletions(-)



More information about the gs-commits mailing list