1/*
2 * Copyright 2014 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "gm.h"
9#include "SkPath.h"
10#include "SkRandom.h"
11
12#define W   400
13#define H   400
14#define N   10
15
16constexpr SkScalar SH = SkIntToScalar(H);
17
18static void rnd_quad(SkPath* p, SkPaint* paint, SkRandom& rand) {
19    auto a = rand.nextRangeScalar(0,W),
20         b = rand.nextRangeScalar(0,H);
21    p->moveTo(a,b);
22    for (int x = 0; x < 2; ++x) {
23        auto c = rand.nextRangeScalar(W/4, W),
24             d = rand.nextRangeScalar(  0, H),
25             e = rand.nextRangeScalar(  0, W),
26             f = rand.nextRangeScalar(H/4, H);
27        p->quadTo(c,d,e,f);
28    }
29    paint->setColor(rand.nextU());
30    SkScalar width = rand.nextRangeScalar(1, 5);
31    width *= width;
32    paint->setStrokeWidth(width);
33    paint->setAlpha(0xFF);
34}
35
36static void rnd_cubic(SkPath* p, SkPaint* paint, SkRandom& rand) {
37    auto a = rand.nextRangeScalar(0,W),
38         b = rand.nextRangeScalar(0,H);
39    p->moveTo(a,b);
40    for (int x = 0; x < 2; ++x) {
41        auto c = rand.nextRangeScalar(W/4, W),
42             d = rand.nextRangeScalar(  0, H),
43             e = rand.nextRangeScalar(  0, W),
44             f = rand.nextRangeScalar(H/4, H),
45             g = rand.nextRangeScalar(W/4, W),
46             h = rand.nextRangeScalar(H/4, H);
47        p->cubicTo(c,d,e,f,g,h);
48    }
49    paint->setColor(rand.nextU());
50    SkScalar width = rand.nextRangeScalar(1, 5);
51    width *= width;
52    paint->setStrokeWidth(width);
53    paint->setAlpha(0xFF);
54}
55
56class BeziersGM : public skiagm::GM {
57public:
58    BeziersGM() {}
59
60protected:
61
62    SkString onShortName() override {
63        return SkString("beziers");
64    }
65
66    SkISize onISize() override {
67        return SkISize::Make(W, H*2);
68    }
69
70    void onDraw(SkCanvas* canvas) override {
71        SkPaint paint;
72        paint.setStyle(SkPaint::kStroke_Style);
73        paint.setStrokeWidth(SkIntToScalar(9)/2);
74        paint.setAntiAlias(true);
75
76        SkRandom rand;
77        for (int i = 0; i < N; i++) {
78            SkPath p;
79            rnd_quad(&p, &paint, rand);
80            canvas->drawPath(p, paint);
81        }
82        canvas->translate(0, SH);
83        for (int i = 0; i < N; i++) {
84            SkPath p;
85            rnd_cubic(&p, &paint, rand);
86            canvas->drawPath(p, paint);
87        }
88    }
89
90private:
91    typedef skiagm::GM INHERITED;
92};
93
94DEF_GM( return new BeziersGM; )
95