Hi All,
I write function to anlarge from buffer to another buffer, but it have some
wrong, can anbody help me check code following:
static float *CreateCoeff(int nLen, int nNewLen, BOOL bShrink)
{
int nSum = 0, nSum2;
int i = 0;
float *pRes = ExAllocatePool(NonPagedPool, 2 * nLen * sizeof(float));
float *pCoeff = pRes;
float fNorm = (bShrink)? (float)nNewLen / nLen : 1;
int nDenom = (bShrink)? nLen : nNewLen;
RtlZeroMemory(pRes, 2 * nLen * sizeof(float));
for(i = 0; i < nLen; i++, pCoeff += 2)
{
nSum2 = nSum + nNewLen;
if(nSum2 > nLen)
{
*pCoeff = (float)(nLen - nSum) / nDenom;
pCoeff[1] = (float)(nSum2 - nLen) / nDenom;
nSum2 -= nLen;
}else
{
*pCoeff = fNorm;
if(nSum2 == nLen)
{
pCoeff[1] = -1;
nSum2 = 0;
}
}
nSum = nSum2;
}
return pRes;
}
#define F_DELTA 0.0001f
void EnlargeData(BYTE *pInBuff, WORD wWidth, WORD wHeight, BYTE *pOutBuff,
WORD wNewWidth, WORD wNewHeight)
{
BYTE *pLine = pInBuff;
BYTE *pPix = pLine;
BYTE *pPixOld, *pUpPix, *pUpPixOld;
BYTE *pOutLine = pOutBuff;
BYTE *pOutPix;
DWORD dwInLn = (3 * wWidth + 3) & ~3;
DWORD dwOutLn = (3 * wNewWidth + 3) & ~3;
int x, y, i;
BOOL bCrossRow, bCrossCol;
float *pRowCoeff = CreateCoeff(wNewWidth, wWidth, FALSE);
float *pColCoeff = CreateCoeff(wNewHeight, wHeight, FALSE);
float fTmp, fPtTmp[3], *pXCoeff;
float *pYCoeff = pColCoeff;
y = 0;
while(y < wHeight)
{
bCrossRow = (pYCoeff[1] > F_DELTA);
x = 0;
pXCoeff = pRowCoeff;
pOutPix = pOutLine;
pOutLine += dwOutLn;
pUpPix = pLine;
if(fabs(pYCoeff[1]) > F_DELTA)
{
y++;
pLine += dwInLn;
pPix = pLine;
}
while(x < wWidth)
{
bCrossCol = pXCoeff[1] > F_DELTA;
pUpPixOld = pUpPix;
pPixOld = pPix;
if(fabs(pXCoeff[1]) > F_DELTA)
{
x++;
pUpPix += 3;
pPix += 3;
}
fTmp = (*pXCoeff) * (*pYCoeff);
for(i = 0; i < 3; i++)
{
fPtTmp[i] = fTmp * pUpPixOld[i];
}
if(bCrossCol)
{
fTmp = pXCoeff[1] * (*pYCoeff);
for(i = 0; i < 3; i++)
{
fPtTmp[i] += fTmp * pUpPix[i];
}
}
if(bCrossRow)
{
fTmp = *pXCoeff * pYCoeff[1];
for(i = 0; i < 3; i++)
{
fPtTmp[i] += fTmp * pPixOld[i];
}
if(bCrossCol)
{
fTmp = pXCoeff[1] * pYCoeff[1];
for(i = 0; i < 3; i++)
{
fPtTmp[i] += fTmp * pPix[i];
}
}
}
for(i = 0; i < 3; i++, pOutPix++)
{
*pOutPix = (BYTE)fPtTmp[i];
}
pXCoeff += 2;
}
pYCoeff += 2;
}
ExFreePool(pRowCoeff);
ExFreePool(pColCoeff);
}
Thanks very much for help
David