OLD | NEW |
---|---|
(Empty) | |
1 /* | |
2 * Copyright 2014 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 "Benchmark.h" | |
9 #include "SkCanvas.h" | |
10 #include "SkGradientShader.h" | |
11 #include "SkPaint.h" | |
12 #include "SkPatchGrid.h" | |
13 #include "SkString.h" | |
14 | |
egdaniel
2014/08/15 03:46:26
Add very brief comment on what this bench is testi
| |
15 class PatchGridBench : public Benchmark { | |
16 | |
17 public: | |
18 | |
19 enum Size { | |
20 kSmall_Size, | |
21 kMedium_Size, | |
22 kBig_Size | |
23 }; | |
24 | |
25 enum VertexMode { | |
26 kNone_VertexMode, | |
27 kColors_VertexMode, | |
28 kTexCoords_VertexMode, | |
29 kBoth_VertexMode | |
30 }; | |
31 | |
32 PatchGridBench(Size size, VertexMode vertexMode) | |
33 : fVertexMode(vertexMode) | |
34 , fSize(size) { } | |
35 | |
36 void setScale(SkCanvas* canvas){ | |
37 switch (fSize) { | |
38 case kSmall_Size: | |
39 canvas->scale(0.1f, 0.1f); | |
40 break; | |
41 case kMedium_Size: | |
42 canvas->scale(1.0f, 1.0f); | |
43 break; | |
44 case kBig_Size: | |
45 canvas->scale(3.0f, 3.0f); | |
46 break; | |
47 } | |
48 } | |
49 | |
50 void setGrid() { | |
51 SkPoint vertices[4][5] = { | |
52 {{50,50}, {150,50}, {250,50},{350,50},{450,50}}, | |
53 {{50,150}, {120,120}, {250,150},{350,150},{450,150}}, | |
54 {{50,250}, {150,250}, {250,250},{350,250},{450,250}}, | |
55 {{100,300}, {150,350}, {250,350},{350,350},{450,350}} | |
56 }; | |
57 | |
58 SkColor cornerColors[4][5] = { | |
59 {SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE} , | |
60 {SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED}, | |
61 {SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE} , | |
62 {SK_ColorRED, SK_ColorBLUE, SK_ColorRED, SK_ColorBLUE, SK_ColorRED}, | |
63 }; | |
64 | |
65 SkPoint texCoords[4][5] = { | |
66 {{0.0f,0.0f}, {1.0f,0.0f}, {2.0f,0.0f}, {3.0f,0.0f}, {4.0f,0.0f}}, | |
67 {{0.0f,1.0f}, {1.0f,1.0f}, {2.0f,1.0f}, {3.0f,1.0f}, {4.0f,1.0f}}, | |
68 {{0.0f,2.0f}, {1.0f,2.0f}, {2.0f,2.0f}, {3.0f,2.0f}, {4.0f,2.0f}}, | |
69 {{0.0f,3.0f}, {1.0f,3.0f}, {2.0f,3.0f}, {3.0f,3.0f}, {4.0f,3.0f}}, | |
70 }; | |
71 | |
72 SkPoint hrzCtrl[4][8] = { | |
73 {{75,30},{125,45},{175,70},{225,20},{275,50},{325,50},{375,5},{425,9 0}}, | |
74 {{75,150},{125,150},{175,150},{225,150},{275,150},{325,150},{375,150 },{425,150}}, | |
75 {{75,250},{125,250},{175,250},{225,250},{275,200},{325,150},{375,250 },{425,250}}, | |
76 {{75,350},{125,350},{175,350},{225,350},{275,350},{325,350},{375,350 },{425,350}} | |
77 }; | |
78 | |
79 SkPoint vrtCtrl[6][5] = { | |
80 {{50,75},{150,75},{250,75},{350,75},{450,75}}, | |
81 {{50,125},{150,125},{250,125},{350,125},{450,125}}, | |
82 {{50,175},{150,175},{220,225},{350,175},{470,225}}, | |
83 {{50,225},{150,225},{220,175},{350,225},{470,155}}, | |
84 {{50,275},{150,275},{250,275},{350,275},{400,305}}, | |
85 {{50,325},{150,325},{250,325},{350,325},{450,325}} | |
86 }; | |
87 | |
88 static const int kRows = 3; | |
89 static const int kCols = 4; | |
90 | |
91 fGrid.reset(kRows, kCols, SkPatchGrid::kColors_VertexType, NULL); | |
92 for (int i = 0; i < kRows; i++) { | |
93 for (int j = 0; j < kCols; j++) { | |
94 SkPoint points[12]; | |
95 | |
96 //set corners | |
97 points[SkPatchUtils::kTopP0_CubicCtrlPts] = vertices[i][j]; | |
98 points[SkPatchUtils::kTopP3_CubicCtrlPts] = vertices[i][j + 1]; | |
99 points[SkPatchUtils::kBottomP0_CubicCtrlPts] = vertices[i + 1][j ]; | |
100 points[SkPatchUtils::kBottomP3_CubicCtrlPts] = vertices[i + 1][j + 1]; | |
101 | |
102 points[SkPatchUtils::kTopP1_CubicCtrlPts] = hrzCtrl[i][j * 2]; | |
103 points[SkPatchUtils::kTopP2_CubicCtrlPts] = hrzCtrl[i][j * 2 + 1 ]; | |
104 points[SkPatchUtils::kBottomP1_CubicCtrlPts] = hrzCtrl[i + 1][j * 2]; | |
105 points[SkPatchUtils::kBottomP2_CubicCtrlPts] = hrzCtrl[i + 1][j * 2 + 1]; | |
106 | |
107 points[SkPatchUtils::kLeftP1_CubicCtrlPts] = vrtCtrl[i * 2][j]; | |
108 points[SkPatchUtils::kLeftP2_CubicCtrlPts] = vrtCtrl[i * 2 + 1][ j]; | |
109 points[SkPatchUtils::kRightP1_CubicCtrlPts] = vrtCtrl[i * 2][j + 1]; | |
110 points[SkPatchUtils::kRightP2_CubicCtrlPts] = vrtCtrl[i * 2 + 1] [j + 1]; | |
111 | |
112 SkColor colors[4]; | |
113 colors[0] = cornerColors[i][j]; | |
114 colors[1] = cornerColors[i][j + 1]; | |
115 colors[3] = cornerColors[i + 1][j]; | |
116 colors[2] = cornerColors[i + 1][j + 1]; | |
117 | |
118 SkPoint texs[4]; | |
119 texs[0] = texCoords[i][j]; | |
120 texs[1] = texCoords[i][j + 1]; | |
121 texs[3] = texCoords[i + 1][j]; | |
122 texs[2] = texCoords[i + 1][j + 1]; | |
123 | |
124 switch (fVertexMode) { | |
125 case kNone_VertexMode: | |
126 fGrid.setPatch(j, i, points, NULL, NULL); | |
127 break; | |
128 case kColors_VertexMode: | |
129 fGrid.setPatch(j, i, points, colors, NULL); | |
130 break; | |
131 case kTexCoords_VertexMode: | |
132 fGrid.setPatch(j, i, points, NULL, texs); | |
133 break; | |
134 case kBoth_VertexMode: | |
135 fGrid.setPatch(j, i, points, colors, texs); | |
136 break; | |
137 default: | |
138 break; | |
139 } | |
140 } | |
141 } | |
142 } | |
143 | |
144 // override this method to change the shader | |
145 SkShader* createShader() { | |
146 const SkColor colors[] = { | |
147 SK_ColorRED, SK_ColorCYAN, SK_ColorGREEN, SK_ColorWHITE, | |
148 SK_ColorMAGENTA, SK_ColorBLUE, SK_ColorYELLOW, | |
149 }; | |
150 const SkPoint pts[] = { { 200.f / 4.f, 0.f }, { 3.f * 200.f / 4, 200.f } }; | |
151 | |
152 return SkGradientShader::CreateLinear(pts, colors, NULL, | |
153 SK_ARRAY_COUNT(colors), | |
154 SkShader::kMirror_TileMode); | |
155 } | |
156 | |
157 protected: | |
158 virtual const char* onGetName() SK_OVERRIDE { | |
159 SkString vertexMode; | |
160 switch (fVertexMode) { | |
161 case kNone_VertexMode: | |
162 vertexMode.set("meshlines"); | |
163 break; | |
164 case kColors_VertexMode: | |
165 vertexMode.set("colors"); | |
166 break; | |
167 case kTexCoords_VertexMode: | |
168 vertexMode.set("texs"); | |
169 break; | |
170 case kBoth_VertexMode: | |
171 vertexMode.set("colors_texs"); | |
172 break; | |
173 default: | |
174 break; | |
175 } | |
176 | |
177 SkString size; | |
178 switch (fSize) { | |
179 case kSmall_Size: | |
180 size.set("small"); | |
181 break; | |
182 case kMedium_Size: | |
183 size.set("medium"); | |
184 break; | |
185 case kBig_Size: | |
186 size.set("big"); | |
187 break; | |
188 default: | |
189 break; | |
190 } | |
191 fName.printf("patch_grid_%s_%s", vertexMode.c_str(), size.c_str()); | |
192 return fName.c_str(); | |
193 } | |
194 | |
195 virtual void onPreDraw() { | |
196 this->setGrid(); | |
197 switch (fVertexMode) { | |
198 case kTexCoords_VertexMode: | |
199 case kBoth_VertexMode: | |
200 fPaint.setShader(createShader())->unref(); | |
201 break; | |
202 default: | |
203 fPaint.setShader(NULL); | |
204 break; | |
205 } | |
206 this->setupPaint(&fPaint); | |
207 } | |
208 | |
209 virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE { | |
210 this->setScale(canvas); | |
211 for (int i = 0; i < loops; i++) { | |
212 fGrid.draw(canvas, fPaint); | |
213 } | |
214 } | |
215 | |
216 SkPaint fPaint; | |
217 SkString fName; | |
218 SkPatchGrid fGrid; | |
219 VertexMode fVertexMode; | |
220 Size fSize; | |
221 | |
222 typedef Benchmark INHERITED; | |
223 }; | |
224 | |
225 | |
226 /////////////////////////////////////////////////////////////////////////////// | |
227 | |
228 DEF_BENCH( return new PatchGridBench(PatchGridBench::kSmall_Size, | |
229 PatchGridBench::kNone_VertexMode); ) | |
230 DEF_BENCH( return new PatchGridBench(PatchGridBench::kSmall_Size, | |
231 PatchGridBench::kColors_VertexMode); ) | |
232 DEF_BENCH( return new PatchGridBench(PatchGridBench::kSmall_Size, | |
233 PatchGridBench::kTexCoords_VertexMode); ) | |
234 DEF_BENCH( return new PatchGridBench(PatchGridBench::kSmall_Size, | |
235 PatchGridBench::kBoth_VertexMode); ) | |
236 DEF_BENCH( return new PatchGridBench(PatchGridBench::kMedium_Size, | |
237 PatchGridBench::kNone_VertexMode); ) | |
238 DEF_BENCH( return new PatchGridBench(PatchGridBench::kMedium_Size, | |
239 PatchGridBench::kColors_VertexMode); ) | |
240 DEF_BENCH( return new PatchGridBench(PatchGridBench::kMedium_Size, | |
241 PatchGridBench::kTexCoords_VertexMode); ) | |
242 DEF_BENCH( return new PatchGridBench(PatchGridBench::kMedium_Size, | |
243 PatchGridBench::kBoth_VertexMode); ) | |
244 DEF_BENCH( return new PatchGridBench(PatchGridBench::kBig_Size, | |
245 PatchGridBench::kNone_VertexMode); ) | |
246 DEF_BENCH( return new PatchGridBench(PatchGridBench::kBig_Size, | |
247 PatchGridBench::kColors_VertexMode); ) | |
248 DEF_BENCH( return new PatchGridBench(PatchGridBench::kBig_Size, | |
249 PatchGridBench::kTexCoords_VertexMode); ) | |
250 DEF_BENCH( return new PatchGridBench(PatchGridBench::kBig_Size, | |
251 PatchGridBench::kBoth_VertexMode); ) | |
OLD | NEW |