/* Used for when we have to mash entire transform to CIEXYZ */ int gx_psconcretize_CIEABC(const gs_client_color * pc, const gs_color_space * pcs, frac * pconc, const gs_imager_state * pis) { const gs_cie_abc *pcie = pcs->params.abc; cie_cached_vector3 vec3; int code; if_debug3('c', "[c]concretize CIEABC [%g %g %g]\n", pc->paint.values[0], pc->paint.values[1], pc->paint.values[2]); code = gx_cie_check_rendering_inline(pcs, pconc, pis); if (code < 0) return code; if (code == 1) return 0; vec3.u = float2cie_cached(pc->paint.values[0]); vec3.v = float2cie_cached(pc->paint.values[1]); vec3.w = float2cie_cached(pc->paint.values[2]); if (!pis->cie_joint_caches->skipDecodeABC) cie_lookup_map3(&vec3 /* ABC => LMN */, &pcie->caches.DecodeABC, "Decode/MatrixABC"); GX_CIE_REMAP_FINISH(vec3, pconc, pis, pcs); return 0; }
/* Used for when we have to mash entire transform to CIEXYZ */ int gx_psconcretize_CIEA(const gs_client_color * pc, const gs_color_space * pcs, frac * pconc, const gs_imager_state * pis) { const gs_cie_a *pcie = pcs->params.a; cie_cached_value a = float2cie_cached(pc->paint.values[0]); cie_cached_vector3 vlmn; int code; if_debug1('c', "[c]concretize CIEA %g\n", pc->paint.values[0]); code = gx_cie_check_rendering_inline(pcs, pconc, pis); if (code < 0) return code; if (code == 1) return 0; /* Apply DecodeA and MatrixA. */ if (!pis->cie_joint_caches->skipDecodeABC) vlmn = *LOOKUP_ENTRY(a, &pcie->caches.DecodeA); else vlmn.u = vlmn.v = vlmn.w = a; GX_CIE_REMAP_FINISH(vlmn, pconc, pis, pcs); return 0; }
/* * Convert an ICCBased color space to a concrete color space. */ static int gx_concretize_CIEICC( const gs_client_color * pcc, const gs_color_space * pcs, frac * pconc, const gs_imager_state * pis ) { const gs_icc_params * picc_params = &pcs->params.icc; const gs_cie_icc * picc_info = picc_params->picc_info; stream * instrp = picc_info->instrp; icc * picc = picc_info->picc; double inv[4], outv[3]; cie_cached_vector3 vlmn; gs_client_color lcc = *pcc; int i, ncomps = picc_info->num_components; int code; /* use the altenate space concretize if appropriate */ if (picc == NULL) return pcs->base_space->type->concretize_color( pcc, pcs->base_space, pconc, pis ); /* set up joint cache as required */ code = gx_cie_check_rendering(pcs, pconc, pis); if (code < 0) return code; if (code == 1) return 0; /* verify and update the stream pointer */ if (picc_info->file_id != (instrp->read_id | instrp->write_id)) return_error(gs_error_ioerror); ((icmFileGs *)picc->fp)->strp = instrp; /* translate the input components */ gx_restrict_CIEICC(&lcc, pcs); for (i = 0; i < ncomps; i++) inv[i] = lcc.paint.values[i]; /* Since the original limits were wrong for this case, we need to adjust things a bit different */ /* For input Lab color space massage the values into Lab range */ /* if (picc_info->plu->e_inSpace == icSigLabData) { inv[0] *= 100; inv[1] = inv[1]*255 - 128; inv[2] = inv[2]*255 - 128; } */ /* * Perform the lookup operation. A return value of 1 indicates that * clipping occurred somewhere in the operation, but the result is * legitimate. Other non-zero return values indicate an error, which * should not occur in practice. */ if (picc_info->plu->lookup(picc_info->plu, outv, inv) > 1) return_error(gs_error_unregistered); /* if the output is in the CIE L*a*b* space, convert to XYZ */ if (picc_info->pcs_is_cielab) { floatp f[3]; const gs_vector3 * pwhtpt = &picc_info->common.points.WhitePoint; f[1] = (outv[0] + 16.0) / 116.0; f[0] = f[1] + outv[1] / 500.0; f[2] = f[1] - outv[2] / 200; for (i = 0; i < 3; i++) { if (f[i] >= 6.0 / 29.0) outv[i] = f[i] * f[i] * f[i]; else outv[i] = 108.0 * (f[i] - 4.0 / 29.0) / 841.0; } /* * The connection space white-point is known to be D50, but we * use the more general form in case of future revisions. */ outv[0] *= pwhtpt->u; outv[1] *= pwhtpt->v; outv[2] *= pwhtpt->w; } /* translate the output */ vlmn.u = float2cie_cached(outv[0]); vlmn.v = float2cie_cached(outv[1]); vlmn.w = float2cie_cached(outv[2]); gx_cie_remap_finish(vlmn, pconc, pis, pcs); return 0; }