diff options
-rw-r--r-- | BUILD.gn | 1 | ||||
-rw-r--r-- | bench/nanobench.cpp | 66 | ||||
-rw-r--r-- | gyp/bench.gypi | 1 |
3 files changed, 57 insertions, 11 deletions
@@ -803,6 +803,7 @@ if (skia_enable_tools) { ] deps = [ ":bench", + ":experimental_svg_model", ":flags", ":gm", ":gpu_tool_utils", diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp index 238e8f6029..26ba05ff4f 100644 --- a/bench/nanobench.cpp +++ b/bench/nanobench.cpp @@ -40,6 +40,7 @@ #include "SkPictureUtils.h" #include "SkString.h" #include "SkSurface.h" +#include "SkSVGDOM.h" #include "SkTaskGroup.h" #include "SkThreadUtils.h" #include "ThermalManager.h" @@ -126,6 +127,8 @@ DEFINE_string(sourceType, "", DEFINE_string(benchType, "", "Apply usual --match rules to bench type: micro, recording, playback, skcodec, etc."); +DEFINE_string(svgs, "", "Directory to read SVGs from, or a single SVG file."); + static double now_ms() { return SkTime::GetNSecs() * 1e-6; } static SkString humanize(double ms) { @@ -550,6 +553,21 @@ static void cleanup_run(Target* target) { #endif } +static void collect_files(const SkCommandLineFlags::StringArray& paths, const char* ext, + SkTArray<SkString>* list) { + for (int i = 0; i < paths.count(); ++i) { + if (SkStrEndsWith(paths[i], ext)) { + list->push_back(SkString(paths[i])); + } else { + SkOSFile::Iter it(paths[i], ext); + SkString path; + while (it.next(&path)) { + list->push_back(SkOSPath::Join(paths[i], path.c_str())); + } + } + } +} + class BenchmarkStream { public: BenchmarkStream() : fBenches(BenchRegistry::Head()) @@ -557,6 +575,7 @@ public: , fCurrentRecording(0) , fCurrentScale(0) , fCurrentSKP(0) + , fCurrentSVG(0) , fCurrentUseMPD(0) , fCurrentCodec(0) , fCurrentAndroidCodec(0) @@ -567,17 +586,8 @@ public: , fCurrentSubsetType(0) , fCurrentSampleSize(0) , fCurrentAnimSKP(0) { - for (int i = 0; i < FLAGS_skps.count(); i++) { - if (SkStrEndsWith(FLAGS_skps[i], ".skp")) { - fSKPs.push_back() = FLAGS_skps[i]; - } else { - SkOSFile::Iter it(FLAGS_skps[i], ".skp"); - SkString path; - while (it.next(&path)) { - fSKPs.push_back() = SkOSPath::Join(FLAGS_skps[0], path.c_str()); - } - } - } + collect_files(FLAGS_skps, ".skp", &fSKPs); + collect_files(FLAGS_svgs, ".svg", &fSVGs); if (4 != sscanf(FLAGS_clip[0], "%d,%d,%d,%d", &fClip.fLeft, &fClip.fTop, &fClip.fRight, &fClip.fBottom)) { @@ -636,6 +646,26 @@ public: return SkPicture::MakeFromStream(stream.get()); } + static sk_sp<SkPicture> ReadSVGPicture(const char* path) { + SkFILEStream stream(path); + if (!stream.isValid()) { + SkDebugf("Could not read %s.\n", path); + return nullptr; + } + + // TODO: use intrinsic size? make tunable via flag? + static const SkSize kContainerSize = SkSize::Make(128, 128); + sk_sp<SkSVGDOM> svgDom = SkSVGDOM::MakeFromStream(stream, kContainerSize); + if (!svgDom) { + SkDebugf("Could not parse %s.\n", path); + return nullptr; + } + + SkPictureRecorder recorder; + svgDom->render(recorder.beginRecording(kContainerSize.width(), kContainerSize.height())); + return recorder.finishRecordingAsPicture(); + } + Benchmark* next() { SkAutoTDelete<Benchmark> bench; do { @@ -712,7 +742,19 @@ public: fCurrentUseMPD = 0; fCurrentSKP++; } + + while (fCurrentSVG++ < fSVGs.count()) { + const char* path = fSVGs[fCurrentSVG - 1].c_str(); + if (sk_sp<SkPicture> pic = ReadSVGPicture(path)) { + fSourceType = "svg"; + fBenchType = "playback"; + return new SKPBench(SkOSPath::Basename(path).c_str(), pic.get(), fClip, + fScales[fCurrentScale], false, FLAGS_loopSKP); + } + } + fCurrentSKP = 0; + fCurrentSVG = 0; fCurrentScale++; } @@ -987,6 +1029,7 @@ private: SkIRect fClip; SkTArray<SkScalar> fScales; SkTArray<SkString> fSKPs; + SkTArray<SkString> fSVGs; SkTArray<bool> fUseMPDs; SkTArray<SkString> fImages; SkTArray<SkString> fColorImages; @@ -1001,6 +1044,7 @@ private: int fCurrentRecording; int fCurrentScale; int fCurrentSKP; + int fCurrentSVG; int fCurrentUseMPD; int fCurrentCodec; int fCurrentAndroidCodec; diff --git a/gyp/bench.gypi b/gyp/bench.gypi index a58e66e091..ded8ff4c5f 100644 --- a/gyp/bench.gypi +++ b/gyp/bench.gypi @@ -19,6 +19,7 @@ 'etc1.gyp:libetc1', 'pdf.gyp:pdf', 'skia_lib.gyp:skia_lib', + 'svg.gyp:svgdom', 'tools.gyp:resources', 'tools.gyp:sk_tool_utils', 'tools.gyp:url_data_manager', |