VulkanViewer on Android
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1903253003

Review URL: https://codereview.chromium.org/1903253003
diff --git a/tools/vulkan/viewer/GMSlide.h b/tools/vulkan/viewer/GMSlide.h
index c9ed084..6b03527 100644
--- a/tools/vulkan/viewer/GMSlide.h
+++ b/tools/vulkan/viewer/GMSlide.h
@@ -16,6 +16,8 @@
     GMSlide(skiagm::GM* gm);
     ~GMSlide() override;
 
+    SkISize getDimensions() const override { return fGM->getISize(); }
+
     void draw(SkCanvas* canvas) override;
     bool animate(const SkAnimTimer&) override;
 
diff --git a/tools/vulkan/viewer/SKPSlide.h b/tools/vulkan/viewer/SKPSlide.h
index 73fd5a1..42845fa 100644
--- a/tools/vulkan/viewer/SKPSlide.h
+++ b/tools/vulkan/viewer/SKPSlide.h
@@ -16,6 +16,8 @@
     SKPSlide(const SkString& name, const SkString& path);
     ~SKPSlide() override;
 
+    SkISize getDimensions() const override { return fCullRect.size(); }
+
     void draw(SkCanvas* canvas) override;
     void load() override;
     void unload() override;
diff --git a/tools/vulkan/viewer/Slide.h b/tools/vulkan/viewer/Slide.h
index f75e3fd..cdc225b 100644
--- a/tools/vulkan/viewer/Slide.h
+++ b/tools/vulkan/viewer/Slide.h
@@ -9,6 +9,7 @@
 #define Slide_DEFINED
 
 #include "SkRefCnt.h"
+#include "SkSize.h"
 #include "SkString.h"
 
 class SkCanvas;
@@ -18,6 +19,8 @@
 public:
     virtual ~Slide() {}
 
+    virtual SkISize getDimensions() const = 0;
+
     virtual void draw(SkCanvas* canvas) = 0;
     virtual bool animate(const SkAnimTimer&) { return false;  }
     virtual void load() {}
diff --git a/tools/vulkan/viewer/VulkanViewer.cpp b/tools/vulkan/viewer/VulkanViewer.cpp
index a88a337..faa3014 100644
--- a/tools/vulkan/viewer/VulkanViewer.cpp
+++ b/tools/vulkan/viewer/VulkanViewer.cpp
@@ -81,10 +81,12 @@
     // set up slides
     this->initSlides();
 
+    fAnimTimer.run();
+
     // set up first frame
     fCurrentSlide = 0;
     setupCurrentSlide(-1);
-    fLocalMatrix.reset();
+    updateMatrix();
 
     fWindow->show();
 }
@@ -254,10 +256,24 @@
 
 void VulkanViewer::onPaint(SkCanvas* canvas) {
 
-    canvas->clear(SK_ColorWHITE);
-
     int count = canvas->save();
-    canvas->setMatrix(fLocalMatrix);
+
+    if (fWindow->supportsContentRect()) {
+        SkRect contentRect = fWindow->getContentRect();
+        canvas->clipRect(contentRect);
+        canvas->translate(contentRect.fLeft, contentRect.fTop);
+    }
+
+    canvas->clear(SK_ColorWHITE);
+    if (fWindow->supportsContentRect() && fWindow->scaleContentToFit()) {
+        const SkRect contentRect = fWindow->getContentRect();
+        const SkISize slideSize = fSlides[fCurrentSlide]->getDimensions();
+        const SkRect slideBounds = SkRect::MakeIWH(slideSize.width(), slideSize.height());
+        SkMatrix matrix;
+        matrix.setRectToRect(slideBounds, contentRect, SkMatrix::kCenter_ScaleToFit);
+        canvas->concat(matrix);
+    }
+    canvas->concat(fLocalMatrix);
 
     fSlides[fCurrentSlide]->draw(canvas);
     canvas->restoreToCount(count);
@@ -282,6 +298,12 @@
     SkPaint paint;
     canvas->save();
 
+    if (fWindow->supportsContentRect()) {
+        SkRect contentRect = fWindow->getContentRect();
+        canvas->clipRect(contentRect);
+        canvas->translate(contentRect.fLeft, contentRect.fTop);
+    }
+
     canvas->clipRect(rect);
     paint.setColor(SK_ColorBLACK);
     canvas->drawRect(rect, paint);