]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Fix for CD32 FMV position/size in integer scale mode.
authorToni Wilen <twilen@winuae.net>
Mon, 4 Mar 2024 18:11:16 +0000 (20:11 +0200)
committerToni Wilen <twilen@winuae.net>
Mon, 4 Mar 2024 18:11:16 +0000 (20:11 +0200)
od-win32/win32_scaler.cpp

index 7e535d7c052ca8fb32b3d41bb4faadb7dc12aefa..1ff5d6adcd924a470666a781d0d692b407bd0e34 100644 (file)
@@ -119,9 +119,9 @@ static void getmanualpos(int monid, int *cxp, int *cyp, int *cwp, int *chp)
                } else {
                        if (currprefs.gfx_overscanmode <= OVERSCANMODE_OVERSCAN) {
                                // keep old version compatibility
-                               cw = native ? AMIGA_WIDTH_MAX << RES_MAX : avidinfo->outbuffer->outwidth;
+                               cw = native ? AMIGA_WIDTH_MAX << RES_MAX : avidinfo->outbuffer->outwidth << 1;
                        } else {
-                               cw = native ? maxhpos_display << RES_MAX : avidinfo->outbuffer->outwidth;
+                               cw = native ? maxhpos_display << RES_MAX : avidinfo->outbuffer->outwidth << 1;
                        }
                }
        } else {
@@ -351,7 +351,7 @@ void getfilterrect2(int monid, RECT *sr, RECT *dr, RECT *zr, int dst_width, int
        bool autoaspect_done = false;
 
        if (scalemode) {
-               int cw, ch, cx, cy, cv, crealh = 0;
+               int cw, ch, cx, cy, cv = 0, crealh = 0;
                static int oxmult, oymult;
 
                filterxmult = (float)scale;
@@ -372,6 +372,7 @@ void getfilterrect2(int monid, RECT *sr, RECT *dr, RECT *zr, int dst_width, int
                                cy = 0;
                                cw = avidinfo->outbuffer->outwidth;
                                ch = avidinfo->outbuffer->outheight;
+                               cv = 1;
                        } else {
                                cx = 0;
                                cy = 0;
@@ -445,29 +446,31 @@ void getfilterrect2(int monid, RECT *sr, RECT *dr, RECT *zr, int dst_width, int
                                filter_vert_zoom_mult = 1.0;
 
                                float multadd = 1.0f / (1 << currprefs.gf[idx].gfx_filter_integerscalelimit);
-                               if (cw2 > maxw || ch2 > maxh) {
-                                       while (cw2 / mult - adjw > maxw || ch2 / mult - adjh > maxh) {
-                                               mult += multadd;
-                                       }
-                                       float multx = mult, multy = mult;
-                                       maxw = (int)(maxw * multx);
-                                       maxh = (int)(maxh * multy);
-                               } else {
-                                       while (cw2 * (mult + multadd) - adjw <= maxw && ch2 * (mult + multadd) - adjh <= maxh) {
-                                               mult += multadd;
-                                       }
-
-                                       float multx = mult, multy = mult;
-                                       // if width is smaller than height, double width (programmed modes)
-                                       if (cw2 * (mult + multadd) - adjw <= maxw && cw2 < ch2) {
-                                               multx += multadd;
-                                       }
-                                       // if width is >2.5x height, double height (non-doublescanned superhires)
-                                       if (ch2 * (mult + multadd) - adjh <= maxh && cw2 > ch2 * 2.5) {
-                                               multy += multadd;
+                               if (cw2 > 0 && ch2 > 0) {
+                                       if (cw2 > maxw || ch2 > maxh) {
+                                               while (cw2 / mult - adjw > maxw || ch2 / mult - adjh > maxh) {
+                                                       mult += multadd;
+                                               }
+                                               float multx = mult, multy = mult;
+                                               maxw = (int)(maxw * multx);
+                                               maxh = (int)(maxh * multy);
+                                       } else {
+                                               while (cw2 * (mult + multadd) - adjw <= maxw && ch2 * (mult + multadd) - adjh <= maxh) {
+                                                       mult += multadd;
+                                               }
+
+                                               float multx = mult, multy = mult;
+                                               // if width is smaller than height, double width (programmed modes)
+                                               if (cw2 * (mult + multadd) - adjw <= maxw && cw2 < ch2) {
+                                                       multx += multadd;
+                                               }
+                                               // if width is >2.5x height, double height (non-doublescanned superhires)
+                                               if (ch2 * (mult + multadd) - adjh <= maxh && cw2 > ch2 * 2.5) {
+                                                       multy += multadd;
+                                               }
+                                               maxw = (int)((maxw + multx - multadd) / multx);
+                                               maxh = (int)((maxh + multy - multadd) / multy);
                                        }
-                                       maxw = (int)((maxw + multx - multadd) / multx);
-                                       maxh = (int)((maxh + multy - multadd) / multy);
                                }
 
                                *mode = 1;