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

Commit 445c83c7 authored by Romain Guy's avatar Romain Guy
Browse files

Ensure we always reset graphics modifiers

Bug #6025838

If a modifier is setup and not reset crashes can occur.

Change-Id: I715524fb46928f1f06499cc1402499ef59f4a050
parent c27cc01f
Loading
Loading
Loading
Loading
+148 −92
Original line number Original line Diff line number Diff line
@@ -407,10 +407,13 @@ class GLES20Canvas extends HardwareCanvas {
    void drawHardwareLayer(HardwareLayer layer, float x, float y, Paint paint) {
    void drawHardwareLayer(HardwareLayer layer, float x, float y, Paint paint) {
        final GLES20Layer glLayer = (GLES20Layer) layer;
        final GLES20Layer glLayer = (GLES20Layer) layer;
        int modifier = paint != null ? setupColorFilter(paint) : MODIFIER_NONE;
        int modifier = paint != null ? setupColorFilter(paint) : MODIFIER_NONE;
        try {
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;
            nDrawLayer(mRenderer, glLayer.getLayer(), x, y, nativePaint);
            nDrawLayer(mRenderer, glLayer.getLayer(), x, y, nativePaint);
        } finally {
            if (modifier != MODIFIER_NONE) nResetModifiers(mRenderer, modifier);
            if (modifier != MODIFIER_NONE) nResetModifiers(mRenderer, modifier);
        }
        }
    }


    private static native void nDrawLayer(int renderer, int layer, float x, float y, int paint);
    private static native void nDrawLayer(int renderer, int layer, float x, float y, int paint);


@@ -607,10 +610,14 @@ class GLES20Canvas extends HardwareCanvas {
            return saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom, paint, saveFlags);
            return saveLayer(bounds.left, bounds.top, bounds.right, bounds.bottom, paint, saveFlags);
        }
        }


        int count;
        int modifier = paint != null ? setupColorFilter(paint) : MODIFIER_NONE;
        int modifier = paint != null ? setupColorFilter(paint) : MODIFIER_NONE;
        try {
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;
        int count = nSaveLayer(mRenderer, nativePaint, saveFlags);
            count = nSaveLayer(mRenderer, nativePaint, saveFlags);
        } finally {
            if (modifier != MODIFIER_NONE) nResetModifiers(mRenderer, modifier);
            if (modifier != MODIFIER_NONE) nResetModifiers(mRenderer, modifier);
        }
        return count;
        return count;
    }
    }


@@ -620,10 +627,14 @@ class GLES20Canvas extends HardwareCanvas {
    public int saveLayer(float left, float top, float right, float bottom, Paint paint,
    public int saveLayer(float left, float top, float right, float bottom, Paint paint,
            int saveFlags) {
            int saveFlags) {
        if (left < right && top < bottom) {
        if (left < right && top < bottom) {
            int count;
            int modifier = paint != null ? setupColorFilter(paint) : MODIFIER_NONE;
            int modifier = paint != null ? setupColorFilter(paint) : MODIFIER_NONE;
            try {
                final int nativePaint = paint == null ? 0 : paint.mNativePaint;
                final int nativePaint = paint == null ? 0 : paint.mNativePaint;
            int count = nSaveLayer(mRenderer, left, top, right, bottom, nativePaint, saveFlags);
                count = nSaveLayer(mRenderer, left, top, right, bottom, nativePaint, saveFlags);
            } finally {
                if (modifier != MODIFIER_NONE) nResetModifiers(mRenderer, modifier);
                if (modifier != MODIFIER_NONE) nResetModifiers(mRenderer, modifier);
            }
            return count;
            return count;
        }
        }
        return save(saveFlags);
        return save(saveFlags);
@@ -707,10 +718,13 @@ class GLES20Canvas extends HardwareCanvas {
    public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter,
    public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter,
            Paint paint) {
            Paint paint) {
        int modifiers = setupModifiers(paint);
        int modifiers = setupModifiers(paint);
        nDrawArc(mRenderer, oval.left, oval.top, oval.right, oval.bottom, startAngle, sweepAngle,
        try {
                useCenter, paint.mNativePaint);
            nDrawArc(mRenderer, oval.left, oval.top, oval.right, oval.bottom,
                    startAngle, sweepAngle, useCenter, paint.mNativePaint);
        } finally {
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
        }
        }
    }


    private static native void nDrawArc(int renderer, float left, float top,
    private static native void nDrawArc(int renderer, float left, float top,
            float right, float bottom, float startAngle, float sweepAngle,
            float right, float bottom, float startAngle, float sweepAngle,
@@ -726,11 +740,14 @@ class GLES20Canvas extends HardwareCanvas {
        if (bitmap.isRecycled()) throw new IllegalArgumentException("Cannot draw recycled bitmaps");
        if (bitmap.isRecycled()) throw new IllegalArgumentException("Cannot draw recycled bitmaps");
        // Shaders are ignored when drawing patches
        // Shaders are ignored when drawing patches
        int modifier = paint != null ? setupColorFilter(paint) : MODIFIER_NONE;
        int modifier = paint != null ? setupColorFilter(paint) : MODIFIER_NONE;
        try {
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;
            nDrawPatch(mRenderer, bitmap.mNativeBitmap, bitmap.mBuffer, chunks,
            nDrawPatch(mRenderer, bitmap.mNativeBitmap, bitmap.mBuffer, chunks,
                    dst.left, dst.top, dst.right, dst.bottom, nativePaint);
                    dst.left, dst.top, dst.right, dst.bottom, nativePaint);
        } finally {
            if (modifier != MODIFIER_NONE) nResetModifiers(mRenderer, modifier);
            if (modifier != MODIFIER_NONE) nResetModifiers(mRenderer, modifier);
        }
        }
    }


    private static native void nDrawPatch(int renderer, int bitmap, byte[] buffer, byte[] chunks,
    private static native void nDrawPatch(int renderer, int bitmap, byte[] buffer, byte[] chunks,
            float left, float top, float right, float bottom, int paint);
            float left, float top, float right, float bottom, int paint);
@@ -740,10 +757,13 @@ class GLES20Canvas extends HardwareCanvas {
        if (bitmap.isRecycled()) throw new IllegalArgumentException("Cannot draw recycled bitmaps");
        if (bitmap.isRecycled()) throw new IllegalArgumentException("Cannot draw recycled bitmaps");
        // Shaders are ignored when drawing bitmaps
        // Shaders are ignored when drawing bitmaps
        int modifiers = paint != null ? setupModifiers(bitmap, paint) : MODIFIER_NONE;
        int modifiers = paint != null ? setupModifiers(bitmap, paint) : MODIFIER_NONE;
        try {
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;
            nDrawBitmap(mRenderer, bitmap.mNativeBitmap, bitmap.mBuffer, left, top, nativePaint);
            nDrawBitmap(mRenderer, bitmap.mNativeBitmap, bitmap.mBuffer, left, top, nativePaint);
        } finally {
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
        }
        }
    }


    private static native void nDrawBitmap(
    private static native void nDrawBitmap(
            int renderer, int bitmap, byte[] buffer, float left, float top, int paint);
            int renderer, int bitmap, byte[] buffer, float left, float top, int paint);
@@ -753,11 +773,14 @@ class GLES20Canvas extends HardwareCanvas {
        if (bitmap.isRecycled()) throw new IllegalArgumentException("Cannot draw recycled bitmaps");
        if (bitmap.isRecycled()) throw new IllegalArgumentException("Cannot draw recycled bitmaps");
        // Shaders are ignored when drawing bitmaps
        // Shaders are ignored when drawing bitmaps
        int modifiers = paint != null ? setupModifiers(bitmap, paint) : MODIFIER_NONE;
        int modifiers = paint != null ? setupModifiers(bitmap, paint) : MODIFIER_NONE;
        try {
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;
            nDrawBitmap(mRenderer, bitmap.mNativeBitmap, bitmap.mBuffer,
            nDrawBitmap(mRenderer, bitmap.mNativeBitmap, bitmap.mBuffer,
                    matrix.native_instance, nativePaint);
                    matrix.native_instance, nativePaint);
        } finally {
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
        }
        }
    }


    private static native void nDrawBitmap(int renderer, int bitmap, byte[] buff,
    private static native void nDrawBitmap(int renderer, int bitmap, byte[] buff,
            int matrix, int paint);
            int matrix, int paint);
@@ -767,6 +790,7 @@ class GLES20Canvas extends HardwareCanvas {
        if (bitmap.isRecycled()) throw new IllegalArgumentException("Cannot draw recycled bitmaps");
        if (bitmap.isRecycled()) throw new IllegalArgumentException("Cannot draw recycled bitmaps");
        // Shaders are ignored when drawing bitmaps
        // Shaders are ignored when drawing bitmaps
        int modifiers = paint != null ? setupModifiers(bitmap, paint) : MODIFIER_NONE;
        int modifiers = paint != null ? setupModifiers(bitmap, paint) : MODIFIER_NONE;
        try {
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;


            int left, top, right, bottom;
            int left, top, right, bottom;
@@ -783,14 +807,17 @@ class GLES20Canvas extends HardwareCanvas {


            nDrawBitmap(mRenderer, bitmap.mNativeBitmap, bitmap.mBuffer, left, top, right, bottom,
            nDrawBitmap(mRenderer, bitmap.mNativeBitmap, bitmap.mBuffer, left, top, right, bottom,
                    dst.left, dst.top, dst.right, dst.bottom, nativePaint);
                    dst.left, dst.top, dst.right, dst.bottom, nativePaint);
        } finally {
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
        }
        }
    }


    @Override
    @Override
    public void drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint) {
    public void drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint) {
        if (bitmap.isRecycled()) throw new IllegalArgumentException("Cannot draw recycled bitmaps");
        if (bitmap.isRecycled()) throw new IllegalArgumentException("Cannot draw recycled bitmaps");
        // Shaders are ignored when drawing bitmaps
        // Shaders are ignored when drawing bitmaps
        int modifiers = paint != null ? setupModifiers(bitmap, paint) : MODIFIER_NONE;
        int modifiers = paint != null ? setupModifiers(bitmap, paint) : MODIFIER_NONE;
        try {
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;
    
    
            float left, top, right, bottom;
            float left, top, right, bottom;
@@ -807,8 +834,10 @@ class GLES20Canvas extends HardwareCanvas {
    
    
            nDrawBitmap(mRenderer, bitmap.mNativeBitmap, bitmap.mBuffer, left, top, right, bottom,
            nDrawBitmap(mRenderer, bitmap.mNativeBitmap, bitmap.mBuffer, left, top, right, bottom,
                    dst.left, dst.top, dst.right, dst.bottom, nativePaint);
                    dst.left, dst.top, dst.right, dst.bottom, nativePaint);
        } finally {
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
        }
        }
    }


    private static native void nDrawBitmap(int renderer, int bitmap, byte[] buffer,
    private static native void nDrawBitmap(int renderer, int bitmap, byte[] buffer,
            float srcLeft, float srcTop, float srcRight, float srcBottom,
            float srcLeft, float srcTop, float srcRight, float srcBottom,
@@ -819,13 +848,16 @@ class GLES20Canvas extends HardwareCanvas {
            int width, int height, boolean hasAlpha, Paint paint) {
            int width, int height, boolean hasAlpha, Paint paint) {
        // Shaders are ignored when drawing bitmaps
        // Shaders are ignored when drawing bitmaps
        int modifier = paint != null ? setupColorFilter(paint) : MODIFIER_NONE;
        int modifier = paint != null ? setupColorFilter(paint) : MODIFIER_NONE;
        try {
            final Bitmap.Config config = hasAlpha ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
            final Bitmap.Config config = hasAlpha ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;
            final Bitmap b = Bitmap.createBitmap(colors, offset, stride, width, height, config);
            final Bitmap b = Bitmap.createBitmap(colors, offset, stride, width, height, config);
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;
            nDrawBitmap(mRenderer, b.mNativeBitmap, b.mBuffer, x, y, nativePaint);
            nDrawBitmap(mRenderer, b.mNativeBitmap, b.mBuffer, x, y, nativePaint);
            b.recycle();
            b.recycle();
        } finally {
            if (modifier != MODIFIER_NONE) nResetModifiers(mRenderer, modifier);
            if (modifier != MODIFIER_NONE) nResetModifiers(mRenderer, modifier);
        }
        }
    }


    @Override
    @Override
    public void drawBitmap(int[] colors, int offset, int stride, int x, int y,
    public void drawBitmap(int[] colors, int offset, int stride, int x, int y,
@@ -854,11 +886,14 @@ class GLES20Canvas extends HardwareCanvas {
        colorOffset = 0;
        colorOffset = 0;


        int modifiers = paint != null ? setupModifiers(bitmap, paint) : MODIFIER_NONE;
        int modifiers = paint != null ? setupModifiers(bitmap, paint) : MODIFIER_NONE;
        try {
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;        
            final int nativePaint = paint == null ? 0 : paint.mNativePaint;        
            nDrawBitmapMesh(mRenderer, bitmap.mNativeBitmap, bitmap.mBuffer, meshWidth, meshHeight,
            nDrawBitmapMesh(mRenderer, bitmap.mNativeBitmap, bitmap.mBuffer, meshWidth, meshHeight,
                    verts, vertOffset, colors, colorOffset, nativePaint);
                    verts, vertOffset, colors, colorOffset, nativePaint);
        } finally {
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
        }
        }
    }


    private static native void nDrawBitmapMesh(int renderer, int bitmap, byte[] buffer,
    private static native void nDrawBitmapMesh(int renderer, int bitmap, byte[] buffer,
            int meshWidth, int meshHeight, float[] verts, int vertOffset,
            int meshWidth, int meshHeight, float[] verts, int vertOffset,
@@ -867,9 +902,12 @@ class GLES20Canvas extends HardwareCanvas {
    @Override
    @Override
    public void drawCircle(float cx, float cy, float radius, Paint paint) {
    public void drawCircle(float cx, float cy, float radius, Paint paint) {
        int modifiers = setupModifiers(paint);
        int modifiers = setupModifiers(paint);
        try {
            nDrawCircle(mRenderer, cx, cy, radius, paint.mNativePaint);
            nDrawCircle(mRenderer, cx, cy, radius, paint.mNativePaint);
        } finally {
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
        }
        }
    }


    private static native void nDrawCircle(int renderer, float cx, float cy,
    private static native void nDrawCircle(int renderer, float cx, float cy,
            float radius, int paint);
            float radius, int paint);
@@ -901,9 +939,12 @@ class GLES20Canvas extends HardwareCanvas {
            throw new IllegalArgumentException("The lines array must contain 4 elements per line.");
            throw new IllegalArgumentException("The lines array must contain 4 elements per line.");
        }
        }
        int modifiers = setupModifiers(paint);
        int modifiers = setupModifiers(paint);
        try {
            nDrawLines(mRenderer, pts, offset, count, paint.mNativePaint);
            nDrawLines(mRenderer, pts, offset, count, paint.mNativePaint);
        } finally {
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
        }
        }
    }


    private static native void nDrawLines(int renderer, float[] points,
    private static native void nDrawLines(int renderer, float[] points,
            int offset, int count, int paint);
            int offset, int count, int paint);
@@ -916,9 +957,12 @@ class GLES20Canvas extends HardwareCanvas {
    @Override
    @Override
    public void drawOval(RectF oval, Paint paint) {
    public void drawOval(RectF oval, Paint paint) {
        int modifiers = setupModifiers(paint);
        int modifiers = setupModifiers(paint);
        try {
            nDrawOval(mRenderer, oval.left, oval.top, oval.right, oval.bottom, paint.mNativePaint);
            nDrawOval(mRenderer, oval.left, oval.top, oval.right, oval.bottom, paint.mNativePaint);
        } finally {
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
        }
        }
    }


    private static native void nDrawOval(int renderer, float left, float top,
    private static native void nDrawOval(int renderer, float left, float top,
            float right, float bottom, int paint);
            float right, float bottom, int paint);
@@ -933,6 +977,7 @@ class GLES20Canvas extends HardwareCanvas {
    @Override
    @Override
    public void drawPath(Path path, Paint paint) {
    public void drawPath(Path path, Paint paint) {
        int modifiers = setupModifiers(paint);
        int modifiers = setupModifiers(paint);
        try {
            if (path.isSimplePath) {
            if (path.isSimplePath) {
                if (path.rects != null) {
                if (path.rects != null) {
                    nDrawRects(mRenderer, path.rects.mNativeRegion, paint.mNativePaint);
                    nDrawRects(mRenderer, path.rects.mNativeRegion, paint.mNativePaint);
@@ -940,8 +985,10 @@ class GLES20Canvas extends HardwareCanvas {
            } else {
            } else {
                nDrawPath(mRenderer, path.mNativePath, paint.mNativePaint);
                nDrawPath(mRenderer, path.mNativePath, paint.mNativePaint);
            }
            }
        } finally {
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
        }
        }
    }


    private static native void nDrawPath(int renderer, int path, int paint);
    private static native void nDrawPath(int renderer, int path, int paint);
    private static native void nDrawRects(int renderer, int region, int paint);
    private static native void nDrawRects(int renderer, int region, int paint);
@@ -1001,9 +1048,12 @@ class GLES20Canvas extends HardwareCanvas {
    @Override
    @Override
    public void drawPoints(float[] pts, int offset, int count, Paint paint) {
    public void drawPoints(float[] pts, int offset, int count, Paint paint) {
        int modifiers = setupModifiers(paint);
        int modifiers = setupModifiers(paint);
        try {
            nDrawPoints(mRenderer, pts, offset, count, paint.mNativePaint);
            nDrawPoints(mRenderer, pts, offset, count, paint.mNativePaint);
        } finally {
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
        }
        }
    }


    private static native void nDrawPoints(int renderer, float[] points,
    private static native void nDrawPoints(int renderer, float[] points,
            int offset, int count, int paint);
            int offset, int count, int paint);
@@ -1047,9 +1097,12 @@ class GLES20Canvas extends HardwareCanvas {
    @Override
    @Override
    public void drawRect(float left, float top, float right, float bottom, Paint paint) {
    public void drawRect(float left, float top, float right, float bottom, Paint paint) {
        int modifiers = setupModifiers(paint);
        int modifiers = setupModifiers(paint);
        try {
            nDrawRect(mRenderer, left, top, right, bottom, paint.mNativePaint);
            nDrawRect(mRenderer, left, top, right, bottom, paint.mNativePaint);
        } finally {
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
        }
        }
    }


    private static native void nDrawRect(int renderer, float left, float top,
    private static native void nDrawRect(int renderer, float left, float top,
            float right, float bottom, int paint);
            float right, float bottom, int paint);
@@ -1072,10 +1125,13 @@ class GLES20Canvas extends HardwareCanvas {
    @Override
    @Override
    public void drawRoundRect(RectF rect, float rx, float ry, Paint paint) {
    public void drawRoundRect(RectF rect, float rx, float ry, Paint paint) {
        int modifiers = setupModifiers(paint);
        int modifiers = setupModifiers(paint);
        try {
            nDrawRoundRect(mRenderer, rect.left, rect.top, rect.right, rect.bottom,
            nDrawRoundRect(mRenderer, rect.left, rect.top, rect.right, rect.bottom,
                    rx, ry, paint.mNativePaint);
                    rx, ry, paint.mNativePaint);
        } finally {
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
            if (modifiers != MODIFIER_NONE) nResetModifiers(mRenderer, modifiers);
        }
        }
    }


    private static native void nDrawRoundRect(int renderer, float left, float top,
    private static native void nDrawRoundRect(int renderer, float left, float top,
            float right, float bottom, float rx, float y, int paint);
            float right, float bottom, float rx, float y, int paint);
@@ -1223,10 +1279,7 @@ class GLES20Canvas extends HardwareCanvas {
    }
    }


    private int setupModifiers(Bitmap b, Paint paint) {
    private int setupModifiers(Bitmap b, Paint paint) {
        if (b.getConfig() == Bitmap.Config.ALPHA_8) {
        if (b.getConfig() != Bitmap.Config.ALPHA_8) {
            return setupModifiers(paint);
        }

            final ColorFilter filter = paint.getColorFilter();
            final ColorFilter filter = paint.getColorFilter();
            if (filter != null) {
            if (filter != null) {
                nSetupColorFilter(mRenderer, filter.nativeColorFilter);
                nSetupColorFilter(mRenderer, filter.nativeColorFilter);
@@ -1234,6 +1287,9 @@ class GLES20Canvas extends HardwareCanvas {
            }
            }


            return MODIFIER_NONE;
            return MODIFIER_NONE;
        } else {
            return setupModifiers(paint);
        }
    }
    }


    private int setupModifiers(Paint paint) {
    private int setupModifiers(Paint paint) {