From 2c259f532bee14a4f3f6be419bcfb58ef5e22ff5 Mon Sep 17 00:00:00 2001 From: Sam Judd Date: Sat, 18 Oct 2014 11:20:44 -0700 Subject: Set transIndex for GIFs with transparent pixels. Fixes #201. --- .../glide/load/resource/gif/GifBitmapProvider.java | 2 +- .../glide/load/resource/gif/GifDrawable.java | 3 +- .../glide/load/resource/gif/GifFrameManager.java | 39 ++-------------------- 3 files changed, 6 insertions(+), 38 deletions(-) (limited to 'library/src/main/java/com') 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 cacheDecoder; private final GifDecoder decoder; private final Handler mainHandler; - private final ResourceEncoder encoder; private final Context context; private final Encoder sourceEncoder; private final Transformation[] 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(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 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); } -- cgit v1.2.3