Implement smooth scaling
This commit is contained in:
parent
7f604e25ad
commit
da4e0fbed0
|
@ -3,6 +3,7 @@ debugMode=true
|
||||||
winResizable=true
|
winResizable=true
|
||||||
fullscreen=false
|
fullscreen=false
|
||||||
fixedAspectRatio=false
|
fixedAspectRatio=false
|
||||||
|
smoothScaling=false
|
||||||
vsync=true
|
vsync=true
|
||||||
defScreenW=640
|
defScreenW=640
|
||||||
defScreenH=480
|
defScreenH=480
|
||||||
|
|
|
@ -33,6 +33,7 @@ Config::Config()
|
||||||
winResizable(false),
|
winResizable(false),
|
||||||
fullscreen(false),
|
fullscreen(false),
|
||||||
fixedAspectRatio(false),
|
fixedAspectRatio(false),
|
||||||
|
smoothScaling(false),
|
||||||
vsync(false),
|
vsync(false),
|
||||||
defScreenW(640),
|
defScreenW(640),
|
||||||
defScreenH(480),
|
defScreenH(480),
|
||||||
|
@ -50,6 +51,7 @@ void Config::read()
|
||||||
READ_VAL(winResizable, Bool);
|
READ_VAL(winResizable, Bool);
|
||||||
READ_VAL(fullscreen, Bool);
|
READ_VAL(fullscreen, Bool);
|
||||||
READ_VAL(fixedAspectRatio, Bool);
|
READ_VAL(fixedAspectRatio, Bool);
|
||||||
|
READ_VAL(smoothScaling, Bool);
|
||||||
READ_VAL(vsync, Bool);
|
READ_VAL(vsync, Bool);
|
||||||
READ_VAL(defScreenW, Int);
|
READ_VAL(defScreenW, Int);
|
||||||
READ_VAL(defScreenH, Int);
|
READ_VAL(defScreenH, Int);
|
||||||
|
|
|
@ -34,6 +34,7 @@ struct Config
|
||||||
bool winResizable;
|
bool winResizable;
|
||||||
bool fullscreen;
|
bool fullscreen;
|
||||||
bool fixedAspectRatio;
|
bool fixedAspectRatio;
|
||||||
|
bool smoothScaling;
|
||||||
bool vsync;
|
bool vsync;
|
||||||
|
|
||||||
int defScreenW;
|
int defScreenW;
|
||||||
|
|
|
@ -147,6 +147,12 @@ namespace FBO
|
||||||
Read = 1
|
Read = 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum BlitMode
|
||||||
|
{
|
||||||
|
Nearest = 0,
|
||||||
|
Linear = 1
|
||||||
|
};
|
||||||
|
|
||||||
inline ID gen()
|
inline ID gen()
|
||||||
{
|
{
|
||||||
ID id;
|
ID id;
|
||||||
|
@ -189,18 +195,26 @@ namespace FBO
|
||||||
inline void blit(int srcX, int srcY,
|
inline void blit(int srcX, int srcY,
|
||||||
int srcW, int srcH,
|
int srcW, int srcH,
|
||||||
int dstX, int dstY,
|
int dstX, int dstY,
|
||||||
int dstW, int dstH)
|
int dstW, int dstH,
|
||||||
|
BlitMode mode = Nearest)
|
||||||
{
|
{
|
||||||
|
static const GLenum modes[] =
|
||||||
|
{
|
||||||
|
GL_NEAREST,
|
||||||
|
GL_LINEAR
|
||||||
|
};
|
||||||
|
|
||||||
glBlitFramebufferEXT(srcX, srcY, srcX+srcW, srcY+srcH,
|
glBlitFramebufferEXT(srcX, srcY, srcX+srcW, srcY+srcH,
|
||||||
dstX, dstY, dstX+dstW, dstY+dstH,
|
dstX, dstY, dstX+dstW, dstY+dstH,
|
||||||
GL_COLOR_BUFFER_BIT, GL_NEAREST);
|
GL_COLOR_BUFFER_BIT, modes[mode]);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void blit(int srcX, int srcY,
|
inline void blit(int srcX, int srcY,
|
||||||
int dstX, int dstY,
|
int dstX, int dstY,
|
||||||
int srcW, int srcH)
|
int srcW, int srcH,
|
||||||
|
BlitMode mode = Nearest)
|
||||||
{
|
{
|
||||||
blit(srcX, srcY, srcW, srcH, dstX, dstY, srcW, srcH);
|
blit(srcX, srcY, srcW, srcH, dstX, dstY, srcW, srcH, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Vec4 getPixel(int x, int y)
|
inline Vec4 getPixel(int x, int y)
|
||||||
|
|
|
@ -537,7 +537,7 @@ struct GraphicsPrivate
|
||||||
{
|
{
|
||||||
scSize = winSize;
|
scSize = winSize;
|
||||||
|
|
||||||
if (!gState->config().fixedAspectRatio)
|
if (!threadData->config.fixedAspectRatio)
|
||||||
{
|
{
|
||||||
scOffset = Vec2i(0, 0);
|
scOffset = Vec2i(0, 0);
|
||||||
return;
|
return;
|
||||||
|
@ -591,7 +591,8 @@ struct GraphicsPrivate
|
||||||
void blitBufferFlippedScaled()
|
void blitBufferFlippedScaled()
|
||||||
{
|
{
|
||||||
FBO::blit(0, 0, scRes.x, scRes.y,
|
FBO::blit(0, 0, scRes.x, scRes.y,
|
||||||
scOffset.x, scSize.y+scOffset.y, scSize.x, -scSize.y);
|
scOffset.x, scSize.y+scOffset.y, scSize.x, -scSize.y,
|
||||||
|
threadData->config.smoothScaling ? FBO::Linear : FBO::Nearest);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Blits currently bound read FBO to screen (upside-down) */
|
/* Blits currently bound read FBO to screen (upside-down) */
|
||||||
|
|
Loading…
Reference in New Issue