This example provides a core color management module that implements a collection of custom color spaces that may be used by the setinterceptcolorspace
and setreproduction
color operators.
More...
Files | |
file | cmm_example.h |
An example core color management module which implements its own custom color spaces. | |
file | cmm_example.c |
Simple example showing how to create and use custom color spaces using the core color management module interface. | |
file | cmm_examplepriv.h |
Header for linking the custom color space module with the Hybrid module. | |
Functions | |
sw_cmm_api * | exampleccs_getInstance (void) |
Return the singleton instance of a sw_cmm_api object containing details specific to the Custom Color Space example module. More... | |
static sw_cmm_result | ccs_construct (sw_cmm_instance *instance) |
Construct an instance of the sw_cmm_api interface. More... | |
static sw_cmm_result | ccs_open_profile (sw_cmm_instance *instance, sw_blob_instance *ICC_profile, sw_cmm_profile *handle) |
Create an internal profile structure for ICC profile data stored in memory. More... | |
void | ccs_close_profile (sw_cmm_instance *instance, sw_cmm_profile profile) |
Close a profile with a handle previously created with ccs_open_custom_colorspace(). More... | |
sw_cmm_custom_colorspace * | ccs_declare_custom_colorspace (sw_cmm_instance *instance, uint32 index) |
Declare a custom color space to the RIP. More... | |
sw_cmm_result | ccs_open_custom_colorspace (sw_cmm_instance *instance, uint32 index, sw_cmm_profile *handle) |
Create an internal profile structure for a custom colorspace. More... | |
sw_cmm_result | ccs_open_transform (sw_cmm_instance *instance, sw_cmm_profile profiles[], uint32 num_profiles, int32 intents[], HqBool black_point_compensations[], uint32 *num_input_channels, uint32 *num_output_channels, sw_cmm_transform *handle) |
Create a transform structure. More... | |
void | ccs_close_transform (sw_cmm_instance *instance, sw_cmm_transform transform) |
Close a transform previously opened with ccs_open_transform(). More... | |
sw_cmm_result | ccs_invoke_transform (sw_cmm_instance *instance, sw_cmm_transform transform, float *input_data, float *output_data, uint32 num_pixels) |
Use the specified transform to adjust color data. More... | |
This example provides a core color management module that implements a collection of custom color spaces that may be used by the setinterceptcolorspace
and setreproduction
color operators.
There are 5 custom color spaces that are implemented in this module:
To configure the RIP to use this color management module, use this fragment in the configuration PostScript:
An example configuration using this alternate CMM is provided for use with the "clrip" application, in SW/TestConfig/CMYKCMMComposite300dpi
. It is configured to use InvertColors as distributed, but can be changed to use BrightenColors or IdentityMap by editing a line in the configuration file. Comment out the /InputColorSpace
options you do not require by prefixing the line with %
, leaving one line enabled:
% Enable one of the following /InputColorSpace lines /InputColorSpace [ /CMM (InvertColors) /DeviceRGB /DeviceRGB ] % /InputColorSpace [ /CMM (BrightenColors) /DeviceRGB /DeviceRGB ] % /InputColorSpace [ /CMM (IdentityMap) /DeviceRGB /DeviceRGB ]
When using the IdentityMap option, the output may differ from when the custom CMM example configuration is not used. This is because this configuration also specifies some ICC profiles.
This example module is registered by calling SwRegisterCMM() with the singleton API instance returned by exampleccs_getInstance(). The module implements the CMM API methods ccs_construct(), ccs_open_profile(), ccs_close_profile(), ccs_declare_custom_colorspace(), ccs_open_custom_colorspace(), ccs_open_transform(), ccs_close_transform() and ccs_invoke_transform().
void ccs_close_profile | ( | sw_cmm_instance * | instance, |
sw_cmm_profile | profile | ||
) |
Close a profile with a handle previously created with ccs_open_custom_colorspace().
[in] | instance | The alternate CMM instance owning the profile. |
[in] | profile | A profile handle previous opened by an open_profile() or open_custom_colorspace() calls on the same alternate CMM instance. The alternate CMM implementation should discard any resources associated with the profile. |
void ccs_close_transform | ( | sw_cmm_instance * | instance, |
sw_cmm_transform | transform | ||
) |
Close a transform previously opened with ccs_open_transform().
[in] | instance | The alternate CMM instance owning the color transform. |
[in] | transform | A valid transform handle created by an open_transform() or open_transform2() call on the same alternate CMM instance. The alternate CMM implementation should discard any resources associated with the transform. |
|
static |
Construct an instance of the sw_cmm_api interface.
The RIP constructs an instance for each CMM module after booting the interpreter. RIP fills in the implementation pointer, and pointers to the memory API and blob API instances. The module is expected to fill in the remaining fields, which contains flags defining of the implementation capabilities of the module. Some of the information returned will be used by the RIP to determine whether a particular profile or transform can be handled by this module, and in other cases the RIP will use this information to divert color conversions through its built-in CMM if appropriate.
[in,out] | instance | An incomplete instance of the sw_cmm_instance structure to complete. The RIP will allocate a structure of the size presented in the implementation's sw_cmm_api::info.instance_size field, fill in the implementation and callback API instance pointers, and then pass it to this routine. The construct() method is expected to fill in the remaining fields. The implementation may sub-class the instance to allocate private workspace by initialising the implementation's sw_cmm_api::info.instance_size larger than the size of the sw_cmm_instance structure, then downcasting the instance pointer in method calls. |
sw_cmm_custom_colorspace* ccs_declare_custom_colorspace | ( | sw_cmm_instance * | instance, |
uint32 | index | ||
) |
Declare a custom color space to the RIP.
This example code will ensure all custom color spaces are declared.
This method is optional. If this method is not supported, then the open_custom_colorspace() method will never be called.
[in] | instance | An alternate CMM instance queried for custom colorspaces. |
index | A zero-based index used to identify the custom colorspaces defined by the alternate CMM instance. When trying to set custom colorspaces, the RIP will call this method with indices starting at 0, and increasing until either a match is found or this method returns NULL . |
NULL
if the index is out of the range supported by the alternate CMM implementation.sw_cmm_result ccs_invoke_transform | ( | sw_cmm_instance * | instance, |
sw_cmm_transform | transform, | ||
float * | input_data, | ||
float * | output_data, | ||
uint32 | num_pixels | ||
) |
Use the specified transform to adjust color data.
[in] | instance | The alternate CMM instance owning the color transform. |
[in] | transform | A valid transform handle created by an open_transform() call on the same alternate CMM instance. |
[in] | input_data | An array of num_pixels sets of pixel-interleaved color values to transform. Colors are interleaved in the order specified by the input space of the first profile in the transform. |
[out] | output_data | An array in which to store num_pixels sets of pixel-interleaved color values. Colors are interleaved in the order specified by the output space of the last profile in the transform. |
num_pixels | The number of sets of input pixel colorvalues to convert from the input space to the output space of the transform. |
In all cases, both the input and output data should be pixel interleaved with each color value contained in a 32-bit IEEE floating value. The interleaving of the input data is in the same order as that expected by the first profile in a transform and the interleaving of the output data should be in the same order as produced by the last profile in the transform. It is the responsibility of the alternate CMM to marshal the data into and out of the format required for its internal use. As an example, if five pixels of RGB data were to be converted to CMYK, the RIP will arrange the input data as follows:
RGBRGBRGBRGBRGB
and invoke_transform() will produce this arrangement of output data:
CMYKCMYKCMYKCMYKCMYK
The number of channels for each pixel is derived from the first and last profiles in the transform as returned by open_transform().
The memory referenced by input_data and output_data is managed by the RIP and can be assumed to contain valid memory for the appropriate amount of data. The size, in bytes, allocated by the RIP to each is:
num_pixels * num_input_channels * sizeof(float)
num_pixels * num_output_channels * sizeof(float)
sw_cmm_result ccs_open_custom_colorspace | ( | sw_cmm_instance * | instance, |
uint32 | index, | ||
sw_cmm_profile * | handle | ||
) |
Create an internal profile structure for a custom colorspace.
This example initialises a function pointer which is later used to perform the color transform but other implementations may, for example, initialize a lookup table.
The RIP does not interpret the profile handle returned by this call. The profile handle will be passed back to the alternate CMM implementation as a means of identifying the custom colorspace when creating a transform, or closing the profile.
[in] | instance | An alternate CMM instance which previously declared support for the custom colorspace through a call to declare_custom_colorspace(). |
index | A zero-based index used to identify the custom colorspace defined by the alternate CMM instance. | |
[out] | handle | A pointer in which a CMM profile handle is stored. This handle will be used to refer to the profile by close_profile(), open_transform(), and open_transform2(). |
NULL
profile pointer should have been stored in handle. If the profile could not be opened, one of the SW_CMM_RESULT error codes is returned.If a valid profile handle is returned, the close_profile() method will be called to destroy the profile later.
|
static |
Create an internal profile structure for ICC profile data stored in memory.
[in] | instance | The alternate CMM implementation instance owning the ICC profile. |
[in] | ICC_profile | A blob data source, giving access to the raw ICC profile data through the blob's sw_blob_api implementation methods. This blob will have been opened for non-exclusive read access. If the alternate CMM wishes to use the data source after the open_profile() method returns, it must create a new blob reference using the sw_blob_api::open_blob() method, and use that reference for all access after open_profile() terminates. If a new blob reference is created, the alternate CMM implementation must close that reference when it has finished accessing to it. |
[out] | handle | A pointer in which a CMM profile handle is stored. This handle will be used to refer to the profile by close_profile(), open_transform(), and open_transform2(). |
NULL
profile pointer should have been stored in handle. If the profile could not be opened, one of the SW_CMM_RESULT error codes is returned.If a valid profile handle is returned, the close_profile() method will be called to destroy the profile later.
This function always returns SW_CMM_ERROR.
sw_cmm_result ccs_open_transform | ( | sw_cmm_instance * | instance, |
sw_cmm_profile | profiles[], | ||
uint32 | num_profiles, | ||
int32 | intents[], | ||
HqBool | black_point_compensations[], | ||
uint32 * | num_input_channels, | ||
uint32 * | num_output_channels, | ||
sw_cmm_transform * | handle | ||
) |
Create a transform structure.
[in] | instance | The alternate CMM instance owning the profiles. |
[in] | profiles | An array of num_profiles profile handles, returned by calls to open_profile() or open_custom_colorspace(). |
num_profiles | The number of profiles in the transform chain. | |
[in] | intents | An array of length num_profiles-1 specifying the rendering intents use for color conversions between adjacent profiles in the profiles parameter. |
[in] | black_point_compensations | An array of length num_profiles-1 containing boolean flags, indicating if black point compensation is performed when converting colors between adjacent profiles in the profiles parameter. |
[out] | num_input_channels | A location for the alternate CMM to fill in the number of color channels in the input space of the first profile in the transform. |
[out] | num_output_channels | A location for the alternate CMM to fill in the number of color channels in the output space of the last profile in the transform. |
[out] | handle | A pointer in which a CMM transform handle is stored by the alternate CMM implementation. This handle will be used to refer to the transform by close_transform() and invoke_transform() methods. |
NULL
transform pointer should have been stored in handle. If the profile could not be opened, one of the SW_CMM_RESULT error codes is returned.If a valid transform handle is returned, the close_transform() method will be called to destroy the transform later.
sw_cmm_api* exampleccs_getInstance | ( | void | ) |
Return the singleton instance of a sw_cmm_api object containing details specific to the Custom Color Space example module.
If compiled normally, the "clrip" application layer registers this module during RIP startup. CMM module examples may be excluded from "clrip" by building with NO_CMMEG
defined.