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