/*
 * Copyright 2017 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"

#if SK_SUPPORT_GPU

#include "GrPathUtils.h"
#include "SkGeometry.h"

class CubicKLMBench : public Benchmark {
public:
    CubicKLMBench(SkScalar x0, SkScalar y0, SkScalar x1, SkScalar y1,
                  SkScalar x2, SkScalar y2, SkScalar x3, SkScalar y3)  {
        fPoints[0].set(x0, y0);
        fPoints[1].set(x1, y1);
        fPoints[2].set(x2, y2);
        fPoints[3].set(x3, y3);

        fName = "cubic_klm_";
        switch (SkClassifyCubic(fPoints)) {
            case SkCubicType::kSerpentine:
                fName.append("serp");
                break;
            case SkCubicType::kLoop:
                fName.append("loop");
                break;
            default:
                SkFAIL("Unexpected cubic type");
                break;
        }
    }

    bool isSuitableFor(Backend backend) override {
        return backend == kNonRendering_Backend;
    }

    const char* onGetName() override {
        return fName.c_str();
    }

    void onDraw(int loops, SkCanvas*) override {
        SkPoint dst[10];
        SkMatrix klm;
        int loopIdx;
        for (int i = 0; i < loops * 50000; ++i) {
            GrPathUtils::chopCubicAtLoopIntersection(fPoints, dst, &klm, &loopIdx);
        }
    }

private:
    SkPoint     fPoints[4];
    SkString    fName;

    typedef Benchmark INHERITED;
};

DEF_BENCH( return new CubicKLMBench(285.625f, 499.687f, 411.625f, 808.188f,
                                    1064.62f, 135.688f, 1042.63f, 585.187f); )
DEF_BENCH( return new CubicKLMBench(635.625f, 614.687f, 171.625f, 236.188f,
                                    1064.62f, 135.688f, 516.625f, 570.187f); )

#endif
