blob: a5db8cc972782e7424fac18da67fe96cfa1f22fb [file] [log] [blame]
Mike Reedec80d902019-02-12 11:31:27 -05001/*
2 * Copyright 2019 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "include/core/SkCanvas.h"
9#include "include/core/SkFont.h"
10#include "include/core/SkFontMetrics.h"
11#include "include/core/SkPath.h"
12#include "samplecode/Sample.h"
Mike Reedec80d902019-02-12 11:31:27 -050013
Mike Kleinc0bd9f92019-04-23 12:05:21 -050014#include "modules/sksg/include/SkSGDraw.h"
15#include "modules/sksg/include/SkSGGroup.h"
16#include "modules/sksg/include/SkSGPaint.h"
17#include "modules/sksg/include/SkSGRect.h"
18#include "modules/sksg/include/SkSGScene.h"
Mike Reedec80d902019-02-12 11:31:27 -050019
Mike Reedbe891302019-02-12 15:24:16 -050020struct PerNodeInfo {
21 // key
22 sksg::Draw* fDraw;
23
24 // value(s)
25 sksg::GeometryNode* fGeo;
26 sksg::PaintNode* fPaint;
27};
28
Mike Reedec80d902019-02-12 11:31:27 -050029class SampleSG : public Sample {
Mike Reedbe891302019-02-12 15:24:16 -050030 SkTDArray<PerNodeInfo> fSideCar;
Mike Reedec80d902019-02-12 11:31:27 -050031 sk_sp<sksg::Group> fGroup;
32 std::unique_ptr<sksg::Scene> fScene;
Mike Reedbe891302019-02-12 15:24:16 -050033
34 PerNodeInfo* findInfo(sksg::Draw* key) {
35 for (int i = 0; i < fSideCar.count(); ++i) {
36 if (fSideCar[i].fDraw == key) {
37 return &fSideCar[i];
38 }
39 }
40 return nullptr;
41 }
42
43 void appendNode(sk_sp<sksg::Draw> d, sk_sp<sksg::GeometryNode> g, sk_sp<sksg::PaintNode> p) {
44 fGroup->addChild(d);
45 auto sc = fSideCar.append();
46 sc->fDraw = d.get();
47 sc->fGeo = g.get();
48 sc->fPaint = p.get();
49 }
50
Mike Reedec80d902019-02-12 11:31:27 -050051public:
52 SampleSG() {
53 fGroup = sksg::Group::Make();
54
55 fScene = sksg::Scene::Make(fGroup, sksg::AnimatorList());
56
57 auto r = sksg::Rect::Make({20, 20, 400, 300});
58 auto p = sksg::Color::Make(SK_ColorRED);
59 auto d = sksg::Draw::Make(r, p);
Mike Reedbe891302019-02-12 15:24:16 -050060 this->appendNode(d, r, p);
Mike Reedec80d902019-02-12 11:31:27 -050061
62 r = sksg::Rect::Make({60, 70, 300, 400});
63 p = sksg::Color::Make(SK_ColorBLUE);
64 d = sksg::Draw::Make(r, p);
Mike Reedbe891302019-02-12 15:24:16 -050065 this->appendNode(d, r, p);
Mike Reedec80d902019-02-12 11:31:27 -050066 }
67
68protected:
69 bool onQuery(Sample::Event* evt) override {
70 if (Sample::TitleQ(*evt)) {
71 Sample::TitleR(evt, "SceneGraph");
72 return true;
73 }
74 return this->INHERITED::onQuery(evt);
75 }
76
77 void onDrawContent(SkCanvas* canvas) override {
78 fScene->render(canvas);
79 }
80
Mike Reedbe891302019-02-12 15:24:16 -050081 Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
82 if (auto node = fScene->nodeAt({x, y})) {
83 Click* click = new Click(this);
84 click->fMeta.setPtr("node", (void*)node);
85 return click;
86 }
Mike Reedec80d902019-02-12 11:31:27 -050087 return this->INHERITED::onFindClickHandler(x, y, modi);
88 }
89
90 bool onClick(Click* click) override {
Mike Reedbe891302019-02-12 15:24:16 -050091 sksg::Draw* node = nullptr;
92 if (click->fMeta.findPtr("node", (void**)&node)) {
93 if (auto info = this->findInfo(node)) {
94 auto geo = info->fGeo;
95 sksg::Rect* r = (sksg::Rect*)geo;
96 SkScalar dx = click->fCurr.fX - click->fPrev.fX;
97 SkScalar dy = click->fCurr.fY - click->fPrev.fY;
98 r->setL(r->getL() + dx);
99 r->setR(r->getR() + dx);
100 r->setT(r->getT() + dy);
101 r->setB(r->getB() + dy);
102 }
103 return true;
104 }
Mike Reedec80d902019-02-12 11:31:27 -0500105 return false;
106 }
107
108private:
109
110 typedef Sample INHERITED;
111};
112
113//////////////////////////////////////////////////////////////////////////////
114
115DEF_SAMPLE( return new SampleSG(); )