Home | History | Annotate | Download | only in gm
      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 
     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:
     29     ManyCirclesGM() {
     30         this->setBGColor(0xFFFFFFFF);
     31     }
     32 
     33 protected:
     34     static const int kWidth = 800;
     35     static const int kHeight = 600;
     36 
     37     SkString onShortName() override {
     38         return SkString("manycircles");
     39     }
     40 
     41     SkISize onISize() override {
     42         return SkISize::Make(kWidth, kHeight);
     43     }
     44 
     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:
     70     ManyRRectsGM() {
     71         this->setBGColor(0xFFFFFFFF);
     72     }
     73 
     74 protected:
     75 
     76     SkString onShortName() override {
     77         return SkString("manyrrects");
     78     }
     79 
     80     SkISize onISize() override {
     81         return SkISize::Make(800, 300);
     82     }
     83 
     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