| 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 "SkCodecPriv.h" | 8 #include "SkCodecPriv.h" |
| 9 #include "SkColorPriv.h" | 9 #include "SkColorPriv.h" |
| 10 #include "SkScaledCodec.h" | 10 #include "SkScaledCodec.h" |
| (...skipping 498 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 src += deltaSrc; | 509 src += deltaSrc; |
| 510 alphaMask &= alpha; | 510 alphaMask &= alpha; |
| 511 } | 511 } |
| 512 return alphaMask != 0xFF; | 512 return alphaMask != 0xFF; |
| 513 } | 513 } |
| 514 */ | 514 */ |
| 515 | 515 |
| 516 SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, | 516 SkSwizzler* SkSwizzler::CreateSwizzler(SkSwizzler::SrcConfig sc, |
| 517 const SkPMColor* ctable, | 517 const SkPMColor* ctable, |
| 518 const SkImageInfo& dstInfo, | 518 const SkImageInfo& dstInfo, |
| 519 SkCodec::ZeroInitialized zeroInit, | 519 SkCodec::ZeroInitialized zeroInit) { |
| 520 const SkImageInfo& srcInfo) { | |
| 521 if (dstInfo.colorType() == kUnknown_SkColorType || kUnknown == sc) { | 520 if (dstInfo.colorType() == kUnknown_SkColorType || kUnknown == sc) { |
| 522 return nullptr; | 521 return nullptr; |
| 523 } | 522 } |
| 524 if ((kIndex == sc || kIndex4 == sc || kIndex2 == sc || kIndex1 == sc) | 523 if ((kIndex == sc || kIndex4 == sc || kIndex2 == sc || kIndex1 == sc) |
| 525 && nullptr == ctable) { | 524 && nullptr == ctable) { |
| 526 return nullptr; | 525 return nullptr; |
| 527 } | 526 } |
| 528 RowProc proc = nullptr; | 527 RowProc proc = nullptr; |
| 529 | 528 |
| 530 switch (sc) { | 529 switch (sc) { |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 681 default: | 680 default: |
| 682 break; | 681 break; |
| 683 } | 682 } |
| 684 if (nullptr == proc) { | 683 if (nullptr == proc) { |
| 685 return nullptr; | 684 return nullptr; |
| 686 } | 685 } |
| 687 | 686 |
| 688 // Store deltaSrc in bytes if it is an even multiple, otherwise use bits | 687 // Store deltaSrc in bytes if it is an even multiple, otherwise use bits |
| 689 int deltaSrc = SkIsAlign8(BitsPerPixel(sc)) ? BytesPerPixel(sc) : BitsPerPix
el(sc); | 688 int deltaSrc = SkIsAlign8(BitsPerPixel(sc)) ? BytesPerPixel(sc) : BitsPerPix
el(sc); |
| 690 | 689 |
| 691 // get sampleX based on srcInfo and dstInfo dimensions | 690 return new SkSwizzler(proc, ctable, deltaSrc, dstInfo.width()); |
| 692 int sampleX; | |
| 693 SkScaledCodec::ComputeSampleSize(dstInfo, srcInfo, &sampleX, nullptr); | |
| 694 | |
| 695 return new SkSwizzler(proc, ctable, deltaSrc, dstInfo, sampleX); | |
| 696 } | 691 } |
| 697 | 692 |
| 698 SkSwizzler::SkSwizzler(RowProc proc, const SkPMColor* ctable, | 693 SkSwizzler::SkSwizzler(RowProc proc, const SkPMColor* ctable, |
| 699 int deltaSrc, const SkImageInfo& info, int sampleX) | 694 int deltaSrc, int srcWidth) |
| 700 : fRowProc(proc) | 695 : fRowProc(proc) |
| 701 , fColorTable(ctable) | 696 , fColorTable(ctable) |
| 702 , fDeltaSrc(deltaSrc) | 697 , fDeltaSrc(deltaSrc) |
| 703 , fDstInfo(info) | 698 , fSrcWidth(srcWidth) |
| 704 , fSampleX(sampleX) | 699 , fDstWidth(srcWidth) |
| 705 , fX0(get_start_coord(sampleX)) | 700 , fSampleX(1) |
| 706 { | 701 , fX0(0) |
| 702 {} |
| 703 |
| 704 int SkSwizzler::onSetSampleX(int sampleX) { |
| 705 SkASSERT(sampleX > 0); // Surely there is an upper limit? Should there be |
| 706 // way to report failure? |
| 707 fSampleX = sampleX; |
| 708 fX0 = get_start_coord(sampleX); |
| 709 fDstWidth = get_scaled_dimension(fSrcWidth, sampleX); |
| 710 |
| 707 // check that fX0 is less than original width | 711 // check that fX0 is less than original width |
| 708 SkASSERT(fX0 >= 0 && fX0 < fDstInfo.width() * fSampleX); | 712 SkASSERT(fX0 >= 0 && fX0 < fSrcWidth); |
| 713 return fDstWidth; |
| 709 } | 714 } |
| 710 | 715 |
| 711 SkSwizzler::ResultAlpha SkSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRIC
T src) { | 716 SkSwizzler::ResultAlpha SkSwizzler::swizzle(void* dst, const uint8_t* SK_RESTRIC
T src) { |
| 712 SkASSERT(nullptr != dst && nullptr != src); | 717 SkASSERT(nullptr != dst && nullptr != src); |
| 713 return fRowProc(dst, src, fDstInfo.width(), fDeltaSrc, fSampleX * fDeltaSrc, | 718 return fRowProc(dst, src, fDstWidth, fDeltaSrc, fSampleX * fDeltaSrc, |
| 714 fX0 * fDeltaSrc, fColorTable); | 719 fX0 * fDeltaSrc, fColorTable); |
| 715 } | 720 } |
| 716 | 721 |
| 717 void SkSwizzler::Fill(void* dstStartRow, const SkImageInfo& dstInfo, size_t dstR
owBytes, | 722 void SkSwizzler::Fill(void* dstStartRow, const SkImageInfo& dstInfo, size_t dstR
owBytes, |
| 718 uint32_t numRows, uint32_t colorOrIndex, const SkPMColor* colorTable, | 723 uint32_t numRows, uint32_t colorOrIndex, const SkPMColor* colorTable, |
| 719 SkCodec::ZeroInitialized zeroInit) { | 724 SkCodec::ZeroInitialized zeroInit) { |
| 720 SkASSERT(dstStartRow != nullptr); | 725 SkASSERT(dstStartRow != nullptr); |
| 721 SkASSERT(numRows <= (uint32_t) dstInfo.height()); | 726 SkASSERT(numRows <= (uint32_t) dstInfo.height()); |
| 722 | 727 |
| 723 // Calculate bytes to fill. We use getSafeSize since the last row may not b
e padded. | 728 // Calculate bytes to fill. We use getSafeSize since the last row may not b
e padded. |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 784 } | 789 } |
| 785 | 790 |
| 786 memset(dstStartRow, (uint8_t) colorOrIndex, bytesToFill); | 791 memset(dstStartRow, (uint8_t) colorOrIndex, bytesToFill); |
| 787 break; | 792 break; |
| 788 default: | 793 default: |
| 789 SkCodecPrintf("Error: Unsupported dst color type for fill(). Doing
nothing.\n"); | 794 SkCodecPrintf("Error: Unsupported dst color type for fill(). Doing
nothing.\n"); |
| 790 SkASSERT(false); | 795 SkASSERT(false); |
| 791 break; | 796 break; |
| 792 } | 797 } |
| 793 } | 798 } |
| OLD | NEW |