[cairo] Spot colors (and CMYK)

Kai-Uwe Behrmann ku.b at gmx.de
Wed Feb 17 21:51:37 PST 2010

Am 17.02.10, 21:55 +0100 schrieb ecir hana:
> On Wed, Feb 17, 2010 at 9:31 PM, Kai-Uwe Behrmann <ku.b at gmx.de> wrote:
>> I would think of working space and blending space as synonym. It is changed
>> only if the blending/editing/working space is different from that specified
>> in the CMS or say sRGB. So it can be specified but might not be specified
>> and all works nevertheless.
> Ok, so but why do I need to allocate each new color? Just set the
> working space and call:
> cairo_set_source_native_channels(cairo_t *cr, double *native_channels);

Well I have decided in Oyranos to reference all colour data with a 
profile. This makes communication very explicite. The overhead is minimal 
as profiles are typically referenced not copied.
A profile should not change during building cairos drawing graph. 
Following this a backend A would imediately draw with the colour and 
forget cairo_color_t. Backend B had to copy the structure for remembering. 
The overhead for backend B would be the cairo_color_t + the channels 
doubles and a call to reference cairo_profile_t.
(The cairo_color_t * argument is owned by the caller and can be changed on 
user side at any time.)

/* a small sequence */
cairo_color_t * colour = cairo_color_create( /**/ );
cairo_source_color_set( cr, color );
cairo_rectangle( cr, /**/ );
cairo_color_set_native_channels( color, 0.2, 0.2, 0.2, 1.0 );
cairo_set_source_color( cr, color );
cairo_rectangle( cr, /**/ );
cairo_color_set_native_channels( color, 0.5, 0.5, 0.5, 1.0 );
cairo_set_source_color( cr, color );
cairo_rectangle( cr, /**/ );

With your model backend B had to track colour space changes itself. It 
would end in eigther do the same as I outlined above behind the scenes. Or 
cairo had to maintain a internal table for storing each colour value plus 
the according cairo_profile_t reference. So eigther way some overhead 
would remain.

Maybe I am a bit object oriented from my style of programming. And it is 
about personal taste, explicite code versus shorter arguments.

> or even better:
> cairo_set_source_native_channels(cairo_t *cr, ...);
> No?
>> Cairo definately not alone. lcms or ColorSync or WCS, each qualifies.
> I personally think, *if* there has to be CMS then lcms is the only
> option because, contrary to what others have said above, it seems to
> me rather difficult to get CMS working across platforms.. But I might
> be wrong....

The ICC spec is designed to work crossplatform. So a wrapper can be made 
to allow for accessing a local CMS of choice. Its would be in analogy of 
the font engine selection.

> But still, what exactly do you propose? How would the relationship to
> lcms look like? How to maintain a fork of it especially for Cairo?

My preference would be CMS hooks in cairo. This makes colour in cairo very 

A fork of lcms is undesireable. Distributors prefere libraries not static 
linking. Maintainance would be easier.

> What about releases? Because that's the problem of every Linux distro,
> which, if not CMS itself, is completely out of Cairo's scope, I would
> say.

Hooks would be part of cairos API. The CMS would be on the user side. In 
comparision Pango is the same way independent.

If a linking to lcms is prefered by cairo maintainers, then I would say 
the lcms maintainer has provided a very stable API. Its a solid choice.

>> "display" would be a colour conversion?
> Yes.
>> Then at least the backend should know how to convert.
> But it could be application responsibility, not beckend's.

How can a app hook into backends? Personally I considerd their output as 
pretty final.

kind regards
Kai-Uwe Behrmann
developing for colour management 
www.behrmann.name + www.oyranos.org

More information about the cairo mailing list