XXX - Not complete.

Name

    SGIX_image_compression

Name Strings

    GL_SGIX_image_compression

Version

    $Date: 1997/06/05 16:11:49 $ $Revision: 1.5 $

Number

    ???

Dependencies

	None.

Overview

	This extension defines new pixel storage modes which are used in the
	conversion of image data to and from compressed formats on the client
	side.  These new compression and decompression operations take place
	during the pixel packing and unpacking stages of the OpenGL pipeline,
	respectively, and obey the same semantics as other packing and
	unpacking modes.  This extension defines a framework in which further
	extensions can provide support for specific compressed formats, and
	also provides additional infrastructure which is common to various
	compression techniques, without defining any specific compression
	formats.  Other extensions will define compression formats which make
	use of this framework.  A new pixel unpacking mode and a new pixel
	packing mode are defined which specify the compressed format of pixel
	data on the client side.  The only legal value this extension defines
	for these storage modes is NONE; further compression extensions will
	define additional legal values.

	Many compression techniques utilize various component subsamplings, so
	it is necessary to provide a mechanism to specify the up- and
	down-sampling of components as pixel data is decompressed from- and
	compressed to the client.  This extension defines a new pixel storage
	mode to specify these sampling patterns, and four legal values.  When
	pixel data is decompressed from the client and an unpacking upsampling
	mode other than SAMPLE_444_SGIX is specified, the upsampling is
	performed via simple component replication.  This preserves all
	information in the incoming image data, so that if an application
	requires other types of filtering, they may be performed after
	decompression.  Similarly, when pixel data is compressed to the client
	and a packing downsampling mode other than SAMPLE_444_SGIX is
	specified, the downsampling is performed via simple component
	decimation.  If an application requires other types of filtering, they
	must be performed before compression.

	Some compression formats specify a color space in which the pixels are
	expressed before compression and after decompression.  To make support
	of these formats more transparent, this extension adds a conversion
	between the natural color space of the compression format and RGB.
	This conversion can be enabled separately for packing and for unpacking
	of pixel data.  When it is enabled for unpacking, the pixel data will
	be converted to RGB after decompression.  When it is enabled for
	packing, the pixel data will be assumed to be represented as RGB, and
	converted as necessary before compression.  The client may wish to
	disable these automatic conversion in order to apply filtering before
	the color space conversion in the case of decompression, or after the
	color space conversion in the case of compression.  When the
	conversions are disabled, the client is responsible for performing the
	appropriate color space conversions.  The alternate color spaces must
	be defined by the additional compression format extensions.  If a new
	format extension does not specify a preferred color space, this color
	space conversion has no effect.

Issues

	- Should this be split into multiple extensions?

	- How should bitrate/quality be controlled for vbr techniques?

	- Instead of requiring each compression format extension to specify
	  its own color space, this could be specified by the client using the
	  <format> parameter.  This would require the creation of additional
	  formats, but would also have the advantage of more accurately
	  reflecting the format of pixel data, i.e., calling the format of DVC
	  compressed data YCrCb rather than RGB.

	- Should some additional support for up- and down-sampling methods
	  other than replication and decimation be provided?

	- Should we define an error for a bogus compressed frame?
          Something like COMPRESSION_DATA_ERROR?

	- We define all compression standards as operating on RGBA
	  floating-point images.  Is this the correct decision?

	- We ignore color-index images.  Is this the correct decision?

	- The current scheme for subrectangle modes doesn't permit the
	  old trick of drawing fields by setting ROW_LENGTH to twice
	  the actual width of the image.  Probably the easiest way to
	  fix this would be to add some new pixel storage parameter
	  (FIELD_EXTRACT or something) which would be treated as
	  though it were part of ROW_LENGTH in the non-compressed
	  unpack case.  The non-compressed unpack case is a little
	  harder -- it can be done by setting ROW_LEGNTH to one half
	  the width, but bytes past the end of the last scan line are
	  written. 

	- What about three- and four-dimensional images?

	- What about three- and four-dimensional subrectangle modes?

New Procedures and Functions

	None.

New Tokens

	Accepted by the <pname> parameter of PixelStoref, PixelStorei,
	GetBooleanv, GetIntegerv, GetFloatv and GetDoublev:
	
		PACK_COMPRESSION_TYPE_SGIX
		UNPACK_COMPRESSION_TYPE_SGIX
		UNPACK_COMPRESSED_SIZE_SGIX
		PACK_MAX_COMPRESSED_SIZE_SGIX
		PACK_SAMPLE_SGIX
		UNPACK_SAMPLE_SGIX
	
	Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
	GetFloatv and GetDoublev:

		PACK_COMPRESSED_SIZE_SGIX

	Accepted by the <param> parameter of PixelStoref and PixelStorei
	when the <pname> parameter is PACK_SAMPLE_SGIX or
	UNPACK_SAMPLE_SGIX:
	
		SAMPLE_444_SGIX
		SAMPLE_422_SGIX
		SAMPLE_411_SGIX
		SAMPLE_420_SGIX

	Accepted by the <pname> parameter of PixelStoref and
	PixelStorei with a <param> parameter of TRUE or FALSE and by
	the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv
	and GetDoublev:
	
		PACK_FROM_RGB_SGIX
		UNPACK_TO_RGB_SGIX

Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation)

	None.

Additions to Chapter 3 of the 1.0 Specification (Rasterization)

	3.6.1 Pixel Storage Modes
	
	The following is added to Table 3.1:
	
	Parameter Name			Type		Initial Value		Valid Range
	--------------			----		-------------		-----------
	UNPACK_COMPRESSION_TYPE_SGIX	integer		NONE			NONE
	UNPACK_COMPRESSED_SIZE_SGIX	integer		0			[0,inf)
	UNPACK_SAMPLE_SGIX		integer		SAMPLE_444_SGIX		SAMPLE_444_SGIX, SAMPLE_422_SGIX, SAMPLE_411_SGIX, SAMPLE_420_SGIX
	UNPACK_TO_RGB_SGIX		boolean		TRUE			TRUE/FALSE
		
	3.6.3 Rasterization of Pixel Rectangles

	The following is added to the introduction to section 3.6.3:
	"Unpacking" refers to the reading of pixels from host memory.
	Pixels are unpacked from host memory as either compressed or
	uncompressed images.  If PACK_COMPRESSION_TYPE_SGIX is set to
	NONE, the images are stored as uncompressed data and are
	unpacked from host memory as described below.  If
	PACK_COMPRESSION_TYPE_SGIX is set to a value other than NONE,
	the images are compressed and are unpacked from host memory as
	described in "Unpacking of Compressed Images".

	The title of the "Unpacking" subsection is changed to
	"Unpacking of Uncompressed Images."  All references to this
	subsection are changed as well.

	A new subsection, "Unpacking of Compressed Images," is added
	between "Unpacking of Uncompressed Images" and the "Conversion
	to Floating-Point."  The contents of the section are as
	follows:

	In this section, we describe the unpacking of compressed
	images.  The first part describes how images are taken from
	host memory as a byte stream.  Next, a description GL's
	upsampling algorithms is provided since they are used by
	several compressed formats.  After the upsampling description,
	paragraphs added by other extensions describe the conversion
	applied to the byte stream for a given
	UNPACK_COMPRESSION_TYPE_SGIX.  After these descriptions, we
	describe the application of subrectangle pixel storage modes.

	GL supports four types of upsampling:  SAMPLE_444_SGIX,
	SAMPLE_422_SGIX, SAMPLE_411_SGIX, and SAMPLE_420_SGIX.  The
	type of upsampling performed is determined by the setting of
	the UNPACK_SAMPLE_SGIX pixel storage parameter.
	XXX say how the upsampling is performed for each of the
	things.

	Compressed images are taken from memory as an uninterrupted
	sequence of bytes beginning at <data> whose length is given by
	UNPACK_COMPRESSED_SIZE_SGIX.  The byte stream is passed to the
	GL and interpreted as determined by the compression type given
	by UNPACK_COMPRESSION_TYPE_SGIX.  The dimensions of the image
	represented by the byte stream are determined as follows.  The
	width of the image is equal to the value of UNPACK_ROW_LENGTH
	if this value is positive, or to <width> otherwise.  The
	height of the image is equal to the value of IMAGE_HEIGHT_EXT
	if this value is positive, or to <height> otherwise.  The
	width and height refer to the the size of the image after
	upsampling (see below).

	The pixel storage parameters UNPACK_SWAP_BYTES,
	UNPACK_LSB_FIRST, and UNPACK_ALIGNMENT are ignored for
	compressed images.  Subrectangle storage modes
	(UNPACK_SKIP_ROWS, UNPACK_SKIP_PIXELS) are not applied as the
	image is extracted from memory, but instead are applied after
	the image has been decompressed.  This operation is described
	in detail at the end of this section.

	Once the byte stream has been taken from host memory, it is
	decompressed as determined by the setting of
	UNPACK_COMPRESSION_TYPE_SGIX.  The operations are described in
	detail below.

	The output of the decompression algorithm is a width by height
	image.  A subrectangle of the image may be extracted as
	determined by the pixel storage parameters UNPACK_SKIP_PIXELS,
	UNPACK_SKIP_ROWS and by the <width> and <height> arguments to
	the original entry point (see figure 3.8.  The result of
	application of the subrect algorithm is a <width> by <height>
	image.

	To compute the subrectangle image, we consider the output of
	the decompression algorithm as a two-dimensional array of
	pixels Pin[0...(width-1)][0...(height-1)].  The first index
	selects the column of the image, the second selects the row.
	We consider the output of the subrectangle algorithm as a
	two-dimensional array of pixels
	Pout[0...(<width>-1)][0...(<height>-1)].  Each pixel the
	output image is defined by:

		Pout[i][j] = Pin[UNPACK_SKIP_PIXELS + i][UNPACK_SKIP_ROWS + j]

	In this equation, we define the "=" operation to set each
	channel of the output pixel equal to the equivalent channel of
	the input pixel.  If any of the output pixels are generated
	from pixels outside of the input image, the values of the
	components of these pixels are undefined.

Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations
and the Frame Buffer)

	4.3.2 Reading Pixels
	
	The following entries are added to Table 4.5:

	Parameter Name			Type		Initial Value		Valid Range
	--------------			----		-------------		-----------
	PACK_COMPRESSION_TYPE_SGIX	integer		NONE			NONE
	PACK_MAX_COMPRESSED_SIZE_SGIX	integer		0			[0,inf)
	PACK_SAMPLE_SGIX		integer		SAMPLE_444_SGIX		SAMPLE_444_SGIX, SAMPLE_422_SGIX, SAMPLE_411_SGIX, SAMPLE_420_SGIX
	PACK_FROM_RGB_SGIX		boolean		TRUE			TRUE/FALSE
	
	The following needs to be added to the end of the "Final
	Conversion" subsection: If image compression is on
	(PACK_COMPRESSION_TYPE_SGIX is set to other than NONE), no
	conversion is applied.

	The subsection titled "Placement in Client Memory" is renamed
	"Packing of Uncompressed Images."  The following is added to
	the start of the subsection:  If image compression is not on
	(PACK_COMPRESSION_TYPE_SGIX is set to NONE), the pixels of the
	image are transferred to host memory as described in this
	section.  If compression is on, the pixels are transferred as
	described in "Packing of Compressed Images."

	A new subsection, "Packing of Compressed Images," is added
	after the subsection "Packing of Uncompressed Images."  The
	contents of the subsection are as follows:

	If image compression is on (PACK_COMPRESSION_TYPE_SGIX is set
	to something other than NONE), images are placed in memory as
	described in this section.  The floating-point image from the
	final conversion step is used as the input to the compression
	step.  The algorithm used for the compression step is
	determined by the value of PACK_COMPRESSION_TYPE_SGIX.
	Algorithms are described in separate extensions.  The size of
	the image returned to the host is <width> by <height>.  The
	pixel pack parameters PACK_SWAP_BYTES, PACK_LSB_FIRST,
	PACK_ROW_LENGTH, PACK_SKIP_ROWS, PACK_SKIP_PIXELS, and
	PACK_ALIGNMENT are not considered when reading back compressed
	images.

	The output of the compression step is a byte stream.  The
	compression algorithm sets the value of
	PACK_COMPRESSED_SIZE_SGIX to the length of the byte stream.
	The bytes are placed in an uninterrupted stream starting at
	the location <data> in host memory.  If the value of
	PACK_MAX_COMPRESSED_SIZE_SGIX is greater than zero and the
	value of PACK_COMPRESSED_SIZE_SGIX is greater than the value
	of PACK_MAX_COMPRESSED_SIZE_SGIX, the error INVALID_OPERATION
	is generated.  If this occurs, the contents of the first
	PACK_MAX_COMPRESSED_SIZE_SGIX bytes after the <data> pointer
	are undefined, but bytes outside this range are guaranteed to
	be left unchanged.
	
Additions to Chapter 5 of the 1.0 Specification (Special Functions)

	None.

Additions to Chapter 6 of the 1.0 Specification (State and State Requests)

	XXX

Additions to the GLX Specification


Errors

	XXX
	
	INVALID_OPERATION is generated if the compressed data requested by a
	ReadPixels or GetTexImage will occupy more than
	PACK_MAX_COMPRESSED_SIZE bytes.


	

New State

    Get Value			Get Command			Type		Initial Value		Attribute
    ---------			-----------			----		-------------		---------
    UNPACK_COMPRESSION_TYPE	GetIntegerv			Z1*		NONE			client
    UNPACK_COMPRESSED_SIZE	GetIntegerv			Z+		0			client
    UNPACK_SAMPLE_SGIX		GetIntegerv			Z4		SAMPLE_444_SGIX		client
    UNPACK_TO_RGB_SGIX		GetBooleanv			B		TRUE			client
    PACK_COMPRESSION_TYPE	GetIntegerv			Z1		NONE			client
    PACK_COMPRESSED_SIZE	GetIntegerv			Z+		0			client
    PACK_MAX_COMPRESSED_SIZE	GetIntegerv			Z+		0			client
    PACK_SAMPLE_SGIX		GetIntegerv			Z4		SAMPLE_444_SGIX		client
    PACK_FROM_RGB_SGIX		GetBooleanv			B		TRUE			client
	

New Implementation Dependent State

	None.
