Imagine you are a printer vendor and want to include in your profiles a private tag for storing the ink consumption. So, you register a private tag with ICC, and you get signature "inkc".
Ok, now you want to store this tag as a Lut16Type, so it will be driven by PCS and return one channel giving the relative ink consumption by color.
Writing a plugin in lcms2 will allow cmsReadTag and cmsWriteTag to deal with you new data exactly as any other standard tag.
To do so, you have to fill a cmsPluginTag structure to declare the plugin. This structure is formed by a base, which is common to all plug-ins.
plugin.base.Magic = cmsPluginMagicNumber;
plugin.base.ExpectedVersion = 2.0;
plugin.base.Type = cmsPluginTagSig;
That latter identifies your plug-in as "tag type". Now we need to define the tag signature
plugin.signature = 'inkc';
And some additional info about the type used by your tag:
- How many instances of the type the tag is going to hold (usually one)
- in how many different types the tag may come (again, usually one)
- and then the needed type(s).
plugin.descriptor. ElemCount = 1;
plugin.descriptor. nSupportedTypes = 1;
plugin.descriptor.SupportedTypes = cmsSigLut16Type;
That is all. You can setup the new functionality by calling
Advanced tag plug-ins may use polymorphic types, depending on the version of the profile for example. Instead of one type, you can declare several. Then the read tag logic will search for all supported types to find the suitable one. cmsSigLut16Type for v2 and cmsSigLutBtoAType for v4 for example. There is an optional callback function to decide which type to use when writing the tag.
cmsTagTypeSignature DecideType(double ICCVersion, const void *Data);
This plugin is most useful when combined with the tag type plugin, which will be discussed soon.