Index: src/codec/SkMaskSwizzler.cpp |
diff --git a/src/codec/SkMaskSwizzler.cpp b/src/codec/SkMaskSwizzler.cpp |
index d0bb646740a10a2a484a324524a85f2e1d9daee9..fca1530fa7ae1b3374e4e56cec3e03bb7dedb599 100644 |
--- a/src/codec/SkMaskSwizzler.cpp |
+++ b/src/codec/SkMaskSwizzler.cpp |
@@ -63,6 +63,22 @@ static SkSwizzler::ResultAlpha swizzle_mask16_to_n32_premul( |
return COMPUTE_RESULT_ALPHA; |
} |
+static SkSwizzler::ResultAlpha swizzle_mask16_to_565( |
msarett
2015/08/10 17:44:24
Would you mind adding a TODO (msarett) here to imp
scroggo
2015/08/10 17:50:45
Done.
|
+ 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 +130,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 +199,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 +242,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 +272,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 +302,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; |
} |