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 */
80db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com#include "SampleCode.h"
90db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com#include "SkView.h"
100db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com#include "SkCanvas.h"
110db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com#include "SkGradientShader.h"
120db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com#include "SkAvoidXfermode.h"
130db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
140db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com///////////////////////////////////////////////////////////////////////////////
150db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
165fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.orgclass AvoidView : public SampleView {
170db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    SkShader* fShader;
180db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
190db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    enum {
200db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        W = 480,
210db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        H = 320
220db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    };
230db5a7fae596e4914250554402e4874c33fdf0d4reed@android.compublic:
240db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    AvoidView() {
250db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        SkColor colors[] = { SK_ColorRED, SK_ColorYELLOW, SK_ColorGREEN, SK_ColorCYAN, SK_ColorBLUE };
260db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
270db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com#if 0
280db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        SkPoint pts[] = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
290db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        fShader = SkGradientShader::CreateLinear(pts, colors, NULL,
300db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com                                                 SK_ARRAY_COUNT(colors),
310db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com                                                 SkShader::kMirror_TileMode);
320db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com#else
3364cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org        SkPoint pts[] = { { SkIntToScalar(W)/2, SkIntToScalar(H)/2 } };
340db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        fShader = SkGradientShader::CreateRadial(pts[0], SkIntToScalar(H)/5,
350db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com                                                 colors, NULL,
360db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com                                                 SK_ARRAY_COUNT(colors),
370db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com                                                 SkShader::kMirror_TileMode);
380db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com#endif
390db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    }
40ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
410db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    virtual ~AvoidView() {
420db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        fShader->unref();
430db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    }
440db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
450db5a7fae596e4914250554402e4874c33fdf0d4reed@android.comprotected:
460db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    virtual bool onQuery(SkEvent* evt) {
470db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        if (SampleCode::TitleQ(*evt)) {
480db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            SampleCode::TitleR(evt, "AvoidXfermode");
490db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            return true;
500db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        }
510db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        return this->INHERITED::onQuery(evt);
520db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    }
530db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
545fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.org    virtual void onDrawContent(SkCanvas* canvas) {
550db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        SkPaint paint;
560db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) };
57ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
580db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        canvas->translate(r.width() / 6, r.height() / 6);
590db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
600db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        paint.setShader(fShader);
610db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        canvas->drawRect(r, paint);
620db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
630db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        static const struct {
640db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            int                     fTolerance;
650db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            SkAvoidXfermode::Mode   fMode;
660db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            float                   fDX, fDY;
670db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        } gData[] = {
680db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            { 16,       SkAvoidXfermode::kAvoidColor_Mode, 0, 0 },
690db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            { 255-16,   SkAvoidXfermode::kAvoidColor_Mode, 1, 0 },
700db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            { 16,       SkAvoidXfermode::kTargetColor_Mode, 0, 1 },
710db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            { 255-16,   SkAvoidXfermode::kTargetColor_Mode, 1, 1 },
720db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        };
730db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
740db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        paint.setShader(NULL);
750db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        paint.setColor(SK_ColorMAGENTA);
76ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
770db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        SkPaint frameP;
780db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        frameP.setStyle(SkPaint::kStroke_Style);
790db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
800db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        for (size_t i = 0; i < SK_ARRAY_COUNT(gData); i++) {
810a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org            SkAutoTUnref<SkAvoidXfermode> mode(SkAvoidXfermode::Create(
820a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org                SK_ColorGREEN, gData[i].fTolerance, gData[i].fMode));
830a2bf90dccba3bde188e0386a7f0c60e6dde1ae9commit-bot@chromium.org            paint.setXfermode(mode);
840db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            int div = 3;
850db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            SkRect rr = { 0, 0, r.width()/div, r.height()/div };
860db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            rr.offset(r.width()/4 - rr.width()/2, r.height()/4 - rr.height()/2);
870db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            rr.offset(r.width() * gData[i].fDX/2, r.height() * gData[i].fDY/2);
880db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            canvas->drawRect(rr, paint);
890db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            paint.setXfermode(NULL);
900db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
910db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            canvas->drawRect(rr, frameP);
920db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        }
930db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    }
94ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
950db5a7fae596e4914250554402e4874c33fdf0d4reed@android.comprivate:
965fd9243fd6b82aa3f2a2fae7c62310e77ab7b6d3mike@reedtribe.org    typedef SampleView INHERITED;
970db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com};
980db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
990db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com//////////////////////////////////////////////////////////////////////////////
1000db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
1010db5a7fae596e4914250554402e4874c33fdf0d4reed@android.comstatic SkView* MyFactory() {
1020db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    return new AvoidView;
1030db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com}
1040db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
1050db5a7fae596e4914250554402e4874c33fdf0d4reed@android.comstatic SkViewRegister reg(MyFactory);
106