windows-nt/Source/XPSP1/NT/multimedia/opengl/server/generic/genzippy.c
2020-09-26 16:20:57 +08:00

148 lines
4.3 KiB
C

/******************************Module*Header*******************************\
* Module Name: zippy.c
*
* Triangle drawing fast path.
*
* 28-Oct-1994 mikeke Created
*
* Copyright (c) 1994 Microsoft Corporation
\**************************************************************************/
/*
** Copyright 1991, 1992, 1993, 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
/**************************************************************************\
*
* Subtriangle functions
*
\**************************************************************************/
#define TEXTURE 1
#define SHADE 1
#define ZBUFFER 1
#include "zippy.h"
#undef ZBUFFER
#define ZBUFFER 0
#include "zippy.h"
#undef SHADE
#define SHADE 0
#include "zippy.h"
#undef TEXTURE
#define TEXTURE 0
#undef SHADE
#define SHADE 1
#include "zippy.h"
#undef SHADE
#define SHADE 0
#include "zippy.h"
/**************************************************************************\
*
* Flat subtriangle function
*
\**************************************************************************/
void FASTCALL
__ZippyFSTCI8Flat
(__GLcontext *gc, GLint iyBottom, GLint iyTop)
{
__GLGENcontext *gengc = (__GLGENcontext *)gc;
GENACCEL *pGenAccel = (GENACCEL *)(gengc->pPrivateArea);
int scansize;
ULONG color1;
//
// this function assumes all this stuff
//
ASSERTOPENGL((gc->drawBuffer->buf.flags & DIB_FORMAT) != 0,
"Zippy target must have DIB format\n");
ASSERTOPENGL((gc->drawBuffer->buf.flags & NO_CLIP) != 0,
"Zippy doesn't support per-pixel clipping\n");
ASSERTOPENGL(gc->state.raster.drawBuffer != GL_FRONT_AND_BACK,
"Zippy only handles one draw buffer\n");
ASSERTOPENGL(gc->transform.reasonableViewport,
"Zippy requires reasonableViewport\n");
ASSERTOPENGL(gc->transform.clipY0 <= iyBottom,
"Zippy requires unclipped area\n");
ASSERTOPENGL(iyTop <= gc->transform.clipY1,
"Zippy requires unclipped area\n");
//
// calculate the color
//
color1 = gengc->pajTranslateVector[
((pGenAccel->spanValue.r + 0x0800) >> 16) & 0xff
];
//
// render the spans
//
scansize = gc->polygon.shader.cfb->buf.outerWidth;
gc->polygon.shader.frag.x = gc->polygon.shader.ixLeft;
for (gc->polygon.shader.frag.y = iyBottom;
gc->polygon.shader.frag.y != iyTop;
gc->polygon.shader.frag.y++
) {
GLint spanWidth = gc->polygon.shader.ixRight - gc->polygon.shader.frag.x;
if (spanWidth > 0) {
RtlFillMemory(
pGenAccel->pPix + gengc->gc.polygon.shader.frag.x,
spanWidth,
color1);
}
pGenAccel->pPix += scansize;
gc->polygon.shader.ixRightFrac += gc->polygon.shader.dxRightFrac;
if (gc->polygon.shader.ixRightFrac < 0) {
/*
* Carry/Borrow'd. Use large step
*/
gc->polygon.shader.ixRight += gc->polygon.shader.dxRightBig;
gc->polygon.shader.ixRightFrac &= ~0x80000000;
} else {
gc->polygon.shader.ixRight += gc->polygon.shader.dxRightLittle;
}
gc->polygon.shader.ixLeftFrac += gc->polygon.shader.dxLeftFrac;
if (gc->polygon.shader.ixLeftFrac < 0) {
/*
* Carry/Borrow'd. Use large step
*/
gc->polygon.shader.frag.x += gc->polygon.shader.dxLeftBig;
gc->polygon.shader.ixLeftFrac &= ~0x80000000;
} else {
/*
* Use small step
*/
gc->polygon.shader.frag.x += gc->polygon.shader.dxLeftLittle;
}
}
gc->polygon.shader.ixLeft = gc->polygon.shader.frag.x;
}