SampleAvoid.cpp revision 0db5a7fae596e4914250554402e4874c33fdf0d4
10db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com#include "SampleCode.h"
20db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com#include "SkView.h"
30db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com#include "SkCanvas.h"
40db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com#include "SkGradientShader.h"
50db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com#include "SkAvoidXfermode.h"
60db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
70db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com///////////////////////////////////////////////////////////////////////////////
80db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
90db5a7fae596e4914250554402e4874c33fdf0d4reed@android.comclass AvoidView : public SkView {
100db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    SkShader* fShader;
110db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
120db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    enum {
130db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        W = 480,
140db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        H = 320
150db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    };
160db5a7fae596e4914250554402e4874c33fdf0d4reed@android.compublic:
170db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    AvoidView() {
180db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        SkColor colors[] = { SK_ColorRED, SK_ColorYELLOW, SK_ColorGREEN, SK_ColorCYAN, SK_ColorBLUE };
190db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
200db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com#if 0
210db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        SkPoint pts[] = { 0, 0, SkIntToScalar(100), SkIntToScalar(100) };
220db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        fShader = SkGradientShader::CreateLinear(pts, colors, NULL,
230db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com                                                 SK_ARRAY_COUNT(colors),
240db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com                                                 SkShader::kMirror_TileMode);
250db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com#else
260db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        SkPoint pts[] = { SkIntToScalar(W)/2, SkIntToScalar(H)/2 };
270db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        fShader = SkGradientShader::CreateRadial(pts[0], SkIntToScalar(H)/5,
280db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com                                                 colors, NULL,
290db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com                                                 SK_ARRAY_COUNT(colors),
300db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com                                                 SkShader::kMirror_TileMode);
310db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com#endif
320db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    }
330db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
340db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    virtual ~AvoidView() {
350db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        fShader->unref();
360db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    }
370db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
380db5a7fae596e4914250554402e4874c33fdf0d4reed@android.comprotected:
390db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    virtual bool onQuery(SkEvent* evt) {
400db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        if (SampleCode::TitleQ(*evt)) {
410db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            SampleCode::TitleR(evt, "AvoidXfermode");
420db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            return true;
430db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        }
440db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        return this->INHERITED::onQuery(evt);
450db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    }
460db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
470db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    virtual void onDraw(SkCanvas* canvas) {
480db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        canvas->drawColor(SK_ColorWHITE);
490db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
500db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        SkPaint paint;
510db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) };
520db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
530db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        canvas->translate(r.width() / 6, r.height() / 6);
540db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
550db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        paint.setShader(fShader);
560db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        canvas->drawRect(r, paint);
570db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
580db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        static const struct {
590db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            int                     fTolerance;
600db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            SkAvoidXfermode::Mode   fMode;
610db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            float                   fDX, fDY;
620db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        } gData[] = {
630db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            { 16,       SkAvoidXfermode::kAvoidColor_Mode, 0, 0 },
640db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            { 255-16,   SkAvoidXfermode::kAvoidColor_Mode, 1, 0 },
650db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            { 16,       SkAvoidXfermode::kTargetColor_Mode, 0, 1 },
660db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            { 255-16,   SkAvoidXfermode::kTargetColor_Mode, 1, 1 },
670db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        };
680db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
690db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        paint.setShader(NULL);
700db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        paint.setColor(SK_ColorMAGENTA);
710db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
720db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        SkPaint frameP;
730db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        frameP.setStyle(SkPaint::kStroke_Style);
740db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
750db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        for (size_t i = 0; i < SK_ARRAY_COUNT(gData); i++) {
760db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            SkAvoidXfermode mode(SK_ColorGREEN, gData[i].fTolerance,
770db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com                                 gData[i].fMode);
780db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            paint.setXfermode(&mode);
790db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            int div = 3;
800db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            SkRect rr = { 0, 0, r.width()/div, r.height()/div };
810db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            rr.offset(r.width()/4 - rr.width()/2, r.height()/4 - rr.height()/2);
820db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            rr.offset(r.width() * gData[i].fDX/2, r.height() * gData[i].fDY/2);
830db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            canvas->drawRect(rr, paint);
840db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            paint.setXfermode(NULL);
850db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
860db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com            canvas->drawRect(rr, frameP);
870db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com        }
880db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    }
890db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
900db5a7fae596e4914250554402e4874c33fdf0d4reed@android.comprivate:
910db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    typedef SkView INHERITED;
920db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com};
930db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
940db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com//////////////////////////////////////////////////////////////////////////////
950db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
960db5a7fae596e4914250554402e4874c33fdf0d4reed@android.comstatic SkView* MyFactory() {
970db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com    return new AvoidView;
980db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com}
990db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
1000db5a7fae596e4914250554402e4874c33fdf0d4reed@android.comstatic SkViewRegister reg(MyFactory);
1010db5a7fae596e4914250554402e4874c33fdf0d4reed@android.com
102