| /* | 
 |  * Copyright 2013 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 |  | 
 | #include "Benchmark.h" | 
 | #include "SkAutoPixmapStorage.h" | 
 | #include "SkBitmap.h" | 
 | #include "SkCanvas.h" | 
 | #include "SkColorPriv.h" | 
 | #include "SkDraw.h" | 
 | #include "SkMatrix.h" | 
 | #include "SkPath.h" | 
 | #include "SkRasterClip.h" | 
 |  | 
 | class DrawPathBench : public Benchmark { | 
 |     SkPaint     fPaint; | 
 |     SkString    fName; | 
 |     SkPath      fPath; | 
 |     SkRasterClip fRC; | 
 |     SkAutoPixmapStorage fPixmap; | 
 |     SkMatrix    fIdentity; | 
 |     SkDraw      fDraw; | 
 |     bool        fDrawCoverage; | 
 | public: | 
 |     DrawPathBench(bool drawCoverage) : fDrawCoverage(drawCoverage) { | 
 |         fPaint.setAntiAlias(true); | 
 |         fName.printf("draw_coverage_%s", drawCoverage ? "true" : "false"); | 
 |  | 
 |         fPath.moveTo(0, 0); | 
 |         fPath.quadTo(500, 0, 500, 500); | 
 |         fPath.quadTo(250, 0, 0, 500); | 
 |  | 
 |         fPixmap.alloc(SkImageInfo::MakeA8(500, 500)); | 
 |         if (!drawCoverage) { | 
 |             // drawPathCoverage() goes out of its way to work fine with an uninitialized | 
 |             // dst buffer, even in "SrcOver" mode, but ordinary drawing sure doesn't. | 
 |             fPixmap.erase(0); | 
 |         } | 
 |  | 
 |         fIdentity.setIdentity(); | 
 |         fRC.setRect(fPath.getBounds().round()); | 
 |  | 
 |         fDraw.fDst      = fPixmap; | 
 |         fDraw.fMatrix   = &fIdentity; | 
 |         fDraw.fRC       = &fRC; | 
 |     } | 
 |  | 
 | protected: | 
 |     const char* onGetName() override { | 
 |         return fName.c_str(); | 
 |     } | 
 |  | 
 |     void onDraw(int loops, SkCanvas* canvas) override { | 
 |         if (fDrawCoverage) { | 
 |             for (int i = 0; i < loops; ++i) { | 
 |                 fDraw.drawPathCoverage(fPath, fPaint); | 
 |             } | 
 |         } else { | 
 |             for (int i = 0; i < loops; ++i) { | 
 |                 fDraw.drawPath(fPath, fPaint); | 
 |             } | 
 |         } | 
 |     } | 
 |  | 
 | private: | 
 |     typedef Benchmark INHERITED; | 
 | }; | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | DEF_BENCH( return new DrawPathBench(false) ) | 
 | DEF_BENCH( return new DrawPathBench(true) ) |