test/testautomation_render.c
author Andreas Schiffler <aschiffler@ferzkopp.net>
Mon, 24 Dec 2012 14:43:57 -0800
changeset 6772 5229a117ef97
parent 6769 b49778d885cd
child 6773 5ebc5a9e35b4
permissions -rw-r--r--
Added audio test suite; minor code cleanups in test lib
aschiffler@6763
     1
/**
aschiffler@6763
     2
 * Original code: automated SDL platform test written by Edgar Simo "bobbens"
aschiffler@6763
     3
 * Extended and extensively updated by aschiffler at ferzkopp dot net
aschiffler@6763
     4
 */
aschiffler@6763
     5
aschiffler@6763
     6
#include <stdio.h>
aschiffler@6763
     7
aschiffler@6763
     8
#include "SDL.h"
aschiffler@6763
     9
#include "SDL_test.h"
aschiffler@6763
    10
aschiffler@6763
    11
/* ================= Test Case Implementation ================== */
aschiffler@6763
    12
aschiffler@6763
    13
#define TESTRENDER_SCREEN_W     80
aschiffler@6763
    14
#define TESTRENDER_SCREEN_H     60
aschiffler@6763
    15
aschiffler@6763
    16
#define RENDER_COMPARE_FORMAT  SDL_PIXELFORMAT_ARGB8888
aschiffler@6763
    17
#define RENDER_COMPARE_AMASK   0xff000000 /**< Alpha bit mask. */
aschiffler@6763
    18
#define RENDER_COMPARE_RMASK   0x00ff0000 /**< Red bit mask. */
aschiffler@6763
    19
#define RENDER_COMPARE_GMASK   0x0000ff00 /**< Green bit mask. */
aschiffler@6763
    20
#define RENDER_COMPARE_BMASK   0x000000ff /**< Blue bit mask. */
aschiffler@6763
    21
aschiffler@6763
    22
#define ALLOWABLE_ERROR_OPAQUE	0
aschiffler@6763
    23
#define ALLOWABLE_ERROR_BLENDED	64
aschiffler@6763
    24
aschiffler@6763
    25
SDL_Window *window = NULL;
aschiffler@6763
    26
SDL_Renderer *renderer = NULL;
aschiffler@6763
    27
aschiffler@6763
    28
/* Prototypes for helper functions */
aschiffler@6763
    29
aschiffler@6763
    30
static int _clearScreen (void);
aschiffler@6763
    31
static void _compare(const char *msg, SDL_Surface *s, int allowable_error);
aschiffler@6763
    32
static int _hasTexAlpha(void);
aschiffler@6763
    33
static int _hasTexColor(void);
aschiffler@6763
    34
static SDL_Texture *_loadTestFace(void);
aschiffler@6763
    35
static int _hasBlendModes(void);
aschiffler@6763
    36
static int _hasDrawColor(void);
aschiffler@6763
    37
static int _isSupported(int code);
aschiffler@6763
    38
aschiffler@6763
    39
/**
aschiffler@6763
    40
 * Create software renderer for tests
aschiffler@6763
    41
 */
aschiffler@6763
    42
void InitCreateRenderer(void *arg)
aschiffler@6763
    43
{
aschiffler@6763
    44
  int posX = 100, posY = 100, width = 320, height = 240;
aschiffler@6763
    45
  renderer = NULL;
aschiffler@6763
    46
  window = SDL_CreateWindow("render_testCreateRenderer", posX, posY, width, height, 0);
aschiffler@6763
    47
  SDLTest_AssertPass("SDL_CreateWindow()");
aschiffler@6763
    48
  SDLTest_AssertCheck(window != NULL, "Check SDL_CreateWindow result");
aschiffler@6763
    49
  if (window == NULL) {
aschiffler@6763
    50
      return;
aschiffler@6763
    51
  }
aschiffler@6763
    52
  
aschiffler@6763
    53
  renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
aschiffler@6763
    54
  SDLTest_AssertPass("SDL_CreateRenderer()");
aschiffler@6763
    55
  SDLTest_AssertCheck(renderer != 0, "Check SDL_CreateRenderer result");
aschiffler@6763
    56
  if (renderer == 0) {
aschiffler@6763
    57
      SDL_DestroyWindow(window);
aschiffler@6763
    58
      return;
aschiffler@6763
    59
  }
aschiffler@6763
    60
}
aschiffler@6763
    61
aschiffler@6763
    62
/*
aschiffler@6763
    63
 * Destroy renderer for tests  
aschiffler@6763
    64
 */
aschiffler@6763
    65
void CleanupDestroyRenderer(void *arg)
aschiffler@6763
    66
{
aschiffler@6763
    67
  if (renderer != NULL) {  
aschiffler@6763
    68
     SDL_DestroyRenderer(renderer);
aschiffler@6763
    69
     SDLTest_AssertPass("SDL_DestroyRenderer()");
aschiffler@6763
    70
  }
aschiffler@6763
    71
  
aschiffler@6763
    72
  if (window != NULL) {  
aschiffler@6763
    73
     SDL_DestroyWindow(window);
aschiffler@6763
    74
     SDLTest_AssertPass("SDL_DestroyWindow");
aschiffler@6763
    75
  }
aschiffler@6763
    76
}
aschiffler@6763
    77
aschiffler@6763
    78
aschiffler@6763
    79
/**
aschiffler@6763
    80
 * @brief Tests call to SDL_GetNumRenderDrivers
aschiffler@6763
    81
 *
aschiffler@6763
    82
 * \sa
aschiffler@6763
    83
 * http://wiki.libsdl.org/moin.cgi/SDL_GetNumRenderDrivers
aschiffler@6763
    84
 */
aschiffler@6763
    85
int
aschiffler@6763
    86
render_testGetNumRenderDrivers(void *arg)
aschiffler@6763
    87
{
aschiffler@6763
    88
  int n;
aschiffler@6763
    89
  n = SDL_GetNumRenderDrivers();
aschiffler@6763
    90
  SDLTest_AssertCheck(n >= 1, "Number of renderers >= 1, reported as %i", n);
aschiffler@6763
    91
  return TEST_COMPLETED;
aschiffler@6763
    92
}
aschiffler@6763
    93
aschiffler@6763
    94
aschiffler@6763
    95
/**
aschiffler@6763
    96
 * @brief Tests the SDL primitives for rendering.
aschiffler@6763
    97
 *
aschiffler@6763
    98
 * \sa
aschiffler@6763
    99
 * http://wiki.libsdl.org/moin.cgi/SDL_SetRenderDrawColor
aschiffler@6763
   100
 * http://wiki.libsdl.org/moin.cgi/SDL_RenderFillRect
aschiffler@6763
   101
 * http://wiki.libsdl.org/moin.cgi/SDL_RenderDrawLine
aschiffler@6763
   102
 *
aschiffler@6763
   103
 */
aschiffler@6763
   104
int render_testPrimitives (void *arg)
aschiffler@6763
   105
{
aschiffler@6763
   106
   int ret;
aschiffler@6763
   107
   int x, y;
aschiffler@6763
   108
   SDL_Rect rect;
aschiffler@6763
   109
   int checkFailCount1;
aschiffler@6763
   110
   int checkFailCount2;
aschiffler@6763
   111
aschiffler@6763
   112
   /* Need drawcolour or just skip test. */
aschiffler@6763
   113
   SDLTest_AssertCheck(_hasDrawColor(), "_hasDrawColor");
aschiffler@6763
   114
aschiffler@6763
   115
   /* Draw a rectangle. */
aschiffler@6763
   116
   rect.x = 40;
aschiffler@6763
   117
   rect.y = 0;
aschiffler@6763
   118
   rect.w = 40;
aschiffler@6763
   119
   rect.h = 80;
aschiffler@6763
   120
aschiffler@6763
   121
   ret = SDL_SetRenderDrawColor(renderer, 13, 73, 200, SDL_ALPHA_OPAQUE );
aschiffler@6763
   122
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawColor, expected: 0, got: %i", ret);
aschiffler@6763
   123
aschiffler@6763
   124
   ret = SDL_RenderFillRect(renderer, &rect );
aschiffler@6763
   125
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_RenderFillRect, expected: 0, got: %i", ret);
aschiffler@6763
   126
aschiffler@6763
   127
   /* Draw a rectangle. */
aschiffler@6763
   128
   rect.x = 10;
aschiffler@6763
   129
   rect.y = 10;
aschiffler@6763
   130
   rect.w = 60;
aschiffler@6763
   131
   rect.h = 40;
aschiffler@6763
   132
   ret = SDL_SetRenderDrawColor(renderer, 200, 0, 100, SDL_ALPHA_OPAQUE );
aschiffler@6763
   133
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawColor, expected: 0, got: %i", ret);
aschiffler@6763
   134
aschiffler@6763
   135
   ret = SDL_RenderFillRect(renderer, &rect );
aschiffler@6763
   136
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_RenderFillRect, expected: 0, got: %i", ret);
aschiffler@6763
   137
aschiffler@6763
   138
   /* Draw some points like so:
aschiffler@6763
   139
    * X.X.X.X..
aschiffler@6763
   140
    * .X.X.X.X.
aschiffler@6763
   141
    * X.X.X.X.. */
aschiffler@6763
   142
   checkFailCount1 = 0;
aschiffler@6763
   143
   checkFailCount2 = 0;
aschiffler@6763
   144
   for (y=0; y<3; y++) {
aschiffler@6763
   145
      for (x = y % 2; x<TESTRENDER_SCREEN_W; x+=2) {
aschiffler@6763
   146
         ret = SDL_SetRenderDrawColor(renderer, x*y, x*y/2, x*y/3, SDL_ALPHA_OPAQUE );
aschiffler@6763
   147
         if (ret != 0) checkFailCount1++;
aschiffler@6763
   148
aschiffler@6763
   149
         ret = SDL_RenderDrawPoint(renderer, x, y );
aschiffler@6763
   150
         if (ret != 0) checkFailCount2++;
aschiffler@6763
   151
      }
aschiffler@6763
   152
   }
aschiffler@6763
   153
   SDLTest_AssertCheck(checkFailCount1 == 0, "Validate results from calls to SDL_SetRenderDrawColor, expected: 0, got: %i", checkFailCount1);
aschiffler@6763
   154
   SDLTest_AssertCheck(checkFailCount2 == 0, "Validate results from calls to SDL_RenderDrawPoint, expected: 0, got: %i", checkFailCount2);
aschiffler@6763
   155
aschiffler@6763
   156
   /* Draw some lines. */
aschiffler@6763
   157
   ret = SDL_SetRenderDrawColor(renderer, 0, 255, 0, SDL_ALPHA_OPAQUE );
aschiffler@6763
   158
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawColor");
aschiffler@6763
   159
aschiffler@6763
   160
   ret = SDL_RenderDrawLine(renderer, 0, 30, TESTRENDER_SCREEN_W, 30 );
aschiffler@6763
   161
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_RenderDrawLine, expected: 0, got: %i", ret);
aschiffler@6763
   162
aschiffler@6763
   163
   ret = SDL_SetRenderDrawColor(renderer, 55, 55, 5, SDL_ALPHA_OPAQUE );
aschiffler@6763
   164
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawColor, expected: 0, got: %i", ret);
aschiffler@6763
   165
aschiffler@6763
   166
   ret = SDL_RenderDrawLine(renderer, 40, 30, 40, 60 );
aschiffler@6763
   167
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_RenderDrawLine, expected: 0, got: %i", ret);
aschiffler@6763
   168
aschiffler@6763
   169
   ret = SDL_SetRenderDrawColor(renderer, 5, 105, 105, SDL_ALPHA_OPAQUE );
aschiffler@6763
   170
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawColor, expected: 0, got: %i", ret);
aschiffler@6763
   171
aschiffler@6763
   172
   ret = SDL_RenderDrawLine(renderer, 0, 0, 29, 29 );
aschiffler@6763
   173
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_RenderDrawLine, expected: 0, got: %i", ret);
aschiffler@6763
   174
aschiffler@6763
   175
   ret = SDL_RenderDrawLine(renderer, 29, 30, 0, 59 );
aschiffler@6763
   176
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_RenderDrawLine, expected: 0, got: %i", ret);
aschiffler@6763
   177
aschiffler@6763
   178
   ret = SDL_RenderDrawLine(renderer, 79, 0, 50, 29 );
aschiffler@6763
   179
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_RenderDrawLine, expected: 0, got: %i", ret);
aschiffler@6763
   180
aschiffler@6763
   181
   ret = SDL_RenderDrawLine(renderer, 79, 59, 50, 30 );
aschiffler@6763
   182
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_RenderDrawLine, expected: 0, got: %i", ret);
aschiffler@6763
   183
aschiffler@6763
   184
   /* See if it's the same. */
aschiffler@6763
   185
   _compare( "Primitives output not the same.", SDLTest_ImagePrimitives(), ALLOWABLE_ERROR_OPAQUE );
aschiffler@6763
   186
aschiffler@6763
   187
   return TEST_COMPLETED;
aschiffler@6763
   188
}
aschiffler@6763
   189
aschiffler@6763
   190
/**
aschiffler@6763
   191
 * @brief Tests the SDL primitives with alpha for rendering.
aschiffler@6763
   192
 *
aschiffler@6763
   193
 * \sa
aschiffler@6763
   194
 * http://wiki.libsdl.org/moin.cgi/SDL_SetRenderDrawColor
aschiffler@6763
   195
 * http://wiki.libsdl.org/moin.cgi/SDL_SetRenderDrawBlendMode
aschiffler@6763
   196
 * http://wiki.libsdl.org/moin.cgi/SDL_RenderFillRect
aschiffler@6763
   197
 */
aschiffler@6763
   198
int render_testPrimitivesBlend (void *arg)
aschiffler@6763
   199
{
aschiffler@6763
   200
   int ret;
aschiffler@6763
   201
   int i, j;
aschiffler@6763
   202
   SDL_Rect rect;
aschiffler@6763
   203
   int checkFailCount1;
aschiffler@6763
   204
   int checkFailCount2;
aschiffler@6763
   205
   int checkFailCount3;
aschiffler@6763
   206
aschiffler@6763
   207
   /* Need drawcolour and blendmode or just skip test. */
aschiffler@6763
   208
   SDLTest_AssertCheck(_hasDrawColor(), "_hasDrawColor");
aschiffler@6763
   209
   SDLTest_AssertCheck(_hasBlendModes(), "_hasBlendModes");
aschiffler@6763
   210
aschiffler@6763
   211
   /* Create some rectangles for each blend mode. */
aschiffler@6763
   212
   ret = SDL_SetRenderDrawColor(renderer, 255, 255, 255, 0 );
aschiffler@6763
   213
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawColor, expected: 0, got: %i", ret);
aschiffler@6763
   214
aschiffler@6763
   215
   ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE );
aschiffler@6763
   216
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawBlendMode, expected: 0, got: %i", ret);
aschiffler@6763
   217
aschiffler@6763
   218
   ret = SDL_RenderFillRect(renderer, NULL );
aschiffler@6763
   219
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_RenderFillRect, expected: 0, got: %i", ret);
aschiffler@6763
   220
aschiffler@6763
   221
   rect.x = 10;
aschiffler@6763
   222
   rect.y = 25;
aschiffler@6763
   223
   rect.w = 40;
aschiffler@6763
   224
   rect.h = 25;
aschiffler@6763
   225
   ret = SDL_SetRenderDrawColor(renderer, 240, 10, 10, 75 );
aschiffler@6763
   226
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawColor, expected: 0, got: %i", ret);
aschiffler@6763
   227
aschiffler@6763
   228
   ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_ADD );
aschiffler@6763
   229
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawBlendMode, expected: 0, got: %i", ret);
aschiffler@6763
   230
aschiffler@6763
   231
   ret = SDL_RenderFillRect(renderer, &rect );
aschiffler@6763
   232
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_RenderFillRect, expected: 0, got: %i", ret);
aschiffler@6763
   233
aschiffler@6763
   234
   rect.x = 30;
aschiffler@6763
   235
   rect.y = 40;
aschiffler@6763
   236
   rect.w = 45;
aschiffler@6763
   237
   rect.h = 15;
aschiffler@6763
   238
   ret = SDL_SetRenderDrawColor(renderer, 10, 240, 10, 100 );
aschiffler@6763
   239
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawColor, expected: 0, got: %i", ret);
aschiffler@6763
   240
aschiffler@6763
   241
   ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND );
aschiffler@6763
   242
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawBlendMode, expected: 0, got: %i", ret);
aschiffler@6763
   243
aschiffler@6763
   244
   ret = SDL_RenderFillRect(renderer, &rect );
aschiffler@6763
   245
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_RenderFillRect, expected: 0, got: %i", ret);
aschiffler@6763
   246
aschiffler@6763
   247
   rect.x = 25;
aschiffler@6763
   248
   rect.y = 25;
aschiffler@6763
   249
   rect.w = 25;
aschiffler@6763
   250
   rect.h = 25;
aschiffler@6763
   251
   ret = SDL_SetRenderDrawColor(renderer, 10, 10, 240, 125 );
aschiffler@6763
   252
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawColor, expected: 0, got: %i", ret);
aschiffler@6763
   253
aschiffler@6763
   254
   ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE );
aschiffler@6763
   255
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawBlendMode, expected: 0, got: %i", ret);
aschiffler@6763
   256
aschiffler@6763
   257
   ret = SDL_RenderFillRect(renderer, &rect );
aschiffler@6763
   258
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_RenderFillRect, expected: 0, got: %i", ret);
aschiffler@6763
   259
aschiffler@6763
   260
aschiffler@6763
   261
   /* Draw blended lines, lines for everyone. */
aschiffler@6763
   262
   checkFailCount1 = 0;
aschiffler@6763
   263
   checkFailCount2 = 0;
aschiffler@6763
   264
   checkFailCount3 = 0;
aschiffler@6763
   265
   for (i=0; i<TESTRENDER_SCREEN_W; i+=2)  {
aschiffler@6763
   266
      ret = SDL_SetRenderDrawColor(renderer, 60+2*i, 240-2*i, 50, 3*i );
aschiffler@6763
   267
      if (ret != 0) checkFailCount1++;
aschiffler@6763
   268
aschiffler@6763
   269
      ret = SDL_SetRenderDrawBlendMode(renderer,(((i/2)%3)==0) ? SDL_BLENDMODE_BLEND :
aschiffler@6763
   270
            (((i/2)%3)==1) ? SDL_BLENDMODE_ADD : SDL_BLENDMODE_NONE );
aschiffler@6763
   271
      if (ret != 0) checkFailCount2++;
aschiffler@6763
   272
aschiffler@6763
   273
      ret = SDL_RenderDrawLine(renderer, 0, 0, i, 59 );
aschiffler@6763
   274
      if (ret != 0) checkFailCount3++;
aschiffler@6763
   275
   }
aschiffler@6763
   276
   SDLTest_AssertCheck(checkFailCount1 == 0, "Validate results from calls to SDL_SetRenderDrawColor, expected: 0, got: %i", checkFailCount1);
aschiffler@6763
   277
   SDLTest_AssertCheck(checkFailCount2 == 0, "Validate results from calls to SDL_SetRenderDrawBlendMode, expected: 0, got: %i", checkFailCount2);
aschiffler@6763
   278
   SDLTest_AssertCheck(checkFailCount3 == 0, "Validate results from calls to SDL_RenderDrawLine, expected: 0, got: %i", checkFailCount3);
aschiffler@6763
   279
   
aschiffler@6763
   280
   checkFailCount1 = 0;
aschiffler@6763
   281
   checkFailCount2 = 0;
aschiffler@6763
   282
   checkFailCount3 = 0;
aschiffler@6763
   283
   for (i=0; i<TESTRENDER_SCREEN_H; i+=2)  {
aschiffler@6763
   284
      ret = SDL_SetRenderDrawColor(renderer, 60+2*i, 240-2*i, 50, 3*i );
aschiffler@6763
   285
      if (ret != 0) checkFailCount1++;
aschiffler@6763
   286
aschiffler@6763
   287
      ret = SDL_SetRenderDrawBlendMode(renderer,(((i/2)%3)==0) ? SDL_BLENDMODE_BLEND :
aschiffler@6763
   288
            (((i/2)%3)==1) ? SDL_BLENDMODE_ADD : SDL_BLENDMODE_NONE );
aschiffler@6763
   289
      if (ret != 0) checkFailCount2++;
aschiffler@6763
   290
aschiffler@6763
   291
      ret = SDL_RenderDrawLine(renderer, 0, 0, 79, i );
aschiffler@6763
   292
      if (ret != 0) checkFailCount3++;
aschiffler@6763
   293
   }
aschiffler@6763
   294
   SDLTest_AssertCheck(checkFailCount1 == 0, "Validate results from calls to SDL_SetRenderDrawColor, expected: 0, got: %i", checkFailCount1);
aschiffler@6763
   295
   SDLTest_AssertCheck(checkFailCount2 == 0, "Validate results from calls to SDL_SetRenderDrawBlendMode, expected: 0, got: %i", checkFailCount2);
aschiffler@6763
   296
   SDLTest_AssertCheck(checkFailCount3 == 0, "Validate results from calls to SDL_RenderDrawLine, expected: 0, got: %i", checkFailCount3);
aschiffler@6763
   297
aschiffler@6763
   298
   /* Draw points. */
aschiffler@6763
   299
   checkFailCount1 = 0;
aschiffler@6763
   300
   checkFailCount2 = 0;
aschiffler@6763
   301
   checkFailCount3 = 0;
aschiffler@6763
   302
   for (j=0; j<TESTRENDER_SCREEN_H; j+=3) {
aschiffler@6763
   303
      for (i=0; i<TESTRENDER_SCREEN_W; i+=3) {
aschiffler@6763
   304
         ret = SDL_SetRenderDrawColor(renderer, j*4, i*3, j*4, i*3 );
aschiffler@6763
   305
         if (ret != 0) checkFailCount1++;
aschiffler@6763
   306
aschiffler@6763
   307
         ret = SDL_SetRenderDrawBlendMode(renderer, ((((i+j)/3)%3)==0) ? SDL_BLENDMODE_BLEND :
aschiffler@6763
   308
               ((((i+j)/3)%3)==1) ? SDL_BLENDMODE_ADD : SDL_BLENDMODE_NONE );
aschiffler@6763
   309
         if (ret != 0) checkFailCount2++;
aschiffler@6763
   310
aschiffler@6763
   311
         ret = SDL_RenderDrawPoint(renderer, i, j );
aschiffler@6763
   312
         if (ret != 0) checkFailCount3++;
aschiffler@6763
   313
      }
aschiffler@6763
   314
   }   
aschiffler@6763
   315
   SDLTest_AssertCheck(checkFailCount1 == 0, "Validate results from calls to SDL_SetRenderDrawColor, expected: 0, got: %i", checkFailCount1);
aschiffler@6763
   316
   SDLTest_AssertCheck(checkFailCount2 == 0, "Validate results from calls to SDL_SetRenderDrawBlendMode, expected: 0, got: %i", checkFailCount2);
aschiffler@6763
   317
   SDLTest_AssertCheck(checkFailCount3 == 0, "Validate results from calls to SDL_RenderDrawPoint, expected: 0, got: %i", checkFailCount3);
aschiffler@6763
   318
aschiffler@6763
   319
   /* See if it's the same. */
aschiffler@6763
   320
   _compare( "Blended primitives output not the same.", SDLTest_ImagePrimitivesBlend(), ALLOWABLE_ERROR_BLENDED );
aschiffler@6763
   321
aschiffler@6763
   322
    return TEST_COMPLETED;
aschiffler@6763
   323
}
aschiffler@6763
   324
aschiffler@6763
   325
aschiffler@6763
   326
aschiffler@6763
   327
/**
aschiffler@6763
   328
 * @brief Tests some blitting routines.
aschiffler@6763
   329
 *
aschiffler@6763
   330
 * \sa
aschiffler@6763
   331
 * http://wiki.libsdl.org/moin.cgi/SDL_RenderCopy
aschiffler@6763
   332
 * http://wiki.libsdl.org/moin.cgi/SDL_DestroyTexture
aschiffler@6763
   333
 */
aschiffler@6763
   334
int
aschiffler@6763
   335
render_testBlit(void *arg)
aschiffler@6763
   336
{
aschiffler@6763
   337
   int ret;
aschiffler@6763
   338
   SDL_Rect rect;
aschiffler@6763
   339
   SDL_Texture *tface;
aschiffler@6763
   340
   Uint32 tformat;
aschiffler@6763
   341
   int taccess, tw, th;
aschiffler@6763
   342
   int i, j, ni, nj;
aschiffler@6763
   343
   int checkFailCount1;
aschiffler@6763
   344
aschiffler@6763
   345
aschiffler@6763
   346
   /* Need drawcolour or just skip test. */
aschiffler@6763
   347
   SDLTest_AssertCheck(_hasDrawColor(), "_hasDrawColor)");
aschiffler@6763
   348
aschiffler@6763
   349
   /* Create face surface. */
aschiffler@6763
   350
   tface = _loadTestFace();
aschiffler@6763
   351
   SDLTest_AssertCheck(tface != NULL,  "Verify _loadTestFace() result");
aschiffler@6763
   352
   if (tface == NULL) {
aschiffler@6763
   353
       return TEST_ABORTED;
aschiffler@6763
   354
   }
aschiffler@6763
   355
aschiffler@6763
   356
   /* Constant values. */
aschiffler@6763
   357
   ret = SDL_QueryTexture(tface, &tformat, &taccess, &tw, &th);
aschiffler@6763
   358
   SDLTest_AssertCheck(ret == 0, "Verify result from SDL_QueryTexture, expected 0, got %i", ret);
aschiffler@6763
   359
   rect.w = tw;
aschiffler@6763
   360
   rect.h = th;
aschiffler@6763
   361
   ni     = TESTRENDER_SCREEN_W - tw;
aschiffler@6763
   362
   nj     = TESTRENDER_SCREEN_H - th;
aschiffler@6763
   363
aschiffler@6763
   364
   /* Loop blit. */
aschiffler@6763
   365
   checkFailCount1 = 0;
aschiffler@6763
   366
   for (j=0; j <= nj; j+=4) {
aschiffler@6763
   367
      for (i=0; i <= ni; i+=4) {
aschiffler@6763
   368
         /* Blitting. */
aschiffler@6763
   369
         rect.x = i;
aschiffler@6763
   370
         rect.y = j;
aschiffler@6763
   371
         ret = SDL_RenderCopy(renderer, tface, NULL, &rect );
aschiffler@6763
   372
         if (ret != 0) checkFailCount1++;
aschiffler@6763
   373
      }
aschiffler@6763
   374
   }
aschiffler@6763
   375
   SDLTest_AssertCheck(checkFailCount1 == 0, "Validate results from calls to SDL_RenderCopy, expected: 0, got: %i", checkFailCount1);
aschiffler@6763
   376
aschiffler@6763
   377
   /* Clean up. */
aschiffler@6763
   378
   SDL_DestroyTexture( tface );
aschiffler@6763
   379
aschiffler@6763
   380
   /* See if it's the same */
aschiffler@6763
   381
   _compare( "Blit output not the same.", SDLTest_ImageBlit(), ALLOWABLE_ERROR_OPAQUE );
aschiffler@6763
   382
aschiffler@6763
   383
   return TEST_COMPLETED;
aschiffler@6763
   384
}
aschiffler@6763
   385
aschiffler@6763
   386
aschiffler@6763
   387
/**
aschiffler@6763
   388
 * @brief Blits doing colour tests.
aschiffler@6763
   389
 *
aschiffler@6763
   390
 * \sa
aschiffler@6763
   391
 * http://wiki.libsdl.org/moin.cgi/SDL_SetTextureColorMod
aschiffler@6763
   392
 * http://wiki.libsdl.org/moin.cgi/SDL_RenderCopy
aschiffler@6763
   393
 * http://wiki.libsdl.org/moin.cgi/SDL_DestroyTexture
aschiffler@6763
   394
 */
aschiffler@6763
   395
int
aschiffler@6763
   396
render_testBlitColor (void *arg)
aschiffler@6763
   397
{
aschiffler@6763
   398
   int ret;
aschiffler@6763
   399
   SDL_Rect rect;
aschiffler@6763
   400
   SDL_Texture *tface;
aschiffler@6763
   401
   Uint32 tformat;
aschiffler@6763
   402
   int taccess, tw, th;
aschiffler@6763
   403
   int i, j, ni, nj;
aschiffler@6763
   404
   int checkFailCount1;
aschiffler@6763
   405
   int checkFailCount2;
aschiffler@6763
   406
aschiffler@6763
   407
   /* Create face surface. */
aschiffler@6763
   408
   tface = _loadTestFace();
aschiffler@6763
   409
   SDLTest_AssertCheck(tface != NULL, "Verify _loadTestFace() result");
aschiffler@6763
   410
   if (tface == NULL) {
aschiffler@6763
   411
       return TEST_ABORTED;
aschiffler@6763
   412
   }
aschiffler@6763
   413
aschiffler@6763
   414
   /* Constant values. */
aschiffler@6763
   415
   ret = SDL_QueryTexture(tface, &tformat, &taccess, &tw, &th);
aschiffler@6763
   416
   SDLTest_AssertCheck(ret == 0, "Verify result from SDL_QueryTexture, expected 0, got %i", ret);
aschiffler@6763
   417
   rect.w = tw;
aschiffler@6763
   418
   rect.h = th;
aschiffler@6763
   419
   ni     = TESTRENDER_SCREEN_W - tw;
aschiffler@6763
   420
   nj     = TESTRENDER_SCREEN_H - th;
aschiffler@6763
   421
aschiffler@6763
   422
   /* Test blitting with colour mod. */
aschiffler@6763
   423
   checkFailCount1 = 0;
aschiffler@6763
   424
   checkFailCount2 = 0;
aschiffler@6763
   425
   for (j=0; j <= nj; j+=4) {
aschiffler@6763
   426
      for (i=0; i <= ni; i+=4) {
aschiffler@6763
   427
         /* Set colour mod. */
aschiffler@6763
   428
         ret = SDL_SetTextureColorMod( tface, (255/nj)*j, (255/ni)*i, (255/nj)*j );
aschiffler@6763
   429
         if (ret != 0) checkFailCount1++;
aschiffler@6763
   430
aschiffler@6763
   431
         /* Blitting. */
aschiffler@6763
   432
         rect.x = i;
aschiffler@6763
   433
         rect.y = j;
aschiffler@6763
   434
         ret = SDL_RenderCopy(renderer, tface, NULL, &rect );
aschiffler@6763
   435
         if (ret != 0) checkFailCount2++;
aschiffler@6763
   436
      }
aschiffler@6763
   437
   }
aschiffler@6763
   438
   SDLTest_AssertCheck(checkFailCount1 == 0, "Validate results from calls to SDL_SetTextureColorMod, expected: 0, got: %i", checkFailCount1);
aschiffler@6763
   439
   SDLTest_AssertCheck(checkFailCount2 == 0, "Validate results from calls to SDL_RenderCopy, expected: 0, got: %i", checkFailCount2);
aschiffler@6763
   440
aschiffler@6763
   441
   /* Clean up. */
aschiffler@6763
   442
   SDL_DestroyTexture( tface );
aschiffler@6763
   443
aschiffler@6763
   444
   /* See if it's the same. */
aschiffler@6763
   445
   _compare( "Blit output not the same (using SDL_SetTextureColorMod).",
aschiffler@6763
   446
            SDLTest_ImageBlitColor(), ALLOWABLE_ERROR_OPAQUE );
aschiffler@6763
   447
aschiffler@6763
   448
   return TEST_COMPLETED;
aschiffler@6763
   449
}
aschiffler@6763
   450
aschiffler@6763
   451
aschiffler@6763
   452
/**
aschiffler@6763
   453
 * @brief Tests blitting with alpha.
aschiffler@6763
   454
 *
aschiffler@6763
   455
 * \sa
aschiffler@6763
   456
 * http://wiki.libsdl.org/moin.cgi/SDL_SetTextureAlphaMod
aschiffler@6763
   457
 * http://wiki.libsdl.org/moin.cgi/SDL_RenderCopy
aschiffler@6763
   458
 * http://wiki.libsdl.org/moin.cgi/SDL_DestroyTexture
aschiffler@6763
   459
 */
aschiffler@6763
   460
int
aschiffler@6763
   461
render_testBlitAlpha (void *arg)
aschiffler@6763
   462
{
aschiffler@6763
   463
   int ret;
aschiffler@6763
   464
   SDL_Rect rect;
aschiffler@6763
   465
   SDL_Texture *tface;
aschiffler@6763
   466
   Uint32 tformat;
aschiffler@6763
   467
   int taccess, tw, th;
aschiffler@6763
   468
   int i, j, ni, nj;
aschiffler@6763
   469
   int checkFailCount1;
aschiffler@6763
   470
   int checkFailCount2;
aschiffler@6763
   471
aschiffler@6763
   472
aschiffler@6763
   473
   /* Need alpha or just skip test. */
aschiffler@6763
   474
   SDLTest_AssertCheck(_hasTexAlpha(), "_hasTexAlpha");
aschiffler@6763
   475
aschiffler@6763
   476
   /* Create face surface. */
aschiffler@6763
   477
   tface = _loadTestFace();
aschiffler@6763
   478
   SDLTest_AssertCheck(tface != NULL, "Verify _loadTestFace() result");
aschiffler@6763
   479
   if (tface == NULL) {
aschiffler@6763
   480
       return TEST_ABORTED;
aschiffler@6763
   481
   }
aschiffler@6763
   482
aschiffler@6763
   483
   /* Constant values. */
aschiffler@6763
   484
   ret = SDL_QueryTexture(tface, &tformat, &taccess, &tw, &th);
aschiffler@6763
   485
   SDLTest_AssertCheck(ret == 0, "Verify result from SDL_QueryTexture, expected 0, got %i", ret);
aschiffler@6763
   486
   rect.w = tw;
aschiffler@6763
   487
   rect.h = th;
aschiffler@6763
   488
   ni     = TESTRENDER_SCREEN_W - tw;
aschiffler@6763
   489
   nj     = TESTRENDER_SCREEN_H - th;
aschiffler@6763
   490
aschiffler@6763
   491
   /* Test blitting with alpha mod. */
aschiffler@6763
   492
   checkFailCount1 = 0;
aschiffler@6763
   493
   checkFailCount2 = 0;
aschiffler@6763
   494
   for (j=0; j <= nj; j+=4) {
aschiffler@6763
   495
      for (i=0; i <= ni; i+=4) {
aschiffler@6763
   496
         /* Set alpha mod. */
aschiffler@6763
   497
         ret = SDL_SetTextureAlphaMod( tface, (255/ni)*i );
aschiffler@6763
   498
         if (ret != 0) checkFailCount1++;
aschiffler@6763
   499
aschiffler@6763
   500
         /* Blitting. */
aschiffler@6763
   501
         rect.x = i;
aschiffler@6763
   502
         rect.y = j;
aschiffler@6763
   503
         ret = SDL_RenderCopy(renderer, tface, NULL, &rect );
aschiffler@6763
   504
         if (ret != 0) checkFailCount2++;
aschiffler@6763
   505
      }
aschiffler@6763
   506
   }   
aschiffler@6763
   507
   SDLTest_AssertCheck(checkFailCount1 == 0, "Validate results from calls to SDL_SetTextureAlphaMod, expected: 0, got: %i", checkFailCount1);
aschiffler@6763
   508
   SDLTest_AssertCheck(checkFailCount2 == 0, "Validate results from calls to SDL_RenderCopy, expected: 0, got: %i", checkFailCount2);
aschiffler@6763
   509
aschiffler@6763
   510
   /* Clean up. */
aschiffler@6763
   511
   SDL_DestroyTexture( tface );
aschiffler@6763
   512
aschiffler@6763
   513
   /* See if it's the same. */
aschiffler@6763
   514
   _compare( "Blit output not the same (using SDL_SetSurfaceAlphaMod).",
aschiffler@6763
   515
            SDLTest_ImageBlitAlpha(), ALLOWABLE_ERROR_BLENDED );
aschiffler@6763
   516
aschiffler@6763
   517
   return TEST_COMPLETED;
aschiffler@6763
   518
}
aschiffler@6763
   519
aschiffler@6763
   520
/* Helper functions */
aschiffler@6763
   521
aschiffler@6763
   522
/**
aschiffler@6763
   523
 * @brief Tests a blend mode.
aschiffler@6763
   524
 *
aschiffler@6763
   525
 * \sa
aschiffler@6763
   526
 * http://wiki.libsdl.org/moin.cgi/SDL_SetTextureBlendMode
aschiffler@6763
   527
 * http://wiki.libsdl.org/moin.cgi/SDL_RenderCopy
aschiffler@6763
   528
 */
aschiffler@6763
   529
static void
aschiffler@6763
   530
_testBlitBlendMode( SDL_Texture * tface, int mode )
aschiffler@6763
   531
{
aschiffler@6763
   532
   int ret;
aschiffler@6763
   533
   Uint32 tformat;
aschiffler@6763
   534
   int taccess, tw, th;
aschiffler@6763
   535
   int i, j, ni, nj;
aschiffler@6763
   536
   SDL_Rect rect;
aschiffler@6763
   537
   int checkFailCount1;
aschiffler@6763
   538
   int checkFailCount2;
aschiffler@6763
   539
aschiffler@6763
   540
   /* Clear surface. */
aschiffler@6763
   541
   _clearScreen();
aschiffler@6763
   542
aschiffler@6763
   543
   /* Constant values. */
aschiffler@6763
   544
   ret = SDL_QueryTexture(tface, &tformat, &taccess, &tw, &th);
aschiffler@6763
   545
   SDLTest_AssertCheck(ret == 0, "Verify result from SDL_QueryTexture, expected 0, got %i", ret);
aschiffler@6763
   546
   rect.w = tw;
aschiffler@6763
   547
   rect.h = th;
aschiffler@6763
   548
   ni     = TESTRENDER_SCREEN_W - tw;
aschiffler@6763
   549
   nj     = TESTRENDER_SCREEN_H - th;
aschiffler@6763
   550
aschiffler@6763
   551
   /* Test blend mode. */
aschiffler@6763
   552
   checkFailCount1 = 0;
aschiffler@6763
   553
   checkFailCount2 = 0;
aschiffler@6763
   554
   for (j=0; j <= nj; j+=4) {
aschiffler@6763
   555
      for (i=0; i <= ni; i+=4) {
aschiffler@6763
   556
         /* Set blend mode. */
aschiffler@6763
   557
         ret = SDL_SetTextureBlendMode( tface, (SDL_BlendMode)mode );
aschiffler@6763
   558
         if (ret != 0) checkFailCount1++;
aschiffler@6763
   559
aschiffler@6763
   560
         /* Blitting. */
aschiffler@6763
   561
         rect.x = i;
aschiffler@6763
   562
         rect.y = j;
aschiffler@6763
   563
         ret = SDL_RenderCopy(renderer, tface, NULL, &rect );
aschiffler@6763
   564
         if (ret != 0) checkFailCount2++;
aschiffler@6763
   565
      }
aschiffler@6763
   566
   }
aschiffler@6763
   567
   SDLTest_AssertCheck(checkFailCount1 == 0, "Validate results from calls to SDL_SetTextureBlendMode, expected: 0, got: %i", checkFailCount1);
aschiffler@6763
   568
   SDLTest_AssertCheck(checkFailCount2 == 0, "Validate results from calls to SDL_RenderCopy, expected: 0, got: %i", checkFailCount2);
aschiffler@6763
   569
}
aschiffler@6763
   570
aschiffler@6763
   571
aschiffler@6763
   572
/**
aschiffler@6763
   573
 * @brief Tests some more blitting routines.
aschiffler@6763
   574
 *
aschiffler@6763
   575
 * \sa
aschiffler@6763
   576
 * http://wiki.libsdl.org/moin.cgi/SDL_SetTextureColorMod
aschiffler@6763
   577
 * http://wiki.libsdl.org/moin.cgi/SDL_SetTextureAlphaMod
aschiffler@6763
   578
 * http://wiki.libsdl.org/moin.cgi/SDL_SetTextureBlendMode
aschiffler@6763
   579
 * http://wiki.libsdl.org/moin.cgi/SDL_DestroyTexture
aschiffler@6763
   580
 */
aschiffler@6763
   581
int
aschiffler@6763
   582
render_testBlitBlend (void *arg)
aschiffler@6763
   583
{
aschiffler@6763
   584
   int ret;
aschiffler@6763
   585
   SDL_Rect rect;
aschiffler@6763
   586
   SDL_Texture *tface;
aschiffler@6763
   587
   Uint32 tformat;
aschiffler@6763
   588
   int taccess, tw, th;
aschiffler@6763
   589
   int i, j, ni, nj;
aschiffler@6763
   590
   int mode;
aschiffler@6763
   591
   int checkFailCount1;
aschiffler@6763
   592
   int checkFailCount2;
aschiffler@6763
   593
   int checkFailCount3;
aschiffler@6763
   594
   int checkFailCount4;
aschiffler@6763
   595
aschiffler@6763
   596
   SDLTest_AssertCheck(_hasBlendModes(), "_hasBlendModes");
aschiffler@6763
   597
   SDLTest_AssertCheck(_hasTexColor(), "_hasTexColor");
aschiffler@6763
   598
   SDLTest_AssertCheck(_hasTexAlpha(), "_hasTexAlpha");
aschiffler@6763
   599
aschiffler@6763
   600
   /* Create face surface. */
aschiffler@6763
   601
   tface = _loadTestFace();
aschiffler@6763
   602
   SDLTest_AssertCheck(tface != NULL, "Verify _loadTestFace() result");
aschiffler@6763
   603
   if (tface == NULL) {
aschiffler@6763
   604
       return TEST_ABORTED;
aschiffler@6763
   605
   }
aschiffler@6763
   606
aschiffler@6763
   607
   /* Constant values. */
aschiffler@6763
   608
   ret = SDL_QueryTexture(tface, &tformat, &taccess, &tw, &th);
aschiffler@6763
   609
   SDLTest_AssertCheck(ret == 0, "Verify result from SDL_QueryTexture, expected 0, got %i", ret);
aschiffler@6763
   610
   rect.w = tw;
aschiffler@6763
   611
   rect.h = th;
aschiffler@6763
   612
   ni = TESTRENDER_SCREEN_W - tw;
aschiffler@6763
   613
   nj = TESTRENDER_SCREEN_H - th;
aschiffler@6763
   614
aschiffler@6763
   615
   /* Set alpha mod. */
aschiffler@6763
   616
   ret = SDL_SetTextureAlphaMod( tface, 100 );
aschiffler@6763
   617
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetTextureAlphaMod, expected: 0, got: %i", ret);
aschiffler@6763
   618
aschiffler@6763
   619
   /* Test None. */
aschiffler@6763
   620
   _testBlitBlendMode( tface, SDL_BLENDMODE_NONE );
aschiffler@6763
   621
   /* See if it's the same. */
aschiffler@6763
   622
   _compare( "Blit blending output not the same (using SDL_BLENDMODE_NONE).",
aschiffler@6763
   623
            SDLTest_ImageBlitBlendNone(), ALLOWABLE_ERROR_OPAQUE ); 
aschiffler@6763
   624
aschiffler@6763
   625
aschiffler@6763
   626
   /* Test Blend. */
aschiffler@6763
   627
   _testBlitBlendMode( tface, SDL_BLENDMODE_BLEND );
aschiffler@6763
   628
   _compare( "Blit blending output not the same (using SDL_BLENDMODE_BLEND).",
aschiffler@6763
   629
            SDLTest_ImageBlitBlend(), ALLOWABLE_ERROR_BLENDED );
aschiffler@6763
   630
aschiffler@6763
   631
aschiffler@6763
   632
   /* Test Add. */
aschiffler@6763
   633
   _testBlitBlendMode( tface, SDL_BLENDMODE_ADD );
aschiffler@6763
   634
   _compare( "Blit blending output not the same (using SDL_BLENDMODE_ADD).",
aschiffler@6763
   635
            SDLTest_ImageBlitBlendAdd(), ALLOWABLE_ERROR_BLENDED );
aschiffler@6763
   636
aschiffler@6763
   637
   /* Test Mod. */
aschiffler@6763
   638
   _testBlitBlendMode( tface, SDL_BLENDMODE_MOD);
aschiffler@6763
   639
   _compare( "Blit blending output not the same (using SDL_BLENDMODE_MOD).",
aschiffler@6763
   640
            SDLTest_ImageBlitBlendMod(), ALLOWABLE_ERROR_BLENDED );
aschiffler@6763
   641
aschiffler@6763
   642
   /* Clear surface. */
aschiffler@6763
   643
   _clearScreen();
aschiffler@6763
   644
aschiffler@6763
   645
   /* Loop blit. */
aschiffler@6763
   646
   checkFailCount1 = 0;
aschiffler@6763
   647
   checkFailCount2 = 0;
aschiffler@6763
   648
   checkFailCount3 = 0;
aschiffler@6763
   649
   checkFailCount4 = 0;
aschiffler@6763
   650
   for (j=0; j <= nj; j+=4) {
aschiffler@6763
   651
      for (i=0; i <= ni; i+=4) {
aschiffler@6763
   652
aschiffler@6763
   653
         /* Set colour mod. */
aschiffler@6763
   654
         ret = SDL_SetTextureColorMod( tface, (255/nj)*j, (255/ni)*i, (255/nj)*j );
aschiffler@6763
   655
         if (ret != 0) checkFailCount1++;
aschiffler@6763
   656
aschiffler@6763
   657
         /* Set alpha mod. */
aschiffler@6763
   658
         ret = SDL_SetTextureAlphaMod( tface, (100/ni)*i );
aschiffler@6763
   659
         if (ret != 0) checkFailCount2++;
aschiffler@6763
   660
aschiffler@6763
   661
         /* Crazy blending mode magic. */
aschiffler@6763
   662
         mode = (i/4*j/4) % 4;
aschiffler@6763
   663
         if (mode==0) mode = SDL_BLENDMODE_NONE;
aschiffler@6763
   664
         else if (mode==1) mode = SDL_BLENDMODE_BLEND;
aschiffler@6763
   665
         else if (mode==2) mode = SDL_BLENDMODE_ADD;
aschiffler@6763
   666
         else if (mode==3) mode = SDL_BLENDMODE_MOD;
aschiffler@6763
   667
         ret = SDL_SetTextureBlendMode( tface, (SDL_BlendMode)mode );
aschiffler@6763
   668
         if (ret != 0) checkFailCount3++;
aschiffler@6763
   669
aschiffler@6763
   670
         /* Blitting. */
aschiffler@6763
   671
         rect.x = i;
aschiffler@6763
   672
         rect.y = j;
aschiffler@6763
   673
         ret = SDL_RenderCopy(renderer, tface, NULL, &rect );
aschiffler@6763
   674
         if (ret != 0) checkFailCount4++;
aschiffler@6763
   675
      }
aschiffler@6763
   676
   }
aschiffler@6763
   677
   SDLTest_AssertCheck(checkFailCount1 == 0, "Validate results from calls to SDL_SetTextureColorMod, expected: 0, got: %i", checkFailCount1);
aschiffler@6763
   678
   SDLTest_AssertCheck(checkFailCount2 == 0, "Validate results from calls to SDL_SetTextureAlphaMod, expected: 0, got: %i", checkFailCount2);
aschiffler@6763
   679
   SDLTest_AssertCheck(checkFailCount3 == 0, "Validate results from calls to SDL_SetTextureBlendMode, expected: 0, got: %i", checkFailCount3);
aschiffler@6763
   680
   SDLTest_AssertCheck(checkFailCount4 == 0, "Validate results from calls to SDL_RenderCopy, expected: 0, got: %i", checkFailCount4);
aschiffler@6763
   681
aschiffler@6763
   682
   /* Clean up. */
aschiffler@6763
   683
   SDL_DestroyTexture( tface );
aschiffler@6763
   684
aschiffler@6763
   685
   /* Check to see if matches. */
aschiffler@6763
   686
   _compare( "Blit blending output not the same (using SDL_BLENDMODE_*).",
aschiffler@6763
   687
            SDLTest_ImageBlitBlendAll(), ALLOWABLE_ERROR_BLENDED);
aschiffler@6763
   688
aschiffler@6763
   689
   return TEST_COMPLETED;
aschiffler@6763
   690
}
aschiffler@6763
   691
aschiffler@6763
   692
aschiffler@6763
   693
/**
aschiffler@6763
   694
 * @brief Checks to see if functionality is supported. Helper function.
aschiffler@6763
   695
 */
aschiffler@6763
   696
static int
aschiffler@6763
   697
_isSupported( int code )
aschiffler@6763
   698
{
aschiffler@6763
   699
   return (code == 0);
aschiffler@6763
   700
}
aschiffler@6763
   701
aschiffler@6763
   702
/**
aschiffler@6763
   703
 * @brief Test to see if we can vary the draw colour. Helper function.
aschiffler@6763
   704
 *
aschiffler@6763
   705
 * \sa
aschiffler@6763
   706
 * http://wiki.libsdl.org/moin.cgi/SDL_SetRenderDrawColor
aschiffler@6763
   707
 * http://wiki.libsdl.org/moin.cgi/SDL_GetRenderDrawColor
aschiffler@6763
   708
 */
aschiffler@6763
   709
static int
aschiffler@6763
   710
_hasDrawColor (void)
aschiffler@6763
   711
{
aschiffler@6763
   712
   int ret, fail;
aschiffler@6763
   713
   Uint8 r, g, b, a;
aschiffler@6763
   714
aschiffler@6763
   715
   fail = 0;
aschiffler@6763
   716
aschiffler@6763
   717
   /* Set colour. */
aschiffler@6763
   718
   ret = SDL_SetRenderDrawColor(renderer, 100, 100, 100, 100 );
aschiffler@6763
   719
   if (!_isSupported(ret))
aschiffler@6763
   720
      fail = 1;
aschiffler@6763
   721
   ret = SDL_GetRenderDrawColor(renderer, &r, &g, &b, &a );
aschiffler@6763
   722
   if (!_isSupported(ret))
aschiffler@6763
   723
      fail = 1;
aschiffler@6772
   724
      
aschiffler@6763
   725
   /* Restore natural. */
aschiffler@6763
   726
   ret = SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE );
aschiffler@6763
   727
   if (!_isSupported(ret))
aschiffler@6763
   728
      fail = 1;
aschiffler@6763
   729
aschiffler@6763
   730
   /* Something failed, consider not available. */
aschiffler@6763
   731
   if (fail)
aschiffler@6763
   732
      return 0;
aschiffler@6772
   733
      
aschiffler@6763
   734
   /* Not set properly, consider failed. */
aschiffler@6763
   735
   else if ((r != 100) || (g != 100) || (b != 100) || (a != 100))
aschiffler@6763
   736
      return 0;
aschiffler@6763
   737
   return 1;
aschiffler@6763
   738
}
aschiffler@6763
   739
aschiffler@6763
   740
/**
aschiffler@6763
   741
 * @brief Test to see if we can vary the blend mode. Helper function.
aschiffler@6763
   742
 *
aschiffler@6763
   743
 * \sa
aschiffler@6763
   744
 * http://wiki.libsdl.org/moin.cgi/SDL_SetRenderDrawBlendMode
aschiffler@6763
   745
 * http://wiki.libsdl.org/moin.cgi/SDL_GetRenderDrawBlendMode
aschiffler@6763
   746
 */
aschiffler@6763
   747
static int
aschiffler@6763
   748
_hasBlendModes (void)
aschiffler@6763
   749
{
aschiffler@6763
   750
   int fail;
aschiffler@6763
   751
   int ret;
aschiffler@6763
   752
   SDL_BlendMode mode;
aschiffler@6763
   753
aschiffler@6763
   754
   fail = 0;
aschiffler@6763
   755
aschiffler@6763
   756
   ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_BLEND );
aschiffler@6763
   757
   if (!_isSupported(ret))
aschiffler@6763
   758
      fail = 1;
aschiffler@6763
   759
   ret = SDL_GetRenderDrawBlendMode(renderer, &mode );
aschiffler@6763
   760
   if (!_isSupported(ret))
aschiffler@6763
   761
      fail = 1;
aschiffler@6763
   762
   ret = (mode != SDL_BLENDMODE_BLEND);
aschiffler@6763
   763
   if (!_isSupported(ret))
aschiffler@6763
   764
      fail = 1;
aschiffler@6763
   765
   ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_ADD );
aschiffler@6763
   766
   if (!_isSupported(ret))
aschiffler@6763
   767
      fail = 1;
aschiffler@6763
   768
   ret = SDL_GetRenderDrawBlendMode(renderer, &mode );
aschiffler@6763
   769
   if (!_isSupported(ret))
aschiffler@6763
   770
      fail = 1;
aschiffler@6763
   771
   ret = (mode != SDL_BLENDMODE_ADD);
aschiffler@6763
   772
   if (!_isSupported(ret))
aschiffler@6763
   773
      fail = 1;
aschiffler@6763
   774
   ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_MOD );
aschiffler@6763
   775
   if (!_isSupported(ret))
aschiffler@6763
   776
      fail = 1;
aschiffler@6763
   777
   ret = SDL_GetRenderDrawBlendMode(renderer, &mode );
aschiffler@6763
   778
   if (!_isSupported(ret))
aschiffler@6763
   779
      fail = 1;
aschiffler@6763
   780
   ret = (mode != SDL_BLENDMODE_MOD);
aschiffler@6763
   781
   if (!_isSupported(ret))
aschiffler@6763
   782
      fail = 1;
aschiffler@6763
   783
   ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE );
aschiffler@6763
   784
   if (!_isSupported(ret))
aschiffler@6763
   785
      fail = 1;
aschiffler@6763
   786
   ret = SDL_GetRenderDrawBlendMode(renderer, &mode );
aschiffler@6763
   787
   if (!_isSupported(ret))
aschiffler@6763
   788
      fail = 1;
aschiffler@6763
   789
   ret = (mode != SDL_BLENDMODE_NONE);
aschiffler@6763
   790
   if (!_isSupported(ret))
aschiffler@6763
   791
      fail = 1;
aschiffler@6763
   792
aschiffler@6763
   793
   return !fail;
aschiffler@6763
   794
}
aschiffler@6763
   795
aschiffler@6763
   796
aschiffler@6763
   797
/**
aschiffler@6763
   798
 * @brief Loads the test image 'Face' as texture. Helper function.
aschiffler@6763
   799
 *
aschiffler@6763
   800
 * \sa
aschiffler@6763
   801
 * http://wiki.libsdl.org/moin.cgi/SDL_CreateTextureFromSurface
aschiffler@6763
   802
 */
aschiffler@6763
   803
static SDL_Texture *
aschiffler@6763
   804
_loadTestFace(void)
aschiffler@6763
   805
{
aschiffler@6763
   806
   SDL_Surface *face;
aschiffler@6763
   807
   SDL_Texture *tface;
aschiffler@6763
   808
aschiffler@6763
   809
   face = SDLTest_ImageFace();
aschiffler@6763
   810
   if (face == NULL) {
aschiffler@6763
   811
      return NULL;
aschiffler@6763
   812
   }
aschiffler@6763
   813
   
aschiffler@6763
   814
   tface = SDL_CreateTextureFromSurface(renderer, face);
aschiffler@6763
   815
   if (tface == NULL) {
aschiffler@6763
   816
       SDLTest_LogError("SDL_CreateTextureFromSurface() failed with error: %s", SDL_GetError());
aschiffler@6763
   817
   }
aschiffler@6763
   818
aschiffler@6763
   819
   SDL_FreeSurface(face);
aschiffler@6763
   820
aschiffler@6763
   821
   return tface;
aschiffler@6763
   822
}
aschiffler@6763
   823
aschiffler@6763
   824
aschiffler@6763
   825
/**
aschiffler@6763
   826
 * @brief Test to see if can set texture colour mode. Helper function.
aschiffler@6763
   827
 *
aschiffler@6763
   828
 * \sa
aschiffler@6763
   829
 * http://wiki.libsdl.org/moin.cgi/SDL_SetTextureColorMod
aschiffler@6763
   830
 * http://wiki.libsdl.org/moin.cgi/SDL_GetTextureColorMod
aschiffler@6763
   831
 * http://wiki.libsdl.org/moin.cgi/SDL_DestroyTexture
aschiffler@6763
   832
 */
aschiffler@6763
   833
static int
aschiffler@6763
   834
_hasTexColor (void)
aschiffler@6763
   835
{
aschiffler@6763
   836
   int fail;
aschiffler@6763
   837
   int ret;
aschiffler@6763
   838
   SDL_Texture *tface;
aschiffler@6763
   839
   Uint8 r, g, b;
aschiffler@6763
   840
aschiffler@6763
   841
   /* Get test face. */
aschiffler@6763
   842
   tface = _loadTestFace();
aschiffler@6772
   843
   if (tface == NULL)
aschiffler@6763
   844
      return 0;
aschiffler@6763
   845
aschiffler@6763
   846
   /* See if supported. */
aschiffler@6763
   847
   fail = 0;
aschiffler@6763
   848
   ret = SDL_SetTextureColorMod( tface, 100, 100, 100 );
aschiffler@6763
   849
   if (!_isSupported(ret))
aschiffler@6763
   850
      fail = 1;
aschiffler@6763
   851
   ret = SDL_GetTextureColorMod( tface, &r, &g, &b );
aschiffler@6763
   852
   if (!_isSupported(ret))
aschiffler@6763
   853
      fail = 1;
aschiffler@6763
   854
aschiffler@6763
   855
   /* Clean up. */
aschiffler@6763
   856
   SDL_DestroyTexture( tface );
aschiffler@6763
   857
aschiffler@6763
   858
   if (fail)
aschiffler@6763
   859
      return 0;
aschiffler@6763
   860
   else if ((r != 100) || (g != 100) || (b != 100))
aschiffler@6763
   861
      return 0;
aschiffler@6763
   862
   return 1;
aschiffler@6763
   863
}
aschiffler@6763
   864
aschiffler@6763
   865
/**
aschiffler@6763
   866
 * @brief Test to see if we can vary the alpha of the texture. Helper function.
aschiffler@6763
   867
 *
aschiffler@6763
   868
 * \sa
aschiffler@6763
   869
 *  http://wiki.libsdl.org/moin.cgi/SDL_SetTextureAlphaMod
aschiffler@6763
   870
 *  http://wiki.libsdl.org/moin.cgi/SDL_GetTextureAlphaMod
aschiffler@6763
   871
 *  http://wiki.libsdl.org/moin.cgi/SDL_DestroyTexture
aschiffler@6763
   872
 */
aschiffler@6763
   873
static int
aschiffler@6763
   874
_hasTexAlpha(void)
aschiffler@6763
   875
{
aschiffler@6763
   876
   int fail;
aschiffler@6763
   877
   int ret;
aschiffler@6763
   878
   SDL_Texture *tface;
aschiffler@6763
   879
   Uint8 a;
aschiffler@6763
   880
aschiffler@6763
   881
   /* Get test face. */
aschiffler@6763
   882
   tface = _loadTestFace();
aschiffler@6772
   883
   if (tface == NULL)
aschiffler@6763
   884
      return 0;
aschiffler@6763
   885
aschiffler@6763
   886
   /* See if supported. */
aschiffler@6763
   887
   fail = 0;
aschiffler@6763
   888
   ret = SDL_SetTextureAlphaMod( tface, 100 );
aschiffler@6763
   889
   if (!_isSupported(ret))
aschiffler@6763
   890
      fail = 1;
aschiffler@6763
   891
   ret = SDL_GetTextureAlphaMod( tface, &a );
aschiffler@6763
   892
   if (!_isSupported(ret))
aschiffler@6763
   893
      fail = 1;
aschiffler@6763
   894
aschiffler@6763
   895
   /* Clean up. */
aschiffler@6763
   896
   SDL_DestroyTexture( tface );
aschiffler@6763
   897
aschiffler@6763
   898
   if (fail)
aschiffler@6763
   899
      return 0;
aschiffler@6763
   900
   else if (a != 100)
aschiffler@6763
   901
      return 0;
aschiffler@6763
   902
   return 1;
aschiffler@6763
   903
}
aschiffler@6763
   904
aschiffler@6772
   905
/* Counter for _compare calls use for filename creation when comparisons fail */
aschiffler@6772
   906
static int _renderCompareCount = 0;
aschiffler@6763
   907
aschiffler@6763
   908
/**
aschiffler@6763
   909
 * @brief Compares screen pixels with image pixels. Helper function.
aschiffler@6763
   910
 *
aschiffler@6763
   911
 * @param msg Message on failure.
aschiffler@6763
   912
 * @param s Image to compare against.
aschiffler@6763
   913
 * @return 0 on success.
aschiffler@6763
   914
 *
aschiffler@6763
   915
 * \sa
aschiffler@6763
   916
 * http://wiki.libsdl.org/moin.cgi/SDL_RenderReadPixels
aschiffler@6763
   917
 * http://wiki.libsdl.org/moin.cgi/SDL_CreateRGBSurfaceFrom
aschiffler@6763
   918
 * http://wiki.libsdl.org/moin.cgi/SDL_FreeSurface
aschiffler@6763
   919
 */
aschiffler@6763
   920
static void
aschiffler@6763
   921
_compare(const char *msg, SDL_Surface *s, int allowable_error)
aschiffler@6763
   922
{
aschiffler@6763
   923
   int ret;
aschiffler@6763
   924
   SDL_Rect rect;
aschiffler@6772
   925
   Uint8 pix[4*TESTRENDER_SCREEN_W*TESTRENDER_SCREEN_H];
aschiffler@6763
   926
   SDL_Surface *testsur;
aschiffler@6763
   927
   char imageFilename[128];
aschiffler@6763
   928
   char referenceFilename[128];
aschiffler@6763
   929
aschiffler@6763
   930
   /* Read pixels. */
aschiffler@6763
   931
   /* Explicitly specify the rect in case the window isn't expected size... */
aschiffler@6763
   932
   rect.x = 0;
aschiffler@6763
   933
   rect.y = 0;
aschiffler@6772
   934
   rect.w = TESTRENDER_SCREEN_W;
aschiffler@6772
   935
   rect.h = TESTRENDER_SCREEN_H;
aschiffler@6763
   936
   ret = SDL_RenderReadPixels(renderer, &rect, RENDER_COMPARE_FORMAT, pix, 80*4 );
aschiffler@6763
   937
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_RenderReadPixels, expected: 0, got: %i", ret);
aschiffler@6763
   938
aschiffler@6763
   939
   /* Create surface. */
aschiffler@6763
   940
   testsur = SDL_CreateRGBSurfaceFrom( pix, TESTRENDER_SCREEN_W, TESTRENDER_SCREEN_H, 32, TESTRENDER_SCREEN_W*4,
aschiffler@6763
   941
                                       RENDER_COMPARE_RMASK, RENDER_COMPARE_GMASK, RENDER_COMPARE_BMASK, RENDER_COMPARE_AMASK);
aschiffler@6763
   942
   SDLTest_AssertCheck(testsur != NULL, "Verify result from SDL_CreateRGBSurfaceFrom");
aschiffler@6763
   943
aschiffler@6763
   944
   /* Compare surface. */
aschiffler@6763
   945
   ret = SDLTest_CompareSurfaces( testsur, s, allowable_error );
aschiffler@6763
   946
   SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
aschiffler@6763
   947
aschiffler@6772
   948
   /* Save source image and reference image for analysis */
aschiffler@6763
   949
   _renderCompareCount++;
aschiffler@6763
   950
   if (ret != 0) {
aschiffler@6772
   951
      SDL_snprintf(imageFilename, 127, "compare%04d_SourceImage.bmp", _renderCompareCount);
aschiffler@6763
   952
      SDL_SaveBMP(testsur, imageFilename);
aschiffler@6772
   953
      SDL_snprintf(referenceFilename, 127, "compare%04d_ReferenceImage.bmp", _renderCompareCount);
aschiffler@6763
   954
      SDL_SaveBMP(s, referenceFilename);
aschiffler@6772
   955
      SDLTest_LogError("Surfaces from failed comparison saved as '%s' and '%s'", imageFilename, referenceFilename);
aschiffler@6763
   956
   }
aschiffler@6763
   957
aschiffler@6763
   958
   /* Clean up. */
aschiffler@6772
   959
   SDL_FreeSurface(testsur);
aschiffler@6763
   960
}
aschiffler@6763
   961
aschiffler@6763
   962
/**
aschiffler@6763
   963
 * @brief Clears the screen. Helper function.
aschiffler@6763
   964
 *
aschiffler@6763
   965
 * \sa
aschiffler@6763
   966
 * http://wiki.libsdl.org/moin.cgi/SDL_SetRenderDrawColor
aschiffler@6763
   967
 * http://wiki.libsdl.org/moin.cgi/SDL_RenderFillRect
aschiffler@6763
   968
 * http://wiki.libsdl.org/moin.cgi/SDL_SetRenderDrawBlendMode
aschiffler@6763
   969
 */
aschiffler@6763
   970
static int
aschiffler@6763
   971
_clearScreen(void)
aschiffler@6763
   972
{
aschiffler@6763
   973
   int ret;
aschiffler@6763
   974
aschiffler@6763
   975
   /* Set colour. */
aschiffler@6763
   976
   ret = SDL_SetRenderDrawColor(renderer, 0, 0, 0, SDL_ALPHA_OPAQUE );
aschiffler@6763
   977
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawColor, expected: 0, got: %i", ret);
aschiffler@6763
   978
aschiffler@6763
   979
   /* Clear screen. */
aschiffler@6763
   980
   ret = SDL_RenderFillRect(renderer, NULL );
aschiffler@6763
   981
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_RenderFillRect, expected: 0, got: %i", ret);
aschiffler@6763
   982
aschiffler@6763
   983
   /* Set defaults. */
aschiffler@6763
   984
   ret = SDL_SetRenderDrawBlendMode(renderer, SDL_BLENDMODE_NONE );
aschiffler@6763
   985
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawBlendMode, expected: 0, got: %i", ret);
aschiffler@6763
   986
aschiffler@6763
   987
   ret = SDL_SetRenderDrawColor(renderer, 255, 255, 255, SDL_ALPHA_OPAQUE );
aschiffler@6763
   988
   SDLTest_AssertCheck(ret == 0, "Validate result from SDL_SetRenderDrawColor, expected: 0, got: %i", ret);
aschiffler@6763
   989
aschiffler@6763
   990
   return 0;
aschiffler@6763
   991
}
aschiffler@6763
   992
aschiffler@6763
   993
/* ================= Test References ================== */
aschiffler@6763
   994
aschiffler@6763
   995
/* Render test cases */
aschiffler@6763
   996
static const SDLTest_TestCaseReference renderTest1 =
aschiffler@6763
   997
		{ (SDLTest_TestCaseFp)render_testGetNumRenderDrivers, "render_testGetNumRenderDrivers", "Tests call to SDL_GetNumRenderDrivers", TEST_ENABLED };
aschiffler@6763
   998
aschiffler@6763
   999
static const SDLTest_TestCaseReference renderTest2 =
aschiffler@6763
  1000
		{ (SDLTest_TestCaseFp)render_testPrimitives, "render_testPrimitives", "Tests rendering primitives", TEST_ENABLED };
aschiffler@6763
  1001
aschiffler@6763
  1002
static const SDLTest_TestCaseReference renderTest3 =
aschiffler@6763
  1003
		{ (SDLTest_TestCaseFp)render_testPrimitivesBlend, "render_testPrimitivesBlend", "Tests rendering primitives with blending", TEST_ENABLED };
aschiffler@6763
  1004
aschiffler@6763
  1005
static const SDLTest_TestCaseReference renderTest4 =
aschiffler@6763
  1006
		{ (SDLTest_TestCaseFp)render_testBlit, "render_testBlit", "Tests blitting", TEST_ENABLED };
aschiffler@6763
  1007
aschiffler@6763
  1008
static const SDLTest_TestCaseReference renderTest5 =
aschiffler@6763
  1009
		{ (SDLTest_TestCaseFp)render_testBlitColor, "render_testBlitColor", "Tests blitting with color", TEST_ENABLED };
aschiffler@6763
  1010
aschiffler@6763
  1011
static const SDLTest_TestCaseReference renderTest6 =
aschiffler@6763
  1012
		{ (SDLTest_TestCaseFp)render_testBlitAlpha, "render_testBlitAlpha", "Tests blitting with alpha", TEST_ENABLED };
aschiffler@6763
  1013
aschiffler@6763
  1014
static const SDLTest_TestCaseReference renderTest7 =
aschiffler@6763
  1015
		{  (SDLTest_TestCaseFp)render_testBlitBlend, "render_testBlitBlend", "Tests blitting with blending", TEST_ENABLED };
aschiffler@6763
  1016
aschiffler@6763
  1017
/* Sequence of Render test cases */
aschiffler@6763
  1018
static const SDLTest_TestCaseReference *renderTests[] =  {
aschiffler@6763
  1019
	&renderTest1, &renderTest2, &renderTest3, &renderTest4, &renderTest5, &renderTest6, &renderTest7, NULL
aschiffler@6763
  1020
};
aschiffler@6763
  1021
aschiffler@6763
  1022
/* Render test suite (global) */
aschiffler@6763
  1023
SDLTest_TestSuiteReference renderTestSuite = {
aschiffler@6763
  1024
	"Render",
aschiffler@6763
  1025
	InitCreateRenderer,
aschiffler@6763
  1026
	renderTests,
aschiffler@6763
  1027
	CleanupDestroyRenderer
aschiffler@6763
  1028
};