Home | History | Annotate | Download | only in glide
      1 package com.bumptech.glide;
      2 
      3 import android.graphics.Bitmap;
      4 import android.os.ParcelFileDescriptor;
      5 
      6 import com.bumptech.glide.load.model.ImageVideoModelLoader;
      7 import com.bumptech.glide.load.model.ImageVideoWrapper;
      8 import com.bumptech.glide.load.model.ModelLoader;
      9 import com.bumptech.glide.load.resource.transcode.BitmapBytesTranscoder;
     10 import com.bumptech.glide.load.resource.transcode.ResourceTranscoder;
     11 import com.bumptech.glide.provider.DataLoadProvider;
     12 import com.bumptech.glide.provider.FixedLoadProvider;
     13 
     14 import java.io.InputStream;
     15 
     16 /**
     17  * A class for creating a load request that either loads an {@link Bitmap} directly or that adds an
     18  * {@link com.bumptech.glide.load.resource.transcode.ResourceTranscoder} to transcode the {@link Bitmap} into another
     19  * resource type.
     20  *
     21  * @param  The type of model to load the {@link Bitmap} or transcoded class from.
     22  */
     23 public class BitmapTypeRequest<ModelType> extends BitmapRequestBuilder<ModelType, Bitmap> {
     24     private final ModelLoader<ModelType, InputStream> streamModelLoader;
     25     private final ModelLoader<ModelType, ParcelFileDescriptor> fileDescriptorModelLoader;
     26     private final Glide glide;
     27     private final RequestManager.OptionsApplier optionsApplier;
     28 
     29     private static <A, R> FixedLoadProvider<A, ImageVideoWrapper, Bitmap, R> buildProvider(Glide glide,
     30             ModelLoader<A, InputStream> streamModelLoader,
     31             ModelLoader<A, ParcelFileDescriptor> fileDescriptorModelLoader,
     32             Class<R> transcodedClass, ResourceTranscoder<Bitmap, R> transcoder) {
     33         if (streamModelLoader == null && fileDescriptorModelLoader == null) {
     34             return null;
     35         }
     36 
     37         if (transcoder == null) {
     38             transcoder = glide.buildTranscoder(Bitmap.class, transcodedClass);
     39         }
     40         DataLoadProvider<ImageVideoWrapper, Bitmap> loadProvider = glide.buildDataProvider(ImageVideoWrapper.class,
     41                 Bitmap.class);
     42         ImageVideoModelLoader<A> modelLoader = new ImageVideoModelLoader<A>(streamModelLoader,
     43                 fileDescriptorModelLoader);
     44 
     45         return new FixedLoadProvider<A, ImageVideoWrapper, Bitmap, R>(modelLoader, transcoder, loadProvider);
     46     }
     47 
     48     BitmapTypeRequest(GenericRequestBuilder<ModelType, ?, ?, ?> other,
     49             ModelLoader<ModelType, InputStream> streamModelLoader,
     50             ModelLoader<ModelType, ParcelFileDescriptor> fileDescriptorModelLoader,
     51             RequestManager.OptionsApplier optionsApplier) {
     52         super(buildProvider(other.glide, streamModelLoader, fileDescriptorModelLoader, Bitmap.class, null),
     53                 Bitmap.class, other);
     54         this.streamModelLoader = streamModelLoader;
     55         this.fileDescriptorModelLoader = fileDescriptorModelLoader;
     56         this.glide = other.glide;
     57         this.optionsApplier = optionsApplier;
     58     }
     59 
     60     /**
     61      * Sets a transcoder to transcode the decoded and transformed {@link Bitmap} into another resource type.
     62      *
     63      * @param transcoder The transoder to use.
     64      * @param transcodeClass The {@link Class} of the resource the {@link Bitmap} will be transcoded to.
     65      * @param <R> The type of the resource the {@link Bitmap} will be transcoded to.
     66      * @return This request builder.
     67      */
     68     public <R> BitmapRequestBuilder<ModelType, R> transcode(ResourceTranscoder<Bitmap, R> transcoder,
     69             Class<R> transcodeClass) {
     70         return optionsApplier.apply(new BitmapRequestBuilder<ModelType, R>(
     71                 buildProvider(glide, streamModelLoader, fileDescriptorModelLoader, transcodeClass, transcoder),
     72                 transcodeClass, this));
     73     }
     74 
     75     /**
     76      * Transcodes the decoded and transformed {@link Bitmap} to bytes by compressing it as a JPEG to a byte array.
     77      * array.
     78      *
     79      * @see #toBytes(android.graphics.Bitmap.CompressFormat, int)
     80      *
     81      * @return This request builder.
     82      */
     83     public BitmapRequestBuilder<ModelType, byte[]> toBytes() {
     84         return transcode(new BitmapBytesTranscoder(), byte[].class);
     85     }
     86 
     87     /**
     88      * Transcodes the decoded and transformed {@link android.graphics.Bitmap} to bytes by compressing it using the
     89      * given format and quality to a byte array.
     90      *
     91      * @see android.graphics.Bitmap#compress(android.graphics.Bitmap.CompressFormat, int, java.io.OutputStream)
     92      * @see #toBytes()
     93      *
     94      * @param compressFormat The {@link android.graphics.Bitmap.CompressFormat} to use to compress the {@link Bitmap}.
     95      * @param quality The quality level from 0-100 to use to compress the {@link Bitmap}.
     96      * @return This request builder.
     97      */
     98     public BitmapRequestBuilder<ModelType, byte[]> toBytes(Bitmap.CompressFormat compressFormat, int quality) {
     99         return transcode(new BitmapBytesTranscoder(compressFormat, quality), byte[].class);
    100     }
    101 }
    102