| 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. |