From c64599649bab68aedf07959f86fa506fc46fa3c2 Mon Sep 17 00:00:00 2001 From: "reed@android.com" Date: Tue, 25 Aug 2009 19:15:31 +0000 Subject: special case 1x1 bitmaps when drawn as a shader (treat as a solid color) git-svn-id: http://skia.googlecode.com/svn/trunk@336 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/core/SkBitmapProcShader.cpp | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) (limited to 'src/core/SkBitmapProcShader.cpp') diff --git a/src/core/SkBitmapProcShader.cpp b/src/core/SkBitmapProcShader.cpp index 353388b74c..cb4d129d5b 100644 --- a/src/core/SkBitmapProcShader.cpp +++ b/src/core/SkBitmapProcShader.cpp @@ -207,14 +207,51 @@ void SkBitmapProcShader::shadeSpan16(int x, int y, uint16_t dstC[], int count) { /////////////////////////////////////////////////////////////////////////////// +#include "SkUnPreMultiply.h" +#include "SkColorShader.h" + +// returns true and set color if the bitmap can be drawn as a single color +// (for efficiency) +static bool canUseColorShader(const SkBitmap& bm, SkColor* color) { + if (1 != bm.width() || 1 != bm.height()) { + return false; + } + + SkAutoLockPixels alp(bm); + if (!bm.readyToDraw()) { + return false; + } + + switch (bm.config()) { + case SkBitmap::kARGB_8888_Config: + *color = SkUnPreMultiply::PMColorToColor(*bm.getAddr32(0, 0)); + return true; + case SkBitmap::kRGB_565_Config: + *color = SkPixel16ToColor(*bm.getAddr16(0, 0)); + return true; + case SkBitmap::kIndex8_Config: + *color = SkUnPreMultiply::PMColorToColor(bm.getIndex8Color(0, 0)); + return true; + default: // just skip the other configs for now + break; + } + return false; +} + #include "SkTemplatesPriv.h" SkShader* SkShader::CreateBitmapShader(const SkBitmap& src, TileMode tmx, TileMode tmy, void* storage, size_t storageSize) { SkShader* shader; - SK_PLACEMENT_NEW_ARGS(shader, SkBitmapProcShader, storage, - storageSize, (src, tmx, tmy)); + SkColor color; + if (canUseColorShader(src, &color)) { + SK_PLACEMENT_NEW_ARGS(shader, SkColorShader, storage, storageSize, + (color)); + } else { + SK_PLACEMENT_NEW_ARGS(shader, SkBitmapProcShader, storage, + storageSize, (src, tmx, tmy)); + } return shader; } -- cgit v1.2.3