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