1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
78a21c9fe7f5fef9e87115defef27bd7218419f28reed
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SampleCode.h"
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkView.h"
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkBlurMaskFilter.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCamera.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorFilter.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkColorPriv.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGradientShader.h"
16d15750c0c7766ecab7022ea9b2f9e89a9132cbc2msarett#include "SkImage.h"
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkInterpolator.h"
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMaskFilter.h"
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPath.h"
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRegion.h"
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkShader.h"
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTime.h"
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTypeface.h"
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkUtils.h"
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkKey.h"
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawFilter.h"
27ebfce6d9b42198e04288a15953f40c395a7b6139Mike Reed#include "SkClipOpPriv.h"
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
299c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.orgstatic void make_paint(SkPaint* paint, const SkMatrix& localMatrix) {
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkColor colors[] = { 0, SK_ColorWHITE };
3164cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org    SkPoint pts[] = { { 0, 0 }, { 0, SK_Scalar1*20 } };
328a21c9fe7f5fef9e87115defef27bd7218419f28reed    paint->setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, 2,
338a21c9fe7f5fef9e87115defef27bd7218419f28reed                                                  SkShader::kClamp_TileMode, 0, &localMatrix));
34374772bd61951f01bf84fe17bf53d8867681c9aereed    paint->setBlendMode(SkBlendMode::kDstIn);
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// test drawing with strips of fading gradient above and below
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void test_fade(SkCanvas* canvas) {
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkAutoCanvasRestore ar(canvas, true);
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkRect r;
42ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPaint p;
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    p.setAlpha(0x88);
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
46e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org    SkAutoCanvasRestore ar2(canvas, false);
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // create the layers
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    canvas->clipRect(r);
52ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    r.fBottom = SkIntToScalar(20);
5496fcdcc219d2a0d3579719b84b28bede76efba64halcanary    canvas->saveLayer(&r, nullptr);
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    r.fTop = SkIntToScalar(80);
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    r.fBottom = SkIntToScalar(100);
5896fcdcc219d2a0d3579719b84b28bede76efba64halcanary    canvas->saveLayer(&r, nullptr);
59ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
60ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com    // now draw the "content"
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (true) {
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->saveLayerAlpha(&r, 0x80);
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkPaint p;
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p.setColor(SK_ColorRED);
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p.setAntiAlias(true);
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawOval(r, p);
71ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->restore();
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } else {
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
75ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkPaint p;
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p.setColor(SK_ColorRED);
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p.setAntiAlias(true);
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawOval(r, p);
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
81ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//    return;
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // now apply an effect
859c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org    SkMatrix m;
869c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org    m.setScale(SK_Scalar1, -SK_Scalar1);
879c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org    m.postTranslate(0, SkIntToScalar(100));
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPaint paint;
909c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org    make_paint(&paint, m);
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    r.set(0, 0, SkIntToScalar(100), SkIntToScalar(20));
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//    SkDebugf("--------- draw top grad\n");
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    canvas->drawRect(r, paint);
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    r.fTop = SkIntToScalar(80);
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    r.fBottom = SkIntToScalar(100);
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//    SkDebugf("--------- draw bot grad\n");
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    canvas->drawRect(r, paint);
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass RedFilter : public SkDrawFilter {
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
10336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    bool filter(SkPaint* p, SkDrawFilter::Type) override {
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fColor = p->getColor();
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (fColor == SK_ColorRED) {
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p->setColor(SK_ColorGREEN);
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
108971aca75572ed6e0c5e1cc959173dc58ca7b6b8dreed@google.com        return true;
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
110ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkColor fColor;
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass LayersView : public SkView {
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
117ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com    LayersView() {}
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // overrides from SkEventSink
121f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    bool onQuery(SkEvent* evt) override {
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (SampleCode::TitleQ(*evt)) {
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SampleCode::TitleR(evt, "Layers");
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return this->INHERITED::onQuery(evt);
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
128ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void drawBG(SkCanvas* canvas) {
130149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com        canvas->drawColor(SK_ColorGRAY);
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
132ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
133f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    void onDraw(SkCanvas* canvas) override {
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->drawBG(canvas);
135ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
136149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com        if (true) {
137149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com            SkRect r;
138ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com            r.set(SkIntToScalar(0), SkIntToScalar(0),
139ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com                  SkIntToScalar(220), SkIntToScalar(120));
140149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com            SkPaint p;
141149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com            canvas->saveLayer(&r, &p);
142149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com            canvas->drawColor(0xFFFF0000);
143f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            p.setAlpha(0);  // or 0
144374772bd61951f01bf84fe17bf53d8867681c9aereed            p.setBlendMode(SkBlendMode::kSrc);
145149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com            canvas->drawOval(r, p);
146149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com            canvas->restore();
147149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com            return;
148149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com        }
149ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (false) {
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkRect r;
152ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com            r.set(SkIntToScalar(0), SkIntToScalar(0),
153ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com                  SkIntToScalar(220), SkIntToScalar(120));
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkPaint p;
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setAlpha(0x88);
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setAntiAlias(true);
157ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (true) {
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                canvas->saveLayer(&r, &p);
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                p.setColor(0xFFFF0000);
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                canvas->drawOval(r, p);
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                canvas->restore();
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setColor(0xFF0000FF);
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            r.offset(SkIntToScalar(20), SkIntToScalar(50));
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->drawOval(r, p);
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (false) {
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkPaint p;
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setAlpha(0x88);
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setAntiAlias(true);
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->translate(SkIntToScalar(300), 0);
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkRect r;
178ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com            r.set(SkIntToScalar(0), SkIntToScalar(0),
179ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com                  SkIntToScalar(220), SkIntToScalar(60));
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
181091a594dbc4116ec2e54724432472bf37dae794acommit-bot@chromium.org            canvas->saveLayer(&r, &p);
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
183ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com            r.set(SkIntToScalar(0), SkIntToScalar(0),
184ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com                  SkIntToScalar(220), SkIntToScalar(120));
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setColor(SK_ColorBLUE);
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->drawOval(r, p);
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->restore();
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return;
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
190ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        test_fade(canvas);
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
193ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
194f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
19596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        this->inval(nullptr);
196ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1974d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com        return this->INHERITED::onFindClickHandler(x, y, modi);
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
199ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
200f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    bool onClick(Click* click) override {
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return this->INHERITED::onClick(click);
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
20493c7ee34dc5c8f6bfad65809f4b39f8d00d7f0d4sugoi@google.com    virtual bool handleKey(SkKey) {
20596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        this->inval(nullptr);
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return true;
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkView INHERITED;
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
212bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areedDEF_SAMPLE( return new LayersView; )
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////////
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
216bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed#include "SkBlurImageFilter.h"
217bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed#include "SkMatrixConvolutionImageFilter.h"
218bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed#include "SkMorphologyImageFilter.h"
219bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed
220bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed#include "Resources.h"
221bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed#include "SkAnimTimer.h"
222bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed
223bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areedclass BackdropView : public SampleView {
224bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed    SkPoint fCenter;
225bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed    SkScalar fAngle;
2269ce9d6772df650ceb0511f275e1a83dffa78ff72reed    sk_sp<SkImage> fImage;
227fc11b0afe0ca922a42767d4a656ed640008da1bbrobertphillips    sk_sp<SkImageFilter> fFilter;
228bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areedpublic:
229bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed    BackdropView() {
230bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        fCenter.set(200, 150);
231bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        fAngle = 0;
2329ce9d6772df650ceb0511f275e1a83dffa78ff72reed        fImage = GetResourceAsImage("mandrill_512.png");
233fc11b0afe0ca922a42767d4a656ed640008da1bbrobertphillips        fFilter = SkDilateImageFilter::Make(8, 8, nullptr);
234bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed    }
235bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed
236bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areedprotected:
237bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed    // overrides from SkEventSink
238bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed    bool onQuery(SkEvent* evt) override {
239bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        if (SampleCode::TitleQ(*evt)) {
240bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed            SampleCode::TitleR(evt, "Backdrop");
241bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed            return true;
242bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        }
243bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        return this->INHERITED::onQuery(evt);
244bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed    }
245bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed
246bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed    void onDrawContent(SkCanvas* canvas) override {
2479ce9d6772df650ceb0511f275e1a83dffa78ff72reed        canvas->drawImage(fImage.get(), 0, 0, nullptr);
248bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed
249bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        const SkScalar w = 250;
250bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        const SkScalar h = 150;
251bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        SkPath path;
252bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        path.addOval(SkRect::MakeXYWH(-w/2, -h/2, w, h));
253bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        SkMatrix m;
254bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        m.setRotate(fAngle);
255bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        m.postTranslate(fCenter.x(), fCenter.y());
256bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        path.transform(m);
257bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed
258c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed        canvas->clipPath(path, kIntersect_SkClipOp, true);
259bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        const SkRect bounds = path.getBounds();
260bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed
261bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        SkPaint paint;
262bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        paint.setAlpha(0xCC);
26353f77bd4fdd76525b66b7f26d1c5c550858120dfFlorin Malita        canvas->saveLayer({ &bounds, &paint, fFilter.get(), nullptr, nullptr, 0 });
264bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed
265bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        canvas->restore();
266bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed    }
267bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed
268bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed    bool onAnimate(const SkAnimTimer& timer) override {
269bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        fAngle = SkDoubleToScalar(fmod(timer.secs() * 360 / 5, 360));
270bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        return true;
271bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed    }
272bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed
273bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed    SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
274bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        this->inval(nullptr);
275bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        return new Click(this);
276bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed    }
277bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed
278bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed    bool onClick(Click* click) override {
279bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        this->inval(nullptr);
280bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        fCenter = click->fCurr;
281bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed        return this->INHERITED::onClick(click);
282bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed    }
283bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed
284bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areedprivate:
285bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed    typedef SampleView INHERITED;
286bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed};
287bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areedDEF_SAMPLE( return new BackdropView; )
288