Implement smooth scaling
This commit is contained in:
		
							parent
							
								
									7f604e25ad
								
							
						
					
					
						commit
						da4e0fbed0
					
				
					 5 changed files with 25 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -3,6 +3,7 @@ debugMode=true
 | 
			
		|||
winResizable=true
 | 
			
		||||
fullscreen=false
 | 
			
		||||
fixedAspectRatio=false
 | 
			
		||||
smoothScaling=false
 | 
			
		||||
vsync=true
 | 
			
		||||
defScreenW=640
 | 
			
		||||
defScreenH=480
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -33,6 +33,7 @@ Config::Config()
 | 
			
		|||
      winResizable(false),
 | 
			
		||||
      fullscreen(false),
 | 
			
		||||
      fixedAspectRatio(false),
 | 
			
		||||
      smoothScaling(false),
 | 
			
		||||
      vsync(false),
 | 
			
		||||
      defScreenW(640),
 | 
			
		||||
      defScreenH(480),
 | 
			
		||||
| 
						 | 
				
			
			@ -50,6 +51,7 @@ void Config::read()
 | 
			
		|||
	READ_VAL(winResizable, Bool);
 | 
			
		||||
	READ_VAL(fullscreen, Bool);
 | 
			
		||||
	READ_VAL(fixedAspectRatio, Bool);
 | 
			
		||||
	READ_VAL(smoothScaling, Bool);
 | 
			
		||||
	READ_VAL(vsync, Bool);
 | 
			
		||||
	READ_VAL(defScreenW, Int);
 | 
			
		||||
	READ_VAL(defScreenH, Int);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,6 +34,7 @@ struct Config
 | 
			
		|||
	bool winResizable;
 | 
			
		||||
	bool fullscreen;
 | 
			
		||||
	bool fixedAspectRatio;
 | 
			
		||||
	bool smoothScaling;
 | 
			
		||||
	bool vsync;
 | 
			
		||||
 | 
			
		||||
	int defScreenW;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -147,6 +147,12 @@ namespace FBO
 | 
			
		|||
		Read = 1
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	enum BlitMode
 | 
			
		||||
	{
 | 
			
		||||
		Nearest = 0,
 | 
			
		||||
		Linear  = 1
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	inline ID gen()
 | 
			
		||||
	{
 | 
			
		||||
		ID id;
 | 
			
		||||
| 
						 | 
				
			
			@ -189,18 +195,26 @@ namespace FBO
 | 
			
		|||
	inline void blit(int srcX, int srcY,
 | 
			
		||||
	                 int srcW, int srcH,
 | 
			
		||||
	                 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,
 | 
			
		||||
		                     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,
 | 
			
		||||
					 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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -537,7 +537,7 @@ struct GraphicsPrivate
 | 
			
		|||
	{
 | 
			
		||||
		scSize = winSize;
 | 
			
		||||
 | 
			
		||||
		if (!gState->config().fixedAspectRatio)
 | 
			
		||||
		if (!threadData->config.fixedAspectRatio)
 | 
			
		||||
		{
 | 
			
		||||
			scOffset = Vec2i(0, 0);
 | 
			
		||||
			return;
 | 
			
		||||
| 
						 | 
				
			
			@ -591,7 +591,8 @@ struct GraphicsPrivate
 | 
			
		|||
	void blitBufferFlippedScaled()
 | 
			
		||||
	{
 | 
			
		||||
		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) */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue