Name

    EXT_pixel_transform

Name Strings

    GL_EXT_pixel_transform

Version

    $Date: 1997/10/17 02:08:51 $ $Revision: 1.2 $

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

