Add a tolerance to SkRemoteGlyphCache_DrawTextAsPath
Subtle differences like location in an atlas can cause LSB differences
in path rendering, depending on FP precision.
Bug: skia:
Change-Id: I1e6fef7eaeef833db767d9c4b6c9d29dca2fee73
Reviewed-on: https://skia-review.googlesource.com/150212
Reviewed-by: Herb Derby <herb@google.com>
Commit-Queue: Chris Dalton <csmartdalton@google.com>
diff --git a/tests/SkRemoteGlyphCacheTest.cpp b/tests/SkRemoteGlyphCacheTest.cpp
index 60ef272..c23e9a5 100644
--- a/tests/SkRemoteGlyphCacheTest.cpp
+++ b/tests/SkRemoteGlyphCacheTest.cpp
@@ -86,12 +86,26 @@
return builder.make();
}
-#define COMPARE_BLOBS(expected, actual, reporter) \
- for (int i = 0; i < expected.width(); ++i) { \
- for (int j = 0; j < expected.height(); ++j) { \
- REPORTER_ASSERT(reporter, expected.getColor(i, j) == actual.getColor(i, j)); \
- } \
+static void compare_blobs(const SkBitmap& expected, const SkBitmap& actual,
+ skiatest::Reporter* reporter, int tolerance = 0) {
+ SkASSERT(expected.width() == actual.width());
+ SkASSERT(expected.height() == actual.height());
+ for (int i = 0; i < expected.width(); ++i) {
+ for (int j = 0; j < expected.height(); ++j) {
+ SkColor expectedColor = expected.getColor(i, j);
+ SkColor actualColor = actual.getColor(i, j);
+ if (0 == tolerance) {
+ REPORTER_ASSERT(reporter, expectedColor == actualColor);
+ } else {
+ for (int k = 0; k < 4; ++k) {
+ int expectedChannel = (expectedColor >> (k*8)) & 0xff;
+ int actualChannel = (actualColor >> (k*8)) & 0xff;
+ REPORTER_ASSERT(reporter, abs(expectedChannel - actualChannel) <= tolerance);
+ }
+ }
+ }
}
+}
SkTextBlobCacheDiffCanvas::Settings MakeSettings(GrContext* context) {
SkTextBlobCacheDiffCanvas::Settings settings;
@@ -160,7 +174,7 @@
SkBitmap expected = RasterBlob(serverBlob, 10, 10, paint, ctxInfo.grContext());
SkBitmap actual = RasterBlob(clientBlob, 10, 10, paint, ctxInfo.grContext());
- COMPARE_BLOBS(expected, actual, reporter);
+ compare_blobs(expected, actual, reporter);
REPORTER_ASSERT(reporter, !discardableManager->hasCacheMiss());
// Must unlock everything on termination, otherwise valgrind complains about memory leaks.
@@ -328,7 +342,7 @@
SkBitmap expected = RasterBlob(serverBlob, 10, 10, paint, ctxInfo.grContext());
SkBitmap actual = RasterBlob(clientBlob, 10, 10, paint, ctxInfo.grContext());
- COMPARE_BLOBS(expected, actual, reporter);
+ compare_blobs(expected, actual, reporter, 1);
REPORTER_ASSERT(reporter, !discardableManager->hasCacheMiss());
SkStrikeCache::ValidateGlyphCacheDataSize();
@@ -367,7 +381,7 @@
SkBitmap expected = RasterBlob(serverBlob, 10, 10, paint, ctxInfo.grContext(), nullptr, 0.5);
SkBitmap actual = RasterBlob(clientBlob, 10, 10, paint, ctxInfo.grContext(), nullptr, 0.5);
- COMPARE_BLOBS(expected, actual, reporter);
+ compare_blobs(expected, actual, reporter);
REPORTER_ASSERT(reporter, !discardableManager->hasCacheMiss());
SkStrikeCache::ValidateGlyphCacheDataSize();
@@ -414,7 +428,7 @@
SkBitmap expected = RasterBlob(serverBlob, 10, 10, paint, ctxInfo.grContext(), &matrix);
SkBitmap actual = RasterBlob(clientBlob, 10, 10, paint, ctxInfo.grContext(), &matrix);
- COMPARE_BLOBS(expected, actual, reporter);
+ compare_blobs(expected, actual, reporter);
REPORTER_ASSERT(reporter, !discardableManager->hasCacheMiss());
SkStrikeCache::ValidateGlyphCacheDataSize();