Name OML_resample Name Strings GL_OML_resample Contact Jon Leech, Silicon Graphics (ljp 'at' sgi.com) Status Complete. Approved by the Khronos SIG on July 19, 2001. Version Last Modified Date: 07/23/2001 Author Revision: $Header: //depot/main/doc/registry/extensions/OML/resample.spec#10 $ Number 241 Dependencies OML_subsample is required. This extension is written against the OpenGL 1.2.1 Specification, Overview This extension enhances the resampling capabilities of the OML_subsample extension. It is loosely based on the SGIX_resample extension. When converting data from subsampled to uniform sampling, upsampling may be performed by one of three methods: component replication, zero fill, or adjacent neighbor averaging. When converting data from uniform sampling to subsampled form, downsampling may be performed only by component decimation (point sampling) or averaging. Upsampling and downsampling filters other than those defined by this extension may be performed by appropriate use of convolution and other pixel transfer operations. The zero fill unpacking mode is included to assist applications wanting to define their own filters. Issues * Should RESAMPLE_xxx enums be renamed to PIXEL_RESAMPLE_xxx? IP Status No known issues. New Procedures and Functions None. New Tokens Accepted by the parameter of PixelStoref, PixelStorei, GetBooleanv, GetIntegerv, GetFloatv and GetDoublev: PACK_RESAMPLE_OML 0x8984 UNPACK_RESAMPLE_OML 0x8985 Accepted by the parameter of PixelStoref and PixelStorei when the parameter is UNPACK_RESAMPLE_OML: RESAMPLE_REPLICATE_OML 0x8986 RESAMPLE_ZERO_FILL_OML 0x8987 RESAMPLE_AVERAGE_OML 0x8988 Accepted by the parameter of PixelStoref and PixelStorei when the parameter is PACK_RESAMPLE_OML: RESAMPLE_DECIMATE_OML 0x8989 RESAMPLE_AVERAGE_OML 0x8988 Additions to Chapter 2 of the OpenGL 1.2.1 Specification (OpenGL Operation) None. Additions to Chapter 3 of the OpenGL 1.2.1 Specification (Rasterization) - (3.6.1, p. 75 "Pixel Storage Modes") Add to table 3.1 (p. 76): Parameter Name Type Initial Value Valid Range -------------- ---- ------------- ----------- UNPACK_RESAMPLE_OML integer RESAMPLE_REPLICATE_OML RESAMPLE_REPLICATE_OML RESAMPLE_ZERO_FILL_OML RESAMPLE_AVERAGE_OML PACK_RESAMPLE_OML integer RESAMPLE_DECIMATE_OML RESAMPLE_DECIMATE_OML RESAMPLE_AVERAGE_OML - (3.6.4, p. 88 "Rasterization of Pixel Rectangles") - Modify the new subsection "Conversion to Uniform Sampling" (introduced by OML_subsample) to read: Conversion to Uniform Sampling This step is applied only to subsampled data. If is FORMAT_SUBSAMPLE_24_24_OML, then the number of components per pixel is increased from two to three. If is FORMAT_SUBSAMPLE_244_244_OML. then the number of components per pixel is increased from three to four. The upsampling method used is determined by the value of the PixelStore parameter UNPACK_RESAMPLE_OML. After conversion to uniform sampling (see figure 3.9). pixels are thereafter treated as though they were RGB (three component) or RGBA (four component) format. In the remainder of this section, the j'th component of the i'th pixel in a row is denoted by S_i,j (for source pixels in client memory) and D_i,j (for destination pixels in the color buffer). Replication If the value of UNPACK_RESAMPLE_OML is RESAMPLE_REPLICATE_OML (see figure 3.9), destination component values are defined as: For even pixels ((i mod 2) == 0): D_i,0 = S_i,0 D_i,1 = S_i,1 D_i,2 = S_i+1,0 D_i,3 = S_i,2 For odd pixels ((i mod 2) == 1): D_i,0 = S_i-1,0 D_i,1 = S_i,1 D_i,2 = S_i,0 D_i,3 = S_i,2 - (figure 3.9, introduced by OML_subsample, is unchanged) Zero Fill If the value of UNPACK_RESAMPLE_OML is RESAMPLE_ZERO_FILL_OML (see figure 3.10), destination component values are defined as: For even pixels ((i mod 2) == 0): D_i,0 = S_i,0 D_i,1 = S_i,1 D_i,2 = S_i+1,0 D_i,3 = S_i,2 For odd pixels ((i mod 2) == 1): D_i,0 = 0 D_i,1 = S_i,1 D_i,2 = 0 D_i,3 = S_i,2 - Add new figure 3.10, following the new figure 3.9 defined in the OML_subsample extension: FORMAT_SUBSAMPLE_24_24_OML: | | | | | | | | | | ____/ | | | ____/ | | | / | | | / | | | | 0.0 | 0.0 | | | 0.0 | 0.0 | | | | | | | | | | | | V V V V V V V V V V V V < R0,G0,B1 > < R0,G1,B1 > < R2,G2,B3 > < R2,G3,B3 > FORMAT_SUBSAMPLE_244_244_OML: | | \ | | \ | | \ | | \ | | _\_____/ | \ | | _\_____/ | \ | | / \ | \ | | / \ | \ | | | \ 0.0 | 0.0 \ | | | \ 0.0 | 0.0 \ | | | | | | | | | | | | | | | | V V V V V V V V V V V V V V V V < R0,G0,B1,A0 > < R0,G1,B1,A1 > < R2,G2,B3,A2 > < R2,G3,B3,A3 > Figure 3.10: Upsampling with zero fill of subsampled data from host memory to form RGB or RGBA pixels. Averaging If the value of UNPACK_RESAMPLE_OML is RESAMPLE_AVERAGE_OML (see figure 3.11), destination component values are defined as: For even pixels: D_i,0 = S_i,0 D_i,1 = S_i,1 D_i,2 = S_i+1,0 D_i,3 = S_i,2 (No special case for D_i,2 can arise when i is the last pixel, because of the restriction to even image widths). For odd pixels: D_i,0 = S_i,0 i == -1 (last pixel) = 1/2 S_i-1,0 + 1/2 S_i+1,0 otherwise D_i,1 = S_i,1 D_i,2 = S_i,0 i == -1 (last pixel) = 1/2 S_i,0 + 1/2 S_i+2,0 otherwise D_i,3 = S_i,2 - Add new figure 3.11, following the new figure 3.10: FORMAT_SUBSAMPLE_24_24_OML: | | | | | | | | | | ____/ \__|__ ____|___|_______/ \__|__ _ | | / | \/ | | / | \/ |\_|__|_____ __|__|___ /|\__|__|_____ __|__|__ | | | \/ | | | | | \/ | | V V V V V V V V V V V V < R0,G0,B1 > < R0,G1,B1 > < R2,G2,B3 > < R2,G3,B3 > FORMAT_SUBSAMPLE_244_244_OML: | | \ | | \ | | \ | | \ | | _\_____/ \__|__ \______|___|____\______/ \__|__ \___ | | / \ | \/ \ | | / \ | \/ \ |\_|__|___\____ __|__|___\___/|\__|__|___\_____ __|__|___\_ | | | | \/ | | | | | | | \/ | | | V V V V V V V V V V V V V V V V < R0,G0,B1,A0 > < R0,G1,B1,A1 > < R2,G2,B3,A2 > < R2,G3,B3,A3 > Figure 3.11: Upsampling with averaging of subsampled data from host memory to form RGB or RGBA pixels. Additions to Chapter 4 of the OpenGL 1.2.1 Specification (Per-Fragment Operations and the Frame Buffer) - Modify the new section "Conversion to Subsampled Form" (introduced by OML_subsample) to read: Conversion to Subsampled Form This step is applied only if is FORMAT_SUBSAMPLE_24_24_OML or FORMAT_SUBSAMPLE_244_244_OML. A filter operation specified by the value of PACK_RESAMPLE_OML is applied prior to the subsampling step. In the remainder of this section, the j'th component of the i'th pixel in a row is denoted by S_i,j (for source pixels in the color buffer) and D_i,j (for destination pixels in client memory). If is FORMAT_SUBSAMPLE_24_24_OML, then the resulting pixels have 2 components (see figure 4.3); if is FORMAT_SUBSAMPLE_244_244_OML, then the resulting pixels have 3 components (see figure 4.4). Decimation If the value of PACK_RESAMPLE_OML is RESAMPLE_DECIMATE_OML, then destination component values are defined as: For even pixels ((i mod 2) == 0): D_i,0 = S_i,0 D_i,1 = S_i,1 D_i,2 = S_i,3 (only for FORMAT_SUBSAMPLE_244_244_OML) For odd pixels ((i mod 2) == 1): D_i,0 = S_i-1,2 D_i,1 = S_i,1 D_i,2 = S_i,3 (only for FORMAT_SUBSAMPLE_244_244_OML) - Add new figure 4.3 (renumber following figures): FORMAT_SUBSAMPLE_24_24_OML: | | | | | | | | | | | | | | | | | | \ * * | * * | | \ * * | * * | | | | | | | | V V V V V V V V <--- pixel pair ----> <--- pixel pair ----> FORMAT_SUBSAMPLE_244_244_OML: | | | | | | | | | | | | | | | | | | \__|__ * | * | | | \__|__ * | * | | | | \ | | | | | \ | | | | / | | / | | / | | / V V V V V V V V V V V V <--- pixel pair ----> <--- pixel pair ----> Figure 4.3: Downsampling with decimation of RGB or RGBA pixels to form subsampled data in host memory. Averaging If the value of PACK_RESAMPLE_OML is RESAMPLE_AVERAGE_OML, then destination component values are defined as: For even pixels: D_i,0 = 3/4 S_i,0 + 1/4 S_i+1,0 i == 0 (first pixel) = 1/4 S_i-1,0 + 3/4 S_i,0 i == -1 (last pixel) = 1/4 S_i-1,0 + otherwise 1/2 S_i,0 + 1/4 S_i+1,0 D_i,1 = S_i,1 D_i,2 = S_i,3 For odd pixels: D_i,0 = 3/4 S_i-1,2 + 1/4 S_i,2 i == -1 (last pixel) = 1/4 S_i-1,2 + otherwise 1/2 S_i,2 + 1/4 S_i+1,2 D_i,1 = S_i,1 D_i,2 = S_i,3 XXX Note that the "last pixel" case is only needed for readbacks where XXX is not even, so may be removable. - Add new figure 4.4 (renumber following figures): FORMAT_SUBSAMPLE_24_24_OML: | _|_|_______/\_|__|______ | _|__|_______/\_|__|_______ |/ | | | | \|/ | \_______ | | | | \______ _|_/ \______|__|_________ \ _|_/ \______ | | \/ | | | \|/ | V V V V V V V V FORMAT_SUBSAMPLE_244_244_OML: | _|_|___|___/\_|__|___|__ | _|__|___|___/\_|__|___|___ |/ | | | | | | \|/ | \___|___ | | | | | \__|___ _|_/ \__|___|__|______|__ \ _|_/ \__|___ | | | \/ | | | | | \|/ | | V V V V V V V V V V V V Figure 4.4: Downsampling with averaging of RGB or RGBA pixels to form subsampled data in host memory. Additions to Chapter 5 of the OpenGL 1.2.1 Specification (Special Functions) None. Additions to Chapter 6 of the OpenGL 1.2.1 Specification (State and State Requests) None. Additions to the GLX 1.3 Specification None. Errors See above. New State (table 6.17, p. 207) Get Value Type Get Command Initial Value --------- ---- ----------- ------------- UNPACK_RESAMPLE_OML Z3 GetIntegerv RESAMPLE_REPLICATE_OML PACK_RESAMPLE_OML Z2 GetIntegerv RESAMPLE_DECIMATE_OML (continued columns) Get Value Description Sec Attribute --------- ----------- --- --------- UNPACK_RESAMPLE_OML Pixel upsampling mode 3.6 pixel-store PACK_RESAMPLE_OML Pixel downsampling mode 4.3 pixel-store New Implementation Dependent State None. Revision History * Revision 10, 07/24/2001 - Finalized Status for OpenML 1.0. * Revision 9, 07/16/2001 - Remove erroneous redefinition of RESAMPLE_AVERAGE enumerant value. * Revisions 7-8, 07/11/2001 - Assign enum values and extension number for the registry. * Revision 6 - Correct errors in the equations describing subsampling. * Revision 5 - formatting changes for OpenML Specification * Revision 4, 03/27/2001 - Rewrite to use the parameter, rather than a pixel storage mode, to specify subsampled data. * Revision 3 - Removed support for YC component orders. Renamed CY and CYA enumerants more sensibly. Added Discreet's RESAMPLE_AVERAGE resampling mode. Changed text descriptions of sampling to equations. Made enum values undefined until we've determined if this extension is backwards compatible with SGIX_resample. * Revision 2 - corrected 4224 upsampling and downsampling figures. Moved discussion of errors for non-even image widths to the OML_subsample specification. * Revision 1 - derived from SGIX_resample.