GifDrawable.java revision 8e9362526ca1e73364de269ae09c75c98d0e23f5
1ea01ddd754126290fc18c3dc8f6095ce0216768aSam Juddpackage com.bumptech.glide.load.resource.gif; 2ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 3ea01ddd754126290fc18c3dc8f6095ce0216768aSam Juddimport android.graphics.Bitmap; 4ea01ddd754126290fc18c3dc8f6095ce0216768aSam Juddimport android.graphics.Canvas; 5ea01ddd754126290fc18c3dc8f6095ce0216768aSam Juddimport android.graphics.ColorFilter; 6ea01ddd754126290fc18c3dc8f6095ce0216768aSam Juddimport android.graphics.Paint; 7ea01ddd754126290fc18c3dc8f6095ce0216768aSam Juddimport android.graphics.PixelFormat; 8ea01ddd754126290fc18c3dc8f6095ce0216768aSam Juddimport android.graphics.drawable.Animatable; 9ea01ddd754126290fc18c3dc8f6095ce0216768aSam Juddimport android.graphics.drawable.Drawable; 104f96c1a82e7d2db4863ac63dd00a261e9f0746b1Sam Juddimport com.bumptech.glide.load.resource.gif.decoder.GifDecoder; 11ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 12ea01ddd754126290fc18c3dc8f6095ce0216768aSam Juddpublic class GifDrawable extends Drawable implements Animatable, GifFrameManager.FrameCallback { 13ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 14ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd private final Paint paint; 15ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd private final GifFrameManager frameManager; 16ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd private GifDecoder decoder; 17ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd private boolean isRunning; 18ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd private Bitmap currentFrame; 194f96c1a82e7d2db4863ac63dd00a261e9f0746b1Sam Judd private boolean isRecycled; 20ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 21ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd public GifDrawable(GifDecoder decoder, GifFrameManager frameManager) { 22ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd this.decoder = decoder; 23ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd this.frameManager = frameManager; 24ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 25ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd paint = new Paint(); 26ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 27ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 28ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd @Override 29ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd public void start() { 30ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd if (!isRunning) { 31ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd isRunning = true; 328e9362526ca1e73364de269ae09c75c98d0e23f5Sam Judd frameManager.getNextFrame(this); 33ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd invalidateSelf(); 34ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 35ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 36ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 37ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd @Override 38ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd public boolean setVisible(boolean visible, boolean restart) { 39ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd if (!visible) { 40ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd stop(); 41ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } else { 42ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd start(); 43ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 44ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd return super.setVisible(visible, restart); 45ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 46ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 47ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd @Override 48ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd public int getIntrinsicWidth() { 49ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd return decoder.getWidth(); 50ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 51ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 52ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd @Override 53ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd public int getIntrinsicHeight() { 54ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd return decoder.getHeight(); 55ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 56ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 57ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd @Override 58ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd public void stop() { 59ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd isRunning = false; 60ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 61ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 62ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd @Override 63ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd public boolean isRunning() { 64ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd return isRunning; 65ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 66ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 67ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd // For testing. 68ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd void setIsRunning(boolean isRunning) { 69ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd this.isRunning = isRunning; 70ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 71ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 72ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd @Override 73ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd public void draw(Canvas canvas) { 74ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd if (currentFrame != null) { 75ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd canvas.drawBitmap(currentFrame, 0, 0, paint); 76ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 77ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 78ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 79ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd @Override 80ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd public void setAlpha(int i) { 81ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd paint.setAlpha(i); 82ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 83ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 84ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd @Override 85ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd public void setColorFilter(ColorFilter colorFilter) { 86ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd paint.setColorFilter(colorFilter); 87ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 88ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 89ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd @Override 90ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd public int getOpacity() { 91ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd return decoder.isTransparent() ? PixelFormat.TRANSPARENT : PixelFormat.OPAQUE; 92ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 93ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 94ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd @Override 95ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd public void onFrameRead(Bitmap frame) { 96ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd if (!isRunning) { 97ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd return; 98ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 99ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 100ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd if (frame != null) { 101ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd currentFrame = frame; 102ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd invalidateSelf(); 103ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 104ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 1058e9362526ca1e73364de269ae09c75c98d0e23f5Sam Judd frameManager.getNextFrame(this); 106ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 107ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd 108ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd public void recycle() { 1094f96c1a82e7d2db4863ac63dd00a261e9f0746b1Sam Judd isRecycled = true; 110ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd frameManager.clear(); 111ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd } 1124f96c1a82e7d2db4863ac63dd00a261e9f0746b1Sam Judd 1134f96c1a82e7d2db4863ac63dd00a261e9f0746b1Sam Judd public boolean isRecycled() { 1144f96c1a82e7d2db4863ac63dd00a261e9f0746b1Sam Judd return isRecycled; 1154f96c1a82e7d2db4863ac63dd00a261e9f0746b1Sam Judd } 116ea01ddd754126290fc18c3dc8f6095ce0216768aSam Judd} 117