Home | History | Annotate | Download | only in samplecode
      1 /*
      2  * Copyright 2011 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 "Sample.h"
      9 #include "SkCanvas.h"
     10 #include "SkBlurMaskFilter.h"
     11 #include "SkCamera.h"
     12 #include "SkColorFilter.h"
     13 #include "SkColorPriv.h"
     14 #include "SkGradientShader.h"
     15 #include "SkImage.h"
     16 #include "SkInterpolator.h"
     17 #include "SkMaskFilter.h"
     18 #include "SkPath.h"
     19 #include "SkRegion.h"
     20 #include "SkShader.h"
     21 #include "SkTime.h"
     22 #include "SkTypeface.h"
     23 #include "SkUTF.h"
     24 #include "SkClipOpPriv.h"
     25 
     26 static void make_paint(SkPaint* paint, const SkMatrix& localMatrix) {
     27     SkColor colors[] = { 0, SK_ColorWHITE };
     28     SkPoint pts[] = { { 0, 0 }, { 0, SK_Scalar1*20 } };
     29     paint->setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, 2,
     30                                                   SkShader::kClamp_TileMode, 0, &localMatrix));
     31     paint->setBlendMode(SkBlendMode::kDstIn);
     32 }
     33 
     34 // test drawing with strips of fading gradient above and below
     35 static void test_fade(SkCanvas* canvas) {
     36     SkAutoCanvasRestore ar(canvas, true);
     37 
     38     SkRect r;
     39 
     40     SkPaint p;
     41     p.setAlpha(0x88);
     42 
     43     SkAutoCanvasRestore ar2(canvas, false);
     44 
     45     // create the layers
     46 
     47     r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
     48     canvas->clipRect(r);
     49 
     50     r.fBottom = SkIntToScalar(20);
     51     canvas->saveLayer(&r, nullptr);
     52 
     53     r.fTop = SkIntToScalar(80);
     54     r.fBottom = SkIntToScalar(100);
     55     canvas->saveLayer(&r, nullptr);
     56 
     57     // now draw the "content"
     58 
     59     if (true) {
     60         r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
     61 
     62         canvas->saveLayerAlpha(&r, 0x80);
     63 
     64         SkPaint p;
     65         p.setColor(SK_ColorRED);
     66         p.setAntiAlias(true);
     67         canvas->drawOval(r, p);
     68 
     69         canvas->restore();
     70     } else {
     71         r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
     72 
     73         SkPaint p;
     74         p.setColor(SK_ColorRED);
     75         p.setAntiAlias(true);
     76         canvas->drawOval(r, p);
     77     }
     78 
     79 //    return;
     80 
     81     // now apply an effect
     82     SkMatrix m;
     83     m.setScale(SK_Scalar1, -SK_Scalar1);
     84     m.postTranslate(0, SkIntToScalar(100));
     85 
     86     SkPaint paint;
     87     make_paint(&paint, m);
     88     r.set(0, 0, SkIntToScalar(100), SkIntToScalar(20));
     89 //    SkDebugf("--------- draw top grad\n");
     90     canvas->drawRect(r, paint);
     91 
     92     r.fTop = SkIntToScalar(80);
     93     r.fBottom = SkIntToScalar(100);
     94 //    SkDebugf("--------- draw bot grad\n");
     95     canvas->drawRect(r, paint);
     96 }
     97 
     98 class LayersView : public Sample {
     99 public:
    100     LayersView() {}
    101 
    102 protected:
    103     bool onQuery(Sample::Event* evt) override {
    104         if (Sample::TitleQ(*evt)) {
    105             Sample::TitleR(evt, "Layers");
    106             return true;
    107         }
    108         return this->INHERITED::onQuery(evt);
    109     }
    110 
    111     void drawBG(SkCanvas* canvas) {
    112         canvas->drawColor(SK_ColorGRAY);
    113     }
    114 
    115     void onDrawContent(SkCanvas* canvas) override {
    116         this->drawBG(canvas);
    117 
    118         if (true) {
    119             SkRect r;
    120             r.set(SkIntToScalar(0), SkIntToScalar(0),
    121                   SkIntToScalar(220), SkIntToScalar(120));
    122             SkPaint p;
    123             canvas->saveLayer(&r, &p);
    124             canvas->drawColor(0xFFFF0000);
    125             p.setAlpha(0);  // or 0
    126             p.setBlendMode(SkBlendMode::kSrc);
    127             canvas->drawOval(r, p);
    128             canvas->restore();
    129             return;
    130         }
    131 
    132         if (false) {
    133             SkRect r;
    134             r.set(SkIntToScalar(0), SkIntToScalar(0),
    135                   SkIntToScalar(220), SkIntToScalar(120));
    136             SkPaint p;
    137             p.setAlpha(0x88);
    138             p.setAntiAlias(true);
    139 
    140             if (true) {
    141                 canvas->saveLayer(&r, &p);
    142                 p.setColor(0xFFFF0000);
    143                 canvas->drawOval(r, p);
    144                 canvas->restore();
    145             }
    146 
    147             p.setColor(0xFF0000FF);
    148             r.offset(SkIntToScalar(20), SkIntToScalar(50));
    149             canvas->drawOval(r, p);
    150         }
    151 
    152         if (false) {
    153             SkPaint p;
    154             p.setAlpha(0x88);
    155             p.setAntiAlias(true);
    156 
    157             canvas->translate(SkIntToScalar(300), 0);
    158 
    159             SkRect r;
    160             r.set(SkIntToScalar(0), SkIntToScalar(0),
    161                   SkIntToScalar(220), SkIntToScalar(60));
    162 
    163             canvas->saveLayer(&r, &p);
    164 
    165             r.set(SkIntToScalar(0), SkIntToScalar(0),
    166                   SkIntToScalar(220), SkIntToScalar(120));
    167             p.setColor(SK_ColorBLUE);
    168             canvas->drawOval(r, p);
    169             canvas->restore();
    170             return;
    171         }
    172 
    173         test_fade(canvas);
    174     }
    175 
    176 private:
    177     typedef Sample INHERITED;
    178 };
    179 DEF_SAMPLE( return new LayersView; )
    180 
    181 //////////////////////////////////////////////////////////////////////////////
    182 
    183 #include "SkBlurImageFilter.h"
    184 #include "SkMatrixConvolutionImageFilter.h"
    185 #include "SkMorphologyImageFilter.h"
    186 
    187 #include "Resources.h"
    188 #include "SkAnimTimer.h"
    189 
    190 class BackdropView : public Sample {
    191     SkPoint fCenter;
    192     SkScalar fAngle;
    193     sk_sp<SkImage> fImage;
    194     sk_sp<SkImageFilter> fFilter;
    195 public:
    196     BackdropView() {
    197         fCenter.set(200, 150);
    198         fAngle = 0;
    199         fImage = GetResourceAsImage("images/mandrill_512.png");
    200         fFilter = SkDilateImageFilter::Make(8, 8, nullptr);
    201     }
    202 
    203 protected:
    204     bool onQuery(Sample::Event* evt) override {
    205         if (Sample::TitleQ(*evt)) {
    206             Sample::TitleR(evt, "Backdrop");
    207             return true;
    208         }
    209         return this->INHERITED::onQuery(evt);
    210     }
    211 
    212     void onDrawContent(SkCanvas* canvas) override {
    213         canvas->drawImage(fImage.get(), 0, 0, nullptr);
    214 
    215         const SkScalar w = 250;
    216         const SkScalar h = 150;
    217         SkPath path;
    218         path.addOval(SkRect::MakeXYWH(-w/2, -h/2, w, h));
    219         SkMatrix m;
    220         m.setRotate(fAngle);
    221         m.postTranslate(fCenter.x(), fCenter.y());
    222         path.transform(m);
    223 
    224         canvas->clipPath(path, kIntersect_SkClipOp, true);
    225         const SkRect bounds = path.getBounds();
    226 
    227         SkPaint paint;
    228         paint.setAlpha(0xCC);
    229         canvas->saveLayer({ &bounds, &paint, fFilter.get(), nullptr, nullptr, 0 });
    230 
    231         canvas->restore();
    232     }
    233 
    234     bool onAnimate(const SkAnimTimer& timer) override {
    235         fAngle = SkDoubleToScalar(fmod(timer.secs() * 360 / 5, 360));
    236         return true;
    237     }
    238 
    239     Sample::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
    240         return new Click(this);
    241     }
    242 
    243     bool onClick(Click* click) override {
    244         fCenter = click->fCurr;
    245         return this->INHERITED::onClick(click);
    246     }
    247 
    248 private:
    249     typedef Sample INHERITED;
    250 };
    251 DEF_SAMPLE( return new BackdropView; )
    252