From c054966b719c8a7255f7cf4120cca5050acb68bd Mon Sep 17 00:00:00 2001 From: Alan Viverette Date: Thu, 3 Jul 2014 15:16:41 -0700 Subject: [PATCH] Make optical insets actually work Change-Id: I9fabf4cb939cc7a868f95580e7229745acde0418 --- core/jni/android/graphics/BitmapFactory.cpp | 2 +- graphics/java/android/graphics/Bitmap.java | 32 +++++++++---------- .../android/graphics/drawable/Drawable.java | 11 +++---- .../graphics/drawable/InsetDrawable.java | 10 ++++++ .../graphics/drawable/NinePatchDrawable.java | 5 +-- 5 files changed, 34 insertions(+), 26 deletions(-) diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 86ed677cbeebd..c99066d70035b 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -598,7 +598,7 @@ int register_android_graphics_BitmapFactory(JNIEnv* env) { 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 9d7ef452ebdb7..9561ac494c257 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 @@ public final class Bitmap implements Parcelable { 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 @@ public final class Bitmap implements Parcelable { @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 @@ public final class Bitmap implements Parcelable { mFinalizer = new BitmapFinalizer(nativeBitmap); mNinePatchChunk = ninePatchChunk; - mLayoutBounds = layoutBounds; + mOpticalInsets = opticalInsets; if (density >= 0) { mDensity = density; } @@ -291,16 +292,6 @@ public final class Bitmap implements Parcelable { mNinePatchChunk = chunk; } - /** - * 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; @@ -949,11 +940,20 @@ public final class Bitmap implements Parcelable { } /** + * 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 c4cfd4afe9842..c2759ec63bbbc 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -948,13 +948,10 @@ public abstract class Drawable { 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 eed86f64d9e6c..e91ffb1877ecc 100644 --- a/graphics/java/android/graphics/drawable/InsetDrawable.java +++ b/graphics/java/android/graphics/drawable/InsetDrawable.java @@ -188,6 +188,16 @@ public class InsetDrawable extends Drawable implements Drawable.Callback { } } + /** @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 28335eabe082d..6642bdd0a5de1 100644 --- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java +++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java @@ -23,12 +23,10 @@ import android.content.res.TypedArray; 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 @@ public class NinePatchDrawable extends Drawable { ": 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);