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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
/*
* Copyright 2013 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkDecodingImageGenerator_DEFINED
#define SkDecodingImageGenerator_DEFINED
#include "SkBitmap.h"
#include "SkImageGenerator.h"
class SkData;
class SkStreamRewindable;
/**
* An implementation of SkImageGenerator that calls into
* SkImageDecoder.
*/
namespace SkDecodingImageGenerator {
/**
* These options will be passed on to the image decoder. The
* defaults are sensible.
*
* @param fSampleSize If set to > 1, tells the decoder to return a
* smaller than original bitmap, sampling 1 pixel for
* every size pixels. e.g. if sample size is set to 3,
* then the returned bitmap will be 1/3 as wide and high,
* and will contain 1/9 as many pixels as the original.
* Note: this is a hint, and the codec may choose to
* ignore this, or only approximate the sample size.
*
* @param fDitherImage Set to true if the the decoder should try to
* dither the resulting image when decoding to a smaller
* color-space. The default is true.
*
* @param fRequestedColorType If not given, then use whichever
* config the decoder wants. Else try to use this color
* type. If the decoder won't support this color type,
* SkDecodingImageGenerator::Create will return
* NULL. kIndex_8_SkColorType is not supported.
*
* @param fRequireUnpremul If true, the decoder will attempt to
* decode without premultiplying the alpha. If it cannot,
* the pixels will be set to NULL.
*/
struct Options {
Options()
: fSampleSize(1)
, fDitherImage(true)
, fUseRequestedColorType(false)
, fRequestedColorType()
, fRequireUnpremul(false) { }
Options(int sampleSize, bool dither)
: fSampleSize(sampleSize)
, fDitherImage(dither)
, fUseRequestedColorType(false)
, fRequestedColorType()
, fRequireUnpremul(false) { }
Options(int sampleSize, bool dither, SkColorType colorType)
: fSampleSize(sampleSize)
, fDitherImage(dither)
, fUseRequestedColorType(true)
, fRequestedColorType(colorType)
, fRequireUnpremul(false) { }
Options(int sampleSize, bool dither, SkColorType colorType,
bool requireUnpremul)
: fSampleSize(sampleSize)
, fDitherImage(dither)
, fUseRequestedColorType(true)
, fRequestedColorType(colorType)
, fRequireUnpremul(requireUnpremul) { }
const int fSampleSize;
const bool fDitherImage;
const bool fUseRequestedColorType;
const SkColorType fRequestedColorType;
const bool fRequireUnpremul;
};
/**
* These two functions return a SkImageGenerator that calls into
* SkImageDecoder. They return NULL on failure.
*
* The SkData version of this function is preferred. If the stream
* has an underlying SkData (such as a SkMemoryStream) pass that in.
*
* This object, if non-NULL, takes ownership of stream and deletes stream
* upon deletion. If NULL is returned, stream is deleted immediately.
*
* @param Options (see above)
*
* @return NULL on failure, a new SkImageGenerator on success.
*/
SkImageGenerator* Create(SkStreamRewindable* stream,
const Options& opt);
/**
* @param data Contains the encoded image data that will be used by
* the SkDecodingImageGenerator. Will be ref()ed by the
* SkImageGenerator constructor and and unref()ed on deletion.
*/
SkImageGenerator* Create(SkData* data, const Options& opt);
};
// // Example of most basic use case:
//
// bool install_data(SkData* data, SkBitmap* dst) {
// return SkInstallDiscardablePixelRef(
// SkDecodingImageGenerator::Create(
// data, SkDecodingImageGenerator::Options()), dst, NULL);
// }
// bool install_stream(SkStreamRewindable* stream, SkBitmap* dst) {
// return SkInstallDiscardablePixelRef(
// SkDecodingImageGenerator::Create(
// stream, SkDecodingImageGenerator::Options()), dst, NULL);
// }
#endif // SkDecodingImageGenerator_DEFINED
|