add optional preftable to image codecs, for more control over the resulting bitmap config

http://b/issue?id=2267010
diff --git a/WebCore/platform/graphics/android/ImageSourceAndroid.cpp b/WebCore/platform/graphics/android/ImageSourceAndroid.cpp
index b86763a..fa1794c 100644
--- a/WebCore/platform/graphics/android/ImageSourceAndroid.cpp
+++ b/WebCore/platform/graphics/android/ImageSourceAndroid.cpp
@@ -60,9 +60,29 @@
 
     // see dox for computeMaxBitmapSizeForCache()
     #define MAX_SIZE_BEFORE_SUBSAMPLE   (8*1024*1024)
+
+    // preserve quality for 24/32bit src
+    static const SkBitmap::Config gPrefConfigTable[6] = {
+        SkBitmap::kIndex8_Config,       // src: index, opaque
+        SkBitmap::kIndex8_Config,       // src: index, alpha
+        SkBitmap::kRGB_565_Config,      // src: 16bit, opaque
+        SkBitmap::kARGB_8888_Config,    // src: 16bit, alpha  (promote to 32bit)
+        SkBitmap::kARGB_8888_Config,    // src: 32bit, opaque
+        SkBitmap::kARGB_8888_Config,    // src: 32bit, alpha
+    };
 #else
     #define MIN_RLE_ALLOC_SIZE          (2*1024*1024)
     #define MAX_SIZE_BEFORE_SUBSAMPLE   (2*1024*1024)
+
+    // tries to minimize memory usage (i.e. demote opaque 32bit -> 16bit)
+    static const SkBitmap::Config gPrefConfigTable[6] = {
+        SkBitmap::kIndex8_Config,       // src: index, opaque
+        SkBitmap::kIndex8_Config,       // src: index, alpha
+        SkBitmap::kRGB_565_Config,      // src: 16bit, opaque
+        SkBitmap::kARGB_8888_Config,    // src: 16bit, alpha  (promote to 32bit)
+        SkBitmap::kRGB_565_Config,      // src: 32bit, opaque (demote to 16bit)
+        SkBitmap::kARGB_8888_Config,    // src: 32bit, alpha
+    };
 #endif
 
 /*  Images larger than this should be subsampled. Using ashmem, the decoded
@@ -219,12 +239,13 @@
 
         SkMemoryStream stream(data->data(), data->size(), false);
         SkImageDecoder* codec = SkImageDecoder::Factory(&stream);
-        SkAutoTDelete<SkImageDecoder> ad(codec);
-        
-        if (!codec || !codec->decode(&stream, &tmp, SkBitmap::kNo_Config,
-                                       SkImageDecoder::kDecodeBounds_Mode)) {
+        if (!codec)
             return;
-        }
+
+        SkAutoTDelete<SkImageDecoder> ad(codec);
+        codec->setPrefConfigTable(gPrefConfigTable);
+        if (!codec->decode(&stream, &tmp, SkImageDecoder::kDecodeBounds_Mode))
+            return;
 
         int origW = tmp.width();
         int origH = tmp.height();
@@ -251,8 +272,8 @@
         if (sampleSize > 1) {
             codec->setSampleSize(sampleSize);
             stream.rewind();
-            if (!codec->decode(&stream, &tmp, SkBitmap::kNo_Config,
-                                 SkImageDecoder::kDecodeBounds_Mode)) {
+            if (!codec->decode(&stream, &tmp,
+                               SkImageDecoder::kDecodeBounds_Mode)) {
                 return;
             }
         }