1 
2 /*
3  * Copyright 2011 Google Inc.
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8 
9 
10 
11 #include "gm.h"
12 #include "SkRandom.h"
13 
14 namespace skiagm {
15 
16 #define W   400
17 #define H   400
18 #define N   100
19 
20 static const SkScalar SW = SkIntToScalar(W);
21 static const SkScalar SH = SkIntToScalar(H);
22 
23 class StrokeRectsGM : public GM {
24 public:
StrokeRectsGM()25     StrokeRectsGM() {}
26 
27 protected:
28 
onShortName()29     SkString onShortName() override {
30         return SkString("strokerects");
31     }
32 
onISize()33     SkISize onISize() override {
34         return SkISize::Make(W*2, H*2);
35     }
36 
rnd_rect(SkRect * r,SkRandom & rand)37     static void rnd_rect(SkRect* r, SkRandom& rand) {
38         SkScalar x = rand.nextUScalar1() * W;
39         SkScalar y = rand.nextUScalar1() * H;
40         SkScalar w = rand.nextUScalar1() * (W >> 2);
41         SkScalar h = rand.nextUScalar1() * (H >> 2);
42         SkScalar hoffset = rand.nextSScalar1();
43         SkScalar woffset = rand.nextSScalar1();
44 
45         r->set(x, y, x + w, y + h);
46         r->offset(-w/2 + woffset, -h/2 + hoffset);
47     }
48 
onDraw(SkCanvas * canvas)49     void onDraw(SkCanvas* canvas) override {
50         SkPaint paint;
51         paint.setStyle(SkPaint::kStroke_Style);
52 
53         for (int y = 0; y < 2; y++) {
54             paint.setAntiAlias(!!y);
55             for (int x = 0; x < 2; x++) {
56                 paint.setStrokeWidth(x * SkIntToScalar(3));
57 
58                 SkAutoCanvasRestore acr(canvas, true);
59                 canvas->translate(SW * x, SH * y);
60                 canvas->clipRect(SkRect::MakeLTRB(
61                         SkIntToScalar(2), SkIntToScalar(2)
62                         , SW - SkIntToScalar(2), SH - SkIntToScalar(2)
63                 ));
64 
65                 SkRandom rand;
66                 for (int i = 0; i < N; i++) {
67                     SkRect r;
68                     rnd_rect(&r, rand);
69                     canvas->drawRect(r, paint);
70                 }
71             }
72         }
73     }
74 
75 private:
76     typedef GM INHERITED;
77 };
78 
79 //////////////////////////////////////////////////////////////////////////////
80 
MyFactory(void *)81 static GM* MyFactory(void*) { return new StrokeRectsGM; }
82 static GMRegistry reg(MyFactory);
83 
84 }
85