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