Code:
struct RGBA
{
BYTE red;
BYTE green;
BYTE blue;
BYTE alpha;
};
float BInterp(float v1,float v2,float v3,float v4,float f1,float f2)
{
asm {
sub esp,8
fld [v2]
fsub [v1]
fmul [f1]
fadd [v1]
fstp [esp-4]
fld [v4]
fsub [v3]
fmul [f1]
fadd [v3]
fstp [esp-8]
fld [esp-8]
fsub [esp-4]
fmul [f2]
fadd [esp-4]
add esp,8
}
}
void FilterImage(RGBA **pOutImage,RGBA *pInImage,DWORD dwWidth,DWORD dwHeight,float fFilterCoef)
{
*pOutImage=new RGBA[dwHeight*dwWidth];
RGBA *ptrOutImage=*pOutImage;
for (DWORD i=0;i<dwHeight-1;i++)
{
for (DWORD j=0;j<dwWidth-1;j++)
{
DWORD offset1=i*dwWidth+j;
DWORD offset2=offset1+1;
DWORD offset3=offset1+dwWidth;
DWORD offset4=offset3+1;
RGBA finalcolor;
RGBA1=pInImage[offset1];
RGBA2=pInImage[offset2];
RGBA3=pInImage[offset3];
RGBA4=pInImage[offset4];
finalcolor.red=BI(RGBA1.red,
RGBA2.red,
RGBA3.red,
RGBA4.red,
fFilterCoef,
fFilterCoef);
finalcolor.green=BI(RGBA1.green,
RGBA2.green,
RGBA3.green,
RGBA4.green,
fFilterCoef,
fFilterCoef);
finalcolor.blue=BI(RGBA1.blue,
RGBA2.blue,
RGBA3.blue,
RGBA4.blue,
fFilterCoef,
fFilterCoef);
finalcolor.alpha=BI(RGBA1.alpha,
RGBA2.alpha,
RGBA3.alpha,
RGBA4.alpha,
fFilterCoef,
fFilterCoef);
ptrOutImage[offset1] =finalcolor;
}
}
}
Not the fastest code in the world, but it will do a bilinear filter on any 32-bit true color image, including the alpha channel. fFilterCoef should always satisfy 0<x<1.