Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c054966b authored by Alan Viverette's avatar Alan Viverette
Browse files

Make optical insets actually work

Change-Id: I9fabf4cb939cc7a868f95580e7229745acde0418
parent 40d43b27
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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,
+16 −16
Original line number Diff line number Diff line
@@ -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];
        }
    }

    /**
+4 −7
Original line number Diff line number Diff line
@@ -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;
    }
+10 −0
Original line number Diff line number Diff line
@@ -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);
+3 −2
Original line number Diff line number Diff line
@@ -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 {
                        ": <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);