13d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com/* 23d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com * Copyright 2011 Google Inc. 33d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com * 43d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com * Use of this source code is governed by a BSD-style license that can be 53d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com * found in the LICENSE file. 63d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com */ 7f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h" 83d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkBitmap.h" 93d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkCanvas.h" 103d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkColorPriv.h" 11f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkPaint.h" 123d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkRandom.h" 133d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com#include "SkString.h" 143d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 157fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.orgstatic void draw_into_bitmap(const SkBitmap& bm) { 163d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com const int w = bm.width(); 173d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com const int h = bm.height(); 183d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 193d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com SkCanvas canvas(bm); 203d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com SkPaint p; 213d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com p.setAntiAlias(true); 223d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com p.setColor(SK_ColorRED); 233d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com canvas.drawCircle(SkIntToScalar(w)/2, SkIntToScalar(h)/2, 243d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com SkIntToScalar(SkMin32(w, h))*3/8, p); 253d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 263d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com SkRect r; 273d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h)); 283d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com p.setStyle(SkPaint::kStroke_Style); 293d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com p.setStrokeWidth(SkIntToScalar(4)); 303d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com p.setColor(SK_ColorBLUE); 313d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com canvas.drawRect(r, p); 323d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com} 333d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 343d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com/* Variants for bitmaprect 353d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com src : entire bitmap, subset, fractional subset 363d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com dst : same size as src, diff size 373d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com paint : filter-p 383d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com */ 393d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 40f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass BitmapRectBench : public Benchmark { 414469938e92d779dff05e745559e67907bbf21e78reed@google.com SkBitmap fBitmap; 424469938e92d779dff05e745559e67907bbf21e78reed@google.com bool fSlightMatrix; 434469938e92d779dff05e745559e67907bbf21e78reed@google.com uint8_t fAlpha; 4493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed SkFilterQuality fFilterQuality; 454469938e92d779dff05e745559e67907bbf21e78reed@google.com SkString fName; 464469938e92d779dff05e745559e67907bbf21e78reed@google.com SkRect fSrcR, fDstR; 474469938e92d779dff05e745559e67907bbf21e78reed@google.com 487fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org static const int kWidth = 128; 497fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org static const int kHeight = 128; 503d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.compublic: 5193a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed BitmapRectBench(U8CPU alpha, SkFilterQuality filterQuality, 524469938e92d779dff05e745559e67907bbf21e78reed@google.com bool slightMatrix) { 53b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com fAlpha = SkToU8(alpha); 5493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed fFilterQuality = filterQuality; 5593182311781e79a6883b356bf2669c389878f9e5reed@google.com fSlightMatrix = slightMatrix; 56b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com 576c22573edb234ad14df947278cfed010669a39a7reed fBitmap.setInfo(SkImageInfo::MakeN32Premul(kWidth, kHeight)); 587fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org } 597fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org 607fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.orgprotected: 6136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { 627fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org fName.printf("bitmaprect_%02X_%sfilter_%s", 634469938e92d779dff05e745559e67907bbf21e78reed@google.com fAlpha, 6493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed kNone_SkFilterQuality == fFilterQuality ? "no" : "", 657fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org fSlightMatrix ? "trans" : "identity"); 667fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org return fName.c_str(); 677fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org } 683d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 698a6697af95b340aad6dee7e6228048fa305c1e59joshualitt void onDelayedSetup() override { 703d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com fBitmap.allocPixels(); 71383a697692cf46951fd451f6f4c3d03634a6a1cbreed@google.com fBitmap.setAlphaType(kOpaque_SkAlphaType); 723d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com fBitmap.eraseColor(SK_ColorBLACK); 737fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org draw_into_bitmap(fBitmap); 74f57c01bdcfdf1c923b9a473974bfe6f8c66eca3eskia.committer@gmail.com 757fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org fSrcR.iset(0, 0, kWidth, kHeight); 767fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org fDstR.iset(0, 0, kWidth, kHeight); 7793182311781e79a6883b356bf2669c389878f9e5reed@google.com 787fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org if (fSlightMatrix) { 7993182311781e79a6883b356bf2669c389878f9e5reed@google.com // want fractional translate 8093182311781e79a6883b356bf2669c389878f9e5reed@google.com fDstR.offset(SK_Scalar1 / 3, SK_Scalar1 * 5 / 7); 8193182311781e79a6883b356bf2669c389878f9e5reed@google.com // want enough to create a scale matrix, but not enough to scare 8293182311781e79a6883b356bf2669c389878f9e5reed@google.com // off our sniffer which tries to see if the matrix is "effectively" 8393182311781e79a6883b356bf2669c389878f9e5reed@google.com // translate-only. 847fb83c8c72f2a035e84a4ee4ee6abcf5a4872166commit-bot@chromium.org fDstR.fRight += SK_Scalar1 / (kWidth * 60); 8593182311781e79a6883b356bf2669c389878f9e5reed@google.com } 863d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com } 873d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 883d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 89a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas* canvas) override { 90e0e7cfe44bb9d66d76120a79e5275c294bacaa22commit-bot@chromium.org SkRandom rand; 913d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 923d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com SkPaint paint; 933d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com this->setupPaint(&paint); 9493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed paint.setFilterQuality(fFilterQuality); 95b8b92ea089a380e17984e4df7b49b379cb6bd929reed@google.com paint.setAlpha(fAlpha); 963d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 973361471a3504ecd0351ff70f4c42d8d6fee963d4commit-bot@chromium.org for (int i = 0; i < loops; i++) { 98e47829b6b1eeb6b0c97ccb3df3016d197046824creed canvas->drawBitmapRect(fBitmap, fSrcR, fDstR, &paint, 9984984efeb64787b88c5f8bd6929cfe2d58a3ba06reed SkCanvas::kStrict_SrcRectConstraint); 1003d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com } 1013d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com } 1023d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 1033d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.comprivate: 104f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina typedef Benchmark INHERITED; 1053d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com}; 1063d407a153a48345a35110b6dd2fe3f85ae11ea8freed@google.com 10793a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_BENCH(return new BitmapRectBench(0xFF, kNone_SkFilterQuality, false)) 10893a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_BENCH(return new BitmapRectBench(0x80, kNone_SkFilterQuality, false)) 10993a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_BENCH(return new BitmapRectBench(0xFF, kLow_SkFilterQuality, false)) 11093a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_BENCH(return new BitmapRectBench(0x80, kLow_SkFilterQuality, false)) 11193182311781e79a6883b356bf2669c389878f9e5reed@google.com 11293a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_BENCH(return new BitmapRectBench(0xFF, kNone_SkFilterQuality, true)) 11393a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedDEF_BENCH(return new BitmapRectBench(0xFF, kLow_SkFilterQuality, true)) 114