For Qt, added logic to allow for auto video scaling on window resize to be optional. An 'Auto scale on resize' checkbox has been added to the video config window. When this box is checked (and applied) the window will always auto rescale the video image to a best fit on a resize. If not checked, window will use the specified numerical scale values as a maximum scaling limit. This means that the window will allow scaling the image down if the window is not large enough to fit image at the requested scale, but will never scale the image up past the request scale. So if the window is at a large size and the requested scale is small, the result will be a small video image on a big window with a lot of black space. This is for issue #205.

This commit is contained in:
Matthew Budd 2020-10-27 07:00:43 -04:00
parent 8f336bf8d3
commit 81cbabbf1f
6 changed files with 141 additions and 41 deletions

View File

@ -85,6 +85,9 @@ ConsoleVideoConfDialog_t::ConsoleVideoConfDialog_t(QWidget *parent)
// Show FPS Checkbox
showFPS_cbx = new QCheckBox( tr("Show FPS") );
// Auto Scale on Resize
autoScaleCbx = new QCheckBox( tr("Auto Scale on Resize") );
// Square Pixels
sqrPixCbx = new QCheckBox( tr("Square Pixels") );
@ -98,10 +101,12 @@ ConsoleVideoConfDialog_t::ConsoleVideoConfDialog_t(QWidget *parent)
{
if ( consoleWindow->viewport_GL )
{
autoScaleCbx->setChecked( consoleWindow->viewport_GL->getAutoScaleOpt() );
sqrPixCbx->setChecked( consoleWindow->viewport_GL->getSqrPixelOpt() );
}
else if ( consoleWindow->viewport_SDL )
{
autoScaleCbx->setChecked( consoleWindow->viewport_SDL->getAutoScaleOpt() );
sqrPixCbx->setChecked( consoleWindow->viewport_SDL->getSqrPixelOpt() );
}
}
@ -118,7 +123,8 @@ ConsoleVideoConfDialog_t::ConsoleVideoConfDialog_t(QWidget *parent)
main_vbox->addWidget( sprtLimCbx );
main_vbox->addWidget( clipSidesCbx);
main_vbox->addWidget( showFPS_cbx );
main_vbox->addWidget( sqrPixCbx );
main_vbox->addWidget( autoScaleCbx);
main_vbox->addWidget( sqrPixCbx );
xScaleBox = new QDoubleSpinBox(this);
yScaleBox = new QDoubleSpinBox(this);
@ -411,15 +417,30 @@ void ConsoleVideoConfDialog_t::applyChanges( void )
if ( consoleWindow )
{
float xscale, yscale;
QSize s = calcNewScreenSize();
if ( sqrPixCbx->isChecked() )
{
yscale = xscale = xScaleBox->value();
}
else
{
xscale = xScaleBox->value();
yscale = yScaleBox->value();
}
if ( consoleWindow->viewport_GL )
{
consoleWindow->viewport_GL->setSqrPixelOpt( sqrPixCbx->isChecked() );
consoleWindow->viewport_GL->setAutoScaleOpt( autoScaleCbx->isChecked() );
consoleWindow->viewport_GL->setScaleXY( xscale, yscale );
}
if ( consoleWindow->viewport_SDL )
{
consoleWindow->viewport_SDL->setSqrPixelOpt( sqrPixCbx->isChecked() );
consoleWindow->viewport_SDL->setAutoScaleOpt( autoScaleCbx->isChecked() );
consoleWindow->viewport_SDL->setScaleXY( xscale, yscale );
}
consoleWindow->resize( s );

View File

@ -36,6 +36,7 @@ class ConsoleVideoConfDialog_t : public QDialog
QCheckBox *sprtLimCbx;
QCheckBox *clipSidesCbx;
QCheckBox *showFPS_cbx;
QCheckBox *autoScaleCbx;
QCheckBox *sqrPixCbx;
QDoubleSpinBox *xScaleBox;
QDoubleSpinBox *yScaleBox;

View File

@ -24,6 +24,7 @@ ConsoleViewGL_t::ConsoleViewGL_t(QWidget *parent)
devPixRatio = 1.0f;
linearFilter = false;
sqrPixels = true;
autoScaleEna = true;
xscale = 2.0;
yscale = 2.0;
@ -46,15 +47,15 @@ ConsoleViewGL_t::ConsoleViewGL_t(QWidget *parent)
memset( localBuf, 0, localBufSize );
}
linearFilter = false;
linearFilter = false;
if ( g_config )
{
int opt;
g_config->getOption("SDL.OpenGLip", &opt );
linearFilter = (opt) ? true : false;
}
if ( g_config )
{
int opt;
g_config->getOption("SDL.OpenGLip", &opt );
linearFilter = (opt) ? true : false;
}
}
ConsoleViewGL_t::~ConsoleViewGL_t(void)
@ -149,20 +150,10 @@ void ConsoleViewGL_t::setLinearFilterEnable( bool ena )
}
}
void ConsoleViewGL_t::transfer2LocalBuffer(void)
void ConsoleViewGL_t::setScaleXY( double xs, double ys )
{
memcpy( localBuf, nes_shm->pixbuf, localBufSize );
}
void ConsoleViewGL_t::paintGL(void)
{
int texture_width = nes_shm->ncol;
int texture_height = nes_shm->nrow;
int l=0, r=texture_width;
int t=0, b=texture_height;
xscale = (float)view_width / (float)texture_width;
yscale = (float)view_height / (float)texture_height;
xscale = xs;
yscale = ys;
if ( sqrPixels )
{
@ -175,8 +166,53 @@ void ConsoleViewGL_t::paintGL(void)
xscale = yscale;
}
}
int rw=(int)((r-l)*xscale);
int rh=(int)((b-t)*yscale);
}
void ConsoleViewGL_t::transfer2LocalBuffer(void)
{
memcpy( localBuf, nes_shm->pixbuf, localBufSize );
}
void ConsoleViewGL_t::paintGL(void)
{
int texture_width = nes_shm->ncol;
int texture_height = nes_shm->nrow;
int l=0, r=texture_width;
int t=0, b=texture_height;
float xscaleTmp = (float)view_width / (float)texture_width;
float yscaleTmp = (float)view_height / (float)texture_height;
if ( sqrPixels )
{
if (xscaleTmp < yscaleTmp )
{
yscaleTmp = xscaleTmp;
}
else
{
xscaleTmp = yscaleTmp;
}
}
if ( autoScaleEna )
{
xscale = xscaleTmp;
yscale = yscaleTmp;
}
else
{
if ( xscaleTmp > xscale )
{
xscaleTmp = xscale;
}
if ( yscaleTmp > yscale )
{
yscaleTmp = yscale;
}
}
int rw=(int)((r-l)*xscaleTmp);
int rh=(int)((b-t)*yscaleTmp);
int sx=(view_width-rw)/2;
int sy=(view_height-rh)/2;

View File

@ -24,8 +24,11 @@ class ConsoleViewGL_t : public QOpenGLWidget, protected QOpenGLFunctions
bool getSqrPixelOpt(void){ return sqrPixels; };
void setSqrPixelOpt( bool val ){ sqrPixels = val; return; };
bool getAutoScaleOpt(void){ return autoScaleEna; };
void setAutoScaleOpt( bool val ){ autoScaleEna = val; return; };
double getScaleX(void){ return xscale; };
double getScaleY(void){ return yscale; };
void setScaleXY( double xs, double ys );
protected:
void initializeGL(void);
@ -44,6 +47,7 @@ class ConsoleViewGL_t : public QOpenGLWidget, protected QOpenGLFunctions
GLuint gltexture;
bool linearFilter;
bool sqrPixels;
bool autoScaleEna;
uint32_t *localBuf;
uint32_t localBufSize;

View File

@ -53,15 +53,16 @@ ConsoleViewSDL_t::ConsoleViewSDL_t(QWidget *parent)
}
sqrPixels = true;
linearFilter = false;
autoScaleEna = true;
linearFilter = false;
if ( g_config )
{
int opt;
g_config->getOption("SDL.OpenGLip", &opt );
linearFilter = (opt) ? true : false;
}
if ( g_config )
{
int opt;
g_config->getOption("SDL.OpenGLip", &opt );
linearFilter = (opt) ? true : false;
}
}
ConsoleViewSDL_t::~ConsoleViewSDL_t(void)
@ -82,6 +83,24 @@ void ConsoleViewSDL_t::setLinearFilterEnable( bool ena )
}
}
void ConsoleViewSDL_t::setScaleXY( double xs, double ys )
{
xscale = xs;
yscale = ys;
if ( sqrPixels )
{
if (xscale < yscale )
{
yscale = xscale;
}
else
{
xscale = yscale;
}
}
}
void ConsoleViewSDL_t::transfer2LocalBuffer(void)
{
memcpy( localBuf, nes_shm->pixbuf, localBufSize );
@ -219,25 +238,40 @@ void ConsoleViewSDL_t::render(void)
nesHeight = nes_shm->nrow;
}
//printf(" %i x %i \n", nesWidth, nesHeight );
xscale = (float)view_width / (float)nesWidth;
yscale = (float)view_height / (float)nesHeight;
float xscaleTmp = (float)view_width / (float)nesWidth;
float yscaleTmp = (float)view_height / (float)nesHeight;
if ( sqrPixels )
{
if (xscale < yscale )
if (xscaleTmp < yscaleTmp )
{
yscale = xscale;
yscaleTmp = xscaleTmp;
}
else
{
xscale = yscale;
xscaleTmp = yscaleTmp;
}
}
rw=(int)(nesWidth*xscale);
rh=(int)(nesHeight*yscale);
//sx=sdlViewport.x + (view_width-rw)/2;
//sy=sdlViewport.y + (view_height-rh)/2;
if ( autoScaleEna )
{
xscale = xscaleTmp;
yscale = yscaleTmp;
}
else
{
if ( xscaleTmp > xscale )
{
xscaleTmp = xscale;
}
if ( yscaleTmp > yscale )
{
yscaleTmp = yscale;
}
}
rw=(int)(nesWidth*xscaleTmp);
rh=(int)(nesHeight*yscaleTmp);
sx=(view_width-rw)/2;
sy=(view_height-rh)/2;

View File

@ -27,8 +27,11 @@ class ConsoleViewSDL_t : public QWidget
bool getSqrPixelOpt(void){ return sqrPixels; };
void setSqrPixelOpt( bool val ){ sqrPixels = val; return; };
bool getAutoScaleOpt(void){ return autoScaleEna; };
void setAutoScaleOpt( bool val ){ autoScaleEna = val; return; };
double getScaleX(void){ return xscale; };
double getScaleY(void){ return yscale; };
void setScaleXY( double xs, double ys );
protected:
@ -50,6 +53,7 @@ class ConsoleViewSDL_t : public QWidget
bool vsyncEnabled;
bool linearFilter;
bool sqrPixels;
bool autoScaleEna;
uint32_t *localBuf;
uint32_t localBufSize;