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