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