package com.bumptech.glide.load; import android.support.annotation.Nullable; import com.bumptech.glide.load.ImageHeaderParser.ImageType; import com.bumptech.glide.load.engine.bitmap_recycle.ArrayPool; import com.bumptech.glide.load.resource.bitmap.RecyclableBufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.util.List; /** * Utilities for the ImageHeaderParser. */ public final class ImageHeaderParserUtils { // 5MB. This is the max image header size we can handle, we preallocate a much smaller buffer but // will resize up to this amount if necessary. private static final int MARK_POSITION = 5 * 1024 * 1024; private ImageHeaderParserUtils() { } /** Returns the ImageType for the given InputStream. */ public static ImageType getType(List<ImageHeaderParser> parsers, @Nullable InputStream is, ArrayPool byteArrayPool) throws IOException { if (is == null) { return ImageType.UNKNOWN; } if (!is.markSupported()) { is = new RecyclableBufferedInputStream(is, byteArrayPool); } is.mark(MARK_POSITION); for (ImageHeaderParser parser : parsers) { try { ImageType type = parser.getType(is); if (type != ImageType.UNKNOWN) { return type; } } finally { is.reset(); } } return ImageType.UNKNOWN; } /** Returns the ImageType for the given ByteBuffer. */ public static ImageType getType(List<ImageHeaderParser> parsers, @Nullable ByteBuffer buffer) throws IOException { if (buffer == null) { return ImageType.UNKNOWN; } for (ImageHeaderParser parser : parsers) { ImageType type = parser.getType(buffer); if (type != ImageType.UNKNOWN) { return type; } } return ImageType.UNKNOWN; } /** Returns the orientation for the given InputStream. */ public static int getOrientation(List<ImageHeaderParser> parsers, @Nullable InputStream is, ArrayPool byteArrayPool) throws IOException { if (is == null) { return ImageHeaderParser.UNKNOWN_ORIENTATION; } if (!is.markSupported()) { is = new RecyclableBufferedInputStream(is, byteArrayPool); } is.mark(MARK_POSITION); for (ImageHeaderParser parser : parsers) { try { int orientation = parser.getOrientation(is, byteArrayPool); if (orientation != ImageHeaderParser.UNKNOWN_ORIENTATION) { return orientation; } } finally { is.reset(); } } return ImageHeaderParser.UNKNOWN_ORIENTATION; } }