1/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#ifndef SkBitmapRegionDecoder_DEFINED
9#define SkBitmapRegionDecoder_DEFINED
10
11#include "SkBitmap.h"
12#include "SkBRDAllocator.h"
13#include "SkEncodedFormat.h"
14#include "SkStream.h"
15
16/*
17 * This class aims to provide an interface to test multiple implementations of
18 * SkBitmapRegionDecoder.
19 */
20class SkBitmapRegionDecoder {
21public:
22
23    enum Strategy {
24        kCanvas_Strategy,       // Draw to the canvas, uses SkCodec
25        kAndroidCodec_Strategy, // Uses SkAndroidCodec for scaling and subsetting
26    };
27
28    /*
29     * @param data     Refs the data while this object exists, unrefs on destruction
30     * @param strategy Strategy used for scaling and subsetting
31     * @return         Tries to create an SkBitmapRegionDecoder, returns NULL on failure
32     */
33    static SkBitmapRegionDecoder* Create(
34            SkData* data, Strategy strategy);
35
36    /*
37     * @param stream   Takes ownership of the stream
38     * @param strategy Strategy used for scaling and subsetting
39     * @return         Tries to create an SkBitmapRegionDecoder, returns NULL on failure
40     */
41    static SkBitmapRegionDecoder* Create(
42            SkStreamRewindable* stream, Strategy strategy);
43
44    /*
45     * Decode a scaled region of the encoded image stream
46     *
47     * @param bitmap          Container for decoded pixels.  It is assumed that the pixels
48     *                        are initially unallocated and will be allocated by this function.
49     * @param allocator       Allocator for the pixels.  If this is NULL, the default
50     *                        allocator (HeapAllocator) will be used.
51     * @param desiredSubset   Subset of the original image to decode.
52     * @param sampleSize      An integer downscaling factor for the decode.
53     * @param colorType       Preferred output colorType.
54     *                        New implementations should return NULL if they do not support
55     *                        decoding to this color type.
56     *                        The old kOriginal_Strategy will decode to a default color type
57     *                        if this color type is unsupported.
58     * @param requireUnpremul If the image is not opaque, we will use this to determine the
59     *                        alpha type to use.
60     *
61     */
62    virtual bool decodeRegion(SkBitmap* bitmap, SkBRDAllocator* allocator,
63                              const SkIRect& desiredSubset, int sampleSize,
64                              SkColorType colorType, bool requireUnpremul) = 0;
65    /*
66     * @param  Requested destination color type
67     * @return true if we support the requested color type and false otherwise
68     */
69    virtual bool conversionSupported(SkColorType colorType) = 0;
70
71    virtual SkEncodedFormat getEncodedFormat() = 0;
72
73    int width() const { return fWidth; }
74    int height() const { return fHeight; }
75
76    virtual ~SkBitmapRegionDecoder() {}
77
78protected:
79
80    SkBitmapRegionDecoder(int width, int height)
81        : fWidth(width)
82        , fHeight(height)
83    {}
84
85private:
86    const int fWidth;
87    const int fHeight;
88};
89
90#endif
91