1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7bf0001d0472d727266762c5967ec0d919a6df083reed@google.com
8271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SampleCode.h"
9271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkView.h"
1075ae421c24ee7ab5a86334e43404b24a6a6fb1f4Mike Reed#include "SkBitmap.h"
11b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h"
12271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkCanvas.h"
13271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkCornerPathEffect.h"
14271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkGradientShader.h"
15271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkGraphics.h"
16271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkPath.h"
17271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkRandom.h"
18271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkRegion.h"
19271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkShader.h"
20271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkUtils.h"
21271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkColorPriv.h"
22271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkColorFilter.h"
23271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkTime.h"
24271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkTypeface.h"
25271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
26271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkStream.h"
27271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkColorPriv.h"
28271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com#include "SkBlurMaskFilter.h"
29271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
30271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comstatic void setNamedTypeface(SkPaint* paint, const char name[]) {
31ee6a9919a362e16c1d84a870ce867d1ad7b8a141mboc    paint->setTypeface(SkTypeface::MakeFromName(name, SkFontStyle()));
32271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com}
33271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
34271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comstatic uint16_t gBG[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF };
35271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
36271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comclass XfermodesBlurView : public SampleView {
37271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    SkBitmap    fBG;
38271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    SkBitmap    fSrcB, fDstB;
39271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
40374772bd61951f01bf84fe17bf53d8867681c9aereed    void draw_mode(SkCanvas* canvas, SkBlendMode mode, int alpha, SkScalar x, SkScalar y) {
41271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkPaint p;
42efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed        p.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
43efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed                                               SkBlurMask::ConvertRadiusToSigma(5),
44efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed                                               SkBlurMaskFilter::kNone_BlurFlag));
45271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
46271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkScalar ww = SkIntToScalar(W);
47271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkScalar hh = SkIntToScalar(H);
48271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
49271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        // draw a circle covering the upper
50271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        // left three quarters of the canvas
51271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        p.setColor(0xFFCC44FF);
52271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkRect r;
53271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        r.set(0, 0, ww*3/4, hh*3/4);
54271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        r.offset(x, y);
55271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        canvas->drawOval(r, p);
56271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
57374772bd61951f01bf84fe17bf53d8867681c9aereed        p.setBlendMode(mode);
58271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
59271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        // draw a square overlapping the circle
60271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        // in the lower right of the canvas
61271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        p.setColor(0x00AA6633 | alpha << 24);
62271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        r.set(ww/3, hh/3, ww*19/20, hh*19/20);
63271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        r.offset(x, y);
64271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        canvas->drawRect(r, p);
65271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    }
66271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
67271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.compublic:
68271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    const static int W = 64;
69271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    const static int H = 64;
7022c5deaf755223111cb055462ac5bbce623f3a08bsalomon@google.com    XfermodesBlurView() {
7100f8d6c75d22ce8f95f932c5b101354b196fa0dfcommit-bot@chromium.org        fBG.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType, kPremul_SkAlphaType),
7200f8d6c75d22ce8f95f932c5b101354b196fa0dfcommit-bot@chromium.org                          gBG, 4);
73271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    }
74271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
75271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comprotected:
76271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    // overrides from SkEventSink
77271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    virtual bool onQuery(SkEvent* evt) {
78271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        if (SampleCode::TitleQ(*evt)) {
79271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            SampleCode::TitleR(evt, "XfermodesBlur");
80271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            return true;
81271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        }
82271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        return this->INHERITED::onQuery(evt);
83271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    }
84271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
85271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    virtual void onDrawContent(SkCanvas* canvas) {
86271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
87271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
8887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        if (false) {
8987fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            SkPaint paint;
9087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setAntiAlias(true);
9187fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setTextSize(50);
92ee6a9919a362e16c1d84a870ce867d1ad7b8a141mboc            paint.setTypeface(SkTypeface::MakeFromName("Arial Unicode MS", SkFontStyle()));
9387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            char buffer[10];
9487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            size_t len = SkUTF8_FromUnichar(0x8500, buffer);
9587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            canvas->drawText(buffer, len, 40, 40, paint);
9687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            return;
9787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        }
980e0c94c8e9062a0e11f2bad55f1c1a83b34ddbc8reed@google.com        if (false) {
9987fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            SkPaint paint;
10087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setAntiAlias(true);
101ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
10287fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            SkRect r0 = { 0, 0, 10.5f, 20 };
10387fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            SkRect r1 = { 10.5f, 10, 20, 30 };
10487fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setColor(SK_ColorRED);
10587fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            canvas->drawRect(r0, paint);
10687fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            paint.setColor(SK_ColorBLUE);
10787fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            canvas->drawRect(r1, paint);
10887fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com            return;
10987fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com        }
11087fac4abd7ea446c05d5cfd4a8ad27420223b591reed@google.com
111d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman        const SkBlendMode gModes[] = {
112d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kClear,
113d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kSrc,
114d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kDst,
115d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kSrcOver,
116d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kDstOver,
117d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kSrcIn,
118d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kDstIn,
119d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kSrcOut,
120d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kDstOut,
121d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kSrcATop,
122d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kDstATop,
123d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kXor,
124d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman            SkBlendMode::kPlus,
125271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        };
126271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
127271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        const SkScalar w = SkIntToScalar(W);
128271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        const SkScalar h = SkIntToScalar(H);
129271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkMatrix m;
130271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        m.setScale(SkIntToScalar(6), SkIntToScalar(6));
1318a21c9fe7f5fef9e87115defef27bd7218419f28reed        auto s = SkShader::MakeBitmapShader(fBG, SkShader::kRepeat_TileMode,
1328a21c9fe7f5fef9e87115defef27bd7218419f28reed                                            SkShader::kRepeat_TileMode, &m);
133271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
134271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkPaint labelP;
135271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        labelP.setAntiAlias(true);
136271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        labelP.setLCDRenderText(true);
137271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        labelP.setTextAlign(SkPaint::kCenter_Align);
138271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        setNamedTypeface(&labelP, "Menlo Regular");
139271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
140271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        const int W = 5;
141271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
142271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        SkScalar x0 = 0;
143271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        for (int twice = 0; twice < 2; twice++) {
144271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            SkScalar x = x0, y = 0;
145271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
146271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                SkRect r;
147271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                r.set(x, y, x+w, y+h);
148271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
149271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                SkPaint p;
150271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                p.setStyle(SkPaint::kFill_Style);
151271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                p.setShader(s);
152271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                canvas->drawRect(r, p);
153271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
15496fcdcc219d2a0d3579719b84b28bede76efba64halcanary                canvas->saveLayer(&r, nullptr);
155d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman                draw_mode(canvas, gModes[i], twice ? 0x88 : 0xFF, r.fLeft, r.fTop);
156271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                canvas->restore();
157271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
158271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
159271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                p.setStyle(SkPaint::kStroke_Style);
16096fcdcc219d2a0d3579719b84b28bede76efba64halcanary                p.setShader(nullptr);
161271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                canvas->drawRect(r, p);
162271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
163d1e67e70ae566bd841a2926eb07446ad99c64e59Brian Osman                const char* label = SkBlendMode_Name(gModes[i]);
1642a475eae622adc1e8fa29206be1eaf862c23548eCary Clark                canvas->drawString(label,
165271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                                 x + w/2, y - labelP.getTextSize()/2, labelP);
166271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                x += w + SkIntToScalar(10);
167271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                if ((i % W) == W - 1) {
168271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                    x = x0;
169271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                    y += h + SkIntToScalar(30);
170271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com                }
171271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            }
172271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com            x0 += SkIntToScalar(400);
173271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com        }
174271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    }
175271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
176271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comprivate:
177271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com    typedef SampleView INHERITED;
178271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com};
179271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
180271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com//////////////////////////////////////////////////////////////////////////////
181271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.com
182271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comstatic SkView* MyFactory() { return new XfermodesBlurView; }
183271cffc77bd2fcb3458559e509634442517ca1e9bsalomon@google.comstatic SkViewRegister reg(MyFactory);
184