Move SSD review viewport state updates to typed Kotlin

ober

1f87d0acccd5fe47d8b8cd5f05a22356595b9584

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index d4b24f1..7287bc6 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -4646,6 +4646,7 @@
                 reviewViewSetSsdAreaFromSession
                 reviewViewSetSsdAreaFromNullableSession reviewViewShowSession
                 reviewViewClearSessionState reviewViewShowBitmap
+                reviewViewSetViewportState reviewViewSetViewportOffsets
                 mainActivitySelectGroupId mainActivityClearSession
                 mainActivityShowSession mainActivitySetAppendMode
                 mainActivitySetSsdAreaMode mainActivityClearInteractionModes
@@ -4774,6 +4775,15 @@
         (extern (reviewViewBitmapSet (view : SsdReviewView)
                                      (bitmap : (Nullable Bitmap))) : Unit
           (kotlin-member-set bitmap))
+        (extern (reviewViewScaleSet (view : SsdReviewView)
+                                    (scale : Float32)) : Unit
+          (kotlin-member-set scale))
+        (extern (reviewViewOffsetXSet (view : SsdReviewView)
+                                      (offset : Float32)) : Unit
+          (kotlin-member-set offsetX))
+        (extern (reviewViewOffsetYSet (view : SsdReviewView)
+                                      (offset : Float32)) : Unit
+          (kotlin-member-set offsetY))
         (extern (mainActivityCurrentSessionSet
                   (activity : MainActivity)
                   (session : (Nullable SsdSession))) : Unit
@@ -5342,6 +5352,18 @@
         (def (reviewViewShowBitmap (view : SsdReviewView)
                                    (bitmap : Bitmap)) : Unit
           (reviewViewBitmapSet view (nullable-some bitmap)))
+        (def (reviewViewSetViewportState (view : SsdReviewView)
+                                         (viewport : ViewportState)) : Unit
+          (begin
+            (reviewViewScaleSet view (ViewportState-scale viewport))
+            (reviewViewOffsetXSet view (ViewportState-offsetX viewport))
+            (reviewViewOffsetYSet view (ViewportState-offsetY viewport))))
+        (def (reviewViewSetViewportOffsets (view : SsdReviewView)
+                                           (offsetX : Float32)
+                                           (offsetY : Float32)) : Unit
+          (begin
+            (reviewViewOffsetXSet view offsetX)
+            (reviewViewOffsetYSet view offsetY)))
         (def (mainActivitySelectGroupId (activity : MainActivity)
                                         (view : SsdReviewView)
                                         (id : (Nullable String))) : Unit
@@ -8744,9 +8766,9 @@
 	       "    }"
 	       "    private val density = context.resources.displayMetrics.density"
 	       "    private val selectionOffsetY = 70f * density"
-	       "    private var scale = 1f"
-       "    private var offsetX = 0f"
-       "    private var offsetY = 0f"
+	       "    internal var scale = 1f"
+       "    internal var offsetX = 0f"
+       "    internal var offsetY = 0f"
        "    private var rotationDegrees = 0"
        "    private var lastX = 0f"
        "    private var lastY = 0f"
@@ -8855,9 +8877,7 @@
        "        val fitViewport = fitImageViewportState(bitmap, width, height, rotationDegrees)"
        "        if (!viewportStatePresent(fitViewport)) return"
        "        val savedViewport = viewportStateOrEmpty(fitViewport)"
-       "        scale = savedViewport.scale"
-       "        offsetX = savedViewport.offsetX"
-	       "        offsetY = savedViewport.offsetY"
+       "        reviewViewSetViewportState(this, savedViewport)"
 	       "        clampOffsets()"
 	       "        updateMatrix()"
 	       "        invalidate()"
@@ -8876,9 +8896,7 @@
        "        val restoredViewport = restorableViewportState(bitmap, viewport, rotationDegrees)"
        "        if (!viewportStatePresent(restoredViewport)) return"
        "        val savedViewport = viewportStateOrEmpty(restoredViewport)"
-	       "        scale = savedViewport.scale"
-	       "        offsetX = savedViewport.offsetX"
-	       "        offsetY = savedViewport.offsetY"
+	       "        reviewViewSetViewportState(this, savedViewport)"
 	       "        clampOffsets()"
 	       "        updateMatrix()"
 	       "        invalidate()"
@@ -9088,8 +9106,7 @@
 	       "        val clamped = clampedViewportState(bitmap, width, height, rotationDegrees, scale, offsetX, offsetY)"
 	       "        if (!viewportStatePresent(clamped)) return"
 	       "        val viewport = viewportStateOrEmpty(clamped)"
-	       "        offsetX = viewport.offsetX"
-	       "        offsetY = viewport.offsetY"
+	       "        reviewViewSetViewportOffsets(this, viewport.offsetX, viewport.offsetY)"
 	       "    }"
        ""
        "    private fun viewToImage(x: Float, y: Float): FloatArray {"