Move SSD review shrink fallback to typed Kotlin

ober

12ba08cf025c73d4b6417197e30ad140fc2f9e9b

diff --git a/templates/ssd-review.ss b/templates/ssd-review.ss
index a028221..47f1bba 100644
--- a/templates/ssd-review.ss
+++ b/templates/ssd-review.ss
@@ -7975,7 +7975,8 @@
     (typed-kotlin-file "com/sfb/ssdreview/SsdDetector.kt"
       (kotlin-imports (android graphics Bitmap))
       (typed-library (com sfb ssdreview)
-        (export detectCells shrinkRectToInk shrinkRectToBoxFill)
+        (export detectCells shrinkRectToInk shrinkRectToBoxFill
+                shrinkRectToBitmapContentOrOriginal)
         (type Bitmap)
         (type Int32)
         (type IntArray)
@@ -8096,7 +8097,19 @@
           (shrinkRectByMaskKind bitmap rect (int32 0)))
         (def (shrinkRectToBoxFill (bitmap : Bitmap)
                                   (rect : FloatArray)) : (Nullable FloatArray)
-          (shrinkRectByMaskKind bitmap rect (int32 1)))))
+          (shrinkRectByMaskKind bitmap rect (int32 1)))
+        (def (shrinkRectToBitmapContentOrOriginal
+               (bitmap : (Nullable Bitmap))
+               (rect : FloatArray)) : FloatArray
+          (if (nullable-null? bitmap)
+            rect
+            (let ((box (shrinkRectToBoxFill (nullable-get bitmap) rect)))
+              (if (nullable-null? box)
+                (let ((ink (shrinkRectToInk (nullable-get bitmap) rect)))
+                  (if (nullable-null? ink)
+                    rect
+                    (nullable-get ink)))
+                (nullable-get box)))))))
     (kotlin-file-lines "com/sfb/ssdreview/SsdVisionBridge.kt"
       (
        "package com.sfb.ssdreview"
@@ -8429,10 +8442,7 @@
 	       "        } else if (selectionHasMatches(matching.size)) {"
 	       "            bboxForCells(matching)"
        "        } else {"
-       "            bitmap?.let {"
-       "                shrinkRectToBoxFill(it, rect)"
-       "                    ?: shrinkRectToInk(it, rect)"
-       "            } ?: rect"
+       "            shrinkRectToBitmapContentOrOriginal(bitmap, rect)"
        "        }"
 	       "        onStatus?.invoke(selectionResultStatus(snapSelectionToCells, matching.size))"
        "        onAreaSelected?.invoke(snapped, cellIdsForSelection(matching))"