summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Sharp <ken.sharp@artifex.com>2018-07-05 16:38:01 +0100
committerKen Sharp <ken.sharp@artifex.com>2018-07-05 16:38:01 +0100
commit62e67ecc475d3648f32d7d8c4459bbabd740ea2b (patch)
treee4dd373a5faf43862723d0d5017c7b410b3eac1b
parent2f8082aa9777a7274c463c6375c2f7d01c299251 (diff)
downloadghostpdl-62e67ecc475d3648f32d7d8c4459bbabd740ea2b.tar.gz
Fix a device subclassing problem with colour mapping procedures
Bug #699520 "Seg fault with customer device utilising device subclassing" When we retrieve colour mapping methods, we need to use the first subclassing device in the chain which does not have a 'default' for the colour mapping methods. This is so that the monochrome palette device in PCL works properly. In contrast, if none of the subclassing devices overrides the colour mapping then we want to use the first non-subclassing device's methods and, importantly, that device as well.
-rw-r--r--base/gxdevcli.h16
1 files changed, 15 insertions, 1 deletions
diff --git a/base/gxdevcli.h b/base/gxdevcli.h
index 2f2cbcdbc..757694c4d 100644
--- a/base/gxdevcli.h
+++ b/base/gxdevcli.h
@@ -1810,11 +1810,25 @@ subclass_parentmost_device(gx_device *dev)
return dev;
}
+extern const gx_cm_color_map_procs *default_subclass_get_color_mapping_procs(const gx_device *dev);
+
static inline
subclass_color_mappings get_color_mapping_procs_subclass(gx_device *dev)
{
subclass_color_mappings sc;
- sc.dev = subclass_parentmost_device(dev);
+ gx_device *d;
+ sc.dev = NULL;
+
+ d = subclass_parentmost_device(dev);
+ while (d->procs.get_color_mapping_procs == default_subclass_get_color_mapping_procs) {
+ if (d->child)
+ d = d->child;
+ else {
+ break;
+ }
+ }
+ sc.dev = d;
+
sc.procs = (gx_cm_color_map_procs *)(dev_proc(sc.dev, get_color_mapping_procs) == NULL ?
NULL : dev_proc(sc.dev, get_color_mapping_procs)(sc.dev));
return sc;