Name HP_image_transform Name Strings GL_HP_image_transform Version $Date: 1995/09/09 21:55:00 $ $Revision: 1.11 $ 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 at this time is IMAGE_TRANSFORM_2D_HP. Allowable values for 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 at this time is IMAGE_TRANSFORM_2D_HP. Allowable values for 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 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 parameter of ImageTransformParameteriHP, ImageTransformParameterfHP, ImageTransformParameterivHP, and ImageTransformParameterfvHP when is IMAGE_MAG_FILTER_HP or IMAGE_MIN_FILTER_HP: CUBIC_HP Accepted by the parameter of ImageTransformParameteriHP, ImageTransformParameterfHP, ImageTransformParameterivHP, and ImageTransformParameterfvHP when is IMAGE_MIN_FILTER_HP: AVERAGE_HP Accepted by the parameter of Enable, Disable, and IsEnabled, and by the parameter of ImageTransformParameterivHP, ImageTransformParameterfvHP, GetImageTransformParameterivHP, and GetImageTransformParameterfvHP: IMAGE_TRANSFORM_2D_HP Accepted by the parameter of Enable, Disable, and IsEnabled, and by the parameter of ColorTableSGI, ColorTableParameterivSGI, ColorTableParameterfvSGI, GetColorTableSGI, GetColorTableParameterivSGI, and GetColorTableParameterfvSGI: POST_IMAGE_TRANSFORM_COLOR_TABLE_HP Accepted by the 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 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 set to IMAGE_MAG_FILTER_HP and 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 set to IMAGE_MIN_FILTER_HP and 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. must be IMAGE_TRANSFORM_2D_HP. 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 . 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 set to a value other than IMAGE_TRANSFORM_2D_HP. INVALID_ENUM is generated if GetImageTransformParameterivHP or GetImageTransformParameterfvHP is called with set to IMAGE_MAG_FILTER_HP and is not one of NEAREST, LINEAR, or CUBIC_HP. INVALID_ENUM is generated if GetImageTransformParameterivHP or GetImageTransformParameterfvHP is called with set to IMAGE_MIN_FILTER_HP and is not one of NEAREST, LINEAR, CUBIC_HP, or AVERAGE_HP. INVALID_VALUE is generated if ImageTransformParameteriHP, ImageTransformParameterfHP, ImageTransformParameterivHP, or ImageTransformParameterfvHP is called with set to IMAGE_CUBIC_WEIGHT_HP and 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 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.