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