OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SampleCode.h" | 8 #include "SampleCode.h" |
9 #include "SkPictureRecorder.h" | 9 #include "SkPictureRecorder.h" |
10 #include "SkShadowPaintFilterCanvas.h" | 10 #include "SkShadowPaintFilterCanvas.h" |
(...skipping 20 matching lines...) Expand all Loading... | |
31 fTestRects[0].fGeometry = SkRect::MakeLTRB(200,150,350,300); | 31 fTestRects[0].fGeometry = SkRect::MakeLTRB(200,150,350,300); |
32 | 32 |
33 fTestRects[1].fColor = 0xFF88EE88; | 33 fTestRects[1].fColor = 0xFF88EE88; |
34 fTestRects[1].fDepth = 160; | 34 fTestRects[1].fDepth = 160; |
35 fTestRects[1].fGeometry = SkRect::MakeLTRB(150,200,300,350); | 35 fTestRects[1].fGeometry = SkRect::MakeLTRB(150,200,300,350); |
36 | 36 |
37 fTestRects[2].fColor = 0xFF8888EE; | 37 fTestRects[2].fColor = 0xFF8888EE; |
38 fTestRects[2].fDepth = 240; | 38 fTestRects[2].fDepth = 240; |
39 fTestRects[2].fGeometry = SkRect::MakeLTRB(100,100,250,250); | 39 fTestRects[2].fGeometry = SkRect::MakeLTRB(100,100,250,250); |
40 | 40 |
41 fSliders[0].fGeometry = SkRect::MakeLTRB(20, 400, 30, 420); | |
42 fSliders[0].fOffset = 0.0f; | |
43 fSliders[0].fScale = 0.1f; | |
44 | |
45 fSliders[1].fGeometry = SkRect::MakeLTRB(100, 420, 110, 440); | |
46 fSliders[1].fOffset = 0.0f; | |
47 fSliders[1].fScale = 10.0f; | |
48 | |
49 fSliders[2].fGeometry = SkRect::MakeLTRB(0, 440, 10, 460); | |
50 fSliders[2].fOffset = 0.0f; | |
51 fSliders[2].fScale = 0.0025f; | |
52 | |
41 fSceneChanged = true; | 53 fSceneChanged = true; |
42 fLightsChanged = true; | 54 fLightsChanged = true; |
43 | 55 |
44 fSelectedRect = -1; | 56 fSelectedRect = -1; |
57 fSelectedSlider = -1; | |
45 fMoveLight = false; | 58 fMoveLight = false; |
46 | 59 |
47 fClearShadowMaps = false; | 60 fClearShadowMaps = false; |
61 | |
62 fShadowParams.fShadowRadius = 2.0f; | |
63 fShadowParams.fBiasingConstant = 0.3f; | |
64 fShadowParams.fMinVariance = 1024; | |
65 fShadowParams.fType = SkShadowParams::kVariance_BlurAlgorithm; | |
48 } | 66 } |
49 | 67 |
50 protected: | 68 protected: |
51 bool onQuery(SkEvent *evt) override { | 69 bool onQuery(SkEvent *evt) override { |
52 if (SampleCode::TitleQ(*evt)) { | 70 if (SampleCode::TitleQ(*evt)) { |
53 SampleCode::TitleR(evt, "shadowing"); | 71 SampleCode::TitleR(evt, "shadowing"); |
54 return true; | 72 return true; |
55 } | 73 } |
56 | 74 |
57 SkUnichar uni; | 75 SkUnichar uni; |
58 if (SampleCode::CharQ(*evt, &uni)) { | 76 if (SampleCode::CharQ(*evt, &uni)) { |
59 switch (uni) { | 77 switch (uni) { |
60 case 'L': | 78 case 'L': |
61 fMoveLight = !fMoveLight; | 79 fMoveLight = !fMoveLight; |
62 break; | 80 break; |
63 case 'd': | 81 case 'd': |
64 // Raster generated shadow maps have their origin in the UL corner | 82 // Raster generated shadow maps have their origin in the UL corner |
65 // GPU shadow maps can have an arbitrary origin. | 83 // GPU shadow maps can have an arbitrary origin. |
66 // We override the 'd' keypress so that when the device is c ycled, | 84 // We override the 'd' keypress so that when the device is c ycled, |
67 // the shadow maps will be re-generated according to the new backend. | 85 // the shadow maps will be re-generated according to the new backend. |
68 fClearShadowMaps = true; | 86 fClearShadowMaps = true; |
69 break; | 87 break; |
88 case 'B': | |
robertphillips
2016/08/23 17:19:39
Switch the order of these so the writeable one is
vjiaoblack
2016/08/23 18:01:21
Done.
| |
89 if (fShadowParams.fType == SkShadowParams::kVariance_BlurAlg orithm) { | |
90 fShadowParams.fType = SkShadowParams::kNoBlur_BlurAlgori thm; | |
91 } else if (fShadowParams.fType == | |
92 SkShadowParams::kNoBlur_BlurAlgorithm) { | |
93 fShadowParams.fType = SkShadowParams::kVariance_BlurAlgo rithm; | |
94 } | |
95 fLightsChanged = true; | |
96 break; | |
70 default: | 97 default: |
71 break; | 98 break; |
72 } | 99 } |
73 } | 100 } |
74 return this->INHERITED::onQuery(evt); | 101 return this->INHERITED::onQuery(evt); |
75 } | 102 } |
76 | 103 |
77 sk_sp<SkPicture> makeTestPicture(int width, int height) { | 104 sk_sp<SkPicture> makeTestPicture(int width, int height) { |
78 SkPictureRecorder recorder; | 105 SkPictureRecorder recorder; |
79 | 106 |
(...skipping 26 matching lines...) Expand all Loading... | |
106 | 133 |
107 void onDrawContent(SkCanvas *canvas) override { | 134 void onDrawContent(SkCanvas *canvas) override { |
108 if (fSceneChanged) { | 135 if (fSceneChanged) { |
109 fPicture = this->makeTestPicture(kWidth, kHeight); | 136 fPicture = this->makeTestPicture(kWidth, kHeight); |
110 } | 137 } |
111 | 138 |
112 if (fSceneChanged || fLightsChanged || fClearShadowMaps) { | 139 if (fSceneChanged || fLightsChanged || fClearShadowMaps) { |
113 for (int i = 0; i < fLights->numLights(); i++) { | 140 for (int i = 0; i < fLights->numLights(); i++) { |
114 fLights->light(i).setShadowMap(nullptr); | 141 fLights->light(i).setShadowMap(nullptr); |
115 } | 142 } |
143 | |
116 fSceneChanged = false; | 144 fSceneChanged = false; |
117 fLightsChanged = false; | 145 fLightsChanged = false; |
118 fClearShadowMaps = false; | 146 fClearShadowMaps = false; |
119 } | 147 } |
120 | 148 |
121 canvas->setLights(fLights); | 149 canvas->setLights(fLights); |
122 canvas->drawShadowedPicture(fPicture, nullptr, nullptr); | 150 canvas->drawShadowedPicture(fPicture, nullptr, nullptr, fShadowParams); |
151 | |
152 for (int i = 0; i < kNumSliders; i++) { | |
153 SkPaint paint; | |
154 paint.setColor(SK_ColorBLACK); | |
155 canvas->drawRect(fSliders[i].fGeometry, paint); | |
156 } | |
123 } | 157 } |
124 | 158 |
125 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) ove rride { | 159 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) ove rride { |
126 return new SkView::Click(this); | 160 return new SkView::Click(this); |
127 } | 161 } |
128 | 162 |
129 bool onClick(Click *click) override { | 163 bool onClick(Click *click) override { |
130 SkScalar x = click->fCurr.fX; | 164 SkScalar x = click->fCurr.fX; |
131 SkScalar y = click->fCurr.fY; | 165 SkScalar y = click->fCurr.fY; |
132 | 166 |
(...skipping 21 matching lines...) Expand all Loading... | |
154 fLights = builder.finish(); | 188 fLights = builder.finish(); |
155 | 189 |
156 fLightsChanged = true; | 190 fLightsChanged = true; |
157 this->inval(nullptr); | 191 this->inval(nullptr); |
158 } | 192 } |
159 return true; | 193 return true; |
160 } | 194 } |
161 | 195 |
162 if (click->fState == Click::State::kUp_State) { | 196 if (click->fState == Click::State::kUp_State) { |
163 fSelectedRect = -1; | 197 fSelectedRect = -1; |
198 fSelectedSlider = -1; | |
164 return true; | 199 return true; |
165 } | 200 } |
166 | 201 |
167 if (fSelectedRect > -1) { | 202 if (fSelectedRect > -1) { |
168 fTestRects[fSelectedRect].fGeometry.offset(dx, dy); | 203 fTestRects[fSelectedRect].fGeometry.offset(dx, dy); |
169 | 204 |
170 fSceneChanged = true; | 205 fSceneChanged = true; |
171 this->inval(nullptr); | 206 this->inval(nullptr); |
172 return true; | 207 return true; |
173 } | 208 } |
174 | 209 |
210 if (fSelectedSlider > -1) { | |
211 fSliders[fSelectedSlider].fGeometry.offset(dx, 0); | |
212 | |
213 SkScalar newValue = fSliders[fSelectedSlider].fGeometry.fLeft * | |
214 fSliders[fSelectedSlider].fScale + | |
215 fSliders[fSelectedSlider].fOffset; | |
216 | |
217 switch (fSelectedSlider) { | |
218 case 0: | |
219 fShadowParams.fShadowRadius = newValue; | |
220 break; | |
221 case 1: | |
222 fShadowParams.fMinVariance = newValue; | |
223 break; | |
224 case 2: | |
225 fShadowParams.fBiasingConstant = newValue; | |
226 break; | |
227 default: | |
228 break; | |
229 } | |
230 | |
231 fLightsChanged = true; | |
232 this->inval(nullptr); | |
233 return true; | |
234 } | |
235 | |
175 // assume last elements are highest | 236 // assume last elements are highest |
176 for (int i = kNumTestRects - 1; i >= 0; i--) { | 237 for (int i = kNumTestRects - 1; i >= 0; i--) { |
177 if (fTestRects[i].fGeometry.contains(SkRect::MakeXYWH(x, y, 1, 1))) { | 238 if (fTestRects[i].fGeometry.contains(SkRect::MakeXYWH(x, y, 1, 1))) { |
178 fSelectedRect = i; | 239 fSelectedRect = i; |
179 fTestRects[i].fGeometry.offset(dx, dy); | 240 fTestRects[i].fGeometry.offset(dx, dy); |
180 | 241 |
181 fSceneChanged = true; | 242 fSceneChanged = true; |
182 this->inval(nullptr); | 243 this->inval(nullptr); |
183 break; | 244 break; |
184 } | 245 } |
185 } | 246 } |
186 | 247 |
248 for (int i = 0; i <= kNumSliders; i++) { | |
249 if (fSliders[i].fGeometry.contains(SkRect::MakeXYWH(x, y, 1, 1))) { | |
250 fSelectedSlider = i; | |
robertphillips
2016/08/23 17:19:40
Can we add a subroutine to share this code with th
vjiaoblack
2016/08/23 18:01:21
Done.
| |
251 fSliders[i].fGeometry.offset(dx, dy); | |
252 | |
253 SkScalar newValue = fSliders[fSelectedSlider].fGeometry.fLeft * | |
254 fSliders[fSelectedSlider].fScale + | |
255 fSliders[fSelectedSlider].fOffset; | |
256 | |
257 switch (fSelectedSlider) { | |
258 case 0: | |
259 fShadowParams.fShadowRadius = newValue; | |
260 break; | |
261 case 1: | |
262 fShadowParams.fMinVariance = newValue; | |
263 break; | |
264 case 2: | |
265 fShadowParams.fBiasingConstant = newValue; | |
266 break; | |
267 default: | |
268 break; | |
269 } | |
270 | |
271 fLightsChanged = true; | |
272 | |
273 this->inval(nullptr); | |
274 break; | |
275 } | |
276 } | |
277 | |
187 return true; | 278 return true; |
188 } | 279 } |
189 | 280 |
190 private: | 281 private: |
191 static constexpr int kNumTestRects = 3; | 282 static constexpr int kNumTestRects = 3; |
283 static constexpr int kNumSliders = 3; | |
192 | 284 |
193 static const int kWidth = 400; | 285 static const int kWidth = 400; |
194 static const int kHeight = 400; | 286 static const int kHeight = 400; |
195 bool fClearShadowMaps; | |
196 | 287 |
197 struct { | 288 struct { |
198 SkRect fGeometry; | 289 SkRect fGeometry; |
199 int fDepth; | 290 int fDepth; |
200 SkColor fColor; | 291 SkColor fColor; |
201 } fTestRects[kNumTestRects]; | 292 } fTestRects[kNumTestRects]; |
293 int fSelectedRect; | |
202 | 294 |
203 int fSelectedRect; | 295 struct { |
296 SkRect fGeometry; | |
297 SkScalar fOffset; | |
298 SkScalar fScale; | |
299 } fSliders[kNumSliders]; | |
300 int fSelectedSlider; | |
301 | |
302 bool fClearShadowMaps; | |
204 bool fMoveLight; | 303 bool fMoveLight; |
205 | |
206 sk_sp<SkPicture> fPicture; | |
207 | |
208 bool fSceneChanged; | 304 bool fSceneChanged; |
209 bool fLightsChanged; | 305 bool fLightsChanged; |
210 | 306 |
307 sk_sp<SkPicture> fPicture; | |
308 SkShadowParams fShadowParams; | |
211 sk_sp<SkLights> fLights; | 309 sk_sp<SkLights> fLights; |
212 | 310 |
213 typedef SampleView INHERITED; | 311 typedef SampleView INHERITED; |
214 }; | 312 }; |
215 | 313 |
216 ////////////////////////////////////////////////////////////////////////////// | 314 ////////////////////////////////////////////////////////////////////////////// |
217 static SkView* MyFactory() { return new ShadowingView; } | 315 static SkView* MyFactory() { return new ShadowingView; } |
218 static SkViewRegister reg(MyFactory); | 316 static SkViewRegister reg(MyFactory); |
219 | 317 |
220 #endif | 318 #endif |
OLD | NEW |