package com.bumptech.glide.load;
import android.content.Context;
import com.bumptech.glide.load.engine.Resource;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Collection;
/**
* A transformation that applies one or more transformations in iteration order to a resource.
*
* @param <T> The type of {@link com.bumptech.glide.load.engine.Resource} that will be transformed.
*/
public class MultiTransformation<T> implements Transformation<T> {
private final Collection<? extends Transformation<T>> transformations;
@SafeVarargs
public MultiTransformation(Transformation<T>... transformations) {
if (transformations.length < 1) {
throw new IllegalArgumentException(
"MultiTransformation must contain at least one Transformation");
}
this.transformations = Arrays.asList(transformations);
}
public MultiTransformation(Collection<? extends Transformation<T>> transformationList) {
if (transformationList.isEmpty()) {
throw new IllegalArgumentException(
"MultiTransformation must contain at least one Transformation");
}
this.transformations = transformationList;
}
@Override
public Resource<T> transform(
Context context, Resource<T> resource, int outWidth, int outHeight) {
Resource<T> previous = resource;
for (Transformation<T> transformation : transformations) {
Resource<T> transformed = transformation.transform(context, previous, outWidth, outHeight);
if (previous != null && !previous.equals(resource) && !previous.equals(transformed)) {
previous.recycle();
}
previous = transformed;
}
return previous;
}
@Override
public boolean equals(Object o) {
if (o instanceof MultiTransformation) {
MultiTransformation<?> other = (MultiTransformation<?>) o;
return transformations.equals(other.transformations);
}
return false;
}
@Override
public int hashCode() {
return transformations.hashCode();
}
@Override
public void updateDiskCacheKey(MessageDigest messageDigest) {
for (Transformation<T> transformation : transformations) {
transformation.updateDiskCacheKey(messageDigest);
}
}
}