|
|
//-----------------------------------------------------------------------------
//
// This file contains texture filtering functions.
//
// Copyright (C) Microsoft Corporation, 1997.
//
//-----------------------------------------------------------------------------
#include "pch.cpp"
#pragma hdrstop
#include "mtexfilt.h"
//-----------------------------------------------------------------------------
//
// TexFiltBilinear
//
// Given the basic bilinear equations
//
// A = C00 + U*(C10 - C00)
// B = C01 + U*(C11 - C01)
// C = A + V*(B-A)
//
// This routine is based on the re-arrangement of this equation into
//
// C = C00*(1-U-V+U*V) + C10*(U-U*V) + C10(V-U*V) + C11*(U*V)
// or
// C = C00*s1 + C10*s2 + C10*s3 + C11*s4
//
//-----------------------------------------------------------------------------
void TexFiltBilinear(D3DCOLOR *pOut, INT32 iU, INT32 iV, UINT32 uTex00, UINT32 uTex10, UINT32 uTex01, UINT32 uTex11) { #define SIMPLE_BILINEAR 1
#ifdef SIMPLE_BILINEAR
INT32 r00, r01, r10, r11; INT32 g00, g01, g10, g11; INT32 b00, b01, b10, b11; INT32 a00, a01, a10, a11;
r00 = RGBA_GETRED(uTex00); r01 = RGBA_GETRED(uTex01); r10 = RGBA_GETRED(uTex10); r11 = RGBA_GETRED(uTex11);
g00 = RGBA_GETGREEN(uTex00); g01 = RGBA_GETGREEN(uTex01); g10 = RGBA_GETGREEN(uTex10); g11 = RGBA_GETGREEN(uTex11);
b00 = RGBA_GETBLUE(uTex00); b01 = RGBA_GETBLUE(uTex01); b10 = RGBA_GETBLUE(uTex10); b11 = RGBA_GETBLUE(uTex11);
a00 = RGBA_GETALPHA(uTex00); a01 = RGBA_GETALPHA(uTex01); a10 = RGBA_GETALPHA(uTex10); a11 = RGBA_GETALPHA(uTex11);
// can be MMX_mulhw's
r00 = r00 + ((iU*(r10 - r00)) >> 16); g00 = g00 + ((iU*(g10 - g00)) >> 16); b00 = b00 + ((iU*(b10 - b00)) >> 16); a00 = a00 + ((iU*(a10 - a00)) >> 16);
r01 = r01 + ((iU*(r11 - r01)) >> 16); g01 = g01 + ((iU*(g11 - g01)) >> 16); b01 = b01 + ((iU*(b11 - b01)) >> 16); a01 = a01 + ((iU*(a11 - a01)) >> 16);
r00 = r00 + ((iV*(r01 - r00)) >> 16); g00 = g00 + ((iV*(g01 - g00)) >> 16); b00 = b00 + ((iV*(b01 - b00)) >> 16); a00 = a00 + ((iV*(a01 - a00)) >> 16);
#else
// another potential MMX implementation
INT32 s1, s2, s3, s4; s4 = (iU * iV)>>16; // (0.16 * 0.16) >> 16 = 0.16
s3 = iV - s4; s2 = iU - s4; s1 = 0x10000 - iV - s2;
INT32 r00, r01, r10, r11; INT32 g00, g01, g10, g11; INT32 b00, b01, b10, b11; INT32 a00, a01, a10, a11;
r00 = RGBA_GETRED(uTex00); r01 = RGBA_GETRED(uTex01); r10 = RGBA_GETRED(uTex10); r11 = RGBA_GETRED(uTex11);
g00 = RGBA_GETGREEN(uTex00); g01 = RGBA_GETGREEN(uTex01); g10 = RGBA_GETGREEN(uTex10); g11 = RGBA_GETGREEN(uTex11);
b00 = RGBA_GETBLUE(uTex00); b01 = RGBA_GETBLUE(uTex01); b10 = RGBA_GETBLUE(uTex10); b11 = RGBA_GETBLUE(uTex11);
a00 = RGBA_GETALPHA(uTex00); a01 = RGBA_GETALPHA(uTex01); a10 = RGBA_GETALPHA(uTex10); a11 = RGBA_GETALPHA(uTex11);
// 8.0 * 0.16 == 8.16 >> 16 == 8.0
r00 = (r00*s1 + r10*s2 + r01*s3 + r11*s4)>>16; g00 = (g00*s1 + g10*s2 + g01*s3 + g11*s4)>>16; b00 = (b00*s1 + b10*s2 + b01*s3 + b11*s4)>>16; a00 = (a00*s1 + a10*s2 + a01*s3 + a11*s4)>>16; #endif
*pOut = RGBA_MAKE(r00, g00, b00, a00); }
|