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

Commit 3891f3ad authored by Chris Craik's avatar Chris Craik
Browse files

Add compat path for restore underflow

bug:19829784

Change-Id: Ia761664208ab80c055ca11174db3ddc74457b92b
parent 095d9990
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
@@ -3582,6 +3582,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,