add round/ceil/etc. for SkMScalar
BUG=skia:
TBR=
Review URL: https://codereview.chromium.org/645793006
diff --git a/include/core/SkFloatingPoint.h b/include/core/SkFloatingPoint.h
index f85c456..1003b80 100644
--- a/include/core/SkFloatingPoint.h
+++ b/include/core/SkFloatingPoint.h
@@ -116,6 +116,13 @@
#define sk_float_ceil2int(x) (int)sk_float_ceil(x)
#endif
+#define sk_double_floor(x) floor(x)
+#define sk_double_round(x) floor((x) + 0.5)
+#define sk_double_ceil(x) ceil(x)
+#define sk_double_floor2int(x) (int)floor(x)
+#define sk_double_round2int(x) (int)floor((x) + 0.5f)
+#define sk_double_ceil2int(x) (int)ceil(x)
+
extern const uint32_t gIEEENotANumber;
extern const uint32_t gIEEEInfinity;
extern const uint32_t gIEEENegativeInfinity;
diff --git a/include/utils/SkMatrix44.h b/include/utils/SkMatrix44.h
index 38a0114..553e8d7 100644
--- a/include/utils/SkMatrix44.h
+++ b/include/utils/SkMatrix44.h
@@ -33,6 +33,16 @@
return fabs(x);
}
static const SkMScalar SK_MScalarPI = 3.141592653589793;
+
+ #define SkMScalarFloor(x) sk_double_floor(x)
+ #define SkMScalarCeil(x) sk_double_ceil(x)
+ #define SkMScalarRound(x) sk_double_round(x)
+
+ #define SkMScalarFloorToInt(x) sk_double_floor2int(x)
+ #define SkMScalarCeilToInt(x) sk_double_ceil2int(x)
+ #define SkMScalarRoundToInt(x) sk_double_round2int(x)
+
+
#elif defined SK_MSCALAR_IS_FLOAT
#ifdef SK_MSCALAR_IS_DOUBLE
#error "can't define MSCALAR both as DOUBLE and FLOAT"
@@ -55,10 +65,21 @@
return sk_float_abs(x);
}
static const SkMScalar SK_MScalarPI = 3.14159265f;
+
+ #define SkMScalarFloor(x) sk_float_floor(x)
+ #define SkMScalarCeil(x) sk_float_ceil(x)
+ #define SkMScalarRound(x) sk_float_round(x)
+
+ #define SkMScalarFloorToInt(x) sk_float_floor2int(x)
+ #define SkMScalarCeilToInt(x) sk_float_ceil2int(x)
+ #define SkMScalarRoundToInt(x) sk_float_round2int(x)
+
#endif
-#define SkMScalarToScalar SkMScalarToFloat
-#define SkScalarToMScalar SkFloatToMScalar
+#define SkIntToMScalar(n) static_cast<SkMScalar>(n)
+
+#define SkMScalarToScalar(x) SkMScalarToFloat(x)
+#define SkScalarToMScalar(x) SkFloatToMScalar(x)
static const SkMScalar SK_MScalar1 = 1;
diff --git a/tests/Matrix44Test.cpp b/tests/Matrix44Test.cpp
index 75dd518..13ead19 100644
--- a/tests/Matrix44Test.cpp
+++ b/tests/Matrix44Test.cpp
@@ -761,6 +761,21 @@
test(true, reporter, transform);
}
+// just want to exercise the various converters for MScalar
+static void test_toint(skiatest::Reporter* reporter) {
+ SkMatrix44 mat(SkMatrix44::kUninitialized_Constructor);
+ mat.setScale(3, 3, 3);
+
+ SkMScalar sum = SkMScalarFloor(mat.get(0, 0)) +
+ SkMScalarRound(mat.get(1, 0)) +
+ SkMScalarCeil(mat.get(2, 0));
+ int isum = SkMScalarFloorToInt(mat.get(0, 1)) +
+ SkMScalarRoundToInt(mat.get(1, 2)) +
+ SkMScalarCeilToInt(mat.get(2, 3));
+ REPORTER_ASSERT(reporter, sum >= 0);
+ REPORTER_ASSERT(reporter, isum >= 0);
+ REPORTER_ASSERT(reporter, static_cast<SkMScalar>(isum) == SkIntToMScalar(isum));
+}
DEF_TEST(Matrix44, reporter) {
SkMatrix44 mat(SkMatrix44::kUninitialized_Constructor);
@@ -869,4 +884,5 @@
test_3x3_conversion(reporter);
test_has_perspective(reporter);
test_preserves_2d_axis_alignment(reporter);
+ test_toint(reporter);
}