XXX not complete yet 


Name

    SGIX_video_resize_float

Name Strings

    GLX_SGIX_video_resize_float

Version

    $Date: 1999/12/28 01:40:36 $ $Revision: 1.3 $

Number

    184

Dependencies

    SGIX_video_resize is required

Overview

    This is an extension of the extension SGIX_video_resize
    (number 83) designed to be able to accept floating point source
    and destination rectangles to allow sub-pixel positioning and
    panning.

Issues

    This extension will currently only work on a Bali.

New Procedures and Functions

    int glXChannelRectfSGIX(  Display *display,
			 int screen,
			 int channel,
			 float x,
			 float y,
			 float w,
			 float h )

    int glXQueryChannelRectfSGIX( Display *display,
			 int screen,
			 int channel,
			 float *dx,
			 float *dy,
			 float *dw,
			 float *dh )

    int glXQueryChannelDeltasfSGIX( Display *display,
			 int screen,
			 int channel,
			 float *x,
			 float *y,
			 float *w,
			 float *h )


New Tokens

    None

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

    None

Additions to Chapter 3 of the 1.0 Specification (Rasterization)

    None

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

    None

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)

    None

Additions to the GLX Specification

    This just extends the calls to glxChannelRectSGIX, glxQueryChannelRectSGIX
    and glxQueryChannelDeltasSGIX to handle floating point data. This extension
    in range allows us to perform sub-pixel panning.

Errors

    all SGIX_video_resize commands mentioned here return GLX_BAD_CONTEXT 
    if there is no current GLXContext.

    glXChannelRectSGIX returns GLX_BAD_CONTEXT if the current context is
    not direct, or if there is no current context.

    glXChannelRectSGIX returns GLX_BAD_VALUE if the x,y,w,h rectangle specified 
    does not fit within the channel's rectangle that was current at the time of the 
    glXBindChannelToWindowSGIX call.

    glXBindChannelToWindowSGIX returns GLX_BAD_VALUE if window passed to it
    is invalid.

    all SGIX_video_resize commands mentioned here return GLX_BAD_VALUE
    if the specified channel is invalid or inactive.

New State
     Get Value                   Get Command             Type    Initial Value
     ---------                   -----------             ----    -------------
     [deltas]			glXQueryChannelDeltasfSGIX Z+	dx=4,dy=1,dw=4,dh=1 
     [resize rect]		glXQueryChannelRectfSGIX   Z+	current pan/zoom rect


New Implementation Dependent State

    Get Value                   Get Command             Type    Initial Value
    ---------                   -----------             ----    -------------
    [bound]						B	false
