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