                                             
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 <pname> 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
