diff options
author | Sam Judd <judds@google.com> | 2014-10-18 11:20:44 -0700 |
---|---|---|
committer | Sam Judd <judds@google.com> | 2014-10-19 10:10:07 -0700 |
commit | 2c259f532bee14a4f3f6be419bcfb58ef5e22ff5 (patch) | |
tree | 9797a3fd30a7d79097f457a4685c8133b6e2a5cb /library/src/main/java/com | |
parent | 3640e3493c7ea15243d8f0e953b5f0486a40c8a1 (diff) | |
download | glide-2c259f532bee14a4f3f6be419bcfb58ef5e22ff5.tar.gz |
Set transIndex for GIFs with transparent pixels.
Fixes #201.
Diffstat (limited to 'library/src/main/java/com')
3 files changed, 6 insertions, 38 deletions
diff --git a/library/src/main/java/com/bumptech/glide/load/resource/gif/GifBitmapProvider.java b/library/src/main/java/com/bumptech/glide/load/resource/gif/GifBitmapProvider.java index 32008d3e..be7381e5 100644 --- a/library/src/main/java/com/bumptech/glide/load/resource/gif/GifBitmapProvider.java +++ b/library/src/main/java/com/bumptech/glide/load/resource/gif/GifBitmapProvider.java @@ -14,6 +14,6 @@ class GifBitmapProvider implements GifDecoder.BitmapProvider { @Override public Bitmap obtain(int width, int height, Bitmap.Config config) { - return bitmapPool.get(width, height, config); + return bitmapPool.getDirty(width, height, config); } } diff --git a/library/src/main/java/com/bumptech/glide/load/resource/gif/GifDrawable.java b/library/src/main/java/com/bumptech/glide/load/resource/gif/GifDrawable.java index 2d740c21..85c539ac 100644 --- a/library/src/main/java/com/bumptech/glide/load/resource/gif/GifDrawable.java +++ b/library/src/main/java/com/bumptech/glide/load/resource/gif/GifDrawable.java @@ -197,7 +197,8 @@ public class GifDrawable extends GlideDrawable implements GifFrameManager.FrameC @Override public int getOpacity() { - return decoder.isTransparent() ? PixelFormat.TRANSPARENT : PixelFormat.OPAQUE; + // We can't tell, so default to transparent to be safe. + return PixelFormat.TRANSPARENT; } @TargetApi(Build.VERSION_CODES.HONEYCOMB) diff --git a/library/src/main/java/com/bumptech/glide/load/resource/gif/GifFrameManager.java b/library/src/main/java/com/bumptech/glide/load/resource/gif/GifFrameManager.java index 773203b9..32dce79a 100644 --- a/library/src/main/java/com/bumptech/glide/load/resource/gif/GifFrameManager.java +++ b/library/src/main/java/com/bumptech/glide/load/resource/gif/GifFrameManager.java @@ -5,26 +5,17 @@ import android.graphics.Bitmap; import android.os.Handler; import android.os.Looper; import android.os.SystemClock; - import com.bumptech.glide.Glide; import com.bumptech.glide.gifdecoder.GifDecoder; import com.bumptech.glide.load.Encoder; -import com.bumptech.glide.load.ResourceDecoder; -import com.bumptech.glide.load.ResourceEncoder; import com.bumptech.glide.load.Transformation; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; import com.bumptech.glide.load.engine.cache.MemorySizeCalculator; -import com.bumptech.glide.load.resource.NullDecoder; import com.bumptech.glide.load.resource.NullEncoder; -import com.bumptech.glide.load.resource.NullResourceEncoder; -import com.bumptech.glide.load.resource.bitmap.BitmapEncoder; -import com.bumptech.glide.load.resource.bitmap.StreamBitmapDecoder; -import com.bumptech.glide.load.resource.file.FileToStreamDecoder; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.SimpleTarget; - -import java.io.File; +import com.bumptech.glide.util.Util; class GifFrameManager { /** 60fps is {@value #MIN_FRAME_DELAY}ms per frame. */ @@ -32,10 +23,8 @@ class GifFrameManager { private final MemorySizeCalculator calculator; private final GifFrameModelLoader frameLoader; private final GifFrameResourceDecoder frameResourceDecoder; - private final ResourceDecoder<File, Bitmap> cacheDecoder; private final GifDecoder decoder; private final Handler mainHandler; - private final ResourceEncoder<Bitmap> encoder; private final Context context; private final Encoder<GifDecoder> sourceEncoder; private final Transformation<Bitmap>[] transformation; @@ -69,23 +58,11 @@ class GifFrameManager { this.transformation = new Transformation[] {transformation}; this.targetWidth = targetWidth; this.targetHeight = targetHeight; - this.totalFrameSize = frameWidth * frameHeight * (decoder.isTransparent() ? 4 : 2); + this.totalFrameSize = Util.getBitmapByteSize(frameWidth, frameHeight, Bitmap.Config.ARGB_8888); this.calculator = new MemorySizeCalculator(context); this.frameLoader = new GifFrameModelLoader(); this.sourceEncoder = NullEncoder.get(); - - if (!decoder.isTransparent()) { - // For non transparent gifs, we can beat the performance of our gif decoder for each frame by decoding jpegs - // from disk. - this.cacheDecoder = new FileToStreamDecoder<Bitmap>(new StreamBitmapDecoder(context)); - this.encoder = new BitmapEncoder(); - } else { - // For transparent gifs, we would have to encode as pngs which is actually slower than our gif decoder so we - // avoid writing frames to the disk cache entirely. - this.cacheDecoder = NullDecoder.get(); - this.encoder = NullResourceEncoder.get(); - } } Transformation<Bitmap> getTransformation() { @@ -95,17 +72,9 @@ class GifFrameManager { public void getNextFrame(FrameCallback cb) { decoder.advance(); - /** - * Note - Using the disk cache can potentially cause frames to be decoded incorrectly because the decoder is - * sequential. If earlier frames are evicted for some reason, later ones may then not be decoded correctly. - */ - // We don't want to blow out the entire memory cache with frames of gifs, so try to set some // maximum size beyond which we will always just decode one frame at a time. boolean skipCache = totalFrameSize > calculator.getMemoryCacheSize() / 2; - // We can decode non transparent (cached as jpegs) frames more quickly from cache, but transparent - // (cached as png) frames more quickly from the gif data. - boolean skipDiskCache = decoder.isTransparent(); long targetTime = SystemClock.uptimeMillis() + Math.max(MIN_FRAME_DELAY, decoder.getNextDelay()); next = new DelayTarget(cb, targetTime); @@ -117,11 +86,9 @@ class GifFrameManager { .as(Bitmap.class) .sourceEncoder(sourceEncoder) .decoder(frameResourceDecoder) - .cacheDecoder(cacheDecoder) - .encoder(encoder) .transform(transformation) .skipMemoryCache(skipCache) - .diskCacheStrategy(skipDiskCache ? DiskCacheStrategy.NONE : DiskCacheStrategy.RESULT) + .diskCacheStrategy(DiskCacheStrategy.NONE) .into(next); } |