2015-06-21 18:33:46 +03:00
/**
* Original code : automated SDL platform test written by Edgar Simo " bobbens "
* Extended and extensively updated by aschiffler at ferzkopp dot net
*/
2022-11-27 07:43:38 +03:00
# include <SDL3/SDL.h>
# include <SDL3/SDL_test.h>
2023-01-26 21:23:57 +03:00
# include "testautomation_images.h"
2023-03-08 18:12:45 +03:00
# include "testautomation_suites.h"
2015-06-21 18:33:46 +03:00
/* ================= Test Case Implementation ================== */
2022-11-30 23:51:59 +03:00
# define TESTRENDER_SCREEN_W 80
# define TESTRENDER_SCREEN_H 60
2015-06-21 18:33:46 +03:00
2022-12-01 19:04:02 +03:00
2022-11-30 23:51:59 +03:00
# define RENDER_COMPARE_FORMAT SDL_PIXELFORMAT_ARGB8888
2023-01-27 01:49:23 +03:00
# define RENDER_COLOR_CLEAR 0xFF000000
2023-01-27 00:58:38 +03:00
# define RENDER_COLOR_GREEN 0xFF00FF00
2015-06-21 18:33:46 +03:00
# define ALLOWABLE_ERROR_OPAQUE 0
2024-07-03 20:02:52 +03:00
# define ALLOWABLE_ERROR_BLENDED 0
2015-06-21 18:33:46 +03:00
2023-02-05 20:08:33 +03:00
# define CHECK_FUNC(FUNC, PARAMS) \
{ \
int result = FUNC PARAMS ; \
if ( result ! = 0 ) { \
SDLTest_AssertCheck ( result = = 0 , " Validate result from %s, expected: 0, got: %i, %s " , # FUNC , result , SDL_GetError ( ) ) ; \
} \
}
2015-06-21 18:33:46 +03:00
/* Test window and renderer */
2023-03-08 18:12:45 +03:00
static SDL_Window * window = NULL ;
static SDL_Renderer * renderer = NULL ;
2015-06-21 18:33:46 +03:00
/* Prototypes for helper functions */
2022-12-30 00:58:16 +03:00
static int clearScreen ( void ) ;
static void compare ( SDL_Surface * reference , int allowable_error ) ;
static SDL_Texture * loadTestFace ( void ) ;
static int hasDrawColor ( void ) ;
static int isSupported ( int code ) ;
2015-06-21 18:33:46 +03:00
/**
* Create software renderer for tests
*/
2023-03-08 18:12:45 +03:00
static void InitCreateRenderer ( void * arg )
2015-06-21 18:33:46 +03:00
{
2023-03-06 01:44:38 +03:00
int width = 320 , height = 240 ;
2024-04-04 22:39:24 +03:00
const char * renderer_name = NULL ;
2022-11-30 23:51:59 +03:00
renderer = NULL ;
2023-03-06 01:44:38 +03:00
window = SDL_CreateWindow ( " render_testCreateRenderer " , width , height , 0 ) ;
2022-11-30 23:51:59 +03:00
SDLTest_AssertPass ( " SDL_CreateWindow() " ) ;
SDLTest_AssertCheck ( window ! = NULL , " Check SDL_CreateWindow result " ) ;
if ( window = = NULL ) {
return ;
}
2024-05-13 20:31:55 +03:00
renderer = SDL_CreateRenderer ( window , renderer_name ) ;
2022-11-30 23:51:59 +03:00
SDLTest_AssertPass ( " SDL_CreateRenderer() " ) ;
2024-01-08 21:34:28 +03:00
SDLTest_AssertCheck ( renderer ! = NULL , " Check SDL_CreateRenderer result: %s " , renderer ! = NULL ? " success " : SDL_GetError ( ) ) ;
2022-11-30 23:51:59 +03:00
if ( renderer = = NULL ) {
SDL_DestroyWindow ( window ) ;
return ;
}
2015-06-21 18:33:46 +03:00
}
2023-02-02 02:21:53 +03:00
/**
2015-06-21 18:33:46 +03:00
* Destroy renderer for tests
*/
2023-03-08 18:12:45 +03:00
static void CleanupDestroyRenderer ( void * arg )
2015-06-21 18:33:46 +03:00
{
2023-11-10 00:29:15 +03:00
if ( renderer ) {
2022-11-30 23:51:59 +03:00
SDL_DestroyRenderer ( renderer ) ;
renderer = NULL ;
SDLTest_AssertPass ( " SDL_DestroyRenderer() " ) ;
}
2023-11-10 00:29:15 +03:00
if ( window ) {
2022-11-30 23:51:59 +03:00
SDL_DestroyWindow ( window ) ;
window = NULL ;
SDLTest_AssertPass ( " SDL_DestroyWindow " ) ;
}
2015-06-21 18:33:46 +03:00
}
/**
2023-11-06 18:26:06 +03:00
* Tests call to SDL_GetNumRenderDrivers
2015-06-21 18:33:46 +03:00
*
2023-02-02 02:21:53 +03:00
* \ sa SDL_GetNumRenderDrivers
2015-06-21 18:33:46 +03:00
*/
2023-03-08 18:12:45 +03:00
static int render_testGetNumRenderDrivers ( void * arg )
2015-06-21 18:33:46 +03:00
{
2022-11-30 23:51:59 +03:00
int n ;
n = SDL_GetNumRenderDrivers ( ) ;
SDLTest_AssertCheck ( n > = 1 , " Number of renderers >= 1, reported as %i " , n ) ;
return TEST_COMPLETED ;
2015-06-21 18:33:46 +03:00
}
/**
2023-11-06 18:26:06 +03:00
* Tests the SDL primitives for rendering .
2015-06-21 18:33:46 +03:00
*
2023-02-02 02:21:53 +03:00
* \ sa SDL_SetRenderDrawColor
* \ sa SDL_RenderFillRect
* \ sa SDL_RenderLine
2015-06-21 18:33:46 +03:00
*
*/
2023-03-08 18:12:45 +03:00
static int render_testPrimitives ( void * arg )
2015-06-21 18:33:46 +03:00
{
2022-11-30 23:51:59 +03:00
int ret ;
int x , y ;
2022-12-31 22:19:32 +03:00
SDL_FRect rect ;
2022-11-30 23:51:59 +03:00
SDL_Surface * referenceSurface = NULL ;
int checkFailCount1 ;
int checkFailCount2 ;
/* Clear surface. */
2022-12-30 00:58:16 +03:00
clearScreen ( ) ;
2022-11-30 23:51:59 +03:00
/* Need drawcolor or just skip test. */
2024-07-15 23:42:06 +03:00
SDLTest_AssertCheck ( hasDrawColor ( ) , " hasDrawColor " ) ;
2022-11-30 23:51:59 +03:00
/* Draw a rectangle. */
2022-12-31 22:19:32 +03:00
rect . x = 40.0f ;
rect . y = 0.0f ;
rect . w = 40.0f ;
rect . h = 80.0f ;
2022-11-30 23:51:59 +03:00
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_SetRenderDrawColor , ( renderer , 13 , 73 , 200 , SDL_ALPHA_OPAQUE ) )
CHECK_FUNC ( SDL_RenderFillRect , ( renderer , & rect ) )
2022-11-30 23:51:59 +03:00
/* Draw a rectangle. */
2022-12-31 22:19:32 +03:00
rect . x = 10.0f ;
rect . y = 10.0f ;
rect . w = 60.0f ;
rect . h = 40.0f ;
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_SetRenderDrawColor , ( renderer , 200 , 0 , 100 , SDL_ALPHA_OPAQUE ) )
CHECK_FUNC ( SDL_RenderFillRect , ( renderer , & rect ) )
2022-11-30 23:51:59 +03:00
/* Draw some points like so:
* X . X . X . X . .
* . X . X . X . X .
* X . X . X . X . . */
checkFailCount1 = 0 ;
checkFailCount2 = 0 ;
for ( y = 0 ; y < 3 ; y + + ) {
for ( x = y % 2 ; x < TESTRENDER_SCREEN_W ; x + = 2 ) {
2024-02-03 22:23:16 +03:00
ret = SDL_SetRenderDrawColor ( renderer , ( Uint8 ) ( x * y ) , ( Uint8 ) ( x * y / 2 ) , ( Uint8 ) ( x * y / 3 ) , SDL_ALPHA_OPAQUE ) ;
2022-11-30 23:51:59 +03:00
if ( ret ! = 0 ) {
checkFailCount1 + + ;
}
2024-06-13 05:08:06 +03:00
ret = SDL_RenderPoint ( renderer , ( float ) x , ( float ) y ) ;
2022-11-30 23:51:59 +03:00
if ( ret ! = 0 ) {
checkFailCount2 + + ;
}
}
}
SDLTest_AssertCheck ( checkFailCount1 = = 0 , " Validate results from calls to SDL_SetRenderDrawColor, expected: 0, got: %i " , checkFailCount1 ) ;
2022-12-27 17:21:13 +03:00
SDLTest_AssertCheck ( checkFailCount2 = = 0 , " Validate results from calls to SDL_RenderPoint, expected: 0, got: %i " , checkFailCount2 ) ;
2022-11-30 23:51:59 +03:00
/* Draw some lines. */
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_SetRenderDrawColor , ( renderer , 0 , 255 , 0 , SDL_ALPHA_OPAQUE ) )
2024-06-12 19:21:02 +03:00
CHECK_FUNC ( SDL_RenderLine , ( renderer , 0.0f , 30.0f , TESTRENDER_SCREEN_W , 30.0f ) )
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_SetRenderDrawColor , ( renderer , 55 , 55 , 5 , SDL_ALPHA_OPAQUE ) )
CHECK_FUNC ( SDL_RenderLine , ( renderer , 40.0f , 30.0f , 40.0f , 60.0f ) )
CHECK_FUNC ( SDL_SetRenderDrawColor , ( renderer , 5 , 105 , 105 , SDL_ALPHA_OPAQUE ) )
CHECK_FUNC ( SDL_RenderLine , ( renderer , 0.0f , 0.0f , 29.0f , 29.0f ) )
CHECK_FUNC ( SDL_RenderLine , ( renderer , 29.0f , 30.0f , 0.0f , 59.0f ) )
CHECK_FUNC ( SDL_RenderLine , ( renderer , 79.0f , 0.0f , 50.0f , 29.0f ) )
CHECK_FUNC ( SDL_RenderLine , ( renderer , 79.0f , 59.0f , 50.0f , 30.0f ) )
2022-11-30 23:51:59 +03:00
/* See if it's the same. */
referenceSurface = SDLTest_ImagePrimitives ( ) ;
2022-12-30 00:58:16 +03:00
compare ( referenceSurface , ALLOWABLE_ERROR_OPAQUE ) ;
2022-11-30 23:51:59 +03:00
/* Make current */
SDL_RenderPresent ( renderer ) ;
/* Clean up. */
2022-12-27 17:36:39 +03:00
SDL_DestroySurface ( referenceSurface ) ;
2022-11-30 23:51:59 +03:00
referenceSurface = NULL ;
return TEST_COMPLETED ;
2015-06-21 18:33:46 +03:00
}
2024-01-20 03:28:00 +03:00
/**
* Tests the SDL primitives for rendering within a viewport .
*
* \ sa SDL_SetRenderDrawColor
* \ sa SDL_RenderFillRect
* \ sa SDL_RenderLine
*
*/
static int render_testPrimitivesWithViewport ( void * arg )
{
2024-06-13 05:08:06 +03:00
SDL_Rect viewport ;
2024-02-03 21:18:12 +03:00
SDL_Surface * surface ;
2024-01-20 03:28:00 +03:00
/* Clear surface. */
clearScreen ( ) ;
viewport . x = 2 ;
viewport . y = 2 ;
viewport . w = 2 ;
viewport . h = 2 ;
CHECK_FUNC ( SDL_SetRenderViewport , ( renderer , & viewport ) ) ;
CHECK_FUNC ( SDL_SetRenderDrawColor , ( renderer , 255 , 255 , 255 , SDL_ALPHA_OPAQUE ) )
CHECK_FUNC ( SDL_RenderLine , ( renderer , 0.0f , 0.0f , 1.0f , 1.0f ) ) ;
viewport . x = 3 ;
viewport . y = 3 ;
viewport . w = 1 ;
viewport . h = 1 ;
CHECK_FUNC ( SDL_SetRenderViewport , ( renderer , & viewport ) ) ;
2024-02-03 21:18:12 +03:00
surface = SDL_RenderReadPixels ( renderer , NULL ) ;
if ( surface ) {
Uint8 r , g , b , a ;
CHECK_FUNC ( SDL_ReadSurfacePixel , ( surface , 0 , 0 , & r , & g , & b , & a ) ) ;
SDLTest_AssertCheck ( r = = 0xFF & & g = = 0xFF & & b = = 0xFF & & a = = 0xFF , " Validate diagonal line drawing with viewport, expected 0xFFFFFFFF, got 0x%.2x%.2x%.2x%.2x " , r , g , b , a ) ;
SDL_DestroySurface ( surface ) ;
} else {
SDLTest_AssertCheck ( surface ! = NULL , " Validate result from SDL_RenderReadPixels, got NULL, %s " , SDL_GetError ( ) ) ;
}
2024-01-20 03:28:00 +03:00
return TEST_COMPLETED ;
}
2015-06-21 18:33:46 +03:00
/**
2023-11-06 18:26:06 +03:00
* Tests some blitting routines .
2015-06-21 18:33:46 +03:00
*
2023-02-02 02:21:53 +03:00
* \ sa SDL_RenderTexture
* \ sa SDL_DestroyTexture
2015-06-21 18:33:46 +03:00
*/
2023-03-08 18:12:45 +03:00
static int render_testBlit ( void * arg )
2015-06-21 18:33:46 +03:00
{
2022-11-30 23:51:59 +03:00
int ret ;
2022-12-31 22:19:32 +03:00
SDL_FRect rect ;
2022-11-30 23:51:59 +03:00
SDL_Texture * tface ;
SDL_Surface * referenceSurface = NULL ;
2024-06-12 19:21:02 +03:00
float tw , th ;
float i , j , ni , nj ;
2022-11-30 23:51:59 +03:00
int checkFailCount1 ;
/* Clear surface. */
2022-12-30 00:58:16 +03:00
clearScreen ( ) ;
2022-11-30 23:51:59 +03:00
/* Need drawcolor or just skip test. */
2024-07-15 23:42:06 +03:00
SDLTest_AssertCheck ( hasDrawColor ( ) , " hasDrawColor) " ) ;
2022-11-30 23:51:59 +03:00
/* Create face surface. */
2022-12-30 00:58:16 +03:00
tface = loadTestFace ( ) ;
SDLTest_AssertCheck ( tface ! = NULL , " Verify loadTestFace() result " ) ;
2022-11-30 23:51:59 +03:00
if ( tface = = NULL ) {
return TEST_ABORTED ;
}
/* Constant values. */
2024-06-12 19:21:02 +03:00
CHECK_FUNC ( SDL_GetTextureSize , ( tface , & tw , & th ) )
rect . w = tw ;
rect . h = th ;
2022-11-30 23:51:59 +03:00
ni = TESTRENDER_SCREEN_W - tw ;
nj = TESTRENDER_SCREEN_H - th ;
/* Loop blit. */
checkFailCount1 = 0 ;
for ( j = 0 ; j < = nj ; j + = 4 ) {
for ( i = 0 ; i < = ni ; i + = 4 ) {
/* Blitting. */
2024-06-12 19:21:02 +03:00
rect . x = i ;
rect . y = j ;
2022-12-27 17:21:13 +03:00
ret = SDL_RenderTexture ( renderer , tface , NULL , & rect ) ;
2022-11-30 23:51:59 +03:00
if ( ret ! = 0 ) {
checkFailCount1 + + ;
}
}
}
2022-12-27 17:21:13 +03:00
SDLTest_AssertCheck ( checkFailCount1 = = 0 , " Validate results from calls to SDL_RenderTexture, expected: 0, got: %i " , checkFailCount1 ) ;
2022-11-30 23:51:59 +03:00
/* See if it's the same */
referenceSurface = SDLTest_ImageBlit ( ) ;
2022-12-30 00:58:16 +03:00
compare ( referenceSurface , ALLOWABLE_ERROR_OPAQUE ) ;
2022-11-30 23:51:59 +03:00
/* Make current */
SDL_RenderPresent ( renderer ) ;
/* Clean up. */
SDL_DestroyTexture ( tface ) ;
2022-12-27 17:36:39 +03:00
SDL_DestroySurface ( referenceSurface ) ;
2022-11-30 23:51:59 +03:00
referenceSurface = NULL ;
return TEST_COMPLETED ;
2015-06-21 18:33:46 +03:00
}
/**
2023-11-06 18:26:06 +03:00
* Blits doing color tests .
2015-06-21 18:33:46 +03:00
*
2023-02-02 02:21:53 +03:00
* \ sa SDL_SetTextureColorMod
* \ sa SDL_RenderTexture
* \ sa SDL_DestroyTexture
2015-06-21 18:33:46 +03:00
*/
2023-03-08 18:12:45 +03:00
static int render_testBlitColor ( void * arg )
2015-06-21 18:33:46 +03:00
{
2022-11-30 23:51:59 +03:00
int ret ;
2022-12-31 22:19:32 +03:00
SDL_FRect rect ;
2022-11-30 23:51:59 +03:00
SDL_Texture * tface ;
SDL_Surface * referenceSurface = NULL ;
2024-06-12 19:21:02 +03:00
float tw , th ;
2022-11-30 23:51:59 +03:00
int i , j , ni , nj ;
int checkFailCount1 ;
int checkFailCount2 ;
/* Clear surface. */
2022-12-30 00:58:16 +03:00
clearScreen ( ) ;
2022-11-30 23:51:59 +03:00
/* Create face surface. */
2022-12-30 00:58:16 +03:00
tface = loadTestFace ( ) ;
SDLTest_AssertCheck ( tface ! = NULL , " Verify loadTestFace() result " ) ;
2022-11-30 23:51:59 +03:00
if ( tface = = NULL ) {
return TEST_ABORTED ;
}
/* Constant values. */
2024-06-12 19:21:02 +03:00
CHECK_FUNC ( SDL_GetTextureSize , ( tface , & tw , & th ) )
rect . w = tw ;
rect . h = th ;
ni = TESTRENDER_SCREEN_W - ( int ) tw ;
nj = TESTRENDER_SCREEN_H - ( int ) th ;
2022-11-30 23:51:59 +03:00
/* Test blitting with color mod. */
checkFailCount1 = 0 ;
checkFailCount2 = 0 ;
for ( j = 0 ; j < = nj ; j + = 4 ) {
for ( i = 0 ; i < = ni ; i + = 4 ) {
/* Set color mod. */
2024-02-03 22:23:16 +03:00
ret = SDL_SetTextureColorMod ( tface , ( Uint8 ) ( ( 255 / nj ) * j ) , ( Uint8 ) ( ( 255 / ni ) * i ) , ( Uint8 ) ( ( 255 / nj ) * j ) ) ;
2022-11-30 23:51:59 +03:00
if ( ret ! = 0 ) {
checkFailCount1 + + ;
}
/* Blitting. */
2024-06-13 05:08:06 +03:00
rect . x = ( float ) i ;
rect . y = ( float ) j ;
2022-12-27 17:21:13 +03:00
ret = SDL_RenderTexture ( renderer , tface , NULL , & rect ) ;
2022-11-30 23:51:59 +03:00
if ( ret ! = 0 ) {
checkFailCount2 + + ;
}
}
}
SDLTest_AssertCheck ( checkFailCount1 = = 0 , " Validate results from calls to SDL_SetTextureColorMod, expected: 0, got: %i " , checkFailCount1 ) ;
2022-12-27 17:21:13 +03:00
SDLTest_AssertCheck ( checkFailCount2 = = 0 , " Validate results from calls to SDL_RenderTexture, expected: 0, got: %i " , checkFailCount2 ) ;
2022-11-30 23:51:59 +03:00
/* See if it's the same. */
referenceSurface = SDLTest_ImageBlitColor ( ) ;
2022-12-30 00:58:16 +03:00
compare ( referenceSurface , ALLOWABLE_ERROR_OPAQUE ) ;
2022-11-30 23:51:59 +03:00
/* Make current */
SDL_RenderPresent ( renderer ) ;
/* Clean up. */
SDL_DestroyTexture ( tface ) ;
2022-12-27 17:36:39 +03:00
SDL_DestroySurface ( referenceSurface ) ;
2022-11-30 23:51:59 +03:00
referenceSurface = NULL ;
return TEST_COMPLETED ;
2015-06-21 18:33:46 +03:00
}
2024-07-15 23:42:06 +03:00
typedef enum TestRenderOperation
{
TEST_RENDER_POINT ,
TEST_RENDER_LINE ,
TEST_RENDER_RECT ,
TEST_RENDER_COPY_XRGB ,
TEST_RENDER_COPY_ARGB ,
} TestRenderOperation ;
2015-06-21 18:33:46 +03:00
/**
2024-07-15 23:42:06 +03:00
* Helper that tests a specific operation and blend mode , - 1 for color mod , - 2 for alpha mod
2015-06-21 18:33:46 +03:00
*/
2024-07-15 23:42:06 +03:00
static void testBlendModeOperation ( TestRenderOperation op , int mode , SDL_PixelFormat dst_format )
2015-06-21 18:33:46 +03:00
{
2024-07-15 23:42:06 +03:00
/* Allow up to 2 delta from theoretical value to account for rounding error.
* We allow 2 rounding errors because the software renderer breaks drawing operations into alpha multiplication and a separate blend operation .
*/
const int MAXIMUM_ERROR = 2 ;
2022-11-30 23:51:59 +03:00
int ret ;
2024-07-15 23:42:06 +03:00
SDL_Texture * src = NULL ;
SDL_Texture * dst ;
SDL_Surface * result ;
Uint8 srcR = 10 , srcG = 128 , srcB = 240 , srcA = 100 ;
Uint8 dstR = 128 , dstG = 128 , dstB = 128 , dstA = 128 ;
Uint8 expectedR , expectedG , expectedB , expectedA ;
Uint8 actualR , actualG , actualB , actualA ;
int deltaR , deltaG , deltaB , deltaA ;
const char * operation = " UNKNOWN " ;
const char * mode_name = " UNKNOWN " ;
/* Create dst surface */
dst = SDL_CreateTexture ( renderer , dst_format , SDL_TEXTUREACCESS_TARGET , 3 , 3 ) ;
SDLTest_AssertCheck ( dst ! = NULL , " Verify dst surface is not NULL " ) ;
if ( dst = = NULL ) {
return ;
}
2024-07-17 04:00:20 +03:00
if ( SDL_ISPIXELFORMAT_ALPHA ( dst_format ) ) {
2024-07-17 19:40:25 +03:00
SDL_BlendMode blendMode = SDL_BLENDMODE_NONE ;
ret = SDL_GetTextureBlendMode ( dst , & blendMode ) ;
SDLTest_AssertCheck ( ret = = 0 , " Verify result from SDL_GetTextureBlendMode(), expected: 0, got: %i " , ret ) ;
2024-07-17 04:00:20 +03:00
SDLTest_AssertCheck ( blendMode = = SDL_BLENDMODE_BLEND , " Verify alpha texture blend mode, expected %d, got % " SDL_PRIu32 , SDL_BLENDMODE_BLEND , blendMode ) ;
}
2022-11-30 23:51:59 +03:00
2024-07-15 23:42:06 +03:00
/* Set as render target */
SDL_SetRenderTarget ( renderer , dst ) ;
2022-11-30 23:51:59 +03:00
2024-07-15 23:42:06 +03:00
/* Clear surface. */
if ( ! SDL_ISPIXELFORMAT_ALPHA ( dst_format ) ) {
dstA = 255 ;
2022-11-30 23:51:59 +03:00
}
2024-07-15 23:42:06 +03:00
ret = SDL_SetRenderDrawColor ( renderer , dstR , dstG , dstB , dstA ) ;
SDLTest_AssertCheck ( ret = = 0 , " Verify result from SDL_SetRenderDrawColor(), expected: 0, got: %i " , ret ) ;
ret = SDL_RenderClear ( renderer ) ;
SDLTest_AssertPass ( " Call to SDL_RenderClear() " ) ;
SDLTest_AssertCheck ( ret = = 0 , " Verify result from SDL_RenderClear, expected: 0, got: %i " , ret ) ;
2022-11-30 23:51:59 +03:00
2024-07-15 23:42:06 +03:00
if ( op = = TEST_RENDER_COPY_XRGB | | op = = TEST_RENDER_COPY_ARGB ) {
Uint8 pixels [ 4 ] ;
2022-11-30 23:51:59 +03:00
2024-07-15 23:42:06 +03:00
/* Create src surface */
src = SDL_CreateTexture ( renderer , op = = TEST_RENDER_COPY_XRGB ? SDL_PIXELFORMAT_RGBX32 : SDL_PIXELFORMAT_RGBA32 , SDL_TEXTUREACCESS_STATIC , 1 , 1 ) ;
SDLTest_AssertCheck ( src ! = NULL , " Verify src surface is not NULL " ) ;
if ( src = = NULL ) {
return ;
}
2022-11-30 23:51:59 +03:00
2024-07-15 23:42:06 +03:00
/* Clear surface. */
if ( op = = TEST_RENDER_COPY_XRGB ) {
srcA = 255 ;
}
pixels [ 0 ] = srcR ;
pixels [ 1 ] = srcG ;
pixels [ 2 ] = srcB ;
pixels [ 3 ] = srcA ;
SDL_UpdateTexture ( src , NULL , pixels , sizeof ( pixels ) ) ;
/* Set blend mode. */
if ( mode > = 0 ) {
ret = SDL_SetTextureBlendMode ( src , ( SDL_BlendMode ) mode ) ;
SDLTest_AssertPass ( " Call to SDL_SetTextureBlendMode() " ) ;
SDLTest_AssertCheck ( ret = = 0 , " Verify result from SDL_SetTextureBlendMode(..., %i), expected: 0, got: %i " , mode , ret ) ;
} else {
ret = SDL_SetTextureBlendMode ( src , SDL_BLENDMODE_BLEND ) ;
SDLTest_AssertPass ( " Call to SDL_SetTextureBlendMode() " ) ;
SDLTest_AssertCheck ( ret = = 0 , " Verify result from SDL_SetTextureBlendMode(..., %i), expected: 0, got: %i " , mode , ret ) ;
}
} else {
/* Set draw color */
ret = SDL_SetRenderDrawColor ( renderer , srcR , srcG , srcB , srcA ) ;
SDLTest_AssertCheck ( ret = = 0 , " Verify result from SDL_SetRenderDrawColor(), expected: 0, got: %i " , ret ) ;
/* Set blend mode. */
if ( mode > = 0 ) {
ret = SDL_SetRenderDrawBlendMode ( renderer , ( SDL_BlendMode ) mode ) ;
SDLTest_AssertPass ( " Call to SDL_SetRenderDrawBlendMode() " ) ;
SDLTest_AssertCheck ( ret = = 0 , " Verify result from SDL_SetRenderDrawBlendMode(..., %i), expected: 0, got: %i " , mode , ret ) ;
} else {
ret = SDL_SetRenderDrawBlendMode ( renderer , SDL_BLENDMODE_BLEND ) ;
SDLTest_AssertPass ( " Call to SDL_SetRenderDrawBlendMode() " ) ;
SDLTest_AssertCheck ( ret = = 0 , " Verify result from SDL_SetRenderDrawBlendMode(..., %i), expected: 0, got: %i " , mode , ret ) ;
2022-11-30 23:51:59 +03:00
}
}
2024-07-15 23:42:06 +03:00
/* Test blend mode. */
# define FLOAT(X) ((float)X / 255.0f)
switch ( mode ) {
case - 1 :
mode_name = " color modulation " ;
ret = SDL_SetTextureColorMod ( src , srcR , srcG , srcB ) ;
SDLTest_AssertCheck ( ret = = 0 , " Validate results from calls to SDL_SetTextureColorMod, expected: 0, got: %i " , ret ) ;
expectedR = ( Uint8 ) SDL_roundf ( SDL_clamp ( ( FLOAT ( srcR ) * FLOAT ( srcR ) ) * FLOAT ( srcA ) + FLOAT ( dstR ) * ( 1.0f - FLOAT ( srcA ) ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedG = ( Uint8 ) SDL_roundf ( SDL_clamp ( ( FLOAT ( srcG ) * FLOAT ( srcG ) ) * FLOAT ( srcA ) + FLOAT ( dstG ) * ( 1.0f - FLOAT ( srcA ) ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedB = ( Uint8 ) SDL_roundf ( SDL_clamp ( ( FLOAT ( srcB ) * FLOAT ( srcB ) ) * FLOAT ( srcA ) + FLOAT ( dstB ) * ( 1.0f - FLOAT ( srcA ) ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedA = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcA ) + FLOAT ( dstA ) * ( 1.0f - FLOAT ( srcA ) ) , 0.0f , 1.0f ) * 255.0f ) ;
break ;
case - 2 :
mode_name = " alpha modulation " ;
ret = SDL_SetTextureAlphaMod ( src , srcA ) ;
SDLTest_AssertCheck ( ret = = 0 , " Validate results from calls to SDL_SetTextureAlphaMod, expected: 0, got: %i " , ret ) ;
expectedR = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcR ) * ( FLOAT ( srcA ) * FLOAT ( srcA ) ) + FLOAT ( dstR ) * ( 1.0f - ( FLOAT ( srcA ) * FLOAT ( srcA ) ) ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedG = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcG ) * ( FLOAT ( srcA ) * FLOAT ( srcA ) ) + FLOAT ( dstG ) * ( 1.0f - ( FLOAT ( srcA ) * FLOAT ( srcA ) ) ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedB = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcB ) * ( FLOAT ( srcA ) * FLOAT ( srcA ) ) + FLOAT ( dstB ) * ( 1.0f - ( FLOAT ( srcA ) * FLOAT ( srcA ) ) ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedA = ( Uint8 ) SDL_roundf ( SDL_clamp ( ( FLOAT ( srcA ) * FLOAT ( srcA ) ) + FLOAT ( dstA ) * ( 1.0f - ( FLOAT ( srcA ) * FLOAT ( srcA ) ) ) , 0.0f , 1.0f ) * 255.0f ) ;
break ;
case SDL_BLENDMODE_NONE :
mode_name = " SDL_BLENDMODE_NONE " ;
expectedR = srcR ;
expectedG = srcG ;
expectedB = srcB ;
expectedA = SDL_ISPIXELFORMAT_ALPHA ( dst_format ) ? srcA : 255 ;
break ;
case SDL_BLENDMODE_BLEND :
mode_name = " SDL_BLENDMODE_BLEND " ;
expectedR = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcR ) * FLOAT ( srcA ) + FLOAT ( dstR ) * ( 1.0f - FLOAT ( srcA ) ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedG = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcG ) * FLOAT ( srcA ) + FLOAT ( dstG ) * ( 1.0f - FLOAT ( srcA ) ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedB = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcB ) * FLOAT ( srcA ) + FLOAT ( dstB ) * ( 1.0f - FLOAT ( srcA ) ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedA = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcA ) + FLOAT ( dstA ) * ( 1.0f - FLOAT ( srcA ) ) , 0.0f , 1.0f ) * 255.0f ) ;
break ;
case SDL_BLENDMODE_BLEND_PREMULTIPLIED :
mode_name = " SDL_BLENDMODE_BLEND_PREMULTIPLIED " ;
expectedR = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcR ) + FLOAT ( dstR ) * ( 1.0f - FLOAT ( srcA ) ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedG = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcG ) + FLOAT ( dstG ) * ( 1.0f - FLOAT ( srcA ) ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedB = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcB ) + FLOAT ( dstB ) * ( 1.0f - FLOAT ( srcA ) ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedA = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcA ) + FLOAT ( dstA ) * ( 1.0f - FLOAT ( srcA ) ) , 0.0f , 1.0f ) * 255.0f ) ;
break ;
case SDL_BLENDMODE_ADD :
mode_name = " SDL_BLENDMODE_ADD " ;
expectedR = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcR ) * FLOAT ( srcA ) + FLOAT ( dstR ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedG = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcG ) * FLOAT ( srcA ) + FLOAT ( dstG ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedB = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcB ) * FLOAT ( srcA ) + FLOAT ( dstB ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedA = dstA ;
break ;
case SDL_BLENDMODE_ADD_PREMULTIPLIED :
mode_name = " SDL_BLENDMODE_ADD_PREMULTIPLIED " ;
expectedR = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcR ) + FLOAT ( dstR ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedG = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcG ) + FLOAT ( dstG ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedB = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcB ) + FLOAT ( dstB ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedA = dstA ;
break ;
case SDL_BLENDMODE_MOD :
mode_name = " SDL_BLENDMODE_MOD " ;
expectedR = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcR ) * FLOAT ( dstR ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedG = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcG ) * FLOAT ( dstG ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedB = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcB ) * FLOAT ( dstB ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedA = dstA ;
break ;
case SDL_BLENDMODE_MUL :
mode_name = " SDL_BLENDMODE_MUL " ;
expectedR = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcR ) * FLOAT ( dstR ) + FLOAT ( dstR ) * ( 1.0f - FLOAT ( srcA ) ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedG = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcG ) * FLOAT ( dstG ) + FLOAT ( dstG ) * ( 1.0f - FLOAT ( srcA ) ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedB = ( Uint8 ) SDL_roundf ( SDL_clamp ( FLOAT ( srcB ) * FLOAT ( dstB ) + FLOAT ( dstB ) * ( 1.0f - FLOAT ( srcA ) ) , 0.0f , 1.0f ) * 255.0f ) ;
expectedA = dstA ;
break ;
default :
SDLTest_LogError ( " Invalid blending mode: %d " , mode ) ;
return ;
}
2022-11-30 23:51:59 +03:00
2024-07-15 23:42:06 +03:00
switch ( op ) {
case TEST_RENDER_POINT :
operation = " render point " ;
ret = SDL_RenderPoint ( renderer , 0.0f , 0.0f ) ;
SDLTest_AssertCheck ( ret = = 0 , " Validate results from calls to SDL_RenderPoint, expected: 0, got: %i " , ret ) ;
break ;
case TEST_RENDER_LINE :
operation = " render line " ;
ret = SDL_RenderLine ( renderer , 0.0f , 0.0f , 2.0f , 2.0f ) ;
SDLTest_AssertCheck ( ret = = 0 , " Validate results from calls to SDL_RenderLine, expected: 0, got: %i " , ret ) ;
break ;
case TEST_RENDER_RECT :
operation = " render rect " ;
ret = SDL_RenderFillRect ( renderer , NULL ) ;
SDLTest_AssertCheck ( ret = = 0 , " Validate results from calls to SDL_RenderFillRect, expected: 0, got: %i " , ret ) ;
break ;
case TEST_RENDER_COPY_XRGB :
case TEST_RENDER_COPY_ARGB :
operation = ( op = = TEST_RENDER_COPY_XRGB ) ? " render XRGB " : " render ARGB " ;
ret = SDL_RenderTexture ( renderer , src , NULL , NULL ) ;
SDLTest_AssertCheck ( ret = = 0 , " Validate results from calls to SDL_RenderTexture, expected: 0, got: %i " , ret ) ;
break ;
default :
SDLTest_LogError ( " Invalid blending operation: %d " , op ) ;
return ;
}
2022-11-30 23:51:59 +03:00
2024-07-15 23:42:06 +03:00
result = SDL_RenderReadPixels ( renderer , NULL ) ;
SDL_ReadSurfacePixel ( result , 0 , 0 , & actualR , & actualG , & actualB , & actualA ) ;
deltaR = SDL_abs ( ( int ) actualR - expectedR ) ;
deltaG = SDL_abs ( ( int ) actualG - expectedG ) ;
deltaB = SDL_abs ( ( int ) actualB - expectedB ) ;
deltaA = SDL_abs ( ( int ) actualA - expectedA ) ;
SDLTest_AssertCheck (
deltaR < = MAXIMUM_ERROR & &
deltaG < = MAXIMUM_ERROR & &
deltaB < = MAXIMUM_ERROR & &
deltaA < = MAXIMUM_ERROR ,
" Checking %s %s operation results, expected %d,%d,%d,%d, got %d,%d,%d,%d " ,
operation , mode_name ,
expectedR , expectedG , expectedB , expectedA , actualR , actualG , actualB , actualA ) ;
/* Clean up */
SDL_DestroySurface ( result ) ;
SDL_DestroyTexture ( src ) ;
SDL_DestroyTexture ( dst ) ;
2015-06-21 18:33:46 +03:00
}
2024-07-15 23:42:06 +03:00
static void testBlendMode ( int mode )
2015-06-21 18:33:46 +03:00
{
2024-07-15 23:42:06 +03:00
const TestRenderOperation operations [ ] = {
TEST_RENDER_POINT ,
TEST_RENDER_LINE ,
TEST_RENDER_RECT ,
TEST_RENDER_COPY_XRGB ,
TEST_RENDER_COPY_ARGB
} ;
const SDL_PixelFormat dst_formats [ ] = {
SDL_PIXELFORMAT_XRGB8888 , SDL_PIXELFORMAT_ARGB8888
} ;
int i , j ;
2022-11-30 23:51:59 +03:00
2024-07-15 23:42:06 +03:00
for ( i = 0 ; i < SDL_arraysize ( operations ) ; + + i ) {
for ( j = 0 ; j < SDL_arraysize ( dst_formats ) ; + + j ) {
TestRenderOperation op = operations [ i ] ;
2022-11-30 23:51:59 +03:00
2024-07-15 23:42:06 +03:00
if ( mode < 0 ) {
if ( op ! = TEST_RENDER_COPY_XRGB & & op ! = TEST_RENDER_COPY_ARGB ) {
/* Unsupported mode for this operation */
continue ;
}
2022-11-30 23:51:59 +03:00
}
2024-07-15 23:42:06 +03:00
testBlendModeOperation ( op , mode , dst_formats [ j ] ) ;
2022-11-30 23:51:59 +03:00
}
}
2015-06-21 18:33:46 +03:00
}
/**
2024-07-15 23:42:06 +03:00
* Tests render operations with blend modes
2015-06-21 18:33:46 +03:00
*/
2024-07-15 23:42:06 +03:00
static int render_testBlendModes ( void * arg )
2015-06-21 18:33:46 +03:00
{
2024-07-15 23:42:06 +03:00
testBlendMode ( - 1 ) ;
testBlendMode ( - 2 ) ;
testBlendMode ( SDL_BLENDMODE_NONE ) ;
testBlendMode ( SDL_BLENDMODE_BLEND ) ;
testBlendMode ( SDL_BLENDMODE_BLEND_PREMULTIPLIED ) ;
testBlendMode ( SDL_BLENDMODE_ADD ) ;
testBlendMode ( SDL_BLENDMODE_ADD_PREMULTIPLIED ) ;
testBlendMode ( SDL_BLENDMODE_MOD ) ;
testBlendMode ( SDL_BLENDMODE_MUL ) ;
2022-11-30 23:51:59 +03:00
return TEST_COMPLETED ;
2015-06-21 18:33:46 +03:00
}
2023-01-27 00:58:38 +03:00
/**
2023-11-06 18:26:06 +03:00
* Test viewport
2023-01-27 00:58:38 +03:00
*/
2023-03-08 18:12:45 +03:00
static int render_testViewport ( void * arg )
2023-01-27 00:58:38 +03:00
{
2023-01-27 03:10:13 +03:00
SDL_Surface * referenceSurface ;
2024-06-13 05:08:06 +03:00
SDL_Rect viewport ;
2023-01-27 00:58:38 +03:00
2023-01-27 03:10:13 +03:00
viewport . x = TESTRENDER_SCREEN_W / 3 ;
viewport . y = TESTRENDER_SCREEN_H / 3 ;
viewport . w = TESTRENDER_SCREEN_W / 2 ;
viewport . h = TESTRENDER_SCREEN_H / 2 ;
2023-01-27 00:58:38 +03:00
2023-01-27 03:10:13 +03:00
/* Create expected result */
referenceSurface = SDL_CreateSurface ( TESTRENDER_SCREEN_W , TESTRENDER_SCREEN_H , RENDER_COMPARE_FORMAT ) ;
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_FillSurfaceRect , ( referenceSurface , NULL , RENDER_COLOR_CLEAR ) )
2024-06-13 05:08:06 +03:00
CHECK_FUNC ( SDL_FillSurfaceRect , ( referenceSurface , & viewport , RENDER_COLOR_GREEN ) )
2023-02-02 02:21:53 +03:00
2023-01-27 00:58:38 +03:00
/* Clear surface. */
clearScreen ( ) ;
2023-01-27 03:10:13 +03:00
/* Set the viewport and do a fill operation */
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_SetRenderViewport , ( renderer , & viewport ) )
CHECK_FUNC ( SDL_SetRenderDrawColor , ( renderer , 0 , 255 , 0 , SDL_ALPHA_OPAQUE ) )
CHECK_FUNC ( SDL_RenderFillRect , ( renderer , NULL ) )
CHECK_FUNC ( SDL_SetRenderViewport , ( renderer , NULL ) )
2023-01-27 00:58:38 +03:00
/* Check to see if final image matches. */
2023-01-27 01:49:23 +03:00
compare ( referenceSurface , ALLOWABLE_ERROR_OPAQUE ) ;
2023-01-27 03:10:13 +03:00
/*
* Verify that clear ignores the viewport
*/
/* Create expected result */
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_FillSurfaceRect , ( referenceSurface , NULL , RENDER_COLOR_GREEN ) )
2023-02-02 02:21:53 +03:00
2023-01-27 03:10:13 +03:00
/* Clear surface. */
clearScreen ( ) ;
/* Set the viewport and do a clear operation */
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_SetRenderViewport , ( renderer , & viewport ) )
CHECK_FUNC ( SDL_SetRenderDrawColor , ( renderer , 0 , 255 , 0 , SDL_ALPHA_OPAQUE ) )
CHECK_FUNC ( SDL_RenderClear , ( renderer ) )
CHECK_FUNC ( SDL_SetRenderViewport , ( renderer , NULL ) )
2023-01-27 03:10:13 +03:00
/* Check to see if final image matches. */
compare ( referenceSurface , ALLOWABLE_ERROR_OPAQUE ) ;
2023-01-27 01:49:23 +03:00
/* Make current */
SDL_RenderPresent ( renderer ) ;
SDL_DestroySurface ( referenceSurface ) ;
return TEST_COMPLETED ;
}
2024-02-25 20:44:41 +03:00
/**
* Test clip rect
*/
static int render_testClipRect ( void * arg )
{
SDL_Surface * referenceSurface ;
2024-06-13 05:08:06 +03:00
SDL_Rect cliprect ;
2024-02-25 20:44:41 +03:00
cliprect . x = TESTRENDER_SCREEN_W / 3 ;
cliprect . y = TESTRENDER_SCREEN_H / 3 ;
cliprect . w = TESTRENDER_SCREEN_W / 2 ;
cliprect . h = TESTRENDER_SCREEN_H / 2 ;
/* Create expected result */
referenceSurface = SDL_CreateSurface ( TESTRENDER_SCREEN_W , TESTRENDER_SCREEN_H , RENDER_COMPARE_FORMAT ) ;
CHECK_FUNC ( SDL_FillSurfaceRect , ( referenceSurface , NULL , RENDER_COLOR_CLEAR ) )
2024-06-13 05:08:06 +03:00
CHECK_FUNC ( SDL_FillSurfaceRect , ( referenceSurface , & cliprect , RENDER_COLOR_GREEN ) )
2024-02-25 20:44:41 +03:00
/* Clear surface. */
clearScreen ( ) ;
/* Set the cliprect and do a fill operation */
CHECK_FUNC ( SDL_SetRenderClipRect , ( renderer , & cliprect ) )
CHECK_FUNC ( SDL_SetRenderDrawColor , ( renderer , 0 , 255 , 0 , SDL_ALPHA_OPAQUE ) )
CHECK_FUNC ( SDL_RenderFillRect , ( renderer , NULL ) )
CHECK_FUNC ( SDL_SetRenderClipRect , ( renderer , NULL ) )
/* Check to see if final image matches. */
compare ( referenceSurface , ALLOWABLE_ERROR_OPAQUE ) ;
/*
* Verify that clear ignores the cliprect
*/
/* Create expected result */
CHECK_FUNC ( SDL_FillSurfaceRect , ( referenceSurface , NULL , RENDER_COLOR_GREEN ) )
/* Clear surface. */
clearScreen ( ) ;
/* Set the cliprect and do a clear operation */
CHECK_FUNC ( SDL_SetRenderClipRect , ( renderer , & cliprect ) )
CHECK_FUNC ( SDL_SetRenderDrawColor , ( renderer , 0 , 255 , 0 , SDL_ALPHA_OPAQUE ) )
CHECK_FUNC ( SDL_RenderClear , ( renderer ) )
CHECK_FUNC ( SDL_SetRenderClipRect , ( renderer , NULL ) )
/* Check to see if final image matches. */
compare ( referenceSurface , ALLOWABLE_ERROR_OPAQUE ) ;
/* Make current */
SDL_RenderPresent ( renderer ) ;
SDL_DestroySurface ( referenceSurface ) ;
return TEST_COMPLETED ;
}
2023-01-27 01:49:23 +03:00
/**
2023-11-06 18:26:06 +03:00
* Test logical size
2023-01-27 01:49:23 +03:00
*/
2023-03-08 18:12:45 +03:00
static int render_testLogicalSize ( void * arg )
2023-01-27 01:49:23 +03:00
{
2023-01-27 03:10:13 +03:00
SDL_Surface * referenceSurface ;
2024-06-13 05:08:06 +03:00
SDL_Rect viewport ;
2023-01-27 01:49:23 +03:00
SDL_FRect rect ;
2024-06-13 05:08:06 +03:00
int w , h ;
2024-06-30 00:12:50 +03:00
int set_w , set_h ;
SDL_RendererLogicalPresentation set_presentation_mode ;
SDL_ScaleMode set_scale_mode ;
SDL_FRect set_rect ;
2023-01-27 01:49:23 +03:00
const int factor = 2 ;
2023-01-27 03:10:13 +03:00
viewport . x = ( ( TESTRENDER_SCREEN_W / 4 ) / factor ) * factor ;
viewport . y = ( ( TESTRENDER_SCREEN_H / 4 ) / factor ) * factor ;
viewport . w = ( ( TESTRENDER_SCREEN_W / 2 ) / factor ) * factor ;
viewport . h = ( ( TESTRENDER_SCREEN_H / 2 ) / factor ) * factor ;
2023-01-27 01:49:23 +03:00
2023-01-27 03:10:13 +03:00
/* Create expected result */
referenceSurface = SDL_CreateSurface ( TESTRENDER_SCREEN_W , TESTRENDER_SCREEN_H , RENDER_COMPARE_FORMAT ) ;
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_FillSurfaceRect , ( referenceSurface , NULL , RENDER_COLOR_CLEAR ) )
2024-06-13 05:08:06 +03:00
CHECK_FUNC ( SDL_FillSurfaceRect , ( referenceSurface , & viewport , RENDER_COLOR_GREEN ) )
2023-02-02 02:21:53 +03:00
2023-01-27 01:49:23 +03:00
/* Clear surface. */
clearScreen ( ) ;
2023-01-27 03:10:13 +03:00
/* Set the logical size and do a fill operation */
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_GetCurrentRenderOutputSize , ( renderer , & w , & h ) )
CHECK_FUNC ( SDL_SetRenderLogicalPresentation , ( renderer , w / factor , h / factor ,
2023-02-03 23:25:46 +03:00
SDL_LOGICAL_PRESENTATION_LETTERBOX ,
2023-02-05 20:08:33 +03:00
SDL_SCALEMODE_NEAREST ) )
2024-06-30 00:12:50 +03:00
CHECK_FUNC ( SDL_GetRenderLogicalPresentation , ( renderer , & set_w , & set_h , & set_presentation_mode , & set_scale_mode ) )
SDLTest_AssertCheck (
set_w = = ( w / factor ) & &
set_h = = ( h / factor ) & &
set_presentation_mode = = SDL_LOGICAL_PRESENTATION_LETTERBOX & &
set_scale_mode = = SDL_SCALEMODE_NEAREST ,
" Validate result from SDL_GetRenderLogicalPresentation, got %d, %d, %d, %d " , set_w , set_h , set_presentation_mode , set_scale_mode ) ;
CHECK_FUNC ( SDL_GetRenderLogicalPresentationRect , ( renderer , & set_rect ) )
SDLTest_AssertCheck (
set_rect . x = = 0.0f & &
set_rect . y = = 0.0f & &
set_rect . w = = 320.0f & &
set_rect . h = = 240.0f ,
" Validate result from SDL_GetRenderLogicalPresentationRect, got {%g, %g, %gx%g} " , set_rect . x , set_rect . y , set_rect . w , set_rect . h ) ;
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_SetRenderDrawColor , ( renderer , 0 , 255 , 0 , SDL_ALPHA_OPAQUE ) )
2024-06-13 05:08:06 +03:00
rect . x = ( float ) viewport . x / factor ;
rect . y = ( float ) viewport . y / factor ;
rect . w = ( float ) viewport . w / factor ;
rect . h = ( float ) viewport . h / factor ;
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_RenderFillRect , ( renderer , & rect ) )
CHECK_FUNC ( SDL_SetRenderLogicalPresentation , ( renderer , 0 , 0 ,
2023-02-03 23:25:46 +03:00
SDL_LOGICAL_PRESENTATION_DISABLED ,
2023-02-05 20:08:33 +03:00
SDL_SCALEMODE_NEAREST ) )
2024-06-30 00:12:50 +03:00
CHECK_FUNC ( SDL_GetRenderLogicalPresentation , ( renderer , & set_w , & set_h , & set_presentation_mode , & set_scale_mode ) )
SDLTest_AssertCheck (
set_w = = 0 & &
set_h = = 0 & &
set_presentation_mode = = SDL_LOGICAL_PRESENTATION_DISABLED & &
set_scale_mode = = SDL_SCALEMODE_NEAREST ,
" Validate result from SDL_GetRenderLogicalPresentation, got %d, %d, %d, %d " , set_w , set_h , set_presentation_mode , set_scale_mode ) ;
CHECK_FUNC ( SDL_GetRenderLogicalPresentationRect , ( renderer , & set_rect ) )
SDLTest_AssertCheck (
set_rect . x = = 0.0f & &
set_rect . y = = 0.0f & &
set_rect . w = = 320.0f & &
set_rect . h = = 240.0f ,
" Validate result from SDL_GetRenderLogicalPresentationRect, got {%g, %g, %gx%g} " , set_rect . x , set_rect . y , set_rect . w , set_rect . h ) ;
2023-01-27 01:49:23 +03:00
/* Check to see if final image matches. */
compare ( referenceSurface , ALLOWABLE_ERROR_OPAQUE ) ;
/* Clear surface. */
clearScreen ( ) ;
2023-01-27 03:10:13 +03:00
/* Set the logical size and viewport and do a fill operation */
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_GetCurrentRenderOutputSize , ( renderer , & w , & h ) )
CHECK_FUNC ( SDL_SetRenderLogicalPresentation , ( renderer , w / factor , h / factor ,
2023-02-03 23:25:46 +03:00
SDL_LOGICAL_PRESENTATION_LETTERBOX ,
2023-02-05 20:08:33 +03:00
SDL_SCALEMODE_NEAREST ) )
2023-01-27 03:10:13 +03:00
viewport . x = ( TESTRENDER_SCREEN_W / 4 ) / factor ;
viewport . y = ( TESTRENDER_SCREEN_H / 4 ) / factor ;
viewport . w = ( TESTRENDER_SCREEN_W / 2 ) / factor ;
viewport . h = ( TESTRENDER_SCREEN_H / 2 ) / factor ;
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_SetRenderViewport , ( renderer , & viewport ) )
CHECK_FUNC ( SDL_SetRenderDrawColor , ( renderer , 0 , 255 , 0 , SDL_ALPHA_OPAQUE ) )
CHECK_FUNC ( SDL_RenderFillRect , ( renderer , NULL ) )
CHECK_FUNC ( SDL_SetRenderViewport , ( renderer , NULL ) )
CHECK_FUNC ( SDL_SetRenderLogicalPresentation , ( renderer , 0 , 0 ,
2023-02-03 23:25:46 +03:00
SDL_LOGICAL_PRESENTATION_DISABLED ,
2023-02-05 20:08:33 +03:00
SDL_SCALEMODE_NEAREST ) )
2023-01-27 01:49:23 +03:00
/* Check to see if final image matches. */
compare ( referenceSurface , ALLOWABLE_ERROR_OPAQUE ) ;
2023-01-27 00:58:38 +03:00
2023-01-27 03:10:13 +03:00
/*
* Test a logical size that isn ' t the same aspect ratio as the window
*/
viewport . x = ( TESTRENDER_SCREEN_W / 4 ) ;
viewport . y = 0 ;
viewport . w = TESTRENDER_SCREEN_W ;
viewport . h = TESTRENDER_SCREEN_H ;
/* Create expected result */
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_FillSurfaceRect , ( referenceSurface , NULL , RENDER_COLOR_CLEAR ) )
2024-06-13 05:08:06 +03:00
CHECK_FUNC ( SDL_FillSurfaceRect , ( referenceSurface , & viewport , RENDER_COLOR_GREEN ) )
2023-02-02 02:21:53 +03:00
2023-01-27 03:10:13 +03:00
/* Clear surface. */
clearScreen ( ) ;
/* Set the logical size and do a fill operation */
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_GetCurrentRenderOutputSize , ( renderer , & w , & h ) )
CHECK_FUNC ( SDL_SetRenderLogicalPresentation , ( renderer ,
2023-02-03 23:25:46 +03:00
w - 2 * ( TESTRENDER_SCREEN_W / 4 ) ,
h ,
SDL_LOGICAL_PRESENTATION_LETTERBOX ,
2023-02-05 20:08:33 +03:00
SDL_SCALEMODE_LINEAR ) )
2024-06-30 00:12:50 +03:00
CHECK_FUNC ( SDL_GetRenderLogicalPresentation , ( renderer , & set_w , & set_h , & set_presentation_mode , & set_scale_mode ) )
SDLTest_AssertCheck (
set_w = = w - 2 * ( TESTRENDER_SCREEN_W / 4 ) & &
set_h = = h & &
set_presentation_mode = = SDL_LOGICAL_PRESENTATION_LETTERBOX & &
set_scale_mode = = SDL_SCALEMODE_LINEAR ,
" Validate result from SDL_GetRenderLogicalPresentation, got %d, %d, %d, %d " , set_w , set_h , set_presentation_mode , set_scale_mode ) ;
CHECK_FUNC ( SDL_GetRenderLogicalPresentationRect , ( renderer , & set_rect ) )
SDLTest_AssertCheck (
set_rect . x = = 20.0f & &
set_rect . y = = 0.0f & &
set_rect . w = = 280.0f & &
set_rect . h = = 240.0f ,
" Validate result from SDL_GetRenderLogicalPresentationRect, got {%g, %g, %gx%g} " , set_rect . x , set_rect . y , set_rect . w , set_rect . h ) ;
2023-02-05 20:08:33 +03:00
CHECK_FUNC ( SDL_SetRenderDrawColor , ( renderer , 0 , 255 , 0 , SDL_ALPHA_OPAQUE ) )
CHECK_FUNC ( SDL_RenderFillRect , ( renderer , NULL ) )
CHECK_FUNC ( SDL_SetRenderLogicalPresentation , ( renderer , 0 , 0 ,
2023-02-03 23:25:46 +03:00
SDL_LOGICAL_PRESENTATION_DISABLED ,
2023-02-05 20:08:33 +03:00
SDL_SCALEMODE_NEAREST ) )
2024-06-30 00:12:50 +03:00
CHECK_FUNC ( SDL_GetRenderLogicalPresentation , ( renderer , & set_w , & set_h , & set_presentation_mode , & set_scale_mode ) )
SDLTest_AssertCheck (
set_w = = 0 & &
set_h = = 0 & &
set_presentation_mode = = SDL_LOGICAL_PRESENTATION_DISABLED & &
set_scale_mode = = SDL_SCALEMODE_NEAREST ,
" Validate result from SDL_GetRenderLogicalPresentation, got %d, %d, %d, %d " , set_w , set_h , set_presentation_mode , set_scale_mode ) ;
CHECK_FUNC ( SDL_GetRenderLogicalPresentationRect , ( renderer , & set_rect ) )
SDLTest_AssertCheck (
set_rect . x = = 0.0f & &
set_rect . y = = 0.0f & &
set_rect . w = = 320.0f & &
set_rect . h = = 240.0f ,
" Validate result from SDL_GetRenderLogicalPresentationRect, got {%g, %g, %gx%g} " , set_rect . x , set_rect . y , set_rect . w , set_rect . h ) ;
2023-01-27 03:10:13 +03:00
/* Check to see if final image matches. */
compare ( referenceSurface , ALLOWABLE_ERROR_OPAQUE ) ;
/* Clear surface. */
clearScreen ( ) ;
2023-01-27 00:58:38 +03:00
/* Make current */
SDL_RenderPresent ( renderer ) ;
SDL_DestroySurface ( referenceSurface ) ;
return TEST_COMPLETED ;
}
/* Helper functions */
2015-06-21 18:33:46 +03:00
/**
2023-11-06 18:26:06 +03:00
* Checks to see if functionality is supported . Helper function .
2015-06-21 18:33:46 +03:00
*/
static int
2022-12-30 00:58:16 +03:00
isSupported ( int code )
2015-06-21 18:33:46 +03:00
{
2022-11-30 23:51:59 +03:00
return code = = 0 ;
2015-06-21 18:33:46 +03:00
}
/**
2023-11-06 18:26:06 +03:00
* Test to see if we can vary the draw color . Helper function .
2015-06-21 18:33:46 +03:00
*
2023-02-02 02:21:53 +03:00
* \ sa SDL_SetRenderDrawColor
* \ sa SDL_GetRenderDrawColor
2015-06-21 18:33:46 +03:00
*/
static int
2022-12-30 00:58:16 +03:00
hasDrawColor ( void )
2015-06-21 18:33:46 +03:00
{
2022-11-30 23:51:59 +03:00
int ret , fail ;
Uint8 r , g , b , a ;
fail = 0 ;
/* Set color. */
ret = SDL_SetRenderDrawColor ( renderer , 100 , 100 , 100 , 100 ) ;
2022-12-30 00:58:16 +03:00
if ( ! isSupported ( ret ) ) {
2022-11-30 23:51:59 +03:00
fail = 1 ;
}
ret = SDL_GetRenderDrawColor ( renderer , & r , & g , & b , & a ) ;
2022-12-30 00:58:16 +03:00
if ( ! isSupported ( ret ) ) {
2022-11-30 23:51:59 +03:00
fail = 1 ;
}
/* Restore natural. */
ret = SDL_SetRenderDrawColor ( renderer , 0 , 0 , 0 , SDL_ALPHA_OPAQUE ) ;
2022-12-30 00:58:16 +03:00
if ( ! isSupported ( ret ) ) {
2022-11-30 23:51:59 +03:00
fail = 1 ;
}
/* Something failed, consider not available. */
if ( fail ) {
return 0 ;
}
/* Not set properly, consider failed. */
else if ( ( r ! = 100 ) | | ( g ! = 100 ) | | ( b ! = 100 ) | | ( a ! = 100 ) ) {
return 0 ;
}
return 1 ;
2015-06-21 18:33:46 +03:00
}
/**
2023-11-06 18:26:06 +03:00
* Loads the test image ' Face ' as texture . Helper function .
2015-06-21 18:33:46 +03:00
*
2023-02-02 02:21:53 +03:00
* \ sa SDL_CreateTextureFromSurface
2015-06-21 18:33:46 +03:00
*/
static SDL_Texture *
2022-12-30 00:58:16 +03:00
loadTestFace ( void )
2015-06-21 18:33:46 +03:00
{
2022-11-30 23:51:59 +03:00
SDL_Surface * face ;
SDL_Texture * tface ;
2015-06-21 18:33:46 +03:00
2022-11-30 23:51:59 +03:00
face = SDLTest_ImageFace ( ) ;
2023-11-10 00:29:15 +03:00
if ( ! face ) {
2022-11-30 23:51:59 +03:00
return NULL ;
}
2015-06-21 18:33:46 +03:00
2022-11-30 23:51:59 +03:00
tface = SDL_CreateTextureFromSurface ( renderer , face ) ;
2023-11-10 00:29:15 +03:00
if ( ! tface ) {
2022-11-30 23:51:59 +03:00
SDLTest_LogError ( " SDL_CreateTextureFromSurface() failed with error: %s " , SDL_GetError ( ) ) ;
}
2015-06-21 18:33:46 +03:00
2022-12-27 17:36:39 +03:00
SDL_DestroySurface ( face ) ;
2015-06-21 18:33:46 +03:00
2022-11-30 23:51:59 +03:00
return tface ;
2015-06-21 18:33:46 +03:00
}
/**
2023-11-06 18:26:06 +03:00
* Compares screen pixels with image pixels . Helper function .
2015-06-21 18:33:46 +03:00
*
2023-02-02 02:21:53 +03:00
* \ param referenceSurface Image to compare against .
* \ param allowable_error allowed difference from the reference image
2015-06-21 18:33:46 +03:00
*
2023-02-02 02:21:53 +03:00
* \ sa SDL_RenderReadPixels
* \ sa SDL_CreateSurfaceFrom
* \ sa SDL_DestroySurface
2015-06-21 18:33:46 +03:00
*/
static void
2022-12-30 00:58:16 +03:00
compare ( SDL_Surface * referenceSurface , int allowable_error )
2015-06-21 18:33:46 +03:00
{
2024-02-03 21:18:12 +03:00
int ret ;
SDL_Rect rect ;
SDL_Surface * surface , * testSurface ;
/* Explicitly specify the rect in case the window isn't the expected size... */
rect . x = 0 ;
rect . y = 0 ;
rect . w = TESTRENDER_SCREEN_W ;
rect . h = TESTRENDER_SCREEN_H ;
surface = SDL_RenderReadPixels ( renderer , & rect ) ;
if ( ! surface ) {
SDLTest_AssertCheck ( surface ! = NULL , " Validate result from SDL_RenderReadPixels, got NULL, %s " , SDL_GetError ( ) ) ;
return ;
}
2024-07-09 00:59:18 +03:00
testSurface = SDL_ConvertSurface ( surface , RENDER_COMPARE_FORMAT ) ;
2024-02-03 21:18:12 +03:00
SDL_DestroySurface ( surface ) ;
if ( ! testSurface ) {
2024-07-09 00:59:18 +03:00
SDLTest_AssertCheck ( testSurface ! = NULL , " Validate result from SDL_ConvertSurface, got NULL, %s " , SDL_GetError ( ) ) ;
2024-02-03 21:18:12 +03:00
return ;
}
/* Compare surface. */
ret = SDLTest_CompareSurfaces ( testSurface , referenceSurface , allowable_error ) ;
SDLTest_AssertCheck ( ret = = 0 , " Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i " , ret ) ;
/* Clean up. */
SDL_DestroySurface ( testSurface ) ;
2015-06-21 18:33:46 +03:00
}
/**
2023-11-06 18:26:06 +03:00
* Clears the screen . Helper function .
2015-06-21 18:33:46 +03:00
*
2023-02-02 02:21:53 +03:00
* \ sa SDL_SetRenderDrawColor
* \ sa SDL_RenderClear
* \ sa SDL_RenderPresent
* \ sa SDL_SetRenderDrawBlendMode
2015-06-21 18:33:46 +03:00
*/
static int
2022-12-30 00:58:16 +03:00
clearScreen ( void )
2015-06-21 18:33:46 +03:00
{
2022-11-30 23:51:59 +03:00
int ret ;
2015-06-21 18:33:46 +03:00
2023-01-27 03:10:13 +03:00
/* Make current */
SDL_RenderPresent ( renderer ) ;
2023-02-02 02:21:53 +03:00
2022-11-30 23:51:59 +03:00
/* Set color. */
ret = SDL_SetRenderDrawColor ( renderer , 0 , 0 , 0 , SDL_ALPHA_OPAQUE ) ;
SDLTest_AssertCheck ( ret = = 0 , " Validate result from SDL_SetRenderDrawColor, expected: 0, got: %i " , ret ) ;
2015-06-21 18:33:46 +03:00
2022-11-30 23:51:59 +03:00
/* Clear screen. */
ret = SDL_RenderClear ( renderer ) ;
SDLTest_AssertCheck ( ret = = 0 , " Validate result from SDL_RenderClear, expected: 0, got: %i " , ret ) ;
2015-06-21 18:33:46 +03:00
2022-11-30 23:51:59 +03:00
/* Set defaults. */
ret = SDL_SetRenderDrawBlendMode ( renderer , SDL_BLENDMODE_NONE ) ;
SDLTest_AssertCheck ( ret = = 0 , " Validate result from SDL_SetRenderDrawBlendMode, expected: 0, got: %i " , ret ) ;
2015-06-21 18:33:46 +03:00
2022-11-30 23:51:59 +03:00
ret = SDL_SetRenderDrawColor ( renderer , 255 , 255 , 255 , SDL_ALPHA_OPAQUE ) ;
SDLTest_AssertCheck ( ret = = 0 , " Validate result from SDL_SetRenderDrawColor, expected: 0, got: %i " , ret ) ;
2015-06-21 18:33:46 +03:00
2022-11-30 23:51:59 +03:00
return 0 ;
2015-06-21 18:33:46 +03:00
}
/* ================= Test References ================== */
/* Render test cases */
2022-11-30 23:51:59 +03:00
static const SDLTest_TestCaseReference renderTest1 = {
( SDLTest_TestCaseFp ) render_testGetNumRenderDrivers , " render_testGetNumRenderDrivers " , " Tests call to SDL_GetNumRenderDrivers " , TEST_ENABLED
} ;
2015-06-21 18:33:46 +03:00
2022-11-30 23:51:59 +03:00
static const SDLTest_TestCaseReference renderTest2 = {
( SDLTest_TestCaseFp ) render_testPrimitives , " render_testPrimitives " , " Tests rendering primitives " , TEST_ENABLED
} ;
2015-06-21 18:33:46 +03:00
2022-11-30 23:51:59 +03:00
static const SDLTest_TestCaseReference renderTest3 = {
2024-07-15 23:42:06 +03:00
( SDLTest_TestCaseFp ) render_testPrimitivesWithViewport , " render_testPrimitivesWithViewport " , " Tests rendering primitives within a viewport " , TEST_ENABLED
2022-11-30 23:51:59 +03:00
} ;
2015-06-21 18:33:46 +03:00
2022-11-30 23:51:59 +03:00
static const SDLTest_TestCaseReference renderTest4 = {
2024-07-15 23:42:06 +03:00
( SDLTest_TestCaseFp ) render_testBlit , " render_testBlit " , " Tests blitting " , TEST_ENABLED
2022-11-30 23:51:59 +03:00
} ;
2015-06-21 18:33:46 +03:00
2022-11-30 23:51:59 +03:00
static const SDLTest_TestCaseReference renderTest5 = {
2024-07-15 23:42:06 +03:00
( SDLTest_TestCaseFp ) render_testBlitColor , " render_testBlitColor " , " Tests blitting with color " , TEST_ENABLED
2024-01-20 03:28:00 +03:00
} ;
static const SDLTest_TestCaseReference renderTest6 = {
2024-07-15 23:42:06 +03:00
( SDLTest_TestCaseFp ) render_testBlendModes , " render_testBlendModes " , " Tests rendering blend modes " , TEST_ENABLED
2022-11-30 23:51:59 +03:00
} ;
2015-06-21 18:33:46 +03:00
2024-01-20 03:28:00 +03:00
static const SDLTest_TestCaseReference renderTest7 = {
2023-01-27 00:58:38 +03:00
( SDLTest_TestCaseFp ) render_testViewport , " render_testViewport " , " Tests viewport " , TEST_ENABLED
} ;
2024-07-15 23:42:06 +03:00
static const SDLTest_TestCaseReference renderTest8 = {
2024-02-25 20:44:41 +03:00
( SDLTest_TestCaseFp ) render_testClipRect , " render_testClipRect " , " Tests clip rect " , TEST_ENABLED
} ;
2024-07-15 23:42:06 +03:00
static const SDLTest_TestCaseReference renderTest9 = {
2023-01-27 01:49:23 +03:00
( SDLTest_TestCaseFp ) render_testLogicalSize , " render_testLogicalSize " , " Tests logical size " , TEST_ENABLED
} ;
2015-06-21 18:33:46 +03:00
/* Sequence of Render test cases */
2022-11-30 23:51:59 +03:00
static const SDLTest_TestCaseReference * renderTests [ ] = {
2023-01-27 01:49:23 +03:00
& renderTest1 , & renderTest2 , & renderTest3 , & renderTest4 ,
2023-01-27 03:10:13 +03:00
& renderTest5 , & renderTest6 , & renderTest7 , & renderTest8 ,
2024-07-15 23:42:06 +03:00
& renderTest9 , NULL
2015-06-21 18:33:46 +03:00
} ;
/* Render test suite (global) */
SDLTest_TestSuiteReference renderTestSuite = {
" Render " ,
InitCreateRenderer ,
renderTests ,
CleanupDestroyRenderer
} ;