| Index: tools/skimage_main.cpp
|
| diff --git a/tools/skimage_main.cpp b/tools/skimage_main.cpp
|
| index 9262958d7187ea8257bc60cf922f63a09f5e9ead..107d3bfdb89cc5dd9faa26eb4e5b219dbd38c241 100644
|
| --- a/tools/skimage_main.cpp
|
| +++ b/tools/skimage_main.cpp
|
| @@ -23,11 +23,12 @@
|
| __SK_FORCE_IMAGE_DECODER_LINKING;
|
|
|
| DEFINE_string(createExpectationsPath, "", "Path to write JSON expectations.");
|
| +DEFINE_string(mismatchPath, "", "Folder to write mismatched images to.");
|
| DEFINE_string2(readPath, r, "", "Folder(s) and files to decode images. Required.");
|
| DEFINE_string(readExpectationsPath, "", "Path to read JSON expectations from.");
|
| -DEFINE_string2(writePath, w, "", "Write rendered images into this directory.");
|
| DEFINE_bool(reencode, true, "Reencode the images to test encoding.");
|
| DEFINE_bool(testSubsetDecoding, true, "Test decoding subsets of images.");
|
| +DEFINE_string2(writePath, w, "", "Write rendered images into this directory.");
|
|
|
| struct Format {
|
| SkImageEncoder::Type fType;
|
| @@ -101,23 +102,8 @@ static SkTArray<SkString, false> gFailedSubsetDecodes;
|
| // previously written using createExpectationsPath.
|
| SkAutoTUnref<skiagm::JsonExpectationsSource> gJsonExpectations;
|
|
|
| -static bool write_bitmap(const char outName[], SkBitmap* bm) {
|
| - SkBitmap bitmap8888;
|
| - if (SkBitmap::kARGB_8888_Config != bm->config()) {
|
| - if (!bm->copyTo(&bitmap8888, SkBitmap::kARGB_8888_Config)) {
|
| - return false;
|
| - }
|
| - bm = &bitmap8888;
|
| - }
|
| - // FIXME: This forces all pixels to be opaque, like the many implementations
|
| - // of force_all_opaque. These should be unified if they cannot be eliminated.
|
| - SkAutoLockPixels lock(*bm);
|
| - for (int y = 0; y < bm->height(); y++) {
|
| - for (int x = 0; x < bm->width(); x++) {
|
| - *bm->getAddr32(x, y) |= (SK_A32_MASK << SK_A32_SHIFT);
|
| - }
|
| - }
|
| - return SkImageEncoder::EncodeFile(outName, *bm, SkImageEncoder::kPNG_Type, 100);
|
| +static bool write_bitmap(const char outName[], const SkBitmap& bm) {
|
| + return SkImageEncoder::EncodeFile(outName, bm, SkImageEncoder::kPNG_Type, 100);
|
| }
|
|
|
| /**
|
| @@ -183,31 +169,31 @@ static void write_expectations(const SkBitmap& bitmap, const char* filename) {
|
| * @param filename String used to find the expected value.
|
| * @return bool True in any of these cases:
|
| * - the bitmap matches the expectation.
|
| - * - there is no expectations file.
|
| * False in any of these cases:
|
| + * - there is no expectations file.
|
| * - there is an expectations file, but no expectation for this bitmap.
|
| * - there is an expectation for this bitmap, but it did not match.
|
| * - expectation could not be computed from the bitmap.
|
| */
|
| static bool compare_to_expectations_if_necessary(const SkBitmap& bitmap, const char* filename,
|
| SkTArray<SkString, false>* failureArray) {
|
| - if (NULL == gJsonExpectations.get()) {
|
| - return true;
|
| - }
|
| -
|
| - skiagm::Expectations jsExpectation = gJsonExpectations->get(filename);
|
| - if (jsExpectation.empty()) {
|
| + skiagm::GmResultDigest resultDigest(bitmap);
|
| + if (!resultDigest.isValid()) {
|
| if (failureArray != NULL) {
|
| - failureArray->push_back().printf("decoded %s, but could not find expectation.",
|
| + failureArray->push_back().printf("decoded %s, but could not create a GmResultDigest.",
|
| filename);
|
| }
|
| return false;
|
| }
|
|
|
| - skiagm::GmResultDigest resultDigest(bitmap);
|
| - if (!resultDigest.isValid()) {
|
| + if (NULL == gJsonExpectations.get()) {
|
| + return false;
|
| + }
|
| +
|
| + skiagm::Expectations jsExpectation = gJsonExpectations->get(filename);
|
| + if (jsExpectation.empty()) {
|
| if (failureArray != NULL) {
|
| - failureArray->push_back().printf("decoded %s, but could not create a GmResultDigest.",
|
| + failureArray->push_back().printf("decoded %s, but could not find expectation.",
|
| filename);
|
| }
|
| return false;
|
| @@ -270,7 +256,7 @@ static bool write_subset(const char* writePath, const char* filename, const char
|
| SkString suffix = SkStringPrintf("_%s.png", subsetDim);
|
| SkString outPath;
|
| make_outname(&outPath, dir.c_str(), filename, suffix.c_str());
|
| - SkAssertResult(write_bitmap(outPath.c_str(), bitmapFromDecodeSubset));
|
| + SkAssertResult(write_bitmap(outPath.c_str(), *bitmapFromDecodeSubset));
|
| gSuccessfulSubsetDecodes.push_back().printf("\twrote %s", outPath.c_str());
|
|
|
| // Also use extractSubset from the original for visual comparison.
|
| @@ -292,7 +278,7 @@ static bool write_subset(const char* writePath, const char* filename, const char
|
| }
|
|
|
| make_outname(&outPath, dirExtracted.c_str(), filename, suffix.c_str());
|
| - SkAssertResult(write_bitmap(outPath.c_str(), &extractedSubset));
|
| + SkAssertResult(write_bitmap(outPath.c_str(), extractedSubset));
|
| return true;
|
| }
|
|
|
| @@ -326,6 +312,24 @@ static void decodeFileAndWrite(const char srcPath[], const SkString* writePath)
|
| if (compare_to_expectations_if_necessary(bitmap, filename, &gDecodeFailures)) {
|
| gSuccessfulDecodes.push_back().printf("%s [%d %d]", srcPath, bitmap.width(),
|
| bitmap.height());
|
| + } else if (!FLAGS_mismatchPath.isEmpty()) {
|
| + SkString outPath;
|
| + make_outname(&outPath, FLAGS_mismatchPath[0], srcPath, ".png");
|
| + if (write_bitmap(outPath.c_str(), bitmap)) {
|
| + gSuccessfulDecodes.push_back().appendf("\twrote %s", outPath.c_str());
|
| + } else {
|
| + gEncodeFailures.push_back().set(outPath);
|
| + }
|
| + }
|
| +
|
| + if (writePath != NULL) {
|
| + SkString outPath;
|
| + make_outname(&outPath, writePath->c_str(), srcPath, ".png");
|
| + if (write_bitmap(outPath.c_str(), bitmap)) {
|
| + gSuccessfulDecodes.push_back().appendf("\twrote %s", outPath.c_str());
|
| + } else {
|
| + gEncodeFailures.push_back().set(outPath);
|
| + }
|
| }
|
|
|
| write_expectations(bitmap, filename);
|
| @@ -353,6 +357,9 @@ static void decodeFileAndWrite(const char srcPath[], const SkString* writePath)
|
| &gFailedSubsetDecodes)) {
|
| gSuccessfulSubsetDecodes.push_back().printf("Decoded subset %s from %s",
|
| subsetDim.c_str(), srcPath);
|
| + } else if (!FLAGS_mismatchPath.isEmpty()) {
|
| + write_subset(FLAGS_mismatchPath[0], filename, subsetDim.c_str(),
|
| + &bitmapFromDecodeSubset, rect, bitmap);
|
| }
|
|
|
| write_expectations(bitmapFromDecodeSubset, subsetName.c_str());
|
| @@ -411,8 +418,7 @@ static void decodeFileAndWrite(const char srcPath[], const SkString* writePath)
|
|
|
| SkAutoTUnref<SkData> data(wStream.copyToData());
|
| if (writePath != NULL && type != SkImageEncoder::kPNG_Type) {
|
| - // Write the encoded data to a file. Do not write to PNG, which will be written later,
|
| - // regardless of the input format.
|
| + // Write the encoded data to a file. Do not write to PNG, which was already written.
|
| SkString outPath;
|
| make_outname(&outPath, writePath->c_str(), srcPath, suffix_for_type(type));
|
| SkFILEWStream file(outPath.c_str());
|
| @@ -435,16 +441,6 @@ static void decodeFileAndWrite(const char srcPath[], const SkString* writePath)
|
| srcPath, suffix_for_type(type));
|
| }
|
| }
|
| -
|
| - if (writePath != NULL) {
|
| - SkString outPath;
|
| - make_outname(&outPath, writePath->c_str(), srcPath, ".png");
|
| - if (write_bitmap(outPath.c_str(), &bitmap)) {
|
| - gSuccessfulDecodes.push_back().appendf("\twrote %s", outPath.c_str());
|
| - } else {
|
| - gEncodeFailures.push_back().set(outPath);
|
| - }
|
| - }
|
| }
|
|
|
| ///////////////////////////////////////////////////////////////////////////////
|
| @@ -530,9 +526,7 @@ int tool_main(int argc, char** argv) {
|
| Json::Value root = skiagm::CreateJsonTree(gExpectationsToWrite, nullValue, nullValue,
|
| nullValue, nullValue);
|
| std::string jsonStdString = root.toStyledString();
|
| - SkString path = SkStringPrintf("%s%cresults.json", FLAGS_createExpectationsPath[0],
|
| - SkPATH_SEPARATOR);
|
| - SkFILEWStream stream(path.c_str());
|
| + SkFILEWStream stream(FLAGS_createExpectationsPath[0]);
|
| stream.write(jsonStdString.c_str(), jsonStdString.length());
|
| }
|
| // Add some space, since codecs may print warnings without newline.
|
|
|