Name

    EXT_pixel_transform

Name Strings

    GL_EXT_pixel_transform

Version

    $Date: 2005/06/02 18:11:10 $ $Revision: 1.1 $

Number

    138

Dependencies

    None

Overview

    This extension provides support for scaling, rotation, translation and
    shearing of two-dimensional pixel rectangles in the pixel rasterizer.
    The transformation is defined via a 4x4 matrix, where only those entries
    which apply as a 2D affine transformation will be accepted and used.
    These matrices can be manipulated using the same functions as the other 
    OpenGL matrix stacks.
   

New Procedures and Functions

    void PixelTransformParameteriEXT(enum target,
				     enum pname,
				     const int param)

    void PixelTransformParameterfEXT(enum target,
				     enum pname,
				     const float param)

    void PixelTransformParameterivEXT(enum target,
				      enum pname,
				      const int* params)

    void PixelTransformParameterfvEXT(enum target,
				      enum pname,
				      const float* params)

    These routines are used to set pixel transformation attributes.
    The only allowable value for <target> at this time is
    PIXEL_TRANSFORM_2D_EXT.  Allowable values for <pname> include:
    PIXEL_MAG_FILTER_EXT, PIXEL_MIN_FILTER_EXT, and PIXEL_CUBIC_WEIGHT_EXT.

    void GetPixelTransformParameterivEXT(enum target,
				         enum pname,
				         const int* params)

    void GetPixelTransformParameterfvEXT(enum target,
				         enum pname,
				         const float* params)

    These routines are used to query pixel transformation attributes.
    The only allowable value for <target> at this time is
    PIXEL_TRANSFORM_2D_EXT.  Allowable values for <pname> include:
    PIXEL_MAG_FILTER_EXT, PIXEL_MIN_FILTER_EXT, and PIXEL_CUBIC_WEIGHT_EXT.

New Tokens

    Accepted by the <pname> parameter of PixelTransformParameteri,
    PixelTransformParameterf, PixelTransformParameteriv,
    PixelTransformParameterfv, GetPixelTransformParameteriv and
    GetPixelTransformParameterfv:

	PIXEL_MAG_FILTER_EXT                           0x8331
	PIXEL_MIN_FILTER_EXT                           0x8332
    	PIXEL_CUBIC_WEIGHT_EXT                         0x8333

    Accepted by the <params> parameter of PixelTransformParameteriEXT,
    PixelTransformParameterfEXT, PixelTransformParameterivEXT, and
    PixelTransformParameterfvEXT when <pname> is PIXEL_MAG_FILTER_EXT
    or PIXEL_MIN_FILTER_EXT:

	CUBIC_EXT                                      0x8334

    Accepted by the <params> parameter of PixelTransformParameteriEXT,
    PixelTransformParameterfEXT, PixelTransformParameterivEXT, and
    PixelTransformParameterfvEXT when <pname> is PIXEL_MIN_FILTER_EXT:

	AVERAGE_EXT                                    0x8335

    Accepted by the <mode> parameter of MatrixMode,
    and by the <target> parameter of PixelTransformParameterivEXT,
    PixelTransformParameterfvEXT, GetPixelTransformParameterivEXT,
    and GetPixelTransformParameterfvEXT:

	PIXEL_TRANSFORM_2D_EXT                         0x8330

    Accepted by the <pname> parameter of GetIntegerv, GetFloatv, 
    and GetDoublev: 

        PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT             0x8336
        MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT         0x8337

    Accepted by the <pname> parameter of GetFloatv, and GetDoublev: 

        PIXEL_TRANSFORM_2D_MATRIX_EXT                  0x8338


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

    In section 2.10.2 "Matrices":

    The projection matrix, model-view matrix and pixel-transform matrix
    are set and modified with a variety of commands. The affected matrix is
    determined by the current matrix mode.  The current matrix mode is set with
   
       void MatrixMode (enum mode);

    which takes one of the four pre-defined constants TEXTURE, MODELVIEW, 
    PROJECTION, or PIXEL_TRANSFORM_2D_EXT as the argument value.  TEXTURE is
    described later.  If the current matrix mode is MODELVIEW, then matrix 
    operations apply to the model-view matrix; if PROJECTION, then they apply
    to the projection matrix; if PIXEL_TRANSFORM_2D_EXT, then they apply to
    the pixel-transform matrix.

Additions to Chapter 3 of the 1.1 Specification (Rasterization)

    The specification of two-dimensional pixel transformation operators
    is defined in the GL specification in the final subsection of
    Section 3.6.3, "Conversion to Fragments."  The following paragraphs
    replace the text of the subsection.

    The conversion of a group to fragments is controlled by the pixel
    transformation matrix.  The pixel transformation matrix is defined
    by calling MatrixMode with <mode> set to PIXEL_TRANSFORM_2D_EXT, then using 
    any of the existing functions which operate on matrices and matrix stacks.
    (i.e. LoadIdentity, LoadMatrix, MultMatrix, PushMatrix, PopMatrix, Rotate, 
    Scale, and Translate.)  When using the matrix operators, while in 
    PIXEL_TRANSFORM_2D_EXT matrix mode, those entries in the 4 x 4 matrix 
    that are not part of a 2D affine transformation are forced to take on 
    values of either 0 or 1 so that the final matrix represents a 2D affine 
    transformation matrix.  That is to say, of the matrix entries shown below:

           --               --
           | m0  m4  m8   m12|
       P = | m1  m5  m9   m13|
           | m2  m6  m10  m14|
           | m3  m7  m11  m15|
           --               --

    only the matrix entries m0, m1, m4, m5, m12, and m13 are allowed to
    vary.  The other matrix entries will be forced to be either 0 or 1 as 
    shown below:

           --               --
           | m0  m4   0   m12|
       P = | m1  m5   0   m13|
           |  0   0   1    0 |
           |  0   0   0    1 |
           --               --

    The pixel transformation operation is always enabled.  The pixel 
    transformation operation uses the current pixel transformation
    matrix to compute new window coordinates for each incoming pixel.
    Resampling occurs after the pixel transformation matrix has been
    applied.

    Window coordinates are computed for each group by multiplying
    the column/row location in the original pixel rectangle by the pixel
    transformation matrix.  The components of the current raster position
    (section 2.12) are then added to the resulting components.  (If the
    current raster position is invalid, then DrawPixels is
    ignored.) Let (Xrp, Yrp) be the current raster position and let
    (Xo, Yo) represent the column and row of the group in the original
    pixel rectangle.  The depth value (Z) for the group is defined
    as the depth value at the original location in the pixel rectangle
    if the format was DEPTH_COMPONENT, and as the depth associated with
    the current raster position otherwise.  The final transformed pixel
    coordinate (Xf, Yf, Zf) is computed by:

       --    --       --  --
       |  Xo  |       | Xt |
       |  Yo  |  P =  | Yt |
       |  Z   |       | Zt |
       |  1   |       | 1  |
       --    --       --  --

       Xf = Xt + Xrp
       Yf = Yt + Yrp
       Zf = Zt

    The function

	void PixelZoom( float zx, float zy ) ;

    will set the current pixel transformation matrix (the current top
    of the pixel transformation matrix stack) to the scaling matrix:

           --               --
           | zx   0   0    0 |
       P = |  0  zy   0    0 |
           |  0   0   1    0 |
           |  0   0   0    1 |
           --               --

    The original pixel value for each input pixel location is left unmodified
    by the pixel transformation.  Since multiple input pixels can be mapped
    into a single output pixel (minification of the input pixel rectangle),
    or since output pixels might not have any input pixels mapped to them
    (magnification of input pixel rectangle), some method of resampling
    is required.  Resampling methods are set using the functions
    PixelTransformParameteriEXT, PixelTransformParameterfEXT,
    PixelTransformParameterivEXT, or PixelTransformParameterfvEXT with
    <target> set to PIXEL_TRANSFORM_2D_EXT. 

    The resampling method to be used when the pixel rectangle is
    magnified is specified by calling one of these functions with
    <pname> set to PIXEL_MAG_FILTER_EXT and <params> set to NEAREST,
    LINEAR, or CUBIC_EXT.  The resampling method to be used when the
    pixel rectangle is minified is specified by calling one of these
    functions with <pname> set to PIXEL_MIN_FILTER_EXT and <params>
    set to NEAREST, LINEAR, CUBIC_EXT, or AVERAGE_EXT.
    PIXEL_CUBIC_WEIGHT_EXT defines the cubic weighting coefficient
    that is to be used whenever the resampling technique is set to CUBIC_EXT.
    
    If the resampling method is NEAREST, each output pixel will have the
    value of the input pixel whose transformed coordinate value is nearest
    (in Manhattan distance).  If the resampling method is LINEAR, each
    output pixel will have a value that is the weighted average of the 
    four input pixels whose transformed coordinate values are nearest.

    If the resampling method is CUBIC_EXT, each output pixel will have a value
    that is affected by the 16 input pixels whose transformed coordinate
    values are nearest.  The 16 input pixels will be used to perform a cubic
    spline interpolation to determine the value of the output pixel.  The
    cubic weight factor is a floating point value that is applied to the
    cubic interpolation in the manner described in "Digital Image Warping"
    by George Wolberg (IEEE Computer Society Press, ISBN 0-8186-8944-7).
    Visually pleasing cubic weighting values are typically in the
    range [-1,0].  The values -1.0 and -0.5 are most commonly used.
    For the purpose of performing bicubic interpolation along the outer
    edge of the pixel rectangle, the outermost one pixel edge of the pixel
    rectangle is duplicated prior to performing the interpolation along the
    edges.

    If the resampling method is AVERAGE_EXT, the values of all of the input
    pixels that contribute to the final output pixel will be averaged to
    determine the final output pixel value.  That is to say, an output pixel
    is backward mapped into the input pixel rectangle, then the nearest 
    neighbor resampling method determines the address of the center input 
    pixel from which input pixels will be averaged.  All pixels in the input 
    that forward map into the same location in the output pixel rectangle will 
    be added together and divided by the total number of input pixels which
    contribute the same output pixel.  An example would be, if the output
    pixel rectangle is 1/3 the size of the input pixel rectangle, then a
    total of 9 pixels would be read from the input pixel rectangle, averaged,
    and then the new single value will be written into the output pixel
    rectangle.

    Pixel transformation is defined for pixel rectangles that contain INDEX, 
    LUMINANCE, LUMINANCE_ALPHA, RGB, RGBA, or ABGR_EXT components or depth 
    components in pixel rastorization.  Groups arising from DrawPixels with
    a format of STENCIL_INDEX are treated specially and are described in
    section 4.3.1.

    A fragment arising from a group consisting of color data takes on the
    color index or color components of the group; the depth and texture
    coordinates are taken from the current raster position's associated
    data.  A fragment arising from a depth component takes the component's
    depth value; the color and texture coordinates are given by those 
    associated with the current raster position.  In both cases texture
    coordinates s, t, and r are replaced with s/q, t/q, and r/q,
    respectively.


Additions to Chapter 4 of the 1.1 Specification (Per-Fragment Operations
and the Frame Buffer)

    The pixel transformation operation occurs in pixel rasterization 
    immediately after the operations in the pixel transfer pipeline.
    The operation of pixel transformation during pixel copy
    operations is identical to the operation during pixel drawing.
    The pixel transformation is not applied during pixel query
    operations.

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

    GetPixelTransformParameterivEXT, and GetPixelTransformParameterfvEXT
    are not included in display lists, but are instead executed immediately.

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

    Integer and floating point query functions GetPixelTransformParameterivEXT
    and GetPixelTransformParameterfvEXT are provided.  <target> must be
    PIXEL_TRANSFORM_2D_EXT.  <pname> is one of PIXEL_MAG_FILTER_EXT, 
    PIXEL_MIN_FILTER_EXT, or PIXEL_CUBIC_WEIGHT_EXT.  The value of the 
    specified parameter is returned in <params>.

Additions to the GLX Specification
    
    None

GLX Protocol

    Four new GL commands are added.

    The following two rendering commands are sent to the server as part of
    a glXRender request:

        PixelTransformParameterfEXT
            2       16              rendering command length
            2       16385           rendering command opcode
            4       ENUM            target
            4       ENUM            pname
            4       FLOAT32         param

        PixelTransformParameteriEXT
            2       16              rendering command length
            2       16386           rendering command opcode
            4       ENUM            target
            4       ENUM            pname
            4       INT32           param

    The remaining two commands are non-rendering commands. These commands
    are sent seperately (i.e., not as part of a glXRender or
    glXRenderLarge request), using the glXVendorPrivateWithReply
    request:

        GetPixelTransformParameterfvEXT
            1       CARD8           opcode (X assigned)
            1       17              GLX opcode (glXVendorPrivateWithReply)
            2       5               request length
            4       2051            vendor specific opcode
            4       GLX_CONTEXT_TAG context tabg
            4       ENUM            target
            4       ENUM            pname
         ==>
            1       1               reply
            1                       unused
            2       CARD16          sequence number
            4       m               reply length, m = (n==1 ? 0: n)
            4                       unused
            4       CARD16          n (0 or 1)

            if (n=1) this follows:

            4       FLOAT32         params
            12                      unused

    Note that n may be zero, indicating that a GL error occurred.


        GetPixelTransformParameterivEXT
            1       CARD8           opcode (X assigned)
            1       17              GLX opcode (glXVendorPrivateWithReply)
            2       5               request length
            4       2052            vendor specific opcode
            4       GLX_CONTEXT_TAG context tabg
            4       ENUM            target
            4       ENUM            pname
         ==>
            1       1               reply
            1                       unused
            2       CARD16          sequence number
            4       m               reply length, m = (n==1 ? 0: n)
            4                       unused
            4       CARD16          n (0 or 1)

            if (n=1) this follows:

            4       INT32           params
            12                      unused

    Note that n may be zero, indicating that a GL error occurred.



Errors

    INVALID_ENUM is generated if PixelTransformParameteriEXT,
    PixelTransformParameterfEXT, PixelTransformParameterivEXT,
    PixelTransformParameterfvEXT, GetPixelTransformParameterivEXT,
    or GetPixelTransformParameterfvEXT is called with <target> set to
    a value other than PIXEL_TRANSFORM_2D_EXT.

    INVALID_ENUM is generated if GetPixelTransformParameterivEXT or
    GetPixelTransformParameterfvEXT is called with <pname> set to
    PIXEL_MAG_FILTER_EXT and <params> is not one of NEAREST, LINEAR,
    or CUBIC_EXT.

    INVALID_ENUM is generated if GetPixelTransformParameterivEXT or
    GetPixelTransformParameterfvEXT is called with <pname> set to
    PIXEL_MIN_FILTER_EXT and <params> is not one of NEAREST, LINEAR,
    CUBIC_EXT, or AVERAGE_EXT.

    INVALID_VALUE is generated if PixelTransformParameteriEXT,
    PixelTransformParameterfEXT, PixelTransformParameterivEXT, or
    PixelTransformParameterfvEXT is called with <pname> set to
    PIXEL_CUBIC_WEIGHT_EXT and <params> is a value outside of
    the range [-1, 0].

    INVALID_OPERATION is generated if PixelTransformParameteriEXT,
    PixelTransformParameterfEXT, PixelTransformParameterivEXT,
    PixelTransformParameterfvEXT, GetPixelTransformParameterivEXT,
    or GetPixelTransformParameterfvEXT is called between execution of
    Begin and the corresponding execution of End.

New State
											Initial
    Get Value					Get Command			Type	Value 	  Attrib
    ---------					-----------			----	-------   ------
    PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT          GetIntegerv			 I          1       -
    PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT          GetFloatv			 R          1       -
    PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT          GetDoublev			 D          1       -
    MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT	GetIntegerv			 I	   32       -
    MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT	GetFloatv			 R	   32       -
    MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT	GetDoublev			 D	   32       -
    PIXEL_TRANSFORM_2D_MATRIX_EXT		GetFloatv		       16 x R   Identity    -
    PIXEL_TRANSFORM_2D_MATRIX_EXT		GetDoublev		       16 x D   Identity    -
    PIXEL_MAG_FILTER_EXT			GetPixelTransformParameteri	 Z3	NEAREST   pixel
    PIXEL_MIN_FILTER_EXT			GetPixelTransformParameteri	 Z4	NEAREST   pixel
    PIXEL_CUBIC_WEIGHT_EXT			GetPixelTransformParameterf	 R	   -1 	  pixel


New Implementation Dependent State

    None

