blob: 9a7f1fc53babdaae20cebe3ed17a6299244615d9 [file] [log] [blame]
Name
HP_image_transform
Name Strings
GL_HP_image_transform
Version
$Date: 1996/04/22 23:23:13 $ $Revision: 1.1 $
Number
66
Dependencies
EXT_texture is required
EXT_convolution affects the definition of this extension
SGI_color_table is required
Overview
This extension provides support for scaling, rotation, and translation
of two-dimensional pixel rectangles at a fixed location in the pixel
transfer process. The 2D image transformation attributes are specified
as individual values so that that implementations may easily detect
scaling and rotation values that lend themselves to optimization. 2D
image transformation occurs immediately after the post-convolution color
table stage of the pixel pipeline. This extension also defines a color
table that is applied immediately after the image transformation operation.
New Procedures and Functions
void ImageTransformParameteriHP(enum target,
enum pname,
const int param)
void ImageTransformParameterfHP(enum target,
enum pname,
const float param)
void ImageTransformParameterivHP(enum target,
enum pname,
const int* params)
void ImageTransformParameterfvHP(enum target,
enum pname,
const float* params)
These routines are used to set image transformation attributes.
The only allowable value for <target> at this time is
IMAGE_TRANSFORM_2D_HP. Allowable values for <pname> include:
IMAGE_SCALE_X_HP, IMAGE_SCALE_Y_HP, IMAGE_ROTATE_ANGLE_HP,
IMAGE_ROTATE_ORIGIN_X_HP, IMAGE_ROTATE_ORIGIN_Y_HP,
IMAGE_TRANSLATE_X_HP, IMAGE_TRANSLATE_Y_HP, IMAGE_MAG_FILTER_HP,
IMAGE_MIN_FILTER_HP, and IMAGE_CUBIC_WEIGHT_HP.
void GetImageTransformParameterivHP(enum target,
enum pname,
const int* params)
void GetImageTransformParameterfvHP(enum target,
enum pname,
const float* params)
These routines are used to query image transformation attributes.
The only allowable value for <target> at this time is
IMAGE_TRANSFORM_2D_HP. Allowable values for <pname> include:
IMAGE_SCALE_X_HP, IMAGE_SCALE_Y_HP, IMAGE_ROTATE_ANGLE_HP,
IMAGE_ROTATE_ORIGIN_X_HP, IMAGE_ROTATE_ORIGIN_Y_HP,
IMAGE_TRANSLATE_X_HP, IMAGE_TRANSLATE_Y_HP, IMAGE_MAG_FILTER_HP,
IMAGE_MIN_FILTER_HP, and IMAGE_CUBIC_WEIGHT_HP.
New Tokens
Accepted by the <pname> parameter of ImageTransformParameteri,
ImageTransformParameterf, ImageTransformParameteriv,
ImageTransformParameterfv, GetImageTransformParameteriv and
GetImageTransformParameterfv:
IMAGE_SCALE_X_HP
IMAGE_SCALE_Y_HP
IMAGE_TRANSLATE_X_HP
IMAGE_TRANSLATE_Y_HP
IMAGE_ROTATE_ANGLE_HP
IMAGE_ROTATE_ORIGIN_X_HP
IMAGE_ROTATE_ORIGIN_Y_HP
IMAGE_MAG_FILTER_HP
IMAGE_MIN_FILTER_HP
IMAGE_CUBIC_WEIGHT_HP
Accepted by the <params> parameter of ImageTransformParameteriHP,
ImageTransformParameterfHP, ImageTransformParameterivHP, and
ImageTransformParameterfvHP when <pname> is IMAGE_MAG_FILTER_HP
or IMAGE_MIN_FILTER_HP:
CUBIC_HP
Accepted by the <params> parameter of ImageTransformParameteriHP,
ImageTransformParameterfHP, ImageTransformParameterivHP, and
ImageTransformParameterfvHP when <pname> is IMAGE_MIN_FILTER_HP:
AVERAGE_HP
Accepted by the <cap> parameter of Enable, Disable, and IsEnabled,
and by the <target> parameter of ImageTransformParameterivHP,
ImageTransformParameterfvHP, GetImageTransformParameterivHP,
and GetImageTransformParameterfvHP:
IMAGE_TRANSFORM_2D_HP
Accepted by the <cap> parameter of Enable, Disable, and IsEnabled, and
by the <target> parameter of ColorTableSGI, ColorTableParameterivSGI,
ColorTableParameterfvSGI, GetColorTableSGI, GetColorTableParameterivSGI,
and GetColorTableParameterfvSGI:
POST_IMAGE_TRANSFORM_COLOR_TABLE_HP
Accepted by the <target> parameter of ColorTableSGI,
GetColorTableParameterivSGI, and GetColorTableParameterfvSGI:
PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE_HP
Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation)
None
Additions to Chapter 3 of the 1.0 Specification (Rasterization)
The specification of two-dimensional image transformation operators
is added to the GL specification in Section 3.6.2, "Pixel Transfer
Modes." 2D image transformation operators are defined by calling
ImageTransformParameteriHP, ImageTransformParameterfHP,
ImageTransformParameterivHP, or ImageTransformParameterfvHP with
<target> set to IMAGE_TRANSFORM_2D_HP. Parameter values
IMAGE_SCALE_X_HP and IMAGE_SCALE_Y_HP establish the scaling factors.
IMAGE_TRANSLATE_X_HP and IMAGE_TRANSLATE_Y_HP set the translation
factors. IMAGE_ROTATE_ANGLE_HP sets the rotation angle to be
used, and IMAGE_ROTATE_ORIGIN_X_HP and IMAGE_ROTATE_ORIGIN_Y_HP specify
the point about which the image is to be scaled and rotated. If the
specified angle is positive, the rotation will be counterclockwise
about the specified rotation origin. If the specified angle is
negative, the rotation will be clockwise about the origin. All
of these parameters (scale, rotation, translation, rotation origin)
are specified in terms of the input image's coordinates.
IMAGE_MAG_FILTER_HP establishes the resampling technique that is to be
used after the other image transformation operators have been applied
if the image is deemed to have been magnified. IMAGE_MIN_FILTER_HP
defines the resampling technique that is to be applied if the image
is minified by the scaling factors. IMAGE_CUBIC_WEIGHT_HP defines
the cubic weighting coefficient that is to be used whenever the
resampling technique is set to CUBIC_HP.
The operations defined by the image transformation operation are
added to the GL specification in Section 3.6.3, "Rasterization of
Pixel Rectangles," immediately following the operations described in
the EXT_convolution extension and the post convolution color table
operation that is described in the SGI_color_table extension. Image
transformation is defined only for pixel rectangles that contain RGBA
components or depth components at this stage of the pixel processing
pipeline (color index values may have been converted to RGBA by a
previous stage). Image transformation is not applied to color index
or stencil index pixel data.
When enabled, the image transformation operation uses the current set
of image transformation parameters to compute a new window coordinate
for each incoming pixel. Although image transformation parameters
are specified separately, the scaling, rotation, and translation
operations are all applied simultaneously (as if the transformation
was encoded in a matrix and the resulting matrix was applied to each
incoming pixel coordinate). In the case of 2D image transformation,
if (Rx,Ry) specifies the rotation origin, the effect of applying the
2D image transformation operators can be defined as follows. First,
the image is translated by -Rx in the x direction and -Ry in the y
direction so that its rotation origin is at the origin of the 2D
coordinate system. Second, the x and y scaling factors are
applied, causing the image to be scaled as specified in x and y.
Third, the rotation angle is applied, causing the image to be rotated
about the origin by the specified angle. Next, the image is translated
by Rx in the x direction and Ry in the y direction. Finally, the
scaled and rotated image is translated by the specified translation
factors. Resampling occurs after the scaling/rotation/translation
operations have been applied.
The RGBA or depth value for each location is left unmodified by the image
transformation. Since multiple input pixels can be mapped into a single
output pixel (minification of input image), or since output pixels might
not have any input pixels mapped to them (magnification of input image),
some method of resampling is required. The resampling method to be
used when the image is magnified is specified by calling
ImageTransformParameteri, ImageTransformParameterf,
ImageTransformParameteriv, or ImageTransformParameterfv with <pname>
set to IMAGE_MAG_FILTER_HP and <params> set to NEAREST, LINEAR, or CUBIC_HP.
The resampling method to be used when the image is minified is specified
by calling ImageTransformParameteri, ImageTransformParameterf,
ImageTransformParameteriv, or ImageTransformParameterfv with <pname>
set to IMAGE_MIN_FILTER_HP and <params> set to NEAREST, LINEAR, CUBIC_HP,
or AVERAGE_HP. 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_HP, 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 image, the outermost one pixel edge of the image is
duplicated prior to performing the interpolation along the edges.
If the resampling method is AVERAGE_HP, 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.
The operation of the POST_IMAGE_TRANSFORM_COLOR_TABLE is added to the GL
Specification in section 3.6.3, "Rasterization of Pixel Rectangles".
This color table behaves in the manner described in the SGI_color_table
extension, and it is located immediately after the image transformation
operation. This color table can be enabled or disabled separately from
the image transformation operation by calling Enable or Disable with
POST_IMAGE_TRANSFORM_COLOR_TABLE. It can be modified using the procedures
defined in the SGI_color_table extension. The proxy version of this table
can be set or queried by using a target value of
PROXY_POST_IMAGE_TRANSFORM_COLOR_TABLE.
Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations
and the Frame Buffer)
The operation of image transformation during pixel copy and query
operations is identical to the operation during pixel drawing and
texture image definition. The image transformation operation occurs
immediately after the operations described by EXT_convolution and
the post-convolution color table described by SGI_color_table, which
follow section 4.3.2 (Reading Pixels) of the GL Specification.
Additions to Chapter 5 of the 1.0 Specification (Special Functions)
GetImageTransformParameterivHP, and GetImageTransformParameterfvHP
are not included in display lists, but are instead executed immediately.
Additions to Chapter 6 of the 1.0 Specification (State and State Requests)
Integer and floating point query functions GetImageTransformParameterivHP
and GetImageTransformParameterfvHP are provided. <target> must be
IMAGE_TRANSFORM_2D_HP. <pname> is one of IMAGE_SCALE_X_HP,
IMAGE_SCALE_Y_HP, IMAGE_TRANSLATE_X_HP, IMAGE_TRANSLATE_Y_HP,
IMAGE_ROTATE_ANGLE_HP, IMAGE_ROTATE_ORIGIN_X_HP,
IMAGE_ROTATE_ORIGIN_Y_HP, IMAGE_MAG_FILTER_HP, IMAGE_MIN_FILTER_HP,
or IMAGE_CUBIC_WEIGHT_HP. The value of the specified parameter is
returned in <params>.
Additions to the GLX Specification
None
Dependencies on EXT_texture
EXT_texture is required. This extension builds on the notion of
internal image format, which is defined by EXT_texture.
Dependencies on EXT_convolution
None, except that image transformation follows the convolution
operation (and its scale and bias). If the post-convolution color
table is supported, the image transformation operation will occur
immediately after the post-convolution color table operation. If
convolution is not supported, the location with respect to all other
pixel operations remains the same.
Dependencies on SGI_color_table
SGI_color_table is required. This extension builds on the notion of
color lookup tables at various locations in the pixel processing pipeline.
This extension adds another table to the list specified by SGI_color_table.
This new table can be manipulated using the procedures defined by
SGI_color_table.
Errors
INVALID_ENUM is generated if ImageTransformParameteriHP,
ImageTransformParameterfHP, ImageTransformParameterivHP,
ImageTransformParameterfvHP, GetImageTransformParameterivHP,
or GetImageTransformParameterfvHP is called with <target> set to
a value other than IMAGE_TRANSFORM_2D_HP.
INVALID_ENUM is generated if GetImageTransformParameterivHP or
GetImageTransformParameterfvHP is called with <pname> set to
IMAGE_MAG_FILTER_HP and <params> is not one of NEAREST, LINEAR,
or CUBIC_HP.
INVALID_ENUM is generated if GetImageTransformParameterivHP or
GetImageTransformParameterfvHP is called with <pname> set to
IMAGE_MIN_FILTER_HP and <params> is not one of NEAREST, LINEAR,
CUBIC_HP, or AVERAGE_HP.
INVALID_VALUE is generated if ImageTransformParameteriHP,
ImageTransformParameterfHP, ImageTransformParameterivHP, or
ImageTransformParameterfvHP is called with <pname> set to
IMAGE_CUBIC_WEIGHT_HP and <params> is a value outside of
the range [0,1].
INVALID_OPERATION is generated if ImageTransformParameteriHP,
ImageTransformParameterfHP, ImageTransformParameterivHP,
ImageTransformParameterfvHP, GetImageTransformParameterivHP,
or GetImageTransformParameterfvHP is called between execution of
Begin and the corresponding execution of End.
New State
Initial
Get Value Get Command Type Value Attrib
--------- ----------- ---- ------- ------
IMAGE_TRANSFORM_2D_HP IsEnabled B False pixel/enable
IMAGE_SCALE_X_HP GetImageTransformParameterf R 1 pixel
IMAGE_SCALE_Y_HP GetImageTransformParameterf R 1 pixel
IMAGE_TRANSLATE_X_HP GetImageTransformParameterf R 0 pixel
IMAGE_TRANSLATE_Y_HP GetImageTransformParameterf R 0 pixel
IMAGE_ROTATE_ANGLE_HP GetImageTransformParameterf R 0 pixel
IMAGE_ROTATE_ORIGIN_X_HP GetImageTransformParameterf R 0 pixel
IMAGE_ROTATE_ORIGIN_Y_HP GetImageTransformParameterf R 0 pixel
IMAGE_MAG_FILTER_HP GetImageTransformParameteri Z3 NEAREST pixel
IMAGE_MIN_FILTER_HP GetImageTransformParameteri Z4 NEAREST pixel
IMAGE_CUBIC_WEIGHT_HP GetImageTransformParameterf R -1 pixel
POST_IMAGE_TRANSFORM_COLOR_TABLE_HP IsEnabled B False pixel/enable
POST_IMAGE_TRANSFORM_COLOR_TABLE_HP GetColorTableHP 3 x I empty -
New Implementation Dependent State
None
Issues
What is the behavior of ReadPixels when the image transformation
is enabled? One suggestion is to assume that the specified width
and height of the region being read are used to define the size
of the 2D array in host memory in which the pixel values are to
be written. Any pixels that would be written outside of this region
would be clipped. Why would anyone want to rotate/scale during
a readback operation anyway? Another suggestion is that image
transformation is ignored during readback, but this makes it
different than the other pixel transfer operations.
Notes
I originally wrote this extension to utilize an image transformation
matrix that worked the same way the other OpenGL matrices worked.
However, we found that we could not easily extract the rotation and
scaling information and use it to select optimized software routines
for special cases like integer zoom and 90 degree rotations.
Consequently, I've reverted back to specifying the image transformation
parameters individually and the image transformation operation
in a more rigid way.
I would rather have separate state setting calls for each of the
2D image transformation parameters. However, SGI's convolution,
color table, and histogram extension all use FooParameter{i,f}v calls
to set the state. I've mimicked their API for three reasons:
1. For consistency with those extensions
2. To maximize the likelihood of industry acceptance
of this extension
3. To allow for the possibility of 1D and 3D image
transforms at a future time.
I have not excluded the ability to scale, rotate, and translate
depth component values. I thought that image transformation might
be useful when the <format> was DEPTH_COMPONENT (i.e., reading or writing
depth buffer values). In this case, the "image" will have x and y values
that define the pixel locations, and depth (z) values instead of color
values. The depth values will end up being treated as a single channel
image. This capability might be necessary if you have a depth buffer
associated with an image that you want to remain registered as it is
stored in the frame buffer.