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