From 96c569a652fdbe7f48c99b91006bf932fbb3dfd4 Mon Sep 17 00:00:00 2001 From: mjbudd77 Date: Sat, 29 May 2021 21:52:32 -0400 Subject: [PATCH] Changed GL video scaling so that special filter does not effect the size of the overall window. --- src/drivers/Qt/ConsoleVideoConf.cpp | 6 +-- src/drivers/Qt/ConsoleViewerGL.cpp | 51 ++++++++++++++++-------- src/drivers/Qt/nes_shm.cpp | 3 +- src/drivers/Qt/nes_shm.h | 3 +- src/drivers/Qt/sdl-video.cpp | 60 +++++++++++++++++------------ src/drivers/common/vidblit.cpp | 1 + 6 files changed, 80 insertions(+), 44 deletions(-) diff --git a/src/drivers/Qt/ConsoleVideoConf.cpp b/src/drivers/Qt/ConsoleVideoConf.cpp index 739a2584..a8ce5d70 100644 --- a/src/drivers/Qt/ConsoleVideoConf.cpp +++ b/src/drivers/Qt/ConsoleVideoConf.cpp @@ -879,13 +879,13 @@ QSize ConsoleVideoConfDialog_t::calcNewScreenSize(void) if ( aspectCbx->isChecked() ) { - xscale = xScaleBox->value(); + xscale = xScaleBox->value() / nes_shm->video.xscale; yscale = xscale * (double)nes_shm->video.xyRatio; } else { - xscale = xScaleBox->value(); - yscale = yScaleBox->value(); + xscale = xScaleBox->value() / nes_shm->video.xscale; + yscale = yScaleBox->value() / nes_shm->video.yscale; } rw=(int)((r-l)*xscale); rh=(int)((b-t)*yscale); diff --git a/src/drivers/Qt/ConsoleViewerGL.cpp b/src/drivers/Qt/ConsoleViewerGL.cpp index cf489aba..84768940 100644 --- a/src/drivers/Qt/ConsoleViewerGL.cpp +++ b/src/drivers/Qt/ConsoleViewerGL.cpp @@ -163,7 +163,7 @@ void ConsoleViewGL_t::buildTextures(void) if ( textureType == GL_TEXTURE_RECTANGLE ) { - printf("Using GL_TEXTURE_RECTANGLE\n"); + //printf("Using GL_TEXTURE_RECTANGLE\n"); glEnable(GL_TEXTURE_RECTANGLE); glGenTextures(1, &gltexture); //printf("Linear Interpolation on GL Texture: %s \n", linearFilter ? "Enabled" : "Disabled"); @@ -184,7 +184,7 @@ void ConsoleViewGL_t::buildTextures(void) } else { - printf("Using GL_TEXTURE_2D\n"); + //printf("Using GL_TEXTURE_2D\n"); glEnable(GL_TEXTURE_2D); glGenTextures(1, &gltexture); //printf("Linear Interpolation on GL Texture: %s \n", linearFilter ? "Enabled" : "Disabled"); @@ -224,7 +224,7 @@ void ConsoleViewGL_t::chkExtnsGL(void) glGetIntegerv(GL_NUM_EXTENSIONS, &NumberOfExtensions); - printf("Number of GL Externsions: %i \n", NumberOfExtensions ); + //printf("Number of GL Externsions: %i \n", NumberOfExtensions ); c = glGetString( GL_VERSION ); @@ -264,12 +264,12 @@ void ConsoleViewGL_t::chkExtnsGL(void) if ( strcmp( extName, "GL_ARB_texture_rectangle" ) == 0 ) { - printf("GL Has: %s\n", extName ); + //printf("GL Has: %s\n", extName ); textureType = GL_TEXTURE_RECTANGLE; } else if ( strcmp( extName, "GL_ARB_texture_non_power_of_two" ) == 0 ) { - printf("GL Has: %s\n", extName ); + //printf("GL Has: %s\n", extName ); reqPwr2 = false; } } @@ -343,20 +343,28 @@ void ConsoleViewGL_t::setLinearFilterEnable( bool ena ) void ConsoleViewGL_t::setScaleXY( double xs, double ys ) { - float xyRatio = (float)nes_shm->video.xyRatio; + //float xyRatio = (float)nes_shm->video.xyRatio; xscale = xs; yscale = ys; if ( forceAspect ) { - if ( (xscale*xyRatio) < yscale ) + //if ( (xscale*xyRatio) < yscale ) + //{ + // yscale = (xscale*xyRatio); + //} + //else + //{ + // xscale = (yscale/xyRatio); + //} + if ( xscale < yscale ) { - yscale = (xscale*xyRatio); + yscale = xscale; } else { - xscale = (yscale/xyRatio); + xscale = yscale; } } } @@ -476,19 +484,32 @@ void ConsoleViewGL_t::paintGL(void) int l=0, r=texture_width; int t=0, b=texture_height; - float xyRatio = (float)nes_shm->video.xyRatio; + float ixScale = (float)nes_shm->video.xscale; + float iyScale = (float)nes_shm->video.yscale; + //float xyRatio = (float)nes_shm->video.xyRatio; float xscaleTmp = (float)(view_width) / (float)(texture_width); float yscaleTmp = (float)(view_height) / (float)(texture_height); + xscaleTmp *= ixScale; + yscaleTmp *= iyScale; + if ( forceAspect ) { - if ( (xscaleTmp*xyRatio) < yscaleTmp ) + //if ( (xscaleTmp*xyRatio) < yscaleTmp ) + //{ + // yscaleTmp = xscaleTmp * xyRatio; + //} + //else + //{ + // xscaleTmp = yscaleTmp / xyRatio; + //} + if ( xscaleTmp < yscaleTmp ) { - yscaleTmp = xscaleTmp * xyRatio; + yscaleTmp = xscaleTmp; } else { - xscaleTmp = yscaleTmp / xyRatio; + xscaleTmp = yscaleTmp; } } @@ -509,8 +530,8 @@ void ConsoleViewGL_t::paintGL(void) } } - rw=(int)((r-l)*xscaleTmp); - rh=(int)((b-t)*yscaleTmp); + rw=(int)((r-l)*xscaleTmp/ixScale); + rh=(int)((b-t)*yscaleTmp/iyScale); if ( forceAspect ) { diff --git a/src/drivers/Qt/nes_shm.cpp b/src/drivers/Qt/nes_shm.cpp index 8b577659..ae3b16e6 100644 --- a/src/drivers/Qt/nes_shm.cpp +++ b/src/drivers/Qt/nes_shm.cpp @@ -37,7 +37,8 @@ nes_shm_t *open_nes_shm(void) vaddr->video.ncol = GL_NES_WIDTH; vaddr->video.nrow = GL_NES_HEIGHT; vaddr->video.pitch = GL_NES_WIDTH * 4; - vaddr->video.scale = 1; + vaddr->video.xscale = 1; + vaddr->video.yscale = 1; vaddr->video.xyRatio = 1; vaddr->video.preScaler = 0; diff --git a/src/drivers/Qt/nes_shm.h b/src/drivers/Qt/nes_shm.h index 8db2e397..6172cbb1 100644 --- a/src/drivers/Qt/nes_shm.h +++ b/src/drivers/Qt/nes_shm.h @@ -25,7 +25,8 @@ struct nes_shm_t int ncol; int nrow; int pitch; - int scale; + int xscale; + int yscale; int xyRatio; int preScaler; } video; diff --git a/src/drivers/Qt/sdl-video.cpp b/src/drivers/Qt/sdl-video.cpp index 44026e57..610b5813 100644 --- a/src/drivers/Qt/sdl-video.cpp +++ b/src/drivers/Qt/sdl-video.cpp @@ -150,28 +150,33 @@ void CalcVideoDimensions(void) { default: case 0: // None - nes_shm->video.scale = 1; + nes_shm->video.xscale = 1; + nes_shm->video.yscale = 1; break; case 1: // hq2x case 2: // Scale2x case 3: // NTSC 2x case 6: // Prescale2x - nes_shm->video.scale = 2; + nes_shm->video.xscale = 2; + nes_shm->video.yscale = 2; break; case 4: // hq3x case 5: // Scale3x case 7: // Prescale3x - nes_shm->video.scale = 3; + nes_shm->video.xscale = 3; + nes_shm->video.yscale = 3; break; case 8: // Prescale4x - nes_shm->video.scale = 4; + nes_shm->video.xscale = 4; + nes_shm->video.yscale = 4; break; case 9: // PAL - nes_shm->video.scale = 3; + nes_shm->video.xscale = 3; + nes_shm->video.yscale = 1; break; } - int iScale = nes_shm->video.scale; + int iScale = nes_shm->video.xscale; if ( s_sponge == 3 ) { nes_shm->video.ncol = iScale*301; @@ -236,24 +241,29 @@ int InitVideo(FCEUGI *gi) { default: case 0: // None - nes_shm->video.scale = 1; + nes_shm->video.xscale = 1; + nes_shm->video.yscale = 1; break; case 1: // hq2x case 2: // Scale2x case 3: // NTSC 2x case 6: // Prescale2x - nes_shm->video.scale = 2; + nes_shm->video.xscale = 2; + nes_shm->video.yscale = 2; break; case 4: // hq3x case 5: // Scale3x case 7: // Prescale3x - nes_shm->video.scale = 3; + nes_shm->video.xscale = 3; + nes_shm->video.yscale = 3; break; case 8: // Prescale4x - nes_shm->video.scale = 4; + nes_shm->video.xscale = 4; + nes_shm->video.yscale = 4; break; case 9: // PAL - nes_shm->video.scale = 3; + nes_shm->video.xscale = 3; + nes_shm->video.yscale = 1; break; } @@ -262,7 +272,7 @@ int InitVideo(FCEUGI *gi) // check to see if we are showing FPS FCEUI_SetShowFPS(show_fps); - int iScale = nes_shm->video.scale; + int iScale = nes_shm->video.xscale; if ( s_sponge == 3 ) { nes_shm->video.ncol = iScale*301; @@ -427,7 +437,7 @@ void BlitScreen(uint8 *XBuf) { uint8 *dest; - int w, h, pitch, iScale; + int w, h, pitch, ixScale, iyScale; // refresh the palette if required if (s_paletterefresh) @@ -439,16 +449,17 @@ BlitScreen(uint8 *XBuf) // XXX soules - not entirely sure why this is being done yet XBuf += s_srendline * 256; - dest = (uint8*)nes_shm->pixbuf; - iScale = nes_shm->video.scale; + dest = (uint8*)nes_shm->pixbuf; + ixScale = nes_shm->video.xscale; + iyScale = nes_shm->video.yscale; if ( s_sponge == 3 ) { - w = iScale*301; + w = ixScale*301; } else { - w = iScale*NWIDTH; + w = ixScale*NWIDTH; } if ( s_sponge == 9 ) { @@ -456,7 +467,7 @@ BlitScreen(uint8 *XBuf) } else { - h = iScale*s_tlines; + h = ixScale*s_tlines; } pitch = w*4; @@ -473,7 +484,7 @@ BlitScreen(uint8 *XBuf) } else { - Blit8ToHigh(XBuf + NOFFSET, dest, NWIDTH, s_tlines, pitch, iScale, iScale); + Blit8ToHigh(XBuf + NOFFSET, dest, NWIDTH, s_tlines, pitch, ixScale, iyScale); } nes_shm->blitUpdated = 1; @@ -493,12 +504,13 @@ uint32 PtoV(double nx, double ny) //printf("Scaled (%i,%i) \n", x, y); - x = x / nes_shm->video.scale; + x = x / nes_shm->video.xscale; + y = y / nes_shm->video.yscale; - if ( nes_shm->video.xyRatio == 1 ) - { - y = y / nes_shm->video.scale; - } + //if ( nes_shm->video.xyRatio == 1 ) + //{ + // y = y / nes_shm->video.scale; + //} //printf("UnScaled (%i,%i) \n", x, y); if (s_clipSides) diff --git a/src/drivers/common/vidblit.cpp b/src/drivers/common/vidblit.cpp index 6c21c259..365ceaff 100644 --- a/src/drivers/common/vidblit.cpp +++ b/src/drivers/common/vidblit.cpp @@ -208,6 +208,7 @@ int InitBlitToHigh(int b, uint32 rmask, uint32 gmask, uint32 bmask, int efx, int palrgb = (uint32 *)FCEU_dmalloc((256+512)*PAL_PHASES*sizeof(uint32)); palrgb2 = (uint32 *)FCEU_dmalloc((256+512)*PAL_PHASES*sizeof(uint32)); moire = (float *)FCEU_dmalloc( PAL_PHASES*sizeof(float)); + palupdate = 1; } silt = specfilt;