Chromium Code Reviews| Index: src/core/SkLinearBitmapPipeline_sample.h |
| diff --git a/src/core/SkLinearBitmapPipeline_sample.h b/src/core/SkLinearBitmapPipeline_sample.h |
| index 7157ffc8ee0b6c0bdae715ae0e235a45781041fb..d436e393996db035a77344e0d8fb4da0ce175abd 100644 |
| --- a/src/core/SkLinearBitmapPipeline_sample.h |
| +++ b/src/core/SkLinearBitmapPipeline_sample.h |
| @@ -9,6 +9,7 @@ |
| #define SkLinearBitmapPipeline_sampler_DEFINED |
| #include "SkFixed.h" |
| +#include "SkHalf.h" |
| #include "SkLinearBitmapPipeline_core.h" |
| #include <array> |
| #include <tuple> |
| @@ -734,6 +735,59 @@ private: |
| using PixelIndex8SRGB = PixelIndex8<kSRGB_SkColorProfileType>; |
| using PixelIndex8LRGB = PixelIndex8<kLinear_SkColorProfileType>; |
| +class PixelHalfLinear { |
| +public: |
| + PixelHalfLinear(int width, const uint64_t* src) : fSrc{src}, fWidth{width}{ } |
| + PixelHalfLinear(const SkPixmap& srcPixmap) |
| + : fSrc{srcPixmap.addr64()} |
| + , fWidth{static_cast<int>(srcPixmap.rowBytes() / 8)} { } |
| + |
| + void VECTORCALL getFewPixels(int n, Sk4s xs, Sk4s ys, Sk4f* px0, Sk4f* px1, Sk4f* px2) { |
| + Sk4i XIs = SkNx_cast<int, SkScalar>(xs); |
| + Sk4i YIs = SkNx_cast<int, SkScalar>(ys); |
| + Sk4i bufferLoc = YIs * fWidth + XIs; |
| + switch (n) { |
| + case 3: |
| + *px2 = this->getPixelAt(fSrc, bufferLoc[2]); |
| + case 2: |
| + *px1 = this->getPixelAt(fSrc, bufferLoc[1]); |
| + case 1: |
| + *px0 = this->getPixelAt(fSrc, bufferLoc[0]); |
| + default: |
| + break; |
| + } |
| + } |
| + |
| + void VECTORCALL get4Pixels(Sk4s xs, Sk4s ys, Sk4f* px0, Sk4f* px1, Sk4f* px2, Sk4f* px3) { |
| + Sk4i XIs = SkNx_cast<int, SkScalar>(xs); |
| + Sk4i YIs = SkNx_cast<int, SkScalar>(ys); |
| + Sk4i bufferLoc = YIs * fWidth + XIs; |
| + *px0 = this->getPixelAt(fSrc, bufferLoc[0]); |
| + *px1 = this->getPixelAt(fSrc, bufferLoc[1]); |
| + *px2 = this->getPixelAt(fSrc, bufferLoc[2]); |
| + *px3 = this->getPixelAt(fSrc, bufferLoc[3]); |
| + } |
| + |
| + void get4Pixels(const void* vsrc, int index, Sk4f* px0, Sk4f* px1, Sk4f* px2, Sk4f* px3) { |
| + const uint32_t* src = static_cast<const uint32_t*>(vsrc); |
|
reed1
2016/04/14 20:15:44
Why is src a uint32_t? I'm not very familiar w/ th
|
| + *px0 = this->getPixelAt(src, index + 0); |
| + *px1 = this->getPixelAt(src, index + 1); |
| + *px2 = this->getPixelAt(src, index + 2); |
| + *px3 = this->getPixelAt(src, index + 3); |
| + } |
| + |
| + Sk4f getPixelAt(const void* vsrc, int index) { |
| + const uint64_t* src = static_cast<const uint64_t*>(vsrc); |
|
reed1
2016/04/14 20:15:44
Do we need to add "index" to src ?
|
| + return SkHalfToFloat_01(*src); |
| + } |
| + |
| + const void* row(int y) { return fSrc + y * fWidth[0]; } |
| + |
| +private: |
| + const uint64_t* const fSrc; |
| + const Sk4i fWidth; |
| +}; |
| + |
| } // namespace |
| #endif // SkLinearBitmapPipeline_sampler_DEFINED |