If we detect a 9patch chunk, force the config chooser to avoid 565, with its pre-dithering madness

Change-Id: I0a2d1b094ccb16d479524779acec0216dc7a80ee
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index b6f3997..b41bad0 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -164,8 +164,11 @@
 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 @@
             //       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 @@
     decoder->setSampleSize(sampleSize);
     decoder->setDitherImage(doDither);
 
-    NinePatchPeeker     peeker;
+    NinePatchPeeker     peeker(decoder);
     JavaPixelAllocator  javaAllocator(env, reportSizeToVM);
     SkBitmap*           bitmap = new SkBitmap;
     Res_png_9patch      dummy9Patch;