1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2011 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h"
9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h"
10cb93a386Sopenharmony_ci#include "include/core/SkColorFilter.h"
11cb93a386Sopenharmony_ci#include "include/core/SkColorPriv.h"
12cb93a386Sopenharmony_ci#include "include/core/SkFont.h"
13cb93a386Sopenharmony_ci#include "include/core/SkGraphics.h"
14cb93a386Sopenharmony_ci#include "include/core/SkPath.h"
15cb93a386Sopenharmony_ci#include "include/core/SkRegion.h"
16cb93a386Sopenharmony_ci#include "include/core/SkShader.h"
17cb93a386Sopenharmony_ci#include "include/core/SkTime.h"
18cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h"
19cb93a386Sopenharmony_ci#include "include/effects/SkCornerPathEffect.h"
20cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h"
21cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h"
22cb93a386Sopenharmony_ci#include "include/utils/SkTextUtils.h"
23cb93a386Sopenharmony_ci#include "samplecode/Sample.h"
24cb93a386Sopenharmony_ci#include "src/core/SkBlurMask.h"
25cb93a386Sopenharmony_ci#include "src/utils/SkUTF.h"
26cb93a386Sopenharmony_ci
27cb93a386Sopenharmony_ci#include "include/core/SkColorPriv.h"
28cb93a386Sopenharmony_ci#include "include/core/SkMaskFilter.h"
29cb93a386Sopenharmony_ci#include "include/core/SkStream.h"
30cb93a386Sopenharmony_ci
31cb93a386Sopenharmony_cistatic void setNamedTypeface(SkFont* font, const char name[]) {
32cb93a386Sopenharmony_ci    font->setTypeface(SkTypeface::MakeFromName(name, SkFontStyle()));
33cb93a386Sopenharmony_ci}
34cb93a386Sopenharmony_ci
35cb93a386Sopenharmony_cistatic uint16_t gBG[] = { 0xFFFF, 0xCCCF, 0xCCCF, 0xFFFF };
36cb93a386Sopenharmony_ci
37cb93a386Sopenharmony_ciclass XfermodesBlurView : public Sample {
38cb93a386Sopenharmony_ci    SkBitmap    fBG;
39cb93a386Sopenharmony_ci    SkBitmap    fSrcB, fDstB;
40cb93a386Sopenharmony_ci
41cb93a386Sopenharmony_ci    void draw_mode(SkCanvas* canvas, SkBlendMode mode, int alpha, SkScalar x, SkScalar y) {
42cb93a386Sopenharmony_ci        SkPaint p;
43cb93a386Sopenharmony_ci        p.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle,
44cb93a386Sopenharmony_ci                                               SkBlurMask::ConvertRadiusToSigma(5)));
45cb93a386Sopenharmony_ci
46cb93a386Sopenharmony_ci        SkScalar ww = SkIntToScalar(W);
47cb93a386Sopenharmony_ci        SkScalar hh = SkIntToScalar(H);
48cb93a386Sopenharmony_ci
49cb93a386Sopenharmony_ci        // draw a circle covering the upper
50cb93a386Sopenharmony_ci        // left three quarters of the canvas
51cb93a386Sopenharmony_ci        p.setColor(0xFFCC44FF);
52cb93a386Sopenharmony_ci        SkRect r;
53cb93a386Sopenharmony_ci        r.setLTRB(0, 0, ww*3/4, hh*3/4);
54cb93a386Sopenharmony_ci        r.offset(x, y);
55cb93a386Sopenharmony_ci        canvas->drawOval(r, p);
56cb93a386Sopenharmony_ci
57cb93a386Sopenharmony_ci        p.setBlendMode(mode);
58cb93a386Sopenharmony_ci
59cb93a386Sopenharmony_ci        // draw a square overlapping the circle
60cb93a386Sopenharmony_ci        // in the lower right of the canvas
61cb93a386Sopenharmony_ci        p.setColor(0x00AA6633 | alpha << 24);
62cb93a386Sopenharmony_ci        r.setLTRB(ww/3, hh/3, ww*19/20, hh*19/20);
63cb93a386Sopenharmony_ci        r.offset(x, y);
64cb93a386Sopenharmony_ci        canvas->drawRect(r, p);
65cb93a386Sopenharmony_ci    }
66cb93a386Sopenharmony_ci
67cb93a386Sopenharmony_cipublic:
68cb93a386Sopenharmony_ci    const static int W = 64;
69cb93a386Sopenharmony_ci    const static int H = 64;
70cb93a386Sopenharmony_ci    XfermodesBlurView() {
71cb93a386Sopenharmony_ci        fBG.installPixels(SkImageInfo::Make(2, 2, kARGB_4444_SkColorType, kPremul_SkAlphaType),
72cb93a386Sopenharmony_ci                          gBG, 4);
73cb93a386Sopenharmony_ci    }
74cb93a386Sopenharmony_ci
75cb93a386Sopenharmony_ciprotected:
76cb93a386Sopenharmony_ci    SkString name() override { return SkString("XfermodesBlur"); }
77cb93a386Sopenharmony_ci
78cb93a386Sopenharmony_ci    void onDrawContent(SkCanvas* canvas) override {
79cb93a386Sopenharmony_ci        canvas->translate(SkIntToScalar(10), SkIntToScalar(20));
80cb93a386Sopenharmony_ci
81cb93a386Sopenharmony_ci        const SkBlendMode gModes[] = {
82cb93a386Sopenharmony_ci            SkBlendMode::kClear,
83cb93a386Sopenharmony_ci            SkBlendMode::kSrc,
84cb93a386Sopenharmony_ci            SkBlendMode::kDst,
85cb93a386Sopenharmony_ci            SkBlendMode::kSrcOver,
86cb93a386Sopenharmony_ci            SkBlendMode::kDstOver,
87cb93a386Sopenharmony_ci            SkBlendMode::kSrcIn,
88cb93a386Sopenharmony_ci            SkBlendMode::kDstIn,
89cb93a386Sopenharmony_ci            SkBlendMode::kSrcOut,
90cb93a386Sopenharmony_ci            SkBlendMode::kDstOut,
91cb93a386Sopenharmony_ci            SkBlendMode::kSrcATop,
92cb93a386Sopenharmony_ci            SkBlendMode::kDstATop,
93cb93a386Sopenharmony_ci            SkBlendMode::kXor,
94cb93a386Sopenharmony_ci            SkBlendMode::kPlus,
95cb93a386Sopenharmony_ci        };
96cb93a386Sopenharmony_ci
97cb93a386Sopenharmony_ci        const SkScalar w = SkIntToScalar(W);
98cb93a386Sopenharmony_ci        const SkScalar h = SkIntToScalar(H);
99cb93a386Sopenharmony_ci        SkMatrix m;
100cb93a386Sopenharmony_ci        m.setScale(SkIntToScalar(6), SkIntToScalar(6));
101cb93a386Sopenharmony_ci        auto s = fBG.makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat, SkSamplingOptions(), m);
102cb93a386Sopenharmony_ci
103cb93a386Sopenharmony_ci        SkFont font;
104cb93a386Sopenharmony_ci        font.setEdging(SkFont::Edging::kSubpixelAntiAlias);
105cb93a386Sopenharmony_ci        setNamedTypeface(&font, "Menlo Regular");
106cb93a386Sopenharmony_ci
107cb93a386Sopenharmony_ci        const int kWrap = 5;
108cb93a386Sopenharmony_ci
109cb93a386Sopenharmony_ci        SkScalar x0 = 0;
110cb93a386Sopenharmony_ci        for (int twice = 0; twice < 2; twice++) {
111cb93a386Sopenharmony_ci            SkScalar x = x0, y = 0;
112cb93a386Sopenharmony_ci            for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); i++) {
113cb93a386Sopenharmony_ci                SkRect r;
114cb93a386Sopenharmony_ci                r.setLTRB(x, y, x+w, y+h);
115cb93a386Sopenharmony_ci
116cb93a386Sopenharmony_ci                SkPaint p;
117cb93a386Sopenharmony_ci                p.setStyle(SkPaint::kFill_Style);
118cb93a386Sopenharmony_ci                p.setShader(s);
119cb93a386Sopenharmony_ci                canvas->drawRect(r, p);
120cb93a386Sopenharmony_ci
121cb93a386Sopenharmony_ci                canvas->saveLayer(&r, nullptr);
122cb93a386Sopenharmony_ci                draw_mode(canvas, gModes[i], twice ? 0x88 : 0xFF, r.fLeft, r.fTop);
123cb93a386Sopenharmony_ci                canvas->restore();
124cb93a386Sopenharmony_ci
125cb93a386Sopenharmony_ci                r.inset(-SK_ScalarHalf, -SK_ScalarHalf);
126cb93a386Sopenharmony_ci                p.setStyle(SkPaint::kStroke_Style);
127cb93a386Sopenharmony_ci                p.setShader(nullptr);
128cb93a386Sopenharmony_ci                canvas->drawRect(r, p);
129cb93a386Sopenharmony_ci
130cb93a386Sopenharmony_ci                const char* label = SkBlendMode_Name(gModes[i]);
131cb93a386Sopenharmony_ci                SkTextUtils::DrawString(canvas, label, x + w/2, y - font.getSize()/2, font, SkPaint(),
132cb93a386Sopenharmony_ci                                        SkTextUtils::kCenter_Align);
133cb93a386Sopenharmony_ci                x += w + SkIntToScalar(10);
134cb93a386Sopenharmony_ci                if ((i % kWrap) == kWrap - 1) {
135cb93a386Sopenharmony_ci                    x = x0;
136cb93a386Sopenharmony_ci                    y += h + SkIntToScalar(30);
137cb93a386Sopenharmony_ci                }
138cb93a386Sopenharmony_ci            }
139cb93a386Sopenharmony_ci            x0 += SkIntToScalar(400);
140cb93a386Sopenharmony_ci        }
141cb93a386Sopenharmony_ci    }
142cb93a386Sopenharmony_ci
143cb93a386Sopenharmony_ciprivate:
144cb93a386Sopenharmony_ci    using INHERITED = Sample;
145cb93a386Sopenharmony_ci};
146cb93a386Sopenharmony_ci
147cb93a386Sopenharmony_ci//////////////////////////////////////////////////////////////////////////////
148cb93a386Sopenharmony_ci
149cb93a386Sopenharmony_ciDEF_SAMPLE( return new XfermodesBlurView(); )
150