Index: src/codec/SkMaskSwizzler.cpp |
diff --git a/src/codec/SkMaskSwizzler.cpp b/src/codec/SkMaskSwizzler.cpp |
index 7630a7b59f063b403cee46295ee1d59380a88456..2df10ee24cbc8f5d97bf2fd8dbd0e48756dbeffa 100644 |
--- a/src/codec/SkMaskSwizzler.cpp |
+++ b/src/codec/SkMaskSwizzler.cpp |
@@ -9,7 +9,7 @@ |
#include "SkColorPriv.h" |
#include "SkMaskSwizzler.h" |
-static void swizzle_mask16_to_n32_opaque( |
+static void swizzle_mask16_to_rgba_opaque( |
void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
uint32_t startX, uint32_t sampleX) { |
@@ -21,12 +21,29 @@ static void swizzle_mask16_to_n32_opaque( |
uint8_t red = masks->getRed(p); |
uint8_t green = masks->getGreen(p); |
uint8_t blue = masks->getBlue(p); |
- dstPtr[i] = SkPackARGB32NoCheck(0xFF, red, green, blue); |
+ dstPtr[i] = SkPackARGB_as_RGBA(0xFF, red, green, blue); |
srcPtr += sampleX; |
} |
} |
-static void swizzle_mask16_to_n32_unpremul( |
+static void swizzle_mask16_to_bgra_opaque( |
+ void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
+ uint32_t startX, uint32_t sampleX) { |
+ |
+ // Use the masks to decode to the destination |
+ uint16_t* srcPtr = ((uint16_t*) srcRow) + startX; |
+ SkPMColor* dstPtr = (SkPMColor*) dstRow; |
+ for (int i = 0; i < width; i++) { |
+ uint16_t p = srcPtr[0]; |
+ uint8_t red = masks->getRed(p); |
+ uint8_t green = masks->getGreen(p); |
+ uint8_t blue = masks->getBlue(p); |
+ dstPtr[i] = SkPackARGB_as_BGRA(0xFF, red, green, blue); |
+ srcPtr += sampleX; |
+ } |
+} |
+ |
+static void swizzle_mask16_to_rgba_unpremul( |
void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
uint32_t startX, uint32_t sampleX) { |
@@ -39,12 +56,12 @@ static void swizzle_mask16_to_n32_unpremul( |
uint8_t green = masks->getGreen(p); |
uint8_t blue = masks->getBlue(p); |
uint8_t alpha = masks->getAlpha(p); |
- dstPtr[i] = SkPackARGB32NoCheck(alpha, red, green, blue); |
+ dstPtr[i] = SkPackARGB_as_RGBA(alpha, red, green, blue); |
srcPtr += sampleX; |
} |
} |
-static void swizzle_mask16_to_n32_premul( |
+static void swizzle_mask16_to_bgra_unpremul( |
void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
uint32_t startX, uint32_t sampleX) { |
@@ -57,7 +74,43 @@ static void swizzle_mask16_to_n32_premul( |
uint8_t green = masks->getGreen(p); |
uint8_t blue = masks->getBlue(p); |
uint8_t alpha = masks->getAlpha(p); |
- dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); |
+ dstPtr[i] = SkPackARGB_as_BGRA(alpha, red, green, blue); |
+ srcPtr += sampleX; |
+ } |
+} |
+ |
+static void swizzle_mask16_to_rgba_premul( |
+ void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
+ uint32_t startX, uint32_t sampleX) { |
+ |
+ // Use the masks to decode to the destination |
+ uint16_t* srcPtr = ((uint16_t*) srcRow) + startX; |
+ SkPMColor* dstPtr = (SkPMColor*) dstRow; |
+ for (int i = 0; i < width; i++) { |
+ uint16_t p = srcPtr[0]; |
+ uint8_t red = masks->getRed(p); |
+ uint8_t green = masks->getGreen(p); |
+ uint8_t blue = masks->getBlue(p); |
+ uint8_t alpha = masks->getAlpha(p); |
+ dstPtr[i] = premultiply_argb_as_rgba(alpha, red, green, blue); |
+ srcPtr += sampleX; |
+ } |
+} |
+ |
+static void swizzle_mask16_to_bgra_premul( |
+ void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
+ uint32_t startX, uint32_t sampleX) { |
+ |
+ // Use the masks to decode to the destination |
+ uint16_t* srcPtr = ((uint16_t*) srcRow) + startX; |
+ SkPMColor* dstPtr = (SkPMColor*) dstRow; |
+ for (int i = 0; i < width; i++) { |
+ uint16_t p = srcPtr[0]; |
+ uint8_t red = masks->getRed(p); |
+ uint8_t green = masks->getGreen(p); |
+ uint8_t blue = masks->getBlue(p); |
+ uint8_t alpha = masks->getAlpha(p); |
+ dstPtr[i] = premultiply_argb_as_bgra(alpha, red, green, blue); |
srcPtr += sampleX; |
} |
} |
@@ -81,7 +134,41 @@ static void swizzle_mask16_to_565( |
} |
} |
-static void swizzle_mask24_to_n32_opaque( |
+static void swizzle_mask24_to_rgba_opaque( |
+ void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
+ uint32_t startX, uint32_t sampleX) { |
+ |
+ // Use the masks to decode to the destination |
+ srcRow += 3 * startX; |
+ SkPMColor* dstPtr = (SkPMColor*) dstRow; |
+ for (int i = 0; i < width; i++) { |
+ uint32_t p = srcRow[0] | (srcRow[1] << 8) | srcRow[2] << 16; |
+ uint8_t red = masks->getRed(p); |
+ uint8_t green = masks->getGreen(p); |
+ uint8_t blue = masks->getBlue(p); |
+ dstPtr[i] = SkPackARGB_as_RGBA(0xFF, red, green, blue); |
+ srcRow += 3 * sampleX; |
+ } |
+} |
+ |
+static void swizzle_mask24_to_bgra_opaque( |
+ void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
+ uint32_t startX, uint32_t sampleX) { |
+ |
+ // Use the masks to decode to the destination |
+ srcRow += 3 * startX; |
+ SkPMColor* dstPtr = (SkPMColor*) dstRow; |
+ for (int i = 0; i < width; i++) { |
+ uint32_t p = srcRow[0] | (srcRow[1] << 8) | srcRow[2] << 16; |
+ uint8_t red = masks->getRed(p); |
+ uint8_t green = masks->getGreen(p); |
+ uint8_t blue = masks->getBlue(p); |
+ dstPtr[i] = SkPackARGB_as_BGRA(0xFF, red, green, blue); |
+ srcRow += 3 * sampleX; |
+ } |
+} |
+ |
+static void swizzle_mask24_to_rgba_unpremul( |
void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
uint32_t startX, uint32_t sampleX) { |
@@ -93,12 +180,13 @@ static void swizzle_mask24_to_n32_opaque( |
uint8_t red = masks->getRed(p); |
uint8_t green = masks->getGreen(p); |
uint8_t blue = masks->getBlue(p); |
- dstPtr[i] = SkPackARGB32NoCheck(0xFF, red, green, blue); |
+ uint8_t alpha = masks->getAlpha(p); |
+ dstPtr[i] = SkPackARGB_as_RGBA(alpha, red, green, blue); |
srcRow += 3 * sampleX; |
} |
} |
-static void swizzle_mask24_to_n32_unpremul( |
+static void swizzle_mask24_to_bgra_unpremul( |
void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
uint32_t startX, uint32_t sampleX) { |
@@ -111,12 +199,12 @@ static void swizzle_mask24_to_n32_unpremul( |
uint8_t green = masks->getGreen(p); |
uint8_t blue = masks->getBlue(p); |
uint8_t alpha = masks->getAlpha(p); |
- dstPtr[i] = SkPackARGB32NoCheck(alpha, red, green, blue); |
+ dstPtr[i] = SkPackARGB_as_BGRA(alpha, red, green, blue); |
srcRow += 3 * sampleX; |
} |
} |
-static void swizzle_mask24_to_n32_premul( |
+static void swizzle_mask24_to_rgba_premul( |
void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
uint32_t startX, uint32_t sampleX) { |
@@ -129,7 +217,25 @@ static void swizzle_mask24_to_n32_premul( |
uint8_t green = masks->getGreen(p); |
uint8_t blue = masks->getBlue(p); |
uint8_t alpha = masks->getAlpha(p); |
- dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); |
+ dstPtr[i] = premultiply_argb_as_rgba(alpha, red, green, blue); |
+ srcRow += 3 * sampleX; |
+ } |
+} |
+ |
+static void swizzle_mask24_to_bgra_premul( |
+ void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
+ uint32_t startX, uint32_t sampleX) { |
+ |
+ // Use the masks to decode to the destination |
+ srcRow += 3 * startX; |
+ SkPMColor* dstPtr = (SkPMColor*) dstRow; |
+ for (int i = 0; i < width; i++) { |
+ uint32_t p = srcRow[0] | (srcRow[1] << 8) | srcRow[2] << 16; |
+ uint8_t red = masks->getRed(p); |
+ uint8_t green = masks->getGreen(p); |
+ uint8_t blue = masks->getBlue(p); |
+ uint8_t alpha = masks->getAlpha(p); |
+ dstPtr[i] = premultiply_argb_as_bgra(alpha, red, green, blue); |
srcRow += 3 * sampleX; |
} |
} |
@@ -151,7 +257,59 @@ static void swizzle_mask24_to_565( |
} |
} |
-static void swizzle_mask32_to_n32_opaque( |
+static void swizzle_mask32_to_rgba_opaque( |
+ void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
+ uint32_t startX, uint32_t sampleX) { |
+ |
+ // Use the masks to decode to the destination |
+ uint32_t* srcPtr = ((uint32_t*) srcRow) + startX; |
+ SkPMColor* dstPtr = (SkPMColor*) dstRow; |
+ for (int i = 0; i < width; i++) { |
+ uint32_t p = srcPtr[0]; |
+ uint8_t red = masks->getRed(p); |
+ uint8_t green = masks->getGreen(p); |
+ uint8_t blue = masks->getBlue(p); |
+ dstPtr[i] = SkPackARGB_as_RGBA(0xFF, red, green, blue); |
+ srcPtr += sampleX; |
+ } |
+} |
+ |
+static void swizzle_mask32_to_bgra_opaque( |
+ void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
+ uint32_t startX, uint32_t sampleX) { |
+ |
+ // Use the masks to decode to the destination |
+ uint32_t* srcPtr = ((uint32_t*) srcRow) + startX; |
+ SkPMColor* dstPtr = (SkPMColor*) dstRow; |
+ for (int i = 0; i < width; i++) { |
+ uint32_t p = srcPtr[0]; |
+ uint8_t red = masks->getRed(p); |
+ uint8_t green = masks->getGreen(p); |
+ uint8_t blue = masks->getBlue(p); |
+ dstPtr[i] = SkPackARGB_as_BGRA(0xFF, red, green, blue); |
+ srcPtr += sampleX; |
+ } |
+} |
+ |
+static void swizzle_mask32_to_rgba_unpremul( |
+ void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
+ uint32_t startX, uint32_t sampleX) { |
+ |
+ // Use the masks to decode to the destination |
+ uint32_t* srcPtr = ((uint32_t*) srcRow) + startX; |
+ SkPMColor* dstPtr = (SkPMColor*) dstRow; |
+ for (int i = 0; i < width; i++) { |
+ uint32_t p = srcPtr[0]; |
+ uint8_t red = masks->getRed(p); |
+ uint8_t green = masks->getGreen(p); |
+ uint8_t blue = masks->getBlue(p); |
+ uint8_t alpha = masks->getAlpha(p); |
+ dstPtr[i] = SkPackARGB_as_RGBA(alpha, red, green, blue); |
+ srcPtr += sampleX; |
+ } |
+} |
+ |
+static void swizzle_mask32_to_bgra_unpremul( |
void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
uint32_t startX, uint32_t sampleX) { |
@@ -163,12 +321,13 @@ static void swizzle_mask32_to_n32_opaque( |
uint8_t red = masks->getRed(p); |
uint8_t green = masks->getGreen(p); |
uint8_t blue = masks->getBlue(p); |
- dstPtr[i] = SkPackARGB32NoCheck(0xFF, red, green, blue); |
+ uint8_t alpha = masks->getAlpha(p); |
+ dstPtr[i] = SkPackARGB_as_BGRA(alpha, red, green, blue); |
srcPtr += sampleX; |
} |
} |
-static void swizzle_mask32_to_n32_unpremul( |
+static void swizzle_mask32_to_rgba_premul( |
void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
uint32_t startX, uint32_t sampleX) { |
@@ -181,12 +340,12 @@ static void swizzle_mask32_to_n32_unpremul( |
uint8_t green = masks->getGreen(p); |
uint8_t blue = masks->getBlue(p); |
uint8_t alpha = masks->getAlpha(p); |
- dstPtr[i] = SkPackARGB32NoCheck(alpha, red, green, blue); |
+ dstPtr[i] = premultiply_argb_as_rgba(alpha, red, green, blue); |
srcPtr += sampleX; |
} |
} |
-static void swizzle_mask32_to_n32_premul( |
+static void swizzle_mask32_to_bgra_premul( |
void* dstRow, const uint8_t* srcRow, int width, SkMasks* masks, |
uint32_t startX, uint32_t sampleX) { |
@@ -199,7 +358,7 @@ static void swizzle_mask32_to_n32_premul( |
uint8_t green = masks->getGreen(p); |
uint8_t blue = masks->getBlue(p); |
uint8_t alpha = masks->getAlpha(p); |
- dstPtr[i] = SkPreMultiplyARGB(alpha, red, green, blue); |
+ dstPtr[i] = premultiply_argb_as_bgra(alpha, red, green, blue); |
srcPtr += sampleX; |
} |
} |
@@ -234,16 +393,32 @@ SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler(const SkImageInfo& dstInfo, |
switch (bitsPerPixel) { |
case 16: |
switch (dstInfo.colorType()) { |
- case kN32_SkColorType: |
+ case kRGBA_8888_SkColorType: |
+ if (kOpaque_SkAlphaType == srcInfo.alphaType()) { |
+ proc = &swizzle_mask16_to_rgba_opaque; |
+ } else { |
+ switch (dstInfo.alphaType()) { |
+ case kUnpremul_SkAlphaType: |
+ proc = &swizzle_mask16_to_rgba_unpremul; |
+ break; |
+ case kPremul_SkAlphaType: |
+ proc = &swizzle_mask16_to_rgba_premul; |
+ break; |
+ default: |
+ break; |
+ } |
+ } |
+ break; |
+ case kBGRA_8888_SkColorType: |
if (kOpaque_SkAlphaType == srcInfo.alphaType()) { |
- proc = &swizzle_mask16_to_n32_opaque; |
+ proc = &swizzle_mask16_to_bgra_opaque; |
} else { |
switch (dstInfo.alphaType()) { |
case kUnpremul_SkAlphaType: |
- proc = &swizzle_mask16_to_n32_unpremul; |
+ proc = &swizzle_mask16_to_bgra_unpremul; |
break; |
case kPremul_SkAlphaType: |
- proc = &swizzle_mask16_to_n32_premul; |
+ proc = &swizzle_mask16_to_bgra_premul; |
break; |
default: |
break; |
@@ -259,16 +434,32 @@ SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler(const SkImageInfo& dstInfo, |
break; |
case 24: |
switch (dstInfo.colorType()) { |
- case kN32_SkColorType: |
+ case kRGBA_8888_SkColorType: |
+ if (kOpaque_SkAlphaType == srcInfo.alphaType()) { |
+ proc = &swizzle_mask24_to_rgba_opaque; |
+ } else { |
+ switch (dstInfo.alphaType()) { |
+ case kUnpremul_SkAlphaType: |
+ proc = &swizzle_mask24_to_rgba_unpremul; |
+ break; |
+ case kPremul_SkAlphaType: |
+ proc = &swizzle_mask24_to_rgba_premul; |
+ break; |
+ default: |
+ break; |
+ } |
+ } |
+ break; |
+ case kBGRA_8888_SkColorType: |
if (kOpaque_SkAlphaType == srcInfo.alphaType()) { |
- proc = &swizzle_mask24_to_n32_opaque; |
+ proc = &swizzle_mask24_to_bgra_opaque; |
} else { |
switch (dstInfo.alphaType()) { |
case kUnpremul_SkAlphaType: |
- proc = &swizzle_mask24_to_n32_unpremul; |
+ proc = &swizzle_mask24_to_bgra_unpremul; |
break; |
case kPremul_SkAlphaType: |
- proc = &swizzle_mask24_to_n32_premul; |
+ proc = &swizzle_mask24_to_bgra_premul; |
break; |
default: |
break; |
@@ -284,16 +475,32 @@ SkMaskSwizzler* SkMaskSwizzler::CreateMaskSwizzler(const SkImageInfo& dstInfo, |
break; |
case 32: |
switch (dstInfo.colorType()) { |
- case kN32_SkColorType: |
+ case kRGBA_8888_SkColorType: |
+ if (kOpaque_SkAlphaType == srcInfo.alphaType()) { |
+ proc = &swizzle_mask32_to_rgba_opaque; |
+ } else { |
+ switch (dstInfo.alphaType()) { |
+ case kUnpremul_SkAlphaType: |
+ proc = &swizzle_mask32_to_rgba_unpremul; |
+ break; |
+ case kPremul_SkAlphaType: |
+ proc = &swizzle_mask32_to_rgba_premul; |
+ break; |
+ default: |
+ break; |
+ } |
+ } |
+ break; |
+ case kBGRA_8888_SkColorType: |
if (kOpaque_SkAlphaType == srcInfo.alphaType()) { |
- proc = &swizzle_mask32_to_n32_opaque; |
+ proc = &swizzle_mask32_to_bgra_opaque; |
} else { |
switch (dstInfo.alphaType()) { |
case kUnpremul_SkAlphaType: |
- proc = &swizzle_mask32_to_n32_unpremul; |
+ proc = &swizzle_mask32_to_bgra_unpremul; |
break; |
case kPremul_SkAlphaType: |
- proc = &swizzle_mask32_to_n32_premul; |
+ proc = &swizzle_mask32_to_bgra_premul; |
break; |
default: |
break; |