Index: src/codec/SkCodecPriv.h |
diff --git a/src/codec/SkCodecPriv.h b/src/codec/SkCodecPriv.h |
index 9a8a43e8352a7d9a783ba9a6a343bf278266eb8a..5845256457c10c8999879ae9c1641a62b90d3ea8 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 |