Index: src/core/SkBitmapProcState.cpp |
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp |
index 487bd80402609f454b894e5e124eb5d8eb20c9eb..b08db53ffa2f582a89587bea5dc2475e410cd685 100644 |
--- a/src/core/SkBitmapProcState.cpp |
+++ b/src/core/SkBitmapProcState.cpp |
@@ -195,6 +195,15 @@ bool SkBitmapProcState::chooseProcs(const SkMatrix& inv, const SkPaint& paint) { |
fSampleProc32 = nullptr; |
fSampleProc16 = nullptr; |
+#ifndef SK_SUPPORT_LEGACY_BITMAP_SAMPLER_BIAS |
+ // We only need a bias when the scale is positive: for negative scales |
+ // we're rounding in the right direction intrinsically. |
+ fInvBiasX = -(fInvMatrix.getScaleX() > 0); |
+ fInvBiasY = -(fInvMatrix.getScaleY() > 0); |
+#else |
+ fInvBiasX = fInvBiasY = 0; |
+#endif |
+ |
// recompute the triviality of the matrix here because we may have |
// changed it! |
@@ -823,12 +832,10 @@ void Clamp_S32_opaque_D32_nofilter_DX_shaderproc(const SkBitmapProcState& s, in |
SkPoint pt; |
s.fInvProc(s.fInvMatrix, SkIntToScalar(x) + SK_ScalarHalf, SkIntToScalar(y) + SK_ScalarHalf, |
&pt); |
- fx = SkScalarToFractionalInt(pt.fY) |
- + bitmap_sampler_inv_bias(s.fInvMatrix.getScaleY()); |
+ fx = SkScalarToFractionalInt(pt.fY) + SkFixedToFractionalInt(s.fInvBiasY); |
const unsigned maxY = s.fPixmap.height() - 1; |
dstY = SkClampMax(SkFractionalIntToInt(fx), maxY); |
- fx = SkScalarToFractionalInt(pt.fX) |
- + bitmap_sampler_inv_bias(s.fInvMatrix.getScaleX()); |
+ fx = SkScalarToFractionalInt(pt.fX) + SkFixedToFractionalInt(s.fInvBiasX); |
} |
const SkPMColor* SK_RESTRICT src = s.fPixmap.addr32(0, dstY); |