1 /* 2 * Copyright 2017 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 8 #include "SampleCode.h" 9 #include "SkCanvas.h" 10 #include "SkSGColor.h" 11 #include "SkSGDraw.h" 12 #include "SkSGGroup.h" 13 #include "SkSGInvalidationController.h" 14 #include "SkSGRect.h" 15 #include "SkSGTransform.h" 16 #include "SkAnimTimer.h" 17 18 #include <cmath> 19 20 class SGInvalView final : public SampleView { 21 public: 22 SGInvalView() {} 23 24 protected: 25 void onOnceBeforeDraw() override { 26 fRect1 = sksg::Rect::Make(SkRect::MakeLTRB(100, 100, 100, 100)); 27 fRect2 = sksg::Rect::Make(SkRect::MakeLTRB(300, 200, 300, 200)); 28 fColor1 = sksg::Color::Make(0); 29 fColor2 = sksg::Color::Make(0); 30 31 fRoot = sksg::Group::Make(); 32 fRoot->addChild(sksg::Draw::Make(fRect1, fColor1)); 33 fRoot->addChild(sksg::Transform::Make(sksg::Draw::Make(fRect2, fColor2), 34 SkMatrix::MakeScale(1.5f, 1.5f))); 35 } 36 37 bool onQuery(SkEvent* evt) override { 38 if (SampleCode::TitleQ(*evt)) { 39 SampleCode::TitleR(evt, "SGInval"); 40 return true; 41 } 42 43 return this->INHERITED::onQuery(evt); 44 } 45 46 void onDrawContent(SkCanvas* canvas) override { 47 sksg::InvalidationController ic; 48 fRoot->revalidate(&ic, SkMatrix::I()); 49 50 // TODO: clip/cull 51 fRoot->render(canvas); 52 53 SkPaint p; 54 p.setColor(0xffff0000); 55 p.setStyle(SkPaint::kStroke_Style); 56 p.setAntiAlias(true); 57 p.setStrokeWidth(0); 58 59 for (const auto& r : ic) { 60 canvas->drawRect(r, p); 61 } 62 } 63 64 bool onAnimate(const SkAnimTimer& timer) override { 65 if (!fRoot) { 66 return true; 67 } 68 69 static constexpr SkScalar kSize = 50; 70 static constexpr SkScalar kRate = 1.0f / 500; 71 const auto t = timer.msec() * kRate; 72 73 fRect1->setR(fRect1->getL() + kSize * (1 + std::sin(t))); 74 fRect1->setB(fRect1->getT() + kSize * (1 + std::cos(t))); 75 fRect2->setR(fRect2->getL() + kSize * (1 + std::cos(SK_ScalarPI / 2 + t))); 76 fRect2->setB(fRect2->getT() + kSize * (1 + std::sin(SK_ScalarPI / 2 + t))); 77 78 fColor1->setColor(SkColorSetARGB(128 * (1 + std::sin(t)), 0, 0x80, 0)); 79 fColor2->setColor(SkColorSetARGB(128 * (1 + std::cos(t)), 0, 0, 0x80)); 80 return true; 81 } 82 83 private: 84 typedef SampleView INHERITED; 85 86 sk_sp<sksg::Rect> fRect1, 87 fRect2; 88 sk_sp<sksg::Color> fColor1, 89 fColor2; 90 sk_sp<sksg::Group> fRoot; 91 }; 92 93 static SkView* SGInvalFactory() { return new SGInvalView; } 94 static SkViewRegister reg(SGInvalFactory); 95