diff options
-rw-r--r-- | samplecode/SampleAndroidShadows.cpp | 15 | ||||
-rw-r--r-- | tools/viewer/GMSlide.cpp | 4 | ||||
-rw-r--r-- | tools/viewer/GMSlide.h | 2 | ||||
-rw-r--r-- | tools/viewer/SampleSlide.cpp | 6 | ||||
-rw-r--r-- | tools/viewer/SampleSlide.h | 2 | ||||
-rw-r--r-- | tools/viewer/Slide.h | 2 | ||||
-rw-r--r-- | tools/viewer/Viewer.cpp | 50 | ||||
-rw-r--r-- | tools/viewer/Viewer.h | 3 |
8 files changed, 78 insertions, 6 deletions
diff --git a/samplecode/SampleAndroidShadows.cpp b/samplecode/SampleAndroidShadows.cpp index 0e0a4b4a79..803ea49f4a 100644 --- a/samplecode/SampleAndroidShadows.cpp +++ b/samplecode/SampleAndroidShadows.cpp @@ -70,32 +70,43 @@ protected: SkUnichar uni; if (SampleCode::CharQ(*evt, &uni)) { + bool handled = false; switch (uni) { case 'W': fShowAmbient = !fShowAmbient; + handled = true; break; case 'S': fShowSpot = !fShowSpot; + handled = true; break; case 'T': fUseAlt = !fUseAlt; + handled = true; break; case 'O': fShowObject = !fShowObject; + handled = true; break; case '>': fZDelta += 0.5f; + handled = true; break; case '<': fZDelta -= 0.5f; + handled = true; break; case '?': fIgnoreShadowAlpha = !fIgnoreShadowAlpha; + handled = true; break; default: break; } - this->inval(nullptr); + if (handled) { + this->inval(nullptr); + return true; + } } return this->INHERITED::onQuery(evt); } @@ -503,7 +514,7 @@ protected: } private: - typedef SkView INHERITED; + typedef SampleView INHERITED; }; ////////////////////////////////////////////////////////////////////////////// diff --git a/tools/viewer/GMSlide.cpp b/tools/viewer/GMSlide.cpp index 6096044a38..40a9c99d0b 100644 --- a/tools/viewer/GMSlide.cpp +++ b/tools/viewer/GMSlide.cpp @@ -30,3 +30,7 @@ void GMSlide::draw(SkCanvas* canvas) { bool GMSlide::animate(const SkAnimTimer& timer) { return fGM->animate(timer); } + +bool GMSlide::onChar(SkUnichar c) { + return fGM->handleKey(c); +} diff --git a/tools/viewer/GMSlide.h b/tools/viewer/GMSlide.h index 6b03527202..2a3faa943f 100644 --- a/tools/viewer/GMSlide.h +++ b/tools/viewer/GMSlide.h @@ -21,6 +21,8 @@ public: void draw(SkCanvas* canvas) override; bool animate(const SkAnimTimer&) override; + bool onChar(SkUnichar c) override; + private: skiagm::GM* fGM; }; diff --git a/tools/viewer/SampleSlide.cpp b/tools/viewer/SampleSlide.cpp index 5e02ff1da7..00ee53453b 100644 --- a/tools/viewer/SampleSlide.cpp +++ b/tools/viewer/SampleSlide.cpp @@ -36,6 +36,12 @@ void SampleSlide::unload() { fView = nullptr; } +bool SampleSlide::onChar(SkUnichar c) { + SkEvent evt(gCharEvtName); + evt.setFast32(c); + return fView->doQuery(&evt); +} + #if defined(SK_BUILD_FOR_ANDROID) // these are normally defined in SkOSWindow_unix, but we don't // want to include that diff --git a/tools/viewer/SampleSlide.h b/tools/viewer/SampleSlide.h index 3d772d093d..ab45c01c70 100644 --- a/tools/viewer/SampleSlide.h +++ b/tools/viewer/SampleSlide.h @@ -26,6 +26,8 @@ public: return false; } + bool onChar(SkUnichar c) override; + private: const SkViewFactory* fViewFactory; SkView* fView; diff --git a/tools/viewer/Slide.h b/tools/viewer/Slide.h index bc0ffd4016..9ec7a3dbe1 100644 --- a/tools/viewer/Slide.h +++ b/tools/viewer/Slide.h @@ -28,6 +28,8 @@ public: virtual void load(SkScalar winWidth, SkScalar winHeight) {} virtual void unload() {} + virtual bool onChar(SkUnichar c) { return false; } + SkString getName() { return fName; } protected: diff --git a/tools/viewer/Viewer.cpp b/tools/viewer/Viewer.cpp index 1d5e033dc9..fe3b0d9888 100644 --- a/tools/viewer/Viewer.cpp +++ b/tools/viewer/Viewer.cpp @@ -113,6 +113,9 @@ static DEFINE_string2(match, m, nullptr, "If a bench does not match any list entry,\n" "it is skipped unless some list entry starts with ~"); +DEFINE_string(slide, "", "Start on this sample."); +DEFINE_bool(list, false, "List samples?"); + #ifdef SK_VULKAN # define BACKENDS_STR "\"sw\", \"gl\", and \"vk\"" #else @@ -169,6 +172,7 @@ const char* kRefreshStateName = "Refresh"; Viewer::Viewer(int argc, char** argv, void* platformData) : fCurrentMeasurement(0) + , fSetupFirstFrame(false) , fDisplayStats(false) , fRefresh(false) , fShowImGuiDebugWindow(false) @@ -319,13 +323,13 @@ Viewer::Viewer(int argc, char** argv, void* platformData) // set up slides this->initSlides(); + this->setStartupSlide(); + if (FLAGS_list) { + this->listNames(); + } fAnimTimer.run(); - // set up first frame - fCurrentSlide = 0; - setupCurrentSlide(-1); - // ImGui initialization: ImGuiIO& io = ImGui::GetIO(); io.DisplaySize.x = static_cast<float>(fWindow->width()); @@ -469,6 +473,32 @@ void Viewer::updateTitle() { fWindow->setTitle(title.c_str()); } +void Viewer::setStartupSlide() { + + if (!FLAGS_slide.isEmpty()) { + int count = fSlides.count(); + for (int i = 0; i < count; i++) { + if (fSlides[i]->getName().equals(FLAGS_slide[0])) { + fCurrentSlide = i; + return; + } + } + + fprintf(stderr, "Unknown slide \"%s\"\n", FLAGS_slide[0]); + this->listNames(); + } + + fCurrentSlide = 0; +} + +void Viewer::listNames() { + int count = fSlides.count(); + SkDebugf("All Slides:\n"); + for (int i = 0; i < count; i++) { + SkDebugf(" %s\n", fSlides[i]->getName().c_str()); + } +} + void Viewer::setupCurrentSlide(int previousSlide) { if (fCurrentSlide == previousSlide) { return; // no change; do nothing @@ -613,6 +643,13 @@ void Viewer::drawSlide(SkCanvas* canvas) { } void Viewer::onPaint(SkCanvas* canvas) { + // We have to wait until the first draw to make sure the window size is set correctly + if (!fSetupFirstFrame) { + // set up first frame + setupCurrentSlide(-1); + fSetupFirstFrame = true; + } + // Update ImGui input ImGuiIO& io = ImGui::GetIO(); io.DeltaTime = 1.0f / 60.0f; @@ -949,5 +986,10 @@ bool Viewer::onKey(sk_app::Window::Key key, sk_app::Window::InputState state, ui } bool Viewer::onChar(SkUnichar c, uint32_t modifiers) { + if (fSlides[fCurrentSlide]->onChar(c)) { + fWindow->inval(); + return true; + } + return fCommands.onChar(c, modifiers); } diff --git a/tools/viewer/Viewer.h b/tools/viewer/Viewer.h index 74d3f062ca..f4847e5c79 100644 --- a/tools/viewer/Viewer.h +++ b/tools/viewer/Viewer.h @@ -34,7 +34,9 @@ private: void initSlides(); void updateTitle(); void setColorMode(SkColorType, sk_sp<SkColorSpace>); + void setStartupSlide(); void setupCurrentSlide(int previousSlide); + void listNames(); void updateUIState(); @@ -56,6 +58,7 @@ private: SkAnimTimer fAnimTimer; SkTArray<sk_sp<Slide>> fSlides; int fCurrentSlide; + bool fSetupFirstFrame; bool fDisplayStats; bool fRefresh; // whether to continuously refresh for measuring render time |