From 76dc52ac36cfbe86ccc62e72fd9094bff2c42df0 Mon Sep 17 00:00:00 2001 From: Robin Lee Date: Thu, 4 Jan 2018 17:50:18 +0100 Subject: [PATCH] Fix small but crashy edge case in Icon.scaleDown Plus a regression test which throws an Exception for the old version. It shouldn't be an issue in the real world because there's absolutely no reason any app should be creating 1920*3px icons. Found while porting the code somewhere else. Test: runtest -x ./core/tests/coretests/src/android/graphics/drawable/IconTest.java Change-Id: I1283d982507221914ddad1313e16f63af13e245a --- .../src/android/graphics/drawable/IconTest.java | 15 +++++++++++++++ graphics/java/android/graphics/drawable/Icon.java | 6 ++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/core/tests/coretests/src/android/graphics/drawable/IconTest.java b/core/tests/coretests/src/android/graphics/drawable/IconTest.java index b7a48c7e6825a..64fadc03f0bb7 100644 --- a/core/tests/coretests/src/android/graphics/drawable/IconTest.java +++ b/core/tests/coretests/src/android/graphics/drawable/IconTest.java @@ -16,6 +16,8 @@ package android.graphics.drawable; +import static com.google.common.truth.Truth.assertThat; + import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Region; @@ -107,6 +109,19 @@ public class IconTest extends AndroidTestCase { } } + @SmallTest + public void testScaleDownIfNecessary() throws Exception { + final Bitmap bm = Bitmap.createBitmap(4321, 78, Bitmap.Config.ARGB_8888); + final Icon ic = Icon.createWithBitmap(bm); + ic.scaleDownIfNecessary(40, 20); + + assertThat(bm.getWidth()).isEqualTo(4321); + assertThat(bm.getHeight()).isEqualTo(78); + + assertThat(ic.getBitmap().getWidth()).isLessThan(41); + assertThat(ic.getBitmap().getHeight()).isLessThan(21); + } + @SmallTest public void testWithAdaptiveBitmap() throws Exception { final Bitmap bm1 = Bitmap.createBitmap(150, 150, Bitmap.Config.ARGB_8888); diff --git a/graphics/java/android/graphics/drawable/Icon.java b/graphics/java/android/graphics/drawable/Icon.java index c329918afc27b..749b75941ef95 100644 --- a/graphics/java/android/graphics/drawable/Icon.java +++ b/graphics/java/android/graphics/drawable/Icon.java @@ -819,8 +819,10 @@ public final class Icon implements Parcelable { if (bitmapWidth > maxWidth || bitmapHeight > maxHeight) { float scale = Math.min((float) maxWidth / bitmapWidth, (float) maxHeight / bitmapHeight); - bitmap = Bitmap.createScaledBitmap(bitmap, (int) (scale * bitmapWidth), - (int) (scale * bitmapHeight), true /* filter */); + bitmap = Bitmap.createScaledBitmap(bitmap, + Math.max(1, (int) (scale * bitmapWidth)), + Math.max(1, (int) (scale * bitmapHeight)), + true /* filter */); } return bitmap; }