| 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 #include "DMSrcSink.h" | 8 #include "DMSrcSink.h" |
| 9 #include "Resources.h" | 9 #include "Resources.h" |
| 10 #include "SkAndroidCodec.h" | 10 #include "SkAndroidCodec.h" |
| (...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 439 default: | 439 default: |
| 440 // Everything else is considered a failure. | 440 // Everything else is considered a failure. |
| 441 return SkStringPrintf("Couldn't getPixels %s.", fPath.c_str(
)); | 441 return SkStringPrintf("Couldn't getPixels %s.", fPath.c_str(
)); |
| 442 } | 442 } |
| 443 | 443 |
| 444 draw_to_canvas(canvas, bitmapInfo, pixels.get(), rowBytes, colorPtr,
colorCount, | 444 draw_to_canvas(canvas, bitmapInfo, pixels.get(), rowBytes, colorPtr,
colorCount, |
| 445 fDstColorType); | 445 fDstColorType); |
| 446 break; | 446 break; |
| 447 } | 447 } |
| 448 case kScanline_Mode: { | 448 case kScanline_Mode: { |
| 449 if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo, NULL
, colorPtr, | |
| 450 &colorCount)) { | |
| 451 return "Could not start scanline decoder"; | |
| 452 } | |
| 453 | |
| 454 void* dst = pixels.get(); | 449 void* dst = pixels.get(); |
| 455 uint32_t height = decodeInfo.height(); | 450 uint32_t height = decodeInfo.height(); |
| 456 switch (codec->getScanlineOrder()) { | 451 const bool png = fPath.endsWith("png"); |
| 457 case SkCodec::kTopDown_SkScanlineOrder: | 452 const bool ico = fPath.endsWith("ico"); |
| 458 case SkCodec::kBottomUp_SkScanlineOrder: | 453 bool useOldScanlineMethod = !png && !ico; |
| 459 case SkCodec::kNone_SkScanlineOrder: | 454 if (png || ico) { |
| 460 // We do not need to check the return value. On an incomple
te | 455 if (SkCodec::kSuccess == codec->startIncrementalDecode(decodeInf
o, dst, |
| 461 // image, memory will be filled with a default value. | 456 rowBytes, nullptr, colorPtr, &colorCount)) { |
| 462 codec->getScanlines(dst, height, rowBytes); | 457 int rowsDecoded; |
| 463 break; | 458 if (SkCodec::kIncompleteInput == codec->incrementalDecode(&r
owsDecoded)) { |
| 464 case SkCodec::kOutOfOrder_SkScanlineOrder: { | 459 codec->fillIncompleteImage(decodeInfo, dst, rowBytes, |
| 465 for (int y = 0; y < decodeInfo.height(); y++) { | 460 SkCodec::kNo_ZeroInitialized,
height, |
| 466 int dstY = codec->outputScanline(y); | 461 rowsDecoded); |
| 467 void* dstPtr = SkTAddOffset<void>(dst, rowBytes * dstY); | |
| 468 // We complete the loop, even if this call begins to fai
l | |
| 469 // due to an incomplete image. This ensures any uniniti
alized | |
| 470 // memory will be filled with the proper value. | |
| 471 codec->getScanlines(dstPtr, 1, rowBytes); | |
| 472 } | 462 } |
| 473 break; | 463 } else { |
| 464 if (png) { |
| 465 // Error: PNG should support incremental decode. |
| 466 return "Could not start incremental decode"; |
| 467 } |
| 468 // Otherwise, this is an ICO. Since incremental failed, it m
ust contain a BMP, |
| 469 // which should work via startScanlineDecode |
| 470 useOldScanlineMethod = true; |
| 474 } | 471 } |
| 475 } | 472 } |
| 476 | 473 |
| 474 if (useOldScanlineMethod) { |
| 475 if (SkCodec::kSuccess != codec->startScanlineDecode(decodeInfo,
NULL, colorPtr, |
| 476 &colorCount)
) { |
| 477 return "Could not start scanline decoder"; |
| 478 } |
| 479 |
| 480 switch (codec->getScanlineOrder()) { |
| 481 case SkCodec::kTopDown_SkScanlineOrder: |
| 482 case SkCodec::kBottomUp_SkScanlineOrder: |
| 483 // We do not need to check the return value. On an inco
mplete |
| 484 // image, memory will be filled with a default value. |
| 485 codec->getScanlines(dst, height, rowBytes); |
| 486 break; |
| 487 case SkCodec::kOutOfOrder_SkScanlineOrder: { |
| 488 for (int y = 0; y < decodeInfo.height(); y++) { |
| 489 int dstY = codec->outputScanline(y); |
| 490 void* dstPtr = SkTAddOffset<void>(dst, rowBytes * ds
tY); |
| 491 // We complete the loop, even if this call begins to
fail |
| 492 // due to an incomplete image. This ensures any uni
nitialized |
| 493 // memory will be filled with the proper value. |
| 494 codec->getScanlines(dstPtr, 1, rowBytes); |
| 495 } |
| 496 break; |
| 497 } |
| 498 } |
| 499 } |
| 500 |
| 477 draw_to_canvas(canvas, bitmapInfo, dst, rowBytes, colorPtr, colorCou
nt, fDstColorType); | 501 draw_to_canvas(canvas, bitmapInfo, dst, rowBytes, colorPtr, colorCou
nt, fDstColorType); |
| 478 break; | 502 break; |
| 479 } | 503 } |
| 480 case kStripe_Mode: { | 504 case kStripe_Mode: { |
| 481 const int height = decodeInfo.height(); | 505 const int height = decodeInfo.height(); |
| 482 // This value is chosen arbitrarily. We exercise more cases by choo
sing a value that | 506 // This value is chosen arbitrarily. We exercise more cases by choo
sing a value that |
| 483 // does not align with image blocks. | 507 // does not align with image blocks. |
| 484 const int stripeHeight = 37; | 508 const int stripeHeight = 37; |
| 485 const int numStripes = (height + stripeHeight - 1) / stripeHeight; | 509 const int numStripes = (height + stripeHeight - 1) / stripeHeight; |
| 486 void* dst = pixels.get(); | 510 void* dst = pixels.get(); |
| (...skipping 1172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1659 Error err = src.draw(&rec); | 1683 Error err = src.draw(&rec); |
| 1660 if (!err.isEmpty()) { | 1684 if (!err.isEmpty()) { |
| 1661 return err; | 1685 return err; |
| 1662 } | 1686 } |
| 1663 dl->draw(canvas); | 1687 dl->draw(canvas); |
| 1664 return check_against_reference(bitmap, src, fSink); | 1688 return check_against_reference(bitmap, src, fSink); |
| 1665 }); | 1689 }); |
| 1666 } | 1690 } |
| 1667 | 1691 |
| 1668 } // namespace DM | 1692 } // namespace DM |
| OLD | NEW |