Index: src/codec/SkSwizzler.cpp |
diff --git a/src/codec/SkSwizzler.cpp b/src/codec/SkSwizzler.cpp |
index a4b30287c2372f3d7421dbcc96caab7450672bce..f242421424e3f48b29e02a31102b4366f0453ba2 100644 |
--- a/src/codec/SkSwizzler.cpp |
+++ b/src/codec/SkSwizzler.cpp |
@@ -348,21 +348,9 @@ static void fast_swizzle_grayalpha_to_n32_premul( |
SkOpts::grayA_to_rgbA((uint32_t*) dst, src + offset, width); |
} |
-// kBGRX |
+// kBGR |
-static void swizzle_bgrx_to_n32( |
- void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
- int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
- |
- src += offset; |
- SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
- for (int x = 0; x < dstWidth; x++) { |
- dst[x] = SkPackARGB32NoCheck(0xFF, src[2], src[1], src[0]); |
- src += deltaSrc; |
- } |
-} |
- |
-static void swizzle_bgrx_to_565( |
+static void swizzle_bgr_to_565( |
void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
@@ -374,79 +362,44 @@ static void swizzle_bgrx_to_565( |
} |
} |
-// kBGRA |
+// kRGB |
-static void swizzle_bgra_to_n32_unpremul( |
+static void swizzle_rgb_to_rgba( |
void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
src += offset; |
SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
for (int x = 0; x < dstWidth; x++) { |
- uint8_t alpha = src[3]; |
- dst[x] = SkPackARGB32NoCheck(alpha, src[2], src[1], src[0]); |
+ dst[x] = SkPackARGB_as_RGBA(0xFF, src[0], src[1], src[2]); |
src += deltaSrc; |
} |
} |
-static void fast_swizzle_bgra_to_n32_unpremul( |
- void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int offset, |
- const SkPMColor ctable[]) { |
- |
- // This function must not be called if we are sampling. If we are not |
- // sampling, deltaSrc should equal bpp. |
- SkASSERT(deltaSrc == bpp); |
- |
-#ifdef SK_PMCOLOR_IS_RGBA |
- SkOpts::RGBA_to_BGRA((uint32_t*) dst, src + offset, width); |
-#else |
- memcpy(dst, src + offset, width * bpp); |
-#endif |
-} |
- |
-static void swizzle_bgra_to_n32_premul( |
+static void swizzle_rgb_to_bgra( |
void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
src += offset; |
SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
for (int x = 0; x < dstWidth; x++) { |
- uint8_t alpha = src[3]; |
- dst[x] = SkPremultiplyARGBInline(alpha, src[2], src[1], src[0]); |
+ dst[x] = SkPackARGB_as_BGRA(0xFF, src[0], src[1], src[2]); |
src += deltaSrc; |
} |
} |
-static void fast_swizzle_bgra_to_n32_premul( |
- void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int offset, |
- const SkPMColor ctable[]) { |
+static void fast_swizzle_rgb_to_rgba( |
+ void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, |
+ int offset, const SkPMColor ctable[]) { |
// This function must not be called if we are sampling. If we are not |
// sampling, deltaSrc should equal bpp. |
SkASSERT(deltaSrc == bpp); |
-#ifdef SK_PMCOLOR_IS_RGBA |
- SkOpts::RGBA_to_bgrA((uint32_t*) dst, src + offset, width); |
-#else |
- SkOpts::RGBA_to_rgbA((uint32_t*) dst, src + offset, width); |
-#endif |
-} |
- |
-// kRGB |
- |
-static void swizzle_rgb_to_n32( |
- void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
- int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
- |
- src += offset; |
- SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
- for (int x = 0; x < dstWidth; x++) { |
- dst[x] = SkPackARGB32NoCheck(0xFF, src[0], src[1], src[2]); |
- src += deltaSrc; |
- } |
+ SkOpts::RGB_to_RGB1((uint32_t*) dst, src + offset, width); |
} |
-static void fast_swizzle_rgb_to_n32( |
+static void fast_swizzle_rgb_to_bgra( |
void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, |
int offset, const SkPMColor ctable[]) { |
@@ -454,11 +407,7 @@ static void fast_swizzle_rgb_to_n32( |
// sampling, deltaSrc should equal bpp. |
SkASSERT(deltaSrc == bpp); |
-#ifdef SK_PMCOLOR_IS_RGBA |
- SkOpts::RGB_to_RGB1((uint32_t*) dst, src + offset, width); |
-#else |
SkOpts::RGB_to_BGR1((uint32_t*) dst, src + offset, width); |
-#endif |
} |
static void swizzle_rgb_to_565( |
@@ -475,20 +424,31 @@ static void swizzle_rgb_to_565( |
// kRGBA |
-static void swizzle_rgba_to_n32_premul( |
+static void swizzle_rgba_to_rgba_premul( |
void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
src += offset; |
SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
for (int x = 0; x < dstWidth; x++) { |
- unsigned alpha = src[3]; |
- dst[x] = SkPremultiplyARGBInline(alpha, src[0], src[1], src[2]); |
+ dst[x] = premultiply_argb_as_rgba(src[3], src[0], src[1], src[2]); |
+ src += deltaSrc; |
+ } |
+} |
+ |
+static void swizzle_rgba_to_bgra_premul( |
+ void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
+ int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
+ |
+ src += offset; |
+ SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
+ for (int x = 0; x < dstWidth; x++) { |
+ dst[x] = premultiply_argb_as_bgra(src[3], src[0], src[1], src[2]); |
src += deltaSrc; |
} |
} |
-static void fast_swizzle_rgba_to_n32_premul( |
+static void fast_swizzle_rgba_to_rgba_premul( |
void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, |
int offset, const SkPMColor ctable[]) { |
@@ -496,14 +456,21 @@ static void fast_swizzle_rgba_to_n32_premul( |
// sampling, deltaSrc should equal bpp. |
SkASSERT(deltaSrc == bpp); |
-#ifdef SK_PMCOLOR_IS_RGBA |
SkOpts::RGBA_to_rgbA((uint32_t*) dst, src + offset, width); |
-#else |
+} |
+ |
+static void fast_swizzle_rgba_to_bgra_premul( |
+ void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, |
+ int offset, const SkPMColor ctable[]) { |
+ |
+ // This function must not be called if we are sampling. If we are not |
+ // sampling, deltaSrc should equal bpp. |
+ SkASSERT(deltaSrc == bpp); |
+ |
SkOpts::RGBA_to_bgrA((uint32_t*) dst, src + offset, width); |
-#endif |
} |
-static void swizzle_rgba_to_n32_unpremul( |
+static void swizzle_rgba_to_bgra_unpremul( |
void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
@@ -511,12 +478,12 @@ static void swizzle_rgba_to_n32_unpremul( |
uint32_t* SK_RESTRICT dst = reinterpret_cast<uint32_t*>(dstRow); |
for (int x = 0; x < dstWidth; x++) { |
unsigned alpha = src[3]; |
- dst[x] = SkPackARGB32NoCheck(alpha, src[0], src[1], src[2]); |
+ dst[x] = SkPackARGB_as_BGRA(alpha, src[0], src[1], src[2]); |
src += deltaSrc; |
} |
} |
-static void fast_swizzle_rgba_to_n32_unpremul( |
+static void fast_swizzle_rgba_to_bgra_unpremul( |
void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int offset, |
const SkPMColor ctable[]) { |
@@ -524,11 +491,7 @@ static void fast_swizzle_rgba_to_n32_unpremul( |
// sampling, deltaSrc should equal bpp. |
SkASSERT(deltaSrc == bpp); |
-#ifdef SK_PMCOLOR_IS_RGBA |
- memcpy(dst, src + offset, width * bpp); |
-#else |
SkOpts::RGBA_to_BGRA((uint32_t*) dst, src + offset, width); |
-#endif |
} |
// kCMYK |
@@ -576,7 +539,23 @@ static void fast_swizzle_rgba_to_n32_unpremul( |
// R = C * K / 255 |
// G = M * K / 255 |
// B = Y * K / 255 |
-static void swizzle_cmyk_to_n32( |
+static void swizzle_cmyk_to_rgba( |
+ void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
+ int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
+ |
+ src += offset; |
+ SkPMColor* SK_RESTRICT dst = (SkPMColor*)dstRow; |
+ for (int x = 0; x < dstWidth; x++) { |
+ const uint8_t r = SkMulDiv255Round(src[0], src[3]); |
+ const uint8_t g = SkMulDiv255Round(src[1], src[3]); |
+ const uint8_t b = SkMulDiv255Round(src[2], src[3]); |
+ |
+ dst[x] = SkPackARGB_as_RGBA(0xFF, r, g, b); |
+ src += deltaSrc; |
+ } |
+} |
+ |
+static void swizzle_cmyk_to_bgra( |
void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
@@ -587,12 +566,12 @@ static void swizzle_cmyk_to_n32( |
const uint8_t g = SkMulDiv255Round(src[1], src[3]); |
const uint8_t b = SkMulDiv255Round(src[2], src[3]); |
- dst[x] = SkPackARGB32NoCheck(0xFF, r, g, b); |
+ dst[x] = SkPackARGB_as_BGRA(0xFF, r, g, b); |
src += deltaSrc; |
} |
} |
-static void fast_swizzle_cmyk_to_n32( |
+static void fast_swizzle_cmyk_to_rgba( |
void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int offset, |
const SkPMColor ctable[]) { |
@@ -600,11 +579,18 @@ static void fast_swizzle_cmyk_to_n32( |
// sampling, deltaSrc should equal bpp. |
SkASSERT(deltaSrc == bpp); |
-#ifdef SK_PMCOLOR_IS_RGBA |
SkOpts::inverted_CMYK_to_RGB1((uint32_t*) dst, src + offset, width); |
-#else |
+} |
+ |
+static void fast_swizzle_cmyk_to_bgra( |
+ void* dst, const uint8_t* src, int width, int bpp, int deltaSrc, int offset, |
+ const SkPMColor ctable[]) { |
+ |
+ // This function must not be called if we are sampling. If we are not |
+ // sampling, deltaSrc should equal bpp. |
+ SkASSERT(deltaSrc == bpp); |
+ |
SkOpts::inverted_CMYK_to_BGR1((uint32_t*) dst, src + offset, width); |
-#endif |
} |
static void swizzle_cmyk_to_565( |
@@ -680,7 +666,8 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo, |
switch (encodedInfo.bitsPerComponent()) { |
case 1: |
switch (dstInfo.colorType()) { |
- case kN32_SkColorType: |
+ case kRGBA_8888_SkColorType: |
+ case kBGRA_8888_SkColorType: |
proc = &swizzle_bit_to_n32; |
break; |
case kIndex_8_SkColorType: |
@@ -698,7 +685,8 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo, |
break; |
case 8: |
switch (dstInfo.colorType()) { |
- case kN32_SkColorType: |
+ case kRGBA_8888_SkColorType: |
+ case kBGRA_8888_SkColorType: |
proc = &swizzle_gray_to_n32; |
fastProc = &fast_swizzle_gray_to_n32; |
break; |
@@ -719,7 +707,8 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo, |
break; |
case SkEncodedInfo::kGrayAlpha_Color: |
switch (dstInfo.colorType()) { |
- case kN32_SkColorType: |
+ case kRGBA_8888_SkColorType: |
+ case kBGRA_8888_SkColorType: |
if (premultiply) { |
if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
proc = &SkipLeadingGrayAlphaZerosThen<swizzle_grayalpha_to_n32_premul>; |
@@ -753,7 +742,8 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo, |
case 2: |
case 4: |
switch (dstInfo.colorType()) { |
- case kN32_SkColorType: |
+ case kRGBA_8888_SkColorType: |
+ case kBGRA_8888_SkColorType: |
proc = &swizzle_small_index_to_n32; |
break; |
case kRGB_565_SkColorType: |
@@ -768,7 +758,8 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo, |
break; |
case 8: |
switch (dstInfo.colorType()) { |
- case kN32_SkColorType: |
+ case kRGBA_8888_SkColorType: |
+ case kBGRA_8888_SkColorType: |
if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
proc = &swizzle_index_to_n32_skipZ; |
} else { |
@@ -792,9 +783,13 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo, |
break; |
case SkEncodedInfo::kRGB_Color: |
switch (dstInfo.colorType()) { |
- case kN32_SkColorType: |
- proc = &swizzle_rgb_to_n32; |
- fastProc = &fast_swizzle_rgb_to_n32; |
+ case kRGBA_8888_SkColorType: |
+ proc = &swizzle_rgb_to_rgba; |
+ fastProc = &fast_swizzle_rgb_to_rgba; |
+ break; |
+ case kBGRA_8888_SkColorType: |
+ proc = &swizzle_rgb_to_bgra; |
+ fastProc = &fast_swizzle_rgb_to_bgra; |
break; |
case kRGB_565_SkColorType: |
proc = &swizzle_rgb_to_565; |
@@ -805,23 +800,42 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo, |
break; |
case SkEncodedInfo::kRGBA_Color: |
switch (dstInfo.colorType()) { |
- case kN32_SkColorType: |
+ case kRGBA_8888_SkColorType: |
+ if (premultiply) { |
+ if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
+ proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_rgba_premul>; |
+ fastProc = &SkipLeading8888ZerosThen<fast_swizzle_rgba_to_rgba_premul>; |
+ } else { |
+ proc = &swizzle_rgba_to_rgba_premul; |
+ fastProc = &fast_swizzle_rgba_to_rgba_premul; |
+ } |
+ } else { |
+ if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
+ proc = &SkipLeading8888ZerosThen<sample4>; |
+ fastProc = &SkipLeading8888ZerosThen<copy>; |
+ } else { |
+ proc = &sample4; |
+ fastProc = © |
+ } |
+ } |
+ break; |
+ case kBGRA_8888_SkColorType: |
if (premultiply) { |
if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
- proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32_premul>; |
- fastProc = &SkipLeading8888ZerosThen<fast_swizzle_rgba_to_n32_premul>; |
+ proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_bgra_premul>; |
+ fastProc = &SkipLeading8888ZerosThen<fast_swizzle_rgba_to_bgra_premul>; |
} else { |
- proc = &swizzle_rgba_to_n32_premul; |
- fastProc = &fast_swizzle_rgba_to_n32_premul; |
+ proc = &swizzle_rgba_to_bgra_premul; |
+ fastProc = &fast_swizzle_rgba_to_bgra_premul; |
} |
} else { |
if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
- proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32_unpremul>; |
+ proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_bgra_unpremul>; |
fastProc = &SkipLeading8888ZerosThen |
- <fast_swizzle_rgba_to_n32_unpremul>; |
+ <fast_swizzle_rgba_to_bgra_unpremul>; |
} else { |
- proc = &swizzle_rgba_to_n32_unpremul; |
- fastProc = &fast_swizzle_rgba_to_n32_unpremul; |
+ proc = &swizzle_rgba_to_bgra_unpremul; |
+ fastProc = &fast_swizzle_rgba_to_bgra_unpremul; |
} |
} |
break; |
@@ -831,11 +845,16 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo, |
break; |
case SkEncodedInfo::kBGR_Color: |
switch (dstInfo.colorType()) { |
- case kN32_SkColorType: |
- proc = &swizzle_bgrx_to_n32; |
+ case kBGRA_8888_SkColorType: |
+ proc = &swizzle_rgb_to_rgba; |
+ fastProc = &fast_swizzle_rgb_to_rgba; |
+ break; |
+ case kRGBA_8888_SkColorType: |
+ proc = &swizzle_rgb_to_bgra; |
+ fastProc = &fast_swizzle_rgb_to_bgra; |
break; |
case kRGB_565_SkColorType: |
- proc = &swizzle_bgrx_to_565; |
+ proc = &swizzle_bgr_to_565; |
break; |
default: |
return nullptr; |
@@ -843,11 +862,14 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo, |
break; |
case SkEncodedInfo::kBGRX_Color: |
switch (dstInfo.colorType()) { |
- case kN32_SkColorType: |
- proc = &swizzle_bgrx_to_n32; |
+ case kBGRA_8888_SkColorType: |
+ proc = &swizzle_rgb_to_rgba; |
+ break; |
+ case kRGBA_8888_SkColorType: |
+ proc = &swizzle_rgb_to_bgra; |
break; |
case kRGB_565_SkColorType: |
- proc = &swizzle_bgrx_to_565; |
+ proc = &swizzle_bgr_to_565; |
break; |
default: |
return nullptr; |
@@ -855,23 +877,42 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo, |
break; |
case SkEncodedInfo::kBGRA_Color: |
switch (dstInfo.colorType()) { |
- case kN32_SkColorType: |
+ case kBGRA_8888_SkColorType: |
+ if (premultiply) { |
+ if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
+ proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_rgba_premul>; |
+ fastProc = &SkipLeading8888ZerosThen<fast_swizzle_rgba_to_rgba_premul>; |
+ } else { |
+ proc = &swizzle_rgba_to_rgba_premul; |
+ fastProc = &fast_swizzle_rgba_to_rgba_premul; |
+ } |
+ } else { |
+ if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
+ proc = &SkipLeading8888ZerosThen<sample4>; |
+ fastProc = &SkipLeading8888ZerosThen<copy>; |
+ } else { |
+ proc = &sample4; |
+ fastProc = © |
+ } |
+ } |
+ break; |
+ case kRGBA_8888_SkColorType: |
if (premultiply) { |
if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
- proc = &SkipLeading8888ZerosThen<swizzle_bgra_to_n32_premul>; |
- fastProc = &SkipLeading8888ZerosThen<fast_swizzle_bgra_to_n32_premul>; |
+ proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_bgra_premul>; |
+ fastProc = &SkipLeading8888ZerosThen<fast_swizzle_rgba_to_bgra_premul>; |
} else { |
- proc = &swizzle_bgra_to_n32_premul; |
- fastProc = &fast_swizzle_bgra_to_n32_premul; |
+ proc = &swizzle_rgba_to_bgra_premul; |
+ fastProc = &fast_swizzle_rgba_to_bgra_premul; |
} |
} else { |
if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
- proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32_unpremul>; |
+ proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_bgra_unpremul>; |
fastProc = &SkipLeading8888ZerosThen |
- <fast_swizzle_bgra_to_n32_unpremul>; |
+ <fast_swizzle_rgba_to_bgra_unpremul>; |
} else { |
- proc = &swizzle_bgra_to_n32_unpremul; |
- fastProc = &fast_swizzle_bgra_to_n32_unpremul; |
+ proc = &swizzle_rgba_to_bgra_unpremul; |
+ fastProc = &fast_swizzle_rgba_to_bgra_unpremul; |
} |
} |
break; |
@@ -881,9 +922,13 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo, |
break; |
case SkEncodedInfo::kInvertedCMYK_Color: |
switch (dstInfo.colorType()) { |
- case kN32_SkColorType: |
- proc = &swizzle_cmyk_to_n32; |
- fastProc = &fast_swizzle_cmyk_to_n32; |
+ case kRGBA_8888_SkColorType: |
+ proc = &swizzle_cmyk_to_rgba; |
+ fastProc = &fast_swizzle_cmyk_to_rgba; |
+ break; |
+ case kBGRA_8888_SkColorType: |
+ proc = &swizzle_cmyk_to_bgra; |
+ fastProc = &fast_swizzle_cmyk_to_bgra; |
break; |
case kRGB_565_SkColorType: |
proc = &swizzle_cmyk_to_565; |
@@ -902,7 +947,8 @@ SkSwizzler* SkSwizzler::CreateSwizzler(const SkEncodedInfo& encodedInfo, |
proc = &sample2; |
fastProc = © |
break; |
- case kN32_SkColorType: |
+ case kRGBA_8888_SkColorType: |
+ case kBGRA_8888_SkColorType: |
proc = &sample4; |
fastProc = © |
break; |