Chromium Code Reviews| 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; |
| } |