11614d6b4169b2930d3d2c17210c438708bb1117dSam Juddpackage com.bumptech.glide.load.resource.bitmap;
21614d6b4169b2930d3d2c17210c438708bb1117dSam Judd
31614d6b4169b2930d3d2c17210c438708bb1117dSam Juddimport android.content.Context;
41614d6b4169b2930d3d2c17210c438708bb1117dSam Juddimport android.graphics.Bitmap;
5f7a6d65cf7c1a41908dd48e0dab68ee5b881387eSam Judd
61614d6b4169b2930d3d2c17210c438708bb1117dSam Juddimport com.bumptech.glide.Glide;
71614d6b4169b2930d3d2c17210c438708bb1117dSam Juddimport com.bumptech.glide.load.Transformation;
81614d6b4169b2930d3d2c17210c438708bb1117dSam Juddimport com.bumptech.glide.load.engine.Resource;
91614d6b4169b2930d3d2c17210c438708bb1117dSam Juddimport com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
101614d6b4169b2930d3d2c17210c438708bb1117dSam Judd
111614d6b4169b2930d3d2c17210c438708bb1117dSam Judd/**
121614d6b4169b2930d3d2c17210c438708bb1117dSam Judd * A simple {@link com.bumptech.glide.load.Transformation} for transforming {@link android.graphics.Bitmap}s that
131614d6b4169b2930d3d2c17210c438708bb1117dSam Judd * abstracts away dealing with {@link com.bumptech.glide.load.engine.Resource} objects for subclasses.
141614d6b4169b2930d3d2c17210c438708bb1117dSam Judd *
151614d6b4169b2930d3d2c17210c438708bb1117dSam Judd * Use cases will look something like this:
161614d6b4169b2930d3d2c17210c438708bb1117dSam Judd * <pre>
171614d6b4169b2930d3d2c17210c438708bb1117dSam Judd * <code>
181614d6b4169b2930d3d2c17210c438708bb1117dSam Judd * public class FillSpace extends BaseBitmapTransformation {
191614d6b4169b2930d3d2c17210c438708bb1117dSam Judd *     {@literal @Override}
201614d6b4169b2930d3d2c17210c438708bb1117dSam Judd *     public Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
21d88c2f7df8007f44fb2b6ec3c00eac280fb298ecSam Judd *         if (toTransform.getWidth() == outWidth && toTransform.getHeight() == outHeight) {
221614d6b4169b2930d3d2c17210c438708bb1117dSam Judd *             return toTransform;
231614d6b4169b2930d3d2c17210c438708bb1117dSam Judd *         }
241614d6b4169b2930d3d2c17210c438708bb1117dSam Judd *
251614d6b4169b2930d3d2c17210c438708bb1117dSam Judd *         return Bitmap.createScaledBitmap(toTransform, outWidth, outHeight, true);
261614d6b4169b2930d3d2c17210c438708bb1117dSam Judd *     }
271614d6b4169b2930d3d2c17210c438708bb1117dSam Judd * }
281614d6b4169b2930d3d2c17210c438708bb1117dSam Judd * </code>
291614d6b4169b2930d3d2c17210c438708bb1117dSam Judd * </pre>
301614d6b4169b2930d3d2c17210c438708bb1117dSam Judd */
311614d6b4169b2930d3d2c17210c438708bb1117dSam Juddpublic abstract class BitmapTransformation implements Transformation<Bitmap> {
321614d6b4169b2930d3d2c17210c438708bb1117dSam Judd
331614d6b4169b2930d3d2c17210c438708bb1117dSam Judd    private BitmapPool bitmapPool;
341614d6b4169b2930d3d2c17210c438708bb1117dSam Judd
351614d6b4169b2930d3d2c17210c438708bb1117dSam Judd    public BitmapTransformation(Context context) {
361614d6b4169b2930d3d2c17210c438708bb1117dSam Judd        this(Glide.get(context).getBitmapPool());
371614d6b4169b2930d3d2c17210c438708bb1117dSam Judd    }
381614d6b4169b2930d3d2c17210c438708bb1117dSam Judd
391614d6b4169b2930d3d2c17210c438708bb1117dSam Judd    public BitmapTransformation(BitmapPool bitmapPool) {
401614d6b4169b2930d3d2c17210c438708bb1117dSam Judd        this.bitmapPool = bitmapPool;
411614d6b4169b2930d3d2c17210c438708bb1117dSam Judd    }
421614d6b4169b2930d3d2c17210c438708bb1117dSam Judd
431614d6b4169b2930d3d2c17210c438708bb1117dSam Judd    @Override
441614d6b4169b2930d3d2c17210c438708bb1117dSam Judd    public final Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
451614d6b4169b2930d3d2c17210c438708bb1117dSam Judd        if (outWidth <= 0 || outHeight <= 0) {
465ba19a0e69ad3a651b8f13ba45de48a56b56ce36Sam Judd            throw new IllegalArgumentException("Cannot apply transformation on width: " + outWidth + " or height: "
471614d6b4169b2930d3d2c17210c438708bb1117dSam Judd                    + outHeight + " less than or equal to zero");
481614d6b4169b2930d3d2c17210c438708bb1117dSam Judd        }
491614d6b4169b2930d3d2c17210c438708bb1117dSam Judd        Bitmap toTransform = resource.get();
501614d6b4169b2930d3d2c17210c438708bb1117dSam Judd        Bitmap transformed = transform(bitmapPool, toTransform, outWidth, outHeight);
511614d6b4169b2930d3d2c17210c438708bb1117dSam Judd
521614d6b4169b2930d3d2c17210c438708bb1117dSam Judd        final Resource<Bitmap> result;
535ba19a0e69ad3a651b8f13ba45de48a56b56ce36Sam Judd        if (toTransform.equals(transformed)) {
541614d6b4169b2930d3d2c17210c438708bb1117dSam Judd            result = resource;
551614d6b4169b2930d3d2c17210c438708bb1117dSam Judd        } else {
564ee3030c0b69cbc1a0c0a073d33cc5a3023ed493Sam Judd            result = BitmapResource.obtain(transformed, bitmapPool);
571614d6b4169b2930d3d2c17210c438708bb1117dSam Judd        }
581614d6b4169b2930d3d2c17210c438708bb1117dSam Judd
591614d6b4169b2930d3d2c17210c438708bb1117dSam Judd        return result;
601614d6b4169b2930d3d2c17210c438708bb1117dSam Judd    }
611614d6b4169b2930d3d2c17210c438708bb1117dSam Judd
621614d6b4169b2930d3d2c17210c438708bb1117dSam Judd    /**
631614d6b4169b2930d3d2c17210c438708bb1117dSam Judd     * Transforms the given {@link android.graphics.Bitmap} based on the given dimensions and returns the transformed
641614d6b4169b2930d3d2c17210c438708bb1117dSam Judd     * result.
651614d6b4169b2930d3d2c17210c438708bb1117dSam Judd     *
661614d6b4169b2930d3d2c17210c438708bb1117dSam Judd     * @param pool A {@link com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool} that can be used to obtain and
671614d6b4169b2930d3d2c17210c438708bb1117dSam Judd     *             return intermediate {@link Bitmap}s used in this transformation. For every
681614d6b4169b2930d3d2c17210c438708bb1117dSam Judd     *             {@link android.graphics.Bitmap} obtained from the pool during this transformation, a
691614d6b4169b2930d3d2c17210c438708bb1117dSam Judd     *             {@link android.graphics.Bitmap} must also be returned.
701614d6b4169b2930d3d2c17210c438708bb1117dSam Judd     * @param toTransform The {@link android.graphics.Bitmap} to transform.
711614d6b4169b2930d3d2c17210c438708bb1117dSam Judd     * @param outWidth The ideal width of the transformed bitmap (does not need to match exactly).
721614d6b4169b2930d3d2c17210c438708bb1117dSam Judd     * @param outHeight The ideal height of the transformed bitmap (does not need to match exactly).
731614d6b4169b2930d3d2c17210c438708bb1117dSam Judd     */
741614d6b4169b2930d3d2c17210c438708bb1117dSam Judd    protected abstract Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight);
751614d6b4169b2930d3d2c17210c438708bb1117dSam Judd}
76