summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'base/gscspace.h')
-rw-r--r--base/gscspace.h394
1 files changed, 394 insertions, 0 deletions
diff --git a/base/gscspace.h b/base/gscspace.h
new file mode 100644
index 00000000..c46ffdbc
--- /dev/null
+++ b/base/gscspace.h
@@ -0,0 +1,394 @@
+/* Copyright (C) 2001-2019 Artifex Software, Inc.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied,
+ modified or distributed except as expressly authorized under the terms
+ of the license contained in the file LICENSE in this distribution.
+
+ Refer to licensing information at http://www.artifex.com or contact
+ Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
+ CA 94945, U.S.A., +1(415)492-9861, for further information.
+*/
+
+
+/* Client interface to color spaces */
+
+#ifndef gscspace_INCLUDED
+# define gscspace_INCLUDED
+
+#include "gsmemory.h"
+#include "gsiparam.h"
+#include "gsrefct.h"
+#include "gsgstate.h"
+#include "gsccolor.h"
+
+/*
+ * Previous versions had a complicated lifecycle discipline for
+ * colorspaces. All that is now replaced with a simple allocation and
+ * reference counting discipline. All colorspace objects are allocated
+ * on the heap and reference counted. References to colorspace objects
+ * are pointers. There is no stack allocation, inline allocation inside
+ * structs, or copying of contents.
+ */
+
+/*
+ * Here is the information associated with the various color space
+ * structures. Note that DevicePixel, DeviceN, and the ability to use
+ * Separation or DeviceN spaces as the base space of an Indexed space
+ * are LanguageLevel 3 additions. Unfortunately, the terminology for the
+ * different levels of generality is confusing and inconsistent for
+ * historical reasons.
+ *
+ * For base spaces:
+ *
+ * Space Space parameters Color parameters
+ * ----- ---------------- ----------------
+ * DeviceGray (none) 1 real [0-1]
+ * DeviceRGB (none) 3 reals [0-1]
+ * DeviceCMYK (none) 4 reals [0-1]
+ * DevicePixel depth 1 int [up to depth bits]
+ * CIEBasedDEFG dictionary 4 reals
+ * CIEBasedDEF dictionary 3 reals
+ * CIEBasedABC dictionary 3 reals
+ * CIEBasedA dictionary 1 real
+ *
+ * For non-base direct spaces:
+ *
+ * Space Space parameters Color parameters
+ * ----- ---------------- ----------------
+ *
+ * Separation name, alt_space, tint_xform 1 real [0-1]
+ * DeviceN names, alt_space, tint_xform N reals
+ *
+ * For non-direct paint spaces:
+ *
+ * Space Space parameters Color parameters
+ * ----- ---------------- ----------------
+ * Indexed base_space, hival, lookup 1 int [0-hival]
+ * ICCBased dictionary, alt_space 1, 3, or 4 reals
+ *
+ * For non-paint spaces:
+ *
+ * Space Space parameters Color parameters
+ * ----- ---------------- ----------------
+ * Pattern colored: (none) dictionary
+ * uncolored: base_space dictionary + base space params
+ */
+
+/* In moving to a pure ICC based color management every color space
+ (or its base space) will be defined by an ICC profile. All modern
+ CMMs provide a handle to a profile structure when handed an
+ ICC profile. This handle will become a new member variable for
+ ghostscripts color space structure. When that profile is initialized
+ depends upon the color space type.
+
+ a) If the color space is defined to be ICC based, then the profile handle
+ will be obtained during the installation of this space.
+
+ b) If the color space is a defined as deviceRGB, CMYK or Gray color space, then
+ the profile handle will be populated with the handle for the ICC profile that
+ is in the ICC manager for that color space type.
+
+ c) If the color space is defined as one of the Postscript or PDF CIE (nonICC)
+ color spaces, then the profile handle will only be obtained once a request is made
+ to obtain a link that includes this color space. At that point
+ we will convert the nonICC colorspace to an ICC color space.
+
+ d) DevicePixel color space appears to only be used by the image3x code
+ for the softmask. Really this should be a Gray color space that is
+ never really linked as we do not want a pure alpha image to be
+ colorimetrically managed. Need to do a bit of code/history review to
+ understand what this space is. It may need to be specially managed. It never
+ is used in a linked transformation.
+
+ e) DeviceN is related somewhat to the colorspaces in b) but a bit different.
+ PDF does not provide the capability for definining DeviceN source colors
+ with an ICC profile. XPS and OpenXPS do, and it is likely that SVG will
+ do so too. Also, it may become possible in future PDF versions to define
+ DeviceN source colors with and ICC profile.
+ To support these cases when creating a deviceN color space, it
+ will need to be possible to include the ICC information related to that
+ color space. When it is provided, the handle for that color space will
+ be obtained from the CMM similar to the ICC spaces in a) . Note that the
+ output device can effectively be DeviceN, which is the process colorants.
+ In this case, we will have the CMM handle for the profile in the ICC manager
+ and that will be used for the device's color space.
+
+ f) Indexed and Pattern. These will not have an ICC CMM handle. Their base
+ space will however.
+
+ g) Separation. These can have an ICC CMM handle. The exact capabilities
+ depend upon the form of the Named color structure that the CMM is going
+ to use. If it is using a traditional ICC named color profile and the entry
+ for the color name is there, then we will have a handle to the named
+ color profile. If the color is not there and the device does not have
+ this color in its list of colors that it "understands", then we have
+ to use the alternate tint transform. At the extreme end, we could have
+ a named color structure that includes for each named color a 1CLR ICC profile.
+ Such a profile maps the tint values to CIELAB values. In this case,
+ the ICC CMM handle for the Separation space would be this profile. Note that
+ XPS has to have an ICC profile for a "Named" Color Space.
+
+*/
+
+/* Opaque types for a graphics state stuff */
+typedef struct gsicc_link_s gsicc_link_t;
+
+/* Define ICC profile structure type */
+typedef struct cmm_profile_s cmm_profile_t;
+
+typedef struct cmm_dev_profile_s cmm_dev_profile_t;
+
+/*
+ * Define color space type indices. NOTE: PostScript code (gs_res.ps,
+ * gs_ll3.ps) and the color space substitution code (gscssub.[hc] and its
+ * clients) assumes values 0-2 for DeviceGray/RGB/CMYK respectively.
+ */
+typedef enum {
+
+ /* Supported in all configurations */
+ gs_color_space_index_DeviceGray = 0,
+ gs_color_space_index_DeviceRGB,
+
+ /* Supported in extended Level 1, and in Level 2 and above */
+ gs_color_space_index_DeviceCMYK,
+
+ /* Supported in LanguageLevel 3 only */
+ gs_color_space_index_DevicePixel,
+ gs_color_space_index_DeviceN,
+
+ /* Supported in Level 2 and above only */
+ /* DEC C truncates identifiers at 32 characters, so.... */
+ gs_color_space_index_CIEDEFG,
+ gs_color_space_index_CIEDEF,
+ gs_color_space_index_CIEABC,
+ gs_color_space_index_CIEA,
+ gs_color_space_index_Separation,
+ gs_color_space_index_Indexed,
+ gs_color_space_index_Pattern,
+
+ /* Supported in PDF 1.3 and later only */
+ gs_color_space_index_ICC
+
+} gs_color_space_index;
+
+/* We define the names only for debugging printout. */
+#define GS_COLOR_SPACE_TYPE_NAMES\
+ "DeviceGray", "DeviceRGB", "DeviceCMYK", "DevicePixel", "DeviceN",\
+ "CIEBasedDEFG", "CIEBasedDEF", "CIEBasedABC", "CIEBasedA",\
+ "Separation", "Indexed", "Pattern", "ICCBased"
+
+/* Define an abstract type for color space types (method structures). */
+typedef struct gs_color_space_type_s gs_color_space_type;
+
+/*
+ * Parameters for "small" base color spaces. Of the small base color spaces,
+ * only DevicePixel and CIE spaces have parameters: see gscie.h for the
+ * structure definitions for CIE space parameters.
+ *
+ * It would be possible to save an allocation by placing the CIE
+ * params inside the colorspace struct, rather than a pointer to a
+ * separate struct, but we'll keep it the way it is for now.
+ */
+typedef struct gs_device_pixel_params_s {
+ int depth;
+} gs_device_pixel_params;
+typedef struct gs_cie_a_s gs_cie_a;
+typedef struct gs_cie_abc_s gs_cie_abc;
+typedef struct gs_cie_def_s gs_cie_def;
+typedef struct gs_cie_defg_s gs_cie_defg;
+
+typedef struct gs_device_n_map_s gs_device_n_map;
+typedef struct gs_device_n_colorant_s gs_device_n_colorant;
+
+/*
+ * Non-base direct color spaces: Separation and DeviceN.
+ * These include a base alternative color space.
+ */
+typedef ulong gs_separation_name; /* BOGUS */
+
+/*
+ * Define callback function for graphics library to ask
+ * interpreter about character string representation of
+ * component names. This is used for comparison of component
+ * names with similar objects like ProcessColorModel colorant
+ * names.
+ */
+typedef int (gs_callback_func_get_colorname_string)
+ (const gs_memory_t *mem, gs_separation_name colorname, unsigned char **ppstr, unsigned int *plen);
+
+typedef enum { SEP_NONE, SEP_ALL, SEP_OTHER } separation_type;
+typedef enum { SEP_ENUM, SEP_MIX, SEP_PURE_RGB, SEP_PURE_CMYK } separation_colors;
+
+typedef struct gs_separation_params_s {
+ gs_memory_t *mem;
+ char *sep_name;
+ gs_device_n_map *map;
+ separation_type sep_type;
+ bool use_alt_cspace;
+ bool named_color_supported;
+ separation_colors color_type;
+} gs_separation_params;
+
+typedef enum {
+ gs_devicen_DeviceN,
+ gs_devicen_NChannel
+} gs_devicen_subtype;
+
+typedef struct gs_device_n_params_s {
+ gs_memory_t *mem;
+ uint num_components;
+ char **names;
+ gs_device_n_map *map;
+ bool use_alt_cspace;
+ bool named_color_supported;
+ separation_colors color_type;
+ gs_devicen_subtype subtype;
+ gs_device_n_colorant *colorants;
+ gs_color_space *devn_process_space;
+ uint num_process_names;
+ char **process_names;
+} gs_device_n_params;
+
+/* Define an abstract type for the client color space data */
+typedef struct client_color_space_data_s client_color_space_data_t;
+
+/*
+ * Non-direct paint space: Indexed space.
+ *
+ * Note that for indexed color spaces, hival is the highest support index,
+ * which is one less than the number of entries in the palette (as defined
+ * in PostScript).
+ */
+
+typedef struct gs_indexed_map_s gs_indexed_map;
+
+typedef struct gs_indexed_params_s {
+ int hival; /* num_entries - 1 */
+ int n_comps;
+ union {
+ gs_const_string table; /* size is implicit */
+ gs_indexed_map *map;
+ } lookup;
+ bool use_proc; /* 0 = use table, 1 = use proc & map */
+} gs_indexed_params;
+
+/*
+ * Pattern parameter set. This may contain an instances of a paintable
+ * color space. The boolean indicates if this is the case.
+ */
+typedef struct gs_pattern_params_s {
+ bool has_base_space; /* {csrc} can't we just NULL-check the base_space? */
+} gs_pattern_params;
+
+/* id's 1 through 4 are reserved for static colorspaces; thus, dynamically
+ assigned id's must begin at 5. */
+#define cs_DeviceGray_id 1
+#define cs_DeviceRGB_id 3
+#define cs_DeviceCMYK_id 4
+
+/*
+ * The colorspace object. For pattern and indexed colorspaces, the
+ * base_space refers to the underlying colorspace. For separation,
+ * deviceN, and icc colorspaces, base_space refers to the alternate
+ * colorspace (referred to as alt_space in previous versions of the
+ * code).
+ */
+struct gs_color_space_s {
+ const gs_color_space_type *type;
+ rc_header rc;
+ gs_id id;
+ gs_color_space *base_space;
+ gs_color_space *icc_equivalent;
+ client_color_space_data_t *pclient_color_space_data;
+ cmm_profile_t *cmm_icc_profile_data;
+ union {
+ gs_device_pixel_params pixel;
+ gs_cie_defg * defg;
+ gs_cie_def * def;
+ gs_cie_abc * abc;
+ gs_cie_a * a;
+ gs_separation_params separation;
+ gs_device_n_params device_n;
+ gs_indexed_params indexed;
+ gs_pattern_params pattern;
+
+ } params;
+};
+
+ /*extern_st(st_color_space); *//* in gxcspace.h */
+#define public_st_color_space() /* in gscspace.c */ \
+ gs_public_st_composite_final( st_color_space, \
+ gs_color_space, \
+ "gs_color_space", \
+ color_space_enum_ptrs, \
+ color_space_reloc_ptrs, \
+ gs_cspace_final \
+ )
+
+/* ---------------- Procedures ---------------- */
+
+/* Constructors for simple device color spaces. These return NULL on
+ VMerror. */
+
+gs_color_space *gs_cspace_new_DeviceGray(gs_memory_t *mem);
+gs_color_space *gs_cspace_new_DeviceRGB(gs_memory_t *mem);
+gs_color_space *gs_cspace_new_DeviceCMYK(gs_memory_t *mem);
+gs_color_space *gs_cspace_new_ICC(gs_memory_t *pmem, gs_gstate * pgs,
+ int components);
+gs_color_space *gs_cspace_new_scrgb(gs_memory_t *pmem, gs_gstate * pgs);
+
+/* ------ Accessors ------ */
+
+/* Get the index of a color space. */
+gs_color_space_index gs_color_space_get_index(const gs_color_space *);
+
+/* Tell if the space is CIE or ICC based */
+bool gs_color_space_is_CIE(const gs_color_space * pcs);
+bool gs_color_space_is_ICC(const gs_color_space * pcs);
+bool gs_color_space_is_PSCIE(const gs_color_space * pcs);
+int gs_colorspace_set_icc_equivalent(gs_color_space *pcs, bool *islab,
+ gs_memory_t *memory);
+
+/* Get the number of components in a color space. */
+int gs_color_space_num_components(const gs_color_space *);
+
+/*
+ * Test whether two color spaces are equal. Note that this test is
+ * conservative: if it returns true, the color spaces are definitely
+ * equal, while if it returns false, they might still be equivalent.
+ */
+bool gs_color_space_equal(const gs_color_space *pcs1,
+ const gs_color_space *pcs2);
+
+/* Restrict a color to its legal range. */
+void gs_color_space_restrict_color(gs_client_color *, const gs_color_space *);
+
+/*
+ * Get the base space of an Indexed or uncolored Pattern color space, or the
+ * alternate space of a Separation or DeviceN space. Return NULL if the
+ * color space does not have a base/alternative color space.
+ */
+const gs_color_space *gs_cspace_base_space(const gs_color_space * pcspace);
+
+const gs_color_space *gs_cspace_devn_process_space(const gs_color_space * pcspace);
+
+/* Abstract the rc_increment and rc_decrement for color spaces so that we also rc_increment
+ the ICC profile if there is one associated with the color space */
+
+void rc_increment_cs(gs_color_space *pcs);
+
+void rc_decrement_cs(gs_color_space *pcs, const char *cname);
+
+void rc_decrement_only_cs(gs_color_space *pcs, const char *cname);
+
+void cs_adjust_counts_icc(gs_gstate *pgs, int delta);
+
+/* backwards compatibility */
+#define gs_color_space_indexed_base_space(pcspace)\
+ gs_cspace_base_space(pcspace)
+
+#endif /* gscspace_INCLUDED */