Cũng hơi dài nhưng mình đc gần 195 fps lận đó!
Code:
//struct Image32
//{
// int Width,Height;
// DWORD* pBits;
//};
//DWORD* m_pBits; // Pixel array
BOOL RlScale(Image32* pSrcImg32)
{
// Scale pSrcImg32 into m_pBits, using RlScale algorithm
if(!m_pBits || !pSrcImg32 || !pSrcImg32->pBits) return 0;
DWORD* Ptr = m_pBits; // Pointer to dest bits
DWORD* pSrcPtr = pSrcImg32->pBits; // Pointer to src bits
// KfScale (for all ratio)
float BaseW = float(pSrcImg32->Width)/float(m_Width);
float BaseH = float(pSrcImg32->Height)/float(m_Height);
int StepWl = int(BaseW);
int StepHl = int(BaseH);
int StepSize = 10000;
int StepWr = int((BaseW - StepWl)*StepSize);
int StepHr = int((BaseH - StepHl)*StepSize);
int IncWr = 0;
int IncHr = 0;
int IncH = pSrcImg32->Width*StepHl;
DWORD* pIncPtr = pSrcPtr;
// We can increase speed up to 10% ^_^
if(pSrcImg32->Width < m_Width) // Scale right
{
if(pSrcImg32->Height < m_Height) // Scale right and bottom
{
for(int j = 0;j < m_Height;j++)
{
for(int i = 0;i < m_Width;i++)
{
*Ptr++ = *pSrcPtr;
IncWr += StepWr;
if(IncWr >= StepSize)
{
IncWr -= StepSize;
pSrcPtr++;
}
}
IncWr = 0;
IncHr += StepHr;
if(IncHr >= StepSize)
{
IncHr -= StepSize;
pIncPtr += pSrcImg32->Width;
}
pSrcPtr = pIncPtr;
}
}
else if(pSrcImg32->Height == m_Height) // Only scale right
{
for(int j = 0;j < m_Height;j++)
{
for(int i = 0;i < m_Width;i++)
{
*Ptr++ = *pSrcPtr;
IncWr += StepWr;
if(IncWr >= StepSize)
{
IncWr -= StepSize;
pSrcPtr++;
}
}
IncWr = 0;
pIncPtr += pSrcImg32->Width;
pSrcPtr = pIncPtr;
}
}
else // Scale right and top
{
for(int j = 0;j < m_Height;j++)
{
for(int i = 0;i < m_Width;i++)
{
*Ptr++ = *pSrcPtr;
IncWr += StepWr;
if(IncWr >= StepSize)
{
IncWr -= StepSize;
pSrcPtr++;
}
}
IncWr = 0; // Secured
pIncPtr += IncH;
IncHr += StepHr;
if(IncHr >= StepSize)
{
IncHr -= StepSize;
pIncPtr += pSrcImg32->Width;
}
pSrcPtr = pIncPtr;
}
}
}
if(pSrcImg32->Width == m_Width)
{
if(pSrcImg32->Height < m_Height) // Scale bottom
{
for(int j = 0;j < m_Height;j++)
{
for(int i = 0;i < m_Width;i++) *Ptr++ = *pSrcPtr++;
IncHr += StepHr;
if(IncHr >= StepSize)
{
IncHr -= StepSize;
pIncPtr += pSrcImg32->Width;
}
pSrcPtr = pIncPtr;
}
}
else if(pSrcImg32->Height == m_Height) // Not scale
{
DWORD* Ptr2 = &m_pBits[m_Width*m_Height];
for(Ptr;Ptr < Ptr2;Ptr++) *Ptr = *pSrcPtr++;
}
else // Scale top
{
for(int j = 0;j < m_Height;j++)
{
for(int i = 0;i < m_Width;i++) *Ptr++ = *pSrcPtr++;
pIncPtr += IncH;
IncHr += StepHr;
if(IncHr >= StepSize)
{
IncHr -= StepSize;
pIncPtr += pSrcImg32->Width;
}
pSrcPtr = pIncPtr;
}
}
}
else
{
if(pSrcImg32->Height < m_Height) // Scale left and bottom
{
for(int j = 0;j < m_Height;j++)
{
for(int i = 0;i < m_Width;i++)
{
*Ptr++ = *pSrcPtr;
pSrcPtr += StepWl;
IncWr += StepWr;
if(IncWr >= StepSize)
{
IncWr -= StepSize;
pSrcPtr++;
}
}
IncWr = 0;
IncHr += StepHr;
if(IncHr >= StepSize)
{
IncHr -= StepSize;
pIncPtr += pSrcImg32->Width;
}
pSrcPtr = pIncPtr;
}
}
else if(pSrcImg32->Height == m_Height) // Only scale left
{
for(int j = 0;j < m_Height;j++)
{
for(int i = 0;i < m_Width;i++)
{
*Ptr++ = *pSrcPtr;
pSrcPtr += StepWl;
IncWr += StepWr;
if(IncWr >= StepSize)
{
IncWr -= StepSize;
pSrcPtr++;
}
}
IncWr = 0;
pIncPtr += pSrcImg32->Width;
pSrcPtr = pIncPtr;
}
}
else // Scale left and top
{
for(int j = 0;j < m_Height;j++)
{
for(int i = 0;i < m_Width;i++)
{
*Ptr++ = *pSrcPtr;
pSrcPtr += StepWl;
IncWr += StepWr;
if(IncWr >= StepSize)
{
IncWr -= StepSize;
pSrcPtr++;
}
}
IncWr = 0;
pIncPtr += IncH;
IncHr += StepHr;
if(IncHr >= StepSize)
{
IncHr -= StepSize;
pIncPtr += pSrcImg32->Width;
}
pSrcPtr = pIncPtr;
}
}
}
return 1;
}