[SVGDom] Deferred SampleApp parsing
authorfmalita <fmalita@chromium.org>
Mon, 15 Aug 2016 14:48:47 +0000 (07:48 -0700)
committerCommit bot <commit-bot@chromium.org>
Mon, 15 Aug 2016 14:48:47 +0000 (07:48 -0700)
Parse SVG files in onOnceBeforeDraw() rather than ctor, to avoid
front-loading a bunch of work when passed a loarge number of SVGs.

R=stephana@google.com,robertphillips@google.com
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2245993002

Review-Url: https://codereview.chromium.org/2245993002

samplecode/SampleApp.cpp
samplecode/SampleSVGFile.cpp

index 439b699..6297030 100644 (file)
@@ -80,14 +80,14 @@ public:
     }
 };
 
-extern SampleView* CreateSampleSVGFileView(const char filename[]);
+extern SampleView* CreateSampleSVGFileView(const SkString& filename);
 
 class SVGFileFactory : public SkViewFactory {
     SkString fFilename;
 public:
     SVGFileFactory(const SkString& filename) : fFilename(filename) {}
     SkView* operator() () const override {
-        return CreateSampleSVGFileView(fFilename.c_str());
+        return CreateSampleSVGFileView(fFilename);
     }
 };
 
index 12c91a9..a4b5b34 100644 (file)
@@ -17,26 +17,27 @@ namespace {
 
 class SVGFileView : public SampleView {
 public:
-    SVGFileView(const char path[])
-        : fLabel(SkStringPrintf("[%s]", SkOSPath::Basename(path).c_str())) {
-        SkFILEStream svgStream(path);
+    SVGFileView(const SkString& path)
+        : fPath(path), fLabel(SkStringPrintf("[%s]", SkOSPath::Basename(path.c_str()).c_str())) {}
+    virtual ~SVGFileView() = default;
+
+protected:
+    void onOnceBeforeDraw() override {
+        SkFILEStream svgStream(fPath.c_str());
         if (!svgStream.isValid()) {
-            SkDebugf("file not found: \"path\"\n", path);
+            SkDebugf("file not found: \"path\"\n", fPath.c_str());
             return;
         }
 
         SkDOM xmlDom;
         if (!xmlDom.build(svgStream)) {
-            SkDebugf("XML parsing failed: \"path\"\n", path);
+            SkDebugf("XML parsing failed: \"path\"\n", fPath.c_str());
             return;
         }
 
         fDom = SkSVGDOM::MakeFromDOM(xmlDom, SkSize::Make(this->width(), this->height()));
     }
 
-    virtual ~SVGFileView() = default;
-
-protected:
     void onDrawContent(SkCanvas* canvas) override {
         if (fDom) {
             fDom->render(canvas);
@@ -61,6 +62,7 @@ protected:
     }
 private:
     sk_sp<SkSVGDOM> fDom;
+    SkString        fPath;
     SkString        fLabel;
 
     typedef SampleView INHERITED;
@@ -68,7 +70,7 @@ private:
 
 } // anonymous namespace
 
-SampleView* CreateSampleSVGFileView(const char filename[]);
-SampleView* CreateSampleSVGFileView(const char filename[]) {
+SampleView* CreateSampleSVGFileView(const SkString& filename);
+SampleView* CreateSampleSVGFileView(const SkString& filename) {
     return new SVGFileView(filename);
 }