Name ANGLE_pack_reverse_row_order Name Strings GL_ANGLE_pack_reverse_row_order Contact Daniel Koch, TransGaming (daniel 'at' transgaming.com) Contributors Brian Salomon Daniel Koch Status Implemented in ANGLE ES2 Version Last Modified Date: February 22, 2011 Author Revision: 22 Number TBD Dependencies OpenGL 1.5 or OpenGL ES 1.0 are required. Some of the functionality of this extension is not supported when implemented against OpenGL ES. EXT_texture_rg interacts with this extension. The extension is written against the OpenGL 3.2 Specification (Core Profile). Overview This extension introduces a mechanism to allow reversing the order in which image rows are written into a pack destination. This effectively allows an application to flip the results of a ReadPixels in the y direction operation without having to render upside down. The coordinate system of OpenGL is vertically reversed in comparison to a number of other graphics systems such as native windowing APIs. Applications that perform ReadPixels may have to either render to an intermediate color buffer before calling ReadPixels or perform a flip in software after ReadPixels. In some systems the GL can perform the row reversal during ReadPixels without incurring additional cost. IP Status No known IP claims. New Procedures and Functions None New Types None New Tokens Accepted by the parameter of PixelStore{if}, GetIntegerv(), GetBooleanv(), and GetFloatv(): PACK_REVERSE_ROW_ORDER_ANGLE 0x93A4 Additions to Chapter 3 of the OpenGL 3.2 Specification (Rasterization) In Section 4.3.1 (Reading Pixels) add a row to table 4.7: +------------------------------+---------+---------------+-------------+ | Parameter Name | Type | Initial Value | Valid Range | +------------------------------+---------+---------------+-------------+ | PACK_REVERSE_ROW_ORDER_ANGLE | boolean | FALSE | TRUE/FALSE | +------------------------------+---------+---------------+-------------+ In Section 4.3.1 (Reading Pixels) modify the second paragraph of subsection "Placement in Pixel Pack Buffer or Client Memory" to read: When PACK_REVERSE_ROW_ORDER_ANGLE is FALSE groups of elements are placed in memory just as they are taken from memory when transferring pixel rectangles to the GL. That is, the ith group of the jth row (corresponding to the ith pixel in the jth row) is placed in memory just where the ith group of the jth row would be taken from when transferring pixels. See Unpacking under section 3.7.2. The only difference is that the storage mode parameters whose names begin with PACK_ are used instead of those whose names begin with UNPACK_. If the format is RED, GREEN, BLUE, or ALPHA, only the corresponding single element is written. Likewise if the format is RG, RGB, or BGR, only the corresponding two or three elements are written. Otherwise all the elements of each group are written. When PACK_REVERSE_ROW_ORDER_ANGLE is TRUE the order of the rows of elements is reversed before the data is packed. That is, the element corresponding to pixel (x, y + height - 1) becomes the first element packed, followed by (x + 1, y + height - 1), etc. Otherwise, pixel data is packed in the same manner as when PACK_REVERSE_ROW_ORDER_ANGLE is FALSE. Additions to Chapter 6 of the OpenGL 3.2 Specification (State and State Requests) In Section 6.1.4 add the following sentence to the fifth paragraph (beginning with "For three-dimensional and two-dimensional array textures..."): When PACK_REVERSE_ROW_ORDER_ANGLE is TRUE the order of rows within each image are reversed without reordering the images themselves. Dependencies on OpenGL ES If implemented for OpenGL ES, this extension behaves as specified, except: -Delete all references to formats RED, GREEN, BLUE, RG, and BGR. -The language about image order in Section 6.1.4 does not apply as OpenGL ES does not have GetTexImage. Dependencies on EXT_texture_rg If EXT_texture_rg is present reinsert language about formats RED and RG into the OpenGL ES 2.0 specification. Errors None New State Initial Get Value Type Get Command Value Description Sec. --------- ---- ----------- ------- ----------- ---- PACK_REVERSE_ROW_ORDER_ANGLE B GetIntegerv FALSE Pixel pack row order reversal 4.3.1 New Implementation Dependent State None Issues None Sample Code /* Allocate space to hold the pixel data */ const GLvoid* pixels = malloc(width * height * 4); /* Bind the framebuffer object to be read */ glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer); /* Enable row order reversal */ glPixelStore(GL_PACK_REVERSE_ROW_ORDER_ANGLE, TRUE); /* The pixel data stored in pixels will be in top-down order, ready for * use with a windowing system API that expects this order. */ glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); Revision History Revision 1, 2011/11/22 (Brian Salomon) - First version Revision 2, 2012/02/22 (dgkoch) - prepare for publishing