Home | History | Annotate | Download | only in samplecode
      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