Index: tests/SkNxTest.cpp |
diff --git a/tests/SkNxTest.cpp b/tests/SkNxTest.cpp |
index 2463b46f089105a8f4e43191128c91fb7dae2e95..eab625d41e3fe2f6e71d2ac2e4658850d9859e2a 100644 |
--- a/tests/SkNxTest.cpp |
+++ b/tests/SkNxTest.cpp |
@@ -5,6 +5,7 @@ |
* found in the LICENSE file. |
*/ |
+#include "Sk4px.h" |
#include "SkNx.h" |
#include "SkRandom.h" |
#include "Test.h" |
@@ -154,3 +155,38 @@ DEF_TEST(SkNi_min, r) { |
}} |
#endif |
} |
+ |
+DEF_TEST(SkNi_saturatedAdd, r) { |
+ for (int a = 0; a < (1<<8); a++) { |
+ for (int b = 0; b < (1<<8); b++) { |
+ int exact = a+b; |
+ if (exact > 255) { exact = 255; } |
+ if (exact < 0) { exact = 0; } |
+ |
+ REPORTER_ASSERT(r, Sk16b(a).saturatedAdd(Sk16b(b)).kth<0>() == exact); |
+ } |
+ } |
+} |
+ |
+DEF_TEST(Sk4px_muldiv255round, r) { |
+ for (int a = 0; a < (1<<8); a++) { |
+ for (int b = 0; b < (1<<8); b++) { |
+ int exact = (a*b+127)/255; |
+ |
+ // Duplicate a and b 16x each. |
+ Sk4px av((SkAlpha)a), |
+ bv((SkAlpha)b); |
+ |
+ // This way should always be exactly correct. |
+ int correct = av.mulWiden(bv).div255RoundNarrow().kth<0>(); |
+ REPORTER_ASSERT(r, correct == exact); |
+ |
+ // We're a bit more flexible on this method: correct for 0 or 255, otherwise off by <=1. |
+ int fast = av.fastMulDiv255Round(bv).kth<0>(); |
+ REPORTER_ASSERT(r, fast-exact >= -1 && fast-exact <= 1); |
+ if (a == 0 || a == 255 || b == 0 || b == 255) { |
+ REPORTER_ASSERT(r, fast == exact); |
+ } |
+ } |
+ } |
+} |