From 39f10ec7dac59b5a8bc6f7e5b86846da77c30337 Mon Sep 17 00:00:00 2001 From: Mike Reed Date: Wed, 24 Mar 2010 10:08:50 -0400 Subject: [PATCH] If we detect a 9patch chunk, force the config chooser to avoid 565, with its pre-dithering madness Change-Id: I0a2d1b094ccb16d479524779acec0216dc7a80ee --- core/jni/android/graphics/BitmapFactory.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index b6f39974ce6e8..b41bad0d66e8f 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -164,8 +164,11 @@ void AutoDecoderCancel::Validate() { using namespace android; class NinePatchPeeker : public SkImageDecoder::Peeker { + SkImageDecoder* fHost; public: - NinePatchPeeker() { + NinePatchPeeker(SkImageDecoder* host) { + // the host lives longer than we do, so a raw ptr is safe + fHost = host; fPatchIsValid = false; } @@ -197,6 +200,19 @@ public: // fPatch.sizeLeft, fPatch.sizeTop, // fPatch.sizeRight, fPatch.sizeBottom); fPatchIsValid = true; + + // now update our host to force index or 32bit config + // 'cause we don't want 565 predithered, since as a 9patch, we know + // we will be stretched, and therefore we want to dither afterwards. + static const SkBitmap::Config gNo565Pref[] = { + SkBitmap::kIndex8_Config, + SkBitmap::kIndex8_Config, + SkBitmap::kARGB_8888_Config, + SkBitmap::kARGB_8888_Config, + SkBitmap::kARGB_8888_Config, + SkBitmap::kARGB_8888_Config, + }; + fHost->setPrefConfigTable(gNo565Pref); } else { fPatch = NULL; } @@ -364,7 +380,7 @@ static jobject doDecode(JNIEnv* env, SkStream* stream, jobject padding, decoder->setSampleSize(sampleSize); decoder->setDitherImage(doDither); - NinePatchPeeker peeker; + NinePatchPeeker peeker(decoder); JavaPixelAllocator javaAllocator(env, reportSizeToVM); SkBitmap* bitmap = new SkBitmap; Res_png_9patch dummy9Patch;