Windows-Server-2003/multimedia/opengl/server/pixel/px_read.c

283 lines
6.8 KiB
C

/*
** Copyright 1991,1992, Silicon Graphics, Inc.
** All Rights Reserved.
**
** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
** the contents of this file may not be disclosed to third parties, copied or
** duplicated in any form, in whole or in part, without the prior written
** permission of Silicon Graphics, Inc.
**
** RESTRICTED RIGHTS LEGEND:
** Use, duplication or disclosure by the Government is subject to restrictions
** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
** rights reserved under the Copyright Laws of the United States.
*/
#include "precomp.h"
#pragma hdrstop
/*
** This file contains span reading routines. These are routines which
** read data from the depth buffer, stencil buffer, or frame buffer
** into internal software spans. The type of internal span that it
** is read into varies from routine to routine.
*/
/*
** A reader that reads spans into scaled a RGBA, FLOAT span.
**
** zoomx is assumed to be less than 1.0 and greater than -1.0.
*/
void FASTCALL __glSpanReadRGBA(__GLcontext *gc, __GLpixelSpanInfo *spanInfo,
GLvoid *span)
{
GLint i;
GLint width;
GLfloat *spanData;
GLint readY, readX;
GLshort *pixelArray;
GLint skipCount;
width = spanInfo->realWidth;
spanData = (GLfloat*) span;
pixelArray = spanInfo->pixelArray;
readY = spanInfo->readY;
readX = spanInfo->readX;
for (i=0; i<width; i++) {
#ifdef NT
(*gc->readBuffer->readColor)(gc->readBuffer, readX, readY,
(__GLcolor *) spanData);
#else
(*gc->frontBuffer.readColor)(gc->readBuffer, readX, readY,
(__GLcolor *) spanData);
#endif
spanData += 4;
skipCount = *pixelArray++;
readX += skipCount;
}
}
/*
** A reader that reads spans into a scaled RGBA, FLOAT span.
**
** zoomx is assumed to be less than or equal to -1.0 or greater than or
** equal to 1.0.
*/
void FASTCALL __glSpanReadRGBA2(__GLcontext *gc, __GLpixelSpanInfo *spanInfo,
GLvoid *span)
{
GLint i;
GLint width;
GLfloat *spanData;
GLint readY, readX;
width = spanInfo->width;
spanData = (GLfloat*) span;
readY = spanInfo->readY;
readX = spanInfo->readX;
#ifdef NT
(*gc->readBuffer->readSpan)(gc->readBuffer, readX, readY,
(__GLcolor *) spanData, width);
#else
(*gc->frontBuffer.readSpan)(gc->readBuffer, readX, readY,
(__GLcolor *) spanData, width);
#endif
}
/*
** A reader that reads spans into a COLOR_INDEX, FLOAT span.
**
** zoomx is assumed to be less than 1.0 and greater than -1.0.
*/
void FASTCALL __glSpanReadCI(__GLcontext *gc, __GLpixelSpanInfo *spanInfo,
GLvoid *span)
{
GLint i;
GLint width;
GLfloat *spanData;
GLenum format;
GLint readY, readX;
GLshort *pixelArray;
GLint skipCount;
width = spanInfo->realWidth;
spanData = (GLfloat*) span;
pixelArray = spanInfo->pixelArray;
readY = spanInfo->readY;
readX = spanInfo->readX;
for (i=0; i<width; i++) {
#ifdef NT
(*gc->readBuffer->readColor)(gc->readBuffer, readX, readY,
(__GLcolor *) spanData);
#else
(*gc->frontBuffer.readColor)(gc->readBuffer, readX, readY,
(__GLcolor *) spanData);
#endif
spanData++;
skipCount = *pixelArray++;
readX += skipCount;
}
}
/*
** A reader that reads spans into a COLOR_INDEX, FLOAT span.
**
** zoomx is assumed to be less than or equal to -1.0 or greater than or
** equal to 1.0.
*/
void FASTCALL __glSpanReadCI2(__GLcontext *gc, __GLpixelSpanInfo *spanInfo,
GLvoid *span)
{
GLint i;
GLint width;
GLfloat *spanData;
GLint readY, readX;
width = spanInfo->width;
spanData = (GLfloat*) span;
readY = spanInfo->readY;
readX = spanInfo->readX;
for (i=0; i<width; i++) {
#ifdef NT
(*gc->readBuffer->readColor)(gc->readBuffer, readX, readY,
(__GLcolor *) spanData);
#else
(*gc->frontBuffer.readColor)(gc->readBuffer, readX, readY,
(__GLcolor *) spanData);
#endif
spanData++;
readX++;
}
}
/*
** A reader that reads spans into a DEPTH_COMPONENT, FLOAT span.
**
** zoomx is assumed to be less than 1.0 and greater than -1.0.
*/
void FASTCALL __glSpanReadDepth(__GLcontext *gc, __GLpixelSpanInfo *spanInfo,
GLvoid *span)
{
GLint i;
GLint width;
GLfloat *spanData;
GLint readY, readX;
GLshort *pixelArray;
GLint skipCount;
__GLfloat oneOverScale;
width = spanInfo->realWidth;
spanData = (GLfloat*) span;
pixelArray = spanInfo->pixelArray;
readY = spanInfo->readY;
readX = spanInfo->readX;
oneOverScale = __glOne / gc->depthBuffer.scale;
for (i=0; i<width; i++) {
*spanData++ =
(*gc->depthBuffer.fetch)(&(gc->depthBuffer), readX, readY) *
oneOverScale;
skipCount = *pixelArray++;
readX += skipCount;
}
}
/*
** A reader that reads spans into a DEPTH_COMPONENT, FLOAT span.
**
** zoomx is assumed to be less than or equal to -1.0 or greater than or
** equal to 1.0.
*/
void FASTCALL __glSpanReadDepth2(__GLcontext *gc, __GLpixelSpanInfo *spanInfo,
GLvoid *span)
{
GLint i;
GLint width;
GLfloat *spanData;
GLint readY, readX;
__GLfloat oneOverScale;
width = spanInfo->width;
spanData = (GLfloat*) span;
readY = spanInfo->readY;
readX = spanInfo->readX;
oneOverScale = __glOne / gc->depthBuffer.scale;
for (i=0; i<width; i++) {
*spanData++ =
(*gc->depthBuffer.fetch)(&(gc->depthBuffer), readX, readY) *
oneOverScale;
readX++;
}
}
/*
** A reader that reads spans into a STENCIL_INDEX, FLOAT span.
**
** zoomx is assumed to be less than 1.0 and greater than -1.0.
*/
void FASTCALL __glSpanReadStencil(__GLcontext *gc, __GLpixelSpanInfo *spanInfo,
GLvoid *span)
{
GLint i;
GLint width;
GLfloat *spanData;
GLint readY, readX;
GLshort *pixelArray;
GLint skipCount;
width = spanInfo->realWidth;
spanData = (GLfloat*) span;
pixelArray = spanInfo->pixelArray;
readY = spanInfo->readY;
readX = spanInfo->readX;
for (i=0; i<width; i++) {
*spanData++ =
(*gc->stencilBuffer.fetch)(&(gc->stencilBuffer), readX, readY);
skipCount = *pixelArray++;
readX += skipCount;
}
}
/*
** A reader that reads spans into a STENCIL_INDEX, FLOAT span.
**
** zoomx is assumed to be less than or equal to -1.0 or greater than or
** equal to 1.0.
*/
void FASTCALL __glSpanReadStencil2(__GLcontext *gc, __GLpixelSpanInfo *spanInfo,
GLvoid *span)
{
GLint i;
GLint width;
GLfloat *spanData;
GLint readY, readX;
width = spanInfo->width;
spanData = (GLfloat*) span;
readY = spanInfo->readY;
readX = spanInfo->readX;
for (i=0; i<width; i++) {
*spanData++ =
(*gc->stencilBuffer.fetch)(&(gc->stencilBuffer), readX, readY);
readX++;
}
}