Name

    APPLE_row_bytes

Name Strings

    GL_APPLE_row_bytes

Contributors

    Andrew Barnes
    John Rosasco

Contact

    John Rosasco, Apple Computer (jdr 'at' apple.com)

Status

    TBD

Version

    Last Modified: October 17, 2006
    Revision: #2

Number

    372

Dependencies

    OpenGL 1.1 is required.

    Written based on the wording of the OpenGL 2.1 specification.

Overview

    The APPLE_row_bytes extension was developed to relax the limitations
    within GL regarding the packing and unpacking of pixel data from
    arbitrary arrangements in memory.

    Prior to this extension, similar, albeit more restrictive, functionality
    existed in GL using pixel storage modes for unpacking, packing, and
    alignment.  The limitation of the existing mechanism lies primarily in how
    packing or unpacking of data is specified with pixel atomicity rather than
    basic machine units.  To some extent, this pixel granularity can be
    overcome using pixel storage modes GL_UNPACK_ALIGNMENT and
    GL_PACK_ALIGNMENT.  Both of these parameters are specified in basic
    machine units but their range of possible values is restricted and even
    then they do not allow for the packing and unpacking of pixel data in a
    fully arbitrary manner.

    Consider this simple example:

        Consider a column of pixels in memory.  The pixels are of GL_RGB 
        format and GL_UNSIGNED_BYTE type resulting in 3 bytes per pixel.
        Now consider that this column of pixel data was arranged in memory
        such that each row of the image (in this case each pixel) has two
        bytes padding or space between them.

        Each row of 1 pixel then has 5 bytes.  An attempting to express this
        memory arrangement with existing pixel storage semantics would
        naturally start with a GL_UNPACK_ROW_LENGTH of 1 because there is
        one pixel per row.  However, no valid value of GL_UNPACK_ALIGNMENT,
        1, 2, 4, or 8, will allow the proper row padding to express this 
        memory arrangement.

Glossary

    Storage mode class - delineation of packing vs unpacking pixel storage
    mode values.

Issues

    What happens when row bytes pixel storage values are specified in
    conjunction with row length or alignment values ?

        Specifying non-zero row bytes packing or unpacking values will
        override all values specified for both row length and alignment
        of the same class.  In other words, if GL_PACK_ROW_BYTES is
        specified as non-zero, it overrides values of both 
        GL_PACK_ROW_LENGTH and GL_PACK_ALIGNMENT.  The same scenario is
        true of unpacking pixel storage parameters.

    How do you switch between using row length and alignment values to row
    bytes values ?

        Set the row bytes value to zero for the same storage mode class
        to use conventional row length and alignment semantics.  Set
        row bytes to non-zero to use APPLE_row_bytes semantics.

    Does the semantics for packing need to match that of unpacking ?
    (i.e. if you are unpacking with row bytes semantics do you need to pack with
    row bytes ?)

        No.  Storage mode class semantics are independent.

    If retrieving data from GL, such as in a ReadPixels() or
    GetTexImage(), do the unpack settings have any effect ?

        Yes.  If the format and type of the data of a source or destination
        for packing or unpacking is not known, as in the case of a
        ReadPixels() call or a GetTexImage() call, the storage mode class
        values for the unknown arrangement should be set to GL default
        values.  In the case cited above, the packing modes can be specified
        but the unpacking modes should be set to default GL values.

    What are the default values for GL_PACK_ROW_BYTES and GL_UNPACK_ROW_BYTES
    ?
        Zero.


New Procedures and Functions

    None.


Errors

    None.


New Types

    None.


New Tokens

    Accepted by the <pname> parameter of PixelStorei and the <pname>
    parameter of GetIntegerv:

        PACK_ROW_BYTES_APPLE          0x8A15
        UNPACK_ROW_BYTES_APPLE        0x8A16


New State

    Get Value               Get Command     Type    Value       Attrib
    ---------               -----------     ----    -------     ------
    PACK_ROW_BYTES_APPLE    GetIntegerv     Z+      0           client_pixel_store   
    UNPACK_ROW_BYTES_APPLE  GetIntegerv     Z+      0           client_pixel_store  



Additions to table 3.1 of the 2.1 specification (PixelStore parameters (write)):

    Parameter Name          Type        Initial Value   Valid Range
    UNPACK_ROW_BYTES_APPLE  integer     0               [0, inf]


Additions to table 4.5 of the 2.1 specification (PixelStore parameters (read)):

    Parameter Name          Type        Initial Value   Valid Range
    PACK_ROW_BYTES_APPLE    integer     0               [0, inf]


Version History

#1 - Initial document.

#2 - Added state segment.
