| 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,
|
|
|