diff options
author | msarett <msarett@google.com> | 2016-09-08 11:55:16 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-09-08 11:55:16 -0700 |
commit | 2ecc35ffa5feb56cd088478589ba1e48382b2e1f (patch) | |
tree | 8c07d069af6b7095b0b0fb05519752c594556833 /src/codec/SkCodecPriv.h | |
parent | 6a2b1941c1da272f704439e417f212932eed2004 (diff) |
Checking for valid colorType, alphaType, colorSpace in SkCodec
* Refactor to share code between SkPngCodec and SkWebpCodec
* Didn't end up sharing with SkJpegCodec but did refactor
that code a bit
* Disallow conversions to F16 with non-linear color spaces
* Fail to decode if we fail to create a SkColorSpaceXform
(should be an assert soon). We used to fallback on a
legacy decode if we failed to create the transform.
* A bunch of name changes
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2319293003
Committed: https://skia.googlesource.com/skia/+/7a9900d6d34e437bb24beb5524a1f6488ae138c9
Review-Url: https://codereview.chromium.org/2319293003
Diffstat (limited to 'src/codec/SkCodecPriv.h')
-rw-r--r-- | src/codec/SkCodecPriv.h | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/src/codec/SkCodecPriv.h b/src/codec/SkCodecPriv.h index 9a8a43e835..5845256457 100644 --- a/src/codec/SkCodecPriv.h +++ b/src/codec/SkCodecPriv.h @@ -107,14 +107,18 @@ static inline bool valid_alpha(SkAlphaType dstAlpha, SkAlphaType srcAlpha) { } /* + * Original version of conversion_possible that does not account for color spaces. + * Used by codecs that have not been updated to support color spaces. + * * Most of our codecs support the same conversions: * - opaque to any alpha type * - 565 only if opaque * - premul to unpremul and vice versa - * - always support N32 + * - always support RGBA, BGRA * - otherwise match the src color type */ -static inline bool conversion_possible(const SkImageInfo& dst, const SkImageInfo& src) { +static inline bool conversion_possible_ignore_color_space(const SkImageInfo& dst, + const SkImageInfo& src) { // Ensure the alpha type is valid if (!valid_alpha(dst.alphaType(), src.alphaType())) { return false; @@ -335,4 +339,41 @@ static inline SkAlphaType select_alpha_xform(SkAlphaType dstAlphaType, SkAlphaTy return (kOpaque_SkAlphaType == srcAlphaType) ? kOpaque_SkAlphaType : dstAlphaType; } +/* + * Alpha Type Conversions + * - kOpaque to kOpaque, kUnpremul, kPremul is valid + * - kUnpremul to kUnpremul, kPremul is valid + * + * Color Type Conversions + * - Always support kRGBA_8888, kBGRA_8888 + * - Support kRGBA_F16 when there is a linear dst color space + * - Support kIndex8 if it matches the src + * - Support k565 if kOpaque and color correction is not required + * - Support k565 if it matches the src, kOpaque, and color correction is not required + */ +static inline bool conversion_possible(const SkImageInfo& dst, const SkImageInfo& src) { + // Ensure the alpha type is valid. + if (!valid_alpha(dst.alphaType(), src.alphaType())) { + return false; + } + + // Check for supported color types. + switch (dst.colorType()) { + case kRGBA_8888_SkColorType: + case kBGRA_8888_SkColorType: + return true; + case kRGBA_F16_SkColorType: + return dst.colorSpace() && dst.colorSpace()->gammaIsLinear(); + case kIndex_8_SkColorType: + return kIndex_8_SkColorType == src.colorType(); + case kRGB_565_SkColorType: + return kOpaque_SkAlphaType == src.alphaType() && !needs_color_xform(dst, src); + case kGray_8_SkColorType: + return kGray_8_SkColorType == src.colorType() && + kOpaque_SkAlphaType == src.alphaType() && !needs_color_xform(dst, src); + default: + return false; + } +} + #endif // SkCodecPriv_DEFINED |