Mercurial > sdl-ios-xcode
diff src/video/SDL_renderer_gl.c @ 3607:8b4c0320638e
Fixed GL_RenderWritePixels() - thanks Ryan!
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Wed, 06 Jan 2010 06:12:01 +0000 |
parents | 0f958e527e5e |
children | 64ce267332c6 |
line wrap: on
line diff
--- a/src/video/SDL_renderer_gl.c Wed Jan 06 04:33:31 2010 +0000 +++ b/src/video/SDL_renderer_gl.c Wed Jan 06 06:12:01 2010 +0000 @@ -1454,8 +1454,11 @@ Uint32 pixel_format, const void * pixels, int pitch) { GL_RenderData *data = (GL_RenderData *) renderer->driverdata; + SDL_Window *window = SDL_GetWindowFromID(renderer->window); GLint internalFormat; GLenum format, type; + Uint8 *src, *dst, *tmp; + int length, rows; if (!convert_format(data, pixel_format, &internalFormat, &format, &type)) { /* FIXME: Do a temp copy to a format that is supported */ @@ -1463,8 +1466,6 @@ return -1; } - /* FIXME: We need to copy the data and flip it */ - if (pixel_format == SDL_PIXELFORMAT_INDEX1LSB) { data->glPixelStorei(GL_UNPACK_LSB_FIRST, 1); } else if (pixel_format == SDL_PIXELFORMAT_INDEX1MSB) { @@ -1474,8 +1475,21 @@ data->glPixelStorei(GL_UNPACK_ROW_LENGTH, (pitch / bytes_per_pixel(pixel_format))); - data->glRasterPos2i(rect->x, rect->y); - data->glDrawPixels(rect->w, rect->h, format, type, pixels); + /* Flip the rows to be bottom-up */ + length = rect->h * rect->w * pitch; + tmp = SDL_stack_alloc(Uint8, length); + src = (Uint8*)pixels + (rect->h-1)*pitch; + dst = (Uint8*)tmp; + rows = rect->h; + while (rows--) { + SDL_memcpy(dst, src, pitch); + dst += pitch; + src -= pitch; + } + + data->glRasterPos2i(rect->x, (window->h-rect->y)); + data->glDrawPixels(rect->w, rect->h, format, type, tmp); + SDL_stack_free(tmp); return 0; }