diff --git a/core/java/android/view/DisplayListCanvas.java b/core/java/android/view/DisplayListCanvas.java index 415c29107a948..cb7c5a22fa401 100644 --- a/core/java/android/view/DisplayListCanvas.java +++ b/core/java/android/view/DisplayListCanvas.java @@ -37,6 +37,8 @@ public class DisplayListCanvas extends Canvas { // view hierarchy because display lists are generated recursively. private static final int POOL_LIMIT = 25; + private static final int MAX_BITMAP_SIZE = 100 * 1024 * 1024; // 100 MB + private static final SynchronizedPool sPool = new SynchronizedPool(POOL_LIMIT); @@ -249,4 +251,14 @@ public class DisplayListCanvas extends Canvas { private static native void nDrawRoundRect(long renderer, long propLeft, long propTop, long propRight, long propBottom, long propRx, long propRy, long propPaint); + + @Override + protected void throwIfCannotDraw(Bitmap bitmap) { + super.throwIfCannotDraw(bitmap); + int bitmapSize = bitmap.getByteCount(); + if (bitmapSize > MAX_BITMAP_SIZE) { + throw new RuntimeException( + "Canvas: trying to draw too large(" + bitmapSize + "bytes) bitmap."); + } + } } diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index af99f79e4b3b1..c65880b2fccea 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -1266,7 +1266,7 @@ public class Canvas { /** * @hide */ - protected static void throwIfCannotDraw(Bitmap bitmap) { + protected void throwIfCannotDraw(Bitmap bitmap) { if (bitmap.isRecycled()) { throw new RuntimeException("Canvas: trying to use a recycled bitmap " + bitmap); }