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: /cvsroot/nsn/gltut/ext/glew/auto/registry/OML/resample.txt,v 1.1 2005/06/02 18:12:31 nightspawn Exp $

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 <pname> parameter of PixelStoref, PixelStorei,
    GetBooleanv, GetIntegerv, GetFloatv and GetDoublev:

	PACK_RESAMPLE_OML		    0x8984
	UNPACK_RESAMPLE_OML		    0x8985

    Accepted by the <param> parameter of PixelStoref and PixelStorei
    when the <pname> parameter is UNPACK_RESAMPLE_OML:

	RESAMPLE_REPLICATE_OML		    0x8986
	RESAMPLE_ZERO_FILL_OML		    0x8987
	RESAMPLE_AVERAGE_OML		    0x8988

    Accepted by the <param> parameter of PixelStoref and PixelStorei
    when the <pname> 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 <format> is
    FORMAT_SUBSAMPLE_24_24_OML, then the number of components per pixel
    is increased from two to three. If <format> 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:
    <Cb0,Y0>	 <Cr0,Y1>     <Cb2,Y2>	  <Cr2, Y3>
      |  |	  |   |        |   |	    |	|
      |  |   ____/    |        |   |   ____/	|
      |  |  /	      |        |   |  /		|
      |  |  |	 0.0  | 0.0    |   |  |    0.0	| 0.0
      |  |  |	  |   |  |     |   |  |     |	|  |
      V  V  V	  V   V  V     V   V  V     V	V  V
    <Cb0,Y0,Cr0> <Cb0,Y1,Cr0> <Cb2,Y2,Cr2> <Cb2,Y3,Cr2>
    < R0,G0,B1 > < R0,G1,B1 > < R2,G2,B3 > < R2,G3,B3 >

    FORMAT_SUBSAMPLE_244_244_OML:
    <Cb0,Y0,A0>     <Cr0,Y1,A1>     <Cb2,Y2,A2>     <Cr2,Y3,A3>
      |  |   \	     |	 |   \	     |	 |   \	     |	 |   \
      |  |   _\_____/	 |    \      |	 |   _\_____/	 |    \
      |  |  /  \	 |     \     |	 |  /  \	 |     \
      |  |  |	\   0.0  | 0.0	\    |	 |  |	\   0.0  | 0.0	\
      |  |  |	|    |	 |  |	|    |	 |  |	|    |	 |  |	|
      V  V  V	V    V	 V  V	V    V	 V  V	V    V	 V  V	V
    <Cb0,Y0,Cr0,A0> <Cb0,Y1,Cr0,A1> <Cb2,Y2,Cr2,A2> <Cb2,Y3,Cr2,A3>
    < 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 == <width>-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 == <width>-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:
    <Cb0,Y0>	 <Cr0,Y1>     <Cb2,Y2>	  <Cr2, Y3>
      |  |	  |   |        |   |	    |	|
      |  |   ____/ \__|__  ____|___|_______/ \__|__  _
      |  |  /	      |  \/    |   |  /		|  \/
      |\_|__|_____  __|__|___ /|\__|__|_____  __|__|__
      |  |  |	  \/  |  |     |   |  |     \/	|  |
      V  V  V	  V   V  V     V   V  V     V	V  V
    <Cb0,Y0,Cr0> <Cb0,Y1,Cr0> <Cb2,Y2,Cr2> <Cb2,Y3,Cr2>
    < R0,G0,B1 > < R0,G1,B1 > < R2,G2,B3 > < R2,G3,B3 >


    FORMAT_SUBSAMPLE_244_244_OML:
    <Cb0,Y0,A0>     <Cr0,Y1,A1>     <Cb2,Y2,A2>     <Cr2,Y3,A3>
      |  |   \	     |	 |   \	     |	 |   \	      |   |   \
      |  |   _\_____/ \__|__  \______|___|____\______/ \__|__  \___
      |  |  /  \	 |  \/ \     |	 |  /  \	  |  \/ \
      |\_|__|___\____  __|__|___\___/|\__|__|___\_____	__|__|___\_
      |  |  |	|    \/  |  |	|    |	 |  |	|     \/  |  |	 |
      V  V  V	V    V	 V  V	V    V	 V  V	V     V   V  V	 V
    <Cb0,Y0,Cr0,A0> <Cb0,Y1,Cr0,A1> <Cb2,Y2,Cr2,A2> <Cb2,Y3,Cr2,A3>
    < 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 <format> 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 <format> is FORMAT_SUBSAMPLE_24_24_OML, then the resulting pixels
    have 2 components (see figure 4.3); if <format> 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:
    <R0,G0,B0,A0> <R1,G1,B1,A1> <R2,G2,B2,A2> <R3,G3,B3,A3>
      |  | |   |   |  |  |  |	 |  |  |  |    |  |  |	|
      |  |  \  *   *  |  *  *	 |  |	\ *    *  |  *	*
      |  |   |	      |		 |  |	 |	  |
      V  V   V	      V		 V  V	 V	  V
    <Cb0,Y0><Cr0,     Y1>	<Cb2,Y2><Cr2,	  Y3>
    <--- pixel pair ---->	<--- pixel pair ---->

    FORMAT_SUBSAMPLE_244_244_OML:
    <R0,G0,B0,A0> <R1,G1,B1,A1> <R2,G2,B2,A2> <R3,G3,B3,A3>
      |  |  |  |   |   |  |  |	  |  |	|  |   |   |  |  |
      |  |  \__|__ *   |  *  |	  |  |	\__|__ *   |  *  |
      |  |     |  \    |     |	  |  |	   |  \    |	 |
      |  |    /    |   |    /	  |  |	  /    |   |	/
      V  V   V	   V   V   V	  V  V	 V     V   V   V
    <Cb0,Y0,A0>   <Cr0,Y1,A1>	<Cb2,Y2,A2>   <Cr2,Y3,A3>
    <--- 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 == <width>-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 == <width>-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 <width> is not even, so may be removable.

  - Add new figure 4.4 (renumber following figures):

    FORMAT_SUBSAMPLE_24_24_OML:
    <R0,G0,B0,A0> <R1,G1,B1,A1> <R2,G2,B2,A2> <R3,G3,B3,A3>
      | _|_|_______/\_|__|______ | _|__|_______/\_|__|_______
      |/ | |	      |  |	\|/ |  \_______   |  |
      |  |  \______  _|_/ \______|__|_________ \ _|_/ \______
      |  |	   \/ |		 |  |	      \|/ |
      V  V	   V  V		 V  V	       V  V
    <Cb0,Y0>	 <Cr0,Y1>      <Cb2,Y2>      <Cr2,Y3>

    FORMAT_SUBSAMPLE_244_244_OML:
    <R0,G0,B0,A0> <R1,G1,B1,A1> <R2,G2,B2,A2> <R3,G3,B3,A3>
      | _|_|___|___/\_|__|___|__ | _|__|___|___/\_|__|___|___
      |/ | |   |      |  |   |	\|/ |  \___|___   |  |	 |
      |  |  \__|___  _|_/ \__|___|__|______|__ \ _|_/ \__|___
      |  |     |   \/ |      |	 |  |	   |  \|/ |	 |
      V  V     V   V  V      V	 V  V	   V   V  V	 V
    <Cb0,Y0,  A0><Cr0,Y1,   A1><Cb2,Y2,   A2><Cr2,Y3,	A3>

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