| 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 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 488 // 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. |
| 489 // 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 |
| 490 // subsetting. | 490 // subsetting. |
| 491 // When fColorXformSrcRow is non-null, it means that we need to color xform
and that | 491 // When fColorXformSrcRow is non-null, it means that we need to color xform
and that |
| 492 // we cannot color xform "in place" (many times we can, but not when the dst
is F16). | 492 // we cannot color xform "in place" (many times we can, but not when the dst
is F16). |
| 493 // In this case, we will color xform from fColorXformSrc into the dst. | 493 // In this case, we will color xform from fColorXformSrc into the dst. |
| 494 JSAMPLE* decodeDst = (JSAMPLE*) dst; | 494 JSAMPLE* decodeDst = (JSAMPLE*) dst; |
| 495 uint32_t* swizzleDst = (uint32_t*) dst; | 495 uint32_t* swizzleDst = (uint32_t*) dst; |
| 496 size_t decodeDstRowBytes = rowBytes; | 496 size_t decodeDstRowBytes = rowBytes; |
| 497 size_t swizzleDstRowBytes = rowBytes; | 497 size_t swizzleDstRowBytes = rowBytes; |
| 498 int dstWidth = dstInfo.width(); |
| 498 if (fSwizzleSrcRow && fColorXformSrcRow) { | 499 if (fSwizzleSrcRow && fColorXformSrcRow) { |
| 499 decodeDst = (JSAMPLE*) fSwizzleSrcRow; | 500 decodeDst = (JSAMPLE*) fSwizzleSrcRow; |
| 500 swizzleDst = fColorXformSrcRow; | 501 swizzleDst = fColorXformSrcRow; |
| 501 decodeDstRowBytes = 0; | 502 decodeDstRowBytes = 0; |
| 502 swizzleDstRowBytes = 0; | 503 swizzleDstRowBytes = 0; |
| 504 dstWidth = fSwizzler->swizzleWidth(); |
| 503 } else if (fColorXformSrcRow) { | 505 } else if (fColorXformSrcRow) { |
| 504 decodeDst = (JSAMPLE*) fColorXformSrcRow; | 506 decodeDst = (JSAMPLE*) fColorXformSrcRow; |
| 505 swizzleDst = fColorXformSrcRow; | 507 swizzleDst = fColorXformSrcRow; |
| 506 decodeDstRowBytes = 0; | 508 decodeDstRowBytes = 0; |
| 507 swizzleDstRowBytes = 0; | 509 swizzleDstRowBytes = 0; |
| 508 } else if (fSwizzleSrcRow) { | 510 } else if (fSwizzleSrcRow) { |
| 509 decodeDst = (JSAMPLE*) fSwizzleSrcRow; | 511 decodeDst = (JSAMPLE*) fSwizzleSrcRow; |
| 510 decodeDstRowBytes = 0; | 512 decodeDstRowBytes = 0; |
| 513 dstWidth = fSwizzler->swizzleWidth(); |
| 511 } | 514 } |
| 512 | 515 |
| 513 for (int y = 0; y < count; y++) { | 516 for (int y = 0; y < count; y++) { |
| 514 uint32_t lines = jpeg_read_scanlines(fDecoderMgr->dinfo(), &decodeDst, 1
); | 517 uint32_t lines = jpeg_read_scanlines(fDecoderMgr->dinfo(), &decodeDst, 1
); |
| 515 size_t srcRowBytes = get_row_bytes(fDecoderMgr->dinfo()); | 518 size_t srcRowBytes = get_row_bytes(fDecoderMgr->dinfo()); |
| 516 sk_msan_mark_initialized(decodeDst, decodeDst + srcRowBytes, "skbug.com/
4550"); | 519 sk_msan_mark_initialized(decodeDst, decodeDst + srcRowBytes, "skbug.com/
4550"); |
| 517 if (0 == lines) { | 520 if (0 == lines) { |
| 518 return y; | 521 return y; |
| 519 } | 522 } |
| 520 | 523 |
| 521 if (fSwizzler) { | 524 if (fSwizzler) { |
| 522 fSwizzler->swizzle(swizzleDst, decodeDst); | 525 fSwizzler->swizzle(swizzleDst, decodeDst); |
| 523 } | 526 } |
| 524 | 527 |
| 525 if (fColorXform) { | 528 if (fColorXform) { |
| 526 fColorXform->apply(dst, swizzleDst, dstInfo.width(), dstInfo.colorTy
pe(), | 529 fColorXform->apply(dst, swizzleDst, dstWidth, dstInfo.colorType(), k
Opaque_SkAlphaType); |
| 527 kOpaque_SkAlphaType); | |
| 528 dst = SkTAddOffset<void>(dst, rowBytes); | 530 dst = SkTAddOffset<void>(dst, rowBytes); |
| 529 } | 531 } |
| 530 | 532 |
| 531 decodeDst = SkTAddOffset<JSAMPLE>(decodeDst, decodeDstRowBytes); | 533 decodeDst = SkTAddOffset<JSAMPLE>(decodeDst, decodeDstRowBytes); |
| 532 swizzleDst = SkTAddOffset<uint32_t>(swizzleDst, swizzleDstRowBytes); | 534 swizzleDst = SkTAddOffset<uint32_t>(swizzleDst, swizzleDstRowBytes); |
| 533 } | 535 } |
| 534 | 536 |
| 535 return count; | 537 return count; |
| 536 } | 538 } |
| 537 | 539 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 583 int rows = this->readRows(dstInfo, dst, dstRowBytes, dstInfo.height()); | 585 int rows = this->readRows(dstInfo, dst, dstRowBytes, dstInfo.height()); |
| 584 if (rows < dstInfo.height()) { | 586 if (rows < dstInfo.height()) { |
| 585 *rowsDecoded = rows; | 587 *rowsDecoded = rows; |
| 586 return fDecoderMgr->returnFailure("Incomplete image data", kIncompleteIn
put); | 588 return fDecoderMgr->returnFailure("Incomplete image data", kIncompleteIn
put); |
| 587 } | 589 } |
| 588 | 590 |
| 589 return kSuccess; | 591 return kSuccess; |
| 590 } | 592 } |
| 591 | 593 |
| 592 void SkJpegCodec::allocateStorage(const SkImageInfo& dstInfo) { | 594 void SkJpegCodec::allocateStorage(const SkImageInfo& dstInfo) { |
| 595 int dstWidth = dstInfo.width(); |
| 596 |
| 593 size_t swizzleBytes = 0; | 597 size_t swizzleBytes = 0; |
| 594 if (fSwizzler) { | 598 if (fSwizzler) { |
| 595 swizzleBytes = get_row_bytes(fDecoderMgr->dinfo()); | 599 swizzleBytes = get_row_bytes(fDecoderMgr->dinfo()); |
| 600 dstWidth = fSwizzler->swizzleWidth(); |
| 596 SkASSERT(!fColorXform || SkIsAlign4(swizzleBytes)); | 601 SkASSERT(!fColorXform || SkIsAlign4(swizzleBytes)); |
| 597 } | 602 } |
| 598 | 603 |
| 599 size_t xformBytes = 0; | 604 size_t xformBytes = 0; |
| 600 if (kRGBA_F16_SkColorType == dstInfo.colorType()) { | 605 if (kRGBA_F16_SkColorType == dstInfo.colorType()) { |
| 601 SkASSERT(fColorXform); | 606 SkASSERT(fColorXform); |
| 602 xformBytes = dstInfo.width() * sizeof(uint32_t); | 607 xformBytes = dstWidth * sizeof(uint32_t); |
| 603 } | 608 } |
| 604 | 609 |
| 605 size_t totalBytes = swizzleBytes + xformBytes; | 610 size_t totalBytes = swizzleBytes + xformBytes; |
| 606 if (totalBytes > 0) { | 611 if (totalBytes > 0) { |
| 607 fStorage.reset(totalBytes); | 612 fStorage.reset(totalBytes); |
| 608 fSwizzleSrcRow = (swizzleBytes > 0) ? fStorage.get() : nullptr; | 613 fSwizzleSrcRow = (swizzleBytes > 0) ? fStorage.get() : nullptr; |
| 609 fColorXformSrcRow = (xformBytes > 0) ? | 614 fColorXformSrcRow = (xformBytes > 0) ? |
| 610 SkTAddOffset<uint32_t>(fStorage.get(), swizzleBytes) : nullptr; | 615 SkTAddOffset<uint32_t>(fStorage.get(), swizzleBytes) : nullptr; |
| 611 } | 616 } |
| 612 } | 617 } |
| (...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 977 | 982 |
| 978 JDIMENSION linesRead = jpeg_read_raw_data(dinfo, yuv, numRowsPerBlock); | 983 JDIMENSION linesRead = jpeg_read_raw_data(dinfo, yuv, numRowsPerBlock); |
| 979 if (linesRead < remainingRows) { | 984 if (linesRead < remainingRows) { |
| 980 // FIXME: Handle incomplete YUV decodes without signalling an error. | 985 // FIXME: Handle incomplete YUV decodes without signalling an error. |
| 981 return kInvalidInput; | 986 return kInvalidInput; |
| 982 } | 987 } |
| 983 } | 988 } |
| 984 | 989 |
| 985 return kSuccess; | 990 return kSuccess; |
| 986 } | 991 } |
| OLD | NEW |