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

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

Merge "Add compat path for restore underflow"

parents f4c301bd 3891f3ad
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -48,7 +48,6 @@ public class DisplayListCanvas extends Canvas {
    private int mWidth;
    private int mHeight;


    static DisplayListCanvas obtain(@NonNull RenderNode node) {
        if (node == null) throw new IllegalArgumentException("node cannot be null");
        DisplayListCanvas canvas = sPool.acquire();
+1 −6
Original line number Diff line number Diff line
@@ -240,12 +240,7 @@ public class RenderNode {
     * @see #start(int, int)
     * @see #isValid()
     */
    public void end(DisplayListCanvas endCanvas) {
        if (!(endCanvas instanceof DisplayListCanvas)) {
            throw new IllegalArgumentException("Passed an invalid canvas to end!");
        }

        DisplayListCanvas canvas = (DisplayListCanvas) endCanvas;
    public void end(DisplayListCanvas canvas) {
        canvas.onPostDraw();
        long renderNodeData = canvas.finishRecording();
        nSetDisplayListData(mNativeRenderNode, renderNodeData);
+2 −0
Original line number Diff line number Diff line
@@ -3583,6 +3583,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback,
            // of whether a layout was requested on that View.
            sIgnoreMeasureCache = targetSdkVersion < KITKAT;
            Canvas.sCompatibilityRestore = targetSdkVersion < MNC;
            sCompatibilityDone = true;
        }
    }
+14 −8
Original line number Diff line number Diff line
@@ -86,21 +86,27 @@ static jint saveLayerAlpha(JNIEnv* env, jobject, jlong canvasHandle, jfloat l, j
    return static_cast<jint>(get_canvas(canvasHandle)->saveLayerAlpha(l, t, r, b, alpha, flags));
}

static void restore(JNIEnv* env, jobject, jlong canvasHandle) {
static void restore(JNIEnv* env, jobject, jlong canvasHandle, jboolean throwOnUnderflow) {
    Canvas* canvas = get_canvas(canvasHandle);
    if (canvas->getSaveCount() <= 1) {  // cannot restore anymore
        if (throwOnUnderflow) {
            doThrowISE(env, "Underflow in restore - more restores than saves");
        return;
        }
        return; // compat behavior - return without throwing
    }
    canvas->restore();
}

static void restoreToCount(JNIEnv* env, jobject, jlong canvasHandle, jint restoreCount) {
static void restoreToCount(JNIEnv* env, jobject, jlong canvasHandle, jint restoreCount,
        jboolean throwOnUnderflow) {
    Canvas* canvas = get_canvas(canvasHandle);
    if (restoreCount < 1 || restoreCount > canvas->getSaveCount()) {
        if (throwOnUnderflow) {
            doThrowIAE(env, "Underflow in restoreToCount - more restores than saves");
            return;
        }
        restoreCount = 1; // compat behavior - restore as far as possible
    }
    canvas->restoreToCount(restoreCount);
}

@@ -661,8 +667,8 @@ static JNINativeMethod gMethods[] = {
    {"native_saveLayer","(JFFFFJI)I", (void*) CanvasJNI::saveLayer},
    {"native_saveLayerAlpha","(JFFFFII)I", (void*) CanvasJNI::saveLayerAlpha},
    {"native_getSaveCount","(J)I", (void*) CanvasJNI::getSaveCount},
    {"native_restore","(J)V", (void*) CanvasJNI::restore},
    {"native_restoreToCount","(JI)V", (void*) CanvasJNI::restoreToCount},
    {"native_restore","(JZ)V", (void*) CanvasJNI::restore},
    {"native_restoreToCount","(JIZ)V", (void*) CanvasJNI::restoreToCount},
    {"native_getCTM", "(JJ)V", (void*)CanvasJNI::getCTM},
    {"native_setMatrix","(JJ)V", (void*) CanvasJNI::setMatrix},
    {"native_concat","(JJ)V", (void*) CanvasJNI::concat},
+9 −4
Original line number Diff line number Diff line
@@ -45,6 +45,8 @@ import javax.microedition.khronos.opengles.GL;
 * Canvas and Drawables</a> developer guide.</p></div>
 */
public class Canvas {
    /** @hide */
    public static boolean sCompatibilityRestore = false;

    /**
     * Should only be assigned in constructors (or setBitmap if software canvas),
@@ -557,7 +559,8 @@ public class Canvas {
     * an error to call restore() more times than save() was called.
     */
    public void restore() {
        native_restore(mNativeCanvasWrapper);
        boolean throwOnUnderflow = !sCompatibilityRestore || !isHardwareAccelerated();
        native_restore(mNativeCanvasWrapper, throwOnUnderflow);
    }

    /**
@@ -582,7 +585,8 @@ public class Canvas {
     * @param saveCount The save level to restore to.
     */
    public void restoreToCount(int saveCount) {
        native_restoreToCount(mNativeCanvasWrapper, saveCount);
        boolean throwOnUnderflow = !sCompatibilityRestore || !isHardwareAccelerated();
        native_restoreToCount(mNativeCanvasWrapper, saveCount, throwOnUnderflow);
    }

    /**
@@ -1988,9 +1992,10 @@ public class Canvas {
    private static native int native_saveLayerAlpha(long nativeCanvas, float l,
                                                    float t, float r, float b,
                                                    int alpha, int layerFlags);
    private static native void native_restore(long canvasHandle);
    private static native void native_restore(long canvasHandle, boolean tolerateUnderflow);
    private static native void native_restoreToCount(long canvasHandle,
                                                     int saveCount);
                                                     int saveCount,
                                                     boolean tolerateUnderflow);
    private static native int native_getSaveCount(long canvasHandle);

    private static native void native_translate(long canvasHandle,