Index: src/codec/SkMaskSwizzler.cpp |
diff --git a/src/codec/SkMaskSwizzler.cpp b/src/codec/SkMaskSwizzler.cpp |
index d0bb646740a10a2a484a324524a85f2e1d9daee9..31fd2cf81e0d9caaf11bece4ce3fd9bb7eacb01e 100644 |
--- a/src/codec/SkMaskSwizzler.cpp |
+++ b/src/codec/SkMaskSwizzler.cpp |
@@ -63,6 +63,24 @@ static SkSwizzler::ResultAlpha swizzle_mask16_to_n32_premul( |
return COMPUTE_RESULT_ALPHA; |
} |
+// TODO (msarett): We have promoted a two byte per pixel image to 8888, only to |
+// convert it back to 565. Instead, we should swizzle to 565 directly. |
+static SkSwizzler::ResultAlpha swizzle_mask16_to_565( |
+ void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
+ |
+ // Use the masks to decode to the destination |
+ uint16_t* srcPtr = (uint16_t*) srcRow; |
+ uint16_t* dstPtr = (uint16_t*) dstRow; |
+ for (int i = 0; i < width; i++) { |
+ uint16_t p = srcPtr[i]; |
+ uint8_t red = masks->getRed(p); |
+ uint8_t green = masks->getGreen(p); |
+ uint8_t blue = masks->getBlue(p); |
+ dstPtr[i] = SkPack888ToRGB16(red, green, blue); |
+ } |
+ return SkSwizzler::kOpaque_ResultAlpha; |
+} |
+ |
static SkSwizzler::ResultAlpha swizzle_mask24_to_n32_opaque( |
void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
@@ -114,6 +132,21 @@ static SkSwizzler::ResultAlpha swizzle_mask24_to_n32_premul( |
return COMPUTE_RESULT_ALPHA; |
} |
+static SkSwizzler::ResultAlpha swizzle_mask24_to_565( |
+ void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
+ |
+ // Use the masks to decode to the destination |
+ uint16_t* dstPtr = (uint16_t*) dstRow; |
+ for (int i = 0; i < 3*width; i += 3) { |
+ uint32_t p = srcRow[i] | (srcRow[i + 1] << 8) | srcRow[i + 2] << 16; |
+ uint8_t red = masks->getRed(p); |
+ uint8_t green = masks->getGreen(p); |
+ uint8_t blue = masks->getBlue(p); |
+ dstPtr[i/3] = SkPack888ToRGB16(red, green, blue); |
+ } |
+ return SkSwizzler::kOpaque_ResultAlpha; |
+} |
+ |
static SkSwizzler::ResultAlpha swizzle_mask32_to_n32_opaque( |
void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
@@ -168,6 +201,21 @@ static SkSwizzler::ResultAlpha swizzle_mask32_to_n32_premul( |
return COMPUTE_RESULT_ALPHA; |
} |
+static SkSwizzler::ResultAlpha swizzle_mask32_to_565( |
+ void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks) { |
+ // Use the masks to decode to the destination |
+ uint32_t* srcPtr = (uint32_t*) srcRow; |
+ uint16_t* dstPtr = (uint16_t*) dstRow; |
+ for (int i = 0; i < width; i++) { |
+ uint32_t p = srcPtr[i]; |
+ uint8_t red = masks->getRed(p); |
+ uint8_t green = masks->getGreen(p); |
+ uint8_t blue = masks->getBlue(p); |
+ dstPtr[i] = SkPack888ToRGB16(red, green, blue); |
+ } |
+ return SkSwizzler::kOpaque_ResultAlpha; |
+} |
+ |
/* |
* |
* Create a new mask swizzler |
@@ -196,6 +244,15 @@ SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler( |
break; |
} |
break; |
+ case kRGB_565_SkColorType: |
+ switch (info.alphaType()) { |
+ case kOpaque_SkAlphaType: |
+ proc = &swizzle_mask16_to_565; |
+ break; |
+ default: |
+ break; |
+ } |
+ break; |
default: |
break; |
} |
@@ -217,6 +274,15 @@ SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler( |
break; |
} |
break; |
+ case kRGB_565_SkColorType: |
+ switch (info.alphaType()) { |
+ case kOpaque_SkAlphaType: |
+ proc = &swizzle_mask24_to_565; |
+ break; |
+ default: |
+ break; |
+ } |
+ break; |
default: |
break; |
} |
@@ -238,6 +304,15 @@ SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler( |
break; |
} |
break; |
+ case kRGB_565_SkColorType: |
+ switch (info.alphaType()) { |
+ case kOpaque_SkAlphaType: |
+ proc = &swizzle_mask32_to_565; |
+ break; |
+ default: |
+ break; |
+ } |
+ break; |
default: |
break; |
} |