diff --git a/library/src/androidTest/java/com/bumptech/glide/load/resource/gif/GifResourceDecoderTest.java b/library/src/androidTest/java/com/bumptech/glide/load/resource/gif/GifResourceDecoderTest.java index e240aa8a42..277ac0b35a 100644 --- a/library/src/androidTest/java/com/bumptech/glide/load/resource/gif/GifResourceDecoderTest.java +++ b/library/src/androidTest/java/com/bumptech/glide/load/resource/gif/GifResourceDecoderTest.java @@ -4,6 +4,7 @@ import com.bumptech.glide.gifdecoder.GifDecoder; import com.bumptech.glide.gifdecoder.GifHeader; import com.bumptech.glide.gifdecoder.GifHeaderParser; +import com.bumptech.glide.load.DecodeFormat; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.tests.GlideShadowLooper; @@ -54,7 +55,8 @@ public void setUp() { decoderPool = mock(GifResourceDecoder.GifDecoderPool.class); when(decoderPool.obtain(any(GifDecoder.BitmapProvider.class))).thenReturn(gifDecoder); - decoder = new GifResourceDecoder(Robolectric.application, bitmapPool, parserPool, decoderPool); + decoder = new GifResourceDecoder(Robolectric.application, bitmapPool, DecodeFormat.PREFER_RGB_565, + parserPool, decoderPool); } @Test @@ -97,6 +99,23 @@ public void testReturnsParserToPoolWhenParserThrows() { verify(parserPool).release(eq(parser)); } + + @Test + public void testSetsPreferredConfigOnDecoderBeforeDecoding() { + when(gifHeader.getNumFrames()).thenReturn(1); + when(gifHeader.getStatus()).thenReturn(GifDecoder.STATUS_OK); + when(gifDecoder.getNextFrame()).thenReturn(Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888)); + + decoder = new GifResourceDecoder(Robolectric.application, mock(BitmapPool.class), DecodeFormat.ALWAYS_ARGB_8888, + parserPool, decoderPool); + + decoder.decode(new ByteArrayInputStream(new byte[0]), 100, 100); + + InOrder order = inOrder(gifDecoder); + order.verify(gifDecoder).setPreferredConfig(eq(Bitmap.Config.ARGB_8888)); + order.verify(gifDecoder).getNextFrame(); + } + @Test public void testDecodesFirstFrameAndReturnsGifDecoderToPool() { when(gifHeader.getNumFrames()).thenReturn(1); diff --git a/library/src/main/java/com/bumptech/glide/BitmapRequestBuilder.java b/library/src/main/java/com/bumptech/glide/BitmapRequestBuilder.java index c675ad28b6..15b4ca8568 100644 --- a/library/src/main/java/com/bumptech/glide/BitmapRequestBuilder.java +++ b/library/src/main/java/com/bumptech/glide/BitmapRequestBuilder.java @@ -47,7 +47,7 @@ public class BitmapRequestBuilder private final BitmapPool bitmapPool; private Downsampler downsampler = Downsampler.AT_LEAST; - private DecodeFormat decodeFormat = DecodeFormat.PREFER_RGB_565; + private DecodeFormat decodeFormat; private ResourceDecoder imageDecoder; private ResourceDecoder videoDecoder; @@ -55,9 +55,10 @@ public class BitmapRequestBuilder Class transcodeClass, GenericRequestBuilder other) { super(loadProvider, transcodeClass, other); this.bitmapPool = other.glide.getBitmapPool(); + this.decodeFormat = other.glide.getDecodeFormat(); - imageDecoder = new StreamBitmapDecoder(bitmapPool); - videoDecoder = new FileDescriptorBitmapDecoder(bitmapPool); + imageDecoder = new StreamBitmapDecoder(bitmapPool, decodeFormat); + videoDecoder = new FileDescriptorBitmapDecoder(bitmapPool, decodeFormat); } /** diff --git a/library/src/main/java/com/bumptech/glide/Glide.java b/library/src/main/java/com/bumptech/glide/Glide.java index 17cdc27857..905c3a5eb0 100644 --- a/library/src/main/java/com/bumptech/glide/Glide.java +++ b/library/src/main/java/com/bumptech/glide/Glide.java @@ -15,6 +15,7 @@ import android.util.Log; import android.view.View; import android.widget.ImageView; +import com.bumptech.glide.load.DecodeFormat; import com.bumptech.glide.load.engine.Engine; import com.bumptech.glide.load.engine.prefill.PreFillBitmapAttribute; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; @@ -85,6 +86,7 @@ public class Glide { private final Engine engine; private final BitmapPool bitmapPool; private final MemoryCache memoryCache; + private final DecodeFormat decodeFormat; private final ImageViewTargetFactory imageViewTargetFactory = new ImageViewTargetFactory(); private final TranscoderRegistry transcoderRegistry = new TranscoderRegistry(); private final DataLoadProviderRegistry dataLoadProviderRegistry; @@ -181,24 +183,30 @@ static void tearDown() { glide = null; } - Glide(Engine engine, MemoryCache memoryCache, BitmapPool bitmapPool, Context context) { + Glide(Engine engine, MemoryCache memoryCache, BitmapPool bitmapPool, Context context, DecodeFormat decodeFormat) { this.engine = engine; this.bitmapPool = bitmapPool; this.memoryCache = memoryCache; + this.decodeFormat = decodeFormat; mainHandler = new Handler(Looper.getMainLooper()); bitmapPreFiller = new BitmapPreFiller(memoryCache, bitmapPool); dataLoadProviderRegistry = new DataLoadProviderRegistry(); - dataLoadProviderRegistry.register(InputStream.class, Bitmap.class, - new StreamBitmapDataLoadProvider(bitmapPool)); - dataLoadProviderRegistry.register(ParcelFileDescriptor.class, Bitmap.class, - new FileDescriptorBitmapDataLoadProvider(bitmapPool)); + StreamBitmapDataLoadProvider streamBitmapLoadProvider = + new StreamBitmapDataLoadProvider(bitmapPool, decodeFormat); + dataLoadProviderRegistry.register(InputStream.class, Bitmap.class, streamBitmapLoadProvider); - ImageVideoDataLoadProvider imageVideoDataLoadProvider = new ImageVideoDataLoadProvider(bitmapPool); + FileDescriptorBitmapDataLoadProvider fileDescriptorLoadProvider = + new FileDescriptorBitmapDataLoadProvider(bitmapPool, decodeFormat); + dataLoadProviderRegistry.register(ParcelFileDescriptor.class, Bitmap.class, fileDescriptorLoadProvider); + + ImageVideoDataLoadProvider imageVideoDataLoadProvider = + new ImageVideoDataLoadProvider(streamBitmapLoadProvider, fileDescriptorLoadProvider); dataLoadProviderRegistry.register(ImageVideoWrapper.class, Bitmap.class, imageVideoDataLoadProvider); - GifDrawableLoadProvider gifDrawableLoadProvider = new GifDrawableLoadProvider(context, bitmapPool); + GifDrawableLoadProvider gifDrawableLoadProvider = + new GifDrawableLoadProvider(context, bitmapPool, decodeFormat); dataLoadProviderRegistry.register(InputStream.class, GifDrawable.class, gifDrawableLoadProvider); dataLoadProviderRegistry.register(ImageVideoWrapper.class, GifBitmapWrapper.class, @@ -295,6 +303,10 @@ Handler getMainHandler() { return mainHandler; } + DecodeFormat getDecodeFormat() { + return decodeFormat; + } + private GenericLoaderFactory getLoaderFactory() { return loaderFactory; } diff --git a/library/src/main/java/com/bumptech/glide/GlideBuilder.java b/library/src/main/java/com/bumptech/glide/GlideBuilder.java index 45cd6ac8f9..f7ffcecb21 100644 --- a/library/src/main/java/com/bumptech/glide/GlideBuilder.java +++ b/library/src/main/java/com/bumptech/glide/GlideBuilder.java @@ -2,6 +2,7 @@ import android.content.Context; import android.os.Build; +import com.bumptech.glide.load.DecodeFormat; import com.bumptech.glide.load.engine.Engine; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPoolAdapter; @@ -29,6 +30,7 @@ public class GlideBuilder { private DiskCache diskCache; private ExecutorService sourceService; private ExecutorService diskCacheService; + private DecodeFormat decodeFormat; public GlideBuilder(Context context) { this.context = context.getApplicationContext(); @@ -110,6 +112,29 @@ public GlideBuilder setDiskCacheService(ExecutorService service) { return this; } + /** + * Sets the {@link com.bumptech.glide.load.DecodeFormat} that will be the default format for all the default + * decoders that can change the {@link android.graphics.Bitmap.Config} of the {@link android.graphics.Bitmap}s they + * decode. + * + *

+ * Decode format is always a suggestion, not a requirement. See {@link com.bumptech.glide.load.DecodeFormat} for + * more details. + *

+ * + *

+ * If you instantiate and use a custom decoder, it will use + * {@link com.bumptech.glide.load.DecodeFormat#DEFAULT} as its default. + *

+ * + * @param decodeFormat The format to use. + * @return This builder. + */ + public GlideBuilder setDecodeFormat(DecodeFormat decodeFormat) { + this.decodeFormat = decodeFormat; + return this; + } + // For testing. GlideBuilder setEngine(Engine engine) { this.engine = engine; @@ -152,6 +177,10 @@ Glide createGlide() { engine = new Engine(memoryCache, diskCache, diskCacheService, sourceService); } - return new Glide(engine, memoryCache, bitmapPool, context); + if (decodeFormat == null) { + decodeFormat = DecodeFormat.DEFAULT; + } + + return new Glide(engine, memoryCache, bitmapPool, context, decodeFormat); } } \ No newline at end of file diff --git a/library/src/main/java/com/bumptech/glide/load/DecodeFormat.java b/library/src/main/java/com/bumptech/glide/load/DecodeFormat.java index 1d16605b6c..afb892a3ee 100644 --- a/library/src/main/java/com/bumptech/glide/load/DecodeFormat.java +++ b/library/src/main/java/com/bumptech/glide/load/DecodeFormat.java @@ -1,5 +1,7 @@ package com.bumptech.glide.load; +import android.os.Build; + /** * Options for setting the value of {@link android.graphics.Bitmap#getConfig()} for {@link android.graphics.Bitmap}s * returned by a {@link com.bumptech.glide.load.resource.bitmap.BitmapDecoder}. @@ -25,5 +27,9 @@ public enum DecodeFormat { * {@link android.graphics.Bitmap.Config#RGB_565} for {@link android.graphics.Bitmap#getConfig()}. * */ - PREFER_RGB_565, + PREFER_RGB_565; + + /** The default value for DecodeFormat. */ + public static final DecodeFormat DEFAULT = Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT + ? ALWAYS_ARGB_8888 : PREFER_RGB_565; } diff --git a/library/src/main/java/com/bumptech/glide/load/resource/bitmap/FileDescriptorBitmapDataLoadProvider.java b/library/src/main/java/com/bumptech/glide/load/resource/bitmap/FileDescriptorBitmapDataLoadProvider.java index 086bbf4389..cbab427539 100644 --- a/library/src/main/java/com/bumptech/glide/load/resource/bitmap/FileDescriptorBitmapDataLoadProvider.java +++ b/library/src/main/java/com/bumptech/glide/load/resource/bitmap/FileDescriptorBitmapDataLoadProvider.java @@ -3,6 +3,7 @@ import android.graphics.Bitmap; import android.os.ParcelFileDescriptor; +import com.bumptech.glide.load.DecodeFormat; import com.bumptech.glide.provider.DataLoadProvider; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; @@ -23,9 +24,9 @@ public class FileDescriptorBitmapDataLoadProvider implements DataLoadProvider sourceEncoder; - public FileDescriptorBitmapDataLoadProvider(BitmapPool bitmapPool) { - cacheDecoder = new FileToStreamDecoder(new StreamBitmapDecoder(bitmapPool)); - sourceDecoder = new FileDescriptorBitmapDecoder(bitmapPool); + public FileDescriptorBitmapDataLoadProvider(BitmapPool bitmapPool, DecodeFormat decodeFormat) { + cacheDecoder = new FileToStreamDecoder(new StreamBitmapDecoder(bitmapPool, decodeFormat)); + sourceDecoder = new FileDescriptorBitmapDecoder(bitmapPool, decodeFormat); encoder = new BitmapEncoder(); sourceEncoder = NullEncoder.get(); } diff --git a/library/src/main/java/com/bumptech/glide/load/resource/bitmap/FileDescriptorBitmapDecoder.java b/library/src/main/java/com/bumptech/glide/load/resource/bitmap/FileDescriptorBitmapDecoder.java index bbbd48ca5e..3eb3893401 100644 --- a/library/src/main/java/com/bumptech/glide/load/resource/bitmap/FileDescriptorBitmapDecoder.java +++ b/library/src/main/java/com/bumptech/glide/load/resource/bitmap/FileDescriptorBitmapDecoder.java @@ -1,7 +1,9 @@ package com.bumptech.glide.load.resource.bitmap; +import android.content.Context; import android.graphics.Bitmap; import android.os.ParcelFileDescriptor; +import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.Resource; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; @@ -18,8 +20,16 @@ public class FileDescriptorBitmapDecoder implements ResourceDecoder { private final ImageVideoBitmapDecoder sourceDecoder; private final ResourceDecoder cacheDecoder; - private final BitmapEncoder encoder; + private final ResourceEncoder encoder; private final ImageVideoWrapperEncoder sourceEncoder; - public ImageVideoDataLoadProvider(BitmapPool bitmapPool) { - encoder = new BitmapEncoder(); - Encoder fileDescriptorEncoder = NullEncoder.get(); - sourceEncoder = new ImageVideoWrapperEncoder(new StreamEncoder(), fileDescriptorEncoder); - StreamBitmapDecoder streamDecoder = new StreamBitmapDecoder(bitmapPool); - cacheDecoder = new FileToStreamDecoder(streamDecoder); - sourceDecoder = new ImageVideoBitmapDecoder(streamDecoder, new FileDescriptorBitmapDecoder(bitmapPool)); + public ImageVideoDataLoadProvider(DataLoadProvider streamBitmapProvider, + DataLoadProvider fileDescriptorBitmapProvider) { + encoder = streamBitmapProvider.getEncoder(); + sourceEncoder = new ImageVideoWrapperEncoder(streamBitmapProvider.getSourceEncoder(), + fileDescriptorBitmapProvider.getSourceEncoder()); + cacheDecoder = streamBitmapProvider.getCacheDecoder(); + sourceDecoder = new ImageVideoBitmapDecoder(streamBitmapProvider.getSourceDecoder(), + fileDescriptorBitmapProvider.getSourceDecoder()); } @Override diff --git a/library/src/main/java/com/bumptech/glide/load/resource/bitmap/StreamBitmapDataLoadProvider.java b/library/src/main/java/com/bumptech/glide/load/resource/bitmap/StreamBitmapDataLoadProvider.java index db1c0b97e7..ae89ec9f54 100644 --- a/library/src/main/java/com/bumptech/glide/load/resource/bitmap/StreamBitmapDataLoadProvider.java +++ b/library/src/main/java/com/bumptech/glide/load/resource/bitmap/StreamBitmapDataLoadProvider.java @@ -2,6 +2,7 @@ import android.graphics.Bitmap; +import com.bumptech.glide.load.DecodeFormat; import com.bumptech.glide.provider.DataLoadProvider; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; @@ -23,9 +24,9 @@ public class StreamBitmapDataLoadProvider implements DataLoadProvider cacheDecoder; - public StreamBitmapDataLoadProvider(BitmapPool bitmapPool) { + public StreamBitmapDataLoadProvider(BitmapPool bitmapPool, DecodeFormat decodeFormat) { sourceEncoder = new StreamEncoder(); - decoder = new StreamBitmapDecoder(bitmapPool); + decoder = new StreamBitmapDecoder(bitmapPool, decodeFormat); encoder = new BitmapEncoder(); cacheDecoder = new FileToStreamDecoder(decoder); } diff --git a/library/src/main/java/com/bumptech/glide/load/resource/bitmap/StreamBitmapDecoder.java b/library/src/main/java/com/bumptech/glide/load/resource/bitmap/StreamBitmapDecoder.java index 5b2fcf441c..b9d8a8dff1 100644 --- a/library/src/main/java/com/bumptech/glide/load/resource/bitmap/StreamBitmapDecoder.java +++ b/library/src/main/java/com/bumptech/glide/load/resource/bitmap/StreamBitmapDecoder.java @@ -27,7 +27,15 @@ public StreamBitmapDecoder(Context context) { } public StreamBitmapDecoder(BitmapPool bitmapPool) { - this(Downsampler.AT_LEAST, bitmapPool, DecodeFormat.PREFER_RGB_565); + this(bitmapPool, DecodeFormat.DEFAULT); + } + + public StreamBitmapDecoder(Context context, DecodeFormat decodeFormat) { + this(Glide.get(context).getBitmapPool(), decodeFormat); + } + + public StreamBitmapDecoder(BitmapPool bitmapPool, DecodeFormat decodeFormat) { + this(Downsampler.AT_LEAST, bitmapPool, decodeFormat); } public StreamBitmapDecoder(Downsampler downsampler, BitmapPool bitmapPool, DecodeFormat decodeFormat) { diff --git a/library/src/main/java/com/bumptech/glide/load/resource/gif/GifDrawableLoadProvider.java b/library/src/main/java/com/bumptech/glide/load/resource/gif/GifDrawableLoadProvider.java index a55ccdc6df..3e0fe3c128 100644 --- a/library/src/main/java/com/bumptech/glide/load/resource/gif/GifDrawableLoadProvider.java +++ b/library/src/main/java/com/bumptech/glide/load/resource/gif/GifDrawableLoadProvider.java @@ -2,6 +2,7 @@ import android.content.Context; +import com.bumptech.glide.load.DecodeFormat; import com.bumptech.glide.provider.DataLoadProvider; import com.bumptech.glide.load.Encoder; import com.bumptech.glide.load.ResourceDecoder; @@ -23,8 +24,8 @@ public class GifDrawableLoadProvider implements DataLoadProvider cacheDecoder; - public GifDrawableLoadProvider(Context context, BitmapPool bitmapPool) { - decoder = new GifResourceDecoder(context, bitmapPool); + public GifDrawableLoadProvider(Context context, BitmapPool bitmapPool, DecodeFormat decodeFormat) { + decoder = new GifResourceDecoder(context, bitmapPool, decodeFormat); cacheDecoder = new FileToStreamDecoder(decoder); encoder = new GifResourceEncoder(bitmapPool); sourceEncoder = new StreamEncoder(); diff --git a/library/src/main/java/com/bumptech/glide/load/resource/gif/GifResourceDecoder.java b/library/src/main/java/com/bumptech/glide/load/resource/gif/GifResourceDecoder.java index 339cb5ddb5..cf56edfbaf 100644 --- a/library/src/main/java/com/bumptech/glide/load/resource/gif/GifResourceDecoder.java +++ b/library/src/main/java/com/bumptech/glide/load/resource/gif/GifResourceDecoder.java @@ -7,6 +7,7 @@ import com.bumptech.glide.gifdecoder.GifDecoder; import com.bumptech.glide.gifdecoder.GifHeader; import com.bumptech.glide.gifdecoder.GifHeaderParser; +import com.bumptech.glide.load.DecodeFormat; import com.bumptech.glide.load.ResourceDecoder; import com.bumptech.glide.load.Transformation; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; @@ -33,6 +34,7 @@ public class GifResourceDecoder implements ResourceDecoder