From b94f89094ade5fbdd05e14b57487a74aaacc184d Mon Sep 17 00:00:00 2001 From: sergeyv Date: Mon, 20 Mar 2017 19:07:46 -0700 Subject: [PATCH] Allow draw hw bitmap on software canvas for hierarchyviewer Test: runs hierarchyviewer on app with hw bitmaps bug:34745484 Change-Id: I35f70f7927be23edebac171f3bc96405b14ca794 --- core/java/android/view/View.java | 4 +++- graphics/java/android/graphics/BaseCanvas.java | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 636ad45e6da03..5ba4a493f9c98 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -17892,7 +17892,8 @@ public class View implements Drawable.Callback, KeyEvent.Callback, // This case should hopefully never or seldom happen canvas = new Canvas(bitmap); } - + boolean enabledHwBitmapsInSwMode = canvas.isHwBitmapsInSwModeEnabled(); + canvas.setHwBitmapsInSwModeEnabled(true); if ((backgroundColor & 0xff000000) != 0) { bitmap.eraseColor(backgroundColor); } @@ -17920,6 +17921,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, canvas.restoreToCount(restoreCount); canvas.setBitmap(null); + canvas.setHwBitmapsInSwModeEnabled(enabledHwBitmapsInSwMode); if (attachInfo != null) { // Restore the cached Canvas for our siblings diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java index 2ebd2cc6206b2..1f339f7aaa54f 100644 --- a/graphics/java/android/graphics/BaseCanvas.java +++ b/graphics/java/android/graphics/BaseCanvas.java @@ -48,6 +48,7 @@ public abstract class BaseCanvas { */ protected int mScreenDensity = Bitmap.DENSITY_NONE; protected int mDensity = Bitmap.DENSITY_NONE; + private boolean mAllowHwBitmapsInSwMode = false; protected void throwIfCannotDraw(Bitmap bitmap) { if (bitmap.isRecycled()) { @@ -511,8 +512,23 @@ public abstract class BaseCanvas { indices, indexOffset, indexCount, paint.getNativeInstance()); } + /** + * @hide + */ + public void setHwBitmapsInSwModeEnabled(boolean enabled) { + mAllowHwBitmapsInSwMode = enabled; + } + + /** + * @hide + */ + public boolean isHwBitmapsInSwModeEnabled() { + return mAllowHwBitmapsInSwMode; + } + private void throwIfHwBitmapInSwMode(Bitmap bitmap) { - if (!isHardwareAccelerated() && bitmap.getConfig() == Bitmap.Config.HARDWARE) { + if (!mAllowHwBitmapsInSwMode && !isHardwareAccelerated() + && bitmap.getConfig() == Bitmap.Config.HARDWARE) { throw new IllegalStateException("Software rendering doesn't support hardware bitmaps"); } }