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 "SkColorPriv.h"
121ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com#include "SkShader.h"
131ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
14d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osmanstatic const SkBlendMode gModes[] = {
15d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman    SkBlendMode::kClear,
16d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman    SkBlendMode::kSrc,
17d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman    SkBlendMode::kDst,
18d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman    SkBlendMode::kSrcOver,
19d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman    SkBlendMode::kDstOver,
20d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman    SkBlendMode::kSrcIn,
21d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman    SkBlendMode::kDstIn,
22d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman    SkBlendMode::kSrcOut,
23d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman    SkBlendMode::kDstOut,
24d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman    SkBlendMode::kSrcATop,
25d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman    SkBlendMode::kDstATop,
26d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman    SkBlendMode::kXor,
271ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com};
281ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
291ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comconst int gWidth = 64;
301ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comconst int gHeight = 64;
311ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comconst SkScalar W = SkIntToScalar(gWidth);
321ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comconst SkScalar H = SkIntToScalar(gHeight);
331ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
34374772bd61951f01bf84fe17bf53d8867681c9aereedstatic SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha a1) {
351ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    SkPaint paint;
361ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    paint.setAntiAlias(true);
371ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
381ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    SkRect r = SkRect::MakeWH(W, H);
391ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    r.inset(W/10, H/10);
401ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
411ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    paint.setColor(SK_ColorBLUE);
421ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    paint.setAlpha(a0);
431ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    canvas->drawOval(r, paint);
441ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
451ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    paint.setColor(SK_ColorRED);
461ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    paint.setAlpha(a1);
47374772bd61951f01bf84fe17bf53d8867681c9aereed    paint.setBlendMode(mode);
481ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    for (int angle = 0; angle < 24; ++angle) {
491ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        SkScalar x = SkScalarCos(SkIntToScalar(angle) * (SK_ScalarPI * 2) / 24) * gWidth;
501ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        SkScalar y = SkScalarSin(SkIntToScalar(angle) * (SK_ScalarPI * 2) / 24) * gHeight;
511ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        paint.setStrokeWidth(SK_Scalar1 * angle * 2 / 24);
521ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        canvas->drawLine(W/2, H/2, W/2 + x, H/2 + y, paint);
531ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    }
54ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
551ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    return H;
561ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com}
571ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
588a21c9fe7f5fef9e87115defef27bd7218419f28reedstatic sk_sp<SkShader> make_bg_shader() {
591ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    SkBitmap bm;
60a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org    bm.allocN32Pixels(2, 2);
611ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    *bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = 0xFFFFFFFF;
621ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    *bm.getAddr32(1, 0) = *bm.getAddr32(0, 1) = SkPackARGB32(0xFF, 0xCC, 0xCC, 0xCC);
631ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
641ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    SkMatrix m;
651ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    m.setScale(SkIntToScalar(6), SkIntToScalar(6));
669c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org
678a21c9fe7f5fef9e87115defef27bd7218419f28reed    return SkShader::MakeBitmapShader(bm, SkShader::kRepeat_TileMode,
688a21c9fe7f5fef9e87115defef27bd7218419f28reed                                      SkShader::kRepeat_TileMode, &m);
691ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com}
701ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
711ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comclass HairModesView : public SampleView {
721ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    SkPaint fBGPaint;
731ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.compublic:
74ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com    HairModesView() {
758a21c9fe7f5fef9e87115defef27bd7218419f28reed        fBGPaint.setShader(make_bg_shader());
761ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    }
771ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
781ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comprotected:
791ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    // overrides from SkEventSink
801ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    virtual bool onQuery(SkEvent* evt) {
811ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        if (SampleCode::TitleQ(*evt)) {
821ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            SampleCode::TitleR(evt, "HairlineModes");
831ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            return true;
841ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        }
851ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        return this->INHERITED::onQuery(evt);
861ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    }
871ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
881ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    virtual void onDrawContent(SkCanvas* canvas) {
891ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        const SkRect bounds = SkRect::MakeWH(W, H);
901ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        static const SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 };
911ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
921ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        canvas->translate(SkIntToScalar(4), SkIntToScalar(4));
931ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
941ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        for (int alpha = 0; alpha < 4; ++alpha) {
951ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            canvas->save();
961ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            canvas->save();
971ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); ++i) {
981ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                if (6 == i) {
991ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                    canvas->restore();
1001ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                    canvas->translate(W * 5, 0);
1011ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                    canvas->save();
1021ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                }
1031ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                canvas->drawRect(bounds, fBGPaint);
10496fcdcc219d2a0d3579719b84b28bede76efba64halcanary                canvas->saveLayer(&bounds, nullptr);
105d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman                SkScalar dy = drawCell(canvas, gModes[i],
1061ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                                       gAlphaValue[alpha & 1],
1071ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                                       gAlphaValue[alpha & 2]);
1081ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                canvas->restore();
1091ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
1101ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com                canvas->translate(0, dy * 5 / 4);
1111ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            }
1121ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            canvas->restore();
1131ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            canvas->restore();
1141ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com            canvas->translate(W * 5 / 4, 0);
1151ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com        }
1161ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    }
117ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1181ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comprivate:
1191ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com    typedef SampleView INHERITED;
1201ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com};
1211ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
1221ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com///////////////////////////////////////////////////////////////////////////////
1231ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.com
1241ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comstatic SkView* MyFactory() { return new HairModesView; }
1251ec27a0211a90f8fa919579be77f2cb29ed7ccc5reed@google.comstatic SkViewRegister reg(MyFactory);
126