From c95f6e28627ac362748a833cf825a409d7ae06d1 Mon Sep 17 00:00:00 2001 From: Khabensky Denis Date: Tue, 10 Oct 2017 12:57:13 +0300 Subject: Support for other bitmap formats (not just default RGB565) --- .../subscaleview/decoder/CompatDecoderFactory.java | 22 +++++++++++++++++++--- .../labs/subscaleview/decoder/DecoderFactory.java | 4 +++- .../subscaleview/decoder/SkiaImageDecoder.java | 15 ++++++++++++++- .../decoder/SkiaImageRegionDecoder.java | 15 ++++++++++++++- 4 files changed, 50 insertions(+), 6 deletions(-) (limited to 'library') diff --git a/library/src/com/davemorrissey/labs/subscaleview/decoder/CompatDecoderFactory.java b/library/src/com/davemorrissey/labs/subscaleview/decoder/CompatDecoderFactory.java index daf9dfa..d8f3d1f 100644 --- a/library/src/com/davemorrissey/labs/subscaleview/decoder/CompatDecoderFactory.java +++ b/library/src/com/davemorrissey/labs/subscaleview/decoder/CompatDecoderFactory.java @@ -1,20 +1,36 @@ package com.davemorrissey.labs.subscaleview.decoder; +import android.graphics.Bitmap; import android.support.annotation.NonNull; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; + /** * Compatibility factory to instantiate decoders with empty public constructors. * @param The base type of the decoder this factory will produce. */ -public class CompatDecoderFactory implements DecoderFactory { +public class CompatDecoderFactory implements DecoderFactory { private Class clazz; + private Bitmap.Config bitmapConfig; public CompatDecoderFactory(@NonNull Class clazz) { + this(clazz, null); + } + + public CompatDecoderFactory(@NonNull Class clazz, Bitmap.Config bitmapConfig) { this.clazz = clazz; + this.bitmapConfig = bitmapConfig; } @Override - public T make() throws IllegalAccessException, InstantiationException { - return clazz.newInstance(); + public T make() throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { + if (bitmapConfig == null) { + return clazz.newInstance(); + } + else { + Constructor ctor = clazz.getConstructor(Bitmap.Config.class); + return ctor.newInstance(bitmapConfig); + } } } diff --git a/library/src/com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.java b/library/src/com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.java index 634904d..f15d283 100644 --- a/library/src/com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.java +++ b/library/src/com/davemorrissey/labs/subscaleview/decoder/DecoderFactory.java @@ -1,5 +1,7 @@ package com.davemorrissey.labs.subscaleview.decoder; +import java.lang.reflect.InvocationTargetException; + /** * Interface for decoder (and region decoder) factories. * @param the class of decoder that will be produced. @@ -9,5 +11,5 @@ public interface DecoderFactory { * Produce a new instance of a decoder with type {@link T}. * @return a new instance of your decoder. */ - T make() throws IllegalAccessException, InstantiationException; + T make() throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException; } diff --git a/library/src/com/davemorrissey/labs/subscaleview/decoder/SkiaImageDecoder.java b/library/src/com/davemorrissey/labs/subscaleview/decoder/SkiaImageDecoder.java index 3a42d31..d72ccdf 100644 --- a/library/src/com/davemorrissey/labs/subscaleview/decoder/SkiaImageDecoder.java +++ b/library/src/com/davemorrissey/labs/subscaleview/decoder/SkiaImageDecoder.java @@ -24,12 +24,25 @@ public class SkiaImageDecoder implements ImageDecoder { private static final String ASSET_PREFIX = FILE_PREFIX + "/android_asset/"; private static final String RESOURCE_PREFIX = ContentResolver.SCHEME_ANDROID_RESOURCE + "://"; + private final Bitmap.Config bitmapConfig; + + public SkiaImageDecoder() { + this(null); + } + + public SkiaImageDecoder(Bitmap.Config bitmapConfig) { + if (bitmapConfig == null) + this.bitmapConfig = Bitmap.Config.RGB_565; + else + this.bitmapConfig = bitmapConfig; + } + @Override public Bitmap decode(Context context, Uri uri) throws Exception { String uriString = uri.toString(); BitmapFactory.Options options = new BitmapFactory.Options(); Bitmap bitmap; - options.inPreferredConfig = Bitmap.Config.RGB_565; + options.inPreferredConfig = bitmapConfig; if (uriString.startsWith(RESOURCE_PREFIX)) { Resources res; String packageName = uri.getAuthority(); diff --git a/library/src/com/davemorrissey/labs/subscaleview/decoder/SkiaImageRegionDecoder.java b/library/src/com/davemorrissey/labs/subscaleview/decoder/SkiaImageRegionDecoder.java index be95a66..b9b808f 100644 --- a/library/src/com/davemorrissey/labs/subscaleview/decoder/SkiaImageRegionDecoder.java +++ b/library/src/com/davemorrissey/labs/subscaleview/decoder/SkiaImageRegionDecoder.java @@ -28,6 +28,19 @@ public class SkiaImageRegionDecoder implements ImageRegionDecoder { private static final String ASSET_PREFIX = FILE_PREFIX + "/android_asset/"; private static final String RESOURCE_PREFIX = ContentResolver.SCHEME_ANDROID_RESOURCE + "://"; + private final Bitmap.Config bitmapConfig; + + public SkiaImageRegionDecoder() { + this(null); + } + + public SkiaImageRegionDecoder(Bitmap.Config bitmapConfig) { + if (bitmapConfig == null) + this.bitmapConfig = Bitmap.Config.RGB_565; + else + this.bitmapConfig = bitmapConfig; + } + @Override public Point init(Context context, Uri uri) throws Exception { String uriString = uri.toString(); @@ -80,7 +93,7 @@ public class SkiaImageRegionDecoder implements ImageRegionDecoder { synchronized (decoderLock) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = sampleSize; - options.inPreferredConfig = Config.RGB_565; + options.inPreferredConfig = bitmapConfig; Bitmap bitmap = decoder.decodeRegion(sRect, options); if (bitmap == null) { throw new RuntimeException("Skia image decoder returned null bitmap - image format may not be supported"); -- cgit v1.2.3