package com.bumptech.glide.load.resource.gif;
import android.content.Context;
import android.graphics.Bitmap;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import com.bumptech.glide.util.Preconditions;
import java.security.MessageDigest;
/**
* An {@link com.bumptech.glide.load.Transformation} that wraps a transformation for a
* {@link Bitmap} and can apply it to every frame of any
* {@link com.bumptech.glide.load.resource.gif.GifDrawable}.
*/
public class GifDrawableTransformation implements Transformation<GifDrawable> {
private final Transformation<Bitmap> wrapped;
public GifDrawableTransformation(Transformation<Bitmap> wrapped) {
this.wrapped = Preconditions.checkNotNull(wrapped);
}
/**
* @deprecated Use {@link #GifDrawableTransformation(Transformation)}.
*/
@Deprecated
public GifDrawableTransformation(
@SuppressWarnings("unused") Context context, Transformation<Bitmap> wrapped) {
this(wrapped);
}
/**
* @deprecated Use {@link #GifDrawableTransformation(Transformation)}
*/
@Deprecated
public GifDrawableTransformation(
Transformation<Bitmap> wrapped, @SuppressWarnings("unused") BitmapPool bitmapPool) {
this(wrapped);
}
@Override
public Resource<GifDrawable> transform(
Context context, Resource<GifDrawable> resource, int outWidth, int outHeight) {
GifDrawable drawable = resource.get();
// The drawable needs to be initialized with the correct width and height in order for a view
// displaying it to end up with the right dimensions. Since our transformations may arbitrarily
// modify the dimensions of our GIF, here we create a stand in for a frame and pass it to the
// transformation to see what the final transformed dimensions will be so that our drawable can
// report the correct intrinsic width and height.
BitmapPool bitmapPool = Glide.get(context).getBitmapPool();
Bitmap firstFrame = drawable.getFirstFrame();
Resource<Bitmap> bitmapResource = new BitmapResource(firstFrame, bitmapPool);
Resource<Bitmap> transformed = wrapped.transform(context, bitmapResource, outWidth, outHeight);
if (!bitmapResource.equals(transformed)) {
bitmapResource.recycle();
}
Bitmap transformedFrame = transformed.get();
drawable.setFrameTransformation(wrapped, transformedFrame);
return resource;
}
@Override
public boolean equals(Object o) {
if (o instanceof GifDrawableTransformation) {
GifDrawableTransformation other = (GifDrawableTransformation) o;
return wrapped.equals(other.wrapped);
}
return false;
}
@Override
public int hashCode() {
return wrapped.hashCode();
}
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) {
wrapped.updateDiskCacheKey(messageDigest);
}
}