1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2013 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 8*c8dee2aaSAndroid Build Coastguard Worker #include "bench/Benchmark.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorPriv.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkMatrix.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkAutoPixmapStorage.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkDraw.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkRasterClip.h" 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker class DrawPathBench : public Benchmark { 19*c8dee2aaSAndroid Build Coastguard Worker SkPaint fPaint; 20*c8dee2aaSAndroid Build Coastguard Worker SkString fName; 21*c8dee2aaSAndroid Build Coastguard Worker SkPath fPath; 22*c8dee2aaSAndroid Build Coastguard Worker SkRasterClip fRC; 23*c8dee2aaSAndroid Build Coastguard Worker SkAutoPixmapStorage fPixmap; 24*c8dee2aaSAndroid Build Coastguard Worker SkDraw fDraw; 25*c8dee2aaSAndroid Build Coastguard Worker bool fDrawCoverage; 26*c8dee2aaSAndroid Build Coastguard Worker public: DrawPathBench(bool drawCoverage)27*c8dee2aaSAndroid Build Coastguard Worker DrawPathBench(bool drawCoverage) : fDrawCoverage(drawCoverage) { 28*c8dee2aaSAndroid Build Coastguard Worker fName.printf("draw_coverage_%s", drawCoverage ? "true" : "false"); 29*c8dee2aaSAndroid Build Coastguard Worker } 30*c8dee2aaSAndroid Build Coastguard Worker 31*c8dee2aaSAndroid Build Coastguard Worker protected: onGetName()32*c8dee2aaSAndroid Build Coastguard Worker const char* onGetName() override { 33*c8dee2aaSAndroid Build Coastguard Worker return fName.c_str(); 34*c8dee2aaSAndroid Build Coastguard Worker } 35*c8dee2aaSAndroid Build Coastguard Worker onDelayedSetup()36*c8dee2aaSAndroid Build Coastguard Worker void onDelayedSetup() override { 37*c8dee2aaSAndroid Build Coastguard Worker fPaint.setAntiAlias(true); 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker fPath.moveTo(0, 0); 40*c8dee2aaSAndroid Build Coastguard Worker fPath.quadTo(500, 0, 500, 500); 41*c8dee2aaSAndroid Build Coastguard Worker fPath.quadTo(250, 0, 0, 500); 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker fPixmap.alloc(SkImageInfo::MakeA8(500, 500)); 44*c8dee2aaSAndroid Build Coastguard Worker if (!fDrawCoverage) { 45*c8dee2aaSAndroid Build Coastguard Worker // drawPathCoverage() goes out of its way to work fine with an uninitialized 46*c8dee2aaSAndroid Build Coastguard Worker // dst buffer, even in "SrcOver" mode, but ordinary drawing sure doesn't. 47*c8dee2aaSAndroid Build Coastguard Worker fPixmap.erase(0); 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker fRC.setRect(fPath.getBounds().round()); 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker fDraw.fDst = fPixmap; 53*c8dee2aaSAndroid Build Coastguard Worker fDraw.fCTM = &SkMatrix::I(); 54*c8dee2aaSAndroid Build Coastguard Worker fDraw.fRC = &fRC; 55*c8dee2aaSAndroid Build Coastguard Worker } 56*c8dee2aaSAndroid Build Coastguard Worker onDraw(int loops,SkCanvas * canvas)57*c8dee2aaSAndroid Build Coastguard Worker void onDraw(int loops, SkCanvas* canvas) override { 58*c8dee2aaSAndroid Build Coastguard Worker if (fDrawCoverage) { 59*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < loops; ++i) { 60*c8dee2aaSAndroid Build Coastguard Worker fDraw.drawPathCoverage(fPath, fPaint); 61*c8dee2aaSAndroid Build Coastguard Worker } 62*c8dee2aaSAndroid Build Coastguard Worker } else { 63*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < loops; ++i) { 64*c8dee2aaSAndroid Build Coastguard Worker fDraw.drawPath(fPath, fPaint); 65*c8dee2aaSAndroid Build Coastguard Worker } 66*c8dee2aaSAndroid Build Coastguard Worker } 67*c8dee2aaSAndroid Build Coastguard Worker } 68*c8dee2aaSAndroid Build Coastguard Worker 69*c8dee2aaSAndroid Build Coastguard Worker private: 70*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = Benchmark; 71*c8dee2aaSAndroid Build Coastguard Worker }; 72*c8dee2aaSAndroid Build Coastguard Worker 73*c8dee2aaSAndroid Build Coastguard Worker /////////////////////////////////////////////////////////////////////////////// 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new DrawPathBench(false) ) 76*c8dee2aaSAndroid Build Coastguard Worker DEF_BENCH( return new DrawPathBench(true) ) 77