Index: src/core/SkImageInfo.cpp |
diff --git a/src/core/SkImageInfo.cpp b/src/core/SkImageInfo.cpp |
index 88f1ed65c6704f2347b0dc540e48804b64c5db1c..948575482362410f65fc3eef09be8e7927921b7b 100644 |
--- a/src/core/SkImageInfo.cpp |
+++ b/src/core/SkImageInfo.cpp |
@@ -10,6 +10,57 @@ |
#include "SkReadBuffer.h" |
#include "SkWriteBuffer.h" |
+/* |
+ * We store this as a byte in the ImageInfo flatten buffer. |
+ */ |
+enum class SkFlattenColorSpaceEnum { |
+ kUnspecified, |
+ kSRGB, |
+ kAdobe1998, |
+ // ... add more here |
+ kLastEnum = kAdobe1998, |
+ // final value means the actual profile data follows the info |
+ kICCProfile = 0xFF, |
+}; |
+ |
+static sk_sp<SkColorSpace> make_from_enum(SkFlattenColorSpaceEnum value) { |
+ switch (value) { |
+ case SkFlattenColorSpaceEnum::kSRGB: |
+ return SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named); |
+ case SkFlattenColorSpaceEnum::kAdobe1998: |
+ return SkColorSpace::NewNamed(SkColorSpace::kAdobeRGB_Named); |
+ default: |
+ return nullptr; |
+ } |
+} |
+ |
+SkColorSpace::Named sk_deduce_named_from_colorspace(SkColorSpace* cs) { |
+ return cs->fNamed; |
+} |
+ |
+static SkFlattenColorSpaceEnum deduce_from_colorspace(SkColorSpace* cs) { |
+ if (!cs) { |
+ return SkFlattenColorSpaceEnum::kUnspecified; |
+ } |
+ switch (sk_deduce_named_from_colorspace(cs)) { |
+ case SkColorSpace::kSRGB_Named: |
+ return SkFlattenColorSpaceEnum::kSRGB; |
+ case SkColorSpace::kAdobeRGB_Named: |
+ return SkFlattenColorSpaceEnum::kAdobe1998; |
+ default: |
+ return SkFlattenColorSpaceEnum::kICCProfile; |
+ } |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////////////////////////// |
+ |
+#ifdef SK_SUPPORT_LEGACY_COLORPROFILETYPE |
+SkColorProfileType SkImageInfo::profileType() const { |
+ return fColorSpace && fColorSpace->gammaCloseToSRGB() |
+ ? kSRGB_SkColorProfileType : kLinear_SkColorProfileType; |
+} |
+#endif |
+ |
// Indicate how images and gradients should interpret colors by default. |
bool gDefaultProfileIsSRGB; |
@@ -18,10 +69,6 @@ SkColorProfileType SkDefaultColorProfile() { |
: kLinear_SkColorProfileType; |
} |
-static bool profile_type_is_valid(SkColorProfileType profileType) { |
- return (profileType >= 0) && (profileType <= kLastEnum_SkColorProfileType); |
-} |
- |
static bool alpha_type_is_valid(SkAlphaType alphaType) { |
return (alphaType >= 0) && (alphaType <= kLastEnum_SkAlphaType); |
} |
@@ -30,19 +77,8 @@ static bool color_type_is_valid(SkColorType colorType) { |
return (colorType >= 0) && (colorType <= kLastEnum_SkColorType); |
} |
-SkImageInfo SkImageInfo::Make(int width, int height, SkColorType ct, SkAlphaType at, |
- sk_sp<SkColorSpace> cs) { |
- SkColorProfileType pt = SkDefaultColorProfile(); |
- // try to keep the enum and the colorspace in sync. |
- // TODO: eliminate the enum entirely, now that we have colorspace objects |
- if (cs && (SkColorSpace::kLinear_GammaNamed != cs->gammaNamed())) { |
- pt = kSRGB_SkColorProfileType; |
- } |
- return SkImageInfo(width, height, ct, at, pt, std::move(cs)); |
-} |
- |
SkImageInfo SkImageInfo::MakeS32(int width, int height, SkAlphaType at) { |
- return SkImageInfo(width, height, kN32_SkColorType, at, kSRGB_SkColorProfileType, |
+ return SkImageInfo(width, height, kN32_SkColorType, at, |
SkColorSpace::NewNamed(SkColorSpace::kSRGB_Named)); |
} |
@@ -52,23 +88,43 @@ void SkImageInfo::unflatten(SkReadBuffer& buffer) { |
uint32_t packed = buffer.read32(); |
SkASSERT(0 == (packed >> 24)); |
- fProfileType = (SkColorProfileType)((packed >> 16) & 0xFF); |
- fAlphaType = (SkAlphaType)((packed >> 8) & 0xFF); |
fColorType = (SkColorType)((packed >> 0) & 0xFF); |
- buffer.validate(profile_type_is_valid(fProfileType) && |
- alpha_type_is_valid(fAlphaType) && |
- color_type_is_valid(fColorType)); |
+ fAlphaType = (SkAlphaType)((packed >> 8) & 0xFF); |
+ SkFlattenColorSpaceEnum csenum = (SkFlattenColorSpaceEnum)((packed >> 16) & 0xFF); |
+ buffer.validate(alpha_type_is_valid(fAlphaType) && color_type_is_valid(fColorType)); |
+ |
+ if (SkFlattenColorSpaceEnum::kICCProfile == csenum) { |
+ SkASSERT(false); // we shouldn't hit this yet, as we don't write these yet |
+ fColorSpace.reset(); |
+ } else { |
+ if (csenum > SkFlattenColorSpaceEnum::kLastEnum) { |
+ csenum = SkFlattenColorSpaceEnum::kUnspecified; |
+ } |
+ fColorSpace = make_from_enum(csenum); |
+ } |
} |
void SkImageInfo::flatten(SkWriteBuffer& buffer) const { |
buffer.write32(fWidth); |
buffer.write32(fHeight); |
- SkASSERT(0 == (fProfileType & ~0xFF)); |
+ SkFlattenColorSpaceEnum csenum = deduce_from_colorspace(fColorSpace.get()); |
+ |
+ // TODO: when we actually support flattening the colorspace to a profile blob, remove this |
+ // hack (and write the blob after we write packed. |
+ if (SkFlattenColorSpaceEnum::kICCProfile == csenum) { |
+ csenum = SkFlattenColorSpaceEnum::kUnspecified; |
+ } |
+ |
+ SkASSERT(0 == ((int)csenum & ~0xFF)); |
SkASSERT(0 == (fAlphaType & ~0xFF)); |
SkASSERT(0 == (fColorType & ~0xFF)); |
- uint32_t packed = (fProfileType << 16) | (fAlphaType << 8) | fColorType; |
+ uint32_t packed = ((int)csenum << 16) | (fAlphaType << 8) | fColorType; |
buffer.write32(packed); |
+ |
+ if (SkFlattenColorSpaceEnum::kICCProfile == csenum) { |
+ // TODO: write the ICCProfile blob |
+ } |
} |
bool SkColorTypeValidateAlphaType(SkColorType colorType, SkAlphaType alphaType, |