package com.bumptech.glide.load;
import android.content.Context;
import com.bumptech.glide.load.engine.Resource;
/**
* A class for performing an arbitrary transformation on a resource that implements
* {@link #equals(Object)} and {@link #hashCode()}} to identify the transformation in the memory
* cache and {@link #updateDiskCacheKey(java.security.MessageDigest)}} to identify the
* transformation in disk caches.
*
* <p>Using the fully qualified class name (not {@link Class#getName()} to avoid proguard
* obfuscation) is an easy way to implement
* {@link #updateDiskCacheKey(java.security.MessageDigest)}} correctly.
*
* @param <T> The type of the resource being transformed.
*/
public interface Transformation<T> extends Key {
/**
* Transforms the given resource and returns the transformed resource.
*
* <p>If the original resource object is not returned, the original resource will be
* recycled and it's internal resources may be reused. This means it is not safe to rely on the
* original resource or any internal state of the original resource in any new resource that is
* created. Usually this shouldn't occur, but if absolutely necessary either the original resource
* object can be returned with modified internal state, or the data in the original resource can
* be copied into the transformed resource.
*
* <p>If a Transformation is updated, {@link #equals(Object)}, {@link #hashCode()}, and
* {@link #updateDiskCacheKey(java.security.MessageDigest)} should all change. If you're using a
* simple String key an easy way to do this is to append a version number to your key. Failing to
* do so will mean users may see images loaded from cache that had the old version of the
* Transformation applied. Changing the return values of those methods will ensure that the cache
* key has changed and therefore that any cached resources will be re-generated using the updated
* Transformation.
*
* <p>During development you may need to either using {@link
* com.bumptech.glide.load.engine.DiskCacheStrategy#NONE} or make sure {@link
* #updateDiskCacheKey(java.security.MessageDigest)} changes each time you make a change to the
* Transformation. Otherwise the resource you request may be loaded from disk cache and your
* Transformation may not be called.
*
* @param context The Application context
* @param resource The resource to transform.
* @param outWidth The width of the view or target the resource will be displayed in, or {@link
* com.bumptech.glide.request.target.Target#SIZE_ORIGINAL} to indicate the
* original resource width.
* @param outHeight The height of the view or target the resource will be displayed in, or {@link
* com.bumptech.glide.request.target.Target#SIZE_ORIGINAL} to indicate the
* original resource height.
* @return The transformed resource.
*/
Resource<T> transform(Context context, Resource<T> resource, int outWidth, int outHeight);
}