diff options
Diffstat (limited to 'tools/render_pictures_main.cpp')
-rw-r--r-- | tools/render_pictures_main.cpp | 65 |
1 files changed, 53 insertions, 12 deletions
diff --git a/tools/render_pictures_main.cpp b/tools/render_pictures_main.cpp index 70bc22132b..b067a652bd 100644 --- a/tools/render_pictures_main.cpp +++ b/tools/render_pictures_main.cpp @@ -32,6 +32,8 @@ DECLARE_string(readPath); DEFINE_bool(writeEncodedImages, false, "Any time the skp contains an encoded image, write it to a " "file rather than decoding it. Requires writePath to be set. Skips drawing the full " "skp to a file. Not compatible with deferImageDecoding."); +DEFINE_string(writeJsonSummaryPath, "", "File to write a JSON summary of image results to. " + "TODO(epoger): Currently, this only works if --writePath is also specified."); DEFINE_string2(writePath, w, "", "Directory to write the rendered images."); DEFINE_bool(writeWholeImage, false, "In tile mode, write the entire rendered image to a " "file, instead of an image for each tile."); @@ -132,9 +134,12 @@ static bool write_image_to_file(const void* buffer, size_t size, SkBitmap* bitma //////////////////////////////////////////////////////////////////////////////////////////////////// -static bool render_picture(const SkString& inputPath, const SkString* outputDir, - sk_tools::PictureRenderer& renderer, - SkBitmap** out) { +/** + * Called only by render_picture(). + */ +static bool render_picture_internal(const SkString& inputPath, const SkString* outputDir, + sk_tools::PictureRenderer& renderer, + SkBitmap** out) { SkString inputFilename; sk_tools::get_basename(&inputFilename, inputPath); @@ -241,11 +246,21 @@ private: }; } +/** + * Render the SKP file(s) within inputPath, writing their bitmap images into outputDir. + * + * @param inputPath path to an individual SKP file, or a directory of SKP files + * @param outputDir if not NULL, write the image(s) generated into this directory + * @param renderer PictureRenderer to use to render the SKPs + * @param jsonSummaryPtr if not NULL, add the image(s) generated to this summary + */ static bool render_picture(const SkString& inputPath, const SkString* outputDir, - sk_tools::PictureRenderer& renderer) { + sk_tools::PictureRenderer& renderer, + sk_tools::ImageResultsSummary *jsonSummaryPtr) { int diffs[256] = {0}; SkBitmap* bitmap = NULL; - bool success = render_picture(inputPath, + renderer.setJsonSummaryPtr(jsonSummaryPtr); + bool success = render_picture_internal(inputPath, FLAGS_writeWholeImage ? NULL : outputDir, renderer, FLAGS_validate || FLAGS_writeWholeImage ? &bitmap : NULL); @@ -272,8 +287,8 @@ static bool render_picture(const SkString& inputPath, const SkString* outputDir, } SkAutoTUnref<sk_tools::PictureRenderer> aurReferenceRenderer(referenceRenderer); - success = render_picture(inputPath, NULL, *referenceRenderer, - &referenceBitmap); + success = render_picture_internal(inputPath, NULL, *referenceRenderer, + &referenceBitmap); if (!success || NULL == referenceBitmap || NULL == referenceBitmap->getPixels()) { SkDebugf("Failed to draw the reference picture.\n"); @@ -327,7 +342,24 @@ static bool render_picture(const SkString& inputPath, const SkString* outputDir, if (FLAGS_writeWholeImage) { sk_tools::force_all_opaque(*bitmap); - if (NULL != outputDir && FLAGS_writeWholeImage) { + + if (NULL != jsonSummaryPtr) { + // EPOGER: This is a hacky way of constructing the filename associated with the + // image checksum; we basically are repeating the logic of make_output_filepath() + // and code below here, within here. + // It would be better for the filename (without outputDir) to be passed in here, + // and used both for the checksum file and writing into outputDir. + // + // EPOGER: what about including the config type within hashFilename? That way, + // we could combine results of different config types without conflicting filenames. + SkString hashFilename; + sk_tools::get_basename(&hashFilename, inputPath); + hashFilename.remove(hashFilename.size() - 4, 4); // Remove ".skp" + hashFilename.append(".png"); + jsonSummaryPtr->add(hashFilename.c_str(), *bitmap); + } + + if (NULL != outputDir) { SkString inputFilename; sk_tools::get_basename(&inputFilename, inputPath); SkString outputPath; @@ -347,7 +379,8 @@ static bool render_picture(const SkString& inputPath, const SkString* outputDir, static int process_input(const char* input, const SkString* outputDir, - sk_tools::PictureRenderer& renderer) { + sk_tools::PictureRenderer& renderer, + sk_tools::ImageResultsSummary *jsonSummaryPtr) { SkOSFile::Iter iter(input, "skp"); SkString inputFilename; int failures = 0; @@ -357,13 +390,13 @@ static int process_input(const char* input, const SkString* outputDir, SkString inputPath; SkString inputAsSkString(input); sk_tools::make_filepath(&inputPath, inputAsSkString, inputFilename); - if (!render_picture(inputPath, outputDir, renderer)) { + if (!render_picture(inputPath, outputDir, renderer, jsonSummaryPtr)) { ++failures; } } while(iter.next(&inputFilename)); } else if (SkStrEndsWith(input, ".skp")) { SkString inputPath(input); - if (!render_picture(inputPath, outputDir, renderer)) { + if (!render_picture(inputPath, outputDir, renderer, jsonSummaryPtr)) { ++failures; } } else { @@ -427,10 +460,15 @@ int tool_main(int argc, char** argv) { if (FLAGS_writePath.count() == 1) { outputDir.set(FLAGS_writePath[0]); } + sk_tools::ImageResultsSummary jsonSummary; + sk_tools::ImageResultsSummary* jsonSummaryPtr = NULL; + if (FLAGS_writeJsonSummaryPath.count() == 1) { + jsonSummaryPtr = &jsonSummary; + } int failures = 0; for (int i = 0; i < FLAGS_readPath.count(); i ++) { - failures += process_input(FLAGS_readPath[i], &outputDir, *renderer.get()); + failures += process_input(FLAGS_readPath[i], &outputDir, *renderer.get(), jsonSummaryPtr); } if (failures != 0) { SkDebugf("Failed to render %i pictures.\n", failures); @@ -447,6 +485,9 @@ int tool_main(int argc, char** argv) { } #endif #endif + if (FLAGS_writeJsonSummaryPath.count() == 1) { + jsonSummary.writeToFile(FLAGS_writeJsonSummaryPath[0]); + } return 0; } |