?? picturecontrol.cpp
字號:
// PictureControl.cpp: implementation of the PictureControl class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "PictureControl.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
PictureControl::PictureControl()
{
}
PictureControl::~PictureControl()
{
}
int * PictureControl::CreateCoeffInt(int nLen, int nNewLen, BOOL bShrink)
{
int nSum = 0, nSum2;
int *pRes = new int[2 * nLen];
int *pCoeff = pRes;
int nNorm = (bShrink)
? (nNewLen << 12) / nLen : 0x1000;
int nDenom = (bShrink)? nLen : nNewLen;
::ZeroMemory(pRes, 2 * nLen * sizeof(int));
for(int i = 0; i < nLen; i++, pCoeff += 2)
{
nSum2 = nSum + nNewLen;
if(nSum2 > nLen)
{
*pCoeff = ((nLen - nSum) << 12) / nDenom;
pCoeff[1] = ((nSum2 - nLen) << 12) / nDenom;
nSum2 -= nLen;
}
else
{
*pCoeff = nNorm;
if(nSum2 == nLen)
{
pCoeff[1] = -1;
nSum2 = 0;
}
}
nSum = nSum2;
}
return pRes;
}
void PictureControl::ShrinkDataInt(BYTE *pInBuff, WORD wWidth, WORD wHeight, BYTE *pOutBuff, WORD wNewWidth, WORD wNewHeight)
{
BYTE *pLine = pInBuff, *pPix;
BYTE *pOutLine = pOutBuff;
DWORD dwInLn = (3 * wWidth + 3) & ~3;
DWORD dwOutLn = (3 * wNewWidth + 3) & ~3;
int x, y, i, ii;
BOOL bCrossRow, bCrossCol;
int *pRowCoeff = CreateCoeffInt(wWidth,
wNewWidth,
TRUE);
int *pColCoeff = CreateCoeffInt(wHeight,
wNewHeight,
TRUE);
int *pXCoeff, *pYCoeff = pColCoeff;
DWORD dwBuffLn = 3 * wNewWidth * sizeof(DWORD);
DWORD *pdwBuff = new DWORD[6 * wNewWidth];
DWORD *pdwCurrLn = pdwBuff,
*pdwCurrPix,
*pdwNextLn = pdwBuff + 3 * wNewWidth;
DWORD dwTmp, *pdwNextPix;
::ZeroMemory(pdwBuff, 2 * dwBuffLn);
y = 0;
while(y < wNewHeight)
{
pPix = pLine;
pLine += dwInLn;
pdwCurrPix = pdwCurrLn;
pdwNextPix = pdwNextLn;
x = 0;
pXCoeff = pRowCoeff;
bCrossRow = pYCoeff[1] > 0;
while(x < wNewWidth)
{
dwTmp = *pXCoeff * *pYCoeff;
for(i = 0; i < 3; i++)
pdwCurrPix[i] += dwTmp * pPix[i];
bCrossCol = pXCoeff[1] > 0;
if(bCrossCol)
{
dwTmp = pXCoeff[1] * *pYCoeff;
for(i = 0, ii = 3; i < 3; i++, ii++)
pdwCurrPix[ii] += dwTmp * pPix[i];
}
if(bCrossRow)
{
dwTmp = *pXCoeff * pYCoeff[1];
for(i = 0; i < 3; i++)
pdwNextPix[i] += dwTmp * pPix[i];
if(bCrossCol)
{
dwTmp = pXCoeff[1] * pYCoeff[1];
for(i = 0, ii = 3; i < 3; i++, ii++)
pdwNextPix[ii] += dwTmp * pPix[i];
}
}
if(pXCoeff[1])
{
x++;
pdwCurrPix += 3;
pdwNextPix += 3;
}
pXCoeff += 2;
pPix += 3;
}
if(pYCoeff[1])
{
// set result line
pdwCurrPix = pdwCurrLn;
pPix = pOutLine;
for(i = 3 * wNewWidth; i > 0; i--, pdwCurrPix++, pPix++)
*pPix = ((LPBYTE)pdwCurrPix)[3];
// prepare line buffers
pdwCurrPix = pdwNextLn;
pdwNextLn = pdwCurrLn;
pdwCurrLn = pdwCurrPix;
::ZeroMemory(pdwNextLn, dwBuffLn);
y++;
pOutLine += dwOutLn;
}
pYCoeff += 2;
}
delete [] pRowCoeff;
delete [] pColCoeff;
delete [] pdwBuff;
}
void PictureControl::EnlargeDataInt(BYTE *pInBuff, WORD wWidth, WORD wHeight, BYTE *pOutBuff, WORD wNewWidth, WORD wNewHeight)
{
BYTE *pLine = pInBuff,
*pPix = pLine,
*pPixOld,
*pUpPix,
*pUpPixOld;
BYTE *pOutLine = pOutBuff, *pOutPix;
DWORD dwInLn = (3 * wWidth + 3) & ~3;
DWORD dwOutLn = (3 * wNewWidth + 3) & ~3;
int x, y, i;
BOOL bCrossRow, bCrossCol;
int *pRowCoeff = CreateCoeffInt(wNewWidth,
wWidth,
FALSE);
int *pColCoeff = CreateCoeffInt(wNewHeight,
wHeight,
FALSE);
int *pXCoeff, *pYCoeff = pColCoeff;
DWORD dwTmp, dwPtTmp[3];
y = 0;
while(y < wHeight)
{
bCrossRow = pYCoeff[1] > 0;
x = 0;
pXCoeff = pRowCoeff;
pOutPix = pOutLine;
pOutLine += dwOutLn;
pUpPix = pLine;
if(pYCoeff[1])
{
y++;
pLine += dwInLn;
pPix = pLine;
}
while(x < wWidth)
{
bCrossCol = pXCoeff[1] > 0;
pUpPixOld = pUpPix;
pPixOld = pPix;
if(pXCoeff[1])
{
x++;
pUpPix += 3;
pPix += 3;
}
dwTmp = *pXCoeff * *pYCoeff;
for(i = 0; i < 3; i++)
dwPtTmp[i] = dwTmp * pUpPixOld[i];
if(bCrossCol)
{
dwTmp = pXCoeff[1] * *pYCoeff;
for(i = 0; i < 3; i++)
dwPtTmp[i] += dwTmp * pUpPix[i];
}
if(bCrossRow)
{
dwTmp = *pXCoeff * pYCoeff[1];
for(i = 0; i < 3; i++)
dwPtTmp[i] += dwTmp * pPixOld[i];
if(bCrossCol)
{
dwTmp = pXCoeff[1] * pYCoeff[1];
for(i = 0; i < 3; i++)
dwPtTmp[i] += dwTmp * pPix[i];
}
}
for(i = 0; i < 3; i++, pOutPix++)
*pOutPix = ((LPBYTE)(dwPtTmp + i))[3];
pXCoeff += 2;
}
pYCoeff += 2;
}
delete [] pRowCoeff;
delete [] pColCoeff;
}
void PictureControl::ConvertPath(CString &path)
{
LPTSTR lpsz = new TCHAR[path.GetLength()+1];
_tcscpy(lpsz,path);
int n=0,m=0;
LPTSTR ss,st;
for(ss=lpsz;ss[n]!='\0';n++) ;
ss=new TCHAR[n+80];
n=0;
while(lpsz[n]!='\0'){
if(lpsz[n]!='\\') {ss[m]=lpsz[n];m++;n++;}
else {ss[m]='\\';n++;ss[m+1]='\\';m+=2;}
}
ss[m]='\0';
st=lpsz;
lpsz=ss;
delete st;
path=lpsz;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -