Fix issue #2125720 Weather Forecast Widget - graphics do not scale

I forgot to add the new density field to the Bitmaps' parcelable data.
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index 3fb07a7..fe62642 100644
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -332,6 +332,7 @@
     const int               width = p->readInt32();

     const int               height = p->readInt32();

     const int               rowBytes = p->readInt32();

+    const int               density = p->readInt32();

 

     if (SkBitmap::kARGB_8888_Config != config &&

             SkBitmap::kRGB_565_Config != config &&

@@ -369,12 +370,13 @@
     memcpy(bitmap->getPixels(), p->readInplace(size), size);

     bitmap->unlockPixels();

 

-    return GraphicsJNI::createBitmap(env, bitmap, isMutable, NULL);

+    return GraphicsJNI::createBitmap(env, bitmap, isMutable, NULL, density);

 }

 

 static jboolean Bitmap_writeToParcel(JNIEnv* env, jobject,

                                      const SkBitmap* bitmap,

-                                     jboolean isMutable, jobject parcel) {

+                                     jboolean isMutable, jint density,

+                                     jobject parcel) {

     if (parcel == NULL) {

         SkDebugf("------- writeToParcel null parcel\n");

         return false;

@@ -387,6 +389,7 @@
     p->writeInt32(bitmap->width());

     p->writeInt32(bitmap->height());

     p->writeInt32(bitmap->rowBytes());

+    p->writeInt32(density);

 

     if (bitmap->getConfig() == SkBitmap::kIndex8_Config) {

         SkColorTable* ctable = bitmap->getColorTable();

@@ -546,7 +549,7 @@
     {   "nativeCreateFromParcel",

         "(Landroid/os/Parcel;)Landroid/graphics/Bitmap;",

         (void*)Bitmap_createFromParcel },

-    {   "nativeWriteToParcel",      "(IZLandroid/os/Parcel;)Z",

+    {   "nativeWriteToParcel",      "(IZILandroid/os/Parcel;)Z",

         (void*)Bitmap_writeToParcel },

     {   "nativeExtractAlpha",       "(II[I)Landroid/graphics/Bitmap;",

         (void*)Bitmap_extractAlpha },

diff --git a/core/jni/android/graphics/Graphics.cpp b/core/jni/android/graphics/Graphics.cpp
index ca1cb7d..2e0caed 100644
--- a/core/jni/android/graphics/Graphics.cpp
+++ b/core/jni/android/graphics/Graphics.cpp
@@ -351,7 +351,7 @@
 ///////////////////////////////////////////////////////////////////////////////////////////
 
 jobject GraphicsJNI::createBitmap(JNIEnv* env, SkBitmap* bitmap, bool isMutable,
-                                  jbyteArray ninepatch)
+                                  jbyteArray ninepatch, int density)
 {
     SkASSERT(bitmap != NULL);
     SkASSERT(NULL != bitmap->pixelRef());
@@ -359,7 +359,7 @@
     jobject obj = env->AllocObject(gBitmap_class);
     if (obj) {
         env->CallVoidMethod(obj, gBitmap_constructorMethodID,
-                            (jint)bitmap, isMutable, ninepatch);
+                            (jint)bitmap, isMutable, ninepatch, density);
         if (hasException(env)) {
             obj = NULL;
         }
@@ -541,7 +541,7 @@
     gBitmap_class = make_globalref(env, "android/graphics/Bitmap");
     gBitmap_nativeInstanceID = getFieldIDCheck(env, gBitmap_class, "mNativeBitmap", "I");    
     gBitmap_constructorMethodID = env->GetMethodID(gBitmap_class, "<init>",
-                                            "(IZ[B)V");
+                                            "(IZ[BI)V");
 
     gBitmapConfig_class = make_globalref(env, "android/graphics/Bitmap$Config");
     gBitmapConfig_nativeInstanceID = getFieldIDCheck(env, gBitmapConfig_class,
diff --git a/core/jni/android/graphics/GraphicsJNI.h b/core/jni/android/graphics/GraphicsJNI.h
index f8b60a8..7adadbc 100644
--- a/core/jni/android/graphics/GraphicsJNI.h
+++ b/core/jni/android/graphics/GraphicsJNI.h
@@ -50,7 +50,7 @@
         then the bitmap must be an owner of its natively allocated pixels (via allocPixels).
         */
     static jobject createBitmap(JNIEnv* env, SkBitmap* bitmap, bool isMutable,
-                                jbyteArray ninePatch);
+                                jbyteArray ninePatch, int density = -1);
     
     static jobject createRegion(JNIEnv* env, SkRegion* region);
 
diff --git a/core/jni/android_emoji_EmojiFactory.cpp b/core/jni/android_emoji_EmojiFactory.cpp
index 7d6e24f..cc9e2bf 100644
--- a/core/jni/android_emoji_EmojiFactory.cpp
+++ b/core/jni/android_emoji_EmojiFactory.cpp
@@ -184,7 +184,7 @@
   jobject obj = env->AllocObject(gBitmap_class);
   if (obj) {
     env->CallVoidMethod(obj, gBitmap_constructorMethodID,
-                        reinterpret_cast<jint>(bitmap), false, NULL);
+                        reinterpret_cast<jint>(bitmap), false, NULL, -1);
     if (env->ExceptionCheck() != 0) {
       LOGE("*** Uncaught exception returned from Java call!\n");
       env->ExceptionDescribe();
@@ -294,7 +294,7 @@
 int register_android_emoji_EmojiFactory(JNIEnv* env) {
   gBitmap_class = make_globalref(env, "android/graphics/Bitmap");
   gBitmap_constructorMethodID = env->GetMethodID(gBitmap_class, "<init>",
-                                                 "(IZ[B)V");
+                                                 "(IZ[BI)V");
   gEmojiFactory_class = make_globalref(env, "android/emoji/EmojiFactory");
   gEmojiFactory_constructorMethodID = env->GetMethodID(
       gEmojiFactory_class, "<init>", "(ILjava/lang/String;)V");
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index eef1096..216dea0 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -77,7 +77,8 @@
 
         This can be called from JNI code.
     */
-    private Bitmap(int nativeBitmap, boolean isMutable, byte[] ninePatchChunk) {
+    private Bitmap(int nativeBitmap, boolean isMutable, byte[] ninePatchChunk,
+            int density) {
         if (nativeBitmap == 0) {
             throw new RuntimeException("internal error: native bitmap is 0");
         }
@@ -86,6 +87,9 @@
         mNativeBitmap = nativeBitmap;
         mIsMutable = isMutable;
         mNinePatchChunk = ninePatchChunk;
+        if (density >= 0) {
+            mDensity = density;
+        }
     }
 
     /**
@@ -892,7 +896,7 @@
      */
     public void writeToParcel(Parcel p, int flags) {
         checkRecycled("Can't parcel a recycled bitmap");
-        if (!nativeWriteToParcel(mNativeBitmap, mIsMutable, p)) {
+        if (!nativeWriteToParcel(mNativeBitmap, mIsMutable, mDensity, p)) {
             throw new RuntimeException("native writeToParcel failed");
         }
     }
@@ -1006,6 +1010,7 @@
     // returns true on success
     private static native boolean nativeWriteToParcel(int nativeBitmap,
                                                       boolean isMutable,
+                                                      int density,
                                                       Parcel p);
     // returns a new bitmap built from the native bitmap's alpha, and the paint
     private static native Bitmap nativeExtractAlpha(int nativeBitmap,
diff --git a/tools/layoutlib/bridge/src/android/graphics/Bitmap.java b/tools/layoutlib/bridge/src/android/graphics/Bitmap.java
index 7dde634..ff1b295 100644
--- a/tools/layoutlib/bridge/src/android/graphics/Bitmap.java
+++ b/tools/layoutlib/bridge/src/android/graphics/Bitmap.java
@@ -28,13 +28,13 @@
     private BufferedImage mImage;
 
     public Bitmap(File input) throws IOException {
-        super(1, true, null);
+        super(1, true, null, -1);
 
         mImage = ImageIO.read(input);
     }
 
     Bitmap(BufferedImage image) {
-        super(1, true, null);
+        super(1, true, null, -1);
         mImage = image;
     }