Skip to content

Commit 1b04c7a

Browse files
committed
Added possibility to specify Bitmap.Config for image decoding
1 parent 2f9919e commit 1b04c7a

File tree

10 files changed

+48
-16
lines changed

10 files changed

+48
-16
lines changed

picasso/src/main/java/com/squareup/picasso/AssetBitmapHunter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,8 @@ public AssetBitmapHunter(Context context, Picasso picasso, Dispatcher dispatcher
3333
}
3434

3535
Bitmap decodeAsset(String filePath) throws IOException {
36-
BitmapFactory.Options options = null;
36+
BitmapFactory.Options options = createBitmapOptions(data);
3737
if (data.hasSize()) {
38-
options = new BitmapFactory.Options();
3938
options.inJustDecodeBounds = true;
4039
InputStream is = null;
4140
try {

picasso/src/main/java/com/squareup/picasso/BitmapHunter.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,14 @@ static BitmapHunter forRequest(Context context, Picasso picasso, Dispatcher disp
216216
}
217217
}
218218

219+
static BitmapFactory.Options createBitmapOptions(Request data) {
220+
BitmapFactory.Options options = new BitmapFactory.Options();
221+
if (data.config != null) {
222+
options.inPreferredConfig = data.config;
223+
}
224+
return options;
225+
}
226+
219227
static void calculateInSampleSize(int reqWidth, int reqHeight, BitmapFactory.Options options) {
220228
calculateInSampleSize(reqWidth, reqHeight, options.outWidth, options.outHeight, options);
221229
}

picasso/src/main/java/com/squareup/picasso/ContactsPhotoBitmapHunter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,8 @@ private Bitmap decodeStream(InputStream stream, Request data) throws IOException
106106
if (stream == null) {
107107
return null;
108108
}
109-
BitmapFactory.Options options = null;
109+
BitmapFactory.Options options = createBitmapOptions(data);
110110
if (data.hasSize()) {
111-
options = new BitmapFactory.Options();
112111
options.inJustDecodeBounds = true;
113112
InputStream is = getInputStream();
114113
try {

picasso/src/main/java/com/squareup/picasso/ContentStreamBitmapHunter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,8 @@ class ContentStreamBitmapHunter extends BitmapHunter {
4444

4545
protected Bitmap decodeContentStream(Request data) throws IOException {
4646
ContentResolver contentResolver = context.getContentResolver();
47-
BitmapFactory.Options options = null;
47+
BitmapFactory.Options options = createBitmapOptions(data);
4848
if (data.hasSize()) {
49-
options = new BitmapFactory.Options();
5049
options.inJustDecodeBounds = true;
5150
InputStream is = null;
5251
try {

picasso/src/main/java/com/squareup/picasso/MediaStoreBitmapHunter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class MediaStoreBitmapHunter extends ContentStreamBitmapHunter {
5555

5656
long id = parseId(data.uri);
5757

58-
BitmapFactory.Options options = new BitmapFactory.Options();
58+
BitmapFactory.Options options = createBitmapOptions(data);
5959
options.inJustDecodeBounds = true;
6060

6161
calculateInSampleSize(data.targetWidth, data.targetHeight, picassoKind.width,

picasso/src/main/java/com/squareup/picasso/NetworkBitmapHunter.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,19 +87,17 @@ private Bitmap decodeStream(InputStream stream, Request data) throws IOException
8787
// Decode byte array instead
8888
if (isWebPFile) {
8989
byte[] bytes = Utils.toByteArray(stream);
90-
BitmapFactory.Options options = null;
90+
BitmapFactory.Options options = createBitmapOptions(data);
9191
if (data.hasSize()) {
92-
options = new BitmapFactory.Options();
9392
options.inJustDecodeBounds = true;
9493

9594
BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);
9695
calculateInSampleSize(data.targetWidth, data.targetHeight, options);
9796
}
9897
return BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options);
9998
} else {
100-
BitmapFactory.Options options = null;
99+
BitmapFactory.Options options = createBitmapOptions(data);
101100
if (data.hasSize()) {
102-
options = new BitmapFactory.Options();
103101
options.inJustDecodeBounds = true;
104102

105103
BitmapFactory.decodeStream(stream, null, options);

picasso/src/main/java/com/squareup/picasso/Request.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package com.squareup.picasso;
1717

18+
import android.graphics.Bitmap;
1819
import android.net.Uri;
1920
import java.util.ArrayList;
2021
import java.util.List;
@@ -61,10 +62,12 @@ public final class Request {
6162
public final float rotationPivotY;
6263
/** Whether or not {@link #rotationPivotX} and {@link #rotationPivotY} are set. */
6364
public final boolean hasRotationPivot;
65+
/** Target image config for decoding. */
66+
public final Bitmap.Config config;
6467

6568
private Request(Uri uri, int resourceId, List<Transformation> transformations, int targetWidth,
6669
int targetHeight, boolean centerCrop, boolean centerInside, float rotationDegrees,
67-
float rotationPivotX, float rotationPivotY, boolean hasRotationPivot) {
70+
float rotationPivotX, float rotationPivotY, boolean hasRotationPivot, Bitmap.Config config) {
6871
this.uri = uri;
6972
this.resourceId = resourceId;
7073
if (transformations == null) {
@@ -80,6 +83,7 @@ private Request(Uri uri, int resourceId, List<Transformation> transformations, i
8083
this.rotationPivotX = rotationPivotX;
8184
this.rotationPivotY = rotationPivotY;
8285
this.hasRotationPivot = hasRotationPivot;
86+
this.config = config;
8387
}
8488

8589
String getName() {
@@ -122,6 +126,7 @@ public static final class Builder {
122126
private float rotationPivotY;
123127
private boolean hasRotationPivot;
124128
private List<Transformation> transformations;
129+
private Bitmap.Config config;
125130

126131
/** Start building a request using the specified {@link Uri}. */
127132
public Builder(Uri uri) {
@@ -152,6 +157,7 @@ private Builder(Request request) {
152157
if (request.transformations != null) {
153158
transformations = new ArrayList<Transformation>(request.transformations);
154159
}
160+
config = request.config;
155161
}
156162

157163
boolean hasImage() {
@@ -273,6 +279,12 @@ public Builder clearRotation() {
273279
return this;
274280
}
275281

282+
/** Decode the image using the specified config. */
283+
public Builder config(Bitmap.Config config) {
284+
this.config = config;
285+
return this;
286+
}
287+
276288
/**
277289
* Add a custom transformation to be applied to the image.
278290
* <p/>
@@ -301,7 +313,7 @@ public Request build() {
301313
throw new IllegalStateException("Center inside requires calling resize.");
302314
}
303315
return new Request(uri, resourceId, transformations, targetWidth, targetHeight, centerCrop,
304-
centerInside, rotationDegrees, rotationPivotX, rotationPivotY, hasRotationPivot);
316+
centerInside, rotationDegrees, rotationPivotX, rotationPivotY, hasRotationPivot, config);
305317
}
306318
}
307319
}

picasso/src/main/java/com/squareup/picasso/RequestCreator.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@
2020
import android.graphics.drawable.Drawable;
2121
import android.net.Uri;
2222
import android.widget.ImageView;
23-
import java.io.IOException;
2423
import org.jetbrains.annotations.TestOnly;
2524

25+
import java.io.IOException;
26+
2627
import static com.squareup.picasso.BitmapHunter.forRequest;
2728
import static com.squareup.picasso.Picasso.LoadedFrom.MEMORY;
2829
import static com.squareup.picasso.Utils.checkNotMain;
@@ -174,6 +175,12 @@ public RequestCreator rotate(float degrees, float pivotX, float pivotY) {
174175
return this;
175176
}
176177

178+
/** Decode the image using the specified config. */
179+
public RequestCreator config(Bitmap.Config config) {
180+
data.config(config);
181+
return this;
182+
}
183+
177184
/**
178185
* Add a custom transformation to be applied to the image.
179186
* <p/>

picasso/src/main/java/com/squareup/picasso/ResourceBitmapHunter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,8 @@ class ResourceBitmapHunter extends BitmapHunter {
4343
}
4444

4545
private Bitmap decodeResource(Resources resources, int id, Request data) {
46-
BitmapFactory.Options bitmapOptions = null;
46+
BitmapFactory.Options bitmapOptions = createBitmapOptions(data);
4747
if (data.hasSize()) {
48-
bitmapOptions = new BitmapFactory.Options();
4948
bitmapOptions.inJustDecodeBounds = true;
5049
BitmapFactory.decodeResource(resources, id, bitmapOptions);
5150
calculateInSampleSize(data.targetWidth, data.targetHeight, bitmapOptions);

picasso/src/test/java/com/squareup/picasso/BitmapHunterTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.robolectric.shadows.ShadowMatrix;
3333

3434
import static android.graphics.Bitmap.Config.ARGB_8888;
35+
import static com.squareup.picasso.BitmapHunter.createBitmapOptions;
3536
import static com.squareup.picasso.BitmapHunter.forRequest;
3637
import static com.squareup.picasso.BitmapHunter.transformResult;
3738
import static com.squareup.picasso.Picasso.LoadedFrom.MEMORY;
@@ -328,6 +329,16 @@ public class BitmapHunterTest {
328329
assertThat(shadowMatrix.getPreOperations()).containsOnly("scale 2.0 1.5");
329330
}
330331

332+
@Test public void bitmapConfig() throws Exception {
333+
for (Bitmap.Config config : Bitmap.Config.values()) {
334+
Request data = new Request.Builder(URI_1).config(config).build();
335+
Request copy = data.buildUpon().build();
336+
337+
assertThat(createBitmapOptions(data).inPreferredConfig).isSameAs(config);
338+
assertThat(createBitmapOptions(copy).inPreferredConfig).isSameAs(config);
339+
}
340+
}
341+
331342
@Test public void centerCropTallTooSmall() throws Exception {
332343
Bitmap source = Bitmap.createBitmap(10, 20, ARGB_8888);
333344
Request data = new Request.Builder(URI_1).resize(40, 40).centerCrop().build();

0 commit comments

Comments
 (0)