1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker #include "bench/Benchmark.h" 8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h" 14*c8dee2aaSAndroid Build Coastguard Worker 15*c8dee2aaSAndroid Build Coastguard Worker /** 16*c8dee2aaSAndroid Build Coastguard Worker * This bench measures the rendering time of SkCanvas::drawBitmap with different anti-aliasing / 17*c8dee2aaSAndroid Build Coastguard Worker * matrix combinations. 18*c8dee2aaSAndroid Build Coastguard Worker */ 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker class DrawBitmapAABench : public Benchmark { 21*c8dee2aaSAndroid Build Coastguard Worker public: DrawBitmapAABench(bool doAA,const SkMatrix & matrix,const char name[])22*c8dee2aaSAndroid Build Coastguard Worker DrawBitmapAABench(bool doAA, const SkMatrix& matrix, const char name[]) 23*c8dee2aaSAndroid Build Coastguard Worker : fMatrix(matrix) 24*c8dee2aaSAndroid Build Coastguard Worker , fName("draw_bitmap_") { 25*c8dee2aaSAndroid Build Coastguard Worker 26*c8dee2aaSAndroid Build Coastguard Worker fPaint.setAntiAlias(doAA); 27*c8dee2aaSAndroid Build Coastguard Worker fName.appendf("%s_%s", doAA ? "aa" : "noaa", name); 28*c8dee2aaSAndroid Build Coastguard Worker } 29*c8dee2aaSAndroid Build Coastguard Worker 30*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()31*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 32*c8dee2aaSAndroid Build Coastguard Worker return fName.c_str(); 33*c8dee2aaSAndroid Build Coastguard Worker } 34*c8dee2aaSAndroid Build Coastguard Worker onDelayedSetup()35*c8dee2aaSAndroid Build Coastguard Worker void onDelayedSetup() override { 36*c8dee2aaSAndroid Build Coastguard Worker auto surf = SkSurfaces::Raster(SkImageInfo::MakeN32Premul(200, 200)); 37*c8dee2aaSAndroid Build Coastguard Worker surf->getCanvas()->clear(0xFF00FF00); 38*c8dee2aaSAndroid Build Coastguard Worker fImage = surf->makeImageSnapshot(); 39*c8dee2aaSAndroid Build Coastguard Worker } 40*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas * canvas)41*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 42*c8dee2aaSAndroid Build Coastguard Worker SkSamplingOptions sampling(SkFilterMode::kLinear); 43*c8dee2aaSAndroid Build Coastguard Worker canvas->concat(fMatrix); 44*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < loops; i++) { 45*c8dee2aaSAndroid Build Coastguard Worker canvas->drawImage(fImage.get(), 0, 0, sampling, &fPaint); 46*c8dee2aaSAndroid Build Coastguard Worker } 47*c8dee2aaSAndroid Build Coastguard Worker } 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker private: 50*c8dee2aaSAndroid Build Coastguard Worker SkPaint fPaint; 51*c8dee2aaSAndroid Build Coastguard Worker SkMatrix fMatrix; 52*c8dee2aaSAndroid Build Coastguard Worker SkString fName; 53*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkImage> fImage; 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Benchmark; 56*c8dee2aaSAndroid Build Coastguard Worker }; 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new DrawBitmapAABench(false, SkMatrix::I(), "ident"); ) 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new DrawBitmapAABench(false, SkMatrix::Scale(1.17f, 1.17f), "scale"); ) 61*c8dee2aaSAndroid Build Coastguard Worker 62*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new DrawBitmapAABench(false, SkMatrix::Translate(17.5f, 17.5f), "translate"); ) 63*c8dee2aaSAndroid Build Coastguard Worker 64*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( 65*c8dee2aaSAndroid Build Coastguard Worker SkMatrix m; 66*c8dee2aaSAndroid Build Coastguard Worker m.reset(); 67*c8dee2aaSAndroid Build Coastguard Worker m.preRotate(15); 68*c8dee2aaSAndroid Build Coastguard Worker return new DrawBitmapAABench(false, m, "rotate"); 69*c8dee2aaSAndroid Build Coastguard Worker ) 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new DrawBitmapAABench(true, SkMatrix::I(), "ident"); ) 72*c8dee2aaSAndroid Build Coastguard Worker 73*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new DrawBitmapAABench(true, SkMatrix::Scale(1.17f, 1.17f), "scale"); ) 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new DrawBitmapAABench(true, SkMatrix::Translate(17.5f, 17.5f), "translate"); ) 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( 78*c8dee2aaSAndroid Build Coastguard Worker SkMatrix m; 79*c8dee2aaSAndroid Build Coastguard Worker m.reset(); 80*c8dee2aaSAndroid Build Coastguard Worker m.preRotate(15); 81*c8dee2aaSAndroid Build Coastguard Worker return new DrawBitmapAABench(true, m, "rotate"); 82*c8dee2aaSAndroid Build Coastguard Worker ) 83