16ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita/*
26ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita * Copyright 2016 Google Inc.
36ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita *
46ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita * Use of this source code is governed by a BSD-style license that can be
56ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita * found in the LICENSE file.
66ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita */
76ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita
86ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita#include "SampleCode.h"
96ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita#include "SkCanvas.h"
106ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita#include "SkDOM.h"
11b83cdbcbb0829bf6e0c9cb2c7d9a0ff460f7f431fmalita#include "SkOSFile.h"
12bf111d7bc9ba3857433e30eae27f0272c34ed0fbBen Wagner#include "SkOSPath.h"
136ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita#include "SkStream.h"
146ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita#include "SkSVGDOM.h"
156ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita#include "SkView.h"
166ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita
176ceef3dd67617c5f4572ada98d5ee85777d2db99fmalitanamespace {
186ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita
196ceef3dd67617c5f4572ada98d5ee85777d2db99fmalitaclass SVGFileView : public SampleView {
206ceef3dd67617c5f4572ada98d5ee85777d2db99fmalitapublic:
21851d68aa5692103db67433354c7421863d01dbdafmalita    SVGFileView(const SkString& path)
22851d68aa5692103db67433354c7421863d01dbdafmalita        : fPath(path), fLabel(SkStringPrintf("[%s]", SkOSPath::Basename(path.c_str()).c_str())) {}
23d3b65972aad96453ff4510caa3e25a2b847c6d1eBrian Salomon    ~SVGFileView() override = default;
24851d68aa5692103db67433354c7421863d01dbdafmalita
25851d68aa5692103db67433354c7421863d01dbdafmalitaprotected:
26851d68aa5692103db67433354c7421863d01dbdafmalita    void onOnceBeforeDraw() override {
27851d68aa5692103db67433354c7421863d01dbdafmalita        SkFILEStream svgStream(fPath.c_str());
286ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita        if (!svgStream.isValid()) {
29851d68aa5692103db67433354c7421863d01dbdafmalita            SkDebugf("file not found: \"path\"\n", fPath.c_str());
306ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita            return;
316ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita        }
326ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita
336ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita        SkDOM xmlDom;
346ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita        if (!xmlDom.build(svgStream)) {
35851d68aa5692103db67433354c7421863d01dbdafmalita            SkDebugf("XML parsing failed: \"path\"\n", fPath.c_str());
366ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita            return;
376ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita        }
386ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita
39e1baa7c105dad0f301ce34e5d6d1aa329334ef8cfmalita        fDom = SkSVGDOM::MakeFromDOM(xmlDom);
40e1baa7c105dad0f301ce34e5d6d1aa329334ef8cfmalita        if (fDom) {
41e1baa7c105dad0f301ce34e5d6d1aa329334ef8cfmalita            fDom->setContainerSize(SkSize::Make(this->width(), this->height()));
42e1baa7c105dad0f301ce34e5d6d1aa329334ef8cfmalita        }
436ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita    }
446ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita
456ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita    void onDrawContent(SkCanvas* canvas) override {
466ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita        if (fDom) {
476ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita            fDom->render(canvas);
486ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita        }
496ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita    }
506ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita
516ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita    void onSizeChange() override {
526ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita        if (fDom) {
536ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita            fDom->setContainerSize(SkSize::Make(this->width(), this->height()));
546ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita        }
556ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita
566ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita        this->INHERITED::onSizeChange();
576ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita    }
586ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita
59b83cdbcbb0829bf6e0c9cb2c7d9a0ff460f7f431fmalita    bool onQuery(SkEvent* evt) override {
60b83cdbcbb0829bf6e0c9cb2c7d9a0ff460f7f431fmalita        if (SampleCode::TitleQ(*evt)) {
61b83cdbcbb0829bf6e0c9cb2c7d9a0ff460f7f431fmalita            SampleCode::TitleR(evt, fLabel.c_str());
62b83cdbcbb0829bf6e0c9cb2c7d9a0ff460f7f431fmalita            return true;
63b83cdbcbb0829bf6e0c9cb2c7d9a0ff460f7f431fmalita        }
64b83cdbcbb0829bf6e0c9cb2c7d9a0ff460f7f431fmalita
65b83cdbcbb0829bf6e0c9cb2c7d9a0ff460f7f431fmalita        return this->INHERITED::onQuery(evt);
66b83cdbcbb0829bf6e0c9cb2c7d9a0ff460f7f431fmalita    }
676ceef3dd67617c5f4572ada98d5ee85777d2db99fmalitaprivate:
686ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita    sk_sp<SkSVGDOM> fDom;
69851d68aa5692103db67433354c7421863d01dbdafmalita    SkString        fPath;
70b83cdbcbb0829bf6e0c9cb2c7d9a0ff460f7f431fmalita    SkString        fLabel;
716ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita
726ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita    typedef SampleView INHERITED;
736ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita};
746ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita
756ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita} // anonymous namespace
766ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita
77851d68aa5692103db67433354c7421863d01dbdafmalitaSampleView* CreateSampleSVGFileView(const SkString& filename);
78851d68aa5692103db67433354c7421863d01dbdafmalitaSampleView* CreateSampleSVGFileView(const SkString& filename) {
796ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita    return new SVGFileView(filename);
806ceef3dd67617c5f4572ada98d5ee85777d2db99fmalita}
81