1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2019 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFont.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFontMetrics.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTDArray.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "modules/sksg/include/SkSGDraw.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "modules/sksg/include/SkSGGroup.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "modules/sksg/include/SkSGPaint.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "modules/sksg/include/SkSGRect.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "modules/sksg/include/SkSGScene.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "tools/viewer/ClickHandlerSlide.h" 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker struct PerNodeInfo { 21*c8dee2aaSAndroid Build Coastguard Worker // key 22*c8dee2aaSAndroid Build Coastguard Worker sksg::Draw* fDraw; 23*c8dee2aaSAndroid Build Coastguard Worker 24*c8dee2aaSAndroid Build Coastguard Worker // value(s) 25*c8dee2aaSAndroid Build Coastguard Worker sksg::GeometryNode* fGeo; 26*c8dee2aaSAndroid Build Coastguard Worker sksg::PaintNode* fPaint; 27*c8dee2aaSAndroid Build Coastguard Worker }; 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker class SGSlide : public ClickHandlerSlide { 30*c8dee2aaSAndroid Build Coastguard Worker // TODO(kjlubick) use a vector instead of our private SkTDArray 31*c8dee2aaSAndroid Build Coastguard Worker SkTDArray<PerNodeInfo> fSideCar; 32*c8dee2aaSAndroid Build Coastguard Worker sk_sp<sksg::Group> fGroup; 33*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<sksg::Scene> fScene; 34*c8dee2aaSAndroid Build Coastguard Worker findInfo(sksg::Draw * key)35*c8dee2aaSAndroid Build Coastguard Worker PerNodeInfo* findInfo(sksg::Draw* key) { 36*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fSideCar.size(); ++i) { 37*c8dee2aaSAndroid Build Coastguard Worker if (fSideCar[i].fDraw == key) { 38*c8dee2aaSAndroid Build Coastguard Worker return &fSideCar[i]; 39*c8dee2aaSAndroid Build Coastguard Worker } 40*c8dee2aaSAndroid Build Coastguard Worker } 41*c8dee2aaSAndroid Build Coastguard Worker return nullptr; 42*c8dee2aaSAndroid Build Coastguard Worker } 43*c8dee2aaSAndroid Build Coastguard Worker appendNode(sk_sp<sksg::Draw> d,sk_sp<sksg::GeometryNode> g,sk_sp<sksg::PaintNode> p)44*c8dee2aaSAndroid Build Coastguard Worker void appendNode(sk_sp<sksg::Draw> d, sk_sp<sksg::GeometryNode> g, sk_sp<sksg::PaintNode> p) { 45*c8dee2aaSAndroid Build Coastguard Worker fGroup->addChild(d); 46*c8dee2aaSAndroid Build Coastguard Worker auto sc = fSideCar.append(); 47*c8dee2aaSAndroid Build Coastguard Worker sc->fDraw = d.get(); 48*c8dee2aaSAndroid Build Coastguard Worker sc->fGeo = g.get(); 49*c8dee2aaSAndroid Build Coastguard Worker sc->fPaint = p.get(); 50*c8dee2aaSAndroid Build Coastguard Worker } 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker public: SGSlide()53*c8dee2aaSAndroid Build Coastguard Worker SGSlide() { 54*c8dee2aaSAndroid Build Coastguard Worker fGroup = sksg::Group::Make(); 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker fScene = sksg::Scene::Make(fGroup); 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker auto r = sksg::Rect::Make({20, 20, 400, 300}); 59*c8dee2aaSAndroid Build Coastguard Worker auto p = sksg::Color::Make(SK_ColorRED); 60*c8dee2aaSAndroid Build Coastguard Worker auto d = sksg::Draw::Make(r, p); 61*c8dee2aaSAndroid Build Coastguard Worker this->appendNode(d, r, p); 62*c8dee2aaSAndroid Build Coastguard Worker 63*c8dee2aaSAndroid Build Coastguard Worker r = sksg::Rect::Make({60, 70, 300, 400}); 64*c8dee2aaSAndroid Build Coastguard Worker p = sksg::Color::Make(SK_ColorBLUE); 65*c8dee2aaSAndroid Build Coastguard Worker d = sksg::Draw::Make(r, p); 66*c8dee2aaSAndroid Build Coastguard Worker this->appendNode(d, r, p); 67*c8dee2aaSAndroid Build Coastguard Worker fName = "SceneGraph"; 68*c8dee2aaSAndroid Build Coastguard Worker } 69*c8dee2aaSAndroid Build Coastguard Worker draw(SkCanvas * canvas)70*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas) override { 71*c8dee2aaSAndroid Build Coastguard Worker fScene->render(canvas); 72*c8dee2aaSAndroid Build Coastguard Worker } 73*c8dee2aaSAndroid Build Coastguard Worker 74*c8dee2aaSAndroid Build Coastguard Worker protected: onFindClickHandler(SkScalar x,SkScalar y,skui::ModifierKey modi)75*c8dee2aaSAndroid Build Coastguard Worker Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override { 76*c8dee2aaSAndroid Build Coastguard Worker if (auto node = fScene->nodeAt({x, y})) { 77*c8dee2aaSAndroid Build Coastguard Worker Click* click = new Click(); 78*c8dee2aaSAndroid Build Coastguard Worker click->fMeta.setPtr("node", (void*)node); 79*c8dee2aaSAndroid Build Coastguard Worker return click; 80*c8dee2aaSAndroid Build Coastguard Worker } 81*c8dee2aaSAndroid Build Coastguard Worker return nullptr; 82*c8dee2aaSAndroid Build Coastguard Worker } 83*c8dee2aaSAndroid Build Coastguard Worker onClick(Click * click)84*c8dee2aaSAndroid Build Coastguard Worker bool onClick(Click* click) override { 85*c8dee2aaSAndroid Build Coastguard Worker sksg::Draw* node = nullptr; 86*c8dee2aaSAndroid Build Coastguard Worker if (click->fMeta.findPtr("node", (void**)&node)) { 87*c8dee2aaSAndroid Build Coastguard Worker if (auto info = this->findInfo(node)) { 88*c8dee2aaSAndroid Build Coastguard Worker auto geo = info->fGeo; 89*c8dee2aaSAndroid Build Coastguard Worker sksg::Rect* r = (sksg::Rect*)geo; 90*c8dee2aaSAndroid Build Coastguard Worker SkScalar dx = click->fCurr.fX - click->fPrev.fX; 91*c8dee2aaSAndroid Build Coastguard Worker SkScalar dy = click->fCurr.fY - click->fPrev.fY; 92*c8dee2aaSAndroid Build Coastguard Worker r->setL(r->getL() + dx); 93*c8dee2aaSAndroid Build Coastguard Worker r->setR(r->getR() + dx); 94*c8dee2aaSAndroid Build Coastguard Worker r->setT(r->getT() + dy); 95*c8dee2aaSAndroid Build Coastguard Worker r->setB(r->getB() + dy); 96*c8dee2aaSAndroid Build Coastguard Worker } 97*c8dee2aaSAndroid Build Coastguard Worker return true; 98*c8dee2aaSAndroid Build Coastguard Worker } 99*c8dee2aaSAndroid Build Coastguard Worker return false; 100*c8dee2aaSAndroid Build Coastguard Worker } 101*c8dee2aaSAndroid Build Coastguard Worker }; 102*c8dee2aaSAndroid Build Coastguard Worker 103*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////// 104*c8dee2aaSAndroid Build Coastguard Worker 105*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE( return new SGSlide(); ) 106