Skip to content

Commit

Permalink
fix "rough scaling" bitmaps
Browse files Browse the repository at this point in the history
Fixes signalapp#3347
Closes signalapp#3408
// FREEBIE
  • Loading branch information
mcginty authored and moxie0 committed Jun 12, 2015
1 parent 5116c61 commit f72cd5b
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 9 deletions.
26 changes: 17 additions & 9 deletions src/org/thoughtcrime/securesms/util/BitmapUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -133,17 +133,11 @@ private static Bitmap createScaledBitmap(InputStream data, int maxWidth, int max
final int imageWidth = options.outWidth;
final int imageHeight = options.outHeight;

int scaler = 1;
int scaleFactor = (constrainedMemory ? 1 : 2);
while ((imageWidth / scaler / scaleFactor >= maxWidth) && (imageHeight / scaler / scaleFactor >= maxHeight)) {
scaler *= 2;
}

options.inSampleSize = scaler;
options.inSampleSize = getScaleFactor(imageWidth, imageHeight, maxWidth, maxHeight, constrainedMemory);
options.inJustDecodeBounds = false;

BufferedInputStream is = new BufferedInputStream(data);
Bitmap roughThumbnail = BitmapFactory.decodeStream(is, null, options);
InputStream is = new BufferedInputStream(data);
Bitmap roughThumbnail = BitmapFactory.decodeStream(is, null, options);
try {
is.close();
} catch (IOException ioe) {
Expand Down Expand Up @@ -189,6 +183,20 @@ private static Bitmap createScaledBitmap(InputStream data, int maxWidth, int max
}
}

@VisibleForTesting static int getScaleFactor(int inWidth, int inHeight,
int maxWidth, int maxHeight,
boolean constrained)
{
int scaler = 1;
while (!constrained && ((inWidth / scaler / 2 >= maxWidth) && (inHeight / scaler / 2 >= maxHeight))) {
scaler *= 2;
}
while (constrained && ((inWidth / scaler > maxWidth) || (inHeight / scaler > maxHeight))) {
scaler *= 2;
}
return scaler;
}

private static Bitmap fixOrientation(Bitmap bitmap, InputStream orientationStream) {
final int orientation = Exif.getOrientation(orientationStream);

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.thoughtcrime.securesms.util;

import org.thoughtcrime.securesms.TextSecureTestCase;

public class BitmapUtilTest extends TextSecureTestCase {
public void testScaleFactorNormal() {
assertEquals(1, BitmapUtil.getScaleFactor(1000, 1000, 9000, 9000, false));

assertEquals(1, BitmapUtil.getScaleFactor(1000, 1000, 750, 750, false));
assertEquals(2, BitmapUtil.getScaleFactor(1000, 1000, 500, 500, false));
assertEquals(2, BitmapUtil.getScaleFactor(1000, 1000, 499, 499, false));
assertEquals(4, BitmapUtil.getScaleFactor(1000, 1000, 250, 250, false));
assertEquals(4, BitmapUtil.getScaleFactor(1000, 1000, 249, 249, false));

assertEquals(1, BitmapUtil.getScaleFactor(1000, 500, 750, 750, false));
assertEquals(1, BitmapUtil.getScaleFactor(2000, 1000, 501, 501, false));
assertEquals(2, BitmapUtil.getScaleFactor(2000, 1000, 500, 500, false));
assertEquals(2, BitmapUtil.getScaleFactor(1000, 2000, 499, 499, false));
}

public void testScaleFactorConstrained() {
assertEquals(1, BitmapUtil.getScaleFactor(1000, 1000, 9000, 9000, true));

assertEquals(2, BitmapUtil.getScaleFactor(1000, 1000, 750, 750, true));
assertEquals(2, BitmapUtil.getScaleFactor(1000, 1000, 500, 500, true));
assertEquals(4, BitmapUtil.getScaleFactor(1000, 1000, 499, 499, true));
assertEquals(4, BitmapUtil.getScaleFactor(1000, 1000, 250, 250, true));
assertEquals(8, BitmapUtil.getScaleFactor(1000, 1000, 249, 249, true));

assertEquals(2, BitmapUtil.getScaleFactor(1000, 500, 750, 750, true));
assertEquals(4, BitmapUtil.getScaleFactor(2000, 1000, 500, 500, true));
assertEquals(8, BitmapUtil.getScaleFactor(1000, 2000, 499, 499, true));
}
}

0 comments on commit f72cd5b

Please sign in to comment.