| Index: src/core/SkLinearBitmapPipeline_sample.h
|
| diff --git a/src/core/SkLinearBitmapPipeline_sample.h b/src/core/SkLinearBitmapPipeline_sample.h
|
| index cf13fd57be891da154f46730f8c8b61c9bfff522..15a7c359cc1ab6ace6fa15024ac43e31232f91fa 100644
|
| --- a/src/core/SkLinearBitmapPipeline_sample.h
|
| +++ b/src/core/SkLinearBitmapPipeline_sample.h
|
| @@ -268,7 +268,7 @@ private:
|
|
|
| ////////////////////////////////////////////////////////////////////////////////////////////////////
|
| // GeneralSampler handles all the different sampling scenarios. It makes runtime decisions to
|
| -// choose the fastest stratagy given a particular job. It ultimately uses PixelGetters to access
|
| +// choose the fastest strategy given a particular job. It ultimately uses PixelGetters to access
|
| // the pixels.
|
| template<SkColorType colorType, SkColorProfileType colorProfile, typename Next>
|
| class GeneralSampler {
|
| @@ -312,12 +312,13 @@ public:
|
| }
|
| }
|
|
|
| - Sk4f bilerNonEdgePixel(SkScalar x, SkScalar y) {
|
| + Sk4f bilerpNonEdgePixel(SkScalar x, SkScalar y) {
|
| Sk4f px00, px10, px01, px11;
|
| - Sk4f xs = Sk4f{x};
|
| - Sk4f ys = Sk4f{y};
|
| - Sk4f sampleXs = xs + Sk4f{-0.5f, 0.5f, -0.5f, 0.5f};
|
| - Sk4f sampleYs = ys + Sk4f{-0.5f, -0.5f, 0.5f, 0.5f};
|
| + // bilerp4() expects xs, ys are the top-lefts of the 2x2 kernel.
|
| + Sk4f xs = Sk4f{x} - 0.5f;
|
| + Sk4f ys = Sk4f{y} - 0.5f;
|
| + Sk4f sampleXs = xs + Sk4f{0.0f, 1.0f, 0.0f, 1.0f};
|
| + Sk4f sampleYs = ys + Sk4f{0.0f, 0.0f, 1.0f, 1.0f};
|
| fStrategy.get4Pixels(sampleXs, sampleYs, &px00, &px10, &px01, &px11);
|
| return bilerp4(xs, ys, px00, px10, px01, px11);
|
| }
|
| @@ -325,7 +326,7 @@ public:
|
| void VECTORCALL bilerpListFew(int n, Sk4s xs, Sk4s ys) {
|
| SkASSERT(0 < n && n < 4);
|
| auto bilerpPixel = [&](int index) {
|
| - return this->bilerNonEdgePixel(xs[index], ys[index]);
|
| + return this->bilerpNonEdgePixel(xs[index], ys[index]);
|
| };
|
|
|
| if (n >= 1) fNext->blendPixel(bilerpPixel(0));
|
| @@ -335,7 +336,7 @@ public:
|
|
|
| void VECTORCALL bilerpList4(Sk4s xs, Sk4s ys) {
|
| auto bilerpPixel = [&](int index) {
|
| - return this->bilerNonEdgePixel(xs[index], ys[index]);
|
| + return this->bilerpNonEdgePixel(xs[index], ys[index]);
|
| };
|
| fNext->blend4Pixels(bilerpPixel(0), bilerpPixel(1), bilerpPixel(2), bilerpPixel(3));
|
| }
|
| @@ -514,11 +515,9 @@ private:
|
| SkScalar length;
|
| int count;
|
| std::tie(start, length, count) = span;
|
| - SkFixed fx = SkScalarToFixed(X(start)
|
| - -0.5f);
|
| + SkFixed fx = SkScalarToFixed(X(start)-0.5f);
|
|
|
| SkFixed fdx = SkScalarToFixed(length / (count - 1));
|
| - //start = start + SkPoint{-0.5f, -0.5f};
|
|
|
| Sk4f xAdjust;
|
| if (fdx >= 0) {
|
| @@ -751,7 +750,10 @@ private:
|
| std::tie(start, length, count) = span;
|
| SkScalar x = X(start);
|
| SkScalar y = Y(start);
|
| - if (false && y == y1) {
|
| + // In this sampler, it is assumed that if span.StartY() and y1 are the same then both
|
| + // y-lines are on the same tile.
|
| + if (y == y1) {
|
| + // Both y-lines are on the same tile.
|
| struct BilerpWrapper {
|
| void VECTORCALL pointListFew(int n, Sk4s xs, Sk4s ys) {
|
| fSampler.bilerpListFew(n, xs, ys);
|
| @@ -766,6 +768,7 @@ private:
|
| BilerpWrapper wrapper{*this};
|
| span_fallback(span, &wrapper);
|
| } else {
|
| + // The y-lines are on different tiles.
|
| SkScalar dx = length / (count - 1);
|
| Sk4f ys = {y - 0.5f, y - 0.5f, y1 + 0.5f, y1 + 0.5f};
|
| while (count > 0) {
|
|
|