diff options
author | 2017-10-31 13:49:14 -0400 | |
---|---|---|
committer | 2017-10-31 18:13:04 +0000 | |
commit | f78b55cb94f4ac89b76a26d5a56d6380aa8fea6b (patch) | |
tree | 46f0d0bdae4d61a601f6b6d30982fe3d6f39cbd9 /src/core | |
parent | e7ac58c0d5d4585912b2fc26c2d692c6f3c28199 (diff) |
Simplify SkColorSpace::MakeICC
Rather than restricting the supported ICC types in MakeICC, create any
ICC type that we support, and make the client reject them as necessary
by querying the SkColorSpace::Type.
Remove ICCTypeFlag and replace uses of it with SkColorSpace::Type.
This depends on a change in Chromium
(https://chromium-review.googlesource.com/c/chromium/src/+/741843).
Without that, this change will start allowing non-CMYK images to use
CMYK profiles.
Bug: 727128
Change-Id: I085b4665e49bc80083264496d864cc4cd62ae914
Reviewed-on: https://skia-review.googlesource.com/64841
Commit-Queue: Leon Scroggins <scroggo@google.com>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/SkColorSpaceXform_A2B.cpp | 4 | ||||
-rw-r--r-- | src/core/SkColorSpace_A2B.cpp | 4 | ||||
-rw-r--r-- | src/core/SkColorSpace_A2B.h | 8 | ||||
-rw-r--r-- | src/core/SkColorSpace_Base.h | 7 | ||||
-rw-r--r-- | src/core/SkColorSpace_ICC.cpp | 34 |
5 files changed, 16 insertions, 41 deletions
diff --git a/src/core/SkColorSpaceXform_A2B.cpp b/src/core/SkColorSpaceXform_A2B.cpp index cc80145af1..3543ba40a3 100644 --- a/src/core/SkColorSpaceXform_A2B.cpp +++ b/src/core/SkColorSpaceXform_A2B.cpp @@ -112,10 +112,10 @@ SkColorSpaceXform_A2B::SkColorSpaceXform_A2B(SkColorSpace_A2B* srcSpace, #endif int currentChannels; switch (srcSpace->iccType()) { - case SkColorSpace_Base::kRGB_ICCTypeFlag: + case SkColorSpace::kRGB_Type: currentChannels = 3; break; - case SkColorSpace_Base::kCMYK_ICCTypeFlag: { + case SkColorSpace::kCMYK_Type: { currentChannels = 4; // CMYK images from JPEGs (the only format that supports it) are actually // inverted CMYK, so we need to invert every channel. diff --git a/src/core/SkColorSpace_A2B.cpp b/src/core/SkColorSpace_A2B.cpp index 7e097ffa80..b5d8d37747 100644 --- a/src/core/SkColorSpace_A2B.cpp +++ b/src/core/SkColorSpace_A2B.cpp @@ -7,12 +7,12 @@ #include "SkColorSpace_A2B.h" -SkColorSpace_A2B::SkColorSpace_A2B(ICCTypeFlag iccType, std::vector<Element> elements, +SkColorSpace_A2B::SkColorSpace_A2B(SkColorSpace::Type iccType, std::vector<Element> elements, PCS pcs, sk_sp<SkData> profileData) : INHERITED(std::move(profileData)) , fICCType(iccType) , fElements(std::move(elements)) , fPCS(pcs) { - SkASSERT(kRGB_ICCTypeFlag == iccType || kCMYK_ICCTypeFlag == iccType); + SkASSERT(SkColorSpace::kRGB_Type == iccType || SkColorSpace::kCMYK_Type == iccType); } diff --git a/src/core/SkColorSpace_A2B.h b/src/core/SkColorSpace_A2B.h index 5f2800796a..08784c23bb 100644 --- a/src/core/SkColorSpace_A2B.h +++ b/src/core/SkColorSpace_A2B.h @@ -52,7 +52,7 @@ public: bool onGammaIsLinear() const override { return false; } bool onIsNumericalTransferFn(SkColorSpaceTransferFn* coeffs) const override { return false; } - bool onIsCMYK() const override { return kCMYK_ICCTypeFlag == fICCType; } + bool onIsCMYK() const override { return SkColorSpace::kCMYK_Type == fICCType; } sk_sp<SkColorSpace> makeLinearGamma() const override { // TODO: Analyze the extrema of our projection into XYZ and use suitable primaries? @@ -161,13 +161,13 @@ public: PCS pcs() const { return fPCS; } - ICCTypeFlag iccType() const { return fICCType; } + SkColorSpace::Type iccType() const { return fICCType; } - SkColorSpace_A2B(ICCTypeFlag iccType, std::vector<Element> elements, PCS pcs, + SkColorSpace_A2B(SkColorSpace::Type iccType, std::vector<Element> elements, PCS pcs, sk_sp<SkData> profileData); private: - ICCTypeFlag fICCType; + SkColorSpace::Type fICCType; std::vector<Element> fElements; PCS fPCS; diff --git a/src/core/SkColorSpace_Base.h b/src/core/SkColorSpace_Base.h index 015e95f8a1..32e12b4717 100644 --- a/src/core/SkColorSpace_Base.h +++ b/src/core/SkColorSpace_Base.h @@ -187,13 +187,6 @@ public: virtual Type type() const = 0; - typedef uint8_t ICCTypeFlag; - static constexpr ICCTypeFlag kRGB_ICCTypeFlag = 1 << 0; - static constexpr ICCTypeFlag kCMYK_ICCTypeFlag = 1 << 1; - static constexpr ICCTypeFlag kGray_ICCTypeFlag = 1 << 2; - - static sk_sp<SkColorSpace> MakeICC(const void* input, size_t len, ICCTypeFlag type); - static sk_sp<SkColorSpace> MakeRGB(SkGammaNamed gammaNamed, const SkMatrix44& toXYZD50); enum Named : uint8_t { diff --git a/src/core/SkColorSpace_ICC.cpp b/src/core/SkColorSpace_ICC.cpp index 72592d6444..78318f6a56 100644 --- a/src/core/SkColorSpace_ICC.cpp +++ b/src/core/SkColorSpace_ICC.cpp @@ -1180,11 +1180,11 @@ bool load_a2b0_lutn_type(std::vector<SkColorSpace_A2B::Element>* elements, const return true; } -static inline int icf_channels(SkColorSpace_Base::ICCTypeFlag iccType) { +static inline int icf_channels(SkColorSpace::Type iccType) { switch (iccType) { - case SkColorSpace_Base::kRGB_ICCTypeFlag: + case SkColorSpace::kRGB_Type: return 3; - case SkColorSpace_Base::kCMYK_ICCTypeFlag: + case SkColorSpace::kCMYK_Type: return 4; default: SkASSERT(false); @@ -1194,7 +1194,7 @@ static inline int icf_channels(SkColorSpace_Base::ICCTypeFlag iccType) { static bool load_a2b0(std::vector<SkColorSpace_A2B::Element>* elements, const uint8_t* src, size_t len, SkColorSpace_A2B::PCS pcs, - SkColorSpace_Base::ICCTypeFlag iccType) { + SkColorSpace::Type iccType) { if (len < 4) { return false; } @@ -1472,7 +1472,7 @@ static sk_sp<SkColorSpace> make_gray(const ICCProfileHeader& header, ICCTag* tag toXYZD50, std::move(profileData))); } -static sk_sp<SkColorSpace> make_a2b(SkColorSpace_Base::ICCTypeFlag iccType, +static sk_sp<SkColorSpace> make_a2b(SkColorSpace::Type iccType, const ICCProfileHeader& header, ICCTag* tags, int tagCount, const uint8_t* base, sk_sp<SkData> profileData) { const ICCTag* a2b0 = ICCTag::Find(tags, tagCount, kTAG_A2B0); @@ -1491,11 +1491,6 @@ static sk_sp<SkColorSpace> make_a2b(SkColorSpace_Base::ICCTypeFlag iccType, } sk_sp<SkColorSpace> SkColorSpace::MakeICC(const void* input, size_t len) { - return SkColorSpace_Base::MakeICC(input, len, SkColorSpace_Base::kRGB_ICCTypeFlag); -} - -sk_sp<SkColorSpace> SkColorSpace_Base::MakeICC(const void* input, size_t len, - ICCTypeFlag desiredType) { if (!input || len < kICCHeaderSize) { return_null("Data is null or not large enough to contain an ICC profile"); } @@ -1543,38 +1538,25 @@ sk_sp<SkColorSpace> SkColorSpace_Base::MakeICC(const void* input, size_t len, } } + Type a2b_type = kRGB_Type; switch (header.fInputColorSpace) { case kRGB_ColorSpace: { - if (!(kRGB_ICCTypeFlag & desiredType)) { - return_null("Provided input color format (RGB) does not match profile."); - } - sk_sp<SkColorSpace> colorSpace = make_xyz(header, tags.get(), tagCount, base, profileData); if (colorSpace) { return colorSpace; } - - desiredType = kRGB_ICCTypeFlag; break; } case kGray_ColorSpace: { - if (!(kGray_ICCTypeFlag & desiredType)) { - return_null("Provided input color format (Gray) does not match profile."); - } - return make_gray(header, tags.get(), tagCount, base, profileData); } case kCMYK_ColorSpace: - if (!(kCMYK_ICCTypeFlag & desiredType)) { - return_null("Provided input color format (CMYK) does not match profile."); - } - - desiredType = kCMYK_ICCTypeFlag; + a2b_type = kCMYK_Type; break; default: return_null("ICC profile contains unsupported colorspace"); } - return make_a2b(desiredType, header, tags.get(), tagCount, base, profileData); + return make_a2b(a2b_type, header, tags.get(), tagCount, base, profileData); } |