Index: src/core/SkLinearBitmapPipeline_sample.h |
diff --git a/src/core/SkLinearBitmapPipeline_sample.h b/src/core/SkLinearBitmapPipeline_sample.h |
index 78af038660f12094e3843644bfca58468ba4ef32..cf13fd57be891da154f46730f8c8b61c9bfff522 100644 |
--- a/src/core/SkLinearBitmapPipeline_sample.h |
+++ b/src/core/SkLinearBitmapPipeline_sample.h |
@@ -10,9 +10,12 @@ |
#include <tuple> |
+#include "SkColor.h" |
+#include "SkColorPriv.h" |
#include "SkFixed.h" |
#include "SkHalf.h" |
#include "SkLinearBitmapPipeline_core.h" |
+#include "SkNx.h" |
#include "SkPM4fPriv.h" |
namespace { |
@@ -54,6 +57,53 @@ static Sk4s VECTORCALL bilerp4(Sk4s xs, Sk4s ys, Sk4f px00, Sk4f px10, |
// of the different SkColorTypes. |
template <SkColorType colorType, SkColorProfileType colorProfile> class PixelGetter; |
+// Alpha handling: |
+// The alpha from the paint (tintColor) is used in the blend part of the pipeline to modulate |
+// the entire bitmap. So, the tint color is given an alpha of 1.0 so that the later alpha can |
+// modulate this color later. |
+template <> |
+class PixelGetter<kAlpha_8_SkColorType, kLinear_SkColorProfileType> { |
+public: |
+ using Element = uint8_t; |
+ PixelGetter(const SkPixmap& srcPixmap, SkColor tintColor) |
+ : fTintColor{set_alpha(Sk4f_from_SkColor(tintColor), 1.0f)} { } |
+ |
+ Sk4f getPixelAt(const uint8_t* src) { |
+ return fTintColor * (*src * (1.0f/255.0f)); |
+ } |
+ |
+private: |
+ const Sk4f fTintColor; |
+}; |
+ |
+template <SkColorProfileType colorProfile> |
+class PixelGetter<kRGB_565_SkColorType, colorProfile> { |
+public: |
+ using Element = uint16_t; |
+ PixelGetter(const SkPixmap& srcPixmap) { } |
+ |
+ Sk4f getPixelAt(const uint16_t* src) { |
+ SkPMColor pixel = SkPixel16ToPixel32(*src); |
+ return colorProfile == kSRGB_SkColorProfileType |
+ ? Sk4f_fromS32(pixel) |
+ : Sk4f_fromL32(pixel); |
+ } |
+}; |
+ |
+template <SkColorProfileType colorProfile> |
+class PixelGetter<kARGB_4444_SkColorType, colorProfile> { |
+public: |
+ using Element = uint16_t; |
+ PixelGetter(const SkPixmap& srcPixmap) { } |
+ |
+ Sk4f getPixelAt(const uint16_t* src) { |
+ SkPMColor pixel = SkPixel4444ToPixel32(*src); |
+ return colorProfile == kSRGB_SkColorProfileType |
+ ? Sk4f_fromS32(pixel) |
+ : Sk4f_fromL32(pixel); |
+ } |
+}; |
+ |
template <SkColorProfileType colorProfile> |
class PixelGetter<kRGBA_8888_SkColorType, colorProfile> { |
public: |
@@ -77,7 +127,7 @@ public: |
Sk4f pixel = colorProfile == kSRGB_SkColorProfileType |
? Sk4f_fromS32(*src) |
: Sk4f_fromL32(*src); |
- return SkNx_shuffle<2, 1, 0, 3>(pixel); |
+ return swizzle_rb(pixel); |
} |
}; |
@@ -128,6 +178,21 @@ private: |
Sk4f* fColorTable; |
}; |
+template <SkColorProfileType colorProfile> |
+class PixelGetter<kGray_8_SkColorType, colorProfile> { |
+public: |
+ using Element = uint8_t; |
+ PixelGetter(const SkPixmap& srcPixmap) { } |
+ |
+ Sk4f getPixelAt(const uint8_t* src) { |
+ float gray = *src * (1.0f/255.0f); |
+ Sk4f pixel = Sk4f{gray, gray, gray, 1.0f}; |
+ return colorProfile == kSRGB_SkColorProfileType |
+ ? srgb_to_linear(pixel) |
+ : pixel; |
+ } |
+}; |
+ |
template <> |
class PixelGetter<kRGBA_F16_SkColorType, kLinear_SkColorProfileType> { |
public: |
@@ -145,10 +210,11 @@ template <SkColorType colorType, SkColorProfileType colorProfile> |
class PixelAccessor { |
using Element = typename PixelGetter<colorType, colorProfile>::Element; |
public: |
- PixelAccessor(const SkPixmap& srcPixmap) |
+ template <typename... Args> |
+ PixelAccessor(const SkPixmap& srcPixmap, Args&&... args) |
: fSrc{static_cast<const Element*>(srcPixmap.addr())} |
, fWidth{srcPixmap.rowBytesAsPixels()} |
- , fGetter{srcPixmap} { } |
+ , fGetter{srcPixmap, std::move<Args>(args)...} { } |
void VECTORCALL getFewPixels(int n, Sk4s xs, Sk4s ys, Sk4f* px0, Sk4f* px1, Sk4f* px2) { |
Sk4i XIs = SkNx_cast<int, SkScalar>(xs); |
@@ -711,11 +777,10 @@ private: |
} |
} |
- Next* const fNext; |
+ Next* const fNext; |
PixelAccessor<colorType, colorProfile> fStrategy; |
}; |
- |
} // namespace |
#endif // SkLinearBitmapPipeline_sampler_DEFINED |