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

Re: Enlarge from a buffer to another buffer by Doron

Doron
Thu Aug 30 10:50:57 PDT 2007

what is going wrong? you also need to save/restore floating point state
using the appropriate APIs before/after using FP math.

d

--
Please do not send e-mail directly to this alias. this alias is for
newsgroup purposes only.
This posting is provided "AS IS" with no warranties, and confers no rights.


"David" <thuong101277@yahoo.com> wrote in message
news:ODQlsOv6HHA.1484@TK2MSFTNGP06.phx.gbl...
> 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
>


Re: Enlarge from a buffer to another buffer by Maxim

Maxim
Thu Aug 30 13:50:36 PDT 2007

Am I wrong that such a task is solvable by an integer-only Brezenham's
code?

--
Maxim Shatskih, Windows DDK MVP
StorageCraft Corporation
maxim@storagecraft.com
http://www.storagecraft.com

"David" <thuong101277@yahoo.com> wrote in message
news:ODQlsOv6HHA.1484@TK2MSFTNGP06.phx.gbl...
> 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
>
>


Re: Enlarge from a buffer to another buffer by David

David
Thu Aug 30 21:40:20 PDT 2007

Thanks for your reply,

It function i write at kernel mode, when i debug then it crash, i do not
know why.

David,

"Doron Holan [MSFT]" <doronh@online.microsoft.com> wrote in message
news:OmxfU5y6HHA.5404@TK2MSFTNGP02.phx.gbl...
> what is going wrong? you also need to save/restore floating point state
> using the appropriate APIs before/after using FP math.
>
> d
>
> --
> Please do not send e-mail directly to this alias. this alias is for
> newsgroup purposes only.
> This posting is provided "AS IS" with no warranties, and confers no
> rights.
>
>
> "David" <thuong101277@yahoo.com> wrote in message
> news:ODQlsOv6HHA.1484@TK2MSFTNGP06.phx.gbl...
>> 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
>>
>



Re: Enlarge from a buffer to another buffer by David

David
Thu Aug 30 22:41:42 PDT 2007

Thanks for your reply,

It function i write at kernel mode, when i debug then it crash, i do not
know why.
I doubt this code:

float *pRes = ExAllocatePool(NonPagedPool, 2 * nLen * sizeof(float));

in C++ it is : float *pRes = new float[2 * nLen]; how to solve this
problem?

David,

"Maxim S. Shatskih" <maxim@storagecraft.com> wrote in message
news:%23qMzrd06HHA.2476@TK2MSFTNGP05.phx.gbl...
> Am I wrong that such a task is solvable by an integer-only Brezenham's
> code?
>
> --
> Maxim Shatskih, Windows DDK MVP
> StorageCraft Corporation
> maxim@storagecraft.com
> http://www.storagecraft.com
>
> "David" <thuong101277@yahoo.com> wrote in message
> news:ODQlsOv6HHA.1484@TK2MSFTNGP06.phx.gbl...
>> 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
>>
>>
>



Re: Enlarge from a buffer to another buffer by Tim

Tim
Sun Sep 02 13:33:42 PDT 2007

"David" <thuong101277@yahoo.com> wrote:
>
>It function i write at kernel mode, when i debug then it crash, i do not
>know why.
>I doubt this code:
>
> float *pRes = ExAllocatePool(NonPagedPool, 2 * nLen * sizeof(float));
>
>in C++ it is : float *pRes = new float[2 * nLen]; how to solve this
>problem?

No, there's nothing wrong with that. The problem must be elsewhere.
--
Tim Roberts, timr@probo.com
Providenza & Boekelheide, Inc.