// Populate a named color list with usual component names. // I am using the first Colorant channel to store the range, but it works since // this space is not used anyway. static cmsNAMEDCOLORLIST* ComponentNames(cmsColorSpaceSignature space, cmsBool IsInput) { cmsNAMEDCOLORLIST* out; int i, n; char Buffer[cmsMAX_PATH]; out = cmsAllocNamedColorList(0, 12, cmsMAXCHANNELS, "", ""); if (out == NULL) return NULL; switch (space) { case cmsSigXYZData: SetRange(100, IsInput); cmsAppendNamedColor(out, "X", NULL, NULL); cmsAppendNamedColor(out, "Y", NULL, NULL); cmsAppendNamedColor(out, "Z", NULL, NULL); break; case cmsSigLabData: SetRange(1, IsInput); cmsAppendNamedColor(out, "L*", NULL, NULL); cmsAppendNamedColor(out, "a*", NULL, NULL); cmsAppendNamedColor(out, "b*", NULL, NULL); break; case cmsSigLuvData: SetRange(1, IsInput); cmsAppendNamedColor(out, "L", NULL, NULL); cmsAppendNamedColor(out, "u", NULL, NULL); cmsAppendNamedColor(out, "v", NULL, NULL); break; case cmsSigYCbCrData: SetRange(255, IsInput); cmsAppendNamedColor(out, "Y", NULL, NULL ); cmsAppendNamedColor(out, "Cb", NULL, NULL); cmsAppendNamedColor(out, "Cr", NULL, NULL); break; case cmsSigYxyData: SetRange(1, IsInput); cmsAppendNamedColor(out, "Y", NULL, NULL); cmsAppendNamedColor(out, "x", NULL, NULL); cmsAppendNamedColor(out, "y", NULL, NULL); break; case cmsSigRgbData: SetRange(255, IsInput); cmsAppendNamedColor(out, "R", NULL, NULL); cmsAppendNamedColor(out, "G", NULL, NULL); cmsAppendNamedColor(out, "B", NULL, NULL); break; case cmsSigGrayData: SetRange(255, IsInput); cmsAppendNamedColor(out, "G", NULL, NULL); break; case cmsSigHsvData: SetRange(255, IsInput); cmsAppendNamedColor(out, "H", NULL, NULL); cmsAppendNamedColor(out, "s", NULL, NULL); cmsAppendNamedColor(out, "v", NULL, NULL); break; case cmsSigHlsData: SetRange(255, IsInput); cmsAppendNamedColor(out, "H", NULL, NULL); cmsAppendNamedColor(out, "l", NULL, NULL); cmsAppendNamedColor(out, "s", NULL, NULL); break; case cmsSigCmykData: SetRange(1, IsInput); cmsAppendNamedColor(out, "C", NULL, NULL); cmsAppendNamedColor(out, "M", NULL, NULL); cmsAppendNamedColor(out, "Y", NULL, NULL); cmsAppendNamedColor(out, "K", NULL, NULL); break; case cmsSigCmyData: SetRange(1, IsInput); cmsAppendNamedColor(out, "C", NULL, NULL); cmsAppendNamedColor(out, "M", NULL, NULL); cmsAppendNamedColor(out, "Y", NULL, NULL); break; default: SetRange(1, IsInput); n = cmsChannelsOf(space); for (i=0; i < n; i++) { sprintf(Buffer, "Channel #%d", i + 1); cmsAppendNamedColor(out, Buffer, NULL, NULL); } } return out; }
/** * cd_util_create_named_color: **/ static gboolean cd_util_create_named_color (CdUtilPrivate *priv, CdDom *dom, const GNode *root, GError **error) { CdColorLab lab; cmsNAMEDCOLORLIST *nc2 = NULL; cmsUInt16Number pcs[3]; const GNode *name; const GNode *named; const GNode *prefix; const GNode *suffix; const GNode *tmp; gboolean ret = TRUE; priv->lcms_profile = cmsCreateNULLProfileTHR (cd_icc_get_context (priv->icc)); if (priv->lcms_profile == NULL) { ret = FALSE; g_set_error_literal (error, 1, 0, "failed to create NULL profile"); goto out; } cmsSetDeviceClass(priv->lcms_profile, cmsSigNamedColorClass); cmsSetPCS (priv->lcms_profile, cmsSigLabData); cmsSetColorSpace (priv->lcms_profile, cmsSigLabData); /* create a named color structure */ prefix = cd_dom_get_node (dom, root, "prefix"); suffix = cd_dom_get_node (dom, root, "suffix"); nc2 = cmsAllocNamedColorList (NULL, 1, /* will realloc more as required */ 3, prefix != NULL ? cd_dom_get_node_data (prefix) : "", suffix != NULL ? cd_dom_get_node_data (suffix) : ""); named = cd_dom_get_node (dom, root, "named"); if (named == NULL) { ret = FALSE; g_set_error_literal (error, 1, 0, "XML error: missing named"); goto out; } for (tmp = named->children; tmp != NULL; tmp = tmp->next) { name = cd_dom_get_node (dom, tmp, "name"); if (name == NULL) { ret = FALSE; g_set_error_literal (error, 1, 0, "XML error: missing name"); goto out; } ret = cd_dom_get_node_lab (tmp, &lab); if (!ret) { ret = FALSE; g_set_error (error, 1, 0, "XML error: missing Lab for %s", cd_dom_get_node_data (name)); goto out; } /* PCS = colours in PCS colour space CIE*Lab * colorant = colours in device colour space */ cmsFloat2LabEncoded (pcs, (cmsCIELab *) &lab); ret = cmsAppendNamedColor (nc2, cd_dom_get_node_data (name), pcs, pcs); g_assert (ret); } cmsWriteTag (priv->lcms_profile, cmsSigNamedColor2Tag, nc2); out: if (nc2 != NULL) cmsFreeNamedColorList (nc2); return ret; }