diff options
-rw-r--r-- | src/core/SkBitmapProcState.cpp | 11 | ||||
-rw-r--r-- | src/core/SkSpriteBlitter_RGB16.cpp | 11 |
2 files changed, 22 insertions, 0 deletions
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp index 48962cffa4..f8ab8ab351 100644 --- a/src/core/SkBitmapProcState.cpp +++ b/src/core/SkBitmapProcState.cpp @@ -481,6 +481,8 @@ bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) { /////////////////////////////////////////////////////////////////////// + const SkAlphaType at = fBitmap->alphaType(); + // No need to do this if we're doing HQ sampling; if filter quality is // still set to HQ by the time we get here, then we must have installed // the shader procs above and can skip all this. @@ -500,15 +502,24 @@ bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) { // bits 3,4,5 encoding the source bitmap format switch (fBitmap->colorType()) { case kN32_SkColorType: + if (kPremul_SkAlphaType != at && kOpaque_SkAlphaType != at) { + return false; + } index |= 0; break; case kRGB_565_SkColorType: index |= 8; break; case kIndex_8_SkColorType: + if (kPremul_SkAlphaType != at && kOpaque_SkAlphaType != at) { + return false; + } index |= 16; break; case kARGB_4444_SkColorType: + if (kPremul_SkAlphaType != at && kOpaque_SkAlphaType != at) { + return false; + } index |= 24; break; case kAlpha_8_SkColorType: diff --git a/src/core/SkSpriteBlitter_RGB16.cpp b/src/core/SkSpriteBlitter_RGB16.cpp index 1ba3ee22fc..3d1d28d0a5 100644 --- a/src/core/SkSpriteBlitter_RGB16.cpp +++ b/src/core/SkSpriteBlitter_RGB16.cpp @@ -321,15 +321,23 @@ SkSpriteBlitter* SkSpriteBlitter::ChooseD16(const SkBitmap& source, const SkPain return NULL; } + const SkAlphaType at = source.alphaType(); + SkSpriteBlitter* blitter = NULL; unsigned alpha = paint.getAlpha(); switch (source.colorType()) { case kN32_SkColorType: { + if (kPremul_SkAlphaType != at && kOpaque_SkAlphaType != at) { + break; + } blitter = allocator->createT<Sprite_D16_S32_BlitRowProc>(source); break; } case kARGB_4444_SkColorType: + if (kPremul_SkAlphaType != at && kOpaque_SkAlphaType != at) { + break; + } if (255 == alpha) { blitter = allocator->createT<Sprite_D16_S4444_Opaque>(source); } else { @@ -344,6 +352,9 @@ SkSpriteBlitter* SkSpriteBlitter::ChooseD16(const SkBitmap& source, const SkPain } break; case kIndex_8_SkColorType: + if (kPremul_SkAlphaType != at && kOpaque_SkAlphaType != at) { + break; + } if (paint.isDither()) { // we don't support dither yet in these special cases break; |