From 037fc1815b0f69b0b24e68e16281b490bdeb1d56 Mon Sep 17 00:00:00 2001 From: Teng-Hui Zhu Date: Wed, 16 Nov 2016 10:29:39 -0800 Subject: [PATCH] Recreate the bitmap cache when it is smaller than needed fix:32780212 Test: Existing CTS and attached repro apk. Change-Id: Ib908319af6539b2438b850f7a50d5a539cef8368 --- libs/hwui/VectorDrawable.cpp | 2 +- libs/hwui/VectorDrawable.h | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/libs/hwui/VectorDrawable.cpp b/libs/hwui/VectorDrawable.cpp index b50647adc0beb..8a8f26707845f 100644 --- a/libs/hwui/VectorDrawable.cpp +++ b/libs/hwui/VectorDrawable.cpp @@ -574,7 +574,7 @@ bool Tree::allocateBitmapIfNeeded(Cache& cache, int width, int height) { } bool Tree::canReuseBitmap(Bitmap* bitmap, int width, int height) { - return bitmap && width == bitmap->width() && height == bitmap->height(); + return bitmap && width <= bitmap->width() && height <= bitmap->height(); } void Tree::onPropertyChanged(TreeProperties* prop) { diff --git a/libs/hwui/VectorDrawable.h b/libs/hwui/VectorDrawable.h index e9a9c719975a4..8244a39111838 100644 --- a/libs/hwui/VectorDrawable.h +++ b/libs/hwui/VectorDrawable.h @@ -630,10 +630,15 @@ public: } void setScaledSize(int width, int height) { - if (mNonAnimatableProperties.scaledWidth != width - || mNonAnimatableProperties.scaledHeight != height) { - mNonAnimatableProperties.scaledWidth = width; - mNonAnimatableProperties.scaledHeight = height; + // If the requested size is bigger than what the bitmap was, then + // we increase the bitmap size to match. The width and height + // are bound by MAX_CACHED_BITMAP_SIZE. + if (mNonAnimatableProperties.scaledWidth < width + || mNonAnimatableProperties.scaledHeight < height) { + mNonAnimatableProperties.scaledWidth = std::max(width, + mNonAnimatableProperties.scaledWidth); + mNonAnimatableProperties.scaledHeight = std::max(height, + mNonAnimatableProperties.scaledHeight); mNonAnimatablePropertiesDirty = true; mTree->onPropertyChanged(this); }