SampleHairModes.cpp revision 8a21c9fe7f5fef9e87115defef27bd7218419f28
11ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com/*
21ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com * Copyright 2011 Google Inc.
31ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com *
41ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com * Use of this source code is governed by a BSD-style license that can be
51ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com * found in the LICENSE file.
61ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com */
71ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
81ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com#include "SampleCode.h"
91ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com#include "SkView.h"
101ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com#include "SkCanvas.h"
111ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com#include "SkDevice.h"
121ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com#include "SkColorPriv.h"
131ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com#include "SkShader.h"
141ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
151ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comstatic const struct {
161ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    SkXfermode::Mode  fMode;
171ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    const char*         fLabel;
181ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com} gModes[] = {
191ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    { SkXfermode::kClear_Mode,    "Clear"     },
201ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    { SkXfermode::kSrc_Mode,      "Src"       },
211ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    { SkXfermode::kDst_Mode,      "Dst"       },
221ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    { SkXfermode::kSrcOver_Mode,  "SrcOver"   },
231ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    { SkXfermode::kDstOver_Mode,  "DstOver"   },
241ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    { SkXfermode::kSrcIn_Mode,    "SrcIn"     },
251ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    { SkXfermode::kDstIn_Mode,    "DstIn"     },
261ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    { SkXfermode::kSrcOut_Mode,   "SrcOut"    },
271ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    { SkXfermode::kDstOut_Mode,   "DstOut"    },
281ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    { SkXfermode::kSrcATop_Mode,  "SrcATop"   },
291ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    { SkXfermode::kDstATop_Mode,  "DstATop"   },
301ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    { SkXfermode::kXor_Mode,      "Xor"       },
311ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com};
321ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
331ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comconst int gWidth = 64;
341ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comconst int gHeight = 64;
351ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comconst SkScalar W = SkIntToScalar(gWidth);
361ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comconst SkScalar H = SkIntToScalar(gHeight);
371ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
381ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comstatic SkScalar drawCell(SkCanvas* canvas, SkXfermode* mode, SkAlpha a0, SkAlpha a1) {
391ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
401ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    SkPaint paint;
411ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    paint.setAntiAlias(true);
421ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
431ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    SkRect r = SkRect::MakeWH(W, H);
441ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    r.inset(W/10, H/10);
451ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
461ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    paint.setColor(SK_ColorBLUE);
471ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    paint.setAlpha(a0);
481ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    canvas->drawOval(r, paint);
491ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
501ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    paint.setColor(SK_ColorRED);
511ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    paint.setAlpha(a1);
521ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    paint.setXfermode(mode);
531ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    for (int angle = 0; angle < 24; ++angle) {
541ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        SkScalar x = SkScalarCos(SkIntToScalar(angle) * (SK_ScalarPI * 2) / 24) * gWidth;
551ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        SkScalar y = SkScalarSin(SkIntToScalar(angle) * (SK_ScalarPI * 2) / 24) * gHeight;
561ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        paint.setStrokeWidth(SK_Scalar1 * angle * 2 / 24);
571ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        canvas->drawLine(W/2, H/2, W/2 + x, H/2 + y, paint);
581ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    }
59ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
601ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    return H;
611ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com}
621ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
638a21c9fe7f5fef9e87115defef27bd7218419f28reedstatic sk_sp<SkShader> make_bg_shader() {
641ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    SkBitmap bm;
65a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org    bm.allocN32Pixels(2, 2);
661ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    *bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = 0xFFFFFFFF;
671ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    *bm.getAddr32(1, 0) = *bm.getAddr32(0, 1) = SkPackARGB32(0xFF, 0xCC, 0xCC, 0xCC);
681ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
691ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    SkMatrix m;
701ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    m.setScale(SkIntToScalar(6), SkIntToScalar(6));
719c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org
728a21c9fe7f5fef9e87115defef27bd7218419f28reed    return SkShader::MakeBitmapShader(bm, SkShader::kRepeat_TileMode,
738a21c9fe7f5fef9e87115defef27bd7218419f28reed                                      SkShader::kRepeat_TileMode, &m);
741ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com}
751ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
761ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comclass HairModesView : public SampleView {
771ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    SkPaint fBGPaint;
781ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.compublic:
79ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com    HairModesView() {
808a21c9fe7f5fef9e87115defef27bd7218419f28reed        fBGPaint.setShader(make_bg_shader());
811ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    }
821ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
831ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comprotected:
841ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    // overrides from SkEventSink
851ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    virtual bool onQuery(SkEvent* evt) {
861ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        if (SampleCode::TitleQ(*evt)) {
871ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            SampleCode::TitleR(evt, "HairlineModes");
881ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            return true;
891ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        }
901ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        return this->INHERITED::onQuery(evt);
911ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    }
921ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
931ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    virtual void onDrawContent(SkCanvas* canvas) {
941ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        const SkRect bounds = SkRect::MakeWH(W, H);
951ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        static const SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 };
961ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
971ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        canvas->translate(SkIntToScalar(4), SkIntToScalar(4));
981ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
991ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        for (int alpha = 0; alpha < 4; ++alpha) {
1001ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            canvas->save();
1011ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            canvas->save();
1021ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); ++i) {
1031ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                if (6 == i) {
1041ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                    canvas->restore();
1051ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                    canvas->translate(W * 5, 0);
1061ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                    canvas->save();
1071ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                }
1081ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                SkXfermode* mode = SkXfermode::Create(gModes[i].fMode);
109ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1101ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                canvas->drawRect(bounds, fBGPaint);
11196fcdcc219d2a0d3579719b84b28bede76efba64halcanary                canvas->saveLayer(&bounds, nullptr);
1121ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                SkScalar dy = drawCell(canvas, mode,
1131ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                                       gAlphaValue[alpha & 1],
1141ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                                       gAlphaValue[alpha & 2]);
1151ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                canvas->restore();
1161ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
1171ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                canvas->translate(0, dy * 5 / 4);
1181ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                SkSafeUnref(mode);
1191ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            }
1201ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            canvas->restore();
1211ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            canvas->restore();
1221ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            canvas->translate(W * 5 / 4, 0);
1231ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        }
1241ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    }
125ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1261ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comprivate:
1271ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    typedef SampleView INHERITED;
1281ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com};
1291ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
1301ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com///////////////////////////////////////////////////////////////////////////////
1311ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
1321ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comstatic SkView* MyFactory() { return new HairModesView; }
1331ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comstatic SkViewRegister reg(MyFactory);
134