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

Commit 47a7d61e authored by Chris Craik's avatar Chris Craik Committed by Android (Google) Code Review
Browse files

Merge "Clean up Outline API, method on drawable"

parents 7bb18852 7dc5b41e
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -10425,10 +10425,10 @@ package android.graphics {
    ctor public Outline();
    ctor public Outline(android.graphics.Outline);
    method public boolean canClip();
    method public boolean isValid();
    method public void reset();
    method public boolean isEmpty();
    method public void set(android.graphics.Outline);
    method public void setConvexPath(android.graphics.Path);
    method public void setEmpty();
    method public void setOval(int, int, int, int);
    method public void setOval(android.graphics.Rect);
    method public void setRect(int, int, int, int);
+1 −3
Original line number Diff line number Diff line
@@ -366,10 +366,8 @@ public class RenderNode {
     * Deep copies the data into native to simplify reference ownership.
     */
    public void setOutline(Outline outline) {
        if (outline == null) {
        if (outline == null || outline.isEmpty()) {
            nSetOutlineEmpty(mNativeRenderNode);
        } else if (!outline.isValid()) {
            throw new IllegalArgumentException("Outline must be valid");
        } else if (outline.mRect != null) {
            nSetOutlineRoundRect(mNativeRenderNode, outline.mRect.left, outline.mRect.top,
                    outline.mRect.right, outline.mRect.bottom, outline.mRadius);
+37 −13
Original line number Diff line number Diff line
@@ -10680,24 +10680,30 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
    }
    /**
     * Sets the outline of the view, which defines the shape of the shadow it
     * casts.
     * Sets the {@link Outline} of the view, which defines the shape of the shadow it
     * casts, and enables outline clipping.
     * <p>
     * If the outline is not set or is null, shadows will be cast from the
     * By default, a View queries its Outline from its background drawable, via
     * {@link Drawable#getOutline(Outline)}. Manually setting the Outline with this method allows
     * this behavior to be overridden.
     * <p>
     * If the outline is empty or is null, shadows will be cast from the
     * bounds of the View.
     * <p>
     * Only outlines that return true from {@link Outline#canClip()} may be used for clipping.
     *
     * @param outline The new outline of the view.
     *         Must be {@link android.graphics.Outline#isValid() valid.}
     *
     * @see #setClipToOutline(boolean)
     * @see #getClipToOutline()
     */
    public void setOutline(@Nullable Outline outline) {
        if (outline != null && !outline.isValid()) {
            throw new IllegalArgumentException("Outline must not be invalid");
        }
        mPrivateFlags3 |= PFLAG3_OUTLINE_DEFINED;
        if (outline == null) {
            mOutline = null;
        if (outline == null || outline.isEmpty()) {
            if (mOutline != null) {
                mOutline.setEmpty();
            }
        } else {
            // always copy the path since caller may reuse
            if (mOutline == null) {
@@ -10708,12 +10714,30 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
        mRenderNode.setOutline(mOutline);
    }
    /**
     * Returns whether the Outline should be used to clip the contents of the View.
     * <p>
     * Note that this flag will only be respected if the View's Outline returns true from
     * {@link Outline#canClip()}.
     *
     * @see #setOutline(Outline)
     * @see #setClipToOutline(boolean)
     */
    public final boolean getClipToOutline() {
        return mRenderNode.getClipToOutline();
    }
    /**
     * Sets whether the View's Outline should be used to clip the contents of the View.
     * <p>
     * Note that this flag will only be respected if the View's Outline returns true from
     * {@link Outline#canClip()}.
     *
     * @see #setOutline(Outline)
     * @see #getClipToOutline()
     */
    public void setClipToOutline(boolean clipToOutline) {
        // TODO: add a fast invalidation here
        damageInParent();
        if (getClipToOutline() != clipToOutline) {
            mRenderNode.setClipToOutline(clipToOutline);
        }
@@ -10726,10 +10750,10 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
                mOutline = new Outline();
            } else {
                //invalidate outline, to ensure background calculates it
                mOutline.reset();
                mOutline.setEmpty();
            }
            if (mBackground.getOutline(mOutline)) {
                if (!mOutline.isValid()) {
                if (mOutline.isEmpty()) {
                    throw new IllegalStateException("Background drawable failed to build outline");
                }
                mRenderNode.setOutline(mOutline);
+17 −9
Original line number Diff line number Diff line
@@ -23,9 +23,9 @@ import android.view.View;

/**
 * Defines a simple shape, used for bounding graphical regions.
 *
 * <p>
 * Can be used with a View, or computed by a Drawable, to drive the shape of shadows cast by a
 * View.
 * View, or to clip the contents of the View.
 *
 * @see View#setOutline(Outline)
 * @see Drawable#getOutline(Outline)
@@ -41,7 +41,7 @@ public final class Outline {
    public Path mPath;

    /**
     * Constructs an invalid Outline. Call one of the setter methods to make
     * Constructs an empty Outline. Call one of the setter methods to make
     * the outline valid for use with a View.
     */
    public Outline() {}
@@ -49,23 +49,31 @@ public final class Outline {
    /**
     * Constructs an Outline with a copy of the data in src.
     */
    public Outline(@Nullable Outline src) {
    public Outline(@NonNull Outline src) {
        set(src);
    }

    public void reset() {
    /**
     * Sets the outline to be empty.
     *
     * @see #isEmpty()
     */
    public void setEmpty() {
        mRadius = 0;
        mRect = null;
        mPath = null;
    }

    /**
     * Returns whether the Outline is valid for use with a View.
     * Returns whether the Outline is empty.
     * <p>
     * Outlines are invalid when constructed until a setter method is called.
     * Outlines are empty when constructed, or if {@link #setEmpty()} is called,
     * until a setter method is called
     *
     * @see #setEmpty()
     */
    public boolean isValid() {
        return mRect != null || mPath != null;
    public boolean isEmpty() {
        return mRect == null && mPath == null;
    }

    /**
+11 −6
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package android.graphics.drawable;

import android.annotation.NonNull;
import android.graphics.Insets;
import android.graphics.Xfermode;
import android.os.Trace;
@@ -816,11 +817,12 @@ public abstract class Drawable {
    /**
     * Return in padding the insets suggested by this Drawable for placing
     * content inside the drawable's bounds. Positive values move toward the
     * center of the Drawable (set Rect.inset). Returns true if this drawable
     * actually has a padding, else false. When false is returned, the padding
     * is always set to 0.
     * center of the Drawable (set Rect.inset).
     *
     * @return true if this drawable actually has a padding, else false. When false is returned,
     * the padding is always set to 0.
     */
    public boolean getPadding(Rect padding) {
    public boolean getPadding(@NonNull Rect padding) {
        padding.set(0, 0, 0, 0);
        return false;
    }
@@ -841,13 +843,16 @@ public abstract class Drawable {
     * This method will be called by a View on its background Drawable after bounds change, or its
     * Drawable is invalidated, if the View's Outline isn't set explicitly. This allows the
     * background Drawable to define the shape of the shadow cast by the View.
     *
     * <p>
     * The default behavior defines the outline to be the bounding rectangle. Subclasses that wish
     * to convey a different shape must override this method.
     *
     * @return true if this drawable actually has an outline, else false. The outline must be
     *         populated by the drawable if true is returned.
     *
     * @see View#setOutline(android.graphics.Outline)
     */
    public boolean getOutline(Outline outline) {
    public boolean getOutline(@NonNull Outline outline) {
        outline.setRect(getBounds());
        return true;
    }