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