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 "SkCodec.h" | 8 #include "SkCodec.h" |
9 #include "SkMSAN.h" | 9 #include "SkMSAN.h" |
10 #include "SkJpegCodec.h" | 10 #include "SkJpegCodec.h" |
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 // Try the next scale | 471 // Try the next scale |
472 num -= 1; | 472 num -= 1; |
473 calc_output_dimensions(&dinfo, num, denom); | 473 calc_output_dimensions(&dinfo, num, denom); |
474 } | 474 } |
475 | 475 |
476 fDecoderMgr->dinfo()->scale_num = num; | 476 fDecoderMgr->dinfo()->scale_num = num; |
477 fDecoderMgr->dinfo()->scale_denom = denom; | 477 fDecoderMgr->dinfo()->scale_denom = denom; |
478 return true; | 478 return true; |
479 } | 479 } |
480 | 480 |
481 static bool needs_color_xform(const SkImageInfo& dstInfo, const SkImageInfo& src
Info) { | |
482 return (kRGBA_F16_SkColorType == dstInfo.colorType()) || | |
483 (dstInfo.colorSpace() && !SkColorSpace::Equals(srcInfo.colorSpace(), | |
484 dstInfo.colorSpace()))
; | |
485 } | |
486 | |
487 int SkJpegCodec::readRows(const SkImageInfo& dstInfo, void* dst, size_t rowBytes
, int count) { | 481 int SkJpegCodec::readRows(const SkImageInfo& dstInfo, void* dst, size_t rowBytes
, int count) { |
488 // Set the jump location for libjpeg-turbo errors | 482 // Set the jump location for libjpeg-turbo errors |
489 if (setjmp(fDecoderMgr->getJmpBuf())) { | 483 if (setjmp(fDecoderMgr->getJmpBuf())) { |
490 return 0; | 484 return 0; |
491 } | 485 } |
492 | 486 |
493 // When fSwizzleSrcRow is non-null, it means that we need to swizzle. In th
is case, | 487 // When fSwizzleSrcRow is non-null, it means that we need to swizzle. In th
is case, |
494 // we will always decode into fSwizzlerSrcRow before swizzling into the next
buffer. | 488 // we will always decode into fSwizzlerSrcRow before swizzling into the next
buffer. |
495 // We can never swizzle "in place" because the swizzler may perform sampling
and/or | 489 // We can never swizzle "in place" because the swizzler may perform sampling
and/or |
496 // subsetting. | 490 // subsetting. |
(...skipping 25 matching lines...) Expand all Loading... |
522 sk_msan_mark_initialized(decodeDst, decodeDst + srcRowBytes, "skbug.com/
4550"); | 516 sk_msan_mark_initialized(decodeDst, decodeDst + srcRowBytes, "skbug.com/
4550"); |
523 if (0 == lines) { | 517 if (0 == lines) { |
524 return y; | 518 return y; |
525 } | 519 } |
526 | 520 |
527 if (fSwizzler) { | 521 if (fSwizzler) { |
528 fSwizzler->swizzle(swizzleDst, decodeDst); | 522 fSwizzler->swizzle(swizzleDst, decodeDst); |
529 } | 523 } |
530 | 524 |
531 if (fColorXform) { | 525 if (fColorXform) { |
532 int width = dstInfo.width(); | 526 fColorXform->apply(dst, swizzleDst, dstInfo.width(), dstInfo.colorTy
pe(), |
533 switch (dstInfo.colorType()) { | 527 kOpaque_SkAlphaType); |
534 case kRGBA_8888_SkColorType: | |
535 fColorXform->applyToRGBA((uint32_t*) dst, swizzleDst, width)
; | |
536 break; | |
537 case kBGRA_8888_SkColorType: | |
538 fColorXform->applyToBGRA((uint32_t*) dst, swizzleDst, width)
; | |
539 break; | |
540 case kRGBA_F16_SkColorType: | |
541 fColorXform->applyToF16((uint64_t*) dst, swizzleDst, width); | |
542 break; | |
543 default: | |
544 SkASSERT(false); | |
545 break; | |
546 } | |
547 | |
548 dst = SkTAddOffset<void>(dst, rowBytes); | 528 dst = SkTAddOffset<void>(dst, rowBytes); |
549 } | 529 } |
550 | 530 |
551 decodeDst = SkTAddOffset<JSAMPLE>(decodeDst, decodeDstRowBytes); | 531 decodeDst = SkTAddOffset<JSAMPLE>(decodeDst, decodeDstRowBytes); |
552 swizzleDst = SkTAddOffset<uint32_t>(swizzleDst, swizzleDstRowBytes); | 532 swizzleDst = SkTAddOffset<uint32_t>(swizzleDst, swizzleDstRowBytes); |
553 } | 533 } |
554 | 534 |
555 return count; | 535 return count; |
556 } | 536 } |
557 | 537 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
612 void SkJpegCodec::allocateStorage(const SkImageInfo& dstInfo) { | 592 void SkJpegCodec::allocateStorage(const SkImageInfo& dstInfo) { |
613 size_t swizzleBytes = 0; | 593 size_t swizzleBytes = 0; |
614 if (fSwizzler) { | 594 if (fSwizzler) { |
615 swizzleBytes = get_row_bytes(fDecoderMgr->dinfo()); | 595 swizzleBytes = get_row_bytes(fDecoderMgr->dinfo()); |
616 SkASSERT(!fColorXform || SkIsAlign4(swizzleBytes)); | 596 SkASSERT(!fColorXform || SkIsAlign4(swizzleBytes)); |
617 } | 597 } |
618 | 598 |
619 size_t xformBytes = 0; | 599 size_t xformBytes = 0; |
620 if (kRGBA_F16_SkColorType == dstInfo.colorType()) { | 600 if (kRGBA_F16_SkColorType == dstInfo.colorType()) { |
621 SkASSERT(fColorXform); | 601 SkASSERT(fColorXform); |
622 xformBytes = dstInfo.width() * sizeof(SkColorSpaceXform::RGBA32); | 602 xformBytes = dstInfo.width() * sizeof(uint32_t); |
623 } | 603 } |
624 | 604 |
625 size_t totalBytes = swizzleBytes + xformBytes; | 605 size_t totalBytes = swizzleBytes + xformBytes; |
626 if (totalBytes > 0) { | 606 if (totalBytes > 0) { |
627 fStorage.reset(totalBytes); | 607 fStorage.reset(totalBytes); |
628 fSwizzleSrcRow = (swizzleBytes > 0) ? fStorage.get() : nullptr; | 608 fSwizzleSrcRow = (swizzleBytes > 0) ? fStorage.get() : nullptr; |
629 fColorXformSrcRow = (xformBytes > 0) ? | 609 fColorXformSrcRow = (xformBytes > 0) ? |
630 SkTAddOffset<uint32_t>(fStorage.get(), swizzleBytes) : nullptr; | 610 SkTAddOffset<uint32_t>(fStorage.get(), swizzleBytes) : nullptr; |
631 } | 611 } |
632 } | 612 } |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
997 | 977 |
998 JDIMENSION linesRead = jpeg_read_raw_data(dinfo, yuv, numRowsPerBlock); | 978 JDIMENSION linesRead = jpeg_read_raw_data(dinfo, yuv, numRowsPerBlock); |
999 if (linesRead < remainingRows) { | 979 if (linesRead < remainingRows) { |
1000 // FIXME: Handle incomplete YUV decodes without signalling an error. | 980 // FIXME: Handle incomplete YUV decodes without signalling an error. |
1001 return kInvalidInput; | 981 return kInvalidInput; |
1002 } | 982 } |
1003 } | 983 } |
1004 | 984 |
1005 return kSuccess; | 985 return kSuccess; |
1006 } | 986 } |
OLD | NEW |