aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--BUILD.gn1
-rw-r--r--bench/nanobench.cpp66
-rw-r--r--gyp/bench.gypi1
3 files changed, 57 insertions, 11 deletions
diff --git a/BUILD.gn b/BUILD.gn
index 8d53e51f2a..f14a027af5 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -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',