| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500 | /** * Pixels test suite */#include <stdio.h>#include "SDL.h"#include "SDL_test.h"/* Test case functions *//* Definition of all RGB formats used to test pixel conversions */const int _numRGBPixelFormats = 31;Uint32 _RGBPixelFormats[] = {    SDL_PIXELFORMAT_INDEX1LSB,    SDL_PIXELFORMAT_INDEX1MSB,    SDL_PIXELFORMAT_INDEX2LSB,    SDL_PIXELFORMAT_INDEX2MSB,    SDL_PIXELFORMAT_INDEX4LSB,    SDL_PIXELFORMAT_INDEX4MSB,    SDL_PIXELFORMAT_INDEX8,    SDL_PIXELFORMAT_RGB332,    SDL_PIXELFORMAT_RGB444,    SDL_PIXELFORMAT_BGR444,    SDL_PIXELFORMAT_RGB555,    SDL_PIXELFORMAT_BGR555,    SDL_PIXELFORMAT_ARGB4444,    SDL_PIXELFORMAT_RGBA4444,    SDL_PIXELFORMAT_ABGR4444,    SDL_PIXELFORMAT_BGRA4444,    SDL_PIXELFORMAT_ARGB1555,    SDL_PIXELFORMAT_RGBA5551,    SDL_PIXELFORMAT_ABGR1555,    SDL_PIXELFORMAT_BGRA5551,    SDL_PIXELFORMAT_RGB565,    SDL_PIXELFORMAT_BGR565,    SDL_PIXELFORMAT_RGB24,    SDL_PIXELFORMAT_BGR24,    SDL_PIXELFORMAT_RGB888,    SDL_PIXELFORMAT_RGBX8888,    SDL_PIXELFORMAT_BGR888,    SDL_PIXELFORMAT_BGRX8888,    SDL_PIXELFORMAT_ARGB8888,    SDL_PIXELFORMAT_RGBA8888,    SDL_PIXELFORMAT_ABGR8888,    SDL_PIXELFORMAT_BGRA8888,    SDL_PIXELFORMAT_ARGB2101010};const char *_RGBPixelFormatsVerbose[] = {    "SDL_PIXELFORMAT_INDEX1LSB",    "SDL_PIXELFORMAT_INDEX1MSB",    "SDL_PIXELFORMAT_INDEX2LSB",    "SDL_PIXELFORMAT_INDEX2MSB",    "SDL_PIXELFORMAT_INDEX4LSB",    "SDL_PIXELFORMAT_INDEX4MSB",    "SDL_PIXELFORMAT_INDEX8",    "SDL_PIXELFORMAT_RGB332",    "SDL_PIXELFORMAT_RGB444",    "SDL_PIXELFORMAT_BGR444",    "SDL_PIXELFORMAT_RGB555",    "SDL_PIXELFORMAT_BGR555",    "SDL_PIXELFORMAT_ARGB4444",    "SDL_PIXELFORMAT_RGBA4444",    "SDL_PIXELFORMAT_ABGR4444",    "SDL_PIXELFORMAT_BGRA4444",    "SDL_PIXELFORMAT_ARGB1555",    "SDL_PIXELFORMAT_RGBA5551",    "SDL_PIXELFORMAT_ABGR1555",    "SDL_PIXELFORMAT_BGRA5551",    "SDL_PIXELFORMAT_RGB565",    "SDL_PIXELFORMAT_BGR565",    "SDL_PIXELFORMAT_RGB24",    "SDL_PIXELFORMAT_BGR24",    "SDL_PIXELFORMAT_RGB888",    "SDL_PIXELFORMAT_RGBX8888",    "SDL_PIXELFORMAT_BGR888",    "SDL_PIXELFORMAT_BGRX8888",    "SDL_PIXELFORMAT_ARGB8888",    "SDL_PIXELFORMAT_RGBA8888",    "SDL_PIXELFORMAT_ABGR8888",    "SDL_PIXELFORMAT_BGRA8888",    "SDL_PIXELFORMAT_ARGB2101010"};/* Definition of all Non-RGB formats used to test pixel conversions */const int _numNonRGBPixelFormats = 7;Uint32 _nonRGBPixelFormats[] = {    SDL_PIXELFORMAT_YV12,    SDL_PIXELFORMAT_IYUV,    SDL_PIXELFORMAT_YUY2,    SDL_PIXELFORMAT_UYVY,    SDL_PIXELFORMAT_YVYU,    SDL_PIXELFORMAT_NV12,    SDL_PIXELFORMAT_NV21};const char *_nonRGBPixelFormatsVerbose[] = {    "SDL_PIXELFORMAT_YV12",    "SDL_PIXELFORMAT_IYUV",    "SDL_PIXELFORMAT_YUY2",    "SDL_PIXELFORMAT_UYVY",    "SDL_PIXELFORMAT_YVYU",    "SDL_PIXELFORMAT_NV12",    "SDL_PIXELFORMAT_NV21"};/* Definition of some invalid formats for negative tests */const int _numInvalidPixelFormats = 2;Uint32 _invalidPixelFormats[] = {    SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ABGR, SDL_PACKEDLAYOUT_1010102 + 1, 32, 4),    SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_ABGR, SDL_PACKEDLAYOUT_1010102 + 2, 32, 4)};const char *_invalidPixelFormatsVerbose[] = {    "SDL_PIXELFORMAT_UNKNOWN",    "SDL_PIXELFORMAT_UNKNOWN"};/* Test case functions *//** * @brief Call to SDL_AllocFormat and SDL_FreeFormat * * @sa http://wiki.libsdl.org/SDL_AllocFormat * @sa http://wiki.libsdl.org/SDL_FreeFormat */int pixels_allocFreeFormat(void *arg){    const char *unknownFormat = "SDL_PIXELFORMAT_UNKNOWN";    const char *error;    int i;    Uint32 format;    Uint32 masks;    SDL_PixelFormat *result;    /* Blank/unknown format */    format = 0;    SDLTest_Log("RGB Format: %s (%" SDL_PRIu32 ")", unknownFormat, format);    /* Allocate format */    result = SDL_AllocFormat(format);    SDLTest_AssertPass("Call to SDL_AllocFormat()");    SDLTest_AssertCheck(result != NULL, "Verify result is not NULL");    if (result != NULL) {        SDLTest_AssertCheck(result->format == format, "Verify value of result.format; expected: %" SDL_PRIu32 ", got %" SDL_PRIu32, format, result->format);        SDLTest_AssertCheck(result->BitsPerPixel == 0, "Verify value of result.BitsPerPixel; expected: 0, got %u", result->BitsPerPixel);        SDLTest_AssertCheck(result->BytesPerPixel == 0, "Verify value of result.BytesPerPixel; expected: 0, got %u", result->BytesPerPixel);        masks = result->Rmask | result->Gmask | result->Bmask | result->Amask;        SDLTest_AssertCheck(masks == 0, "Verify value of result.[RGBA]mask combined; expected: 0, got %" SDL_PRIu32, masks);        /* Deallocate again */        SDL_FreeFormat(result);        SDLTest_AssertPass("Call to SDL_FreeFormat()");    }    /* RGB formats */    for (i = 0; i < _numRGBPixelFormats; i++) {        format = _RGBPixelFormats[i];        SDLTest_Log("RGB Format: %s (%" SDL_PRIu32 ")", _RGBPixelFormatsVerbose[i], format);        /* Allocate format */        result = SDL_AllocFormat(format);        SDLTest_AssertPass("Call to SDL_AllocFormat()");        SDLTest_AssertCheck(result != NULL, "Verify result is not NULL");        if (result != NULL) {            SDLTest_AssertCheck(result->format == format, "Verify value of result.format; expected: %" SDL_PRIu32 ", got %" SDL_PRIu32, format, result->format);            SDLTest_AssertCheck(result->BitsPerPixel > 0, "Verify value of result.BitsPerPixel; expected: >0, got %u", result->BitsPerPixel);            SDLTest_AssertCheck(result->BytesPerPixel > 0, "Verify value of result.BytesPerPixel; expected: >0, got %u", result->BytesPerPixel);            if (result->palette != NULL) {                masks = result->Rmask | result->Gmask | result->Bmask | result->Amask;                SDLTest_AssertCheck(masks > 0, "Verify value of result.[RGBA]mask combined; expected: >0, got %" SDL_PRIu32, masks);            }            /* Deallocate again */            SDL_FreeFormat(result);            SDLTest_AssertPass("Call to SDL_FreeFormat()");        }    }#if 0 /* This succeeds for SDL3, but we don't expect SDL2 applications to call SDL_AllocFormat() for FOURCC formats directly */    /* Non-RGB formats */    for (i = 0; i < _numNonRGBPixelFormats; i++) {        format = _nonRGBPixelFormats[i];        SDLTest_Log("non-RGB Format: %s (%" SDL_PRIu32 ")", _nonRGBPixelFormatsVerbose[i], format);        /* Try to allocate format */        result = SDL_AllocFormat(format);        SDLTest_AssertPass("Call to SDL_AllocFormat()");        SDLTest_AssertCheck(result == NULL, "Verify result is NULL");    }#endif    /* Negative cases */    /* Invalid Formats */    for (i = 0; i < _numInvalidPixelFormats; i++) {        SDL_ClearError();        SDLTest_AssertPass("Call to SDL_ClearError()");        format = _invalidPixelFormats[i];        result = SDL_AllocFormat(format);        SDLTest_AssertPass("Call to SDL_AllocFormat(%" SDL_PRIu32 ")", format);        SDLTest_AssertCheck(result == NULL, "Verify result is NULL");        error = SDL_GetError();        SDLTest_AssertPass("Call to SDL_GetError()");        SDLTest_AssertCheck(error != NULL, "Validate that error message was not NULL");    }    return TEST_COMPLETED;}/** * @brief Call to SDL_GetPixelFormatName * * @sa http://wiki.libsdl.org/SDL_GetPixelFormatName */int pixels_getPixelFormatName(void *arg){    const char *unknownFormat = "SDL_PIXELFORMAT_UNKNOWN";    const char *error;    int i;    Uint32 format;    const char *result;    /* Blank/undefined format */    format = 0;    SDLTest_Log("RGB Format: %s (%" SDL_PRIu32 ")", unknownFormat, format);    /* Get name of format */    result = SDL_GetPixelFormatName(format);    SDLTest_AssertPass("Call to SDL_GetPixelFormatName()");    SDLTest_AssertCheck(result != NULL, "Verify result is not NULL");    if (result != NULL) {        SDLTest_AssertCheck(result[0] != '\0', "Verify result is non-empty");        SDLTest_AssertCheck(SDL_strcmp(result, unknownFormat) == 0,                            "Verify result text; expected: %s, got %s", unknownFormat, result);    }    /* RGB formats */    for (i = 0; i < _numRGBPixelFormats; i++) {        format = _RGBPixelFormats[i];        SDLTest_Log("RGB Format: %s (%" SDL_PRIu32 ")", _RGBPixelFormatsVerbose[i], format);        /* Get name of format */        result = SDL_GetPixelFormatName(format);        SDLTest_AssertPass("Call to SDL_GetPixelFormatName()");        SDLTest_AssertCheck(result != NULL, "Verify result is not NULL");        if (result != NULL) {            SDLTest_AssertCheck(result[0] != '\0', "Verify result is non-empty");            SDLTest_AssertCheck(SDL_strcmp(result, _RGBPixelFormatsVerbose[i]) == 0,                                "Verify result text; expected: %s, got %s", _RGBPixelFormatsVerbose[i], result);        }    }    /* Non-RGB formats */    for (i = 0; i < _numNonRGBPixelFormats; i++) {        format = _nonRGBPixelFormats[i];        SDLTest_Log("non-RGB Format: %s (%" SDL_PRIu32 ")", _nonRGBPixelFormatsVerbose[i], format);        /* Get name of format */        result = SDL_GetPixelFormatName(format);        SDLTest_AssertPass("Call to SDL_GetPixelFormatName()");        SDLTest_AssertCheck(result != NULL, "Verify result is not NULL");        if (result != NULL) {            SDLTest_AssertCheck(result[0] != '\0', "Verify result is non-empty");            SDLTest_AssertCheck(SDL_strcmp(result, _nonRGBPixelFormatsVerbose[i]) == 0,                                "Verify result text; expected: %s, got %s", _nonRGBPixelFormatsVerbose[i], result);        }    }    /* Negative cases */    /* Invalid Formats */    SDL_ClearError();    SDLTest_AssertPass("Call to SDL_ClearError()");    for (i = 0; i < _numInvalidPixelFormats; i++) {        format = _invalidPixelFormats[i];        result = SDL_GetPixelFormatName(format);        SDLTest_AssertPass("Call to SDL_GetPixelFormatName(%" SDL_PRIu32 ")", format);        SDLTest_AssertCheck(result != NULL, "Verify result is not NULL");        if (result != NULL) {            SDLTest_AssertCheck(result[0] != '\0',                                "Verify result is non-empty; got: %s", result);            SDLTest_AssertCheck(SDL_strcmp(result, _invalidPixelFormatsVerbose[i]) == 0,                                "Validate name is UNKNOWN, expected: '%s', got: '%s'", _invalidPixelFormatsVerbose[i], result);        }        error = SDL_GetError();        SDLTest_AssertPass("Call to SDL_GetError()");        SDLTest_AssertCheck(error == NULL || error[0] == '\0', "Validate that error message is empty");    }    return TEST_COMPLETED;}/** * @brief Call to SDL_AllocPalette and SDL_FreePalette * * @sa http://wiki.libsdl.org/SDL_AllocPalette * @sa http://wiki.libsdl.org/SDL_FreePalette */int pixels_allocFreePalette(void *arg){    const char *expectedError1 = "Parameter 'ncolors' is invalid";    const char *error;    int variation;    int i;    int ncolors;    SDL_Palette *result;    /* Allocate palette */    for (variation = 1; variation <= 3; variation++) {        switch (variation) {        /* Just one color */        default:        case 1:            ncolors = 1;            break;        /* Two colors */        case 2:            ncolors = 2;            break;        /* More than two colors */        case 3:            ncolors = SDLTest_RandomIntegerInRange(8, 16);            break;        }        result = SDL_AllocPalette(ncolors);        SDLTest_AssertPass("Call to SDL_AllocPalette(%d)", ncolors);        SDLTest_AssertCheck(result != NULL, "Verify result is not NULL");        if (result != NULL) {            SDLTest_AssertCheck(result->ncolors == ncolors, "Verify value of result.ncolors; expected: %u, got %u", ncolors, result->ncolors);            if (result->ncolors > 0) {                SDLTest_AssertCheck(result->colors != NULL, "Verify value of result.colors is not NULL");                if (result->colors != NULL) {                    for (i = 0; i < result->ncolors; i++) {                        SDLTest_AssertCheck(result->colors[i].r == 255, "Verify value of result.colors[%d].r; expected: 255, got %u", i, result->colors[i].r);                        SDLTest_AssertCheck(result->colors[i].g == 255, "Verify value of result.colors[%d].g; expected: 255, got %u", i, result->colors[i].g);                        SDLTest_AssertCheck(result->colors[i].b == 255, "Verify value of result.colors[%d].b; expected: 255, got %u", i, result->colors[i].b);                    }                }            }            /* Deallocate again */            SDL_FreePalette(result);            SDLTest_AssertPass("Call to SDL_FreePalette()");        }    }    /* Negative cases */    /* Invalid number of colors */    for (ncolors = 0; ncolors > -3; ncolors--) {        SDL_ClearError();        SDLTest_AssertPass("Call to SDL_ClearError()");        result = SDL_AllocPalette(ncolors);        SDLTest_AssertPass("Call to SDL_AllocPalette(%d)", ncolors);        SDLTest_AssertCheck(result == NULL, "Verify result is NULL");        error = SDL_GetError();        SDLTest_AssertPass("Call to SDL_GetError()");        SDLTest_AssertCheck(error != NULL, "Validate that error message was not NULL");        if (error != NULL) {            SDLTest_AssertCheck(SDL_strcmp(error, expectedError1) == 0,                                "Validate error message, expected: '%s', got: '%s'", expectedError1, error);        }    }    return TEST_COMPLETED;}/** * @brief Call to SDL_CalculateGammaRamp * * @sa http://wiki.libsdl.org/SDL_CalculateGammaRamp */intpixels_calcGammaRamp(void *arg){  const char *expectedError1 = "Parameter 'gamma' is invalid";  const char *expectedError2 = "Parameter 'ramp' is invalid";  const char *error;  float gamma;  Uint16 *ramp;  int variation;  int i;  int changed;  Uint16 magic = 0xbeef;  /* Allocate temp ramp array and fill with some value */  ramp = (Uint16 *)SDL_malloc(256 * sizeof(Uint16));  SDLTest_AssertCheck(ramp != NULL, "Validate temp ramp array could be allocated");  if (ramp == NULL) return TEST_ABORTED;  /* Make call with different gamma values */  for (variation = 0; variation < 4; variation++) {    switch (variation) {      /* gamma = 0 all black */      default:      case 0:        gamma = 0.0f;        break;      /* gamma = 1 identity */      case 1:        gamma = 1.0f;        break;      /* gamma = [0.2,0.8] normal range */      case 2:        gamma = 0.2f + 0.8f * SDLTest_RandomUnitFloat();        break;      /* gamma = >1.1 non-standard range */      case 3:        gamma = 1.1f + SDLTest_RandomUnitFloat();        break;    }    /* Make call and check that values were updated */    for (i = 0; i < 256; i++) ramp[i] = magic;    SDL_CalculateGammaRamp(gamma, ramp);    SDLTest_AssertPass("Call to SDL_CalculateGammaRamp(%f)", gamma);    changed = 0;    for (i = 0; i < 256; i++) if (ramp[i] != magic) changed++;    SDLTest_AssertCheck(changed > 250, "Validate that ramp was calculated; expected: >250 values changed, got: %d values changed", changed);    /* Additional value checks for some cases */    i = SDLTest_RandomIntegerInRange(64,192);    switch (variation) {      case 0:        SDLTest_AssertCheck(ramp[i] == 0, "Validate value at position %d; expected: 0, got: %d", i, ramp[i]);        break;      case 1:        SDLTest_AssertCheck(ramp[i] == ((i << 8) | i), "Validate value at position %d; expected: %d, got: %d", i, (i << 8) | i, ramp[i]);        break;      case 2:      case 3:        SDLTest_AssertCheck(ramp[i] > 0, "Validate value at position %d; expected: >0, got: %d", i, ramp[i]);        break;    }  }  /* Negative cases */  SDL_ClearError();  SDLTest_AssertPass("Call to SDL_ClearError()");  gamma = -1;  for (i=0; i<256; i++) ramp[i] = magic;  SDL_CalculateGammaRamp(gamma, ramp);  SDLTest_AssertPass("Call to SDL_CalculateGammaRamp(%f)", gamma);  error = SDL_GetError();  SDLTest_AssertPass("Call to SDL_GetError()");  SDLTest_AssertCheck(error != NULL, "Validate that error message was not NULL");  if (error != NULL) {      SDLTest_AssertCheck(SDL_strcmp(error, expectedError1) == 0,          "Validate error message, expected: '%s', got: '%s'", expectedError1, error);  }  changed = 0;  for (i = 0; i < 256; i++) if (ramp[i] != magic) changed++;  SDLTest_AssertCheck(changed ==0, "Validate that ramp unchanged; expected: 0 values changed got: %d values changed", changed);  SDL_CalculateGammaRamp(0.5f, NULL);  SDLTest_AssertPass("Call to SDL_CalculateGammaRamp(0.5,NULL)");  error = SDL_GetError();  SDLTest_AssertPass("Call to SDL_GetError()");  SDLTest_AssertCheck(error != NULL, "Validate that error message was not NULL");  if (error != NULL) {      SDLTest_AssertCheck(SDL_strcmp(error, expectedError2) == 0,          "Validate error message, expected: '%s', got: '%s'", expectedError2, error);  }  /* Cleanup */  SDL_free(ramp);  return TEST_COMPLETED;}/* ================= Test References ================== *//* Pixels test cases */static const SDLTest_TestCaseReference pixelsTest1 = {    (SDLTest_TestCaseFp)pixels_allocFreeFormat, "pixels_allocFreeFormat", "Call to SDL_AllocFormat and SDL_FreeFormat", TEST_ENABLED};static const SDLTest_TestCaseReference pixelsTest2 = {    (SDLTest_TestCaseFp)pixels_allocFreePalette, "pixels_allocFreePalette", "Call to SDL_AllocPalette and SDL_FreePalette", TEST_ENABLED};static const SDLTest_TestCaseReference pixelsTest3 =        { (SDLTest_TestCaseFp)pixels_calcGammaRamp, "pixels_calcGammaRamp", "Call to SDL_CalculateGammaRamp", TEST_ENABLED };static const SDLTest_TestCaseReference pixelsTest4 =        { (SDLTest_TestCaseFp)pixels_getPixelFormatName, "pixels_getPixelFormatName", "Call to SDL_GetPixelFormatName", TEST_ENABLED };/* Sequence of Pixels test cases */static const SDLTest_TestCaseReference *pixelsTests[] =  {    &pixelsTest1, &pixelsTest2, &pixelsTest3, &pixelsTest4, NULL};/* Pixels test suite (global) */SDLTest_TestSuiteReference pixelsTestSuite = {    "Pixels",    NULL,    pixelsTests,    NULL};
 |