13d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 23d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com/* 33d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com * Copyright 2011 Google Inc. 43d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com * 53d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com * Use of this source code is governed by a BSD-style license that can be 63d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com * found in the LICENSE file. 73d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com */ 8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h" 93d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkBitmap.h" 103d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkCanvas.h" 113d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkColorPriv.h" 12f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkPaint.h" 133d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkRandom.h" 143d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkString.h" 153d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 167fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.orgstatic void draw_into_bitmap(const SkBitmap& bm) { 173d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com const int w = bm.width(); 183d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com const int h = bm.height(); 193d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 203d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com SkCanvas canvas(bm); 213d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com SkPaint p; 223d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com p.setAntiAlias(true); 233d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com p.setColor(SK_ColorRED); 243d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com canvas.drawCircle(SkIntToScalar(w)/2, SkIntToScalar(h)/2, 253d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com SkIntToScalar(SkMin32(w, h))*3/8, p); 263d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 273d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com SkRect r; 283d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h)); 293d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com p.setStyle(SkPaint::kStroke_Style); 303d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com p.setStrokeWidth(SkIntToScalar(4)); 313d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com p.setColor(SK_ColorBLUE); 323d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com canvas.drawRect(r, p); 333d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com} 343d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 353d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com/* Variants for bitmaprect 363d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com src : entire bitmap, subset, fractional subset 373d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com dst : same size as src, diff size 383d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com paint : filter-p 393d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com */ 403d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 41f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass BitmapRectBench : public Benchmark { 424469938e92d779dff05e745559e67907bbf21e78reed@google.com SkBitmap fBitmap; 434469938e92d779dff05e745559e67907bbf21e78reed@google.com bool fSlightMatrix; 444469938e92d779dff05e745559e67907bbf21e78reed@google.com uint8_t fAlpha; 454469938e92d779dff05e745559e67907bbf21e78reed@google.com SkPaint::FilterLevel fFilterLevel; 464469938e92d779dff05e745559e67907bbf21e78reed@google.com SkString fName; 474469938e92d779dff05e745559e67907bbf21e78reed@google.com SkRect fSrcR, fDstR; 484469938e92d779dff05e745559e67907bbf21e78reed@google.com 497fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org static const int kWidth = 128; 507fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org static const int kHeight = 128; 513d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.compublic: 524469938e92d779dff05e745559e67907bbf21e78reed@google.com BitmapRectBench(U8CPU alpha, SkPaint::FilterLevel filterLevel, 534469938e92d779dff05e745559e67907bbf21e78reed@google.com bool slightMatrix) { 54b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com fAlpha = SkToU8(alpha); 554469938e92d779dff05e745559e67907bbf21e78reed@google.com fFilterLevel = filterLevel; 5693182311781e79a6883b356bf2669c389878f9e5reed@google.com fSlightMatrix = slightMatrix; 57b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com 586c22573edb234ad14df947278cfed010669a39a7reed fBitmap.setInfo(SkImageInfo::MakeN32Premul(kWidth, kHeight)); 597fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org } 607fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org 617fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.orgprotected: 627fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org virtual const char* onGetName() SK_OVERRIDE { 637fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org fName.printf("bitmaprect_%02X_%sfilter_%s", 644469938e92d779dff05e745559e67907bbf21e78reed@google.com fAlpha, 654469938e92d779dff05e745559e67907bbf21e78reed@google.com SkPaint::kNone_FilterLevel == fFilterLevel ? "no" : "", 667fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org fSlightMatrix ? "trans" : "identity"); 677fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org return fName.c_str(); 687fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org } 693d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 707fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org virtual void onPreDraw() SK_OVERRIDE { 713d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com fBitmap.allocPixels(); 72383a697692cf46951fd451f6f4c3d03634a6a1cbreed@google.com fBitmap.setAlphaType(kOpaque_SkAlphaType); 733d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com fBitmap.eraseColor(SK_ColorBLACK); 747fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org draw_into_bitmap(fBitmap); 75f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com 767fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org fSrcR.iset(0, 0, kWidth, kHeight); 777fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org fDstR.iset(0, 0, kWidth, kHeight); 7893182311781e79a6883b356bf2669c389878f9e5reed@google.com 797fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org if (fSlightMatrix) { 8093182311781e79a6883b356bf2669c389878f9e5reed@google.com // want fractional translate 8193182311781e79a6883b356bf2669c389878f9e5reed@google.com fDstR.offset(SK_Scalar1 / 3, SK_Scalar1 * 5 / 7); 8293182311781e79a6883b356bf2669c389878f9e5reed@google.com // want enough to create a scale matrix, but not enough to scare 8393182311781e79a6883b356bf2669c389878f9e5reed@google.com // off our sniffer which tries to see if the matrix is "effectively" 8493182311781e79a6883b356bf2669c389878f9e5reed@google.com // translate-only. 857fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org fDstR.fRight += SK_Scalar1 / (kWidth * 60); 8693182311781e79a6883b356bf2669c389878f9e5reed@google.com } 873d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com } 883d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 893d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 903361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { 91e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 923d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 933d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com SkPaint paint; 943d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com this->setupPaint(&paint); 954469938e92d779dff05e745559e67907bbf21e78reed@google.com paint.setFilterLevel(fFilterLevel); 96b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com paint.setAlpha(fAlpha); 973d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 983361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; i++) { 993d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com canvas->drawBitmapRectToRect(fBitmap, &fSrcR, fDstR, &paint); 1003d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com } 1013d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com } 1023d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 1033d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.comprivate: 104f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 1053d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com}; 1063d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 1074469938e92d779dff05e745559e67907bbf21e78reed@google.comDEF_BENCH(return new BitmapRectBench(0xFF, SkPaint::kNone_FilterLevel, false)) 1084469938e92d779dff05e745559e67907bbf21e78reed@google.comDEF_BENCH(return new BitmapRectBench(0x80, SkPaint::kNone_FilterLevel, false)) 1094469938e92d779dff05e745559e67907bbf21e78reed@google.comDEF_BENCH(return new BitmapRectBench(0xFF, SkPaint::kLow_FilterLevel, false)) 1104469938e92d779dff05e745559e67907bbf21e78reed@google.comDEF_BENCH(return new BitmapRectBench(0x80, SkPaint::kLow_FilterLevel, false)) 11193182311781e79a6883b356bf2669c389878f9e5reed@google.com 1124469938e92d779dff05e745559e67907bbf21e78reed@google.comDEF_BENCH(return new BitmapRectBench(0xFF, SkPaint::kNone_FilterLevel, true)) 1134469938e92d779dff05e745559e67907bbf21e78reed@google.comDEF_BENCH(return new BitmapRectBench(0xFF, SkPaint::kLow_FilterLevel, true)) 114