+/**
+ * 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);
+}
+
+
+