/* Render a CIEBasedDEF color. */ int gx_concretize_CIEDEF(const gs_client_color * pc, const gs_color_space * pcs_in, frac * pconc, const gs_imager_state * pis, gx_device *dev) { int code; gs_color_space *pcs_icc; gs_client_color scale_pc; gs_color_space *pcs = (gs_color_space *) pcs_in; if_debug3('c', "[c]concretize DEF [%g %g %g]\n", pc->paint.values[0], pc->paint.values[1], pc->paint.values[2]); /* If we are comming in here then we have not completed the conversion of the DEF space to an ICC type. We will finish that process now. */ if (pcs->icc_equivalent == NULL) { code = gx_ciedef_to_icc(&pcs_icc, pcs, pis->memory->stable_memory); } else { pcs_icc = pcs->icc_equivalent; } /* Rescale the input based upon the input range since profile is created to remap this range from 0 to 1 */ if (check_range(&(pcs->params.def->RangeDEF.ranges[0]), 3)) { return((pcs_icc->type->concretize_color)(pc, pcs_icc, pconc, pis, dev)); } /* Do the rescale from 0 to 1 */ rescale_input_color(&(pcs->params.def->RangeDEF.ranges[0]), 3, pc, &scale_pc); /* Now the icc remap */ return((pcs_icc->type->concretize_color)(&scale_pc, pcs_icc, pconc, pis, dev)); }
/* Call for cases where the equivalent icc color space needs to be set */ int gs_colorspace_set_icc_equivalent(gs_color_space *pcs, bool *islab, gs_memory_t *memory) { gs_color_space_index color_space_index = gs_color_space_get_index(pcs); gs_color_space *picc_cs; *islab = false; /* For non CIEABC cases */ if (pcs->icc_equivalent != NULL || !gs_color_space_is_PSCIE(pcs)) { return(0); } switch( color_space_index ) { case gs_color_space_index_CIEDEFG: gx_ciedefg_to_icc(&picc_cs, pcs, memory->stable_memory); break; case gs_color_space_index_CIEDEF: gx_ciedef_to_icc(&picc_cs, pcs, memory->stable_memory); break; case gs_color_space_index_CIEABC: gx_cieabc_to_icc(&picc_cs, pcs, islab, memory->stable_memory); break; case gs_color_space_index_CIEA: gx_ciea_to_icc(&picc_cs, pcs, memory->stable_memory); break; default: /* do nothing. Sould never happen */ break; } return(0); }
int gx_remap_CIEDEF(const gs_client_color * pc, const gs_color_space * pcs_in, gx_device_color * pdc, const gs_imager_state * pis, gx_device * dev, gs_color_select_t select) { gs_color_space *pcs_icc; gs_client_color scale_pc; int i,code; gs_color_space *pcs = (gs_color_space *) pcs_in; if_debug3m('c', pis->memory, "[c]remap CIEDEF [%g %g %g]\n", pc->paint.values[0], pc->paint.values[1], pc->paint.values[2]); /* If we are comming in here then we have not completed the conversion of the DEF space to an ICC type. We will finish that process now. */ if (pcs->icc_equivalent == NULL) { code = gx_ciedef_to_icc(&pcs_icc, pcs, pis->memory->stable_memory); if (code < 0) return gs_rethrow(code, "Failed to build ICC profile from CIEDEF"); } else { pcs_icc = pcs->icc_equivalent; } /* Rescale the input based upon the input range since profile is created to remap this range from 0 to 1 */ if (check_range(&(pcs->params.def->RangeDEF.ranges[0]), 3)) { return (pcs_icc->type->remap_color)(pc,pcs_icc,pdc,pis,dev,select); } /* Do the rescale from 0 to 1 */ rescale_input_color(&(pcs->params.def->RangeDEF.ranges[0]), 3, pc, &scale_pc); /* Now the icc remap */ code = (pcs_icc->type->remap_color)(&scale_pc,pcs_icc,pdc,pis,dev,select); /* Save unscaled data for high level device (e.g. pdfwrite) */ for (i = 0; i < 3; i++) pdc->ccolor.paint.values[i] = pc->paint.values[i]; pdc->ccolor_valid = true; return code; }