aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/SkBitmapRegionDecoderInterface.h
blob: e1f79bccb66b263d7fcf1f5e8d7e4d2e26a06e56 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
 * Copyright 2015 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkBitmapRegionDecoder_DEFINED
#define SkBitmapRegionDecoder_DEFINED

#include "SkBitmap.h"
#include "SkStream.h"

/*
 * This class aims to provide an interface to test multiple implementations of
 * SkBitmapRegionDecoder.
 */
class SkBitmapRegionDecoderInterface {
public:

    enum Strategy {
        kCanvas_Strategy,       // Draw to the canvas, uses SkCodec
        kOriginal_Strategy,     // Sampling, uses SkImageDecoder
        kAndroidCodec_Strategy, // Uses SkAndroidCodec for scaling and subsetting
    };

    /*
     * @param data     Refs the data while this object exists, unrefs on destruction
     * @param strategy Strategy used for scaling and subsetting
     * @return         Tries to create an SkBitmapRegionDecoder, returns NULL on failure
     */
    static SkBitmapRegionDecoderInterface* CreateBitmapRegionDecoder(
            SkData* data, Strategy strategy);

    /*
     * Decode a scaled region of the encoded image stream
     *
     * @param start_x    X-coordinate of upper-left corner of region.
     *                   This coordinate is unscaled, relative to the original dimensions.
     * @param start_y    Y-coordinate of upper-left corner of region.
     *                   This coordinate is unscaled, relative to the original dimensions.
     * @param width      Width of the region to decode.
     *                   This distance is unscaled, relative to the original dimensions.
     * @param height     Height of the region to decode.
     *                   This distance is unscaled, relative to the original dimensions.
     * @param sampleSize An integer downscaling factor for the decode.
     * @param colorType  Preferred output colorType.
     *                   New implementations should return NULL if they do not support
     *                   decoding to this color type.
     *                   The old kOriginal_Strategy will decode to a default color type
     *                   if this color type is unsupported.
     * @return           Pointer to a bitmap of the decoded region on success, NULL on
     *                   failure.
     */
    virtual SkBitmap* decodeRegion(int start_x, int start_y, int width,
                                   int height, int sampleSize,
                                   SkColorType colorType) = 0;
    /*
     * @param  Requested destination color type
     * @return true if we support the requested color type and false otherwise
     */
    virtual bool conversionSupported(SkColorType colorType) = 0;

    int width() const { return fWidth; }
    int height() const { return fHeight; }

    virtual ~SkBitmapRegionDecoderInterface() {}

protected:

    SkBitmapRegionDecoderInterface(int width, int height)
        : fWidth(width)
        , fHeight(height)
    {}

private:
    const int fWidth;
    const int fHeight;
};

#endif