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