7f77463ee575fe443c6444d8c0d7295bb2947d5c
[platform/upstream/libSkiaSharp.git] / gm / samplerstress.cpp
1 /*
2  * Copyright 2012 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 "SkCanvas.h"
10 #include "SkShader.h"
11 #include "SkBlurMaskFilter.h"
12
13 namespace skiagm {
14
15 /**
16  * Stress test the GPU samplers by rendering a textured glyph with a mask and
17  * an AA clip
18  */
19 class SamplerStressGM : public GM {
20 public:
21     SamplerStressGM()
22     : fTextureCreated(false)
23     , fShader(NULL)
24     , fMaskFilter(NULL) {
25     }
26
27     virtual ~SamplerStressGM() {
28     }
29
30 protected:
31
32     SkString onShortName() SK_OVERRIDE {
33         return SkString("gpusamplerstress");
34     }
35
36     SkISize onISize() SK_OVERRIDE {
37         return SkISize::Make(640, 480);
38     }
39
40     /**
41      * Create a red & green stripes on black texture
42      */
43     void createTexture() {
44         if (fTextureCreated) {
45             return;
46         }
47
48         static const int xSize = 16;
49         static const int ySize = 16;
50
51         fTexture.allocN32Pixels(xSize, ySize);
52         SkPMColor* addr = fTexture.getAddr32(0, 0);
53
54         for (int y = 0; y < ySize; ++y) {
55             for (int x = 0; x < xSize; ++x) {
56                 addr[y*xSize+x] = SkPreMultiplyColor(SK_ColorBLACK);
57
58                 if ((y % 5) == 0) {
59                     addr[y*xSize+x] = SkPreMultiplyColor(SK_ColorRED);
60                 }
61                 if ((x % 7) == 0) {
62                     addr[y*xSize+x] = SkPreMultiplyColor(SK_ColorGREEN);
63                 }
64             }
65         }
66
67         fTextureCreated = true;
68     }
69
70     void createShader() {
71         if (fShader.get()) {
72             return;
73         }
74
75         createTexture();
76
77         fShader.reset(SkShader::CreateBitmapShader(fTexture,
78                                                    SkShader::kRepeat_TileMode,
79                                                    SkShader::kRepeat_TileMode));
80     }
81
82     void createMaskFilter() {
83         if (fMaskFilter.get()) {
84             return;
85         }
86
87         const SkScalar sigma = 1;
88         fMaskFilter.reset(SkBlurMaskFilter::Create(kNormal_SkBlurStyle, sigma));
89     }
90
91     void onDraw(SkCanvas* canvas) SK_OVERRIDE {
92         createShader();
93         createMaskFilter();
94
95         canvas->save();
96
97         // draw a letter "M" with a green & red striped texture and a
98         // stipple mask with a round rect soft clip
99         SkPaint paint;
100         paint.setAntiAlias(true);
101         paint.setTextSize(72);
102         paint.setShader(fShader.get());
103         paint.setMaskFilter(fMaskFilter.get());
104
105         SkRect temp;
106         temp.set(SkIntToScalar(115),
107                  SkIntToScalar(75),
108                  SkIntToScalar(144),
109                  SkIntToScalar(110));
110
111         SkPath path;
112         path.addRoundRect(temp, SkIntToScalar(5), SkIntToScalar(5));
113
114         canvas->clipPath(path, SkRegion::kReplace_Op, true); // AA is on
115
116         canvas->drawText("M", 1,
117                          SkIntToScalar(100), SkIntToScalar(100),
118                          paint);
119
120         canvas->restore();
121
122         // Now draw stroked versions of the "M" and the round rect so we can
123         // see what is going on
124         SkPaint paint2;
125         paint2.setColor(SK_ColorBLACK);
126         paint2.setAntiAlias(true);
127         paint2.setTextSize(72);
128         paint2.setStyle(SkPaint::kStroke_Style);
129         paint2.setStrokeWidth(1);
130         canvas->drawText("M", 1,
131                          SkIntToScalar(100), SkIntToScalar(100),
132                          paint2);
133
134         paint2.setColor(SK_ColorGRAY);
135
136         canvas->drawPath(path, paint2);
137     }
138
139 private:
140     SkBitmap      fTexture;
141     bool          fTextureCreated;
142     SkAutoTUnref<SkShader>     fShader;
143     SkAutoTUnref<SkMaskFilter> fMaskFilter;
144
145     typedef GM INHERITED;
146 };
147
148 //////////////////////////////////////////////////////////////////////////////
149
150 static GM* MyFactory(void*) { return new SamplerStressGM; }
151 static GMRegistry reg(MyFactory);
152
153 }