blob: bb2bf8975c290a5fc775f361258a92242ed3f7dc [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:
Hal Canary8a027312019-07-03 10:55:44 -040069 SkString name() override { return SkString("SceneGraph"); }
Mike Reedec80d902019-02-12 11:31:27 -050070
71 void onDrawContent(SkCanvas* canvas) override {
72 fScene->render(canvas);
73 }
74
Hal Canaryb1f411a2019-08-29 10:39:22 -040075 Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override {
Mike Reedbe891302019-02-12 15:24:16 -050076 if (auto node = fScene->nodeAt({x, y})) {
Hal Canaryfcf63592019-07-12 11:32:43 -040077 Click* click = new Click();
Mike Reedbe891302019-02-12 15:24:16 -050078 click->fMeta.setPtr("node", (void*)node);
79 return click;
80 }
Hal Canaryfcf63592019-07-12 11:32:43 -040081 return nullptr;
Mike Reedec80d902019-02-12 11:31:27 -050082 }
83
84 bool onClick(Click* click) override {
Mike Reedbe891302019-02-12 15:24:16 -050085 sksg::Draw* node = nullptr;
86 if (click->fMeta.findPtr("node", (void**)&node)) {
87 if (auto info = this->findInfo(node)) {
88 auto geo = info->fGeo;
89 sksg::Rect* r = (sksg::Rect*)geo;
90 SkScalar dx = click->fCurr.fX - click->fPrev.fX;
91 SkScalar dy = click->fCurr.fY - click->fPrev.fY;
92 r->setL(r->getL() + dx);
93 r->setR(r->getR() + dx);
94 r->setT(r->getT() + dy);
95 r->setB(r->getB() + dy);
96 }
97 return true;
98 }
Mike Reedec80d902019-02-12 11:31:27 -050099 return false;
100 }
101
102private:
103
104 typedef Sample INHERITED;
105};
106
107//////////////////////////////////////////////////////////////////////////////
108
109DEF_SAMPLE( return new SampleSG(); )