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.fShadowType = 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': |
| 89 if (fShadowParams.fShadowType == SkShadowParams::kVariance_B
lurAlgorithm) { |
| 90 fShadowParams.fShadowType = SkShadowParams::kNoBlur_Blur
Algorithm; |
| 91 } else if (fShadowParams.fShadowType == |
| 92 SkShadowParams::kNoBlur_BlurAlgorithm) { |
| 93 fShadowParams.fShadowType = SkShadowParams::kVariance_Bl
urAlgorithm; |
| 94 } |
| 95 fLightsChanged = true; |
70 default: | 96 default: |
71 break; | 97 break; |
72 } | 98 } |
73 } | 99 } |
74 return this->INHERITED::onQuery(evt); | 100 return this->INHERITED::onQuery(evt); |
75 } | 101 } |
76 | 102 |
77 sk_sp<SkPicture> makeTestPicture(int width, int height) { | 103 sk_sp<SkPicture> makeTestPicture(int width, int height) { |
78 SkPictureRecorder recorder; | 104 SkPictureRecorder recorder; |
79 | 105 |
(...skipping 26 matching lines...) Expand all Loading... |
106 | 132 |
107 void onDrawContent(SkCanvas *canvas) override { | 133 void onDrawContent(SkCanvas *canvas) override { |
108 if (fSceneChanged) { | 134 if (fSceneChanged) { |
109 fPicture = this->makeTestPicture(kWidth, kHeight); | 135 fPicture = this->makeTestPicture(kWidth, kHeight); |
110 } | 136 } |
111 | 137 |
112 if (fSceneChanged || fLightsChanged || fClearShadowMaps) { | 138 if (fSceneChanged || fLightsChanged || fClearShadowMaps) { |
113 for (int i = 0; i < fLights->numLights(); i++) { | 139 for (int i = 0; i < fLights->numLights(); i++) { |
114 fLights->light(i).setShadowMap(nullptr); | 140 fLights->light(i).setShadowMap(nullptr); |
115 } | 141 } |
| 142 |
116 fSceneChanged = false; | 143 fSceneChanged = false; |
117 fLightsChanged = false; | 144 fLightsChanged = false; |
118 fClearShadowMaps = false; | 145 fClearShadowMaps = false; |
| 146 } |
119 | 147 |
120 canvas->setLights(fLights); | 148 canvas->setLights(fLights); |
121 canvas->drawShadowedPicture(fPicture, nullptr, nullptr); | 149 canvas->drawShadowedPicture(fPicture, nullptr, nullptr, fShadowParams); |
| 150 |
| 151 for (int i = 0; i < kNumSliders; i++) { |
| 152 SkPaint paint; |
| 153 paint.setColor(SK_ColorBLACK); |
| 154 canvas->drawRect(fSliders[i].fGeometry, paint); |
122 } | 155 } |
123 } | 156 } |
124 | 157 |
125 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) ove
rride { | 158 SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) ove
rride { |
126 return new SkView::Click(this); | 159 return new SkView::Click(this); |
127 } | 160 } |
128 | 161 |
129 bool onClick(Click *click) override { | 162 bool onClick(Click *click) override { |
130 SkScalar x = click->fCurr.fX; | 163 SkScalar x = click->fCurr.fX; |
131 SkScalar y = click->fCurr.fY; | 164 SkScalar y = click->fCurr.fY; |
(...skipping 19 matching lines...) Expand all Loading... |
151 fLights = builder.finish(); | 184 fLights = builder.finish(); |
152 | 185 |
153 fLightsChanged = true; | 186 fLightsChanged = true; |
154 this->inval(nullptr); | 187 this->inval(nullptr); |
155 } | 188 } |
156 return true; | 189 return true; |
157 } | 190 } |
158 | 191 |
159 if (click->fState == Click::State::kUp_State) { | 192 if (click->fState == Click::State::kUp_State) { |
160 fSelectedRect = -1; | 193 fSelectedRect = -1; |
| 194 fSelectedSlider = -1; |
161 return true; | 195 return true; |
162 } | 196 } |
163 | 197 |
164 if (fSelectedRect > -1) { | 198 if (fSelectedRect > -1) { |
165 fTestRects[fSelectedRect].fGeometry.offset(dx, dy); | 199 fTestRects[fSelectedRect].fGeometry.offset(dx, dy); |
166 | 200 |
167 fSceneChanged = true; | 201 fSceneChanged = true; |
168 this->inval(nullptr); | 202 this->inval(nullptr); |
169 return true; | 203 return true; |
170 } | 204 } |
171 | 205 |
| 206 if (fSelectedSlider > -1) { |
| 207 fSliders[fSelectedSlider].fGeometry.offset(dx, 0); |
| 208 |
| 209 SkScalar newValue = fSliders[fSelectedSlider].fGeometry.fLeft * |
| 210 fSliders[fSelectedSlider].fScale + |
| 211 fSliders[fSelectedSlider].fOffset; |
| 212 |
| 213 switch (fSelectedSlider) { |
| 214 case 0: |
| 215 fShadowParams.fShadowRadius = newValue; |
| 216 break; |
| 217 case 1: |
| 218 fShadowParams.fMinVariance = newValue; |
| 219 break; |
| 220 case 2: |
| 221 fShadowParams.fBiasingConstant = newValue; |
| 222 break; |
| 223 default: |
| 224 break; |
| 225 } |
| 226 |
| 227 fLightsChanged = true; |
| 228 this->inval(nullptr); |
| 229 return true; |
| 230 } |
| 231 |
172 // assume last elements are highest | 232 // assume last elements are highest |
173 for (int i = kNumTestRects - 1; i >= 0; i--) { | 233 for (int i = kNumTestRects - 1; i >= 0; i--) { |
174 if (fTestRects[i].fGeometry.contains(SkRect::MakeXYWH(x, y, 1, 1)))
{ | 234 if (fTestRects[i].fGeometry.contains(SkRect::MakeXYWH(x, y, 1, 1)))
{ |
175 fSelectedRect = i; | 235 fSelectedRect = i; |
176 fTestRects[i].fGeometry.offset(dx, dy); | 236 fTestRects[i].fGeometry.offset(dx, dy); |
177 | 237 |
178 fSceneChanged = true; | 238 fSceneChanged = true; |
179 this->inval(nullptr); | 239 this->inval(nullptr); |
180 break; | 240 break; |
181 } | 241 } |
182 } | 242 } |
183 | 243 |
| 244 for (int i = 0; i <= kNumSliders; i++) { |
| 245 if (fSliders[i].fGeometry.contains(SkRect::MakeXYWH(x, y, 1, 1))) { |
| 246 fSelectedSlider = i; |
| 247 fSliders[i].fGeometry.offset(dx, dy); |
| 248 |
| 249 SkScalar newValue = fSliders[fSelectedSlider].fGeometry.fLeft * |
| 250 fSliders[fSelectedSlider].fScale + |
| 251 fSliders[fSelectedSlider].fOffset; |
| 252 |
| 253 switch (fSelectedSlider) { |
| 254 case 0: |
| 255 fShadowParams.fShadowRadius = newValue; |
| 256 break; |
| 257 case 1: |
| 258 fShadowParams.fMinVariance = newValue; |
| 259 break; |
| 260 case 2: |
| 261 fShadowParams.fBiasingConstant = newValue; |
| 262 break; |
| 263 default: |
| 264 break; |
| 265 } |
| 266 |
| 267 fLightsChanged = true; |
| 268 |
| 269 this->inval(nullptr); |
| 270 break; |
| 271 } |
| 272 } |
| 273 |
184 return true; | 274 return true; |
185 } | 275 } |
186 | 276 |
187 private: | 277 private: |
188 static constexpr int kNumTestRects = 3; | 278 static constexpr int kNumTestRects = 3; |
| 279 static constexpr int kNumSliders = 3; |
189 | 280 |
190 static const int kWidth = 400; | 281 static const int kWidth = 400; |
191 static const int kHeight = 400; | 282 static const int kHeight = 400; |
192 bool fClearShadowMaps; | |
193 | 283 |
194 struct { | 284 struct { |
195 SkRect fGeometry; | 285 SkRect fGeometry; |
196 int fDepth; | 286 int fDepth; |
197 SkColor fColor; | 287 SkColor fColor; |
198 } fTestRects[kNumTestRects]; | 288 } fTestRects[kNumTestRects]; |
| 289 int fSelectedRect; |
199 | 290 |
200 int fSelectedRect; | 291 struct { |
| 292 SkRect fGeometry; |
| 293 SkScalar fOffset; |
| 294 SkScalar fScale; |
| 295 } fSliders[kNumSliders]; |
| 296 int fSelectedSlider; |
| 297 |
| 298 bool fClearShadowMaps; |
201 bool fMoveLight; | 299 bool fMoveLight; |
202 | |
203 sk_sp<SkPicture> fPicture; | |
204 | |
205 bool fSceneChanged; | 300 bool fSceneChanged; |
206 bool fLightsChanged; | 301 bool fLightsChanged; |
207 | 302 |
| 303 sk_sp<SkPicture> fPicture; |
| 304 SkShadowParams fShadowParams; |
208 sk_sp<SkLights> fLights; | 305 sk_sp<SkLights> fLights; |
209 | 306 |
210 typedef SampleView INHERITED; | 307 typedef SampleView INHERITED; |
211 }; | 308 }; |
212 | 309 |
213 ////////////////////////////////////////////////////////////////////////////// | 310 ////////////////////////////////////////////////////////////////////////////// |
214 static SkView* MyFactory() { return new ShadowingView; } | 311 static SkView* MyFactory() { return new ShadowingView; } |
215 static SkViewRegister reg(MyFactory); | 312 static SkViewRegister reg(MyFactory); |
216 | 313 |
217 #endif | 314 #endif |
OLD | NEW |