Index: bench/nanobench.cpp |
diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp |
index 238e8f6029b8882c462b13c99e4b39269f05484e..26ba05ff4f15bc583a00372107e8a873169c0bc4 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; |