| Index: tools/vulkan/viewer/VulkanViewer.cpp
|
| diff --git a/tools/vulkan/viewer/VulkanViewer.cpp b/tools/vulkan/viewer/VulkanViewer.cpp
|
| index 55da5546f75623edf6893ead23eae2f1e9937177..52b6ad19f53e8e181de3901c51dac7084647ebb8 100644
|
| --- a/tools/vulkan/viewer/VulkanViewer.cpp
|
| +++ b/tools/vulkan/viewer/VulkanViewer.cpp
|
| @@ -27,6 +27,12 @@ static bool on_key_handler(Window::Key key, Window::InputState state, uint32_t m
|
| return vv->onKey(key, state, modifiers);
|
| }
|
|
|
| +static bool on_char_handler(SkUnichar c, uint32_t modifiers, void* userData) {
|
| + VulkanViewer* vv = reinterpret_cast<VulkanViewer*>(userData);
|
| +
|
| + return vv->onChar(c, modifiers);
|
| +}
|
| +
|
| static void on_paint_handler(SkCanvas* canvas, void* userData) {
|
| VulkanViewer* vv = reinterpret_cast<VulkanViewer*>(userData);
|
|
|
| @@ -46,12 +52,10 @@ DEFINE_string2(match, m, nullptr,
|
| "it is skipped unless some list entry starts with ~");
|
| DEFINE_string(skps, "skps", "Directory to read skps from.");
|
|
|
| -
|
| -
|
| -
|
| -
|
| -
|
| -VulkanViewer::VulkanViewer(int argc, char** argv, void* platformData) : fCurrentMeasurement(0) {
|
| +VulkanViewer::VulkanViewer(int argc, char** argv, void* platformData)
|
| + : fCurrentMeasurement(0)
|
| + , fDisplayStats(false)
|
| +{
|
| memset(fMeasurements, 0, sizeof(fMeasurements));
|
|
|
| SkDebugf("Command line arguments: ");
|
| @@ -67,46 +71,18 @@ VulkanViewer::VulkanViewer(int argc, char** argv, void* platformData) : fCurrent
|
|
|
| // register callbacks
|
| fWindow->registerKeyFunc(on_key_handler, this);
|
| + fWindow->registerCharFunc(on_char_handler, this);
|
| fWindow->registerPaintFunc(on_paint_handler, this);
|
|
|
| // set up slides
|
| this->initSlides();
|
|
|
| // set up first frame
|
| - SkString title("VulkanViewer: ");
|
| - title.append(fSlides[0]->getName());
|
| fCurrentSlide = 0;
|
| - fWindow->setTitle(title.c_str());
|
| - fWindow->show();
|
| -}
|
| -
|
| -static sk_sp<SkPicture> read_picture(const char path[]) {
|
| - if (SkCommandLineFlags::ShouldSkip(FLAGS_match, path)) {
|
| - return nullptr;
|
| - }
|
| + setupCurrentSlide(-1);
|
| + fLocalMatrix.reset();
|
|
|
| - SkAutoTDelete<SkStream> stream(SkStream::NewFromFile(path));
|
| - if (stream.get() == nullptr) {
|
| - SkDebugf("Could not read %s.\n", path);
|
| - return nullptr;
|
| - }
|
| -
|
| - auto pic = SkPicture::MakeFromStream(stream.get());
|
| - if (!pic) {
|
| - SkDebugf("Could not read %s as an SkPicture.\n", path);
|
| - }
|
| - return pic;
|
| -}
|
| -
|
| -
|
| -static sk_sp<SKPSlide> loadSKP(const SkString& path) {
|
| - sk_sp<SkPicture> pic = read_picture(path.c_str());
|
| - if (!pic) {
|
| - return nullptr;
|
| - }
|
| -
|
| - SkString name = SkOSPath::Basename(path.c_str());
|
| - return sk_sp<SKPSlide>(new SKPSlide(name.c_str(), pic));
|
| + fWindow->show();
|
| }
|
|
|
| void VulkanViewer::initSlides() {
|
| @@ -132,17 +108,25 @@ void VulkanViewer::initSlides() {
|
| // SKPs
|
| for (int i = 0; i < FLAGS_skps.count(); i++) {
|
| if (SkStrEndsWith(FLAGS_skps[i], ".skp")) {
|
| + if (SkCommandLineFlags::ShouldSkip(FLAGS_match, FLAGS_skps[i])) {
|
| + continue;
|
| + }
|
| +
|
| SkString path(FLAGS_skps[i]);
|
| - sk_sp<SKPSlide> slide = loadSKP(path);
|
| + sk_sp<SKPSlide> slide(new SKPSlide(SkOSPath::Basename(path.c_str()), path));
|
| if (slide) {
|
| fSlides.push_back(slide);
|
| }
|
| } else {
|
| SkOSFile::Iter it(FLAGS_skps[i], ".skp");
|
| - SkString path;
|
| - while (it.next(&path)) {
|
| - SkString skpName = SkOSPath::Join(FLAGS_skps[i], path.c_str());
|
| - sk_sp<SKPSlide> slide = loadSKP(skpName);
|
| + SkString skpName;
|
| + while (it.next(&skpName)) {
|
| + if (SkCommandLineFlags::ShouldSkip(FLAGS_match, skpName.c_str())) {
|
| + continue;
|
| + }
|
| +
|
| + SkString path = SkOSPath::Join(FLAGS_skps[i], skpName.c_str());
|
| + sk_sp<SKPSlide> slide(new SKPSlide(skpName, path));
|
| if (slide) {
|
| fSlides.push_back(slide);
|
| }
|
| @@ -157,39 +141,124 @@ VulkanViewer::~VulkanViewer() {
|
| delete fWindow;
|
| }
|
|
|
| +void VulkanViewer::setupCurrentSlide(int previousSlide) {
|
| + SkString title("VulkanViewer: ");
|
| + title.append(fSlides[fCurrentSlide]->getName());
|
| + fSlides[fCurrentSlide]->load();
|
| + if (previousSlide >= 0) {
|
| + fSlides[previousSlide]->unload();
|
| + }
|
| + fWindow->setTitle(title.c_str());
|
| + fWindow->inval();
|
| +}
|
| +
|
| +#define MAX_ZOOM_LEVEL 8
|
| +#define MIN_ZOOM_LEVEL -8
|
| +
|
| +void VulkanViewer::changeZoomLevel(float delta) {
|
| + fZoomLevel += delta;
|
| + if (fZoomLevel > 0) {
|
| + fZoomLevel = SkMinScalar(fZoomLevel, MAX_ZOOM_LEVEL);
|
| + fZoomScale = fZoomLevel + SK_Scalar1;
|
| + } else if (fZoomLevel < 0) {
|
| + fZoomLevel = SkMaxScalar(fZoomLevel, MIN_ZOOM_LEVEL);
|
| + fZoomScale = SK_Scalar1 / (SK_Scalar1 - fZoomLevel);
|
| + } else {
|
| + fZoomScale = SK_Scalar1;
|
| + }
|
| + this->updateMatrix();
|
| +}
|
| +
|
| +void VulkanViewer::updateMatrix(){
|
| + SkMatrix m;
|
| + m.reset();
|
| +
|
| + if (fZoomLevel) {
|
| + SkPoint center;
|
| + //m = this->getLocalMatrix();//.invert(&m);
|
| + m.mapXY(fZoomCenterX, fZoomCenterY, ¢er);
|
| + SkScalar cx = center.fX;
|
| + SkScalar cy = center.fY;
|
| +
|
| + m.setTranslate(-cx, -cy);
|
| + m.postScale(fZoomScale, fZoomScale);
|
| + m.postTranslate(cx, cy);
|
| + }
|
| +
|
| + // TODO: add gesture support
|
| + // Apply any gesture matrix
|
| + //m.preConcat(fGesture.localM());
|
| + //m.preConcat(fGesture.globalM());
|
| +
|
| + fLocalMatrix = m;
|
| +}
|
| +
|
| bool VulkanViewer::onKey(Window::Key key, Window::InputState state, uint32_t modifiers) {
|
| - if (Window::kDown_InputState == state && (modifiers & Window::kFirstPress_ModifierKey)) {
|
| - if (key == Window::kRight_Key) {
|
| - fCurrentSlide++;
|
| - if (fCurrentSlide >= fSlides.count()) {
|
| - fCurrentSlide = 0;
|
| + if (Window::kDown_InputState == state) {
|
| + switch (key) {
|
| + case Window::kRight_Key: {
|
| + int previousSlide = fCurrentSlide;
|
| + fCurrentSlide++;
|
| + if (fCurrentSlide >= fSlides.count()) {
|
| + fCurrentSlide = 0;
|
| + }
|
| + setupCurrentSlide(previousSlide);
|
| + return true;
|
| + }
|
| +
|
| + case Window::kLeft_Key: {
|
| + int previousSlide = fCurrentSlide;
|
| + fCurrentSlide--;
|
| + if (fCurrentSlide < 0) {
|
| + fCurrentSlide = fSlides.count() - 1;
|
| + }
|
| + SkString title("VulkanViewer: ");
|
| + title.append(fSlides[fCurrentSlide]->getName());
|
| + fWindow->setTitle(title.c_str());
|
| + setupCurrentSlide(previousSlide);
|
| + return true;
|
| + }
|
| +
|
| + case Window::kUp_Key: {
|
| + this->changeZoomLevel(1.f / 32.f);
|
| + return true;
|
| }
|
| - SkString title("VulkanViewer: ");
|
| - title.append(fSlides[fCurrentSlide]->getName());
|
| - fWindow->setTitle(title.c_str());
|
| - } else if (key == Window::kLeft_Key) {
|
| - fCurrentSlide--;
|
| - if (fCurrentSlide < 0) {
|
| - fCurrentSlide = fSlides.count()-1;
|
| +
|
| + case Window::kDown_Key: {
|
| + this->changeZoomLevel(-1.f / 32.f);
|
| + return true;
|
| }
|
| - SkString title("VulkanViewer: ");
|
| - title.append(fSlides[fCurrentSlide]->getName());
|
| - fWindow->setTitle(title.c_str());
|
| +
|
| + default:
|
| + break;
|
| }
|
| }
|
|
|
| - return true;
|
| + return false;
|
| +}
|
| +
|
| +bool VulkanViewer::onChar(SkUnichar c, uint32_t modifiers) {
|
| + if ('s' == c) {
|
| + fDisplayStats = !fDisplayStats;
|
| + return true;
|
| + }
|
| +
|
| + return false;
|
| }
|
|
|
| void VulkanViewer::onPaint(SkCanvas* canvas) {
|
|
|
| canvas->clear(SK_ColorWHITE);
|
|
|
| - canvas->save();
|
| + int count = canvas->save();
|
| + canvas->setMatrix(fLocalMatrix);
|
| +
|
| fSlides[fCurrentSlide]->draw(canvas);
|
| - canvas->restore();
|
| + canvas->restoreToCount(count);
|
|
|
| - drawStats(canvas);
|
| + if (fDisplayStats) {
|
| + drawStats(canvas);
|
| + }
|
| }
|
|
|
| void VulkanViewer::drawStats(SkCanvas* canvas) {
|
| @@ -240,5 +309,8 @@ void VulkanViewer::onIdle(double ms) {
|
| fCurrentMeasurement &= (kMeasurementCount - 1); // fast mod
|
| SkASSERT(fCurrentMeasurement < kMeasurementCount);
|
|
|
| - fWindow->onPaint();
|
| + fAnimTimer.updateTime();
|
| + if (fDisplayStats || fSlides[fCurrentSlide]->animate(fAnimTimer)) {
|
| + fWindow->inval();
|
| + }
|
| }
|
|
|