Fixed GL_RenderWritePixels() - thanks Ryan!
authorSam Lantinga <slouken@libsdl.org>
Wed, 06 Jan 2010 06:12:01 +0000
changeset 3607 8b4c0320638e
parent 3606 1a4456a01995
child 3608 a5a37f850d83
Fixed GL_RenderWritePixels() - thanks Ryan!
src/video/SDL_renderer_gl.c
--- 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;
 }