18e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 28e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com/* 38e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com * Copyright 2013 Google Inc. 48e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com * 58e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com * Use of this source code is governed by a BSD-style license that can be 68e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com * found in the LICENSE file. 78e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com */ 88e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 9f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h" 108e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com#include "SkBitmap.h" 118e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com#include "SkCanvas.h" 128e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com#include "SkShader.h" 138e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com#include "SkString.h" 148e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 158e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.comstatic void create_gradient(SkBitmap* bm) { 168e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com SkASSERT(1 == bm->width()); 178e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com const int height = bm->height(); 188e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 198e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com float deltaB = 255.0f / height; 208e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com float blue = 255.0f; 218e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 228e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com SkAutoLockPixels lock(*bm); 238e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com for (int y = 0; y < height; y++) { 248e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com *bm->getAddr32(0, y) = SkColorSetRGB(0, 0, (U8CPU) blue); 258e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com blue -= deltaB; 268e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com } 278e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com} 288e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 298e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com// Test out the special case of a tiled 1xN texture. Test out opacity, 308e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com// filtering and the different tiling modes 31f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ConstXTileBench : public Benchmark { 328e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com SkPaint fPaint; 338e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com SkString fName; 348e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com bool fDoFilter; 358e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com bool fDoTrans; 361e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com bool fDoScale; 378e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com static const int kWidth = 1; 388e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com static const int kHeight = 300; 398e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 408e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.compublic: 41410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com ConstXTileBench(SkShader::TileMode xTile, 428e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com SkShader::TileMode yTile, 438e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com bool doFilter, 441e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com bool doTrans, 451e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com bool doScale) 46410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.com : fDoFilter(doFilter) 471e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com , fDoTrans(doTrans) 481e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com , fDoScale(doScale) { 498e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com SkBitmap bm; 508e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 516c22573edb234ad14df947278cfed010669a39a7reed bm.allocN32Pixels(kWidth, kHeight, true); 528e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com bm.eraseColor(SK_ColorWHITE); 538e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 548e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com create_gradient(&bm); 558e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 568e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com SkShader* s = SkShader::CreateBitmapShader(bm, xTile, yTile); 578e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com fPaint.setShader(s)->unref(); 588e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 598e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com fName.printf("constXTile_"); 608e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 618e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com static const char* gTileModeStr[SkShader::kTileModeCount] = { "C", "R", "M" }; 628e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com fName.append(gTileModeStr[xTile]); 638e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com fName.append(gTileModeStr[yTile]); 648e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 658e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com if (doFilter) { 668e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com fName.append("_filter"); 678e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com } 688e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 698e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com if (doTrans) { 708e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com fName.append("_trans"); 718e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com } 721e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com 731e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com if (doScale) { 741e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com fName.append("_scale"); 751e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com } 768e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com } 778e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 788e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.comprotected: 798e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com virtual const char* onGetName() { 808e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com return fName.c_str(); 818e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com } 828e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 833361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas* canvas) { 848e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com SkPaint paint(fPaint); 858e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com this->setupPaint(&paint); 864469938e92d779dff05e745559e67907bbf21e78reed@google.com paint.setFilterLevel(fDoFilter ? SkPaint::kLow_FilterLevel 874469938e92d779dff05e745559e67907bbf21e78reed@google.com : SkPaint::kNone_FilterLevel); 888e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com if (fDoTrans) { 898e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com paint.setColor(SkColorSetARGBMacro(0x80, 0xFF, 0xFF, 0xFF)); 908e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com } 918e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 928e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com SkRect r; 938e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 941e3052354ac155e3d9418cf7e8c8e009df524e01robertphillips@google.com if (fDoScale) { 958e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com r = SkRect::MakeWH(SkIntToScalar(2 * 640), SkIntToScalar(2 * 480)); 968e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com canvas->scale(SK_ScalarHalf, SK_ScalarHalf); 978e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com } else { 988e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com r = SkRect::MakeWH(SkIntToScalar(640), SkIntToScalar(480)); 998e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com } 1008e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 1018e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com SkPaint bgPaint; 1028e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com bgPaint.setColor(SK_ColorWHITE); 1038e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 1043361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; i++) { 1058e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com if (fDoTrans) { 1068e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com canvas->drawRect(r, bgPaint); 1078e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com } 1088e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 1098e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com canvas->drawRect(r, paint); 1108e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com } 1118e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com } 1128e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 1138e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.comprivate: 114f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 1158e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com}; 1168e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 117474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein// Scaled benches are trending towards free. Seems like caching. 118474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein// TODO(mtklein, reed): fix and reenable 119474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein 120474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein//DEF_BENCH(return new ConstXTileBench(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, false, false, true)) 121410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new ConstXTileBench(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, false, false, false)) 122474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein//DEF_BENCH(return new ConstXTileBench(SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, false, false, true)) 1238e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 124410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new ConstXTileBench(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, true, false, false)) 125474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein//DEF_BENCH(return new ConstXTileBench(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, true, false, true)) 126410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new ConstXTileBench(SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, true, false, false)) 1278e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 128474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein//DEF_BENCH(return new ConstXTileBench(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, false, true, true)) 129410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new ConstXTileBench(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, false, true, false)) 130474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein//DEF_BENCH(return new ConstXTileBench(SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, false, true, true)) 1318e679fe0238771c32609a4f33045dd599509d2cfrobertphillips@google.com 132410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new ConstXTileBench(SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, true, true, false)) 133474cef4c55818bcf6ef1f7227417833ec82c5a36mtklein//DEF_BENCH(return new ConstXTileBench(SkShader::kClamp_TileMode, SkShader::kClamp_TileMode, true, true, true)) 134410e6e80f00a6c660675c80904807a041c7b7d2amtklein@google.comDEF_BENCH(return new ConstXTileBench(SkShader::kMirror_TileMode, SkShader::kMirror_TileMode, true, true, false)) 135