/*
 * 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 "SkCanvas.h"
#include "SkPaint.h"
#include "SkRRect.h"
#include "SkString.h"

struct RRectRec {
    SkCanvas*   fCanvas;
    SkRRect     fRRect;
    SkPaint     fPaint;
};

typedef const char* (*DrawProc)(const RRectRec*, int);

static const char* draw_rect(const RRectRec* rec, int count) {
    if (rec) {
        const SkRect& r = rec->fRRect.getBounds();
        for (int i = 0; i < count; ++i) {
            rec->fCanvas->drawRect(r, rec->fPaint);
        }
    }
    return "rect";
}

static const char* draw_rrect(const RRectRec* rec, int count) {
    if (rec) {
        for (int i = 0; i < count; ++i) {
            rec->fCanvas->drawRRect(rec->fRRect, rec->fPaint);
        }
    }
    return "rrect";
}

static const char* draw_oval(const RRectRec* rec, int count) {
    if (rec) {
        const SkRect& r = rec->fRRect.getBounds();
        for (int i = 0; i < count; ++i) {
            rec->fCanvas->drawOval(r, rec->fPaint);
        }
    }
    return "oval";
}

// Handles rect, rrect, and oval
//
// Test drawing a small stroked version to see the effect of special-casing
// our stroke code for these convex single-contour shapes.
//
class StrokeRRectBench : public Benchmark {
    SkString fName;
    SkPaint::Join fJoin;
    RRectRec fRec;
    DrawProc fProc;
public:
    StrokeRRectBench(SkPaint::Join j, DrawProc proc) {
        static const char* gJoinName[] = {
            "miter", "round", "bevel"
        };

        fJoin = j;
        fProc = proc;
        fName.printf("draw_stroke_%s_%s", proc(NULL, 0), gJoinName[j]);

        SkRect r = { 20, 20, 40, 40 };
        SkScalar rad = 4;
        fRec.fRRect.setRectXY(r, rad, rad);
    }

protected:
    virtual const char* onGetName() {
        return fName.c_str();
    }

    virtual void onDraw(const int loops, SkCanvas* canvas) {
        fRec.fCanvas = canvas;
        this->setupPaint(&fRec.fPaint);
        fRec.fPaint.setStyle(SkPaint::kStroke_Style);
        fRec.fPaint.setStrokeJoin(fJoin);
        fRec.fPaint.setStrokeWidth(5);
        fProc(&fRec, loops);
    }

private:
    typedef Benchmark INHERITED;
};

DEF_BENCH( return new StrokeRRectBench(SkPaint::kRound_Join, draw_rect); )
DEF_BENCH( return new StrokeRRectBench(SkPaint::kBevel_Join, draw_rect); )
DEF_BENCH( return new StrokeRRectBench(SkPaint::kMiter_Join, draw_rect); )

DEF_BENCH( return new StrokeRRectBench(SkPaint::kRound_Join, draw_rrect); )
DEF_BENCH( return new StrokeRRectBench(SkPaint::kBevel_Join, draw_rrect); )
DEF_BENCH( return new StrokeRRectBench(SkPaint::kMiter_Join, draw_rrect); )

DEF_BENCH( return new StrokeRRectBench(SkPaint::kRound_Join, draw_oval); )
DEF_BENCH( return new StrokeRRectBench(SkPaint::kBevel_Join, draw_oval); )
DEF_BENCH( return new StrokeRRectBench(SkPaint::kMiter_Join, draw_oval); )
