SampleSG.cpp 3.0 KB

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