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 "SkRandom.h"
10
11#define W   400
12#define H   400
13#define N   10
14
15static const SkScalar SH = SkIntToScalar(H);
16
17static void rnd_quad(SkPath* p, SkPaint* paint, SkRandom& rand) {
18    p->moveTo(rand.nextRangeScalar(0,  W), rand.nextRangeScalar(0,  H));
19    for (int x = 0; x < 2; ++x) {
20        p->quadTo(rand.nextRangeScalar(W / 4,  W), rand.nextRangeScalar(0,  H),
21                rand.nextRangeScalar(0,  W), rand.nextRangeScalar(H / 4,  H));
22    }
23    paint->setColor(rand.nextU());
24    SkScalar width = rand.nextRangeScalar(1, 5);
25    width *= width;
26    paint->setStrokeWidth(width);
27    paint->setAlpha(0xFF);
28}
29
30static void rnd_cubic(SkPath* p, SkPaint* paint, SkRandom& rand) {
31    p->moveTo(rand.nextRangeScalar(0,  W), rand.nextRangeScalar(0,  H));
32    for (int x = 0; x < 2; ++x) {
33        p->cubicTo(rand.nextRangeScalar(W / 4,  W), rand.nextRangeScalar(0,  H),
34                rand.nextRangeScalar(0,  W), rand.nextRangeScalar(H / 4,  H),
35                rand.nextRangeScalar(W / 4,  W), rand.nextRangeScalar(H / 4,  H));
36    }
37    paint->setColor(rand.nextU());
38    SkScalar width = rand.nextRangeScalar(1, 5);
39    width *= width;
40    paint->setStrokeWidth(width);
41    paint->setAlpha(0xFF);
42}
43
44class BeziersGM : public skiagm::GM {
45public:
46    BeziersGM() {}
47
48protected:
49
50    SkString onShortName() override {
51        return SkString("beziers");
52    }
53
54    SkISize onISize() override {
55        return SkISize::Make(W, H*2);
56    }
57
58    void onDraw(SkCanvas* canvas) override {
59        SkPaint paint;
60        paint.setStyle(SkPaint::kStroke_Style);
61        paint.setStrokeWidth(SkIntToScalar(9)/2);
62        paint.setAntiAlias(true);
63
64        SkRandom rand;
65        for (int i = 0; i < N; i++) {
66            SkPath p;
67            rnd_quad(&p, &paint, rand);
68            canvas->drawPath(p, paint);
69        }
70        canvas->translate(0, SH);
71        for (int i = 0; i < N; i++) {
72            SkPath p;
73            rnd_cubic(&p, &paint, rand);
74            canvas->drawPath(p, paint);
75        }
76    }
77
78private:
79    typedef skiagm::GM INHERITED;
80};
81
82static skiagm::GM* F0(void*) { return new BeziersGM; }
83static skiagm::GMRegistry R0(F0);
84