1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2016 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "include/core/SkTypes.h"
9cb93a386Sopenharmony_ci
10cb93a386Sopenharmony_ci#if defined(SK_ENABLE_SVG)
11cb93a386Sopenharmony_ci
12cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h"
13cb93a386Sopenharmony_ci#include "include/core/SkStream.h"
14cb93a386Sopenharmony_ci#include "modules/svg/include/SkSVGDOM.h"
15cb93a386Sopenharmony_ci#include "modules/svg/include/SkSVGNode.h"
16cb93a386Sopenharmony_ci#include "samplecode/Sample.h"
17cb93a386Sopenharmony_ci#include "src/core/SkOSFile.h"
18cb93a386Sopenharmony_ci#include "src/utils/SkOSPath.h"
19cb93a386Sopenharmony_ci#include "src/xml/SkDOM.h"
20cb93a386Sopenharmony_ci
21cb93a386Sopenharmony_cinamespace {
22cb93a386Sopenharmony_ci
23cb93a386Sopenharmony_ciclass SVGFileView : public Sample {
24cb93a386Sopenharmony_cipublic:
25cb93a386Sopenharmony_ci    SVGFileView(const SkString& path)
26cb93a386Sopenharmony_ci        : fPath(path), fLabel(SkStringPrintf("[%s]", SkOSPath::Basename(path.c_str()).c_str())) {}
27cb93a386Sopenharmony_ci    ~SVGFileView() override = default;
28cb93a386Sopenharmony_ci
29cb93a386Sopenharmony_ciprotected:
30cb93a386Sopenharmony_ci    void onOnceBeforeDraw() override {
31cb93a386Sopenharmony_ci        SkFILEStream svgStream(fPath.c_str());
32cb93a386Sopenharmony_ci        if (!svgStream.isValid()) {
33cb93a386Sopenharmony_ci            SkDebugf("file not found: \"%s\"\n", fPath.c_str());
34cb93a386Sopenharmony_ci            return;
35cb93a386Sopenharmony_ci        }
36cb93a386Sopenharmony_ci
37cb93a386Sopenharmony_ci        fDom = SkSVGDOM::MakeFromStream(svgStream);
38cb93a386Sopenharmony_ci        if (fDom) {
39cb93a386Sopenharmony_ci            fDom->setContainerSize(SkSize::Make(this->width(), this->height()));
40cb93a386Sopenharmony_ci        }
41cb93a386Sopenharmony_ci    }
42cb93a386Sopenharmony_ci
43cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
44cb93a386Sopenharmony_ci        if (fDom) {
45cb93a386Sopenharmony_ci            fDom->render(canvas);
46cb93a386Sopenharmony_ci        }
47cb93a386Sopenharmony_ci    }
48cb93a386Sopenharmony_ci
49cb93a386Sopenharmony_ci    void onSizeChange() override {
50cb93a386Sopenharmony_ci        if (fDom) {
51cb93a386Sopenharmony_ci            fDom->setContainerSize(SkSize::Make(this->width(), this->height()));
52cb93a386Sopenharmony_ci        }
53cb93a386Sopenharmony_ci
54cb93a386Sopenharmony_ci        this->INHERITED::onSizeChange();
55cb93a386Sopenharmony_ci    }
56cb93a386Sopenharmony_ci
57cb93a386Sopenharmony_ci    SkString name() override { return fLabel; }
58cb93a386Sopenharmony_ci
59cb93a386Sopenharmony_ciprivate:
60cb93a386Sopenharmony_ci    sk_sp<SkSVGDOM> fDom;
61cb93a386Sopenharmony_ci    SkString        fPath;
62cb93a386Sopenharmony_ci    SkString        fLabel;
63cb93a386Sopenharmony_ci
64cb93a386Sopenharmony_ci    using INHERITED = Sample;
65cb93a386Sopenharmony_ci};
66cb93a386Sopenharmony_ci
67cb93a386Sopenharmony_ci} // anonymous namespace
68cb93a386Sopenharmony_ci
69cb93a386Sopenharmony_ciSample* CreateSampleSVGFileView(const SkString& filename);
70cb93a386Sopenharmony_ciSample* CreateSampleSVGFileView(const SkString& filename) {
71cb93a386Sopenharmony_ci    return new SVGFileView(filename);
72cb93a386Sopenharmony_ci}
73cb93a386Sopenharmony_ci#endif  // defined(SK_ENABLE_SVG)
74