1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2014 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 "bench/Benchmark.h"
9cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h"
10cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h"
11cb93a386Sopenharmony_ci#include "include/core/SkPaint.h"
12cb93a386Sopenharmony_ci#include "include/core/SkPath.h"
13cb93a386Sopenharmony_ci#include "include/core/SkString.h"
14cb93a386Sopenharmony_ci#include "include/effects/SkGradientShader.h"
15cb93a386Sopenharmony_ci
16cb93a386Sopenharmony_cienum ColorPattern {
17cb93a386Sopenharmony_ci    kWhite_ColorPattern,
18cb93a386Sopenharmony_ci    kBlue_ColorPattern,
19cb93a386Sopenharmony_ci    kOpaqueBitmap_ColorPattern,
20cb93a386Sopenharmony_ci    kAlphaBitmap_ColorPattern,
21cb93a386Sopenharmony_ci};
22cb93a386Sopenharmony_ci
23cb93a386Sopenharmony_cistatic const struct ColorPatternData{
24cb93a386Sopenharmony_ci    SkColor         fColor;
25cb93a386Sopenharmony_ci    bool            fIsBitmap;
26cb93a386Sopenharmony_ci    const char*     fName;
27cb93a386Sopenharmony_ci} gColorPatterns[] = {
28cb93a386Sopenharmony_ci    // Keep this in same order as ColorPattern enum
29cb93a386Sopenharmony_ci    { SK_ColorWHITE, false,  "white"        }, // kWhite_ColorPattern
30cb93a386Sopenharmony_ci    { SK_ColorBLUE,  false,  "blue"         }, // kBlue_ColorPattern
31cb93a386Sopenharmony_ci    { SK_ColorWHITE, true,   "obaqueBitMap" }, // kOpaqueBitmap_ColorPattern
32cb93a386Sopenharmony_ci    { 0x10000000,    true,   "alphaBitmap"  }, // kAlphaBitmap_ColorPattern
33cb93a386Sopenharmony_ci};
34cb93a386Sopenharmony_ci
35cb93a386Sopenharmony_cienum DrawType {
36cb93a386Sopenharmony_ci    kRect_DrawType,
37cb93a386Sopenharmony_ci    kPath_DrawType,
38cb93a386Sopenharmony_ci};
39cb93a386Sopenharmony_ci
40cb93a386Sopenharmony_cistatic void makebm(SkBitmap* bm, int w, int h) {
41cb93a386Sopenharmony_ci    bm->allocN32Pixels(w, h);
42cb93a386Sopenharmony_ci    bm->eraseColor(SK_ColorTRANSPARENT);
43cb93a386Sopenharmony_ci
44cb93a386Sopenharmony_ci    SkCanvas    canvas(*bm);
45cb93a386Sopenharmony_ci    SkScalar    s = SkIntToScalar(std::min(w, h));
46cb93a386Sopenharmony_ci    static const SkPoint     kPts0[] = { { 0, 0 }, { s, s } };
47cb93a386Sopenharmony_ci    static const SkPoint     kPts1[] = { { s/2, 0 }, { s/2, s } };
48cb93a386Sopenharmony_ci    static const SkScalar    kPos[] = { 0, SK_Scalar1/2, SK_Scalar1 };
49cb93a386Sopenharmony_ci    static const SkColor kColors0[] = {0x80F00080, 0xF0F08000, 0x800080F0 };
50cb93a386Sopenharmony_ci    static const SkColor kColors1[] = {0xF08000F0, 0x8080F000, 0xF000F080 };
51cb93a386Sopenharmony_ci
52cb93a386Sopenharmony_ci
53cb93a386Sopenharmony_ci    SkPaint     paint;
54cb93a386Sopenharmony_ci
55cb93a386Sopenharmony_ci    paint.setShader(SkGradientShader::MakeLinear(kPts0, kColors0, kPos, SK_ARRAY_COUNT(kColors0),
56cb93a386Sopenharmony_ci                                                 SkTileMode::kClamp));
57cb93a386Sopenharmony_ci    canvas.drawPaint(paint);
58cb93a386Sopenharmony_ci    paint.setShader(SkGradientShader::MakeLinear(kPts1, kColors1, kPos, SK_ARRAY_COUNT(kColors1),
59cb93a386Sopenharmony_ci                                                 SkTileMode::kClamp));
60cb93a386Sopenharmony_ci    canvas.drawPaint(paint);
61cb93a386Sopenharmony_ci}
62cb93a386Sopenharmony_ci
63cb93a386Sopenharmony_ci/**
64cb93a386Sopenharmony_ci * This bench draws a grid of either rects or filled paths, with two alternating color patterns.
65cb93a386Sopenharmony_ci * This color patterns are passed in as enums to the class. The options are:
66cb93a386Sopenharmony_ci *   1) solid white color
67cb93a386Sopenharmony_ci *   2) solid blue color
68cb93a386Sopenharmony_ci *   3) opaque bitmap
69cb93a386Sopenharmony_ci *   4) partial alpha bitmap
70cb93a386Sopenharmony_ci * The same color pattern can be set for both arguments to create a uniform pattern on all draws.
71cb93a386Sopenharmony_ci *
72cb93a386Sopenharmony_ci * The bench is used to test a few things. First it can test any optimizations made for a specific
73cb93a386Sopenharmony_ci * color pattern (for example drawing an opaque bitmap versus one with partial alpha). Also it can
74cb93a386Sopenharmony_ci * be used to test the cost of program switching and/or GrDrawOp combining when alternating between
75cb93a386Sopenharmony_ci * different patterns when on the gpu.
76cb93a386Sopenharmony_ci */
77cb93a386Sopenharmony_ciclass AlternatingColorPatternBench : public Benchmark {
78cb93a386Sopenharmony_cipublic:
79cb93a386Sopenharmony_ci    enum {
80cb93a386Sopenharmony_ci        NX = 5,
81cb93a386Sopenharmony_ci        NY = 5,
82cb93a386Sopenharmony_ci        NUM_DRAWS = NX * NY,
83cb93a386Sopenharmony_ci    };
84cb93a386Sopenharmony_ci    sk_sp<SkShader> fBmShader;
85cb93a386Sopenharmony_ci
86cb93a386Sopenharmony_ci    SkPath  fPaths[NUM_DRAWS];
87cb93a386Sopenharmony_ci    SkRect  fRects[NUM_DRAWS];
88cb93a386Sopenharmony_ci    SkColor fColors[NUM_DRAWS];
89cb93a386Sopenharmony_ci    sk_sp<SkShader> fShaders[NUM_DRAWS];
90cb93a386Sopenharmony_ci
91cb93a386Sopenharmony_ci    SkString        fName;
92cb93a386Sopenharmony_ci    ColorPatternData    fPattern1;
93cb93a386Sopenharmony_ci    ColorPatternData    fPattern2;
94cb93a386Sopenharmony_ci    DrawType fDrawType;
95cb93a386Sopenharmony_ci    SkBitmap fBmp;
96cb93a386Sopenharmony_ci
97cb93a386Sopenharmony_ci
98cb93a386Sopenharmony_ci    AlternatingColorPatternBench(ColorPattern pattern1, ColorPattern pattern2, DrawType drawType) {
99cb93a386Sopenharmony_ci        fPattern1 = gColorPatterns[pattern1];
100cb93a386Sopenharmony_ci        fPattern2 = gColorPatterns[pattern2];
101cb93a386Sopenharmony_ci        fName.printf("colorPattern_%s_%s_%s",
102cb93a386Sopenharmony_ci                     fPattern1.fName, fPattern2.fName,
103cb93a386Sopenharmony_ci                     kRect_DrawType == drawType ? "rect" : "path");
104cb93a386Sopenharmony_ci        fDrawType = drawType;
105cb93a386Sopenharmony_ci    }
106cb93a386Sopenharmony_ci
107cb93a386Sopenharmony_ciprotected:
108cb93a386Sopenharmony_ci    const char* onGetName() override {
109cb93a386Sopenharmony_ci        return fName.c_str();
110cb93a386Sopenharmony_ci    }
111cb93a386Sopenharmony_ci
112cb93a386Sopenharmony_ci    void onDelayedSetup() override {
113cb93a386Sopenharmony_ci        int w = 40;
114cb93a386Sopenharmony_ci        int h = 40;
115cb93a386Sopenharmony_ci        makebm(&fBmp, w, h);
116cb93a386Sopenharmony_ci        fBmShader = fBmp.makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
117cb93a386Sopenharmony_ci                                    SkSamplingOptions(SkFilterMode::kLinear));
118cb93a386Sopenharmony_ci        int offset = 2;
119cb93a386Sopenharmony_ci        int count = 0;
120cb93a386Sopenharmony_ci        for (int j = 0; j < NY; ++j) {
121cb93a386Sopenharmony_ci            for (int i = 0; i < NX; ++i) {
122cb93a386Sopenharmony_ci                int x = (w + offset) * i;
123cb93a386Sopenharmony_ci                int y = (h * offset) * j;
124cb93a386Sopenharmony_ci                if (kRect_DrawType == fDrawType) {
125cb93a386Sopenharmony_ci                    fRects[count].setXYWH(SkIntToScalar(x), SkIntToScalar(y),
126cb93a386Sopenharmony_ci                                          SkIntToScalar(w), SkIntToScalar(h));
127cb93a386Sopenharmony_ci                } else {
128cb93a386Sopenharmony_ci                    fPaths[count].moveTo(SkIntToScalar(x), SkIntToScalar(y));
129cb93a386Sopenharmony_ci                    fPaths[count].rLineTo(SkIntToScalar(w), 0);
130cb93a386Sopenharmony_ci                    fPaths[count].rLineTo(0, SkIntToScalar(h));
131cb93a386Sopenharmony_ci                    fPaths[count].rLineTo(SkIntToScalar(-w + 1), 0);
132cb93a386Sopenharmony_ci                }
133cb93a386Sopenharmony_ci                if (0 == count % 2) {
134cb93a386Sopenharmony_ci                    fColors[count]  = fPattern1.fColor;
135cb93a386Sopenharmony_ci                    fShaders[count] = fPattern1.fIsBitmap ? fBmShader : nullptr;
136cb93a386Sopenharmony_ci                } else {
137cb93a386Sopenharmony_ci                    fColors[count]  = fPattern2.fColor;
138cb93a386Sopenharmony_ci                    fShaders[count] = fPattern2.fIsBitmap ? fBmShader : nullptr;
139cb93a386Sopenharmony_ci                }
140cb93a386Sopenharmony_ci                ++count;
141cb93a386Sopenharmony_ci            }
142cb93a386Sopenharmony_ci        }
143cb93a386Sopenharmony_ci    }
144cb93a386Sopenharmony_ci
145cb93a386Sopenharmony_ci    void onDraw(int loops, SkCanvas* canvas) override {
146cb93a386Sopenharmony_ci        SkPaint paint;
147cb93a386Sopenharmony_ci        paint.setAntiAlias(false);
148cb93a386Sopenharmony_ci
149cb93a386Sopenharmony_ci        for (int i = 0; i < loops; ++i) {
150cb93a386Sopenharmony_ci            for (int j = 0; j < NUM_DRAWS; ++j) {
151cb93a386Sopenharmony_ci                paint.setColor(fColors[j]);
152cb93a386Sopenharmony_ci                paint.setShader(fShaders[j]);
153cb93a386Sopenharmony_ci                if (kRect_DrawType == fDrawType) {
154cb93a386Sopenharmony_ci                    canvas->drawRect(fRects[j], paint);
155cb93a386Sopenharmony_ci                } else {
156cb93a386Sopenharmony_ci                    canvas->drawPath(fPaths[j], paint);
157cb93a386Sopenharmony_ci                }
158cb93a386Sopenharmony_ci            }
159cb93a386Sopenharmony_ci        }
160cb93a386Sopenharmony_ci    }
161cb93a386Sopenharmony_ci
162cb93a386Sopenharmony_ciprivate:
163cb93a386Sopenharmony_ci    using INHERITED = Benchmark;
164cb93a386Sopenharmony_ci};
165cb93a386Sopenharmony_ci
166cb93a386Sopenharmony_ciDEF_BENCH(return new AlternatingColorPatternBench(kWhite_ColorPattern,
167cb93a386Sopenharmony_ci                                                  kWhite_ColorPattern,
168cb93a386Sopenharmony_ci                                                  kPath_DrawType);)
169cb93a386Sopenharmony_ciDEF_BENCH(return new AlternatingColorPatternBench(kBlue_ColorPattern,
170cb93a386Sopenharmony_ci                                                  kBlue_ColorPattern,
171cb93a386Sopenharmony_ci                                                  kPath_DrawType);)
172cb93a386Sopenharmony_ciDEF_BENCH(return new AlternatingColorPatternBench(kWhite_ColorPattern,
173cb93a386Sopenharmony_ci                                                  kBlue_ColorPattern,
174cb93a386Sopenharmony_ci                                                  kPath_DrawType);)
175cb93a386Sopenharmony_ci
176cb93a386Sopenharmony_ciDEF_BENCH(return new AlternatingColorPatternBench(kOpaqueBitmap_ColorPattern,
177cb93a386Sopenharmony_ci                                                  kOpaqueBitmap_ColorPattern,
178cb93a386Sopenharmony_ci                                                  kPath_DrawType);)
179cb93a386Sopenharmony_ciDEF_BENCH(return new AlternatingColorPatternBench(kAlphaBitmap_ColorPattern,
180cb93a386Sopenharmony_ci                                                  kAlphaBitmap_ColorPattern,
181cb93a386Sopenharmony_ci                                                  kPath_DrawType);)
182cb93a386Sopenharmony_ciDEF_BENCH(return new AlternatingColorPatternBench(kOpaqueBitmap_ColorPattern,
183cb93a386Sopenharmony_ci                                                  kAlphaBitmap_ColorPattern,
184cb93a386Sopenharmony_ci                                                  kPath_DrawType);)
185cb93a386Sopenharmony_ci
186cb93a386Sopenharmony_ciDEF_BENCH(return new AlternatingColorPatternBench(kOpaqueBitmap_ColorPattern,
187cb93a386Sopenharmony_ci                                                  kOpaqueBitmap_ColorPattern,
188cb93a386Sopenharmony_ci                                                  kRect_DrawType);)
189cb93a386Sopenharmony_ciDEF_BENCH(return new AlternatingColorPatternBench(kAlphaBitmap_ColorPattern,
190cb93a386Sopenharmony_ci                                                  kAlphaBitmap_ColorPattern,
191cb93a386Sopenharmony_ci                                                  kRect_DrawType);)
192cb93a386Sopenharmony_ciDEF_BENCH(return new AlternatingColorPatternBench(kOpaqueBitmap_ColorPattern,
193cb93a386Sopenharmony_ci                                                  kAlphaBitmap_ColorPattern,
194cb93a386Sopenharmony_ci                                                  kRect_DrawType);)
195