void createColorTransform(const ColorProfile& colorProfile, bool hasAlpha, bool sRGB) { clearColorTransform(); if (colorProfile.isEmpty() && !sRGB) return; qcms_profile* deviceProfile = ImageDecoder::qcmsOutputDeviceProfile(); if (!deviceProfile) return; qcms_profile* inputProfile = 0; if (!colorProfile.isEmpty()) inputProfile = qcms_profile_from_memory(colorProfile.data(), colorProfile.size()); else inputProfile = qcms_profile_sRGB(); if (!inputProfile) return; // We currently only support color profiles for RGB and RGBA images. ASSERT(rgbData == qcms_profile_get_color_space(inputProfile)); if (qcms_profile_match(inputProfile, deviceProfile)) { qcms_profile_release(inputProfile); return; } // FIXME: Don't force perceptual intent if the image profile contains an intent. qcms_data_type dataFormat = hasAlpha ? QCMS_DATA_RGBA_8 : QCMS_DATA_RGB_8; m_transform = qcms_transform_create(inputProfile, dataFormat, deviceProfile, dataFormat, QCMS_INTENT_PERCEPTUAL); qcms_profile_release(inputProfile); }
void createColorTransform(const ColorProfile& colorProfile, bool hasAlpha) { if (m_transform) qcms_transform_release(m_transform); m_transform = 0; if (colorProfile.isEmpty()) return; qcms_profile* deviceProfile = ImageDecoder::qcmsOutputDeviceProfile(); if (!deviceProfile) return; qcms_profile* inputProfile = qcms_profile_from_memory(colorProfile.data(), colorProfile.size()); if (!inputProfile) return; // We currently only support color profiles for RGB profiled images. ASSERT(icSigRgbData == qcms_profile_get_color_space(inputProfile)); qcms_data_type dataFormat = hasAlpha ? QCMS_DATA_RGBA_8 : QCMS_DATA_RGB_8; // FIXME: Don't force perceptual intent if the image profile contains an intent. m_transform = qcms_transform_create(inputProfile, dataFormat, deviceProfile, dataFormat, QCMS_INTENT_PERCEPTUAL); qcms_profile_release(inputProfile); }
static CGColorSpaceRef createColorSpace(const ColorProfile& colorProfile) { RetainPtr<CFDataRef> data(AdoptCF, CFDataCreate(kCFAllocatorDefault, reinterpret_cast<const UInt8*>(colorProfile.data()), colorProfile.size())); #ifndef TARGETING_LEOPARD return CGColorSpaceCreateWithICCProfile(data.get()); #else RetainPtr<CGDataProviderRef> profileDataProvider(AdoptCF, CGDataProviderCreateWithCFData(data.get())); CGFloat ranges[] = {0.0, 255.0, 0.0, 255.0, 0.0, 255.0}; return CGColorSpaceCreateICCBased(3, ranges, profileDataProvider.get(), deviceRGBColorSpaceRef()); #endif }