SDL_RenderReadPixels() now returns a surface
Fixes https://github.com/libsdl-org/SDL/issues/8977
This commit is contained in:
@@ -343,7 +343,7 @@ static int render_testPrimitivesBlend(void *arg)
|
||||
static int render_testPrimitivesWithViewport(void *arg)
|
||||
{
|
||||
SDL_Rect viewport;
|
||||
Uint32 pixel;
|
||||
SDL_Surface *surface;
|
||||
|
||||
/* Clear surface. */
|
||||
clearScreen();
|
||||
@@ -363,9 +363,15 @@ static int render_testPrimitivesWithViewport(void *arg)
|
||||
viewport.h = 1;
|
||||
CHECK_FUNC(SDL_SetRenderViewport, (renderer, &viewport));
|
||||
|
||||
pixel = 0;
|
||||
CHECK_FUNC(SDL_RenderReadPixels, (renderer, NULL, SDL_PIXELFORMAT_RGBA8888, &pixel, sizeof(pixel)));
|
||||
SDLTest_AssertCheck(pixel == 0xFFFFFFFF, "Validate diagonal line drawing with viewport, expected 0xFFFFFFFF, got 0x%.8x", (unsigned int)pixel);
|
||||
surface = SDL_RenderReadPixels(renderer, NULL);
|
||||
if (surface) {
|
||||
Uint8 r, g, b, a;
|
||||
CHECK_FUNC(SDL_ReadSurfacePixel, (surface, 0, 0, &r, &g, &b, &a));
|
||||
SDLTest_AssertCheck(r == 0xFF && g == 0xFF && b == 0xFF && a == 0xFF, "Validate diagonal line drawing with viewport, expected 0xFFFFFFFF, got 0x%.2x%.2x%.2x%.2x", r, g, b, a);
|
||||
SDL_DestroySurface(surface);
|
||||
} else {
|
||||
SDLTest_AssertCheck(surface != NULL, "Validate result from SDL_RenderReadPixels, got NULL, %s", SDL_GetError());
|
||||
}
|
||||
|
||||
return TEST_COMPLETED;
|
||||
}
|
||||
@@ -1205,36 +1211,35 @@ hasTexAlpha(void)
|
||||
static void
|
||||
compare(SDL_Surface *referenceSurface, int allowable_error)
|
||||
{
|
||||
int ret;
|
||||
SDL_Rect rect;
|
||||
Uint8 *pixels;
|
||||
SDL_Surface *testSurface;
|
||||
int ret;
|
||||
SDL_Rect rect;
|
||||
SDL_Surface *surface, *testSurface;
|
||||
|
||||
/* Read pixels. */
|
||||
pixels = (Uint8 *)SDL_malloc(4*TESTRENDER_SCREEN_W*TESTRENDER_SCREEN_H);
|
||||
SDLTest_AssertCheck(pixels != NULL, "Validate allocated temp pixel buffer");
|
||||
if (pixels == NULL) {
|
||||
return;
|
||||
}
|
||||
/* Explicitly specify the rect in case the window isn't the expected size... */
|
||||
rect.x = 0;
|
||||
rect.y = 0;
|
||||
rect.w = TESTRENDER_SCREEN_W;
|
||||
rect.h = TESTRENDER_SCREEN_H;
|
||||
|
||||
/* Explicitly specify the rect in case the window isn't the expected size... */
|
||||
rect.x = 0;
|
||||
rect.y = 0;
|
||||
rect.w = TESTRENDER_SCREEN_W;
|
||||
rect.h = TESTRENDER_SCREEN_H;
|
||||
CHECK_FUNC(SDL_RenderReadPixels, (renderer, &rect, RENDER_COMPARE_FORMAT, pixels, 80*4 ))
|
||||
surface = SDL_RenderReadPixels(renderer, &rect);
|
||||
if (!surface) {
|
||||
SDLTest_AssertCheck(surface != NULL, "Validate result from SDL_RenderReadPixels, got NULL, %s", SDL_GetError());
|
||||
return;
|
||||
}
|
||||
|
||||
/* Create surface. */
|
||||
testSurface = SDL_CreateSurfaceFrom(pixels, TESTRENDER_SCREEN_W, TESTRENDER_SCREEN_H, TESTRENDER_SCREEN_W*4, RENDER_COMPARE_FORMAT);
|
||||
SDLTest_AssertCheck(testSurface != NULL, "Verify result from SDL_CreateSurfaceFrom is not NULL");
|
||||
testSurface = SDL_ConvertSurfaceFormat(surface, RENDER_COMPARE_FORMAT);
|
||||
SDL_DestroySurface(surface);
|
||||
if (!testSurface) {
|
||||
SDLTest_AssertCheck(testSurface != NULL, "Validate result from SDL_ConvertSurfaceFormat, got NULL, %s", SDL_GetError());
|
||||
return;
|
||||
}
|
||||
|
||||
/* Compare surface. */
|
||||
ret = SDLTest_CompareSurfaces( testSurface, referenceSurface, allowable_error );
|
||||
SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
|
||||
/* Compare surface. */
|
||||
ret = SDLTest_CompareSurfaces(testSurface, referenceSurface, allowable_error);
|
||||
SDLTest_AssertCheck(ret == 0, "Validate result from SDLTest_CompareSurfaces, expected: 0, got: %i", ret);
|
||||
|
||||
/* Clean up. */
|
||||
SDL_free(pixels);
|
||||
SDL_DestroySurface(testSurface);
|
||||
/* Clean up. */
|
||||
SDL_DestroySurface(testSurface);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -114,16 +114,27 @@ static void PrevStage(void)
|
||||
|
||||
static SDL_bool ReadPixel(int x, int y, SDL_Color *c)
|
||||
{
|
||||
SDL_Surface *surface;
|
||||
SDL_Rect r;
|
||||
SDL_bool result = SDL_FALSE;
|
||||
|
||||
r.x = x;
|
||||
r.y = y;
|
||||
r.w = 1;
|
||||
r.h = 1;
|
||||
if (SDL_RenderReadPixels(renderer, &r, SDL_PIXELFORMAT_RGBA32, c, sizeof(*c)) < 0) {
|
||||
|
||||
surface = SDL_RenderReadPixels(renderer, &r);
|
||||
if (surface) {
|
||||
if (SDL_ReadSurfacePixel(surface, 0, 0, &c->r, &c->g, &c->b, &c->a) == 0) {
|
||||
result = SDL_TRUE;
|
||||
} else {
|
||||
SDL_Log("Couldn't read pixel: %s\n", SDL_GetError());
|
||||
}
|
||||
SDL_DestroySurface(surface);
|
||||
} else {
|
||||
SDL_Log("Couldn't read back pixels: %s\n", SDL_GetError());
|
||||
return SDL_FALSE;
|
||||
}
|
||||
return SDL_TRUE;
|
||||
return result;
|
||||
}
|
||||
|
||||
static void DrawText(float x, float y, const char *fmt, ...)
|
||||
|
||||
@@ -52,15 +52,10 @@ static void draw(void)
|
||||
|
||||
static void save_surface_to_bmp(void)
|
||||
{
|
||||
SDL_Surface* surface;
|
||||
Uint32 pixel_format;
|
||||
SDL_Surface *surface;
|
||||
char file[128];
|
||||
|
||||
pixel_format = SDL_GetWindowPixelFormat(window);
|
||||
|
||||
surface = SDL_CreateSurface(width, height, pixel_format);
|
||||
|
||||
SDL_RenderReadPixels(renderer, NULL, pixel_format, surface->pixels, surface->pitch);
|
||||
surface = SDL_RenderReadPixels(renderer, NULL);
|
||||
|
||||
(void)SDL_snprintf(file, sizeof(file), "SDL_window%" SDL_PRIs32 "-%8.8d.bmp",
|
||||
SDL_GetWindowID(window), ++frame_number);
|
||||
|
||||
@@ -54,11 +54,11 @@ DrawComposite(DrawState *s)
|
||||
SDL_Rect viewport;
|
||||
SDL_FRect R;
|
||||
SDL_Texture *target;
|
||||
SDL_Surface *surface;
|
||||
|
||||
static SDL_bool blend_tested = SDL_FALSE;
|
||||
if (!blend_tested) {
|
||||
SDL_Texture *A, *B;
|
||||
Uint32 P;
|
||||
|
||||
A = SDL_CreateTexture(s->renderer, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_TARGET, 1, 1);
|
||||
SDL_SetTextureBlendMode(A, SDL_BLENDMODE_BLEND);
|
||||
@@ -74,9 +74,15 @@ DrawComposite(DrawState *s)
|
||||
SDL_SetRenderDrawColor(s->renderer, 0x00, 0x00, 0x00, 0x00);
|
||||
SDL_RenderFillRect(s->renderer, NULL);
|
||||
SDL_RenderTexture(s->renderer, A, NULL, NULL);
|
||||
SDL_RenderReadPixels(s->renderer, NULL, SDL_PIXELFORMAT_ARGB8888, &P, sizeof(P));
|
||||
|
||||
SDL_Log("Blended pixel: 0x%8.8" SDL_PRIX32 "\n", P);
|
||||
surface = SDL_RenderReadPixels(s->renderer, NULL);
|
||||
if (surface) {
|
||||
Uint8 r, g, b, a;
|
||||
if (SDL_ReadSurfacePixel(surface, 0, 0, &r, &g, &b, &a) == 0) {
|
||||
SDL_Log("Blended pixel: 0x%.2x%.2x%.2x%.2x\n", r, g, b, a);
|
||||
}
|
||||
SDL_DestroySurface(surface);
|
||||
}
|
||||
|
||||
SDL_DestroyTexture(A);
|
||||
SDL_DestroyTexture(B);
|
||||
|
||||
Reference in New Issue
Block a user