aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar keyar@chromium.org <keyar@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-07-09 18:32:08 +0000
committerGravatar keyar@chromium.org <keyar@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2012-07-09 18:32:08 +0000
commitd1dc920097194e3342355185528c84408a9929c8 (patch)
treea65d0998c09fa0625fd635ff97d662cf45ebeeca
parent3a67a668dbdc3a6bba68700a6dfdef8164ae0c69 (diff)
Allow specific files and multiple inputs for picture testing tools.
Changed the render_pictures, bench_pictures and test_pictures.py so that multiple inputs can be given. Furthermore, specific files can also be specified. Unit tests have also been added for picture_utils.cpp. Review URL: https://codereview.appspot.com/6345054 git-svn-id: http://skia.googlecode.com/svn/trunk@4486 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r--gyp/tests.gyp3
-rw-r--r--tools/bench_pictures_main.cpp55
-rw-r--r--tools/picture_utils.cpp43
-rw-r--r--tools/picture_utils.h6
-rw-r--r--tools/render_pictures_main.cpp44
-rw-r--r--tools/test_pictures.py25
6 files changed, 127 insertions, 49 deletions
diff --git a/gyp/tests.gyp b/gyp/tests.gyp
index 22aa3c43d6..cdf755ba5a 100644
--- a/gyp/tests.gyp
+++ b/gyp/tests.gyp
@@ -13,6 +13,7 @@
'../src/gpu',
'../src/pdf',
'../src/utils',
+ '../tools/',
],
'sources': [
'../tests/AAClipTest.cpp',
@@ -58,6 +59,7 @@
'../tests/PathMeasureTest.cpp',
'../tests/PathTest.cpp',
'../tests/PDFPrimitivesTest.cpp',
+ '../tests/PictureUtilsTest.cpp',
'../tests/PointTest.cpp',
'../tests/PremulAlphaRoundTripTest.cpp',
'../tests/QuickRejectTest.cpp',
@@ -96,6 +98,7 @@
'images.gyp:images',
'ports.gyp:ports',
'pdf.gyp:pdf',
+ 'tools.gyp:picture_utils',
'utils.gyp:utils',
],
},
diff --git a/tools/bench_pictures_main.cpp b/tools/bench_pictures_main.cpp
index 355deb6817..e06a63bdb1 100644
--- a/tools/bench_pictures_main.cpp
+++ b/tools/bench_pictures_main.cpp
@@ -37,13 +37,13 @@ static void usage(const char* argv0) {
SkDebugf("SkPicture benchmarking tool\n");
SkDebugf("\n"
"Usage: \n"
-" %s <inputDir>\n"
+" %s <inputDir>...\n"
" [--repeat] [--tile width height]"
, argv0);
SkDebugf("\n\n");
SkDebugf(
-" inputDir: directory to read the serialized SkPicture files."
-" Files are expected to have the .skp extension.\n\n");
+" inputDir: A list of directories and files to use as input.\n"
+" Files are expected to have the .skp extension.\n\n");
SkDebugf(
" --repeat : "
"Set the number of times to repeat each test."
@@ -133,13 +133,10 @@ static void run_tile_benchmark(SkPicture* picture, const SkBitmap& bitmap,
options.fTileHeight, timer.fWall / options.fRepeats);
}
-static void run_benchmark(const char* inputDir,
- const SkString& inputFilename,
- const Options& options) {
+static void run_single_benchmark(const SkString& inputPath,
+ const Options& options) {
SkFILEStream inputStream;
- SkString inputPath;
- sk_tools::make_filepath(&inputPath, inputDir, inputFilename);
inputStream.setPath(inputPath.c_str());
if (!inputStream.isValid()) {
SkDebugf("Could not open file %s\n", inputPath.c_str());
@@ -150,13 +147,16 @@ static void run_benchmark(const char* inputDir,
SkBitmap bitmap;
sk_tools::setup_bitmap(&bitmap, picture.width(), picture.height());
+ SkString filename;
+ sk_tools::get_basename(&filename, inputPath);
printf("running bench [%i %i] %s ", picture.width(), picture.height(),
- inputFilename.c_str());
+ filename.c_str());
+
options.fBenchmark(&picture, bitmap, options);
}
static void parse_commandline(int argc, char* const argv[],
- const char** inputDir, Options* options) {
+ SkTArray<SkString>* inputs, Options* options) {
const char* argv0 = argv[0];
char* const* stop = argv + argc;
@@ -205,32 +205,39 @@ static void parse_commandline(int argc, char* const argv[],
usage(argv0);
exit(0);
} else {
- if (NULL == *inputDir) {
- *inputDir = *argv;
- } else {
- usage(argv0);
- exit(-1);
- }
+ inputs->push_back(SkString(*argv));
}
}
- if (NULL == *inputDir) {
+ if (inputs->count() < 1) {
usage(argv0);
exit(-1);
}
+}
+
+static void process_input(const SkString& input, const Options& options) {
+ SkOSFile::Iter iter(input.c_str(), "skp");
+ SkString inputFilename;
+ if (iter.next(&inputFilename)) {
+ do {
+ SkString inputPath;
+ sk_tools::make_filepath(&inputPath, input.c_str(),
+ inputFilename);
+ run_single_benchmark(inputPath, options);
+ } while(iter.next(&inputFilename));
+ } else {
+ run_single_benchmark(input, options);
+ }
}
int main(int argc, char* const argv[]) {
- const char* inputDir = NULL;
+ SkTArray<SkString> inputs;
Options options;
- parse_commandline(argc, argv, &inputDir, &options);
-
- SkOSFile::Iter iter(inputDir, "skp");
- SkString inputFilename;
+ parse_commandline(argc, argv, &inputs, &options);
- while(iter.next(&inputFilename)) {
- run_benchmark(inputDir, inputFilename, options);
+ for (int i = 0; i < inputs.count(); ++i) {
+ process_input(inputs[i], options);
}
}
diff --git a/tools/picture_utils.cpp b/tools/picture_utils.cpp
index 6a9e1f51f7..98351b84b5 100644
--- a/tools/picture_utils.cpp
+++ b/tools/picture_utils.cpp
@@ -22,6 +22,49 @@ namespace sk_tools {
path->append(name);
}
+ namespace {
+ bool is_path_seperator(const char chr) {
+#if defined(SK_BUILD_FOR_WIN)
+ return chr == '\\' || chr == '/';
+#else
+ return chr == '/';
+#endif
+ }
+ }
+
+ void get_basename(SkString* basename, const SkString& path) {
+ if (path.size() == 0) {
+ basename->reset();
+ return;
+ }
+
+ size_t end = path.size() - 1;
+
+ // Paths pointing to directories often have a trailing slash,
+ // we remove it so the name is not empty
+ if (is_path_seperator(path[end])) {
+ if (end == 0) {
+ basename->reset();
+ return;
+ }
+
+ end -= 1;
+ }
+
+ size_t i = end;
+ do {
+ --i;
+ if (is_path_seperator(path[i])) {
+ const char* basenameStart = path.c_str() + i + 1;
+ size_t basenameLength = end - i;
+ basename->set(basenameStart, basenameLength);
+ return;
+ }
+ } while (i > 0);
+
+ basename->set(path.c_str(), end + 1);
+ }
+
void setup_bitmap(SkBitmap* bitmap, int width, int height) {
bitmap->setConfig(SkBitmap::kARGB_8888_Config, width, height);
bitmap->allocPixels();
diff --git a/tools/picture_utils.h b/tools/picture_utils.h
index 21651cd322..18efcb79c2 100644
--- a/tools/picture_utils.h
+++ b/tools/picture_utils.h
@@ -19,6 +19,12 @@ namespace sk_tools {
// forward slash into path.
void make_filepath(SkString* path, const char* dir, const SkString& name);
+ // Returns the last part of the path (file name or leaf directory name)
+ //
+ // This basically just looks for a foward slash or backslash (windows
+ // only)
+ void get_basename(SkString* basename, const SkString& path);
+
// Prepares the bitmap so that it can be written.
//
// Specifically, it configures the bitmap, allocates pixels and then
diff --git a/tools/render_pictures_main.cpp b/tools/render_pictures_main.cpp
index 930089bdff..da7df634b3 100644
--- a/tools/render_pictures_main.cpp
+++ b/tools/render_pictures_main.cpp
@@ -21,10 +21,11 @@ static void usage(const char* argv0) {
SkDebugf("SkPicture rendering tool\n");
SkDebugf("\n"
"Usage: \n"
-" %s <inputDir> <outputDir> \n\n"
+" %s <input>... <outputDir> \n\n"
, argv0);
SkDebugf(
-" inputDir: directory to read the serialized SkPicture files.\n");
+" input: A list of directories and files to use as input.\n"
+" Files are expected to have the .skp extension.\n");
SkDebugf(
" outputDir: directory to write the rendered images.\n");
}
@@ -73,12 +74,11 @@ static void write_output(const char* outputDir, const SkString& inputFilename,
}
}
-static void render_picture(const char* inputDir, const char* outputDir,
- const SkString& inputFilename) {
- SkFILEStream inputStream;
+static void render_picture(const SkString& inputPath, const char* outputDir) {
+ SkString inputFilename;
+ sk_tools::get_basename(&inputFilename, inputPath);
- SkString inputPath;
- sk_tools::make_filepath(&inputPath, inputDir, inputFilename);
+ SkFILEStream inputStream;
inputStream.setPath(inputPath.c_str());
if (!inputStream.isValid()) {
SkDebugf("Could not open file %s\n", inputPath.c_str());
@@ -91,20 +91,32 @@ static void render_picture(const char* inputDir, const char* outputDir,
write_output(outputDir, inputFilename, bitmap);
}
+static void process_input(const char* input, const char* outputDir) {
+ SkOSFile::Iter iter(input, "skp");
+ SkString inputFilename;
+
+ if (iter.next(&inputFilename)) {
+ do {
+ SkString inputPath;
+ sk_tools::make_filepath(&inputPath, input, inputFilename);
+ render_picture(inputPath, outputDir);
+ } while(iter.next(&inputFilename));
+ } else {
+ SkString inputPath(input);
+ render_picture(inputPath, outputDir);
+ }
+}
+
int main(int argc, char* const argv[]) {
- const char* inputDir;
const char* outputDir;
- if (argc != 3) {
+ if (argc < 3) {
usage(argv[0]);
+ return -1;
}
- inputDir = argv[1];
- outputDir = argv[2];
-
- SkOSFile::Iter iter(inputDir, "skp");
- SkString inputFilename;
+ outputDir = argv[argc - 1];
- while(iter.next(&inputFilename)) {
- render_picture(inputDir, outputDir, inputFilename);
+ for (int i = 1; i < argc - 1; i ++) {
+ process_input(argv[i], outputDir);
}
}
diff --git a/tools/test_pictures.py b/tools/test_pictures.py
index 253bf4e50d..21eaa40431 100644
--- a/tools/test_pictures.py
+++ b/tools/test_pictures.py
@@ -16,11 +16,12 @@ import sys
import shutil
import tempfile
-USAGE_STRING = 'Usage: %s inputDir expectedDir [renderDir [diffDir]]'
+USAGE_STRING = 'Usage: %s input... expectedDir'
HELP_STRING = '''
-Compares the renderings of serialized SkPicture files in inputDir with the
-images in expectedDir.
+Compares the renderings of serialized SkPicture files and directories specified
+by input with the images in expectedDir. Note, files in directoriers are
+expected to end with .skp.
'''
def RunCommand(command):
@@ -49,16 +50,17 @@ def FindPathToProgram(program):
'build %s?' % (program, possible_paths, program))
-def RenderImages(input_dir, render_dir):
+def RenderImages(inputs, render_dir):
"""Renders the serialized SkPictures.
Uses the render_pictures program to do the rendering.
- @param input_dir the location to read the serlialized SkPictures
+ @param inputs the location(s) to read the serlialized SkPictures
@param render_dir the location to write out the rendered images
"""
renderer_path = FindPathToProgram('render_pictures')
- RunCommand('%s %s %s' % (renderer_path, input_dir, render_dir))
+ inputs_as_string = " ".join(inputs)
+ RunCommand('%s %s %s' % (renderer_path, inputs_as_string, render_dir))
def DiffImages(expected_dir, comparison_dir, diff_dir):
@@ -107,8 +109,13 @@ def Main(args):
options, arguments = parser.parse_args(args)
- input_dir = arguments[1]
- expected_dir = arguments[2]
+ if (len(arguments) < 3):
+ print("Expected at least one input and one ouput folder.")
+ parser.print_help()
+ sys.exit(-1)
+
+ inputs = arguments[1:-1]
+ expected_dir = arguments[-1]
if (options.render_dir):
render_dir = options.render_dir
@@ -121,7 +128,7 @@ def Main(args):
diff_dir = tempfile.mkdtemp()
try:
- RenderImages(input_dir, render_dir)
+ RenderImages(inputs, render_dir)
DiffImages(expected_dir, render_dir, diff_dir)
finally:
Cleanup(options, render_dir, diff_dir)