Back to the OpenGL extension cross reference

GL_EXT_packed_pixels


Name


    EXT_packed_pixels

Name Strings


    GL_EXT_packed_pixels

Version


    $Date: 1997/09/22 23:23:58 $ $Revision: 1.21 $

Number


    23

Dependencies


    EXT_abgr affects the definition of this extension
EXT_texture3D affects the definition of this extension
EXT_subtexture affects the definition of this extension
EXT_histogram affects the definition of this extension
EXT_convolution affects the definition of this extension
SGI_color_table affects the definition of this extension
SGIS_texture4D affects the definition of this extension
EXT_cmyka affects the definition of this extension

Overview


    This extension provides support for packed pixels in host memory.  A
packed pixel is represented entirely by one unsigned byte, one
unsigned short, or one unsigned integer. The fields with the packed
pixel are not proper machine types, but the pixel as a whole is. Thus
the pixel storage modes, including PACK_SKIP_PIXELS, PACK_ROW_LENGTH,
PACK_SKIP_ROWS, PACK_IMAGE_HEIGHT_EXT, PACK_SKIP_IMAGES_EXT,
PACK_SWAP_BYTES, PACK_ALIGNMENT, and their unpacking counterparts all
work correctly with packed pixels.

New Procedures and Functions


    None

New Tokens


    Accepted by the <type> parameter of DrawPixels, ReadPixels, TexImage1D,
TexImage2D, GetTexImage, TexImage3DEXT, TexSubImage1DEXT,
TexSubImage2DEXT, TexSubImage3DEXT, GetHistogramEXT, GetMinmaxEXT,
ConvolutionFilter1DEXT, ConvolutionFilter2DEXT, ConvolutionFilter3DEXT,
GetConvolutionFilterEXT, SeparableFilter2DEXT, SeparableFilter3DEXT,
GetSeparableFilterEXT, ColorTableSGI, GetColorTableSGI, TexImage4DSGIS,
and TexSubImage4DSGIS:

UNSIGNED_BYTE_3_3_2_EXT 0x8032
UNSIGNED_SHORT_4_4_4_4_EXT 0x8033
UNSIGNED_SHORT_5_5_5_1_EXT 0x8034
UNSIGNED_INT_8_8_8_8_EXT 0x8035
UNSIGNED_INT_10_10_10_2_EXT 0x8036

Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation)


    None

Additions to Chapter 3 of the 1.0 Specification (Rasterization)


    The five tokens defined by this extension are added to Table 3.4:

<type> Parameter Corresponding Special
Token Value GL Data Type Interpretation
---------------- ------------- --------------
UNSIGNED_BYTE ubyte No
BYTE byte No
UNSIGNED_SHORT ushort No
SHORT short No
UNSIGNED_INT uint No
INT int No
FLOAT float No
BITMAP ubyte Yes
UNSIGNED_BYTE_3_3_2_EXT ubyte Yes
UNSIGNED_SHORT_4_4_4_4_EXT ushort Yes
UNSIGNED_SHORT_5_5_5_1_EXT ushort Yes
UNSIGNED_INT_8_8_8_8_EXT uint Yes
UNSIGNED_INT_10_10_10_2_EXT uint Yes

Table 3.4: DrawPixels and ReadPixels <type> parameter values and the
corresponding GL data types. Refer to table 2.2 for definitions of
GL data types. Special interpretations are described near the end
of section 3.6.3.

[Section 3.6.3 of the GL Specification (Rasterization of Pixel
Rectangles) is rewritten as follows:]

3.6.3 Rasterization of Pixel Rectangles

The process of drawing pixels encoded in host memory is diagrammed in
Figure 3.7. We describe the stages of this process in the order in which
they occur.

Pixels are drawn using

void DrawPixels(sizei width,
sizei height,
enum format,
enum type,
void* data);

<format> is a symbolic constant indicating what the values in memory
represent. <width> and <height> are the width and height, respectively,
of the pixel rectangle to be drawn. <data> is a pointer to the data to
be drawn. These data are represented with one of seven GL data types,
specified by <type>. The correspondence between the thirteen <type>
token values and the GL data types they indicate is given in Table 3.4.
If the GL is in color index mode and <format> is not one of COLOR_INDEX,
STENCIL_INDEX, or DEPTH_COMPONENT, then the error INVALID_OPERATION
occurs. Some additional constraints on the combinations of <format>
and <type> values that are accepted are discussed below.

Unpacking

Data are taken from host memory as a sequence of signed or unsigned bytes
(GL data types byte and ubyte), signed or unsigned short integers (GL data
types short and ushort), signed or unsigned integers (GL data types int
and uint), or floating-point values (GL data type float). These elements
are grouped into sets of one, two, three, four, or five values, depending
on the <format>, to form a group. Table 3.5 summarizes the format of
groups obtained from memory. It also indicates those formats that yield
indices and those that yield components.

Target
Format Name Buffer Element Meaning and Order
----------- ------ -------------------------
COLOR_INDEX Color Color index
STENCIL_INDEX Stencil Stencil index
DEPTH_COMPONENT Depth Depth component
RED Color R component
GREEN Color G component
BLUE Color B component
ALPHA Color A component
RGB Color R, G, B components
RGBA Color R, G, B, A components
ABGR_EXT Color A, B, G, R components
CMYK_EXT Color Cyan, Magenta, Yellow, Black components
CMYKA_EXT Color Cyan, Magenta, Yellow, Black, A components
LUMINANCE Color Luminance component
LUMINANCE_ALPHA Color Luminance, A components

Table 3.5: DrawPixels and ReadPixels formats. The third column
gives a description of and the number and order of elements in a
group.

By default the values of each GL data type are interpreted as they would
be specified in the language of the client's GL binding. If
UNPACK_SWAP_BYTES is set to TRUE, however, then the values are
interpreted with the bit orderings modified as per the table below. The
modified bit orderings are defined only if the GL data type ubyte has
eight bits, and then for each specific GL data type only if that type
is represented with 8, 16, or 32 bits.

Element Default
Size Bit Ordering Modified Bit Ordering
------- ------------ ---------------------
8-bit [7..0] [7..0]
16-bit [15..0] [7..0] [15..8]
32-bit [31..0] [7..0] [15..8] [23..16] [31..24]

Table: Bit ordering modification of elements when UNPACK_SWAP_BYTES
is TRUE. These reorderings are defined only when GL data type ubyte
has 8 bits, and then only for GL data types with 8, 16, or 32 bits.

The groups in memory are treated as being arranged in a rectangle. This
rectangle consists of a series of rows, with the first element of the
first group of the first row pointed to by the pointer passed to
DrawPixels. If the value of UNPACK_ROW_LENGTH is not positive, then the
number of groups in a row is <width>; otherwise the number of groups is
UNPACK_ROW_LENGTH. If the first element of the first row is at location
p in memory, then the location of the first element of the Nth row is

p + Nk

where N is the row number (counting from zero) and k is defined as

/ nl s >= a
k = <
\ a/s * ceiling(snl/a) s < a

where n is the number of elements in a group, l is the number of groups
in a row, a is the value of UNPACK_ALIGNMENT, and s is the size,
in units of GL ubytes, of an element. If the number of bits per
element is not 1, 2, 4, or 8 times the number of bits in a GL ubyte,
then k = nl for all values of a.

There is a mechanism for selecting a sub-rectangle of groups from a
larger containing rectangle. This mechanism relies on three integer
parameters: UNPACK_ROW_LENGTH, UNPACK_SKIP_ROWS, and UNPACK_SKIP_PIXELS.
Before obtaining the first group from memory, the pointer supplied to
DrawPixels is effectively advanced by

UNPACK_SKIP_PIXELS * n + UNPACK_SKIP_ROWS * k

elements. Then <width> groups are obtained from contiguous elements
in memory (without advancing the pointer), after which the pointer is
advanced by k elements. <height> sets of <width> groups of values are
obtained this way. See Figure 3.8.

Calling DrawPixels with a <type> of UNSIGNED_BYTE_3_3_2,
UNSIGNED_SHORT_4_4_4_4, UNSIGNED_SHORT_5_5_5_1, UNSIGNED_INT_8_8_8_8,
or UNSIGNED_INT_10_10_10_2 is a special case in which all the elements
of each group are packed into a single unsigned byte, unsigned short,
or unsigned int, depending on the type. The number of elements per
packed pixel is fixed by the type, and must match the number of
elements per group indicated by the <format> parameter. (See the table
below.) The error INVALID_OPERATION is generated if a mismatch occurs.

GL Number
<type> Parameter Data of Matching
Token Name Type Elements Pixel Formats
---------------- ---- -------- -------------

UNSIGNED_BYTE_3_3_2_EXT ubyte 3 RGB
UNSIGNED_SHORT_4_4_4_4_EXT ushort 4 RGBA,ABGR_EXT,CMYK_EXT
UNSIGNED_SHORT_5_5_5_1_EXT ushort 4 RGBA,ABGR_EXT,CMYK_EXT
UNSIGNED_INT_8_8_8_8_EXT uint 4 RGBA,ABGR_EXT,CMYK_EXT
UNSIGNED_INT_10_10_10_2_EXT uint 4 RGBA,ABGR_EXT,CMYK_EXT

Bitfield locations of the first, second, third, and fourth elements
of each packed pixel type are illustrated in the diagrams below. Each
bitfield is interpreted as an unsigned integer value. If the base GL
type is supported with more than the minimum precision (e.g. a 9-bit
byte) the packed elements are right-justified in the pixel.


UNSIGNED_BYTE_3_3_2_EXT:

7 6 5 4 3 2 1 0
+-----------+-----------+-------+
| | | |
+-----------+-----------+-------+

first second third
element element element


UNSIGNED_SHORT_4_4_4_4_EXT:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+---------------+---------------+---------------+---------------+
| | | | |
+---------------+---------------+---------------+---------------+

first second third fourth
element element element element


UNSIGNED_SHORT_5_5_5_1_EXT:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+-------------------+-------------------+-------------------+---+
| | | | |
+-------------------+-------------------+-------------------+---+

first second third fourth
element element element element


UNSIGNED_INT_8_8_8_8_EXT:

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+-----------------------+-----------------------+-----------------------+-----------------------+
| | | | |
+-----------------------+-----------------------+-----------------------+-----------------------+

first second third fourth
element element element element


UNSIGNED_INT_10_10_10_2_EXT:

31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+-----------------------------+-----------------------------+-----------------------------+-----+
| | | | |
+-----------------------------+-----------------------------+-----------------------------+-----+

first second third fourth
element element element element


The assignment of elements to fields in the packed pixel is as
described in the table below:

First Second Third Fourth
Format Element Element Element Element
------ ------- ------- ------- -------
RGB red green blue
RGBA red green blue alpha
ABGR_EXT alpha blue green red
CMYK_EXT cyan magenta yellow black

Byte swapping, if enabled, is performed before the elements are
extracted from each pixel. The above discussions of row length and
image extraction are valid for packed pixels, if "group" is substituted
for "element" and the number of elements per group is understood to
be one.

Calling DrawPixels with a <type> of BITMAP is a special case in which
the data are a series of GL ubyte values. Each ubyte value specifies
8 1-bit elements with its 8 least-significant bits. The 8 single-bit
elements are ordered from most significant to least significant if the
value of UNPACK_LSB_FIRST is FALSE; otherwise, the ordering is from
least significant to most significant. The values of bits other than
the 8 least significant in each ubyte are not significant.

The first element of the first row is the first bit (as defined above)
of the ubyte pointed to by the pointer passed to DrawPixels. The first
element of the second row is the first bit (again as defined above) of
the ubyte at location p+k, where k is computed as

k = a * ceiling(nl/8a)

There is a mechanism for selecting a sub-rectangle of elements from
a BITMAP image as well. Before obtaining the first element from memory,
the pointer supplied to DrawPixels is effectively advanced by

UNPACK_SKIP_ROWS * k

ubytes. Then UNPACK_SKIP_PIXELS 1-bit elements are ignored, and the
subsequent <width> 1-bit elements are obtained, without advancing the
ubyte pointer, after which the pointer is advanced by k ubytes. <height>
sets of <width> elements are obtained this way.

Conversion to floating-point

This step applies only to groups of components. It is not performed on
indices. Each element in a group is converted to a floating-point value
according to the appropriate formula in Table 2.4 (section 2.12).
Unsigned integer bitfields extracted from packed pixels are interpreted
using the formula

f = c / ((2**N)-1)

where c is the value of the bitfield (interpreted as an unsigned
integer), N is the number of bits in the bitfield, and the division is
performed in floating point.

[End of changes to Section 3.6.3]

If this extension is supported, all commands that accept pixel data
also accept packed pixel data. These commands are DrawPixels,
TexImage1D, TexImage2D, TexImage3DEXT, TexSubImage1DEXT,
TexSubImage2DEXT, TexSubImage3DEXT, ConvolutionFilter1DEXT,
ConvolutionFilter2DEXT, ConvolutionFilter3DEXT, SeparableFilter2DEXT,
SeparableFilter3DEXT, ColorTableSGI, TexImage4DSGIS, and
TexSubImage4DSGIS.

Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations and the Framebuffer)


    [Make the following changes to Section 4.3.2 (Reading Pixels):]

Final Conversion

For an index, if the <type> is not FLOAT, final conversion consists of
masking the index with the value given in Table 4.6; if the <type> is
FLOAT, then the integer index is converted to a GL float data value.
For a component, each component is first clamped to [0,1]. Then,
the appropriate conversion formula from Table 4.7 is applied to the
component.

<type> Parameter Index Mask
---------------- ----------
UNSIGNED_BYTE 2**8 - 1
BITMAP 1
BYTE 2**7 - 1
UNSIGNED_SHORT 2**16 - 1
SHORT 2**15 - 1
UNSIGNED_INT 2**32 - 1
INT 2**31 - 1

Table 4.6: Index masks used by ReadPixels. Floating point data
are not masked.

<type> GL Data Component
Parameter Type Conversion Formula
--------- ------- ------------------
UNSIGNED_BYTE ubyte c = ((2**8)-1)*f
BYTE byte c = (((2**8)-1)*f-1)/2
UNSIGNED_SHORT ushort c = ((2**16)-1)*f
SHORT short c = (((2**16)-1)*f-1)/2
UNSIGNED_INT uint c = ((2**32)-1)*f
INT int c = (((2**32)-1)*f-1)/2
FLOAT float c = f
UNSIGNED_BYTE_3_3_2_EXT ubyte c = ((2**N)-1)*f
UNSIGNED_SHORT_4_4_4_4_EXT ushort c = ((2**N)-1)*f
UNSIGNED_SHORT_5_5_5_1_EXT ushort c = ((2**N)-1)*f
UNSIGNED_INT_8_8_8_8_EXT uint c = ((2**N)-1)*f
UNSIGNED_INT_10_10_10_2_EXT uint c = ((2**N)-1)*f

Table 4.7: Reversed component conversions - used when component data
are being returned to client memory. Color, normal, and depth
components are converted from the internal floating-point
representation (f) to a datum of the specified GL data type (c) using
the equations in this table. All arithmetic is done in the internal
floating point format. These conversions apply to component data
returned by GL query commands and to components of pixel data returned
to client memory. The equations remain the same even if the
implemented ranges of the GL data types are greater than the minimum
required ranges. (Refer to table 2.2.) Equations with N as the
exponent are performed for each bitfield of the packed data type,
with N set to the number of bits in the bitfield.

Placement in Client Memory

Groups of elements are placed in memory just as they are taken from memory
for DrawPixels. That is, the ith group of the jth row (corresponding to
the ith pixel in the jth row) is placed in memory must where the ith group
of the jth row would be taken from for DrawPixels. See Unpacking under
section 3.6.3. The only difference is that the storage mode parameters
whose names begin with PACK_ are used instead of those whose names begin
with UNPACK_.

[End of changes to Section 4.3.2]

If this extension is supported, all commands that return pixel data
also return packed pixel data. These commands are ReadPixels,
GetTexImage, GetHistogramEXT, GetMinmaxEXT, GetConvolutionFilterEXT,
GetSeparableFilterEXT, and GetColorTableSGI.

Additions to Chapter 5 of the 1.0 Specification (Special Functions)


    None

Additions to Chapter 6 of the 1.0 Specification (State and State Requests)


    None

Additions to the GLX Specification


    None

GLX Protocol


        None

Dependencies on EXT_abgr


    If EXT_abgr is not implemented, then the references to ABGR_EXT in this
file are invalid, and should be ignored.

Dependencies on EXT_texture3D


    If EXT_texture3D is not implemented, then the references to
TexImage3DEXT in this file are invalid, and should be ignored.

Dependencies on EXT_subtexture


    If EXT_subtexture is not implemented, then the references to
TexSubImage1DEXT, TexSubImage2DEXT, and TexSubImage3DEXT in this file
are invalid, and should be ignored.

Dependencies on EXT_histogram


    If EXT_histogram is not implemented, then the references to
GetHistogramEXT and GetMinmaxEXT in this file are invalid, and should be
ignored.

Dependencies on EXT_convolution


    If EXT_convolution is not implemented, then the references to
ConvolutionFilter1DEXT, ConvolutionFilter2DEXT, ConvolutionFilter3DEXT,
GetConvolutionFilterEXT, SeparableFilter2DEXT, SeparableFilter3DEXT, and
GetSeparableFilterEXT in this file are invalid, and should be ignored.

Dependencies on SGI_color_table


    If SGI_color_table is not implemented, then the references to
ColorTableSGI and GetColorTableSGI in this file are invalid, and should
be ignored.

Dependencies on SGIS_texture4D


    If SGIS_texture4D is not implemented, then the references to
TexImage4DSGIS and TexSubImage4DSGIS in this file are invalid, and should
be ignored.

Dependencies on EXT_cmyka


    If EXT_cmyka is not implemented, then the references to CMYK_EXT and
CMYKA_EXT in this file are invalid, and should be ignored.

Errors


    [For the purpose of this enumeration of errors, GenericPixelFunction
represents any OpenGL function that accepts or returns pixel data, using
parameters <type> and <format> to define the type and format of that
data. Currently these functions are DrawPixels, ReadPixels, TexImage1D,
TexImage2D, GetTexImage, TexImage3DEXT, TexSubImage1DEXT,
TexSubImage2DEXT, TexSubImage3DEXT, GetHistogramEXT, GetMinmaxEXT,
ConvolutionFilter1DEXT, ConvolutionFilter2DEXT, ConvolutionFilter3DEXT,
GetConvolutionFilterEXT, SeparableFilter2DEXT, SeparableFilter3DEXT,
GetSeparableFilterEXT, ColorTableSGI, GetColorTableSGI, TexImage4DSGIS,
and TexSubImage4DSGIS.]

INVALID_OPERATION is generated by GenericPixelFunction if its <type>
parameter is UNSIGNED_BYTE_3_3_2_EXT and its <format> parameter does not
specify three components. Currently the only 3-component format is RGB.

INVALID_OPERATION is generated by GenericPixelFunction if its <type>
parameter is UNSIGNED_SHORT_4_4_4_4_EXT, UNSIGNED_SHORT_5_5_5_1_EXT,
UNSIGNED_INT_8_8_8_8_EXT, or UNSIGNED_INT_10_10_10_2_EXT and its
<format> parameter does not specify four components. Currently the only
4-component formats are RGBA, ABGR_EXT, and CMYK_EXT.

New State


    None

New Implementation Dependent State


    None

Implementation Support


   List of OpenGL implementations supporting the GL_EXT_packed_pixels extension

Original File


   Original text file for the GL_EXT_packed_pixels extension


Page generated on Sun Nov 20 18:37:29 2005