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

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

Issue 1332053002: Fill incomplete images in SkCodec parent class (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 3 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
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 SkScanlineDecoder_DEFINED 8 #ifndef SkScanlineDecoder_DEFINED
9 #define SkScanlineDecoder_DEFINED 9 #define SkScanlineDecoder_DEFINED
10 10
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
93 /** 93 /**
94 * Write the next countLines scanlines into dst. 94 * Write the next countLines scanlines into dst.
95 * 95 *
96 * Not valid to call before calling start(). 96 * Not valid to call before calling start().
97 * 97 *
98 * @param dst Must be non-null, and large enough to hold countLines 98 * @param dst Must be non-null, and large enough to hold countLines
99 * scanlines of size rowBytes. 99 * scanlines of size rowBytes.
100 * @param countLines Number of lines to write. 100 * @param countLines Number of lines to write.
101 * @param rowBytes Number of bytes per row. Must be large enough to hold 101 * @param rowBytes Number of bytes per row. Must be large enough to hold
102 * a scanline based on the SkImageInfo used to create this object. 102 * a scanline based on the SkImageInfo used to create this object.
103 * @return the number of lines successfully decoded
103 */ 104 */
104 SkCodec::Result getScanlines(void* dst, int countLines, size_t rowBytes) { 105 uint32_t getScanlines(void* dst, int countLines, size_t rowBytes) {
105 SkASSERT(!fDstInfo.isEmpty()); 106 SkASSERT(!fDstInfo.isEmpty());
106 if ((rowBytes < fDstInfo.minRowBytes() && countLines > 1 ) || countLines <= 0 107 if ((rowBytes < fDstInfo.minRowBytes() && countLines > 1 ) || countLines <= 0
107 || fCurrScanline + countLines > fDstInfo.height()) { 108 || fCurrScanline + countLines > fDstInfo.height()) {
108 return SkCodec::kInvalidParameters; 109 return SkCodec::kInvalidParameters;
109 } 110 }
110 const SkCodec::Result result = this->onGetScanlines(dst, countLines, row Bytes); 111 uint32_t decodedLines = this->onGetScanlines(dst, countLines, rowBytes);
111 fCurrScanline += countLines; 112 fCurrScanline += decodedLines;
112 return result; 113 return decodedLines;
113 } 114 }
114 115
115 /** 116 /**
116 * Skip count scanlines. 117 * Skip count scanlines.
117 * 118 *
118 * Not valid to call before calling start(). 119 * Not valid to call before calling start().
119 * 120 *
120 * The default version just calls onGetScanlines and discards the dst. 121 * The default version just calls onGetScanlines and discards the dst.
121 * NOTE: If skipped lines are the only lines with alpha, this default 122 * NOTE: If skipped lines are the only lines with alpha, this default
122 * will make reallyHasAlpha return true, when it could have returned 123 * will make reallyHasAlpha return true, when it could have returned
123 * false. 124 * false.
125 *
126 * @return the number of lines successfully skipped
scroggo 2015/09/22 18:02:48 Is this useful to know? It seems like skipping par
msarett 2015/09/23 13:22:40 Um no this isn't useful. I'm making this return a
scroggo 2015/09/25 15:55:05 I think they should return the same value. If you
msarett 2015/10/01 12:44:51 Will change, I thought returning different values
scroggo 2015/10/01 14:48:31 In general, I think it's better to report failures
msarett 2015/10/01 18:14:12 Gotcha. For now, I'm happy with it as is.
124 */ 127 */
125 SkCodec::Result skipScanlines(int countLines) { 128 uint32_t skipScanlines(int countLines) {
126 SkASSERT(!fDstInfo.isEmpty()); 129 SkASSERT(!fDstInfo.isEmpty());
127 if (fCurrScanline + countLines > fDstInfo.height()) { 130 if (fCurrScanline + countLines > fDstInfo.height()) {
128 // Arguably, we could just skip the scanlines which are remaining, 131 // Arguably, we could just skip the scanlines which are remaining,
129 // and return kSuccess. We choose to return invalid so the client 132 // and return kSuccess. We choose to return invalid so the client
130 // can catch their bug. 133 // can catch their bug.
131 return SkCodec::kInvalidParameters; 134 return SkCodec::kInvalidParameters;
132 } 135 }
133 const SkCodec::Result result = this->onSkipScanlines(countLines); 136 uint32_t skippedLines = this->onSkipScanlines(countLines);
134 fCurrScanline += countLines; 137 fCurrScanline += skippedLines;
135 return result; 138 return skippedLines;
136 } 139 }
137 140
138 /** 141 /**
139 * Some images may initially report that they have alpha due to the format 142 * Some images may initially report that they have alpha due to the format
140 * of the encoded data, but then never use any colors which have alpha 143 * of the encoded data, but then never use any colors which have alpha
141 * less than 100%. This function can be called *after* decoding to 144 * less than 100%. This function can be called *after* decoding to
142 * determine if such an image truly had alpha. Calling it before decoding 145 * determine if such an image truly had alpha. Calling it before decoding
143 * is undefined. 146 * is undefined.
144 * FIXME: see skbug.com/3582. 147 * FIXME: see skbug.com/3582.
145 */ 148 */
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
213 kNone_SkScanlineOrder, 216 kNone_SkScanlineOrder,
214 }; 217 };
215 218
216 /** 219 /**
217 * An enum representing the order in which scanlines will be returned by 220 * An enum representing the order in which scanlines will be returned by
218 * the scanline decoder. 221 * the scanline decoder.
219 */ 222 */
220 SkScanlineOrder getScanlineOrder() const { return this->onGetScanlineOrder() ; } 223 SkScanlineOrder getScanlineOrder() const { return this->onGetScanlineOrder() ; }
221 224
222 /** 225 /**
223 * Returns the y-coordinate of the next row to be returned by the scanline 226 * Returns the y-coordinate of the next dst row to be returned by the scanl ine
224 * decoder. This will be overridden in the case of 227 * decoder. This will be overridden in the case of
225 * kOutOfOrder_SkScanlineOrder and should be unnecessary in the case of 228 * kOutOfOrder_SkScanlineOrder or kBottomUp_SkScanlineOrder, and should be
226 * kNone_SkScanlineOrder. 229 * unnecessary in the case of kNone_SkScanlineOrder.
227 */ 230 */
228 int getY() const { 231 int getY() const {
229 SkASSERT(kNone_SkScanlineOrder != this->getScanlineOrder()); 232 SkASSERT(kNone_SkScanlineOrder != this->getScanlineOrder());
230 return this->onGetY(); 233 return this->onGetY(fCurrScanline);
scroggo 2015/09/22 18:02:48 Could this function be non-virtual, and just depen
msarett 2015/09/23 13:22:40 Yes I think so! Will do. The one thing that may
234 }
235
236 /**
237 * Returns the y-coordinate of the decoded row that corresponds to the
238 * input encoded y-coordinate. This will be overridden in the case of
239 * kOutOfOrder_SkScanlineOrder or kBottomUp_SkScanlineOrder, and should be
240 * unnecessary in the case of kNone_SkScanlineOrder.
241 */
242 int getY(int encodedY) const {
scroggo 2015/09/22 18:02:48 I find the name encodedY confusing. Maybe srcY? I'
msarett 2015/09/23 13:22:40 In order to Fill() for kOutOfOrder images, we need
243 SkASSERT(kNone_SkScanlineOrder != this->getScanlineOrder());
244 return this->onGetY(encodedY);
245 }
246
247 uint32_t getFillValue(const SkImageInfo& dstInfo) const {
248 return fCodec->getFillValue(dstInfo);
scroggo 2015/09/22 18:02:48 This stuff will become cleaner once I merge codec
msarett 2015/09/23 13:22:40 :)
249 }
250
251 void* getFillDst(void* dstStart, size_t rowBytes, uint32_t decodedScanlines) const {
252 return fCodec->getFillDst(dstStart, rowBytes, decodedScanlines);
231 } 253 }
232 254
233 protected: 255 protected:
234 SkScanlineDecoder(const SkImageInfo& srcInfo) 256 SkScanlineDecoder(SkCodec* codec, const SkImageInfo& srcInfo)
235 : fSrcInfo(srcInfo) 257 : fCodec(codec)
258 , fSrcInfo(srcInfo)
236 , fDstInfo() 259 , fDstInfo()
237 , fOptions() 260 , fOptions()
238 , fCurrScanline(0) {} 261 , fCurrScanline(0) {}
239 262
240 virtual SkISize onGetScaledDimensions(float /* desiredScale */) { 263 virtual SkISize onGetScaledDimensions(float /* desiredScale */) {
241 // By default, scaling is not supported. 264 // By default, scaling is not supported.
242 return this->getInfo().dimensions(); 265 return this->getInfo().dimensions();
243 } 266 }
244 267
245 virtual SkEncodedFormat onGetEncodedFormat() const = 0; 268 virtual SkEncodedFormat onGetEncodedFormat() const = 0;
246 269
247 virtual bool onReallyHasAlpha() const { return false; } 270 virtual bool onReallyHasAlpha() const { return false; }
248 271
249 /** 272 /**
250 * Most images types will be kTopDown and will not need to override this fu nction. 273 * Most images types will be kTopDown and will not need to override this fu nction.
251 */ 274 */
252 virtual SkScanlineOrder onGetScanlineOrder() const { return kTopDown_SkScanl ineOrder; } 275 virtual SkScanlineOrder onGetScanlineOrder() const { return kTopDown_SkScanl ineOrder; }
253 276
254 /** 277 /**
255 * Most images will be kTopDown and will not need to override this function . 278 * Most images will be kTopDown and will not need to override this function .
256 */ 279 */
257 virtual int onGetY() const { return fCurrScanline; } 280 virtual int onGetY(int encodedY) const { return encodedY; }
258 281
259 const SkImageInfo& dstInfo() const { return fDstInfo; } 282 const SkImageInfo& dstInfo() const { return fDstInfo; }
260 283
261 const SkCodec::Options& options() const { return fOptions; } 284 const SkCodec::Options& options() const { return fOptions; }
262 285
263 private: 286 private:
264 const SkImageInfo fSrcInfo; 287 SkAutoTDelete<SkCodec> fCodec;
265 SkImageInfo fDstInfo; 288 const SkImageInfo fSrcInfo;
266 SkCodec::Options fOptions; 289 SkImageInfo fDstInfo;
267 int fCurrScanline; 290 SkCodec::Options fOptions;
291 int fCurrScanline;
268 292
269 virtual SkCodec::Result onStart(const SkImageInfo& dstInfo, 293 virtual SkCodec::Result onStart(const SkImageInfo& dstInfo,
270 const SkCodec::Options& options, 294 const SkCodec::Options& options,
271 SkPMColor ctable[], int* ctableCount) = 0; 295 SkPMColor ctable[], int* ctableCount) = 0;
272 296
273 // Naive default version just calls onGetScanlines on temp memory. 297 // Naive default version just calls onGetScanlines on temp memory.
274 virtual SkCodec::Result onSkipScanlines(int countLines) { 298 virtual uint32_t onSkipScanlines(int countLines) {
275 SkAutoMalloc storage(fDstInfo.minRowBytes()); 299 SkAutoMalloc storage(fDstInfo.minRowBytes());
276 // Note that we pass 0 to rowBytes so we continue to use the same memory . 300 // Note that we pass 0 to rowBytes so we continue to use the same memory .
277 // Also note that while getScanlines checks that rowBytes is big enough, 301 // Also note that while getScanlines checks that rowBytes is big enough,
278 // onGetScanlines bypasses that check. 302 // onGetScanlines bypasses that check.
279 // Calling the virtual method also means we do not double count 303 // Calling the virtual method also means we do not double count
280 // countLines. 304 // countLines.
281 return this->onGetScanlines(storage.get(), countLines, 0); 305 return this->onGetScanlines(storage.get(), countLines, 0);
282 } 306 }
283 307
284 virtual SkCodec::Result onGetScanlines(void* dst, int countLines, 308 virtual uint32_t onGetScanlines(void* dst, int countLines, size_t rowBytes) = 0;
285 size_t rowBytes) = 0;
286 309
287 }; 310 };
288 #endif // SkScanlineDecoder_DEFINED 311 #endif // SkScanlineDecoder_DEFINED
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698