From 0036a334bc37b3e4bd8034c53f7de2dedfd0dcda Mon Sep 17 00:00:00 2001
From: Cameron Taylor <cameron.taylor.ninja@gmail.com>
Date: Fri, 16 Feb 2024 04:48:54 -0500
Subject: [PATCH] display fancy preview as a sprite on top of FlxG.stage, to
 properly render over substates

---
 .../funkin/util/plugins/ScreenshotPlugin.hx   | 41 +++++++++----------
 1 file changed, 20 insertions(+), 21 deletions(-)

diff --git a/source/funkin/util/plugins/ScreenshotPlugin.hx b/source/funkin/util/plugins/ScreenshotPlugin.hx
index a8b494fee..40454854c 100644
--- a/source/funkin/util/plugins/ScreenshotPlugin.hx
+++ b/source/funkin/util/plugins/ScreenshotPlugin.hx
@@ -92,9 +92,9 @@ class ScreenshotPlugin extends FlxBasic
         flashColor: Preferences.flashingLights ? FlxColor.WHITE : null, // Was originally a black flash.
 
         // TODO: Add a way to configure screenshots from the options menu.
-        hotkeys: [FlxKey.PRINTSCREEN],
+        hotkeys: [FlxKey.F3],
         shouldHideMouse: false,
-        fancyPreview: true, // TODO: Fancy preview is broken on substates.
+        fancyPreview: true,
       }));
   }
 
@@ -170,43 +170,42 @@ class ScreenshotPlugin extends FlxBasic
 
   static final PREVIEW_INITIAL_DELAY = 0.25; // How long before the preview starts fading in.
   static final PREVIEW_FADE_IN_DURATION = 0.3; // How long the preview takes to fade in.
-  static final PREVIEW_FADE_OUT_DELAY = 0.25; // How long the preview stays on screen.
+  static final PREVIEW_FADE_OUT_DELAY = 1.25; // How long the preview stays on screen.
   static final PREVIEW_FADE_OUT_DURATION = 0.3; // How long the preview takes to fade out.
 
   function showFancyPreview(bitmap:Bitmap):Void
   {
-    // TODO: This function looks really nice but breaks substates.
-    var targetCamera = new FlxCamera();
-    targetCamera.bgColor.alpha = 0; // Show the scene behind the camera.
-    FlxG.cameras.add(targetCamera);
+    var scale:Float = 0.25;
+    var w:Int = Std.int(bitmap.bitmapData.width * scale);
+    var h:Int = Std.int(bitmap.bitmapData.height * scale);
 
-    var flxGraphic = FlxGraphic.fromBitmapData(bitmap.bitmapData, false, "screenshot", false);
+    var preview:BitmapData = new BitmapData(w, h, true);
+    var matrix:openfl.geom.Matrix = new openfl.geom.Matrix();
+    matrix.scale(scale, scale);
+    preview.draw(bitmap.bitmapData, matrix);
 
-    var preview = new FunkinSprite(0, 0);
-    preview.frames = flxGraphic.imageFrame;
-    preview.setGraphicSize(bitmap.width / 4, bitmap.height / 4);
-    preview.x = FlxG.width - preview.width - 10;
-    preview.y = FlxG.height - preview.height - 10;
+    var previewBitmap = new Bitmap(preview);
 
-    preview.alpha = 0.0;
-    preview.cameras = [targetCamera];
-    getCurrentState().add(preview);
+    FlxG.stage.addChild(previewBitmap);
+
+    previewBitmap.alpha = 0.0;
+    previewBitmap.y -= 10;
 
     // Wait to fade in.
     new FlxTimer().start(PREVIEW_INITIAL_DELAY, function(_) {
       // Fade in.
-      FlxTween.tween(preview, {alpha: 1.0}, PREVIEW_FADE_IN_DURATION,
+      FlxTween.tween(previewBitmap, {alpha: 1.0, y: 0}, PREVIEW_FADE_IN_DURATION,
         {
-          ease: FlxEase.elasticOut,
+          ease: FlxEase.quartOut,
           onComplete: function(_) {
             // Wait to fade out.
             new FlxTimer().start(PREVIEW_FADE_OUT_DELAY, function(_) {
               // Fade out.
-              FlxTween.tween(preview, {alpha: 0.0}, PREVIEW_FADE_OUT_DURATION,
+              FlxTween.tween(previewBitmap, {alpha: 0.0, y: 10}, PREVIEW_FADE_OUT_DURATION,
                 {
-                  ease: FlxEase.elasticIn,
+                  ease: FlxEase.quartInOut,
                   onComplete: function(_) {
-                    preview.kill();
+                    FlxG.stage.removeChild(previewBitmap);
                   }
                 });
             });