Merge branch 'master' of git+ssh://joukj@git.freedesktop.org/git/mesa/mesa
[mesa.git] / progs / demos / readpix.c
index 71ce9723543973f47df16a7100a6de683e93a845..c0aac2272f7598e6aacebc2e11edb2d0fe1e3587 100644 (file)
@@ -9,6 +9,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
+#include <string.h>
 #include <GL/glut.h>
 
 #include "readtex.h"
@@ -28,29 +29,32 @@ static GLboolean ScaleAndBias = GL_FALSE;
 static GLboolean Benchmark = GL_FALSE;
 static GLubyte *TempImage = NULL;
 
-#if 0
+#define COMBO 1
+#if COMBO == 0
 #define ReadFormat ImgFormat
 #define ReadType GL_UNSIGNED_BYTE
-#endif
-#if 1
+#elif COMBO == 1
 static GLenum ReadFormat = GL_RGBA;
 static GLenum ReadType = GL_UNSIGNED_BYTE;
-#endif
-#if 0
+#elif COMBO == 2
+static GLenum ReadFormat = GL_RGB;
+static GLenum ReadType = GL_UNSIGNED_BYTE;
+#elif COMBO == 3
 static GLenum ReadFormat = GL_RGB;
 static GLenum ReadType = GL_UNSIGNED_SHORT_5_6_5;
-#endif
-#if 0
+#elif COMBO == 4
 static GLenum ReadFormat = GL_RGBA;
 static GLenum ReadType = GL_UNSIGNED_SHORT_1_5_5_5_REV;
-#endif
-#if 0
+#elif COMBO == 5
 static GLenum ReadFormat = GL_BGRA;
 static GLenum ReadType = GL_UNSIGNED_SHORT_5_5_5_1;
-#endif
-#if 0
+#elif COMBO == 6
 static GLenum ReadFormat = GL_BGRA;
 static GLenum ReadType = GL_UNSIGNED_SHORT_4_4_4_4_REV;
+#elif COMBO == 7
+static GLenum ReadFormat = GL_RGBA;
+static GLenum ReadType = GL_HALF_FLOAT_ARB;
+#undef GL_OES_read_format
 #endif
 
 
@@ -95,6 +99,45 @@ SetupPixelTransfer(GLboolean invert)
 }
 
 
+/**
+ * Exercise Pixel Pack parameters by reading the image in four pieces.
+ */
+static void
+ComplexReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
+                  GLenum format, GLenum type, GLvoid *pixels)
+{
+   const GLsizei width0 = width / 2;
+   const GLsizei width1 = width - width0;
+   const GLsizei height0 = height / 2;
+   const GLsizei height1 = height - height0;
+
+   glPixelStorei(GL_PACK_ROW_LENGTH, width);
+
+   /* lower-left quadrant */
+   glReadPixels(x, y, width0, height0, format, type, pixels);
+
+   /* lower-right quadrant */
+   glPixelStorei(GL_PACK_SKIP_PIXELS, width0);
+   glReadPixels(x + width0, y, width1, height0, format, type, pixels);
+
+   /* upper-left quadrant */
+   glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
+   glPixelStorei(GL_PACK_SKIP_ROWS, height0);
+   glReadPixels(x, y + height0, width0, height1, format, type, pixels);
+
+   /* upper-right quadrant */
+   glPixelStorei(GL_PACK_SKIP_PIXELS, width0);
+   glPixelStorei(GL_PACK_SKIP_ROWS, height0);
+   glReadPixels(x + width0, y + height0, width1, height1, format, type, pixels);
+
+   /* restore defaults */
+   glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
+   glPixelStorei(GL_PACK_SKIP_ROWS, 0);
+   glPixelStorei(GL_PACK_ROW_LENGTH, ImgWidth);
+}
+
+
+
 static void
 Display( void )
 {
@@ -110,8 +153,13 @@ Display( void )
    glRasterPos2i(APosX, APosY);
    glEnable(GL_DITHER);
    SetupPixelTransfer(GL_FALSE);
+   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glDrawPixels(ImgWidth, ImgHeight, ImgFormat, GL_UNSIGNED_BYTE, Image);
 
+   /* might try alignment=4 here for testing */
+   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+   glPixelStorei(GL_PACK_ALIGNMENT, 1);
+
    /* do readpixels, drawpixels */
    glRasterPos2i(BPosX, 5);
    PrintString("Read/DrawPixels");
@@ -137,8 +185,15 @@ Display( void )
    else {
       /* clear the temporary image to white (helpful for debugging */
       memset(TempImage, 255, ImgWidth * ImgHeight * 4);
+#if 1
       glReadPixels(APosX, APosY, ImgWidth, ImgHeight,
                    ReadFormat, ReadType, TempImage);
+      (void) ComplexReadPixels;
+#else
+      /* you might use this when debugging */
+      ComplexReadPixels(APosX, APosY, ImgWidth, ImgHeight,
+                        ReadFormat, ReadType, TempImage);
+#endif
    }
    glRasterPos2i(BPosX, BPosY);
    glDisable(GL_DITHER);
@@ -252,14 +307,16 @@ Init( GLboolean ciMode )
 
    printf("Loaded %d by %d image\n", ImgWidth, ImgHeight );
 
-   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glPixelStorei(GL_UNPACK_ROW_LENGTH, ImgWidth);
-   glPixelStorei(GL_PACK_ALIGNMENT, 1);
    glPixelStorei(GL_PACK_ROW_LENGTH, ImgWidth);
 
    Reset();
 
-   TempImage = (GLubyte *) malloc(ImgWidth * ImgHeight * 4 * sizeof(GLubyte));
+   /* allocate large TempImage to store and image data type, plus an
+    * extra 1KB in case we're tinkering with pack alignment.
+    */
+   TempImage = (GLubyte *) malloc(ImgWidth * ImgHeight * 4 * 4
+                                  + 1000);
    assert(TempImage);
 }