Index: src/codec/SkSwizzler.cpp |
diff --git a/src/codec/SkSwizzler.cpp b/src/codec/SkSwizzler.cpp |
index 74d6c7f87fce8fea08e61ab33099a9d72e759a54..e560d6f3cd999a13698d4607392817018f974a37 100644 |
--- a/src/codec/SkSwizzler.cpp |
+++ b/src/codec/SkSwizzler.cpp |
@@ -303,6 +303,26 @@ static void swizzle_bgrx_to_n32( |
} |
} |
+static void fast_swizzle_bgrx_to_32( |
+ 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); |
+ |
+ // The default swizzle supports BGR->N32 and BGRX->N32. This only |
+ // supports BGRX->N32. |
+ SkASSERT(4 == bpp); |
+ |
+ // These swizzles trust that the alpha value is already 0xFF. |
+#ifdef SK_PMCOLOR_IS_RGBA |
+ SkOpts::swaprb_xxxa((uint32_t*) dst, (const uint32_t*) (src + offset), width); |
+#else |
+ memcpy(dst, src + offset, width * bpp); |
+#endif |
+} |
+ |
static void swizzle_bgrx_to_565( |
void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
@@ -343,7 +363,23 @@ static void swizzle_bgra_to_n32_premul( |
} |
} |
+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[]) { |
+ |
+ // 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::premul_swaprb_xxxa((uint32_t*) dst, (const uint32_t*) (src + offset), width); |
+#else |
+ SkOpts::premul_xxxa((uint32_t*) dst, (const uint32_t*) (src + offset), width); |
+#endif |
+} |
+ |
// kRGBX |
+ |
static void swizzle_rgbx_to_n32( |
void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
@@ -356,6 +392,26 @@ static void swizzle_rgbx_to_n32( |
} |
} |
+static void fast_swizzle_rgbx_to_32( |
+ 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); |
+ |
+ // The default swizzle supports RGB->N32 and RGBX->N32. This only |
+ // supports RGBX->N32. |
+ SkASSERT(4 == bpp); |
+ |
+ // These swizzles trust that the alpha value is already 0xFF. |
+#ifdef SK_PMCOLOR_IS_RGBA |
+ memcpy(dst, src + offset, width * bpp); |
+#else |
+ SkOpts::swaprb_xxxa((uint32_t*) dst, (const uint32_t*) (src + offset), width); |
+#endif |
+} |
+ |
static void swizzle_rgbx_to_565( |
void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
int bytesPerPixel, int deltaSrc, int offset, const SkPMColor ctable[]) { |
@@ -369,6 +425,7 @@ static void swizzle_rgbx_to_565( |
} |
// kRGBA |
+ |
static void swizzle_rgba_to_n32_premul( |
void* SK_RESTRICT dstRow, const uint8_t* SK_RESTRICT src, int dstWidth, |
int bpp, int deltaSrc, int offset, const SkPMColor ctable[]) { |
@@ -610,15 +667,22 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
case kBGRA: |
switch (dstInfo.colorType()) { |
case kN32_SkColorType: |
- switch (dstInfo.alphaType()) { |
- case kUnpremul_SkAlphaType: |
+ if (dstInfo.alphaType() == kUnpremul_SkAlphaType) { |
+ if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
+ proc = &SkipLeading8888ZerosThen<swizzle_bgra_to_n32_unpremul>; |
+ fastProc = &SkipLeading8888ZerosThen<fast_swizzle_bgrx_to_32>; |
+ } else { |
proc = &swizzle_bgra_to_n32_unpremul; |
- break; |
- case kPremul_SkAlphaType: |
+ fastProc = &fast_swizzle_bgrx_to_32; |
+ } |
+ } else { |
+ if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
+ proc = &SkipLeading8888ZerosThen<swizzle_bgra_to_n32_premul>; |
+ fastProc = &SkipLeading8888ZerosThen<fast_swizzle_bgra_to_n32_premul>; |
+ } else { |
proc = &swizzle_bgra_to_n32_premul; |
- break; |
- default: |
- break; |
+ fastProc = &fast_swizzle_bgra_to_n32_premul; |
+ } |
} |
break; |
default: |
@@ -629,6 +693,7 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
switch (dstInfo.colorType()) { |
case kN32_SkColorType: |
proc = &swizzle_rgbx_to_n32; |
+ fastProc = &fast_swizzle_rgbx_to_32; |
break; |
case kRGB_565_SkColorType: |
proc = &swizzle_rgbx_to_565; |
@@ -642,8 +707,10 @@ SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
if (dstInfo.alphaType() == kUnpremul_SkAlphaType) { |
if (SkCodec::kYes_ZeroInitialized == zeroInit) { |
proc = &SkipLeading8888ZerosThen<swizzle_rgba_to_n32_unpremul>; |
+ fastProc = &SkipLeading8888ZerosThen<fast_swizzle_rgbx_to_32>; |
} else { |
proc = &swizzle_rgba_to_n32_unpremul; |
+ fastProc = &fast_swizzle_rgbx_to_32; |
} |
} else { |
if (SkCodec::kYes_ZeroInitialized == zeroInit) { |