com.davemorrissey.labs.subscaleview.decoder

## Class SkiaImageRegionDecoder

- java.lang.Object
- - com.davemorrissey.labs.subscaleview.decoder.SkiaImageRegionDecoder

All Implemented Interfaces:
  ImageRegionDecoder

    public class SkiaImageRegionDecoder
    extends Object
    implements ImageRegionDecoder

Default implementation of `ImageRegionDecoder` using Android's `BitmapRegionDecoder`, based on the Skia library. This works well in most circumstances and has reasonable performance due to the cached decoder instance, however it has some problems with grayscale, indexed and CMYK images. A `ReadWriteLock` is used to delegate responsibility for multi threading behaviour to the `BitmapRegionDecoder` instance on SDK >= 21, whilst allowing this class to block until no tiles are being loaded before recycling the decoder. In practice, `BitmapRegionDecoder` is synchronized internally so this has no real impact on performance.

### Constructor Summary

Constructors
Constructor and Description
`SkiaImageRegionDecoder()`
`SkiaImageRegionDecoder(Bitmap.Config bitmapConfig)`

### Method Summary

All Methods Instance Methods Concrete Methods
`Bitmap` `decodeRegion(Rect sRect, int sampleSize)` Decode a region of the image with the given sample size.
`Point` `init(Context context, Uri uri)` Initialise the decoder.
`boolean` `isReady()` Status check.
`void` `recycle()` This method will be called when the decoder is no longer required.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Constructor Detail

#### SkiaImageRegionDecoder

    public SkiaImageRegionDecoder()

#### SkiaImageRegionDecoder

    public SkiaImageRegionDecoder(@Nullable
                                  Bitmap.Config bitmapConfig)

### Method Detail

#### init

    @NonNull
    public Point init(Context context,
                               @NonNull
                               Uri uri)
                        throws Exception

Description copied from interface: `ImageRegionDecoder`
Initialise the decoder. When possible, perform initial setup work once in this method. The dimensions of the image must be returned. The URI can be in one of the following formats:
File: `file:///scard/picture.jpg`
Asset: `file:///android_asset/picture.png`
Resource: `android.resource://com.example.app/drawable/picture`

Specified by:
  `init` in interface `ImageRegionDecoder`
Parameters:
  `context` - Application context. A reference may be held, but must be cleared on recycle.
  `uri` - URI of the image.
Returns:
  Dimensions of the image.
Throws:
  `Exception` - if initialisation fails.

#### decodeRegion

    @NonNull
    public Bitmap decodeRegion(@NonNull
                                        Rect sRect,
                                        int sampleSize)

Description copied from interface: `ImageRegionDecoder`

Decode a region of the image with the given sample size. This method is called off the UI thread so it can safely load the image on the current thread. It is called from `AsyncTask`s running in an executor that may have multiple threads, so implementations must be thread safe. Adding `synchronized` to the method signature is the simplest way to achieve this, but bear in mind the `ImageRegionDecoder.recycle()` method can be called concurrently.

See `SkiaImageRegionDecoder` and `SkiaPooledImageRegionDecoder` for examples of internal locking and synchronization.

Specified by:
  `decodeRegion` in interface `ImageRegionDecoder`
Parameters:
  `sRect` - Source image rectangle to decode.
  `sampleSize` - Sample size.
Returns:
  The decoded region. It is safe to return null if decoding fails.

#### isReady

    public boolean isReady()

Description copied from interface: `ImageRegionDecoder`
Status check. Should return false before initialisation and after recycle.

Specified by:
  `isReady` in interface `ImageRegionDecoder`
Returns:
  true if the decoder is ready to be used.

#### recycle

    public void recycle()

Description copied from interface: `ImageRegionDecoder`
This method will be called when the decoder is no longer required. It should clean up any resources still in use.

Specified by:
  `recycle` in interface `ImageRegionDecoder`