Fix Palette setRegion() API
Causes an exception when the left/top of the
region isn't 0,0.
BUG: 25133337
Change-Id: Ifdd4cff9a96cc00e8e001ec33ee501d1355d936f
diff --git a/v7/palette/src/androidTest/java/android/support/v7/graphics/BucketTests.java b/v7/palette/src/androidTest/java/android/support/v7/graphics/BucketTests.java
index dc0ec1d..69c6735 100644
--- a/v7/palette/src/androidTest/java/android/support/v7/graphics/BucketTests.java
+++ b/v7/palette/src/androidTest/java/android/support/v7/graphics/BucketTests.java
@@ -66,4 +66,44 @@
assertEquals(swatches, p.getSwatches());
}
+
+ public void testRegionWhole() {
+ Palette.Builder b = new Palette.Builder(mSource);
+ b.setRegion(0, 0, mSource.getWidth(), mSource.getHeight());
+
+ Throwable thrown = null;
+ try {
+ b.generate();
+ } catch (Exception e) {
+ thrown = e;
+ }
+ assertNull(thrown);
+ }
+
+ public void testRegionUpperLeft() {
+ Palette.Builder b = new Palette.Builder(mSource);
+ b.setRegion(0, 0, mSource.getWidth() / 2, mSource.getHeight() / 2);
+
+ Throwable thrown = null;
+ try {
+ b.generate();
+ } catch (Exception e) {
+ thrown = e;
+ }
+ assertNull(thrown);
+ }
+
+ public void testRegionBottomRight() {
+ Palette.Builder b = new Palette.Builder(mSource);
+ b.setRegion(mSource.getWidth() / 2, mSource.getHeight() / 2,
+ mSource.getWidth(), mSource.getHeight());
+
+ Throwable thrown = null;
+ try {
+ b.generate();
+ } catch (Exception e) {
+ thrown = e;
+ }
+ assertNull(thrown);
+ }
}
diff --git a/v7/palette/src/main/java/android/support/v7/graphics/Palette.java b/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
index f0e9b8e..243bc8f 100644
--- a/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
+++ b/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
@@ -694,9 +694,9 @@
regionWidth, regionHeight);
// pixels now contains all of the pixels, but not packed together. We need to
// iterate through each row and copy them into a new smaller array
- final int[] subsetPixels = new int[regionWidth * mRegion.height()];
- for (int row = mRegion.top; row < mRegion.bottom; row++) {
- System.arraycopy(pixels, (row * bitmapWidth) + mRegion.left,
+ final int[] subsetPixels = new int[regionWidth * regionHeight];
+ for (int row = 0; row < regionHeight; row++) {
+ System.arraycopy(pixels, ((row + mRegion.top) * bitmapWidth) + mRegion.left,
subsetPixels, row * regionWidth, regionWidth);
}
return subsetPixels;