Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(130)

Side by Side Diff: tools/viewer/Viewer.cpp

Issue 1955293002: Add flexible keybinding/command system to sk_app (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Rebase Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « tools/viewer/Viewer.h ('k') | tools/viewer/sk_app/CommandSet.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "Viewer.h" 8 #include "Viewer.h"
9 9
10 #include "GMSlide.h" 10 #include "GMSlide.h"
11 #include "SKPSlide.h" 11 #include "SKPSlide.h"
12 12
13 #include "SkCanvas.h" 13 #include "SkCanvas.h"
14 #include "SkCommonFlags.h" 14 #include "SkCommonFlags.h"
15 #include "SkOSFile.h" 15 #include "SkOSFile.h"
16 #include "SkRandom.h" 16 #include "SkRandom.h"
17 #include "SkStream.h" 17 #include "SkStream.h"
18 18
19 using namespace sk_app; 19 using namespace sk_app;
20 20
21 Application* Application::Create(int argc, char** argv, void* platformData) { 21 Application* Application::Create(int argc, char** argv, void* platformData) {
22 return new Viewer(argc, argv, platformData); 22 return new Viewer(argc, argv, platformData);
23 } 23 }
24 24
25 static bool on_key_handler(Window::Key key, Window::InputState state, uint32_t m odifiers,
26 void* userData) {
27 Viewer* vv = reinterpret_cast<Viewer*>(userData);
28
29 return vv->onKey(key, state, modifiers);
30 }
31
32 static bool on_char_handler(SkUnichar c, uint32_t modifiers, void* userData) {
33 Viewer* vv = reinterpret_cast<Viewer*>(userData);
34
35 return vv->onChar(c, modifiers);
36 }
37
38 static void on_paint_handler(SkCanvas* canvas, void* userData) { 25 static void on_paint_handler(SkCanvas* canvas, void* userData) {
39 Viewer* vv = reinterpret_cast<Viewer*>(userData); 26 Viewer* vv = reinterpret_cast<Viewer*>(userData);
40 27
41 return vv->onPaint(canvas); 28 return vv->onPaint(canvas);
42 } 29 }
43 30
44 DEFINE_bool2(fullscreen, f, true, "Run fullscreen."); 31 DEFINE_bool2(fullscreen, f, true, "Run fullscreen.");
45 DEFINE_string(key, "", "Space-separated key/value pairs to add to JSON identifyi ng this builder."); 32 DEFINE_string(key, "", "Space-separated key/value pairs to add to JSON identifyi ng this builder.");
46 DEFINE_string2(match, m, nullptr, 33 DEFINE_string2(match, m, nullptr,
47 "[~][^]substring[$] [...] of bench name to run.\n" 34 "[~][^]substring[$] [...] of bench name to run.\n"
(...skipping 21 matching lines...) Expand all
69 SkDebugf("%s ", argv[i]); 56 SkDebugf("%s ", argv[i]);
70 } 57 }
71 SkDebugf("\n"); 58 SkDebugf("\n");
72 59
73 SkCommandLineFlags::Parse(argc, argv); 60 SkCommandLineFlags::Parse(argc, argv);
74 61
75 fWindow = Window::CreateNativeWindow(platformData); 62 fWindow = Window::CreateNativeWindow(platformData);
76 fWindow->attach(Window::kVulkan_BackendType, DisplayParams()); 63 fWindow->attach(Window::kVulkan_BackendType, DisplayParams());
77 64
78 // register callbacks 65 // register callbacks
79 fWindow->registerKeyFunc(on_key_handler, this); 66 fCommands.attach(fWindow);
80 fWindow->registerCharFunc(on_char_handler, this);
81 fWindow->registerPaintFunc(on_paint_handler, this); 67 fWindow->registerPaintFunc(on_paint_handler, this);
82 68
69 // add key-bindings
70 fCommands.addCommand('s', "Overlays", "Toggle stats display", [this]() {
71 this->fDisplayStats = !this->fDisplayStats;
72 fWindow->inval();
73 });
74 fCommands.addCommand('c', "Modes", "Toggle sRGB color mode", [this]() {
75 DisplayParams params = fWindow->getDisplayParams();
76 params.fProfileType = (kLinear_SkColorProfileType == params.fProfileType )
77 ? kSRGB_SkColorProfileType : kLinear_SkColorProfileType;
78 fWindow->setDisplayParams(params);
79 this->updateTitle();
80 fWindow->inval();
81 });
82 fCommands.addCommand(Window::Key::kRight, "Right", "Navigation", "Next slide ", [this]() {
83 int previousSlide = fCurrentSlide;
84 fCurrentSlide++;
85 if (fCurrentSlide >= fSlides.count()) {
86 fCurrentSlide = 0;
87 }
88 this->setupCurrentSlide(previousSlide);
89 });
90 fCommands.addCommand(Window::Key::kLeft, "Left", "Navigation", "Previous sli de", [this]() {
91 int previousSlide = fCurrentSlide;
92 fCurrentSlide--;
93 if (fCurrentSlide < 0) {
94 fCurrentSlide = fSlides.count() - 1;
95 }
96 this->setupCurrentSlide(previousSlide);
97 });
98 fCommands.addCommand(Window::Key::kUp, "Up", "Transform", "Zoom in", [this]( ) {
99 this->changeZoomLevel(1.f / 32.f);
100 fWindow->inval();
101 });
102 fCommands.addCommand(Window::Key::kDown, "Down", "Transform", "Zoom out", [t his]() {
103 this->changeZoomLevel(-1.f / 32.f);
104 fWindow->inval();
105 });
106
83 // set up slides 107 // set up slides
84 this->initSlides(); 108 this->initSlides();
85 109
86 fAnimTimer.run(); 110 fAnimTimer.run();
87 111
88 // set up first frame 112 // set up first frame
89 fCurrentSlide = 0; 113 fCurrentSlide = 0;
90 setupCurrentSlide(-1); 114 setupCurrentSlide(-1);
91 updateMatrix(); 115 updateMatrix();
92 116
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 } 225 }
202 226
203 // TODO: add gesture support 227 // TODO: add gesture support
204 // Apply any gesture matrix 228 // Apply any gesture matrix
205 //m.preConcat(fGesture.localM()); 229 //m.preConcat(fGesture.localM());
206 //m.preConcat(fGesture.globalM()); 230 //m.preConcat(fGesture.globalM());
207 231
208 fLocalMatrix = m; 232 fLocalMatrix = m;
209 } 233 }
210 234
211 bool Viewer::onKey(Window::Key key, Window::InputState state, uint32_t modifiers ) {
212 if (Window::kDown_InputState == state) {
213 switch (key) {
214 case Window::kRight_Key: {
215 int previousSlide = fCurrentSlide;
216 fCurrentSlide++;
217 if (fCurrentSlide >= fSlides.count()) {
218 fCurrentSlide = 0;
219 }
220 setupCurrentSlide(previousSlide);
221 return true;
222 }
223
224 case Window::kLeft_Key: {
225 int previousSlide = fCurrentSlide;
226 fCurrentSlide--;
227 if (fCurrentSlide < 0) {
228 fCurrentSlide = fSlides.count() - 1;
229 }
230 setupCurrentSlide(previousSlide);
231 return true;
232 }
233
234 case Window::kUp_Key: {
235 this->changeZoomLevel(1.f / 32.f);
236 fWindow->inval();
237 return true;
238 }
239
240 case Window::kDown_Key: {
241 this->changeZoomLevel(-1.f / 32.f);
242 fWindow->inval();
243 return true;
244 }
245
246 default:
247 break;
248 }
249 }
250
251 return false;
252 }
253
254 bool Viewer::onChar(SkUnichar c, uint32_t modifiers) {
255 switch (c) {
256 case 's':
257 fDisplayStats = !fDisplayStats;
258 return true;
259 case 'c':
260 DisplayParams params = fWindow->getDisplayParams();
261 params.fProfileType = (kLinear_SkColorProfileType == params.fProfile Type)
262 ? kSRGB_SkColorProfileType : kLinear_SkColorProfileType;
263 fWindow->setDisplayParams(params);
264 this->updateTitle();
265 fWindow->inval();
266 return true;
267 }
268
269 return false;
270 }
271
272 void Viewer::onPaint(SkCanvas* canvas) { 235 void Viewer::onPaint(SkCanvas* canvas) {
273 236
274 int count = canvas->save(); 237 int count = canvas->save();
275 238
276 if (fWindow->supportsContentRect()) { 239 if (fWindow->supportsContentRect()) {
277 SkRect contentRect = fWindow->getContentRect(); 240 SkRect contentRect = fWindow->getContentRect();
278 canvas->clipRect(contentRect); 241 canvas->clipRect(contentRect);
279 canvas->translate(contentRect.fLeft, contentRect.fTop); 242 canvas->translate(contentRect.fLeft, contentRect.fTop);
280 } 243 }
281 244
282 canvas->clear(SK_ColorWHITE); 245 canvas->clear(SK_ColorWHITE);
283 if (fWindow->supportsContentRect() && fWindow->scaleContentToFit()) { 246 if (fWindow->supportsContentRect() && fWindow->scaleContentToFit()) {
284 const SkRect contentRect = fWindow->getContentRect(); 247 const SkRect contentRect = fWindow->getContentRect();
285 const SkISize slideSize = fSlides[fCurrentSlide]->getDimensions(); 248 const SkISize slideSize = fSlides[fCurrentSlide]->getDimensions();
286 const SkRect slideBounds = SkRect::MakeIWH(slideSize.width(), slideSize. height()); 249 const SkRect slideBounds = SkRect::MakeIWH(slideSize.width(), slideSize. height());
287 SkMatrix matrix; 250 SkMatrix matrix;
288 matrix.setRectToRect(slideBounds, contentRect, SkMatrix::kCenter_ScaleTo Fit); 251 matrix.setRectToRect(slideBounds, contentRect, SkMatrix::kCenter_ScaleTo Fit);
289 canvas->concat(matrix); 252 canvas->concat(matrix);
290 } 253 }
291 canvas->concat(fLocalMatrix); 254 canvas->concat(fLocalMatrix);
292 255
293 fSlides[fCurrentSlide]->draw(canvas); 256 fSlides[fCurrentSlide]->draw(canvas);
294 canvas->restoreToCount(count); 257 canvas->restoreToCount(count);
295 258
296 if (fDisplayStats) { 259 if (fDisplayStats) {
297 drawStats(canvas); 260 drawStats(canvas);
298 } 261 }
262 fCommands.drawHelp(canvas);
299 } 263 }
300 264
301 void Viewer::drawStats(SkCanvas* canvas) { 265 void Viewer::drawStats(SkCanvas* canvas) {
302 static const float kPixelPerMS = 2.0f; 266 static const float kPixelPerMS = 2.0f;
303 static const int kDisplayWidth = 130; 267 static const int kDisplayWidth = 130;
304 static const int kDisplayHeight = 100; 268 static const int kDisplayHeight = 100;
305 static const int kDisplayPadding = 10; 269 static const int kDisplayPadding = 10;
306 static const int kGraphPadding = 3; 270 static const int kGraphPadding = 3;
307 static const SkScalar kBaseMS = 1000.f / 60.f; // ms/frame to hit 60 fps 271 static const SkScalar kBaseMS = 1000.f / 60.f; // ms/frame to hit 60 fps
308 272
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 // Record measurements 314 // Record measurements
351 fMeasurements[fCurrentMeasurement++] = ms; 315 fMeasurements[fCurrentMeasurement++] = ms;
352 fCurrentMeasurement &= (kMeasurementCount - 1); // fast mod 316 fCurrentMeasurement &= (kMeasurementCount - 1); // fast mod
353 SkASSERT(fCurrentMeasurement < kMeasurementCount); 317 SkASSERT(fCurrentMeasurement < kMeasurementCount);
354 318
355 fAnimTimer.updateTime(); 319 fAnimTimer.updateTime();
356 if (fSlides[fCurrentSlide]->animate(fAnimTimer) || fDisplayStats) { 320 if (fSlides[fCurrentSlide]->animate(fAnimTimer) || fDisplayStats) {
357 fWindow->inval(); 321 fWindow->inval();
358 } 322 }
359 } 323 }
OLDNEW
« no previous file with comments | « tools/viewer/Viewer.h ('k') | tools/viewer/sk_app/CommandSet.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698