Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Side by Side Diff: include/codec/SkCodec.h

Issue 1220733013: SkCodec no longer inherits from SkImageGenerator. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Manually handle the lifetime of fScanlineDecoder. Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « dm/DMSrcSink.cpp ('k') | include/codec/SkScanlineDecoder.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2015 Google Inc. 2 * Copyright 2015 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkCodec_DEFINED 8 #ifndef SkCodec_DEFINED
9 #define SkCodec_DEFINED 9 #define SkCodec_DEFINED
10 10
11 #include "SkColor.h"
11 #include "SkEncodedFormat.h" 12 #include "SkEncodedFormat.h"
12 #include "SkImageGenerator.h"
13 #include "SkImageInfo.h" 13 #include "SkImageInfo.h"
14 #include "SkScanlineDecoder.h"
15 #include "SkSize.h" 14 #include "SkSize.h"
16 #include "SkStream.h" 15 #include "SkStream.h"
17 #include "SkTemplates.h" 16 #include "SkTemplates.h"
18 #include "SkTypes.h" 17 #include "SkTypes.h"
19 18
20 class SkData; 19 class SkData;
20 class SkScanlineDecoder;
21 21
22 /** 22 /**
23 * Abstraction layer directly on top of an image codec. 23 * Abstraction layer directly on top of an image codec.
24 */ 24 */
25 class SkCodec : public SkImageGenerator { 25 class SkCodec : SkNoncopyable {
26 public: 26 public:
27 /** 27 /**
28 * If this stream represents an encoded image that we know how to decode, 28 * If this stream represents an encoded image that we know how to decode,
29 * return an SkCodec that can decode it. Otherwise return NULL. 29 * return an SkCodec that can decode it. Otherwise return NULL.
30 * 30 *
31 * If NULL is returned, the stream is deleted immediately. Otherwise, the 31 * If NULL is returned, the stream is deleted immediately. Otherwise, the
32 * SkCodec takes ownership of it, and will delete it when done with it. 32 * SkCodec takes ownership of it, and will delete it when done with it.
33 */ 33 */
34 static SkCodec* NewFromStream(SkStream*); 34 static SkCodec* NewFromStream(SkStream*);
35 35
36 /** 36 /**
37 * If this data represents an encoded image that we know how to decode, 37 * If this data represents an encoded image that we know how to decode,
38 * return an SkCodec that can decode it. Otherwise return NULL. 38 * return an SkCodec that can decode it. Otherwise return NULL.
39 * 39 *
40 * Will take a ref if it returns a codec, else will not affect the data. 40 * Will take a ref if it returns a codec, else will not affect the data.
41 */ 41 */
42 static SkCodec* NewFromData(SkData*); 42 static SkCodec* NewFromData(SkData*);
43 43
44 virtual ~SkCodec();
45
46 /**
47 * Return the ImageInfo associated with this codec.
48 */
49 const SkImageInfo& getInfo() const { return fInfo; }
50
44 /** 51 /**
45 * Return a size that approximately supports the desired scale factor. 52 * Return a size that approximately supports the desired scale factor.
46 * The codec may not be able to scale efficiently to the exact scale 53 * The codec may not be able to scale efficiently to the exact scale
47 * factor requested, so return a size that approximates that scale. 54 * factor requested, so return a size that approximates that scale.
48 *
49 * FIXME: Move to SkImageGenerator?
50 */ 55 */
51 SkISize getScaledDimensions(float desiredScale) const { 56 SkISize getScaledDimensions(float desiredScale) const {
52 return this->onGetScaledDimensions(desiredScale); 57 return this->onGetScaledDimensions(desiredScale);
53 } 58 }
54 59
55 /** 60 /**
56 * Format of the encoded data. 61 * Format of the encoded data.
57 */ 62 */
58 SkEncodedFormat getEncodedFormat() const { return this->onGetEncodedFormat() ; } 63 SkEncodedFormat getEncodedFormat() const { return this->onGetEncodedFormat() ; }
59 64
60 /** 65 /**
66 * Used to describe the result of a call to getPixels().
67 *
68 * Result is the union of possible results from subclasses.
69 */
70 enum Result {
71 /**
72 * General return value for success.
73 */
74 kSuccess,
75 /**
76 * The input is incomplete. A partial image was generated.
77 */
78 kIncompleteInput,
79 /**
80 * The generator cannot convert to match the request, ignoring
81 * dimensions.
82 */
83 kInvalidConversion,
84 /**
85 * The generator cannot scale to requested size.
86 */
87 kInvalidScale,
88 /**
89 * Parameters (besides info) are invalid. e.g. NULL pixels, rowBytes
90 * too small, etc.
91 */
92 kInvalidParameters,
93 /**
94 * The input did not contain a valid image.
95 */
96 kInvalidInput,
97 /**
98 * Fulfilling this request requires rewinding the input, which is not
99 * supported for this input.
100 */
101 kCouldNotRewind,
102 /**
103 * This method is not implemented by this generator.
104 */
105 kUnimplemented,
106 };
107
108 /**
109 * Whether or not the memory passed to getPixels is zero initialized.
110 */
111 enum ZeroInitialized {
112 /**
113 * The memory passed to getPixels is zero initialized. The SkCodec
114 * may take advantage of this by skipping writing zeroes.
115 */
116 kYes_ZeroInitialized,
117 /**
118 * The memory passed to getPixels has not been initialized to zero,
119 * so the SkCodec must write all zeroes to memory.
120 *
121 * This is the default. It will be used if no Options struct is used.
122 */
123 kNo_ZeroInitialized,
124 };
125
126 /**
127 * Additional options to pass to getPixels.
128 */
129 struct Options {
130 Options()
131 : fZeroInitialized(kNo_ZeroInitialized) {}
132
133 ZeroInitialized fZeroInitialized;
134 };
135
136 /**
137 * Decode into the given pixels, a block of memory of size at
138 * least (info.fHeight - 1) * rowBytes + (info.fWidth *
139 * bytesPerPixel)
140 *
141 * Repeated calls to this function should give the same results,
142 * allowing the PixelRef to be immutable.
143 *
144 * @param info A description of the format (config, size)
145 * expected by the caller. This can simply be identical
146 * to the info returned by getInfo().
147 *
148 * This contract also allows the caller to specify
149 * different output-configs, which the implementation can
150 * decide to support or not.
151 *
152 * A size that does not match getInfo() implies a request
153 * to scale. If the generator cannot perform this scale,
154 * it will return kInvalidScale.
155 *
156 * If info is kIndex8_SkColorType, then the caller must provide storage for up to 256
157 * SkPMColor values in ctable. On success the generator must copy N colors into that storage,
158 * (where N is the logical number of table entries) and set ctableCount to N.
159 *
160 * If info is not kIndex8_SkColorType, then the last two parameters may be NULL. If ctableCount
161 * is not null, it will be set to 0.
162 *
163 * @return Result kSuccess, or another value explaining the type of failure .
164 */
165 Result getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, con st Options*,
166 SkPMColor ctable[], int* ctableCount);
167
168 /**
169 * Simplified version of getPixels() that asserts that info is NOT kIndex8_ SkColorType and
170 * uses the default Options.
171 */
172 Result getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes);
173
174 /**
61 * Return an object which can be used to decode individual scanlines. 175 * Return an object which can be used to decode individual scanlines.
62 * 176 *
63 * This object is owned by the SkCodec, which will handle its lifetime. The 177 * This object is owned by the SkCodec, which will handle its lifetime. The
64 * returned object is only valid until the SkCodec is deleted or the next 178 * returned object is only valid until the SkCodec is deleted or the next
65 * call to getScanlineDecoder, whichever comes first. 179 * call to getScanlineDecoder, whichever comes first.
66 * 180 *
67 * Calling a second time will rewind and replace the existing one with a 181 * Calling a second time will rewind and replace the existing one with a
68 * new one. If the stream cannot be rewound, this will delete the existing 182 * new one. If the stream cannot be rewound, this will delete the existing
69 * one and return NULL. 183 * one and return NULL.
70 * 184 *
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 protected: 225 protected:
112 SkCodec(const SkImageInfo&, SkStream*); 226 SkCodec(const SkImageInfo&, SkStream*);
113 227
114 virtual SkISize onGetScaledDimensions(float /* desiredScale */) const { 228 virtual SkISize onGetScaledDimensions(float /* desiredScale */) const {
115 // By default, scaling is not supported. 229 // By default, scaling is not supported.
116 return this->getInfo().dimensions(); 230 return this->getInfo().dimensions();
117 } 231 }
118 232
119 virtual SkEncodedFormat onGetEncodedFormat() const = 0; 233 virtual SkEncodedFormat onGetEncodedFormat() const = 0;
120 234
235 virtual Result onGetPixels(const SkImageInfo& info,
236 void* pixels, size_t rowBytes, const Options&,
237 SkPMColor ctable[], int* ctableCount) = 0;
238
121 /** 239 /**
122 * Override if your codec supports scanline decoding. 240 * Override if your codec supports scanline decoding.
123 * 241 *
124 * As in onGetPixels(), the implementation must call rewindIfNeeded() and 242 * As in onGetPixels(), the implementation must call rewindIfNeeded() and
125 * handle as appropriate. 243 * handle as appropriate.
126 * 244 *
127 * @param dstInfo Info of the destination. If the dimensions do not match 245 * @param dstInfo Info of the destination. If the dimensions do not match
128 * those of getInfo, this implies a scale. 246 * those of getInfo, this implies a scale.
129 * @param options Contains decoding options, including if memory is zero 247 * @param options Contains decoding options, including if memory is zero
130 * initialized. 248 * initialized.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 return fStream.get(); 293 return fStream.get();
176 } 294 }
177 295
178 /** 296 /**
179 * If the codec has a scanline decoder, return it (no ownership change occur s) 297 * If the codec has a scanline decoder, return it (no ownership change occur s)
180 * else return NULL. 298 * else return NULL.
181 * The returned decoder is valid while the codec exists and the client has n ot 299 * The returned decoder is valid while the codec exists and the client has n ot
182 * created a new scanline decoder. 300 * created a new scanline decoder.
183 */ 301 */
184 SkScanlineDecoder* scanlineDecoder() { 302 SkScanlineDecoder* scanlineDecoder() {
185 return fScanlineDecoder.get(); 303 return fScanlineDecoder;
186 } 304 }
187 305
188 /** 306 /**
189 * Allow the codec subclass to detach and take ownership of the scanline dec oder. 307 * Allow the codec subclass to detach and take ownership of the scanline dec oder.
190 * This will likely be used when the scanline decoder needs to be destroyed 308 * This will likely be used when the scanline decoder needs to be destroyed
191 * in the destructor of the subclass. 309 * in the destructor of the subclass.
192 */ 310 */
193 SkScanlineDecoder* detachScanlineDecoder() { 311 SkScanlineDecoder* detachScanlineDecoder() {
194 return fScanlineDecoder.detach(); 312 SkScanlineDecoder* scanlineDecoder = fScanlineDecoder;
313 fScanlineDecoder = NULL;
314 return scanlineDecoder;
195 } 315 }
196 316
197 private: 317 private:
198 SkAutoTDelete<SkStream> fStream; 318 const SkImageInfo fInfo;
199 bool fNeedsRewind; 319 SkAutoTDelete<SkStream> fStream;
200 SkAutoTDelete<SkScanlineDecoder> fScanlineDecoder; 320 bool fNeedsRewind;
201 321 SkScanlineDecoder* fScanlineDecoder;
202 typedef SkImageGenerator INHERITED;
203 }; 322 };
204 #endif // SkCodec_DEFINED 323 #endif // SkCodec_DEFINED
OLDNEW
« no previous file with comments | « dm/DMSrcSink.cpp ('k') | include/codec/SkScanlineDecoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698