Name

    SGI_color_matrix

Name Strings

    GL_SGI_color_matrix

Version

    $Date: 2005/06/02 18:12:31 $ $Revision: 1.1 $

Number

    13

Dependencies

    None

Overview

    This extension adds a 4x4 matrix stack to the pixel transfer path.  The
    matrix operates on RGBA pixel groups, using the equation

	C' = MC,

    where

	    |R|
	C = |G|
	    |B|
	    |A|

    and M is the 4x4 matrix on the top of the color matrix stack.  After
    the matrix multiplication, each resulting color component is scaled
    and biased by a programmed amount.  Color matrix multiplication follows
    convolution (and the scale, and bias that are associated with
    convolution.)

    The color matrix can be used to reassign and duplicate color components.
    It can also be used to implement simple color space conversions.

New Procedures and Functions

    None

New Tokens

    Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
    GetFloatv, and GetDoublev:

	COLOR_MATRIX_SGI		 	0x80B1
	COLOR_MATRIX_STACK_DEPTH_SGI		0x80B2
	MAX_COLOR_MATRIX_STACK_DEPTH_SGI	0x80B3

    Accepted by the <pname> parameter of PixelTransfer*, and by the <pname>
    parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev:

	POST_COLOR_MATRIX_RED_SCALE_SGI		0x80B4
	POST_COLOR_MATRIX_GREEN_SCALE_SGI	0x80B5
	POST_COLOR_MATRIX_BLUE_SCALE_SGI	0x80B6
	POST_COLOR_MATRIX_ALPHA_SCALE_SGI	0x80B7
	POST_COLOR_MATRIX_RED_BIAS_SGI		0x80B8
	POST_COLOR_MATRIX_GREEN_BIAS_SGI	0x80B9
	POST_COLOR_MATRIX_BLUE_BIAS_SGI		0x80BA
	POST_COLOR_MATRIX_ALPHA_BIAS_SGI	0x80BB

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

    None

Additions to Chapter 3 of the 1.0 Specification (Rasterization)

    The manipulation of the color matrix stack is added to the GL
    Specification in section 3.6.2, "Pixel Transfer Modes."  Setting the
    matrix mode to COLOR causes the already described matrix operations
    (see GL Specification Chapter 2, OpenGL Operation) to apply to the top
    matrix on the color matrix stack.  (PushMatrix and PopMatrix apply to
    the entire color matrix stack.)  All matrix operations have the same
    effect on the color matrix as they do on the other matrices.

    The operation of the color matrix is added to the GL Specification in
    section 3.6.3, "Rasterization of Pixel Rectangles, immediately following
    the operations described in EXT_convolution.  The color matrix operates
    only on RGBA pixel groups.  If this extension is implemented, the color
    matrix is always active, and is applied to all RGBA pixel groups,
    regardless of the command used to generate them.  (There is no enable or
    disable of the color matrix.)  Adopting the matrix notation used in
    section 2.9.2 of the GL Specification (Matrices) the color matrix
    arithmetic is:

	R' = ((m1 * R) + (m5 * G) +  (m9 * B) + (m13 * A)) * Rscale + Rbias
	G' = ((m2 * R) + (m6 * G) + (m10 * B) + (m14 * A)) * Gscale + Gbias
	B' = ((m3 * R) + (m7 * G) + (m11 * B) + (m15 * A)) * Bscale + Bbias
	A' = ((m4 * R) + (m8 * G) + (m12 * B) + (m16 * A)) * Ascale + Abias

    where R, G, B, and A are the color component values of the incoming
    pixel group, m1 through m16 are the components of the matrix at the top
    of the color matrix stack, and R', G', B', and A' are the resulting
    color components.  Rscale, Gscale, Bscale, and Ascale are specified by
    calling PixelTransfer with <pname> set to
    POST_COLOR_MATRIX_RED_SCALE_SGI, POST_COLOR_MATRIX_GREEN_SCALE_SGI,
    POST_COLOR_MATRIX_BLUE_SCALE_SGI, and POST_COLOR_MATRIX_ALPHA_SCALE_SGI
    respectively.  Rbias, Gbias, Bbias, and Abias are specified by calling
    PixelTransfer with <pname> set to POST_COLOR_MATRIX_RED_BIAS_SGI,
    POST_COLOR_MATRIX_GREEN_BIAS_SGI, POST_COLOR_MATRIX_BLUE_BIAS_SGI, and 
    POST_COLOR_MATRIX_ALPHA_BIAS_SGI respectively.  There are no
    constraints on the values of the scale and bias variables.

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

    The operation of the color matrix during pixel copy and query
    operations is identical to the operation during pixel drawing and
    texture image definition.  This operation occurs immediately after the
    operations described by EXT_convolution, which follow section 4.3.2
    (Reading Pixels) of the GL Specification.

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)

    The scale and bias variables are queried using GetFloatv with <pname>
    set to the appropriate variable name.  The top matrix on the color
    matrix stack is returned by GetFloatv called with <pname> set to
    COLOR_MATRIX_SGI.  The depth of the color matrix stack, and the maximum
    depth of the color matrix stack, are queried with GetIntegerv, setting
    <pname> to COLOR_MATRIX_STACK_DEPTH_SGI and
    MAX_COLOR_MATRIX_STACK_DEPTH_SGI respectively.

Additions to the GLX Specification

    None

Dependencies on EXT_convolution

    None, really, except that the color matrix operation follows the
    convolution operation (and its scale and bias).  If convolution is not
    supported, the location of the color matrix operation with respect to
    all other pixel operations remains the same.

Errors

    None

New State

								Initial
    Get Value				Get Command	Type	Value	Attrib
    ---------				-----------	----	-------	------
    COLOR_MATRIX_SGI			GetFloatv	2* x M4	Identity  -
    COLOR_MATRIX_STACK_DEPTH_SGI	GetIntegerv	Z+	1	  -
    POST_COLOR_MATRIX_RED_SCALE_SGI	GetFloatv	R	1	pixel
    POST_COLOR_MATRIX_GREEN_SCALE_SGI	GetFloatv	R	1	pixel
    POST_COLOR_MATRIX_BLUE_SCALE_SGI	GetFloatv	R	1	pixel
    POST_COLOR_MATRIX_ALPHA_SCALE_SGI	GetFloatv	R	1	pixel
    POST_COLOR_MATRIX_RED_BIAS_SGI	GetFloatv	R	0	pixel
    POST_COLOR_MATRIX_GREEN_BIAS_SGI	GetFloatv	R	0	pixel
    POST_COLOR_MATRIX_BLUE_BIAS_SGI	GetFloatv	R	0	pixel
    POST_COLOR_MATRIX_ALPHA_BIAS_SGI	GetFloatv	R	0	pixel

New Implementation Dependent State

								Minimum
    Get Value				Get Command	Type	Value
    ---------				-----------	----	-------
    MAX_COLOR_MATRIX_STACK_DEPTH_SGI	GetIntegerv	Z+	2
