1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci * Copyright 2017 Google Inc.
3cb93a386Sopenharmony_ci *
4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci * found in the LICENSE file.
6cb93a386Sopenharmony_ci */
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#include "gm/gm.h"
9cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h"
10cb93a386Sopenharmony_ci#include "include/core/SkColor.h"
11cb93a386Sopenharmony_ci#include "include/core/SkPaint.h"
12cb93a386Sopenharmony_ci#include "include/core/SkRRect.h"
13cb93a386Sopenharmony_ci#include "include/core/SkRect.h"
14cb93a386Sopenharmony_ci#include "include/core/SkScalar.h"
15cb93a386Sopenharmony_ci#include "include/core/SkSize.h"
16cb93a386Sopenharmony_ci#include "include/core/SkString.h"
17cb93a386Sopenharmony_ci#include "include/utils/SkRandom.h"
18cb93a386Sopenharmony_ci#include "tools/ToolUtils.h"
19cb93a386Sopenharmony_ci
20cb93a386Sopenharmony_cinamespace skiagm {
21cb93a386Sopenharmony_ci
22cb93a386Sopenharmony_cistatic SkColor gen_color(SkRandom* rand) {
23cb93a386Sopenharmony_ci    SkScalar hsv[3];
24cb93a386Sopenharmony_ci    hsv[0] = rand->nextRangeF(0.0f, 360.0f);
25cb93a386Sopenharmony_ci    hsv[1] = rand->nextRangeF(0.5f, 1.0f);
26cb93a386Sopenharmony_ci    hsv[2] = rand->nextRangeF(0.5f, 1.0f);
27cb93a386Sopenharmony_ci
28cb93a386Sopenharmony_ci    return ToolUtils::color_to_565(SkHSVToColor(hsv));
29cb93a386Sopenharmony_ci}
30cb93a386Sopenharmony_ci
31cb93a386Sopenharmony_ciclass ManyCirclesGM : public GM {
32cb93a386Sopenharmony_ci    // This GM attempts to flood Ganesh with more circles than will fit in a single index buffer
33cb93a386Sopenharmony_ci    // Stresses crbug.com/688582.
34cb93a386Sopenharmony_cipublic:
35cb93a386Sopenharmony_ci    ManyCirclesGM() {
36cb93a386Sopenharmony_ci        this->setBGColor(0xFFFFFFFF);
37cb93a386Sopenharmony_ci    }
38cb93a386Sopenharmony_ci
39cb93a386Sopenharmony_ciprotected:
40cb93a386Sopenharmony_ci    static const int kWidth = 800;
41cb93a386Sopenharmony_ci    static const int kHeight = 600;
42cb93a386Sopenharmony_ci
43cb93a386Sopenharmony_ci    SkString onShortName() override {
44cb93a386Sopenharmony_ci        return SkString("manycircles");
45cb93a386Sopenharmony_ci    }
46cb93a386Sopenharmony_ci
47cb93a386Sopenharmony_ci    SkISize onISize() override {
48cb93a386Sopenharmony_ci        return SkISize::Make(kWidth, kHeight);
49cb93a386Sopenharmony_ci    }
50cb93a386Sopenharmony_ci
51cb93a386Sopenharmony_ci    void onDraw(SkCanvas* canvas) override {
52cb93a386Sopenharmony_ci        SkRandom rand(1);
53cb93a386Sopenharmony_ci        SkPaint paint;
54cb93a386Sopenharmony_ci        paint.setAntiAlias(true);
55cb93a386Sopenharmony_ci        int total = 10000;
56cb93a386Sopenharmony_ci        while (total--) {
57cb93a386Sopenharmony_ci            SkScalar x = rand.nextF() * kWidth - 100;
58cb93a386Sopenharmony_ci            SkScalar y = rand.nextF() * kHeight - 100;
59cb93a386Sopenharmony_ci            SkScalar w = rand.nextF() * 200;
60cb93a386Sopenharmony_ci            SkRect circle = SkRect::MakeXYWH(x, y, w, w);
61cb93a386Sopenharmony_ci            paint.setColor(gen_color(&rand));
62cb93a386Sopenharmony_ci            canvas->drawOval(circle, paint);
63cb93a386Sopenharmony_ci        }
64cb93a386Sopenharmony_ci    }
65cb93a386Sopenharmony_ci
66cb93a386Sopenharmony_ciprivate:
67cb93a386Sopenharmony_ci    using INHERITED = GM;
68cb93a386Sopenharmony_ci};
69cb93a386Sopenharmony_ci
70cb93a386Sopenharmony_ci//////////////////////////////////////////////////////////////////////////////
71cb93a386Sopenharmony_ci
72cb93a386Sopenharmony_ciclass ManyRRectsGM : public GM {
73cb93a386Sopenharmony_ci    // This GM attempts to flood Ganesh with more rrects than will fit in a single index buffer
74cb93a386Sopenharmony_ci    // Stresses crbug.com/684112
75cb93a386Sopenharmony_cipublic:
76cb93a386Sopenharmony_ci    ManyRRectsGM() {
77cb93a386Sopenharmony_ci        this->setBGColor(0xFFFFFFFF);
78cb93a386Sopenharmony_ci    }
79cb93a386Sopenharmony_ci
80cb93a386Sopenharmony_ciprotected:
81cb93a386Sopenharmony_ci
82cb93a386Sopenharmony_ci    SkString onShortName() override {
83cb93a386Sopenharmony_ci        return SkString("manyrrects");
84cb93a386Sopenharmony_ci    }
85cb93a386Sopenharmony_ci
86cb93a386Sopenharmony_ci    SkISize onISize() override {
87cb93a386Sopenharmony_ci        return SkISize::Make(800, 300);
88cb93a386Sopenharmony_ci    }
89cb93a386Sopenharmony_ci
90cb93a386Sopenharmony_ci    void onDraw(SkCanvas* canvas) override {
91cb93a386Sopenharmony_ci        SkRandom rand(1);
92cb93a386Sopenharmony_ci        SkPaint paint;
93cb93a386Sopenharmony_ci        paint.setAntiAlias(true);
94cb93a386Sopenharmony_ci        paint.setColor(SK_ColorBLUE);
95cb93a386Sopenharmony_ci        int total = 7000;
96cb93a386Sopenharmony_ci
97cb93a386Sopenharmony_ci        // Rectangle positioning variables
98cb93a386Sopenharmony_ci        int x = 0;
99cb93a386Sopenharmony_ci        int y = 0;
100cb93a386Sopenharmony_ci        const int kXLimit = 700;
101cb93a386Sopenharmony_ci        const int kYIncrement = 5;
102cb93a386Sopenharmony_ci        const int kXIncrement = 5;
103cb93a386Sopenharmony_ci
104cb93a386Sopenharmony_ci        SkRect rect = SkRect::MakeLTRB(0, 0, 4, 4);
105cb93a386Sopenharmony_ci        SkRRect rrect = SkRRect::MakeRectXY(rect, 1, 1);
106cb93a386Sopenharmony_ci        while (total--) {
107cb93a386Sopenharmony_ci            canvas->save();
108cb93a386Sopenharmony_ci            canvas->translate(x, y);
109cb93a386Sopenharmony_ci            canvas->drawRRect(rrect, paint);
110cb93a386Sopenharmony_ci            x += kXIncrement;
111cb93a386Sopenharmony_ci            if (x > kXLimit) {
112cb93a386Sopenharmony_ci                x = 0;
113cb93a386Sopenharmony_ci                y += kYIncrement;
114cb93a386Sopenharmony_ci            }
115cb93a386Sopenharmony_ci            canvas->restore();
116cb93a386Sopenharmony_ci        }
117cb93a386Sopenharmony_ci    }
118cb93a386Sopenharmony_ci
119cb93a386Sopenharmony_ciprivate:
120cb93a386Sopenharmony_ci    using INHERITED = GM;
121cb93a386Sopenharmony_ci};
122cb93a386Sopenharmony_ci
123cb93a386Sopenharmony_ci//////////////////////////////////////////////////////////////////////////////
124cb93a386Sopenharmony_ci
125cb93a386Sopenharmony_ciDEF_GM( return new ManyCirclesGM; )
126cb93a386Sopenharmony_ciDEF_GM( return new ManyRRectsGM; )
127cb93a386Sopenharmony_ci
128cb93a386Sopenharmony_ci}  // namespace skiagm
129