| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 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 SkLinearBitmapPipeline_sampler_DEFINED | 8 #ifndef SkLinearBitmapPipeline_sampler_DEFINED |
| 9 #define SkLinearBitmapPipeline_sampler_DEFINED | 9 #define SkLinearBitmapPipeline_sampler_DEFINED |
| 10 | 10 |
| 11 #include <tuple> |
| 12 |
| 11 #include "SkFixed.h" | 13 #include "SkFixed.h" |
| 12 #include "SkHalf.h" | 14 #include "SkHalf.h" |
| 13 #include "SkLinearBitmapPipeline_core.h" | 15 #include "SkLinearBitmapPipeline_core.h" |
| 14 #include <array> | 16 #include "SkPM4fPriv.h" |
| 15 #include <tuple> | |
| 16 | 17 |
| 17 namespace { | 18 namespace { |
| 18 // Explaination of the math: | 19 // Explaination of the math: |
| 19 // 1 - x x | 20 // 1 - x x |
| 20 // +--------+--------+ | 21 // +--------+--------+ |
| 21 // | | | | 22 // | | | |
| 22 // 1 - y | px00 | px10 | | 23 // 1 - y | px00 | px10 | |
| 23 // | | | | 24 // | | | |
| 24 // +--------+--------+ | 25 // +--------+--------+ |
| 25 // | | | | 26 // | | | |
| (...skipping 15 matching lines...) Expand all Loading... |
| 41 Sk4s fxs = xs - xs.floor(); | 42 Sk4s fxs = xs - xs.floor(); |
| 42 Sk4s fys = ys - ys.floor(); | 43 Sk4s fys = ys - ys.floor(); |
| 43 Sk4s fxys{fxs * fys}; | 44 Sk4s fxys{fxs * fys}; |
| 44 Sk4f sum = px11 * fxys; | 45 Sk4f sum = px11 * fxys; |
| 45 sum = sum + px01 * (fys - fxys); | 46 sum = sum + px01 * (fys - fxys); |
| 46 sum = sum + px10 * (fxs - fxys); | 47 sum = sum + px10 * (fxs - fxys); |
| 47 sum = sum + px00 * (Sk4f{1.0f} - fxs - fys + fxys); | 48 sum = sum + px00 * (Sk4f{1.0f} - fxs - fys + fxys); |
| 48 return sum; | 49 return sum; |
| 49 } | 50 } |
| 50 | 51 |
| 51 // The GeneralSampler class | |
| 52 template<typename SourceStrategy, typename Next> | 52 template<typename SourceStrategy, typename Next> |
| 53 class GeneralSampler { | 53 class GeneralSampler { |
| 54 public: | 54 public: |
| 55 template<typename... Args> | 55 template<typename... Args> |
| 56 GeneralSampler(SkLinearBitmapPipeline::BlendProcessorInterface* next, Args&&
... args) | 56 GeneralSampler(SkLinearBitmapPipeline::BlendProcessorInterface* next, Args&&
... args) |
| 57 : fNext{next}, fStrategy{std::forward<Args>(args)...} { } | 57 : fNext{next}, fStrategy{std::forward<Args>(args)...} { } |
| 58 | 58 |
| 59 GeneralSampler(SkLinearBitmapPipeline::BlendProcessorInterface* next, | 59 GeneralSampler(SkLinearBitmapPipeline::BlendProcessorInterface* next, |
| 60 const GeneralSampler& sampler) | 60 const GeneralSampler& sampler) |
| 61 : fNext{next}, fStrategy{sampler.fStrategy} { } | 61 : fNext{next}, fStrategy{sampler.fStrategy} { } |
| (...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 x += dx; | 553 x += dx; |
| 554 count -= 1; | 554 count -= 1; |
| 555 } | 555 } |
| 556 } | 556 } |
| 557 } | 557 } |
| 558 | 558 |
| 559 Next* const fNext; | 559 Next* const fNext; |
| 560 SourceStrategy fStrategy; | 560 SourceStrategy fStrategy; |
| 561 }; | 561 }; |
| 562 | 562 |
| 563 class sRGBFast { | |
| 564 public: | |
| 565 static Sk4s VECTORCALL sRGBToLinear(Sk4s pixel) { | |
| 566 Sk4s l = pixel * pixel; | |
| 567 return Sk4s{l[0], l[1], l[2], pixel[3]}; | |
| 568 } | |
| 569 }; | |
| 570 | |
| 571 template <typename PixelGetter> | 563 template <typename PixelGetter> |
| 572 class PixelAccessor { | 564 class PixelAccessor { |
| 573 public: | 565 public: |
| 574 PixelAccessor(const SkPixmap& srcPixmap) | 566 PixelAccessor(const SkPixmap& srcPixmap) |
| 575 : fWidth{srcPixmap.rowBytesAsPixels()} | 567 : fWidth{srcPixmap.rowBytesAsPixels()} |
| 576 , fGetter{srcPixmap} { } | 568 , fGetter{srcPixmap} { } |
| 577 | 569 |
| 578 void VECTORCALL getFewPixels(int n, Sk4s xs, Sk4s ys, Sk4f* px0, Sk4f* px1,
Sk4f* px2) { | 570 void VECTORCALL getFewPixels(int n, Sk4s xs, Sk4s ys, Sk4f* px0, Sk4f* px1,
Sk4f* px2) { |
| 579 Sk4i XIs = SkNx_cast<int, SkScalar>(xs); | 571 Sk4i XIs = SkNx_cast<int, SkScalar>(xs); |
| 580 Sk4i YIs = SkNx_cast<int, SkScalar>(ys); | 572 Sk4i YIs = SkNx_cast<int, SkScalar>(ys); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 623 | 615 |
| 624 template <SkColorProfileType colorProfile> | 616 template <SkColorProfileType colorProfile> |
| 625 class PixelGetter<kRGBA_8888_SkColorType, colorProfile> { | 617 class PixelGetter<kRGBA_8888_SkColorType, colorProfile> { |
| 626 public: | 618 public: |
| 627 PixelGetter(const SkPixmap& srcPixmap) | 619 PixelGetter(const SkPixmap& srcPixmap) |
| 628 : fSrc{srcPixmap.addr32()} | 620 : fSrc{srcPixmap.addr32()} |
| 629 , fWidth{srcPixmap.rowBytesAsPixels()} { } | 621 , fWidth{srcPixmap.rowBytesAsPixels()} { } |
| 630 | 622 |
| 631 Sk4f getPixelFromRow(const void* row, int index) { | 623 Sk4f getPixelFromRow(const void* row, int index) { |
| 632 const uint32_t* src = static_cast<const uint32_t*>(row); | 624 const uint32_t* src = static_cast<const uint32_t*>(row); |
| 633 Sk4b bytePixel = Sk4b::Load((uint8_t *)(&src[index])); | 625 return colorProfile == kSRGB_SkColorProfileType |
| 634 Sk4f pixel = SkNx_cast<float, uint8_t>(bytePixel); | 626 ? Sk4f_fromS32(*src) |
| 635 pixel = pixel * (1.0f/255.0f); | 627 : Sk4f_fromL32(*src); |
| 636 if (colorProfile == kSRGB_SkColorProfileType) { | |
| 637 pixel = sRGBFast::sRGBToLinear(pixel); | |
| 638 } | |
| 639 return pixel; | |
| 640 } | 628 } |
| 641 | 629 |
| 642 Sk4f getPixelAt(int index) { | 630 Sk4f getPixelAt(int index) { |
| 643 return this->getPixelFromRow(fSrc, index); | 631 return this->getPixelFromRow(fSrc, index); |
| 644 } | 632 } |
| 645 | 633 |
| 646 const void* row(int y) { return fSrc + y * fWidth; } | 634 const void* row(int y) { return fSrc + y * fWidth; } |
| 647 | 635 |
| 648 private: | 636 private: |
| 649 const uint32_t* const fSrc; | 637 const uint32_t* const fSrc; |
| 650 const int fWidth; | 638 const int fWidth; |
| 651 }; | 639 }; |
| 652 | 640 |
| 653 using Pixel8888SRGB = PixelAccessor<PixelGetter<kRGBA_8888_SkColorType, kSRGB_Sk
ColorProfileType>>; | 641 using Pixel8888SRGB = PixelAccessor<PixelGetter<kRGBA_8888_SkColorType, kSRGB_Sk
ColorProfileType>>; |
| 654 using Pixel8888LRGB = PixelAccessor<PixelGetter<kRGBA_8888_SkColorType, kLinear_
SkColorProfileType>>; | 642 using Pixel8888LRGB = PixelAccessor<PixelGetter<kRGBA_8888_SkColorType, kLinear_
SkColorProfileType>>; |
| 655 | 643 |
| 656 template <SkColorProfileType colorProfile> | 644 template <SkColorProfileType colorProfile> |
| 657 class PixelGetter<kBGRA_8888_SkColorType, colorProfile> { | 645 class PixelGetter<kBGRA_8888_SkColorType, colorProfile> { |
| 658 public: | 646 public: |
| 659 PixelGetter(const SkPixmap& srcPixmap) | 647 PixelGetter(const SkPixmap& srcPixmap) |
| 660 : fSrc{srcPixmap.addr32()} | 648 : fSrc{srcPixmap.addr32()} |
| 661 , fWidth{srcPixmap.rowBytesAsPixels()} { } | 649 , fWidth{srcPixmap.rowBytesAsPixels()} { } |
| 662 | 650 |
| 663 Sk4f getPixelFromRow(const void* row, int index) { | 651 Sk4f getPixelFromRow(const void* row, int index) { |
| 664 const uint32_t* src = static_cast<const uint32_t*>(row); | 652 const uint32_t* src = static_cast<const uint32_t*>(row); |
| 665 Sk4b bytePixel = Sk4b::Load((uint8_t *)(&src[index])); | 653 Sk4f pixel = colorProfile == kSRGB_SkColorProfileType |
| 666 Sk4f pixel = SkNx_cast<float, uint8_t>(bytePixel); | 654 ? Sk4f_fromS32(*src) |
| 667 pixel = SkNx_shuffle<2, 1, 0, 3>(pixel); | 655 : Sk4f_fromL32(*src); |
| 668 pixel = pixel * (1.0f/255.0f); | 656 return SkNx_shuffle<2, 1, 0, 3>(pixel); |
| 669 if (colorProfile == kSRGB_SkColorProfileType) { | |
| 670 pixel = sRGBFast::sRGBToLinear(pixel); | |
| 671 } | |
| 672 return pixel; | |
| 673 } | 657 } |
| 674 | 658 |
| 675 Sk4f getPixelAt(int index) { | 659 Sk4f getPixelAt(int index) { |
| 676 return this->getPixelFromRow(fSrc, index); | 660 return this->getPixelFromRow(fSrc, index); |
| 677 } | 661 } |
| 678 | 662 |
| 679 const void* row(int y) { return fSrc + y * fWidth; } | 663 const void* row(int y) { return fSrc + y * fWidth; } |
| 680 | 664 |
| 681 private: | 665 private: |
| 682 const uint32_t* const fSrc; | 666 const uint32_t* const fSrc; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 718 | 702 |
| 719 Sk4f getPixelAt(int index) { | 703 Sk4f getPixelAt(int index) { |
| 720 return this->getPixelFromRow(fSrc, index); | 704 return this->getPixelFromRow(fSrc, index); |
| 721 } | 705 } |
| 722 | 706 |
| 723 const void* row(int y) { return fSrc + y * fWidth; } | 707 const void* row(int y) { return fSrc + y * fWidth; } |
| 724 | 708 |
| 725 private: | 709 private: |
| 726 static const size_t kColorTableSize = sizeof(Sk4f[256]) + 12; | 710 static const size_t kColorTableSize = sizeof(Sk4f[256]) + 12; |
| 727 Sk4f convertPixel(SkPMColor pmColor) { | 711 Sk4f convertPixel(SkPMColor pmColor) { |
| 728 Sk4b bPixel = Sk4b::Load(&pmColor); | 712 Sk4f pixel = to_4f(pmColor); |
| 729 Sk4f pixel = SkNx_cast<float, uint8_t>(bPixel); | 713 float alpha = get_alpha(pixel); |
| 730 float alpha = pixel[3]; | |
| 731 if (alpha != 0.0f) { | 714 if (alpha != 0.0f) { |
| 732 float invAlpha = 1.0f / pixel[3]; | 715 float invAlpha = 1.0f / alpha; |
| 733 Sk4f normalize = {invAlpha, invAlpha, invAlpha, 1.0f / 255.0f}; | 716 Sk4f normalize = {invAlpha, invAlpha, invAlpha, 1.0f / 255.0f}; |
| 734 pixel = pixel * normalize; | 717 pixel = pixel * normalize; |
| 735 if (colorProfile == kSRGB_SkColorProfileType) { | 718 if (colorProfile == kSRGB_SkColorProfileType) { |
| 736 pixel = sRGBFast::sRGBToLinear(pixel); | 719 pixel = linear_to_srgb(pixel); |
| 737 } | 720 } |
| 738 return pixel; | 721 return pixel; |
| 739 } else { | 722 } else { |
| 740 return Sk4f{0.0f}; | 723 return Sk4f{0.0f}; |
| 741 } | 724 } |
| 742 } | 725 } |
| 743 const uint8_t* const fSrc; | 726 const uint8_t* const fSrc; |
| 744 const int fWidth; | 727 const int fWidth; |
| 745 SkAutoMalloc fColorTableStorage{kColorTableSize}; | 728 SkAutoMalloc fColorTableStorage{kColorTableSize}; |
| 746 Sk4f* fColorTable; | 729 Sk4f* fColorTable; |
| (...skipping 23 matching lines...) Expand all Loading... |
| 770 private: | 753 private: |
| 771 const uint64_t* const fSrc; | 754 const uint64_t* const fSrc; |
| 772 const int fWidth; | 755 const int fWidth; |
| 773 }; | 756 }; |
| 774 | 757 |
| 775 using PixelHalfLinear = PixelAccessor<PixelGetter<kRGBA_F16_SkColorType, kLinear
_SkColorProfileType>>; | 758 using PixelHalfLinear = PixelAccessor<PixelGetter<kRGBA_F16_SkColorType, kLinear
_SkColorProfileType>>; |
| 776 | 759 |
| 777 } // namespace | 760 } // namespace |
| 778 | 761 |
| 779 #endif // SkLinearBitmapPipeline_sampler_DEFINED | 762 #endif // SkLinearBitmapPipeline_sampler_DEFINED |
| OLD | NEW |