19fc12334a7d14347cd6951d0653264b2597bd3a0Sam Juddpackage com.bumptech.glide.load;
29f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd
3b7c7c2b2505f996dbda219faeb0d08dc1c9982d7Sam Juddimport com.bumptech.glide.load.engine.Resource;
49f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd
59f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Juddimport java.util.List;
69f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd
79f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd/**
89f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd * A transformation that applies an ordered array of one or more transformations to an image.
99f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd */
1031b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Juddpublic class MultiTransformation<T> implements Transformation<T> {
1131b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd    private Transformation<T>[] transformations;
1231b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd    private List<Transformation<T>> transformationList;
13be180a0eb61b3e4c088cec44c69cde5f91cbe7b9Sam Judd    private String id;
149f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd
1531b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd    public MultiTransformation(Transformation<T>... transformations) {
169f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd        if (transformations.length < 1) {
179f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd            throw new IllegalArgumentException("MultiTransformation must contain at least one Transformation");
189f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd        }
199f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd        this.transformations = transformations;
209f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd    }
219f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd
2231b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd    public MultiTransformation(List<Transformation<T>> transformationList) {
239f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd        if (transformationList.size() < 1) {
249f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd            throw new IllegalArgumentException("MultiTransformation must contain at least one Transformation");
259f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd        }
269f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd        this.transformationList = transformationList;
279f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd    }
289f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd
299f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd    @Override
3031b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd    public Resource<T> transform(Resource<T> resource, int outWidth, int outHeight) {
31063020db301f9a3d96c8aa6a7f0b0bc1651ba45eSam Judd        Resource<T> previous = resource;
329f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd
339f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd        if (transformations != null) {
3431b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd            for (Transformation<T> transformation : transformations) {
35063020db301f9a3d96c8aa6a7f0b0bc1651ba45eSam Judd                Resource<T> transformed = transformation.transform(previous, outWidth, outHeight);
36063020db301f9a3d96c8aa6a7f0b0bc1651ba45eSam Judd                if (transformed != previous && previous != resource && previous != null) {
37063020db301f9a3d96c8aa6a7f0b0bc1651ba45eSam Judd                    previous.recycle();
38063020db301f9a3d96c8aa6a7f0b0bc1651ba45eSam Judd                }
39063020db301f9a3d96c8aa6a7f0b0bc1651ba45eSam Judd                previous = transformed;
409f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd            }
419f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd        } else {
4231b60a4ba485dcc22e5edd19c6768e1141c32f4eSam Judd            for (Transformation<T> transformation : transformationList) {
43063020db301f9a3d96c8aa6a7f0b0bc1651ba45eSam Judd                 Resource<T> transformed = transformation.transform(previous, outWidth, outHeight);
44063020db301f9a3d96c8aa6a7f0b0bc1651ba45eSam Judd                if (transformed != previous && previous != resource && previous != null) {
45063020db301f9a3d96c8aa6a7f0b0bc1651ba45eSam Judd                    previous.recycle();
46063020db301f9a3d96c8aa6a7f0b0bc1651ba45eSam Judd                }
47063020db301f9a3d96c8aa6a7f0b0bc1651ba45eSam Judd                previous = transformed;
489f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd            }
499f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd
509f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd        }
51063020db301f9a3d96c8aa6a7f0b0bc1651ba45eSam Judd        return previous;
529f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd    }
539f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd
549f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd    @Override
559f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd    public String getId() {
56be180a0eb61b3e4c088cec44c69cde5f91cbe7b9Sam Judd        if (id == null) {
57be180a0eb61b3e4c088cec44c69cde5f91cbe7b9Sam Judd            StringBuilder sb = new StringBuilder();
58be180a0eb61b3e4c088cec44c69cde5f91cbe7b9Sam Judd            if (transformations != null) {
59be180a0eb61b3e4c088cec44c69cde5f91cbe7b9Sam Judd                for (Transformation transformation : transformations) {
60be180a0eb61b3e4c088cec44c69cde5f91cbe7b9Sam Judd                    sb.append(transformation.getId());
61be180a0eb61b3e4c088cec44c69cde5f91cbe7b9Sam Judd                }
62be180a0eb61b3e4c088cec44c69cde5f91cbe7b9Sam Judd            } else {
63be180a0eb61b3e4c088cec44c69cde5f91cbe7b9Sam Judd                for (Transformation transformation : transformationList) {
64be180a0eb61b3e4c088cec44c69cde5f91cbe7b9Sam Judd                    sb.append(transformation.getId());
65be180a0eb61b3e4c088cec44c69cde5f91cbe7b9Sam Judd                }
66be180a0eb61b3e4c088cec44c69cde5f91cbe7b9Sam Judd            }
67be180a0eb61b3e4c088cec44c69cde5f91cbe7b9Sam Judd            id = sb.toString();
689f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd        }
69be180a0eb61b3e4c088cec44c69cde5f91cbe7b9Sam Judd        return id;
709f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd    }
719f0bef767aca7d0e40f9eba8c1ea52159bed2091Sam Judd}
72