11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkBenchmark.h"
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkAAClip.h"
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkPath.h"
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkRegion.h"
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkString.h"
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass AAClipBuilderBench : public SkBenchmark {
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkString fName;
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPath   fPath;
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRect   fRect;
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRegion fRegion;
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool     fDoPath;
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool     fDoAA;
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    enum {
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        N = SkBENCHLOOP(200),
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    AAClipBuilderBench(void* param, bool doPath, bool doAA) : INHERITED(param) {
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fDoPath = doPath;
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fDoAA = doAA;
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fName.printf("aaclip_build_%s_%s", doPath ? "path" : "rect",
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                     doAA ? "AA" : "BW");
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fRegion.setRect(0, 0, 640, 480);
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fRect.set(fRegion.getBounds());
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fRect.inset(SK_Scalar1/4, SK_Scalar1/4);
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fPath.addRoundRect(fRect, SkIntToScalar(20), SkIntToScalar(20));
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual const char* onGetName() { return fName.c_str(); }
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDraw(SkCanvas* canvas) {
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint paint;
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        this->setupPaint(&paint);
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (int i = 0; i < N; ++i) {
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkAAClip clip;
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (fDoPath) {
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                clip.setPath(fPath, &fRegion, fDoAA);
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            } else {
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                clip.setRect(fRect, fDoAA);
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef SkBenchmark INHERITED;
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass AAClipRegionBench : public SkBenchmark {
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    AAClipRegionBench(void* param) : INHERITED(param) {
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPath path;
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // test conversion of a complex clip to a aaclip
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        path.addCircle(0, 0, SkIntToScalar(200));
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        path.addCircle(0, 0, SkIntToScalar(180));
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // evenodd means we've constructed basically a stroked circle
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        path.setFillType(SkPath::kEvenOdd_FillType);
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkIRect bounds;
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        path.getBounds().roundOut(&bounds);
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fRegion.setPath(path, SkRegion(bounds));
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual const char* onGetName() { return "aaclip_setregion"; }
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDraw(SkCanvas* canvas) {
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (int i = 0; i < N; ++i) {
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkAAClip clip;
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            clip.setRegion(fRegion);
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    enum {
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        N = SkBENCHLOOP(400),
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    };
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRegion fRegion;
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef SkBenchmark INHERITED;
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkBenchmark* Fact0(void* p) { return SkNEW_ARGS(AAClipBuilderBench, (p, false, false)); }
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkBenchmark* Fact1(void* p) { return SkNEW_ARGS(AAClipBuilderBench, (p, false, true)); }
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkBenchmark* Fact2(void* p) { return SkNEW_ARGS(AAClipBuilderBench, (p, true, false)); }
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkBenchmark* Fact3(void* p) { return SkNEW_ARGS(AAClipBuilderBench, (p, true, true)); }
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic BenchRegistry gReg0(Fact0);
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic BenchRegistry gReg1(Fact1);
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic BenchRegistry gReg2(Fact2);
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic BenchRegistry gReg3(Fact3);
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic SkBenchmark* Fact01(void* p) { return SkNEW_ARGS(AAClipRegionBench, (p)); }
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic BenchRegistry gReg01(Fact01);
105