From b6bd5e41dd10c19be1201b45fc94f9418d6fa283 Mon Sep 17 00:00:00 2001
From: FunkyFr3sh <cc.red.alert.1@googlemail.com>
Date: Sat, 29 Sep 2018 04:44:28 +0200
Subject: [PATCH] Fixes maintain aspect ratio / boxing (direct3d 9)

---
 src/render_d3d9.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/src/render_d3d9.c b/src/render_d3d9.c
index 0e9e979..acf4a48 100644
--- a/src/render_d3d9.c
+++ b/src/render_d3d9.c
@@ -6,8 +6,7 @@
 
 // TO DO:
 // Try to get fullscreen exclusive working
-// Fix maintain aspect ratio / boxing
-// Use different scaling filter (seems to use blurry linear by default)
+// vhack isn't working
 
 const BYTE PalettePixelShaderSrc[] =
 {
@@ -50,6 +49,12 @@ static void InitDirect3D(BOOL reset)
     int width = ddraw->width;
     int height = ddraw->height;
 
+    int vpX = ddraw->render.viewport.x;
+    int vpY = ddraw->render.viewport.y;
+
+    int vpWidth = ddraw->render.viewport.width + vpX;
+    int vpHeight = ddraw->render.viewport.height + vpY;
+
     int surfaceTexWidth =
         width <= 1024 ? 1024 : width <= 2048 ? 2048 : width <= 4096 ? 4096 : width;
 
@@ -62,10 +67,10 @@ static void InitDirect3D(BOOL reset)
     typedef struct CUSTOMVERTEX { float x, y, z, rhw, u, v; } CUSTOMVERTEX;
     CUSTOMVERTEX vertices[] =
     {
-        { -1.0f, height, 0.0f, 1.0f, 0.0f,   scaleH },
-        { -1.0f, -1.0f,  0.0f, 1.0f, 0.0f,   0.0f },
-        { width, height, 0.0f, 1.0f, scaleW, scaleH },
-        { width, -1.0f,  0.0f, 1.0f, scaleW, 0.0f }
+        { vpX - 0.5f,     vpHeight - 0.5f, 0.0f, 1.0f, 0.0f,   scaleH },
+        { vpX - 0.5f,     vpY - 0.5f,      0.0f, 1.0f, 0.0f,   0.0f },
+        { vpWidth - 0.5f, vpHeight - 0.5f, 0.0f, 1.0f, scaleW, scaleH },
+        { vpWidth - 0.5f, vpY - 0.5f,      0.0f, 1.0f, scaleW, 0.0f }
     };
 
     D3ddev->lpVtbl->SetFVF(D3ddev, D3DFVF_XYZRHW | D3DFVF_TEX1);
@@ -90,6 +95,9 @@ static void InitDirect3D(BOOL reset)
 
     D3ddev->lpVtbl->CreatePixelShader(D3ddev, (DWORD *)PalettePixelShaderSrc, &PixelShader);
     D3ddev->lpVtbl->SetPixelShader(D3ddev, PixelShader);
+
+    D3DVIEWPORT9 viewData = { vpX, vpY, vpWidth, vpHeight, 0.0f, 1.0f };
+    D3ddev->lpVtbl->SetViewport(D3ddev, &viewData);
 }
 
 DWORD WINAPI render_d3d9_main(void)
@@ -129,8 +137,8 @@ DWORD WINAPI render_d3d9_main(void)
             D3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
             D3dpp.hDeviceWindow = ddraw->hWnd;
             D3dpp.PresentationInterval = ddraw->vsync ? D3DPRESENT_INTERVAL_ONE : D3DPRESENT_INTERVAL_IMMEDIATE;
-            D3dpp.BackBufferWidth = ddraw->width;
-            D3dpp.BackBufferHeight = ddraw->height;
+            D3dpp.BackBufferWidth = ddraw->render.width;
+            D3dpp.BackBufferHeight = ddraw->render.height;
             D3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
             D3dpp.BackBufferCount = 1;