Make optical insets actually work

Change-Id: I9fabf4cb939cc7a868f95580e7229745acde0418
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index 86ed677..c99066d 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -598,7 +598,7 @@
     jclass bitmap_class = env->FindClass("android/graphics/Bitmap");
     SkASSERT(bitmap_class);
     gBitmap_nativeBitmapFieldID = getFieldIDCheck(env, bitmap_class, "mNativeBitmap", "J");
-    gBitmap_layoutBoundsFieldID = getFieldIDCheck(env, bitmap_class, "mLayoutBounds", "[I");
+    gBitmap_layoutBoundsFieldID = getFieldIDCheck(env, bitmap_class, "mOpticalInsets", "[I");
     int ret = AndroidRuntime::registerNativeMethods(env,
                                     "android/graphics/BitmapFactory$Options",
                                     gOptionsMethods,
diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java
index 9d7ef45..9561ac4 100644
--- a/graphics/java/android/graphics/Bitmap.java
+++ b/graphics/java/android/graphics/Bitmap.java
@@ -16,6 +16,7 @@
 
 package android.graphics;
 
+import android.annotation.NonNull;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.util.DisplayMetrics;
@@ -73,7 +74,7 @@
     private boolean mRequestPremultiplied;
 
     private byte[] mNinePatchChunk;   // may be null
-    private int[] mLayoutBounds;   // may be null
+    private int[] mOpticalInsets;     // may be null
     private int mWidth;
     private int mHeight;
     private boolean mRecycled;
@@ -110,7 +111,7 @@
     @SuppressWarnings({"UnusedDeclaration"}) // called from JNI
     Bitmap(long nativeBitmap, byte[] buffer, int width, int height, int density,
             boolean isMutable, boolean requestPremultiplied,
-            byte[] ninePatchChunk, int[] layoutBounds) {
+            byte[] ninePatchChunk, int[] opticalInsets) {
         if (nativeBitmap == 0) {
             throw new RuntimeException("internal error: native bitmap is 0");
         }
@@ -125,7 +126,7 @@
         mFinalizer = new BitmapFinalizer(nativeBitmap);
 
         mNinePatchChunk = ninePatchChunk;
-        mLayoutBounds = layoutBounds;
+        mOpticalInsets = opticalInsets;
         if (density >= 0) {
             mDensity = density;
         }
@@ -292,16 +293,6 @@
     }
 
     /**
-     * Sets the layout bounds as an array of left, top, right, bottom integers
-     * @param bounds the array containing the padding values
-     *
-     * @hide
-     */
-    public void setLayoutBounds(int[] bounds) {
-        mLayoutBounds = bounds;
-    }
-
-    /**
      * Free the native object associated with this bitmap, and clear the
      * reference to the pixel data. This will not free the pixel data synchronously;
      * it simply allows it to be garbage collected if there are no other references.
@@ -949,11 +940,20 @@
     }
 
     /**
+     * Populates a rectangle with the bitmap's optical insets.
+     *
+     * @param outInsets Rect to populate with optical insets
      * @hide
-     * @return the layout padding [left, right, top, bottom]
      */
-    public int[] getLayoutBounds() {
-        return mLayoutBounds;
+    public void getOpticalInsets(@NonNull Rect outInsets) {
+        if (mOpticalInsets == null) {
+            outInsets.setEmpty();
+        } else {
+            outInsets.left = mOpticalInsets[0];
+            outInsets.top = mOpticalInsets[1];
+            outInsets.right = mOpticalInsets[2];
+            outInsets.bottom = mOpticalInsets[3];
+        }
     }
 
     /**
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index c4cfd4a..c2759ec 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -948,13 +948,10 @@
                 np = null;
                 pad = null;
             }
-            int[] layoutBounds = bm.getLayoutBounds();
-            Rect layoutBoundsRect = null;
-            if (layoutBounds != null) {
-                layoutBoundsRect = new Rect(layoutBounds[0], layoutBounds[1],
-                                             layoutBounds[2], layoutBounds[3]);
-            }
-            return drawableFromBitmap(res, bm, np, pad, layoutBoundsRect, srcName);
+
+            final Rect opticalInsets = new Rect();
+            bm.getOpticalInsets(opticalInsets);
+            return drawableFromBitmap(res, bm, np, pad, opticalInsets, srcName);
         }
         return null;
     }
diff --git a/graphics/java/android/graphics/drawable/InsetDrawable.java b/graphics/java/android/graphics/drawable/InsetDrawable.java
index eed86f6..e91ffb1 100644
--- a/graphics/java/android/graphics/drawable/InsetDrawable.java
+++ b/graphics/java/android/graphics/drawable/InsetDrawable.java
@@ -188,6 +188,16 @@
         }
     }
 
+    /** @hide */
+    @Override
+    public Insets getOpticalInsets() {
+        final Insets contentInsets = super.getOpticalInsets();
+        return Insets.of(contentInsets.left + mInsetState.mInsetLeft,
+                contentInsets.top + mInsetState.mInsetTop,
+                contentInsets.right + mInsetState.mInsetRight,
+                contentInsets.bottom + mInsetState.mInsetBottom);
+    }
+
     @Override
     public void setHotspot(float x, float y) {
         mInsetState.mDrawable.setHotspot(x, y);
diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
index 28335ea..6642bdd 100644
--- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java
+++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
@@ -23,12 +23,10 @@
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.Canvas;
-import android.graphics.Color;
 import android.graphics.ColorFilter;
 import android.graphics.Insets;
 import android.graphics.NinePatch;
 import android.graphics.Paint;
-import android.graphics.Paint.Style;
 import android.graphics.PixelFormat;
 import android.graphics.PorterDuff;
 import android.graphics.PorterDuff.Mode;
@@ -419,6 +417,9 @@
                         ": <nine-patch> requires a valid 9-patch source image");
             }
 
+            // Hey, now might be a good time to actually load optical bounds!
+            bitmap.getOpticalInsets(opticalInsets);
+
             state.mNinePatch = new NinePatch(bitmap, bitmap.getNinePatchChunk());
             state.mPadding = padding;
             state.mOpticalInsets = Insets.of(opticalInsets);