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);