aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkBitmapProcState.h
diff options
context:
space:
mode:
authorGravatar fmalita <fmalita@chromium.org>2015-12-18 09:36:18 -0800
committerGravatar Commit bot <commit-bot@chromium.org>2015-12-18 09:36:18 -0800
commit3e6be16e6d4dda6a27f0e1dbfe7c87fecfbf5577 (patch)
treedc05783873039d000e7f126e1c5d7fc328907ecf /src/core/SkBitmapProcState.h
parent14d8fa0f58bf7f814901d2ae068af8814d6ed1a4 (diff)
Revert of Repeating SkBitmapProcState rounding bias (patchset #6 id:100001 of https://codereview.chromium.org/1529833003/ )
Reason for revert: We need a SkFractionalInt auto mapper flavor, otherwise we're losing precision for some procs => seaming artifacs (https://gold.skia.org/diff?test=giantbitmap_mirror_point_rotate&left=0dd7a412fce81586e6a142e039ec2de9&top=a706d4bb2b8e994b936445b87115b07e) Original issue's description: > Repeating SkBitmapProcState rounding bias > > Observe the bias in repeat matrix procs also. > > Introduce a utility class to handle device space -> bitmap space > mapping. > > BUG=skia:4680,skia:4649 > R=reed@google.com > GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1529833003 > > Committed: https://skia.googlesource.com/skia/+/5ae7fdcc3d7712da3193c39a751e88b092aa82db TBR=reed@google.com NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=skia:4680,skia:4649 Review URL: https://codereview.chromium.org/1531423003
Diffstat (limited to 'src/core/SkBitmapProcState.h')
-rw-r--r--src/core/SkBitmapProcState.h39
1 files changed, 11 insertions, 28 deletions
diff --git a/src/core/SkBitmapProcState.h b/src/core/SkBitmapProcState.h
index 342da78c05..e6e7a3f393 100644
--- a/src/core/SkBitmapProcState.h
+++ b/src/core/SkBitmapProcState.h
@@ -25,6 +25,17 @@ typedef SkFixed3232 SkFractionalInt;
#define SkFixedToFractionalInt(x) SkFixedToFixed3232(x)
#define SkFractionalIntToInt(x) SkFixed3232ToInt(x)
+// Applying a fixed point (SkFixed, SkFractionalInt) epsilon bias ensures that the inverse-mapped
+// bitmap coordinates are rounded consistently WRT geometry. Note that we only have to do this
+// when the scale is positive - for negative scales we're already rounding in the right direction.
+static inline int bitmap_sampler_inv_bias(SkScalar scale) {
+#ifndef SK_SUPPORT_LEGACY_BITMAP_SAMPLER_BIAS
+ return -(scale > 0);
+#else
+ return 0;
+#endif
+}
+
class SkPaint;
struct SkBitmapProcState {
@@ -201,32 +212,4 @@ void S32_D16_filter_DX(const SkBitmapProcState& s,
void S32_D16_filter_DXDY(const SkBitmapProcState& s,
const uint32_t* xy, int count, uint16_t* colors);
-// Helper class for mapping the middle of pixel (x, y) into SkFixed bitmap space.
-class SkBitmapProcStateAutoMapper {
-public:
- SkBitmapProcStateAutoMapper(const SkBitmapProcState& s, int x, int y) {
- SkPoint pt;
- s.fInvProc(s.fInvMatrix,
- SkIntToScalar(x) + SK_ScalarHalf,
- SkIntToScalar(y) + SK_ScalarHalf, &pt);
-
-#ifndef SK_SUPPORT_LEGACY_BITMAP_SAMPLER_BIAS
- // SkFixed epsilon bias to ensure inverse-mapped bitmap coordinates are rounded
- // consistently WRT geometry. Note that we only need the bias for positive scales:
- // for negative scales, the rounding is intrinsically correct.
- fX = SkScalarToFixed(pt.x()) - (s.fInvMatrix.getScaleX() > 0);
- fY = SkScalarToFixed(pt.y()) - (s.fInvMatrix.getScaleY() > 0);
-#else
- fX = SkScalarToFixed(pt.x());
- fY = SkScalarToFixed(pt.y());
-#endif
- }
-
- SkFixed x() const { return fX; }
- SkFixed y() const { return fY; }
-
-private:
- SkFixed fX, fY;
-};
-
#endif