1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2019 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/SkCanvas.h" 9cb93a386Sopenharmony_ci#include "include/core/SkFont.h" 10cb93a386Sopenharmony_ci#include "include/core/SkFontMetrics.h" 11cb93a386Sopenharmony_ci#include "include/core/SkPath.h" 12cb93a386Sopenharmony_ci#include "samplecode/Sample.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_ci#include "modules/sksg/include/SkSGDraw.h" 15cb93a386Sopenharmony_ci#include "modules/sksg/include/SkSGGroup.h" 16cb93a386Sopenharmony_ci#include "modules/sksg/include/SkSGPaint.h" 17cb93a386Sopenharmony_ci#include "modules/sksg/include/SkSGRect.h" 18cb93a386Sopenharmony_ci#include "modules/sksg/include/SkSGScene.h" 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_cistruct PerNodeInfo { 21cb93a386Sopenharmony_ci // key 22cb93a386Sopenharmony_ci sksg::Draw* fDraw; 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ci // value(s) 25cb93a386Sopenharmony_ci sksg::GeometryNode* fGeo; 26cb93a386Sopenharmony_ci sksg::PaintNode* fPaint; 27cb93a386Sopenharmony_ci}; 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_ciclass SampleSG : public Sample { 30cb93a386Sopenharmony_ci SkTDArray<PerNodeInfo> fSideCar; 31cb93a386Sopenharmony_ci sk_sp<sksg::Group> fGroup; 32cb93a386Sopenharmony_ci std::unique_ptr<sksg::Scene> fScene; 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci PerNodeInfo* findInfo(sksg::Draw* key) { 35cb93a386Sopenharmony_ci for (int i = 0; i < fSideCar.count(); ++i) { 36cb93a386Sopenharmony_ci if (fSideCar[i].fDraw == key) { 37cb93a386Sopenharmony_ci return &fSideCar[i]; 38cb93a386Sopenharmony_ci } 39cb93a386Sopenharmony_ci } 40cb93a386Sopenharmony_ci return nullptr; 41cb93a386Sopenharmony_ci } 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci void appendNode(sk_sp<sksg::Draw> d, sk_sp<sksg::GeometryNode> g, sk_sp<sksg::PaintNode> p) { 44cb93a386Sopenharmony_ci fGroup->addChild(d); 45cb93a386Sopenharmony_ci auto sc = fSideCar.append(); 46cb93a386Sopenharmony_ci sc->fDraw = d.get(); 47cb93a386Sopenharmony_ci sc->fGeo = g.get(); 48cb93a386Sopenharmony_ci sc->fPaint = p.get(); 49cb93a386Sopenharmony_ci } 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_cipublic: 52cb93a386Sopenharmony_ci SampleSG() { 53cb93a386Sopenharmony_ci fGroup = sksg::Group::Make(); 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci fScene = sksg::Scene::Make(fGroup); 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ci auto r = sksg::Rect::Make({20, 20, 400, 300}); 58cb93a386Sopenharmony_ci auto p = sksg::Color::Make(SK_ColorRED); 59cb93a386Sopenharmony_ci auto d = sksg::Draw::Make(r, p); 60cb93a386Sopenharmony_ci this->appendNode(d, r, p); 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci r = sksg::Rect::Make({60, 70, 300, 400}); 63cb93a386Sopenharmony_ci p = sksg::Color::Make(SK_ColorBLUE); 64cb93a386Sopenharmony_ci d = sksg::Draw::Make(r, p); 65cb93a386Sopenharmony_ci this->appendNode(d, r, p); 66cb93a386Sopenharmony_ci } 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ciprotected: 69cb93a386Sopenharmony_ci SkString name() override { return SkString("SceneGraph"); } 70cb93a386Sopenharmony_ci 71cb93a386Sopenharmony_ci void onDrawContent(SkCanvas* canvas) override { 72cb93a386Sopenharmony_ci fScene->render(canvas); 73cb93a386Sopenharmony_ci } 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ci Click* onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) override { 76cb93a386Sopenharmony_ci if (auto node = fScene->nodeAt({x, y})) { 77cb93a386Sopenharmony_ci Click* click = new Click(); 78cb93a386Sopenharmony_ci click->fMeta.setPtr("node", (void*)node); 79cb93a386Sopenharmony_ci return click; 80cb93a386Sopenharmony_ci } 81cb93a386Sopenharmony_ci return nullptr; 82cb93a386Sopenharmony_ci } 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci bool onClick(Click* click) override { 85cb93a386Sopenharmony_ci sksg::Draw* node = nullptr; 86cb93a386Sopenharmony_ci if (click->fMeta.findPtr("node", (void**)&node)) { 87cb93a386Sopenharmony_ci if (auto info = this->findInfo(node)) { 88cb93a386Sopenharmony_ci auto geo = info->fGeo; 89cb93a386Sopenharmony_ci sksg::Rect* r = (sksg::Rect*)geo; 90cb93a386Sopenharmony_ci SkScalar dx = click->fCurr.fX - click->fPrev.fX; 91cb93a386Sopenharmony_ci SkScalar dy = click->fCurr.fY - click->fPrev.fY; 92cb93a386Sopenharmony_ci r->setL(r->getL() + dx); 93cb93a386Sopenharmony_ci r->setR(r->getR() + dx); 94cb93a386Sopenharmony_ci r->setT(r->getT() + dy); 95cb93a386Sopenharmony_ci r->setB(r->getB() + dy); 96cb93a386Sopenharmony_ci } 97cb93a386Sopenharmony_ci return true; 98cb93a386Sopenharmony_ci } 99cb93a386Sopenharmony_ci return false; 100cb93a386Sopenharmony_ci } 101cb93a386Sopenharmony_ci 102cb93a386Sopenharmony_ciprivate: 103cb93a386Sopenharmony_ci 104cb93a386Sopenharmony_ci using INHERITED = Sample; 105cb93a386Sopenharmony_ci}; 106cb93a386Sopenharmony_ci 107cb93a386Sopenharmony_ci////////////////////////////////////////////////////////////////////////////// 108cb93a386Sopenharmony_ci 109cb93a386Sopenharmony_ciDEF_SAMPLE( return new SampleSG(); ) 110