OLD | NEW |
---|---|
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 |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
227 * less than 100%. This function can be called *after* decoding to | 227 * less than 100%. This function can be called *after* decoding to |
228 * determine if such an image truly had alpha. Calling it before decoding | 228 * determine if such an image truly had alpha. Calling it before decoding |
229 * is undefined. | 229 * is undefined. |
230 * FIXME: see skbug.com/3582. | 230 * FIXME: see skbug.com/3582. |
231 */ | 231 */ |
232 bool reallyHasAlpha() const { | 232 bool reallyHasAlpha() const { |
233 return this->onReallyHasAlpha(); | 233 return this->onReallyHasAlpha(); |
234 } | 234 } |
235 | 235 |
236 /** | 236 /** |
237 * On a kIncompleteInput, we will fill any uninitialized scanlines. We allo w the subclass | |
scroggo
2015/10/01 14:48:31
I think "we" is a little vague here. I think you m
msarett
2015/10/01 18:14:13
The current implementation will always fill for ge
| |
238 * to indicate what value to fill with. | |
239 * | |
240 * @param colorType Destination color type. | |
241 * @param alphaType Destination alpha type. | |
242 * @return The value with which to fill uninitialized pixels. | |
243 * | |
244 * Note that we can interpret the return value as an SkPMColor, a 16-bit 565 color, | |
245 * an 8-bit gray color, or an 8-bit index into a color table, depending on t he color | |
246 * type specified in dstInfo. | |
247 */ | |
248 uint32_t getFillValue(SkColorType colorType, SkAlphaType alphaType) const { | |
scroggo
2015/10/01 14:48:31
Does this method need to be public?
msarett
2015/10/01 18:14:13
Yes, SkScaledCodec needs to call fCodec->getFillVa
scroggo
2015/10/01 20:48:57
FWIW, crrev.com/1372973002 makes SkScaledCodec a f
msarett
2015/10/01 22:34:51
That seems like a better solution. I am adding Sk
| |
249 return this->onGetFillValue(colorType, alphaType); | |
250 } | |
251 | |
252 /** | |
237 * The remaining functions revolve around decoding scanlines. | 253 * The remaining functions revolve around decoding scanlines. |
238 */ | 254 */ |
239 | 255 |
240 /** | 256 /** |
241 * Prepare for a scanline decode with the specified options. | 257 * Prepare for a scanline decode with the specified options. |
242 * | 258 * |
243 * After this call, this class will be ready to decode the first scanline. | 259 * After this call, this class will be ready to decode the first scanline. |
244 * | 260 * |
245 * This must be called in order to call getScanlines or skipScanlines. | 261 * This must be called in order to call getScanlines or skipScanlines. |
246 * | 262 * |
(...skipping 26 matching lines...) Expand all Loading... | |
273 /** | 289 /** |
274 * Write the next countLines scanlines into dst. | 290 * Write the next countLines scanlines into dst. |
275 * | 291 * |
276 * Not valid to call before calling startScanlineDecode(). | 292 * Not valid to call before calling startScanlineDecode(). |
277 * | 293 * |
278 * @param dst Must be non-null, and large enough to hold countLines | 294 * @param dst Must be non-null, and large enough to hold countLines |
279 * scanlines of size rowBytes. | 295 * scanlines of size rowBytes. |
280 * @param countLines Number of lines to write. | 296 * @param countLines Number of lines to write. |
281 * @param rowBytes Number of bytes per row. Must be large enough to hold | 297 * @param rowBytes Number of bytes per row. Must be large enough to hold |
282 * a scanline based on the SkImageInfo used to create this object. | 298 * a scanline based on the SkImageInfo used to create this object. |
299 * @return the number of lines successfully decoded | |
scroggo
2015/10/01 14:48:31
Does this fill if some were decoded? What does it
msarett
2015/10/01 18:14:13
Yes it does. Adding the comment.
| |
283 */ | 300 */ |
284 Result getScanlines(void* dst, int countLines, size_t rowBytes); | 301 uint32_t getScanlines(void* dst, int countLines, size_t rowBytes); |
285 | 302 |
286 /** | 303 /** |
287 * Skip count scanlines. | 304 * Skip count scanlines. |
288 * | 305 * |
289 * Not valid to call before calling startScanlineDecode(). | 306 * Not valid to call before calling startScanlineDecode(). |
290 * | 307 * |
291 * The default version just calls onGetScanlines and discards the dst. | 308 * The default version just calls onGetScanlines and discards the dst. |
292 * NOTE: If skipped lines are the only lines with alpha, this default | 309 * NOTE: If skipped lines are the only lines with alpha, this default |
293 * will make reallyHasAlpha return true, when it could have returned | 310 * will make reallyHasAlpha return true, when it could have returned |
294 * false. | 311 * false. |
312 * | |
313 * @return true if the scanlines were successfully skipped | |
314 * false on failure, possible reasons for failure include: | |
315 * An incomplete input image stream | |
316 * Invalid parameters passed to skipScanlines() | |
scroggo
2015/10/01 14:48:31
What are invalid parameters?
msarett
2015/10/01 18:14:13
Adding more detail to the comment.
| |
295 */ | 317 */ |
296 Result skipScanlines(int countLines); | 318 bool skipScanlines(int countLines); |
297 | 319 |
298 /** | 320 /** |
299 * The order in which rows are output from the scanline decoder is not the | 321 * The order in which rows are output from the scanline decoder is not the |
300 * same for all variations of all image types. This explains the possible | 322 * same for all variations of all image types. This explains the possible |
301 * output row orderings. | 323 * output row orderings. |
302 */ | 324 */ |
303 enum SkScanlineOrder { | 325 enum SkScanlineOrder { |
304 /* | 326 /* |
305 * By far the most common, this indicates that the image can be decoded | 327 * By far the most common, this indicates that the image can be decoded |
306 * reliably using the scanline decoder, and that rows will be output in | 328 * reliably using the scanline decoder, and that rows will be output in |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
363 SkScanlineOrder getScanlineOrder() const { return this->onGetScanlineOrder() ; } | 385 SkScanlineOrder getScanlineOrder() const { return this->onGetScanlineOrder() ; } |
364 | 386 |
365 /** | 387 /** |
366 * Returns the y-coordinate of the next row to be returned by the scanline | 388 * Returns the y-coordinate of the next row to be returned by the scanline |
367 * decoder. This will be overridden in the case of | 389 * decoder. This will be overridden in the case of |
368 * kOutOfOrder_SkScanlineOrder and should be unnecessary in the case of | 390 * kOutOfOrder_SkScanlineOrder and should be unnecessary in the case of |
369 * kNone_SkScanlineOrder. | 391 * kNone_SkScanlineOrder. |
370 * | 392 * |
371 * Results are undefined when not in scanline decoding mode. | 393 * Results are undefined when not in scanline decoding mode. |
372 */ | 394 */ |
373 int nextScanline() const { | 395 int nextScanline() const { return this->nextScanline(fCurrScanline); } |
374 return this->onNextScanline(); | 396 /** |
scroggo
2015/10/01 14:48:31
nit: newline between these methods
msarett
2015/10/01 18:14:13
Done.
| |
375 } | 397 * Alternate version that allows the client to specify the srcY value. |
398 * The corresponding dstY will be returned, regardless of the value of | |
399 * fCurrScanline. | |
400 */ | |
401 int nextScanline(int srcY) const; | |
scroggo
2015/10/01 14:48:31
I don't think this name is right. My first thought
msarett
2015/10/01 18:14:13
Hmmm yeah, it made more sense for these to have th
| |
376 | 402 |
377 protected: | 403 protected: |
378 SkCodec(const SkImageInfo&, SkStream*); | 404 SkCodec(const SkImageInfo&, SkStream*); |
379 | 405 |
380 virtual SkISize onGetScaledDimensions(float /* desiredScale */) const { | 406 virtual SkISize onGetScaledDimensions(float /* desiredScale */) const { |
381 // By default, scaling is not supported. | 407 // By default, scaling is not supported. |
382 return this->getInfo().dimensions(); | 408 return this->getInfo().dimensions(); |
383 } | 409 } |
384 | 410 |
385 virtual SkEncodedFormat onGetEncodedFormat() const = 0; | 411 virtual SkEncodedFormat onGetEncodedFormat() const = 0; |
386 | 412 |
413 /** | |
414 * @param rowsDecoded When the encoded image stream is incomplete, this func tion | |
415 * will return kIncompleteInput and rowsDecoded will be s et to | |
416 * the number of scanlines that were successfully decoded . | |
417 * This will allow getPixels() to fill the uninitialized memory. | |
418 */ | |
387 virtual Result onGetPixels(const SkImageInfo& info, | 419 virtual Result onGetPixels(const SkImageInfo& info, |
388 void* pixels, size_t rowBytes, const Options&, | 420 void* pixels, size_t rowBytes, const Options&, |
389 SkPMColor ctable[], int* ctableCount) = 0; | 421 SkPMColor ctable[], int* ctableCount, |
422 int* rowsDecoded) = 0; | |
390 | 423 |
391 virtual bool onGetValidSubset(SkIRect* /* desiredSubset */) const { | 424 virtual bool onGetValidSubset(SkIRect* /* desiredSubset */) const { |
392 // By default, subsets are not supported. | 425 // By default, subsets are not supported. |
393 return false; | 426 return false; |
394 } | 427 } |
395 | 428 |
396 virtual bool onReallyHasAlpha() const { return false; } | 429 virtual bool onReallyHasAlpha() const { return false; } |
397 | 430 |
398 /** | 431 /** |
399 * If the stream was previously read, attempt to rewind. | 432 * If the stream was previously read, attempt to rewind. |
(...skipping 10 matching lines...) Expand all Loading... | |
410 /** | 443 /** |
411 * Called by rewindIfNeeded, if the stream needed to be rewound. | 444 * Called by rewindIfNeeded, if the stream needed to be rewound. |
412 * | 445 * |
413 * Subclasses should do any set up needed after a rewind. | 446 * Subclasses should do any set up needed after a rewind. |
414 */ | 447 */ |
415 virtual bool onRewind() { | 448 virtual bool onRewind() { |
416 return true; | 449 return true; |
417 } | 450 } |
418 | 451 |
419 /** | 452 /** |
453 * Some subclasses will override this function, but this is a useful default for the color | |
454 * types that we support. Note that for color types that do not use the ful l 32-bits, | |
455 * we will simply take the low bits of the fill value. | |
456 * | |
457 * kN32_SkColorType: Transparent or Black | |
458 * kRGB_565_SkColorType: Black | |
459 * kGray_8_SkColorType: Black | |
460 * kIndex_8_SkColorType: First color in color table | |
461 */ | |
462 virtual uint32_t onGetFillValue(SkColorType colorType, SkAlphaType alphaType ) const { | |
463 return kOpaque_SkAlphaType == alphaType ? SK_ColorBLACK : SK_ColorTRANSP ARENT; | |
464 } | |
465 | |
466 /** | |
420 * Get method for the input stream | 467 * Get method for the input stream |
421 */ | 468 */ |
422 SkStream* stream() { | 469 SkStream* stream() { |
423 return fStream.get(); | 470 return fStream.get(); |
424 } | 471 } |
425 | 472 |
426 /** | 473 /** |
427 * The remaining functions revolve around decoding scanlines. | 474 * The remaining functions revolve around decoding scanlines. |
428 */ | 475 */ |
429 | 476 |
430 /** | 477 /** |
431 * Most images types will be kTopDown and will not need to override this fu nction. | 478 * Most images types will be kTopDown and will not need to override this fu nction. |
432 */ | 479 */ |
433 virtual SkScanlineOrder onGetScanlineOrder() const { return kTopDown_SkScanl ineOrder; } | 480 virtual SkScanlineOrder onGetScanlineOrder() const { return kTopDown_SkScanl ineOrder; } |
434 | 481 |
435 /** | 482 /** |
436 * Most images will be kTopDown and will not need to override this function . | |
437 */ | |
438 virtual int onNextScanline() const { return fCurrScanline; } | |
439 | |
440 /** | |
441 * Update the next scanline. Used by interlaced png. | 483 * Update the next scanline. Used by interlaced png. |
442 */ | 484 */ |
443 void updateNextScanline(int newY) { fCurrScanline = newY; } | 485 void updateNextScanline(int newY) { fCurrScanline = newY; } |
444 | 486 |
445 const SkImageInfo& dstInfo() const { return fDstInfo; } | 487 const SkImageInfo& dstInfo() const { return fDstInfo; } |
446 | 488 |
447 const SkCodec::Options& options() const { return fOptions; } | 489 const SkCodec::Options& options() const { return fOptions; } |
448 | 490 |
449 private: | 491 private: |
450 const SkImageInfo fSrcInfo; | 492 const SkImageInfo fSrcInfo; |
451 SkAutoTDelete<SkStream> fStream; | 493 SkAutoTDelete<SkStream> fStream; |
452 bool fNeedsRewind; | 494 bool fNeedsRewind; |
453 // These fields are only meaningful during scanline decodes. | 495 // These fields are only meaningful during scanline decodes. |
454 SkImageInfo fDstInfo; | 496 SkImageInfo fDstInfo; |
455 SkCodec::Options fOptions; | 497 SkCodec::Options fOptions; |
456 int fCurrScanline; | 498 int fCurrScanline; |
457 | 499 |
458 // Methods for scanline decoding. | 500 // Methods for scanline decoding. |
459 virtual SkCodec::Result onStartScanlineDecode(const SkImageInfo& dstInfo, | 501 virtual SkCodec::Result onStartScanlineDecode(const SkImageInfo& dstInfo, |
460 const SkCodec::Options& options, SkPMColor ctable[], int* ctableCoun t) { | 502 const SkCodec::Options& options, SkPMColor ctable[], int* ctableCoun t) { |
461 return kUnimplemented; | 503 return kUnimplemented; |
462 } | 504 } |
463 | 505 |
464 // Naive default version just calls onGetScanlines on temp memory. | 506 // Naive default version just calls onGetScanlines on temp memory. |
465 virtual SkCodec::Result onSkipScanlines(int countLines) { | 507 virtual bool onSkipScanlines(int countLines) { |
508 // FIXME (msarett): We should not reallocate this memory on every call. | |
scroggo
2015/10/01 14:48:31
Is the real fix to always override onSkipScanlines
msarett
2015/10/01 18:14:13
Yes I agree that the solution is to always overrid
| |
466 SkAutoMalloc storage(fDstInfo.minRowBytes()); | 509 SkAutoMalloc storage(fDstInfo.minRowBytes()); |
510 | |
467 // Note that we pass 0 to rowBytes so we continue to use the same memory . | 511 // Note that we pass 0 to rowBytes so we continue to use the same memory . |
468 // Also note that while getScanlines checks that rowBytes is big enough, | 512 // Also note that while getScanlines checks that rowBytes is big enough, |
469 // onGetScanlines bypasses that check. | 513 // onGetScanlines bypasses that check. |
470 // Calling the virtual method also means we do not double count | 514 // Calling the virtual method also means we do not double count |
471 // countLines. | 515 // countLines. |
472 return this->onGetScanlines(storage.get(), countLines, 0); | 516 return (uint32_t) countLines == this->onGetScanlines(storage.get(), coun tLines, 0); |
473 } | 517 } |
474 | 518 |
475 virtual SkCodec::Result onGetScanlines(void* dst, int countLines, | 519 virtual uint32_t onGetScanlines(void* dst, int countLines, size_t rowBytes) { return 0; } |
476 size_t rowBytes) { | 520 |
477 return kUnimplemented; | 521 /** |
478 } | 522 * On an incomplete decode, getPixels() and getScanlines() will call this fu nction |
523 * to fill any uinitialized memory. | |
524 * | |
525 * @param info Destination image info | |
526 * @param dst Destination pixel memory | |
scroggo
2015/10/01 14:48:31
I think this is different depending on the scanlin
msarett
2015/10/01 18:14:13
In the redesign, this is always a pointer to the s
| |
527 * @param rowBytes Stride length in destination pixel memory | |
528 * @param zeroInit Indicates if memory is zero initialized | |
529 * @param linesRequested Number of lines that the client requested | |
530 * @param linesDecoded Number of lines that were successfully decoded | |
531 */ | |
532 void fillIncompleteImage(const SkImageInfo& info, void* dst, size_t rowBytes , | |
533 ZeroInitialized zeroInit, int linesRequested, int linesDecoded); | |
479 | 534 |
480 }; | 535 }; |
481 #endif // SkCodec_DEFINED | 536 #endif // SkCodec_DEFINED |
OLD | NEW |