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