summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Johnston <ray.johnston@artifex.com>2021-06-02 18:28:07 -0700
committerRay Johnston <ray.johnston@artifex.com>2021-06-18 15:27:10 -0700
commitcc3eebdffaa064eee85775bdb31168c819c32d98 (patch)
treea77fdbaf3289cc01a353cf3bfbacbd8ae18c3173
parent6caff9062ca5b2f2a58274818930ca4d89b9d2dc (diff)
downloadghostpdl-cc3eebdffaa064eee85775bdb31168c819c32d98.tar.gz
Fix Bug 703898. Type 5 Halftone ignored colorants that were not defined.
The customer's PDF file defined a Type 5 halftone with different halftones for some of the named components, but only Default and Cyan, Magenta, Yellow, and Black were actually being generated and installed into the pgs->dev_ht so the /Default would be used for all the spot colors. This change adds the colorant that is not yet known is when it is seen by gs_color_name_component_number rather than when the colorspace is set with the colorant. The equivalent color is still loaded when the colorspace is loaded. Note that for devices that support DeviceN (extra colorants), we do not add the "Red", "Green", "Blue" and "Gray" when seen in the HalftoneType, but only AFTER they are set in a colorspace. This is needed since many files set these other component names even when they are not yet entered as spot colors (in Separation or DeviceN colorspaces).
-rw-r--r--base/gsht.c61
-rw-r--r--base/lib.mak2
2 files changed, 32 insertions, 31 deletions
diff --git a/base/gsht.c b/base/gsht.c
index 20c92e125..2b8567f93 100644
--- a/base/gsht.c
+++ b/base/gsht.c
@@ -26,6 +26,7 @@
#include "gxarith.h" /* for igcd */
#include "gzstate.h"
#include "gxdevice.h" /* for gzht.h */
+#include "gxdevsop.h"
#include "gzht.h"
#include "gxfmap.h" /* For effective transfer usage in threshold */
#include "gp.h"
@@ -645,53 +646,53 @@ int
gs_color_name_component_number(gx_device * dev, const char * pname,
int name_size, int halftonetype)
{
- int num_colorant;
+ int num_colorant = -1; /* initialize to "unknown" */
+ int color_component_type = NO_COMP_NAME_TYPE_HT;
+ bool devn = dev_proc(dev, dev_spec_op)(dev, gxdso_supports_devn, NULL, 0);
-#define check_colorant_name(dev, name) \
- ((*dev_proc(dev, get_color_comp_index)) (dev, name, strlen(name), NO_COMP_NAME_TYPE_HT))
+#define check_colorant_name(dev, name, component_type) \
+ ((*dev_proc(dev, get_color_comp_index)) (dev, name, strlen(name), component_type))
-#define check_colorant_name_length(dev, name, length) \
- ((*dev_proc(dev, get_color_comp_index)) (dev, name, length, NO_COMP_NAME_TYPE_HT))
+#define check_colorant_name_length(dev, name, length, component_type) \
+ ((*dev_proc(dev, get_color_comp_index)) (dev, name, length, component_type))
#define check_name(str, pname, length) \
((strlen(str) == length) && (strncmp(pname, str, length) == 0))
/*
- * Check if this is a device colorant.
- */
- num_colorant = check_colorant_name_length(dev, pname, name_size);
- if (num_colorant >= 0) {
- /*
- * The device will return GX_DEVICE_COLOR_MAX_COMPONENTS if the
- * colorant is logically present in the device but not being used
- * because a SeparationOrder parameter is specified. Since we are
- * using this value to indicate 'Default', we use -1 to indicate
- * that the colorant is not really being used.
- */
- if (num_colorant == GX_DEVICE_COLOR_MAX_COMPONENTS)
- num_colorant = -1;
- return num_colorant;
- }
-
- /*
* Check if this is the default component
*/
if (check_name("Default", pname, name_size))
return GX_DEVICE_COLOR_MAX_COMPONENTS;
+ if (check_cmyk_color_model_comps(dev))
+ color_component_type = SEPARATION_NAME; /* allow separations to be added */
+
+ /*
+ * Check if this is a device colorant.
+ */
/* Halftones set by setcolorscreen, and (we think) */
- /* Type 2 and Type 4 halftones, are supposed to work */
+ /* Type 2, 4, and 5 halftones, are supposed to work */
/* for both RGB and CMYK, so we need a special check here. */
if (halftonetype == ht_type_colorscreen ||
- halftonetype == ht_type_multiple_colorscreen) {
+ halftonetype == ht_type_multiple_colorscreen ||
+ (halftonetype == ht_type_multiple && devn)) {
+ /* Note that Red, Green, Blue and/or Gray can be added using setcolorspace */
+ /* we just don't automatically add it as a result of sethalftone */
+ /* The NO_COMP_NAME_TYPE_HT won't add colorants */
if (check_name("Red", pname, name_size))
- num_colorant = check_colorant_name(dev, "Cyan");
+ num_colorant = check_colorant_name(dev, "Cyan", NO_COMP_NAME_TYPE_HT);
else if (check_name("Green", pname, name_size))
- num_colorant = check_colorant_name(dev, "Magenta");
+ num_colorant = check_colorant_name(dev, "Magenta", NO_COMP_NAME_TYPE_HT);
else if (check_name("Blue", pname, name_size))
- num_colorant = check_colorant_name(dev, "Yellow");
+ num_colorant = check_colorant_name(dev, "Yellow", NO_COMP_NAME_TYPE_HT);
else if (check_name("Gray", pname, name_size))
- num_colorant = check_colorant_name(dev, "Black");
+ num_colorant = check_colorant_name(dev, "Black", NO_COMP_NAME_TYPE_HT);
+ }
+ if (num_colorant < 0)
+ num_colorant = check_colorant_name_length(dev, pname, name_size, color_component_type);
+
+ if (num_colorant >= 0) {
/*
* The device will return GX_DEVICE_COLOR_MAX_COMPONENTS if the
* colorant is logically present in the device but not being used
@@ -701,12 +702,12 @@ gs_color_name_component_number(gx_device * dev, const char * pname,
*/
if (num_colorant == GX_DEVICE_COLOR_MAX_COMPONENTS)
num_colorant = -1;
-
+ return num_colorant;
+ }
#undef check_colorant_name
#undef check_colorant_name_length
#undef check_name
- }
return num_colorant;
}
diff --git a/base/lib.mak b/base/lib.mak
index b3c5cf718..60d92509e 100644
--- a/base/lib.mak
+++ b/base/lib.mak
@@ -1011,7 +1011,7 @@ $(GLOBJ)gsgcache.$(OBJ) : $(GLSRC)gsgcache.c $(AK) $(gx_h)\
$(GLCC) $(GLO_)gsgcache.$(OBJ) $(C_) $(GLSRC)gsgcache.c
$(GLOBJ)gsht.$(OBJ) : $(GLSRC)gsht.c $(AK) $(gx_h) $(gserrors_h)\
- $(memory__h) $(string__h) $(gsstruct_h) $(gsutil_h) $(gxarith_h)\
+ $(memory__h) $(string__h) $(gsstruct_h) $(gsutil_h) $(gxarith_h) $(gxdevsop_h)\
$(gxdevice_h) $(gzht_h) $(gzstate_h) $(gxfmap_h) $(gp_h) $(LIB_MAK) $(MAKEDIRS)
$(GLCC) $(GLO_)gsht.$(OBJ) $(C_) $(GLSRC)gsht.c