Chromium Code Reviews| 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 #include "SkLinearBitmapPipeline.h" | 8 #include "SkLinearBitmapPipeline.h" |
| 9 #include "SkPM4f.h" | 9 #include "SkPM4f.h" |
| 10 | 10 |
| (...skipping 727 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 738 void VECTORCALL get4Pixels(Sk4s xs, Sk4s ys, Sk4f* px0, Sk4f* px1, Sk4f* px2 , Sk4f* px3) { | 738 void VECTORCALL get4Pixels(Sk4s xs, Sk4s ys, Sk4f* px0, Sk4f* px1, Sk4f* px2 , Sk4f* px3) { |
| 739 Sk4i XIs = SkNx_cast<int, SkScalar>(xs); | 739 Sk4i XIs = SkNx_cast<int, SkScalar>(xs); |
| 740 Sk4i YIs = SkNx_cast<int, SkScalar>(ys); | 740 Sk4i YIs = SkNx_cast<int, SkScalar>(ys); |
| 741 Sk4i bufferLoc = YIs * fWidth + XIs; | 741 Sk4i bufferLoc = YIs * fWidth + XIs; |
| 742 *px0 = this->getPixel(fSrc, bufferLoc[0]); | 742 *px0 = this->getPixel(fSrc, bufferLoc[0]); |
| 743 *px1 = this->getPixel(fSrc, bufferLoc[1]); | 743 *px1 = this->getPixel(fSrc, bufferLoc[1]); |
| 744 *px2 = this->getPixel(fSrc, bufferLoc[2]); | 744 *px2 = this->getPixel(fSrc, bufferLoc[2]); |
| 745 *px3 = this->getPixel(fSrc, bufferLoc[3]); | 745 *px3 = this->getPixel(fSrc, bufferLoc[3]); |
| 746 } | 746 } |
| 747 | 747 |
| 748 void get4Pixels(const uint32_t* src, int index, Sk4f* px0, Sk4f* px1, Sk4f* px2, Sk4f* px3) { | |
| 749 *px0 = this->getPixel(src, index + 0); | |
| 750 *px1 = this->getPixel(src, index + 1); | |
| 751 *px2 = this->getPixel(src, index + 2); | |
| 752 *px3 = this->getPixel(src, index + 3); | |
| 753 } | |
| 754 | |
| 748 Sk4f getPixel(const uint32_t* src, int index) { | 755 Sk4f getPixel(const uint32_t* src, int index) { |
| 749 Sk4b bytePixel = Sk4b::Load((uint8_t *)(&src[index])); | 756 Sk4b bytePixel = Sk4b::Load((uint8_t *)(&src[index])); |
| 750 Sk4f pixel = SkNx_cast<float, uint8_t>(bytePixel); | 757 Sk4f pixel = SkNx_cast<float, uint8_t>(bytePixel); |
| 751 if (colorOrder == ColorOrder::kBGRA) { | 758 if (colorOrder == ColorOrder::kBGRA) { |
| 752 pixel = SkNx_shuffle<2, 1, 0, 3>(pixel); | 759 pixel = SkNx_shuffle<2, 1, 0, 3>(pixel); |
| 753 } | 760 } |
| 754 pixel = pixel * Sk4f{1.0f/255.0f}; | 761 pixel = pixel * Sk4f{1.0f/255.0f}; |
| 755 if (colorProfile == kSRGB_SkColorProfileType) { | 762 if (colorProfile == kSRGB_SkColorProfileType) { |
| 756 pixel = sRGBFast::sRGBToLinear(pixel); | 763 pixel = sRGBFast::sRGBToLinear(pixel); |
| 757 } | 764 } |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 822 } | 829 } |
| 823 | 830 |
| 824 void VECTORCALL bilerpList(Sk4s xs, Sk4s ys) override { | 831 void VECTORCALL bilerpList(Sk4s xs, Sk4s ys) override { |
| 825 Sk4f px00, px10, px01, px11; | 832 Sk4f px00, px10, px01, px11; |
| 826 fStrategy.get4Pixels(xs, ys, &px00, &px10, &px01, &px11); | 833 fStrategy.get4Pixels(xs, ys, &px00, &px10, &px01, &px11); |
| 827 Sk4f pixel = bilerp4(xs, ys, px00, px10, px01, px11); | 834 Sk4f pixel = bilerp4(xs, ys, px00, px10, px01, px11); |
| 828 fNext->placePixel(pixel); | 835 fNext->placePixel(pixel); |
| 829 } | 836 } |
| 830 | 837 |
| 831 void pointSpan(Span span) override { | 838 void pointSpan(Span span) override { |
| 839 SkASSERT(!span.isEmpty()); | |
| 840 SkPoint start; SkScalar length; int count; | |
| 841 std::tie(start, length, count) = span; | |
| 842 if (length < (count - 1)) { | |
| 843 pointSpanSlowRate(span); | |
|
mtklein_C
2016/03/01 18:53:05
Please do a this-> pass.
herb_g
2016/03/01 20:57:06
Done.
| |
| 844 } else if (length == (count - 1)) { | |
| 845 pointSpanUnitRate(span); | |
| 846 } else { | |
| 847 pointSpanFastRate(span); | |
| 848 } | |
| 849 } | |
| 850 | |
| 851 | |
| 852 private: | |
| 853 void pointSpanSlowRate(Span span) { | |
|
mtklein_C
2016/03/01 18:53:05
// When moving through source space more slowly th
herb_g
2016/03/01 20:57:06
Done.
| |
| 854 SkPoint start; SkScalar length; int count; | |
| 855 std::tie(start, length, count) = span; | |
| 856 SkScalar x = X(start); | |
| 857 SkFixed fx = SkScalarToFixed(x); | |
| 858 SkScalar dx = length / (count - 1); | |
| 859 SkFixed fdx = SkScalarToFixed(dx); | |
| 860 | |
| 861 const uint32_t* const row = fStrategy.row((int)std::floor(Y(start))); | |
|
mtklein_C
2016/03/01 18:53:05
Seems like we can't logically write uint32_t here.
herb_g
2016/03/01 20:57:07
Done.
| |
| 862 SkLinearBitmapPipeline::PixelPlacerInterface* const next = fNext; | |
|
mtklein_C
2016/03/01 18:53:06
Just my opinion: I think marking pointers const us
herb_g
2016/03/01 20:57:07
Done.
| |
| 863 int ix = SkFixedFloorToInt(fx); | |
| 864 int prevIX = ix; | |
| 865 Sk4f fpixel = fStrategy.getPixel(row, ix); | |
| 866 auto getNextPixel = [&]() { | |
|
mtklein_C
2016/03/01 18:53:05
// As dx gets smaller, we take more and more sampl
herb_g
2016/03/01 20:57:06
Done.
| |
| 867 if (ix != prevIX) { | |
| 868 fpixel = fStrategy.getPixel(row, ix); | |
| 869 prevIX = ix; | |
| 870 } | |
| 871 fx += fdx; | |
| 872 ix = SkFixedFloorToInt(fx); | |
| 873 return fpixel; | |
| 874 }; | |
| 875 while (count >= 4) { | |
| 876 Sk4f px0 = getNextPixel(); | |
| 877 Sk4f px1 = getNextPixel(); | |
| 878 Sk4f px2 = getNextPixel(); | |
| 879 Sk4f px3 = getNextPixel(); | |
| 880 next->place4Pixels(px0, px1, px2, px3); | |
| 881 count -= 4; | |
| 882 } | |
| 883 while (count > 0) { | |
| 884 next->placePixel(getNextPixel()); | |
| 885 count -= 1; | |
| 886 } | |
| 887 } | |
| 888 | |
| 889 void pointSpanUnitRate(Span span) { | |
|
mtklein_C
2016/03/01 18:53:05
// We're moving through source space at a rate of
herb_g
2016/03/01 20:57:06
Done.
| |
| 890 SkPoint start; SkScalar length; int count; | |
| 891 std::tie(start, length, count) = span; | |
| 892 const uint32_t* const row = fStrategy.row((int)std::floor(Y(start))); | |
| 893 int ix = SkScalarFloorToInt(X(start)); | |
| 894 SkLinearBitmapPipeline::PixelPlacerInterface* const next = fNext; | |
| 895 while (count >= 4) { | |
| 896 Sk4f px0, px1, px2, px3; | |
| 897 fStrategy.get4Pixels(row, ix, &px0, &px1, &px2, &px3); | |
| 898 next->place4Pixels(px0, px1, px2, px3); | |
| 899 ix += 4; | |
| 900 count -= 4; | |
| 901 } | |
| 902 while (count > 0) { | |
| 903 next->placePixel(fStrategy.getPixel(row, ix)); | |
| 904 ix += 1; | |
| 905 count -= 1; | |
| 906 } | |
| 907 } | |
| 908 | |
| 909 void pointSpanFastRate(Span span) { | |
|
mtklein_C
2016/03/01 18:53:06
// We're moving through source space faster than d
herb_g
2016/03/01 20:57:06
Done.
| |
| 832 span_fallback(span, this); | 910 span_fallback(span, this); |
| 833 } | 911 } |
| 834 | 912 |
| 835 private: | 913 private: |
| 836 SkLinearBitmapPipeline::PixelPlacerInterface* const fNext; | 914 SkLinearBitmapPipeline::PixelPlacerInterface* const fNext; |
| 837 SourceStrategy fStrategy; | 915 SourceStrategy fStrategy; |
| 838 }; | 916 }; |
| 839 | 917 |
| 840 using Pixel8888SRGB = Pixel8888<kSRGB_SkColorProfileType, ColorOrder::kRGBA>; | 918 using Pixel8888SRGB = Pixel8888<kSRGB_SkColorProfileType, ColorOrder::kRGBA>; |
| 841 using Pixel8888LRGB = Pixel8888<kLinear_SkColorProfileType, ColorOrder::kRGBA>; | 919 using Pixel8888LRGB = Pixel8888<kLinear_SkColorProfileType, ColorOrder::kRGBA>; |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 941 | 1019 |
| 942 void SkLinearBitmapPipeline::shadeSpan4f(int x, int y, SkPM4f* dst, int count) { | 1020 void SkLinearBitmapPipeline::shadeSpan4f(int x, int y, SkPM4f* dst, int count) { |
| 943 SkASSERT(count > 0); | 1021 SkASSERT(count > 0); |
| 944 fPixelStage->setDestination(dst); | 1022 fPixelStage->setDestination(dst); |
| 945 // The count and length arguments start out in a precise relation in order t o keep the | 1023 // The count and length arguments start out in a precise relation in order t o keep the |
| 946 // math correct through the different stages. Count is the number of pixel t o produce. | 1024 // math correct through the different stages. Count is the number of pixel t o produce. |
| 947 // Since the code samples at pixel centers, length is the distance from the center of the | 1025 // Since the code samples at pixel centers, length is the distance from the center of the |
| 948 // first pixel to the center of the last pixel. This implies that length is count-1. | 1026 // first pixel to the center of the last pixel. This implies that length is count-1. |
| 949 fFirstStage->pointSpan(Span{SkPoint{x + 0.5f, y + 0.5f}, count - 1.0f, count }); | 1027 fFirstStage->pointSpan(Span{SkPoint{x + 0.5f, y + 0.5f}, count - 1.0f, count }); |
| 950 } | 1028 } |
| OLD | NEW |