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 "include/android/SkBRDAllocator.h"
12#include "include/core/SkBitmap.h"
13#include "include/core/SkEncodedImageFormat.h"
14#include "include/core/SkStream.h"
15
16/*
17 * This class aims to provide an interface to test multiple implementations of
18 * SkBitmapRegionDecoder.
19 */
20class SK_API SkBitmapRegionDecoder {
21public:
22
23 enum Strategy {
24 kAndroidCodec_Strategy, // Uses SkAndroidCodec for scaling and subsetting
25 };
26
27 /*
28 * @param data Refs the data while this object exists, unrefs on destruction
29 * @param strategy Strategy used for scaling and subsetting
30 * @return Tries to create an SkBitmapRegionDecoder, returns NULL on failure
31 */
32 static SkBitmapRegionDecoder* Create(sk_sp<SkData>, Strategy strategy);
33
34 /*
35 * @param stream Takes ownership of the stream
36 * @param strategy Strategy used for scaling and subsetting
37 * @return Tries to create an SkBitmapRegionDecoder, returns NULL on failure
38 */
39 static SkBitmapRegionDecoder* Create(
40 SkStreamRewindable* stream, Strategy strategy);
41
42 /*
43 * Decode a scaled region of the encoded image stream
44 *
45 * @param bitmap Container for decoded pixels. It is assumed that the pixels
46 * are initially unallocated and will be allocated by this function.
47 * @param allocator Allocator for the pixels. If this is NULL, the default
48 * allocator (HeapAllocator) will be used.
49 * @param desiredSubset Subset of the original image to decode.
50 * @param sampleSize An integer downscaling factor for the decode.
51 * @param colorType Preferred output colorType.
52 * New implementations should return NULL if they do not support
53 * decoding to this color type.
54 * The old kOriginal_Strategy will decode to a default color type
55 * if this color type is unsupported.
56 * @param requireUnpremul If the image is not opaque, we will use this to determine the
57 * alpha type to use.
58 * @param prefColorSpace If non-null and supported, this is the color space that we will
59 * decode into. Otherwise, we will choose a default.
60 *
61 */
62 virtual bool decodeRegion(SkBitmap* bitmap, SkBRDAllocator* allocator,
63 const SkIRect& desiredSubset, int sampleSize,
64 SkColorType colorType, bool requireUnpremul,
65 sk_sp<SkColorSpace> prefColorSpace = nullptr) = 0;
66
67 virtual SkEncodedImageFormat getEncodedFormat() = 0;
68
69 virtual SkColorType computeOutputColorType(SkColorType requestedColorType) = 0;
70
71 virtual sk_sp<SkColorSpace> computeOutputColorSpace(SkColorType outputColorType,
72 sk_sp<SkColorSpace> prefColorSpace = nullptr) = 0;
73
74
75 int width() const { return fWidth; }
76 int height() const { return fHeight; }
77
78 virtual ~SkBitmapRegionDecoder() {}
79
80protected:
81
82 SkBitmapRegionDecoder(int width, int height)
83 : fWidth(width)
84 , fHeight(height)
85 {}
86
87private:
88 const int fWidth;
89 const int fHeight;
90};
91
92#endif
93