/* currentcmykcolor */ int gs_currentcmykcolor(const gs_state *pgs, float pr4[4]) { const gs_client_color *pcc = pgs->ccolor; switch ( pgs->color_space->type->index ) { case gs_color_space_index_DeviceGray: pr4[0] = pr4[1] = pr4[2] = 0.0; pr4[3] = 1.0 - pcc->paint.values[0]; break; case gs_color_space_index_DeviceRGB: { frac fcmyk[4]; color_rgb_to_cmyk( float2frac(pcc->paint.values[0]), float2frac(pcc->paint.values[1]), float2frac(pcc->paint.values[2]), (const gs_imager_state *)pgs, fcmyk); pr4[0] = frac2float(fcmyk[0]); pr4[1] = frac2float(fcmyk[1]); pr4[2] = frac2float(fcmyk[2]); pr4[3] = frac2float(fcmyk[3]); } break; case gs_color_space_index_DeviceCMYK: pr4[0] = pcc->paint.values[0]; pr4[1] = pcc->paint.values[1]; pr4[2] = pcc->paint.values[2]; pr4[3] = pcc->paint.values[3]; break; default: pr4[0] = pr4[1] = pr4[2] = 0.0; pr4[3] = 1.0; } return 0; }
static void rgb_cs_to_spotn_cm(gx_device * dev, const gs_imager_state *pis, frac r, frac g, frac b, frac out[]) { /* TO_DO_DEVICEN This routine needs to include the effects of the SeparationOrder array */ xcf_device *xdev = (xcf_device *)dev; int n = xdev->separation_names.num_names; icmLuBase *luo = xdev->lu_rgb; int i; if (luo != NULL) { double in[3]; double tmp[MAX_CHAN]; int outn = xdev->lu_rgb_outn; in[0] = frac2float(r); in[1] = frac2float(g); in[2] = frac2float(b); luo->lookup(luo, tmp, in); for (i = 0; i < outn; i++) out[i] = float2frac(tmp[i]); for (; i < n + 4; i++) out[i] = 0; } else { frac cmyk[4]; color_rgb_to_cmyk(r, g, b, pis, cmyk); cmyk_cs_to_spotn_cm(dev, cmyk[0], cmyk[1], cmyk[2], cmyk[3], out); } }
static void rgb_cs_to_spotn_cm(gx_device * dev, const gs_imager_state *pis, frac r, frac g, frac b, frac out[]) { /* TO_DO_DEVICEN This routine needs to include the effects of the SeparationOrder array */ xcf_device *xdev = (xcf_device *)dev; int n = xdev->separation_names.num_names; gcmmhlink_t link = xdev->rgb_icc_link; int i; if (link != NULL) { unsigned short in[3]; unsigned short tmp[MAX_CHAN]; int outn = xdev->rgb_profile->num_comps_out; in[0] = frac2ushort(r); in[1] = frac2ushort(g); in[2] = frac2ushort(b); gscms_transform_color(dev, link, &(in[0]), &(tmp[0]), 2); for (i = 0; i < outn; i++) out[i] = ushort2frac(tmp[i]); for (; i < n + 4; i++) out[i] = 0; } else { frac cmyk[4]; color_rgb_to_cmyk(r, g, b, pis, cmyk, dev->memory); cmyk_cs_to_spotn_cm(dev, cmyk[0], cmyk[1], cmyk[2], cmyk[3], out); } }
static void rgb_cs_to_perm_cm_0(gx_device *dev, const gs_imager_state *pis, frac r, frac g, frac b, frac out[]) { color_rgb_to_cmyk(r, g, b, pis, out, dev->memory); perm_permute_cm(dev, out); }
static void cmap_rgb_capture_cmyk_color(frac r, frac g, frac b, gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev, gs_color_select_t select) { equivalent_cmyk_color_params * pparams = ((color_capture_device *)dev)->pequiv_cmyk_colors; int sep_num = ((color_capture_device *)dev)->sep_num; frac cmyk[4]; color_rgb_to_cmyk(r, g, b, pis, cmyk); save_spot_equivalent_cmyk_color(sep_num, pparams, cmyk); }
static void rgb_cs_to_spotcmyk_cm(gx_device * dev, const gs_imager_state *pis, frac r, frac g, frac b, frac out[]) { /* TO_DO_DEVICEN This routine needs to include the effects of the SeparationOrder array */ xcf_device *xdev = (xcf_device *)dev; int n = xdev->separation_names.num_names; int i; color_rgb_to_cmyk(r, g, b, pis, out); for(i = 0; i < n; i++) /* Clear spot colors */ out[4 + i] = 0; }