SampleLayers.cpp revision ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976e
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 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 "SkDevice.h" 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkGradientShader.h" 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkImageDecoder.h" 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkInterpolator.h" 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkMaskFilter.h" 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPath.h" 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRegion.h" 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkShader.h" 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTime.h" 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTypeface.h" 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkUtils.h" 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkKey.h" 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkXfermode.h" 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkDrawFilter.h" 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void make_paint(SkPaint* paint) { 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkColor colors[] = { 0, SK_ColorWHITE }; 3264cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org SkPoint pts[] = { { 0, 0 }, { 0, SK_Scalar1*20 } }; 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode); 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com paint->setShader(s)->unref(); 360baf19375466cfc24c96532df406e7c5b1d1aae8reed@android.com paint->setXfermodeMode(SkXfermode::kDstIn_Mode); 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void dump_layers(const char label[], SkCanvas* canvas) { 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("Dump Layers(%s)\n", label); 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkCanvas::LayerIter iter(canvas, true); 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int index = 0; 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com while (!iter.done()) { 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkBitmap& bm = iter.device()->accessBitmap(false); 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const SkIRect& clip = iter.clip().getBounds(); 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkDebugf("Layer[%d] bitmap [%d %d] X=%d Y=%d clip=[%d %d %d %d] alpha=%d\n", index++, 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bm.width(), bm.height(), iter.x(), iter.y(), 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com clip.fLeft, clip.fTop, clip.fRight, clip.fBottom, 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com iter.paint().getAlpha()); 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com iter.next(); 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// test drawing with strips of fading gradient above and below 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic void test_fade(SkCanvas* canvas) { 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkAutoCanvasRestore ar(canvas, true); 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRect r; 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint p; 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setAlpha(0x88); 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkAutoCanvasRestore(canvas, false); 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // create the layers 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100)); 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->clipRect(r); 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.fBottom = SkIntToScalar(20); 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->saveLayer(&r, NULL, (SkCanvas::SaveFlags)(SkCanvas::kHasAlphaLayer_SaveFlag | SkCanvas::kFullColorLayer_SaveFlag)); 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.fTop = SkIntToScalar(80); 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.fBottom = SkIntToScalar(100); 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->saveLayer(&r, NULL, (SkCanvas::SaveFlags)(SkCanvas::kHasAlphaLayer_SaveFlag | SkCanvas::kFullColorLayer_SaveFlag)); 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // now draw the "content" 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (true) { 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100)); 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->saveLayerAlpha(&r, 0x80); 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint p; 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setColor(SK_ColorRED); 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setAntiAlias(true); 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawOval(r, p); 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dump_layers("inside layer alpha", canvas); 918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->restore(); 938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100)); 958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint p; 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setColor(SK_ColorRED); 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setAntiAlias(true); 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawOval(r, p); 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// return; 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com dump_layers("outside layer alpha", canvas); 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // now apply an effect 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint paint; 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com make_paint(&paint); 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.set(0, 0, SkIntToScalar(100), SkIntToScalar(20)); 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// SkDebugf("--------- draw top grad\n"); 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawRect(r, paint); 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkMatrix m; 1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkShader* s = paint.getShader(); 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com m.setScale(SK_Scalar1, -SK_Scalar1); 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com m.postTranslate(0, SkIntToScalar(100)); 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com s->setLocalMatrix(m); 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.fTop = SkIntToScalar(80); 1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.fBottom = SkIntToScalar(100); 1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// SkDebugf("--------- draw bot grad\n"); 1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawRect(r, paint); 1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass RedFilter : public SkDrawFilter { 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual bool filter(SkCanvas*, SkPaint* p, SkDrawFilter::Type) { 1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fColor = p->getColor(); 1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (fColor == SK_ColorRED) { 1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p->setColor(SK_ColorGREEN); 1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void restore(SkCanvas*, SkPaint* p, SkDrawFilter::Type) { 1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p->setColor(fColor); 1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkColor fColor; 1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass LayersView : public SkView { 1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com LayersView() {} 1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // overrides from SkEventSink 1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual bool onQuery(SkEvent* evt) { 1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (SampleCode::TitleQ(*evt)) { 1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SampleCode::TitleR(evt, "Layers"); 1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->INHERITED::onQuery(evt); 1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void drawBG(SkCanvas* canvas) { 158149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com canvas->drawColor(SK_ColorGRAY); 1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void onDraw(SkCanvas* canvas) { 1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->drawBG(canvas); 1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 164149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com if (true) { 165149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com SkRect r; 166149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com r.set(SkIntToScalar(0), SkIntToScalar(0), 167149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com SkIntToScalar(220), SkIntToScalar(120)); 168149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com SkPaint p; 169149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com canvas->saveLayer(&r, &p); 170149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com canvas->drawColor(0xFFFF0000); 171f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com p.setAlpha(0); // or 0 1720baf19375466cfc24c96532df406e7c5b1d1aae8reed@android.com p.setXfermodeMode(SkXfermode::kSrc_Mode); 173149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com canvas->drawOval(r, p); 174149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com canvas->restore(); 175149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com return; 176149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com } 177149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com 1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (false) { 1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRect r; 1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.set(SkIntToScalar(0), SkIntToScalar(0), 1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkIntToScalar(220), SkIntToScalar(120)); 1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint p; 1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setAlpha(0x88); 1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setAntiAlias(true); 1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (true) { 1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->saveLayer(&r, &p); 1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setColor(0xFFFF0000); 1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawOval(r, p); 1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->restore(); 1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setColor(0xFF0000FF); 1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.offset(SkIntToScalar(20), SkIntToScalar(50)); 1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawOval(r, p); 1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (false) { 1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint p; 2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setAlpha(0x88); 2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setAntiAlias(true); 2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(300), 0); 2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRect r; 2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.set(SkIntToScalar(0), SkIntToScalar(0), 2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkIntToScalar(220), SkIntToScalar(60)); 2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->saveLayer(&r, &p, (SkCanvas::SaveFlags)(SkCanvas::kHasAlphaLayer_SaveFlag | SkCanvas::kFullColorLayer_SaveFlag)); 2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// canvas->clipRect(r, SkRegion::kDifference_Op); 2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// canvas->clipRect(r, SkRegion::kIntersect_Op); 2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.set(SkIntToScalar(0), SkIntToScalar(0), 2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkIntToScalar(220), SkIntToScalar(120)); 2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setColor(SK_ColorBLUE); 2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawOval(r, p); 2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->restore(); 2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return; 2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com //canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com test_fade(canvas); 2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return; 2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // canvas->setDrawFilter(new RedFilter)->unref(); 2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRect r; 2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkPaint p; 2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->translate(SkIntToScalar(220), SkIntToScalar(20)); 2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setAntiAlias(true); 2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com r.set(SkIntToScalar(20), SkIntToScalar(20), 2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkIntToScalar(220), SkIntToScalar(120)); 2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setColor(SK_ColorBLUE); 2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // p.setMaskFilter(SkBlurMaskFilter::Create(SkIntToScalar(8), SkBlurMaskFilter::kNormal_BlurStyle))->unref(); 2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawRect(r, p); 2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setMaskFilter(NULL); 2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRect bounds = r; 2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bounds.fBottom = bounds.centerY(); 2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->saveLayer(&bounds, NULL, SkCanvas::kARGB_NoClipLayer_SaveFlag); 2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setColor(SK_ColorRED); 2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawOval(r, p); 2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com p.setAlpha(0x80); 2490baf19375466cfc24c96532df406e7c5b1d1aae8reed@android.com p.setXfermodeMode(SkXfermode::kDstIn_Mode); 2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->drawRect(bounds, p); 2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com canvas->restore(); 2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) { 2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->inval(NULL); 2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->INHERITED::onFindClickHandler(x, y); 2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual bool onClick(Click* click) { 2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->INHERITED::onClick(click); 2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual bool handleKey(SkKey key) { 2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->inval(NULL); 2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return true; 2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkView INHERITED; 2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com////////////////////////////////////////////////////////////////////////////// 2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkView* MyFactory() { return new LayersView; } 2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkViewRegister reg(MyFactory); 2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 279