SampleLayers.cpp revision e61a86cfa00ea393ecc4a71fca94e1d476a37ecc
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);
34ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.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;
60ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkPaint p;
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    p.setAlpha(0x88);
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
64e61a86cfa00ea393ecc4a71fca94e1d476a37ecccommit-bot@chromium.org    SkAutoCanvasRestore ar2(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);
70ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.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));
77ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
78ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.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);
89ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        dump_layers("inside layer alpha", canvas);
91ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->restore();
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } else {
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        r.set(0, 0, SkIntToScalar(100), SkIntToScalar(100));
95ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.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    }
101ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.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);
119ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.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:
128971aca75572ed6e0c5e1cc959173dc58ca7b6b8dreed@google.com    virtual bool filter(SkPaint* p, SkDrawFilter::Type) SK_OVERRIDE {
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fColor = p->getColor();
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (fColor == SK_ColorRED) {
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p->setColor(SK_ColorGREEN);
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
133971aca75572ed6e0c5e1cc959173dc58ca7b6b8dreed@google.com        return true;
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
135ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkColor fColor;
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass LayersView : public SkView {
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
142ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com    LayersView() {}
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected:
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // overrides from SkEventSink
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool onQuery(SkEvent* evt) {
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (SampleCode::TitleQ(*evt)) {
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SampleCode::TitleR(evt, "Layers");
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return true;
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return this->INHERITED::onQuery(evt);
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
153ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void drawBG(SkCanvas* canvas) {
155149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com        canvas->drawColor(SK_ColorGRAY);
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
157ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void onDraw(SkCanvas* canvas) {
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->drawBG(canvas);
160ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
161149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com        if (true) {
162149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com            SkRect r;
163ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com            r.set(SkIntToScalar(0), SkIntToScalar(0),
164ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com                  SkIntToScalar(220), SkIntToScalar(120));
165149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com            SkPaint p;
166149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com            canvas->saveLayer(&r, &p);
167149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com            canvas->drawColor(0xFFFF0000);
168f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com            p.setAlpha(0);  // or 0
1690baf19375466cfc24c96532df406e7c5b1d1aae8reed@android.com            p.setXfermodeMode(SkXfermode::kSrc_Mode);
170149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com            canvas->drawOval(r, p);
171149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com            canvas->restore();
172149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com            return;
173149e2f6159a797989f6f0fa93ecfaa66cdd55c40reed@android.com        }
174ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (false) {
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkRect r;
177ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com            r.set(SkIntToScalar(0), SkIntToScalar(0),
178ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com                  SkIntToScalar(220), SkIntToScalar(120));
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkPaint p;
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setAlpha(0x88);
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setAntiAlias(true);
182ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (true) {
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                canvas->saveLayer(&r, &p);
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                p.setColor(0xFFFF0000);
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                canvas->drawOval(r, p);
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                canvas->restore();
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setColor(0xFF0000FF);
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            r.offset(SkIntToScalar(20), SkIntToScalar(50));
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->drawOval(r, p);
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (false) {
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkPaint p;
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setAlpha(0x88);
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setAntiAlias(true);
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->translate(SkIntToScalar(300), 0);
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkRect r;
203ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com            r.set(SkIntToScalar(0), SkIntToScalar(0),
204ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com                  SkIntToScalar(220), SkIntToScalar(60));
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->saveLayer(&r, &p, (SkCanvas::SaveFlags)(SkCanvas::kHasAlphaLayer_SaveFlag | SkCanvas::kFullColorLayer_SaveFlag));
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//            canvas->clipRect(r, SkRegion::kDifference_Op);
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//            canvas->clipRect(r, SkRegion::kIntersect_Op);
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
210ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com            r.set(SkIntToScalar(0), SkIntToScalar(0),
211ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com                  SkIntToScalar(220), SkIntToScalar(120));
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            p.setColor(SK_ColorBLUE);
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->drawOval(r, p);
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            canvas->restore();
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return;
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
217ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        //canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        test_fade(canvas);
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return;
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    //    canvas->setDrawFilter(new RedFilter)->unref();
223ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkRect  r;
2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkPaint p;
226ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->translate(SkIntToScalar(220), SkIntToScalar(20));
228ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p.setAntiAlias(true);
2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        r.set(SkIntToScalar(20), SkIntToScalar(20),
2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com              SkIntToScalar(220), SkIntToScalar(120));
232ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p.setColor(SK_ColorBLUE);
2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com     //   p.setMaskFilter(SkBlurMaskFilter::Create(SkIntToScalar(8), SkBlurMaskFilter::kNormal_BlurStyle))->unref();
2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawRect(r, p);
2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p.setMaskFilter(NULL);
2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkRect bounds = r;
2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        bounds.fBottom = bounds.centerY();
2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->saveLayer(&bounds, NULL, SkCanvas::kARGB_NoClipLayer_SaveFlag);
2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p.setColor(SK_ColorRED);
2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawOval(r, p);
244ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        p.setAlpha(0x80);
2460baf19375466cfc24c96532df406e7c5b1d1aae8reed@android.com        p.setXfermodeMode(SkXfermode::kDstIn_Mode);
2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->drawRect(bounds, p);
2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        canvas->restore();
2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
251ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
2524d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com    virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y,
2534d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com                                              unsigned modi) SK_OVERRIDE {
2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->inval(NULL);
255ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
2564d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com        return this->INHERITED::onFindClickHandler(x, y, modi);
2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
258ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual bool onClick(Click* click) {
2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return this->INHERITED::onClick(click);
2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
26393c7ee34dc5c8f6bfad65809f4b39f8d00d7f0d4sugoi@google.com    virtual bool handleKey(SkKey) {
2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->inval(NULL);
2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return true;
2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkView INHERITED;
2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////////
2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkView* MyFactory() { return new LayersView; }
2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic SkViewRegister reg(MyFactory);
276