gm: remove --diffPath option and all other pixel diff functionality.

If you want pixel diffs, you need to run skdiff instead; from now on,
gm will only tell you WHETHER the images differed (not HOW they differed).
Review URL: https://codereview.appspot.com/7064047

git-svn-id: http://skia.googlecode.com/svn/trunk@7093 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
epoger@google.com 2013-01-08 18:47:31 +00:00
parent 5f429b098f
commit 15655b241b
4 changed files with 50 additions and 152 deletions

View File

@ -72,8 +72,8 @@ extern bool gSkSuppressFontCachePurgeSpew;
typedef int ErrorBitfield;
const static ErrorBitfield ERROR_NONE = 0x00;
const static ErrorBitfield ERROR_NO_GPU_CONTEXT = 0x01;
const static ErrorBitfield ERROR_PIXEL_MISMATCH = 0x02;
const static ErrorBitfield ERROR_DIMENSION_MISMATCH = 0x04;
const static ErrorBitfield ERROR_IMAGE_MISMATCH = 0x02;
// const static ErrorBitfield ERROR_DIMENSION_MISMATCH = 0x04; DEPRECATED in https://codereview.appspot.com/7064047
const static ErrorBitfield ERROR_READING_REFERENCE_IMAGE = 0x08;
const static ErrorBitfield ERROR_WRITING_REFERENCE_IMAGE = 0x10;
@ -90,24 +90,12 @@ const static char kJsonKey_ExpectedResults_IgnoreFailure[] = "ignore-failure";
using namespace skiagm;
/*
* Return the max of the difference (in absolute value) for any component.
* Returns 0 if they are equal.
*/
static int compute_PMColor_maxDiff(SkPMColor c0, SkPMColor c1) {
int da = SkAbs32(SkGetPackedA32(c0) - SkGetPackedA32(c1));
int dr = SkAbs32(SkGetPackedR32(c0) - SkGetPackedR32(c1));
int dg = SkAbs32(SkGetPackedG32(c0) - SkGetPackedG32(c1));
int db = SkAbs32(SkGetPackedB32(c0) - SkGetPackedB32(c1));
return SkMax32(da, SkMax32(dr, SkMax32(dg, db)));
}
struct FailRec {
SkString fName;
int fMaxPixelError;
bool fIsPixelError;
FailRec() : fMaxPixelError(0) {}
FailRec(const SkString& name) : fName(name), fMaxPixelError(0) {}
FailRec() : fIsPixelError(false) {}
FailRec(const SkString& name) : fName(name), fIsPixelError(false) {}
};
class Iter {
@ -252,71 +240,45 @@ public:
SkImageEncoder::kPNG_Type, 100);
}
static inline SkPMColor compute_diff_pmcolor(SkPMColor c0, SkPMColor c1) {
int dr = SkGetPackedR32(c0) - SkGetPackedR32(c1);
int dg = SkGetPackedG32(c0) - SkGetPackedG32(c1);
int db = SkGetPackedB32(c0) - SkGetPackedB32(c1);
return SkPackARGB32(0xFF, SkAbs32(dr), SkAbs32(dg), SkAbs32(db));
}
static void compute_diff(const SkBitmap& target, const SkBitmap& base,
SkBitmap* diff) {
SkAutoLockPixels alp(*diff);
const int w = target.width();
const int h = target.height();
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
SkPMColor c0 = *base.getAddr32(x, y);
SkPMColor c1 = *target.getAddr32(x, y);
SkPMColor d = 0;
if (c0 != c1) {
d = compute_diff_pmcolor(c0, c1);
}
*diff->getAddr32(x, y) = d;
}
}
}
// Records an error in fFailedTests, if we want to record errors
// of this type.
void RecordError(ErrorBitfield errorType, const SkString& name,
const char renderModeDescriptor [], int maxPixelError=0) {
const char renderModeDescriptor []) {
bool isPixelError = false;
switch (errorType) {
case ERROR_NONE:
break;
return;
case ERROR_READING_REFERENCE_IMAGE:
return;
case ERROR_IMAGE_MISMATCH:
isPixelError = true;
break;
default:
FailRec& rec = fFailedTests.push_back(make_name(
name.c_str(), renderModeDescriptor));
rec.fMaxPixelError = maxPixelError;
isPixelError = false;
break;
}
FailRec& rec = fFailedTests.push_back(make_name(
name.c_str(), renderModeDescriptor));
rec.fIsPixelError = isPixelError;
}
// List contents of fFailedTests via SkDebug.
void ListErrors() {
for (int i = 0; i < fFailedTests.count(); ++i) {
int pixErr = fFailedTests[i].fMaxPixelError;
SkString pixStr;
if (pixErr > 0) {
pixStr.printf(" pixel_error %d", pixErr);
if (fFailedTests[i].fIsPixelError) {
SkDebugf("\t\t%s pixel_error\n", fFailedTests[i].fName.c_str());
} else {
SkDebugf("\t\t%s\n", fFailedTests[i].fName.c_str());
}
SkDebugf("\t\t%s%s\n", fFailedTests[i].fName.c_str(),
pixStr.c_str());
}
}
// Compares "target" and "base" bitmaps, returning the result
// (ERROR_NONE if the two bitmaps are identical).
//
// If a "diff" bitmap is passed in, pixel diffs (if any) will be written
// into it.
ErrorBitfield compare(const SkBitmap& target, const SkBitmap& base,
const SkString& name,
const char* renderModeDescriptor,
SkBitmap* diff) {
const char* renderModeDescriptor) {
SkBitmap copy;
const SkBitmap* bm = &target;
if (target.config() != SkBitmap::kARGB_8888_Config) {
@ -336,41 +298,24 @@ public:
const int w = bm->width();
const int h = bm->height();
if (w != bp->width() || h != bp->height()) {
SkDebugf(
"---- %s dimensions mismatch for %s base [%d %d] current [%d %d]\n",
renderModeDescriptor, name.c_str(),
bp->width(), bp->height(), w, h);
RecordError(ERROR_DIMENSION_MISMATCH, name, renderModeDescriptor);
return ERROR_DIMENSION_MISMATCH;
RecordError(ERROR_IMAGE_MISMATCH, name, renderModeDescriptor);
return ERROR_IMAGE_MISMATCH;
}
SkAutoLockPixels bmLock(*bm);
SkAutoLockPixels baseLock(*bp);
int maxErr = 0;
for (int y = 0; y < h; y++) {
for (int x = 0; x < w; x++) {
SkPMColor c0 = *bp->getAddr32(x, y);
SkPMColor c1 = *bm->getAddr32(x, y);
if (c0 != c1) {
maxErr = SkMax32(maxErr, compute_PMColor_maxDiff(c0, c1));
RecordError(ERROR_IMAGE_MISMATCH, name,
renderModeDescriptor);
return ERROR_IMAGE_MISMATCH;
}
}
}
if (maxErr > 0) {
SkDebugf(
"----- %s max pixel mismatch for %s is %d\n",
renderModeDescriptor, name.c_str(), maxErr);
if (diff) {
diff->setConfig(SkBitmap::kARGB_8888_Config, w, h);
diff->allocPixels();
compute_diff(*bm, *bp, diff);
}
RecordError(ERROR_PIXEL_MISMATCH, name, renderModeDescriptor,
maxErr);
return ERROR_PIXEL_MISMATCH;
}
return ERROR_NONE;
}
@ -551,41 +496,14 @@ public:
}
}
// Compares bitmap "bitmap" to "referenceBitmap"; if they are
// different, writes out "bitmap" (in PNG format) within the
// diffPath subdir.
//
// Returns the ErrorBitfield from compare(), describing any differences
// between "bitmap" and "referenceBitmap" (or ERROR_NONE if there are none).
ErrorBitfield compare_to_reference_image_in_memory(
const SkString& name, SkBitmap &bitmap, const SkBitmap& referenceBitmap,
const char diffPath [], const char renderModeDescriptor []) {
ErrorBitfield errors;
SkBitmap diffBitmap;
errors = compare(bitmap, referenceBitmap, name, renderModeDescriptor,
diffPath ? &diffBitmap : NULL);
if ((ERROR_NONE != errors) && diffPath) {
// write out the generated image
SkString genName = make_filename(diffPath, "", name, "png");
if (!write_bitmap(genName, bitmap)) {
RecordError(ERROR_WRITING_REFERENCE_IMAGE, name,
renderModeDescriptor);
errors |= ERROR_WRITING_REFERENCE_IMAGE;
}
}
return errors;
}
// Compares bitmap "bitmap" to a reference bitmap read from disk;
// if they are different, writes out "bitmap" (in PNG format)
// within the diffPath subdir.
// Compares bitmap "bitmap" to a reference bitmap read from disk.
//
// Returns a description of the difference between "bitmap" and
// the reference bitmap, or ERROR_READING_REFERENCE_IMAGE if
// unable to read the reference bitmap from disk.
ErrorBitfield compare_to_reference_image_on_disk(
const char readPath [], const SkString& name, SkBitmap &bitmap,
const char diffPath [], const char renderModeDescriptor []) {
const char renderModeDescriptor []) {
ErrorBitfield retval;
SkString path = make_filename(readPath, "", name, "png");
SkBitmap referenceBitmap;
@ -599,10 +517,8 @@ public:
if (decodedReferenceBitmap) {
expectedChecksumsArray.append(Json::UInt64(
SkBitmapChecksummer::Compute64(referenceBitmap)));
retval = compare_to_reference_image_in_memory(name, bitmap,
referenceBitmap,
diffPath,
renderModeDescriptor);
retval = compare(bitmap, referenceBitmap, name,
renderModeDescriptor);
} else {
if (fNotifyMissingReadReference) {
fprintf(stderr, "FAILED to read %s\n", path.c_str());
@ -648,7 +564,6 @@ public:
const ConfigData& gRec,
const char writePath [],
const char readPath [],
const char diffPath [],
const char renderModeDescriptor [],
SkBitmap& bitmap,
SkDynamicMemoryWStream* pdf,
@ -658,7 +573,6 @@ public:
if (readPath && (gRec.fFlags & kRead_ConfigFlag)) {
retval |= compare_to_reference_image_on_disk(readPath, name, bitmap,
diffPath,
renderModeDescriptor);
} else if (NULL == referenceBitmap) {
// If we are running without "--readPath", we still want to
@ -678,8 +592,8 @@ public:
name, bitmap, pdf);
}
if (referenceBitmap) {
retval |= compare_to_reference_image_in_memory(
name, bitmap, *referenceBitmap, diffPath, renderModeDescriptor);
retval |= compare(bitmap, *referenceBitmap, name,
renderModeDescriptor);
}
return retval;
}
@ -728,13 +642,11 @@ public:
}
// Test: draw into a bitmap or pdf.
// Depending on flags, possibly compare to an expected image
// and possibly output a diff image if it fails to match.
// Depending on flags, possibly compare to an expected image.
ErrorBitfield test_drawing(GM* gm,
const ConfigData& gRec,
const char writePath [],
const char readPath [],
const char diffPath [],
GrContext* context,
GrRenderTarget* rt,
SkBitmap* bitmap) {
@ -758,14 +670,13 @@ public:
} else if (gRec.fBackend == kXPS_Backend) {
generate_xps(gm, document);
}
return handle_test_results(gm, gRec, writePath, readPath, diffPath,
return handle_test_results(gm, gRec, writePath, readPath,
"", *bitmap, &document, NULL);
}
ErrorBitfield test_deferred_drawing(GM* gm,
const ConfigData& gRec,
const SkBitmap& referenceBitmap,
const char diffPath [],
GrContext* context,
GrRenderTarget* rt) {
SkDynamicMemoryWStream document;
@ -778,7 +689,7 @@ public:
if (!generate_image(gm, gRec, context, rt, &bitmap, true)) {
return ERROR_NONE;
}
return handle_test_results(gm, gRec, NULL, NULL, diffPath,
return handle_test_results(gm, gRec, NULL, NULL,
"-deferred", bitmap, NULL,
&referenceBitmap);
}
@ -788,8 +699,7 @@ public:
ErrorBitfield test_pipe_playback(GM* gm,
const ConfigData& gRec,
const SkBitmap& referenceBitmap,
const char readPath [],
const char diffPath []) {
const char readPath []) {
ErrorBitfield errors = ERROR_NONE;
for (size_t i = 0; i < SK_ARRAY_COUNT(gPipeWritingFlagCombos); ++i) {
SkBitmap bitmap;
@ -804,7 +714,7 @@ public:
writer.endRecording();
SkString string("-pipe");
string.append(gPipeWritingFlagCombos[i].name);
errors |= handle_test_results(gm, gRec, NULL, NULL, diffPath,
errors |= handle_test_results(gm, gRec, NULL, NULL,
string.c_str(), bitmap, NULL,
&referenceBitmap);
if (errors != ERROR_NONE) {
@ -816,7 +726,7 @@ public:
ErrorBitfield test_tiled_pipe_playback(
GM* gm, const ConfigData& gRec, const SkBitmap& referenceBitmap,
const char readPath [], const char diffPath []) {
const char readPath []) {
ErrorBitfield errors = ERROR_NONE;
for (size_t i = 0; i < SK_ARRAY_COUNT(gPipeWritingFlagCombos); ++i) {
SkBitmap bitmap;
@ -831,7 +741,7 @@ public:
writer.endRecording();
SkString string("-tiled pipe");
string.append(gPipeWritingFlagCombos[i].name);
errors |= handle_test_results(gm, gRec, NULL, NULL, diffPath,
errors |= handle_test_results(gm, gRec, NULL, NULL,
string.c_str(), bitmap, NULL,
&referenceBitmap);
if (errors != ERROR_NONE) {
@ -920,7 +830,6 @@ static void usage(const char * argv0) {
// one, e.g.:
// [--replay|--noreplay]: whether to exercise SkPicture replay; default is yes
" [--nodeferred]: skip the deferred rendering test pass\n"
" [--diffPath|-d <path>]: write difference images into this directory\n"
" [--disable-missing-warning]: don't print a message to stderr if\n"
" unable to read a reference image for any tests (NOT default behavior)\n"
" [--enable-missing-warning]: print message to stderr (but don't fail) if\n"
@ -1042,7 +951,6 @@ int tool_main(int argc, char** argv) {
const char* writePath = NULL; // if non-null, where we write the originals
const char* writePicturePath = NULL; // if non-null, where we write serialized pictures
const char* readPath = NULL; // if non-null, were we read from to compare
const char* diffPath = NULL; // if non-null, where we write our diffs (from compare)
const char* resourcePath = NULL;// if non-null, where we read from for image resources
SkTDArray<const char*> fMatches;
@ -1108,12 +1016,6 @@ int tool_main(int argc, char** argv) {
}
} else if (strcmp(*argv, "--nodeferred") == 0) {
doDeferred = false;
} else if ((0 == strcmp(*argv, "--diffPath")) ||
(0 == strcmp(*argv, "-d"))) {
argv++;
if (argv < stop && **argv) {
diffPath = *argv;
}
} else if (strcmp(*argv, "--disable-missing-warning") == 0) {
gmmain.fNotifyMissingReadReference = false;
} else if (strcmp(*argv, "--nortree") == 0) {
@ -1386,7 +1288,7 @@ int tool_main(int argc, char** argv) {
if (ERROR_NONE == renderErrors) {
renderErrors |= gmmain.test_drawing(gm, config, writePath,
readPath, diffPath, GetGr(),
readPath, GetGr(),
renderTarget,
&comparisonBitmap);
}
@ -1396,7 +1298,7 @@ int tool_main(int argc, char** argv) {
kRaster_Backend == config.fBackend)) {
renderErrors |= gmmain.test_deferred_drawing(gm, config,
comparisonBitmap,
diffPath, GetGr(),
GetGr(),
renderTarget);
}
@ -1422,7 +1324,7 @@ int tool_main(int argc, char** argv) {
gmmain.generate_image_from_picture(gm, compareConfig, pict,
&bitmap);
pictErrors |= gmmain.handle_test_results(gm, compareConfig,
NULL, NULL, diffPath,
NULL, NULL,
"-replay", bitmap,
NULL,
&comparisonBitmap);
@ -1438,7 +1340,7 @@ int tool_main(int argc, char** argv) {
gmmain.generate_image_from_picture(gm, compareConfig, repict,
&bitmap);
pictErrors |= gmmain.handle_test_results(gm, compareConfig,
NULL, NULL, diffPath,
NULL, NULL,
"-serialize", bitmap,
NULL,
&comparisonBitmap);
@ -1463,7 +1365,7 @@ int tool_main(int argc, char** argv) {
gmmain.generate_image_from_picture(gm, compareConfig, pict,
&bitmap);
testErrors |= gmmain.handle_test_results(gm, compareConfig,
NULL, NULL, diffPath,
NULL, NULL,
"-rtree", bitmap,
NULL,
&comparisonBitmap);
@ -1486,7 +1388,7 @@ int tool_main(int argc, char** argv) {
suffix.appendScalar(replayScale);
}
testErrors |= gmmain.handle_test_results(gm, compareConfig,
NULL, NULL, diffPath,
NULL, NULL,
suffix.c_str(), bitmap,
NULL,
&comparisonBitmap);
@ -1501,7 +1403,7 @@ int tool_main(int argc, char** argv) {
if ((ERROR_NONE == testErrors) && doPipe) {
pipeErrors |= gmmain.test_pipe_playback(gm, compareConfig,
comparisonBitmap,
readPath, diffPath);
readPath);
}
if ((ERROR_NONE == testErrors) &&
@ -1509,8 +1411,7 @@ int tool_main(int argc, char** argv) {
doTiledPipe && !(gmFlags & GM::kSkipTiled_Flag)) {
pipeErrors |= gmmain.test_tiled_pipe_playback(gm, compareConfig,
comparisonBitmap,
readPath,
diffPath);
readPath);
}
testErrors |= pipeErrors;

View File

@ -1,6 +1,5 @@
reading from gm/tests/inputs/different-pixels
writing to gm/tests/outputs/compared-against-different-pixels/output-actual/images
drawing... dashing2 [640 480]
----- max pixel mismatch for 8888/dashing2 is 64
Ran 1 tests: 0 passed, 1 failed, 0 missing reference images
8888/dashing2 pixel_error 64
8888/dashing2 pixel_error

View File

@ -1,6 +1,5 @@
reading from gm/tests/inputs/identical-bytes
writing to gm/tests/outputs/compared-against-identical-bytes/output-actual/images
drawing... dashing2 [640 480]
----- max pixel mismatch for 8888/dashing2 is 64
Ran 1 tests: 0 passed, 1 failed, 0 missing reference images
8888/dashing2 pixel_error 64
8888/dashing2 pixel_error

View File

@ -1,6 +1,5 @@
reading from gm/tests/inputs/identical-pixels
writing to gm/tests/outputs/compared-against-identical-pixels/output-actual/images
drawing... dashing2 [640 480]
----- max pixel mismatch for 8888/dashing2 is 64
Ran 1 tests: 0 passed, 1 failed, 0 missing reference images
8888/dashing2 pixel_error 64
8888/dashing2 pixel_error