test/testautomation_surface.c
author Sam Lantinga <slouken@libsdl.org>
Thu, 07 Dec 2017 16:08:09 -0800
changeset 11730 ac6c607e065c
parent 9282 e3ee6ba9eae8
child 13249 0d2519c40e47
permissions -rw-r--r--
Enable building the Metal renderer by default, and weak link the Metal framework so the SDL library is safe to use on older Macs
Also generate iOS versions of the Metal shaders
aschiffler@6773
     1
/**
aschiffler@6773
     2
 * Original code: automated SDL surface test written by Edgar Simo "bobbens"
aschiffler@6773
     3
 * Adapted/rewritten for test lib by Andreas Schiffler
aschiffler@6773
     4
 */
aschiffler@6773
     5
aschiffler@6780
     6
/* Supress C4996 VS compiler warnings for unlink() */
aschiffler@6811
     7
#define _CRT_SECURE_NO_DEPRECATE
aschiffler@6780
     8
#define _CRT_NONSTDC_NO_DEPRECATE
aschiffler@6780
     9
aschiffler@6773
    10
#include <stdio.h>
icculus@9282
    11
#ifndef _MSC_VER
icculus@9278
    12
#include <unistd.h>
icculus@9281
    13
#endif
aschiffler@6773
    14
#include <sys/stat.h>
aschiffler@6773
    15
aschiffler@6773
    16
#include "SDL.h"
aschiffler@6773
    17
#include "SDL_test.h"
aschiffler@6773
    18
slouken@8673
    19
#ifdef __MACOSX__
slouken@8673
    20
#include <unistd.h> /* For unlink() */
slouken@8673
    21
#endif
slouken@8673
    22
aschiffler@6773
    23
/* ================= Test Case Implementation ================== */
aschiffler@6773
    24
aschiffler@6773
    25
/* Shared test surface */
aschiffler@6773
    26
aschiffler@6779
    27
static SDL_Surface *referenceSurface = NULL;
aschiffler@6779
    28
static SDL_Surface *testSurface = NULL;
aschiffler@6779
    29
aschiffler@6779
    30
/* Helper functions for the test cases */
aschiffler@6779
    31
aschiffler@6779
    32
#define TEST_SURFACE_WIDTH testSurface->w
aschiffler@6779
    33
#define TEST_SURFACE_HEIGHT testSurface->h
aschiffler@6773
    34
aschiffler@6773
    35
/* Fixture */
aschiffler@6773
    36
aschiffler@6811
    37
/* Create a 32-bit writable surface for blitting tests */
aschiffler@6773
    38
void
aschiffler@6773
    39
_surfaceSetUp(void *arg)
aschiffler@6773
    40
{
aschiffler@6811
    41
    int result;
aschiffler@6811
    42
    SDL_BlendMode blendMode = SDL_BLENDMODE_NONE;
aschiffler@6811
    43
    SDL_BlendMode currentBlendMode;
aschiffler@6811
    44
    Uint32 rmask, gmask, bmask, amask;
aschiffler@6811
    45
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
aschiffler@6811
    46
    rmask = 0xff000000;
aschiffler@6811
    47
    gmask = 0x00ff0000;
aschiffler@6811
    48
    bmask = 0x0000ff00;
aschiffler@6811
    49
    amask = 0x000000ff;
aschiffler@6811
    50
#else
aschiffler@6811
    51
    rmask = 0x000000ff;
aschiffler@6811
    52
    gmask = 0x0000ff00;
aschiffler@6811
    53
    bmask = 0x00ff0000;
aschiffler@6811
    54
    amask = 0xff000000;
aschiffler@6811
    55
#endif
aschiffler@6811
    56
aschiffler@6811
    57
    referenceSurface = SDLTest_ImageBlit(); /* For size info */
aschiffler@6811
    58
    testSurface = SDL_CreateRGBSurface(SDL_SWSURFACE, referenceSurface->w, referenceSurface->h, 32, rmask, gmask, bmask, amask);
aschiffler@6779
    59
    SDLTest_AssertCheck(testSurface != NULL, "Check that testSurface is not NULL");
aschiffler@6811
    60
    if (testSurface != NULL) {
aschiffler@6811
    61
      /* Disable blend mode for target surface */
aschiffler@6811
    62
      result = SDL_SetSurfaceBlendMode(testSurface, blendMode);
aschiffler@6811
    63
      SDLTest_AssertCheck(result == 0, "Validate result from SDL_SetSurfaceBlendMode, expected: 0, got: %i", result);
aschiffler@6811
    64
      result = SDL_GetSurfaceBlendMode(testSurface, &currentBlendMode);
aschiffler@6811
    65
      SDLTest_AssertCheck(result == 0, "Validate result from SDL_GetSurfaceBlendMode, expected: 0, got: %i", result);
slouken@7191
    66
      SDLTest_AssertCheck(currentBlendMode == blendMode, "Validate blendMode, expected: %i, got: %i", blendMode, currentBlendMode);
aschiffler@6811
    67
    }
aschiffler@6773
    68
}
aschiffler@6773
    69
aschiffler@6773
    70
void
aschiffler@6773
    71
_surfaceTearDown(void *arg)
aschiffler@6773
    72
{
slouken@7720
    73
    SDL_FreeSurface(referenceSurface);
slouken@7720
    74
    referenceSurface = NULL;
slouken@7720
    75
    SDL_FreeSurface(testSurface);
slouken@7720
    76
    testSurface = NULL;
aschiffler@6773
    77
}
aschiffler@6773
    78
aschiffler@6773
    79
/**
aschiffler@6773
    80
 * Helper that clears the test surface
aschiffler@6773
    81
 */
aschiffler@6773
    82
void _clearTestSurface()
aschiffler@6773
    83
{
slouken@7191
    84
    int ret;
slouken@7191
    85
    Uint32 color;
aschiffler@6811
    86
slouken@7191
    87
    /* Clear surface. */
slouken@7191
    88
    color = SDL_MapRGBA( testSurface->format, 0, 0, 0, 0);
slouken@7191
    89
    SDLTest_AssertPass("Call to SDL_MapRGBA()");
slouken@7191
    90
    ret = SDL_FillRect( testSurface, NULL, color);
slouken@7191
    91
    SDLTest_AssertPass("Call to SDL_FillRect()");
slouken@7191
    92
    SDLTest_AssertCheck(ret == 0, "Verify result from SDL_FillRect, expected: 0, got: %i", ret);
aschiffler@6773
    93
}
aschiffler@6773
    94
aschiffler@6773
    95
/**
aschiffler@6773
    96
 * Helper that blits in a specific blend mode, -1 for basic blitting, -2 for color mod, -3 for alpha mod, -4 for mixed blend modes.
aschiffler@6773
    97
 */
aschiffler@6773
    98
void _testBlitBlendMode(int mode)
aschiffler@6773
    99
{
slouken@7191
   100
    int ret;
slouken@7191
   101
    int i, j, ni, nj;
slouken@7191
   102
    SDL_Surface *face;
slouken@7191
   103
    SDL_Rect rect;
slouken@7191
   104
    int nmode;
slouken@7191
   105
    SDL_BlendMode bmode;
slouken@7191
   106
    int checkFailCount1;
slouken@7191
   107
    int checkFailCount2;
slouken@7191
   108
    int checkFailCount3;
slouken@7191
   109
    int checkFailCount4;
aschiffler@6773
   110
slouken@7191
   111
    /* Check test surface */
slouken@7191
   112
    SDLTest_AssertCheck(testSurface != NULL, "Verify testSurface is not NULL");
slouken@7191
   113
    if (testSurface == NULL) return;
slouken@7191
   114
slouken@7191
   115
    /* Create sample surface */
slouken@7191
   116
    face = SDLTest_ImageFace();
slouken@7191
   117
    SDLTest_AssertCheck(face != NULL, "Verify face surface is not NULL");
slouken@7191
   118
    if (face == NULL) return;
aschiffler@6773
   119
slouken@7191
   120
        /* Reset alpha modulation */
slouken@7191
   121
    ret = SDL_SetSurfaceAlphaMod(face, 255);
slouken@7191
   122
    SDLTest_AssertPass("Call to SDL_SetSurfaceAlphaMod()");
slouken@7191
   123
    SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SetSurfaceAlphaMod(), expected: 0, got: %i", ret);
aschiffler@6811
   124
slouken@7191
   125
        /* Reset color modulation */
slouken@7191
   126
    ret = SDL_SetSurfaceColorMod(face, 255, 255, 255);
slouken@7191
   127
    SDLTest_AssertPass("Call to SDL_SetSurfaceColorMod()");
slouken@7191
   128
    SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SetSurfaceColorMod(), expected: 0, got: %i", ret);
aschiffler@6811
   129
slouken@7191
   130
        /* Reset color key */
slouken@7191
   131
    ret = SDL_SetColorKey(face, SDL_FALSE, 0);
slouken@7191
   132
    SDLTest_AssertPass("Call to SDL_SetColorKey()");
slouken@7191
   133
    SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SetColorKey(), expected: 0, got: %i", ret);
aschiffler@6811
   134
slouken@7191
   135
    /* Clear the test surface */
aschiffler@6773
   136
        _clearTestSurface();
slouken@7191
   137
slouken@7191
   138
    /* Target rect size */
slouken@7191
   139
    rect.w = face->w;
slouken@7191
   140
    rect.h = face->h;
slouken@7191
   141
slouken@7191
   142
    /* Steps to take */
slouken@7191
   143
    ni = testSurface->w - face->w;
slouken@7191
   144
    nj = testSurface->h - face->h;
aschiffler@6773
   145
slouken@7191
   146
    /* Optionally set blend mode. */
slouken@7191
   147
    if (mode >= 0) {
slouken@7191
   148
        ret = SDL_SetSurfaceBlendMode( face, (SDL_BlendMode)mode );
slouken@7191
   149
        SDLTest_AssertPass("Call to SDL_SetSurfaceBlendMode()");
slouken@7191
   150
        SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SetSurfaceBlendMode(..., %i), expected: 0, got: %i", mode, ret);
slouken@7191
   151
    }
aschiffler@6773
   152
slouken@7191
   153
    /* Test blend mode. */
slouken@7191
   154
    checkFailCount1 = 0;
slouken@7191
   155
    checkFailCount2 = 0;
slouken@7191
   156
    checkFailCount3 = 0;
slouken@7191
   157
    checkFailCount4 = 0;
slouken@7191
   158
    for (j=0; j <= nj; j+=4) {
slouken@7191
   159
      for (i=0; i <= ni; i+=4) {
slouken@7191
   160
        if (mode == -2) {
slouken@7191
   161
            /* Set color mod. */
slouken@7191
   162
            ret = SDL_SetSurfaceColorMod( face, (255/nj)*j, (255/ni)*i, (255/nj)*j );
slouken@7191
   163
            if (ret != 0) checkFailCount2++;
slouken@7191
   164
        }
slouken@7191
   165
        else if (mode == -3) {
slouken@7191
   166
            /* Set alpha mod. */
slouken@7191
   167
            ret = SDL_SetSurfaceAlphaMod( face, (255/ni)*i );
slouken@7191
   168
            if (ret != 0) checkFailCount3++;
slouken@7191
   169
        }
slouken@7191
   170
        else if (mode == -4) {
slouken@7191
   171
            /* Crazy blending mode magic. */
slouken@7191
   172
            nmode = (i/4*j/4) % 4;
slouken@7191
   173
            if (nmode==0) {
slouken@7191
   174
                bmode = SDL_BLENDMODE_NONE;
slouken@7191
   175
            } else if (nmode==1) {
slouken@7191
   176
                bmode = SDL_BLENDMODE_BLEND;
slouken@7191
   177
            } else if (nmode==2) {
slouken@7191
   178
                bmode = SDL_BLENDMODE_ADD;
slouken@7191
   179
            } else if (nmode==3) {
slouken@7191
   180
                bmode = SDL_BLENDMODE_MOD;
slouken@7191
   181
            }
slouken@7191
   182
            ret = SDL_SetSurfaceBlendMode( face, bmode );
slouken@7191
   183
            if (ret != 0) checkFailCount4++;
slouken@7191
   184
        }
slouken@7191
   185
slouken@7191
   186
         /* Blitting. */
slouken@7191
   187
         rect.x = i;
slouken@7191
   188
         rect.y = j;
slouken@7191
   189
         ret = SDL_BlitSurface( face, NULL, testSurface, &rect );
slouken@7191
   190
         if (ret != 0) checkFailCount1++;
slouken@7191
   191
      }
slouken@7191
   192
    }
slouken@7191
   193
    SDLTest_AssertCheck(checkFailCount1 == 0, "Validate results from calls to SDL_BlitSurface, expected: 0, got: %i", checkFailCount1);
slouken@7191
   194
    SDLTest_AssertCheck(checkFailCount2 == 0, "Validate results from calls to SDL_SetSurfaceColorMod, expected: 0, got: %i", checkFailCount2);
slouken@7191
   195
    SDLTest_AssertCheck(checkFailCount3 == 0, "Validate results from calls to SDL_SetSurfaceAlphaMod, expected: 0, got: %i", checkFailCount3);
slouken@7191
   196
    SDLTest_AssertCheck(checkFailCount4 == 0, "Validate results from calls to SDL_SetSurfaceBlendMode, expected: 0, got: %i", checkFailCount4);
slouken@7191
   197
slouken@7191
   198
    /* Clean up */
slouken@7720
   199
    SDL_FreeSurface(face);
slouken@7720
   200
    face = NULL;
aschiffler@6773
   201
}
aschiffler@6773
   202
aschiffler@6773
   203
/* Helper to check that a file exists */
aschiffler@6773
   204
void
aschiffler@6773
   205
_AssertFileExist(const char *filename)
aschiffler@6773
   206
{
slouken@7191
   207
    struct stat st;
slouken@7191
   208
    int ret = stat(filename, &st);
aschiffler@6773
   209
slouken@7191
   210
    SDLTest_AssertCheck(ret == 0, "Verify file '%s' exists", filename);
aschiffler@6773
   211
}
aschiffler@6773
   212
aschiffler@6773
   213
aschiffler@6773
   214
/* Test case functions */
aschiffler@6773
   215
aschiffler@6773
   216
/**
aschiffler@6773
   217
 * @brief Tests sprite saving and loading
aschiffler@6773
   218
 */
aschiffler@6773
   219
int
aschiffler@6773
   220
surface_testSaveLoadBitmap(void *arg)
aschiffler@6773
   221
{
aschiffler@6773
   222
    int ret;
aschiffler@6773
   223
    const char *sampleFilename = "testSaveLoadBitmap.bmp";
aschiffler@6773
   224
    SDL_Surface *face;
aschiffler@6773
   225
    SDL_Surface *rface;
aschiffler@6773
   226
aschiffler@6773
   227
    /* Create sample surface */
aschiffler@6773
   228
    face = SDLTest_ImageFace();
aschiffler@6773
   229
    SDLTest_AssertCheck(face != NULL, "Verify face surface is not NULL");
aschiffler@6779
   230
    if (face == NULL) return TEST_ABORTED;
aschiffler@6773
   231
aschiffler@6773
   232
    /* Delete test file; ignore errors */
aschiffler@6773
   233
    unlink(sampleFilename);
aschiffler@6773
   234
aschiffler@6773
   235
    /* Save a surface */
aschiffler@6773
   236
    ret = SDL_SaveBMP(face, sampleFilename);
aschiffler@6773
   237
    SDLTest_AssertPass("Call to SDL_SaveBMP()");
slouken@7191
   238
    SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SaveBMP, expected: 0, got: %i", ret);
aschiffler@6773
   239
    _AssertFileExist(sampleFilename);
slouken@7191
   240
aschiffler@6773
   241
    /* Load a surface */
aschiffler@6773
   242
    rface = SDL_LoadBMP(sampleFilename);
aschiffler@6773
   243
    SDLTest_AssertPass("Call to SDL_LoadBMP()");
aschiffler@6773
   244
    SDLTest_AssertCheck(rface != NULL, "Verify result from SDL_LoadBMP is not NULL");
aschiffler@6773
   245
    if (rface != NULL) {
slouken@7191
   246
        SDLTest_AssertCheck(face->w == rface->w, "Verify width of loaded surface, expected: %i, got: %i", face->w, rface->w);
slouken@7191
   247
        SDLTest_AssertCheck(face->h == rface->h, "Verify height of loaded surface, expected: %i, got: %i", face->h, rface->h);
aschiffler@6773
   248
    }
aschiffler@6773
   249
aschiffler@6773
   250
    /* Delete test file; ignore errors */
aschiffler@6773
   251
    unlink(sampleFilename);
aschiffler@6773
   252
aschiffler@6773
   253
    /* Clean up */
slouken@7191
   254
    SDL_FreeSurface(face);
slouken@7191
   255
    face = NULL;
slouken@7191
   256
    SDL_FreeSurface(rface);
slouken@7191
   257
    rface = NULL;
slouken@7191
   258
aschiffler@6773
   259
    return TEST_COMPLETED;
aschiffler@6773
   260
}
aschiffler@6773
   261
gabomdq@7678
   262
/* !
aschiffler@6773
   263
 *  Tests surface conversion.
aschiffler@6773
   264
 */
aschiffler@6773
   265
int
aschiffler@6773
   266
surface_testSurfaceConversion(void *arg)
aschiffler@6773
   267
{
slouken@7191
   268
    SDL_Surface *rface = NULL, *face = NULL;
slouken@7191
   269
    int ret = 0;
aschiffler@6773
   270
slouken@7191
   271
    /* Create sample surface */
slouken@7191
   272
    face = SDLTest_ImageFace();
slouken@7191
   273
    SDLTest_AssertCheck(face != NULL, "Verify face surface is not NULL");
slouken@7191
   274
    if (face == NULL)
slouken@7191
   275
        return TEST_ABORTED;
aschiffler@6773
   276
slouken@7191
   277
    /* Set transparent pixel as the pixel at (0,0) */
slouken@7191
   278
    if (face->format->palette) {
slouken@7191
   279
       ret = SDL_SetColorKey(face, SDL_RLEACCEL, *(Uint8 *) face->pixels);
slouken@7191
   280
       SDLTest_AssertPass("Call to SDL_SetColorKey()");
slouken@7191
   281
       SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SetColorKey, expected: 0, got: %i", ret);
slouken@7191
   282
    }
aschiffler@6773
   283
slouken@7191
   284
    /* Convert to 32 bit to compare. */
slouken@7191
   285
    rface = SDL_ConvertSurface( face, testSurface->format, 0 );
slouken@7191
   286
    SDLTest_AssertPass("Call to SDL_ConvertSurface()");
slouken@7191
   287
    SDLTest_AssertCheck(rface != NULL, "Verify result from SDL_ConvertSurface is not NULL");
slouken@7191
   288
slouken@7191
   289
    /* Compare surface. */
slouken@7191
   290
    ret = SDLTest_CompareSurfaces( rface, face, 0 );
slouken@7191
   291
    SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
aschiffler@6773
   292
slouken@7191
   293
    /* Clean up. */
slouken@7720
   294
    SDL_FreeSurface(face);
slouken@7720
   295
    face = NULL;
slouken@7720
   296
    SDL_FreeSurface(rface);
slouken@7720
   297
    rface = NULL;
aschiffler@6773
   298
slouken@7191
   299
    return TEST_COMPLETED;
aschiffler@6773
   300
}
aschiffler@6773
   301
aschiffler@6773
   302
gabomdq@7678
   303
/* !
slouken@7374
   304
 *  Tests surface conversion across all pixel formats.
slouken@7374
   305
 */
slouken@7374
   306
int
slouken@7374
   307
surface_testCompleteSurfaceConversion(void *arg)
slouken@7374
   308
{
slouken@7374
   309
    Uint32 pixel_formats[] = {
slouken@7374
   310
        SDL_PIXELFORMAT_INDEX8,
slouken@7374
   311
        SDL_PIXELFORMAT_RGB332,
slouken@7374
   312
        SDL_PIXELFORMAT_RGB444,
slouken@7374
   313
        SDL_PIXELFORMAT_RGB555,
slouken@7374
   314
        SDL_PIXELFORMAT_BGR555,
slouken@7374
   315
        SDL_PIXELFORMAT_ARGB4444,
slouken@7374
   316
        SDL_PIXELFORMAT_RGBA4444,
slouken@7374
   317
        SDL_PIXELFORMAT_ABGR4444,
slouken@7374
   318
        SDL_PIXELFORMAT_BGRA4444,
slouken@7374
   319
        SDL_PIXELFORMAT_ARGB1555,
slouken@7374
   320
        SDL_PIXELFORMAT_RGBA5551,
slouken@7374
   321
        SDL_PIXELFORMAT_ABGR1555,
slouken@7374
   322
        SDL_PIXELFORMAT_BGRA5551,
slouken@7374
   323
        SDL_PIXELFORMAT_RGB565,
slouken@7374
   324
        SDL_PIXELFORMAT_BGR565,
slouken@7374
   325
        SDL_PIXELFORMAT_RGB24,
slouken@7374
   326
        SDL_PIXELFORMAT_BGR24,
slouken@7374
   327
        SDL_PIXELFORMAT_RGB888,
slouken@7374
   328
        SDL_PIXELFORMAT_RGBX8888,
slouken@7374
   329
        SDL_PIXELFORMAT_BGR888,
slouken@7374
   330
        SDL_PIXELFORMAT_BGRX8888,
slouken@7374
   331
        SDL_PIXELFORMAT_ARGB8888,
slouken@7374
   332
        SDL_PIXELFORMAT_RGBA8888,
slouken@7374
   333
        SDL_PIXELFORMAT_ABGR8888,
slouken@7374
   334
        SDL_PIXELFORMAT_BGRA8888,
slouken@7374
   335
        SDL_PIXELFORMAT_ARGB2101010,
slouken@7374
   336
    };
slouken@7374
   337
    SDL_Surface *face = NULL, *cvt1, *cvt2, *final;
slouken@7374
   338
    SDL_PixelFormat *fmt1, *fmt2;
icculus@7403
   339
    int i, j, ret = 0;
slouken@7374
   340
slouken@7374
   341
    /* Create sample surface */
slouken@7374
   342
    face = SDLTest_ImageFace();
slouken@7374
   343
    SDLTest_AssertCheck(face != NULL, "Verify face surface is not NULL");
slouken@7374
   344
    if (face == NULL)
slouken@7374
   345
        return TEST_ABORTED;
slouken@7374
   346
slouken@7374
   347
    /* Set transparent pixel as the pixel at (0,0) */
slouken@7374
   348
    if (face->format->palette) {
slouken@7374
   349
       ret = SDL_SetColorKey(face, SDL_RLEACCEL, *(Uint8 *) face->pixels);
slouken@7374
   350
       SDLTest_AssertPass("Call to SDL_SetColorKey()");
slouken@7374
   351
       SDLTest_AssertCheck(ret == 0, "Verify result from SDL_SetColorKey, expected: 0, got: %i", ret);
slouken@7374
   352
    }
slouken@7374
   353
slouken@7374
   354
    for ( i = 0; i < SDL_arraysize(pixel_formats); ++i ) {
slouken@7374
   355
        for ( j = 0; j < SDL_arraysize(pixel_formats); ++j ) {
slouken@7374
   356
            fmt1 = SDL_AllocFormat(pixel_formats[i]);
slouken@7374
   357
            SDL_assert(fmt1 != NULL);
slouken@7374
   358
            cvt1 = SDL_ConvertSurface(face, fmt1, 0);
slouken@7374
   359
            SDL_assert(cvt1 != NULL);
slouken@7374
   360
slouken@7374
   361
            fmt2 = SDL_AllocFormat(pixel_formats[j]);
slouken@7374
   362
            SDL_assert(fmt1 != NULL);
slouken@7374
   363
            cvt2 = SDL_ConvertSurface(cvt1, fmt2, 0);
slouken@7374
   364
            SDL_assert(cvt2 != NULL);
slouken@7374
   365
slouken@7374
   366
            if ( fmt1->BytesPerPixel == face->format->BytesPerPixel &&
slouken@7374
   367
                 fmt2->BytesPerPixel == face->format->BytesPerPixel &&
slouken@7374
   368
                 (fmt1->Amask != 0) == (face->format->Amask != 0) &&
slouken@7374
   369
                 (fmt2->Amask != 0) == (face->format->Amask != 0) ) {
slouken@7374
   370
                final = SDL_ConvertSurface( cvt2, face->format, 0 );
slouken@7374
   371
                SDL_assert(final != NULL);
slouken@7374
   372
slouken@7374
   373
                /* Compare surface. */
slouken@7374
   374
                ret = SDLTest_CompareSurfaces( face, final, 0 );
slouken@7374
   375
                SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
slouken@7374
   376
                SDL_FreeSurface(final);
slouken@7374
   377
            }
slouken@7374
   378
slouken@7374
   379
            SDL_FreeSurface(cvt1);
slouken@7374
   380
            SDL_FreeFormat(fmt1);
slouken@7374
   381
            SDL_FreeSurface(cvt2);
slouken@7374
   382
            SDL_FreeFormat(fmt2);
slouken@7374
   383
        }
slouken@7374
   384
    }
slouken@7374
   385
slouken@7374
   386
    /* Clean up. */
slouken@7374
   387
    SDL_FreeSurface( face );
slouken@7374
   388
slouken@7374
   389
    return TEST_COMPLETED;
slouken@7374
   390
}
slouken@7374
   391
slouken@7374
   392
aschiffler@6773
   393
/**
aschiffler@6773
   394
 * @brief Tests sprite loading. A failure case.
aschiffler@6773
   395
 */
aschiffler@6773
   396
int
aschiffler@6773
   397
surface_testLoadFailure(void *arg)
aschiffler@6773
   398
{
slouken@7191
   399
    SDL_Surface *face = SDL_LoadBMP("nonexistant.bmp");
slouken@7191
   400
    SDLTest_AssertCheck(face == NULL, "SDL_CreateLoadBmp");
aschiffler@6773
   401
slouken@7191
   402
    return TEST_COMPLETED;
aschiffler@6773
   403
}
aschiffler@6773
   404
aschiffler@6773
   405
/**
aschiffler@6773
   406
 * @brief Tests some blitting routines.
aschiffler@6773
   407
 */
aschiffler@6773
   408
int
aschiffler@6773
   409
surface_testBlit(void *arg)
aschiffler@6773
   410
{
aschiffler@6773
   411
   int ret;
aschiffler@6822
   412
   SDL_Surface *compareSurface;
aschiffler@6773
   413
slouken@7191
   414
   /* Basic blitting */
aschiffler@6773
   415
   _testBlitBlendMode(-1);
slouken@7191
   416
aschiffler@6773
   417
   /* Verify result by comparing surfaces */
aschiffler@6822
   418
   compareSurface = SDLTest_ImageBlit();
aschiffler@6822
   419
   ret = SDLTest_CompareSurfaces( testSurface, compareSurface, 0 );
aschiffler@6773
   420
   SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
slouken@7191
   421
aschiffler@6773
   422
   /* Clean up. */
slouken@7720
   423
   SDL_FreeSurface(compareSurface);
aschiffler@6773
   424
aschiffler@6773
   425
   return TEST_COMPLETED;
aschiffler@6773
   426
}
aschiffler@6773
   427
aschiffler@6773
   428
/**
aschiffler@6773
   429
 * @brief Tests some blitting routines with color mod
aschiffler@6773
   430
 */
aschiffler@6773
   431
int
aschiffler@6773
   432
surface_testBlitColorMod(void *arg)
aschiffler@6773
   433
{
aschiffler@6773
   434
   int ret;
aschiffler@6822
   435
   SDL_Surface *compareSurface;
aschiffler@6773
   436
slouken@7191
   437
   /* Basic blitting with color mod */
aschiffler@6773
   438
   _testBlitBlendMode(-2);
slouken@7191
   439
aschiffler@6773
   440
   /* Verify result by comparing surfaces */
aschiffler@6822
   441
   compareSurface = SDLTest_ImageBlitColor();
aschiffler@6822
   442
   ret = SDLTest_CompareSurfaces( testSurface, compareSurface, 0 );
aschiffler@6773
   443
   SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
slouken@7191
   444
aschiffler@6773
   445
   /* Clean up. */
slouken@7720
   446
   SDL_FreeSurface(compareSurface);
aschiffler@6773
   447
aschiffler@6773
   448
   return TEST_COMPLETED;
aschiffler@6773
   449
}
aschiffler@6773
   450
aschiffler@6773
   451
/**
aschiffler@6773
   452
 * @brief Tests some blitting routines with alpha mod
aschiffler@6773
   453
 */
aschiffler@6773
   454
int
aschiffler@6773
   455
surface_testBlitAlphaMod(void *arg)
aschiffler@6773
   456
{
aschiffler@6773
   457
   int ret;
aschiffler@6822
   458
   SDL_Surface *compareSurface;
aschiffler@6773
   459
slouken@7191
   460
   /* Basic blitting with alpha mod */
aschiffler@6773
   461
   _testBlitBlendMode(-3);
slouken@7191
   462
aschiffler@6773
   463
   /* Verify result by comparing surfaces */
aschiffler@6822
   464
   compareSurface = SDLTest_ImageBlitAlpha();
aschiffler@6822
   465
   ret = SDLTest_CompareSurfaces( testSurface, compareSurface, 0 );
aschiffler@6773
   466
   SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
slouken@7191
   467
aschiffler@6773
   468
   /* Clean up. */
slouken@7720
   469
   SDL_FreeSurface(compareSurface);
aschiffler@6773
   470
aschiffler@6773
   471
   return TEST_COMPLETED;
aschiffler@6773
   472
}
aschiffler@6773
   473
aschiffler@6773
   474
aschiffler@6773
   475
/**
aschiffler@6773
   476
 * @brief Tests some more blitting routines.
aschiffler@6773
   477
 */
aschiffler@6773
   478
int
aschiffler@6773
   479
surface_testBlitBlendNone(void *arg)
aschiffler@6773
   480
{
aschiffler@6773
   481
   int ret;
aschiffler@6822
   482
   SDL_Surface *compareSurface;
aschiffler@6773
   483
slouken@7191
   484
   /* Basic blitting */
aschiffler@6773
   485
   _testBlitBlendMode(SDL_BLENDMODE_NONE);
slouken@7191
   486
aschiffler@6773
   487
   /* Verify result by comparing surfaces */
aschiffler@6822
   488
   compareSurface = SDLTest_ImageBlitBlendNone();
aschiffler@6822
   489
   ret = SDLTest_CompareSurfaces( testSurface, compareSurface, 0 );
aschiffler@6773
   490
   SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
slouken@7191
   491
aschiffler@6773
   492
   /* Clean up. */
slouken@7720
   493
   SDL_FreeSurface(compareSurface);
aschiffler@6773
   494
aschiffler@6773
   495
   return TEST_COMPLETED;
aschiffler@6773
   496
}
aschiffler@6773
   497
aschiffler@6773
   498
/**
aschiffler@6773
   499
 * @brief Tests some more blitting routines.
aschiffler@6773
   500
 */
aschiffler@6773
   501
int
aschiffler@6773
   502
surface_testBlitBlendBlend(void *arg)
aschiffler@6773
   503
{
aschiffler@6773
   504
   int ret;
aschiffler@6822
   505
   SDL_Surface *compareSurface;
aschiffler@6773
   506
slouken@7191
   507
   /* Blend blitting */
aschiffler@6773
   508
   _testBlitBlendMode(SDL_BLENDMODE_BLEND);
slouken@7191
   509
aschiffler@6773
   510
   /* Verify result by comparing surfaces */
aschiffler@6822
   511
   compareSurface = SDLTest_ImageBlitBlend();
aschiffler@6822
   512
   ret = SDLTest_CompareSurfaces( testSurface, compareSurface, 0 );
aschiffler@6773
   513
   SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
slouken@7191
   514
aschiffler@6773
   515
   /* Clean up. */
slouken@7720
   516
   SDL_FreeSurface(compareSurface);
aschiffler@6773
   517
aschiffler@6773
   518
   return TEST_COMPLETED;
aschiffler@6773
   519
}
aschiffler@6773
   520
aschiffler@6773
   521
/**
aschiffler@6773
   522
 * @brief Tests some more blitting routines.
aschiffler@6773
   523
 */
aschiffler@6773
   524
int
aschiffler@6773
   525
surface_testBlitBlendAdd(void *arg)
aschiffler@6773
   526
{
aschiffler@6773
   527
   int ret;
aschiffler@6822
   528
   SDL_Surface *compareSurface;
aschiffler@6773
   529
slouken@7191
   530
   /* Add blitting */
aschiffler@6773
   531
   _testBlitBlendMode(SDL_BLENDMODE_ADD);
slouken@7191
   532
aschiffler@6773
   533
   /* Verify result by comparing surfaces */
aschiffler@6822
   534
   compareSurface = SDLTest_ImageBlitBlendAdd();
aschiffler@6822
   535
   ret = SDLTest_CompareSurfaces( testSurface, compareSurface, 0 );
aschiffler@6773
   536
   SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
slouken@7191
   537
aschiffler@6773
   538
   /* Clean up. */
slouken@7720
   539
   SDL_FreeSurface(compareSurface);
aschiffler@6773
   540
aschiffler@6773
   541
   return TEST_COMPLETED;
aschiffler@6773
   542
}
aschiffler@6773
   543
aschiffler@6773
   544
/**
aschiffler@6773
   545
 * @brief Tests some more blitting routines.
aschiffler@6773
   546
 */
aschiffler@6773
   547
int
aschiffler@6773
   548
surface_testBlitBlendMod(void *arg)
aschiffler@6773
   549
{
aschiffler@6773
   550
   int ret;
aschiffler@6822
   551
   SDL_Surface *compareSurface;
aschiffler@6773
   552
slouken@7191
   553
   /* Mod blitting */
aschiffler@6773
   554
   _testBlitBlendMode(SDL_BLENDMODE_MOD);
slouken@7191
   555
aschiffler@6773
   556
   /* Verify result by comparing surfaces */
aschiffler@6822
   557
   compareSurface = SDLTest_ImageBlitBlendMod();
aschiffler@6822
   558
   ret = SDLTest_CompareSurfaces( testSurface, compareSurface, 0 );
aschiffler@6773
   559
   SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
slouken@7191
   560
aschiffler@6773
   561
   /* Clean up. */
slouken@7720
   562
   SDL_FreeSurface(compareSurface);
aschiffler@6773
   563
aschiffler@6773
   564
   return TEST_COMPLETED;
aschiffler@6773
   565
}
aschiffler@6773
   566
aschiffler@6773
   567
/**
aschiffler@6773
   568
 * @brief Tests some more blitting routines with loop
aschiffler@6773
   569
 */
aschiffler@6773
   570
int
aschiffler@6773
   571
surface_testBlitBlendLoop(void *arg) {
aschiffler@6773
   572
aschiffler@6773
   573
   int ret;
aschiffler@6822
   574
   SDL_Surface *compareSurface;
aschiffler@6773
   575
slouken@7191
   576
   /* All blitting modes */
aschiffler@6773
   577
   _testBlitBlendMode(-4);
slouken@7191
   578
aschiffler@6773
   579
   /* Verify result by comparing surfaces */
aschiffler@6822
   580
   compareSurface = SDLTest_ImageBlitBlendAll();
aschiffler@6822
   581
   ret = SDLTest_CompareSurfaces( testSurface, compareSurface, 0 );
aschiffler@6773
   582
   SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
slouken@7191
   583
aschiffler@6773
   584
   /* Clean up. */
slouken@7720
   585
   SDL_FreeSurface(compareSurface);
aschiffler@6773
   586
aschiffler@6773
   587
   return TEST_COMPLETED;
aschiffler@6773
   588
aschiffler@6773
   589
}
aschiffler@6773
   590
aschiffler@6773
   591
/* ================= Test References ================== */
aschiffler@6773
   592
aschiffler@6773
   593
/* Surface test cases */
aschiffler@6773
   594
static const SDLTest_TestCaseReference surfaceTest1 =
slouken@7191
   595
        { (SDLTest_TestCaseFp)surface_testSaveLoadBitmap, "surface_testSaveLoadBitmap", "Tests sprite saving and loading.", TEST_ENABLED};
aschiffler@6773
   596
aschiffler@6773
   597
static const SDLTest_TestCaseReference surfaceTest2 =
slouken@7191
   598
        { (SDLTest_TestCaseFp)surface_testBlit, "surface_testBlit", "Tests basic blitting.", TEST_ENABLED};
aschiffler@6773
   599
aschiffler@6773
   600
static const SDLTest_TestCaseReference surfaceTest3 =
slouken@7191
   601
        { (SDLTest_TestCaseFp)surface_testBlitBlendNone, "surface_testBlitBlendNone", "Tests blitting routines with none blending mode.", TEST_ENABLED};
aschiffler@6773
   602
aschiffler@6773
   603
static const SDLTest_TestCaseReference surfaceTest4 =
slouken@7191
   604
        { (SDLTest_TestCaseFp)surface_testLoadFailure, "surface_testLoadFailure", "Tests sprite loading. A failure case.", TEST_ENABLED};
aschiffler@6773
   605
aschiffler@6773
   606
static const SDLTest_TestCaseReference surfaceTest5 =
slouken@7191
   607
        { (SDLTest_TestCaseFp)surface_testSurfaceConversion, "surface_testSurfaceConversion", "Tests surface conversion.", TEST_ENABLED};
aschiffler@6773
   608
aschiffler@6773
   609
static const SDLTest_TestCaseReference surfaceTest6 =
slouken@7374
   610
        { (SDLTest_TestCaseFp)surface_testCompleteSurfaceConversion, "surface_testCompleteSurfaceConversion", "Tests surface conversion across all pixel formats", TEST_ENABLED};
slouken@7374
   611
slouken@7374
   612
static const SDLTest_TestCaseReference surfaceTest7 =
slouken@7191
   613
        { (SDLTest_TestCaseFp)surface_testBlitColorMod, "surface_testBlitColorMod", "Tests some blitting routines with color mod.", TEST_ENABLED};
aschiffler@6773
   614
slouken@7374
   615
static const SDLTest_TestCaseReference surfaceTest8 =
slouken@7191
   616
        { (SDLTest_TestCaseFp)surface_testBlitAlphaMod, "surface_testBlitAlphaMod", "Tests some blitting routines with alpha mod.", TEST_ENABLED};
aschiffler@6773
   617
aschiffler@7172
   618
/* TODO: rewrite test case, define new test data and re-enable; current implementation fails */
slouken@7374
   619
static const SDLTest_TestCaseReference surfaceTest9 =
philipp@9218
   620
        { (SDLTest_TestCaseFp)surface_testBlitBlendLoop, "surface_testBlitBlendLoop", "Test blitting routines with various blending modes", TEST_DISABLED};
aschiffler@6773
   621
aschiffler@7172
   622
/* TODO: rewrite test case, define new test data and re-enable; current implementation fails */
slouken@7374
   623
static const SDLTest_TestCaseReference surfaceTest10 =
slouken@7191
   624
        { (SDLTest_TestCaseFp)surface_testBlitBlendBlend, "surface_testBlitBlendBlend", "Tests blitting routines with blend blending mode.", TEST_DISABLED};
aschiffler@6773
   625
aschiffler@7172
   626
/* TODO: rewrite test case, define new test data and re-enable; current implementation fails */
slouken@7374
   627
static const SDLTest_TestCaseReference surfaceTest11 =
slouken@7191
   628
        { (SDLTest_TestCaseFp)surface_testBlitBlendAdd, "surface_testBlitBlendAdd", "Tests blitting routines with add blending mode.", TEST_DISABLED};
aschiffler@6773
   629
slouken@7374
   630
static const SDLTest_TestCaseReference surfaceTest12 =
slouken@7191
   631
        { (SDLTest_TestCaseFp)surface_testBlitBlendMod, "surface_testBlitBlendMod", "Tests blitting routines with mod blending mode.", TEST_ENABLED};
aschiffler@6773
   632
aschiffler@6773
   633
/* Sequence of Surface test cases */
aschiffler@6773
   634
static const SDLTest_TestCaseReference *surfaceTests[] =  {
slouken@7191
   635
    &surfaceTest1, &surfaceTest2, &surfaceTest3, &surfaceTest4, &surfaceTest5,
slouken@7374
   636
    &surfaceTest6, &surfaceTest7, &surfaceTest8, &surfaceTest9, &surfaceTest10,
slouken@7374
   637
    &surfaceTest11, &surfaceTest12, NULL
aschiffler@6773
   638
};
aschiffler@6773
   639
aschiffler@6773
   640
/* Surface test suite (global) */
aschiffler@6773
   641
SDLTest_TestSuiteReference surfaceTestSuite = {
slouken@7191
   642
    "Surface",
slouken@7191
   643
    _surfaceSetUp,
slouken@7191
   644
    surfaceTests,
slouken@7191
   645
    _surfaceTearDown
aschiffler@6773
   646
aschiffler@6773
   647
};