mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 01:11:43 +08:00
4772 lines
183 KiB
C++
4772 lines
183 KiB
C++
#pragma once
|
||
|
||
#pragma comment(lib, "ippcorel.lib")
|
||
#pragma comment(lib, "ippiemerged.lib")
|
||
#pragma comment(lib, "ippimerged.lib")
|
||
#pragma comment(lib, "ippsemerged.lib")
|
||
#pragma comment(lib, "ippsmerged.lib")
|
||
#pragma comment(lib, "ippcvemerged.lib")
|
||
#pragma comment(lib, "ippcvmerged.lib")
|
||
|
||
#include <ippcore.h>
|
||
#include <ippdefs.h>
|
||
#include <ippi.h>
|
||
#include <ippcv.h>
|
||
#include <algorithm>
|
||
|
||
#include <ImagePaintComposeConstants.h>
|
||
|
||
#pragma warning(disable: 4244)
|
||
|
||
namespace ImageStudio
|
||
{
|
||
namespace Paint
|
||
{
|
||
namespace Compose
|
||
{
|
||
inline int AlphaBlend( int dst, int src, int alpha )
|
||
{
|
||
return ((src - dst) * alpha >> 8) + dst;
|
||
}
|
||
|
||
|
||
|
||
namespace Utility
|
||
{
|
||
class CGraduate
|
||
{
|
||
public:
|
||
|
||
CGraduate()
|
||
{
|
||
m_nSize = 0;
|
||
m_pGraduation = NULL;
|
||
}
|
||
virtual ~CGraduate()
|
||
{
|
||
Clear();
|
||
}
|
||
|
||
BOOL Clear()
|
||
{
|
||
if (m_pGraduation)
|
||
delete[] m_pGraduation;
|
||
|
||
m_pGraduation = NULL;
|
||
m_nSize = 0;
|
||
|
||
return TRUE;
|
||
}
|
||
BOOL Create(int nSize)
|
||
{
|
||
if (nSize < 1)
|
||
return Clear();
|
||
if (nSize == m_nSize)
|
||
return TRUE;
|
||
|
||
m_nSize = nSize;
|
||
m_pGraduation = new int[m_nSize];
|
||
|
||
if (NULL == m_pGraduation)
|
||
{
|
||
Clear();
|
||
return FALSE;
|
||
}
|
||
|
||
for (int index = 0; index < m_nSize; ++index)
|
||
m_pGraduation[index] = index;
|
||
|
||
CRandom rnd( 1 );
|
||
|
||
for (int index = 0; index < m_nSize; ++index)
|
||
{
|
||
int nSwapIndex = rnd.Rand( m_nSize );
|
||
int nSwapValue = m_pGraduation[nSwapIndex];
|
||
|
||
m_pGraduation[nSwapIndex] = m_pGraduation[index];
|
||
m_pGraduation[index] = nSwapValue;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
double GetLevel(int nIndex, double dFrame)
|
||
{
|
||
if (nIndex < 0 || nIndex >= m_nSize)
|
||
return 0;
|
||
if (dFrame <= 0)
|
||
return 0;
|
||
if (dFrame >= 1)
|
||
return 1;
|
||
|
||
double dLevel = m_nSize*dFrame;
|
||
|
||
if (dLevel <= m_pGraduation[nIndex])
|
||
return 0;
|
||
if (dLevel >= m_pGraduation[nIndex] + 1)
|
||
return 1;
|
||
return dLevel - m_pGraduation[nIndex];
|
||
}
|
||
protected:
|
||
|
||
int m_nSize;
|
||
int* m_pGraduation;
|
||
};
|
||
class CTetrisFigure
|
||
{
|
||
public:
|
||
CTetrisFigure()
|
||
{
|
||
m_nFigHeight = 0;
|
||
m_nFigWidth = 0;
|
||
m_nPicHeight = 0;
|
||
m_nPicWidth = 0;
|
||
m_nType = 0;
|
||
m_nXCoorSource = 0;
|
||
m_nYCoorSource = 0;
|
||
}
|
||
CTetrisFigure(int nFigWidth, int nFigHeight, int nType, BYTE* pBGRASource, int nPicWidth, int nPicHeight, int nXCoorSource, int nYCoorSource)
|
||
{
|
||
m_nFigHeight = nFigHeight;
|
||
m_nFigWidth = nFigWidth;
|
||
m_nType = nType;
|
||
m_nPicHeight = nPicHeight;
|
||
m_nPicWidth = nPicWidth;
|
||
m_pBGRASource = pBGRASource;
|
||
m_nXCoorSource = nXCoorSource;
|
||
m_nYCoorSource = nYCoorSource;
|
||
}
|
||
~CTetrisFigure()
|
||
{
|
||
}
|
||
|
||
private:
|
||
|
||
void DrawAlphaBlendingLine(BYTE* pBGRAResult, BYTE* pBGRASource, int nColor, int nNumLine, double dEffect)
|
||
{
|
||
int nAlpha = 7 * (1 << nNumLine) & 0xff;
|
||
nColor = nColor * nAlpha;
|
||
nAlpha = 255 - nAlpha;
|
||
|
||
if(1 == dEffect)
|
||
{
|
||
pBGRAResult[0] = (nColor + pBGRASource[0] *nAlpha) * 0x8081U >> (7 + 16);
|
||
pBGRAResult[1] = (nColor + pBGRASource[1] *nAlpha) * 0x8081U >> (7 + 16);
|
||
pBGRAResult[2] = (nColor + pBGRASource[2] *nAlpha) * 0x8081U >> (7 + 16);
|
||
}
|
||
else
|
||
{
|
||
double factor = 1 - dEffect;
|
||
pBGRAResult[0] = dEffect * ((nColor + pBGRASource[0] *nAlpha) * 0x8081U >> (7 + 16)) + pBGRASource[0] * factor;
|
||
pBGRAResult[1] = dEffect * ((nColor + pBGRASource[1] *nAlpha) * 0x8081U >> (7 + 16)) + pBGRASource[1] * factor;
|
||
pBGRAResult[2] = dEffect * ((nColor + pBGRASource[2] *nAlpha) * 0x8081U >> (7 + 16)) + pBGRASource[2] * factor;
|
||
|
||
}
|
||
pBGRAResult[3] = pBGRASource[3];
|
||
}
|
||
|
||
public:
|
||
|
||
void SetValue(int nFigWidth, int nFigHeight, int nType, BYTE* pBGRASource, int nPicWidth, int nPicHeight, int nXCoorSource, int nYCoorSource)
|
||
{
|
||
m_nFigHeight = nFigHeight;
|
||
m_nFigWidth = nFigWidth;
|
||
m_nType = nType;
|
||
m_nPicHeight = nPicHeight;
|
||
m_nPicWidth = nPicWidth;
|
||
m_pBGRASource = pBGRASource;
|
||
m_nXCoorSource = nXCoorSource;
|
||
m_nYCoorSource = nYCoorSource;
|
||
}
|
||
|
||
BOOL Cpy(BYTE* pBGRAResult, int nXCoorResult, int nYCoorResult, int nWidth, int nHeight, double dEffect)
|
||
{
|
||
if(!pBGRAResult || nWidth != m_nPicWidth || nHeight != m_nPicHeight)
|
||
return FALSE;
|
||
|
||
BYTE* pSource = m_pBGRASource;
|
||
BYTE* pResultBuffer = new BYTE[ 4 * nWidth * ( 2 * nHeight)];
|
||
BYTE* pResultBufferCurent = pResultBuffer;
|
||
pResultBufferCurent += 4 * nWidth * nHeight;
|
||
BYTE* pResultBufferMiddle = pResultBufferCurent;
|
||
BYTE* pResult = pBGRAResult;
|
||
|
||
IppiSize roiSize = { nWidth, nHeight};
|
||
|
||
::memcpy(pResultBufferMiddle, pResult, 4 * nWidth * nHeight);
|
||
//ippiCopy_8u_C4R( pResult, 4 * nWidth, pResultBufferMiddle, 4 * nWidth, roiSize);
|
||
|
||
pSource += m_nYCoorSource * nWidth * 4;
|
||
pResultBufferCurent += nYCoorResult * nWidth * 4;
|
||
|
||
if (1 == m_nType)
|
||
{
|
||
for(int nYIndex = nYCoorResult; nYIndex < min(nHeight, nYCoorResult + m_nFigHeight); nYIndex++)
|
||
{
|
||
pSource += m_nXCoorSource*4;
|
||
pResultBufferCurent += nXCoorResult*4;
|
||
|
||
int nXIndex = nXCoorResult;
|
||
|
||
for(; nXIndex < min(nWidth, nXCoorResult + m_nFigWidth); nXIndex++)
|
||
{
|
||
if( nYCoorResult + 5 >= nYIndex &&
|
||
( nXIndex >= nXCoorResult + ( nYIndex - nYCoorResult) && nXIndex <= min( nWidth, nXCoorResult + m_nFigWidth) - ( nYIndex - nYCoorResult)) &&
|
||
0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine(pResultBufferCurent, pSource, 0, nYCoorResult + 5 - nYIndex, dEffect);
|
||
}
|
||
else if( min( nWidth, nXCoorResult + m_nFigWidth) - 5 <= nXIndex &&
|
||
( nYIndex >= nYCoorResult + ( min( nWidth, nXCoorResult + m_nFigWidth) - nXIndex) && nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight) - ( min( nWidth, nXCoorResult + m_nFigWidth) - nXIndex)) &&
|
||
0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nXIndex - ( min( nWidth, nXCoorResult + m_nFigWidth) - 5), dEffect);
|
||
}
|
||
else if( min( nHeight, nYCoorResult + m_nFigHeight) - 5 <= nYIndex &&
|
||
( nXIndex >= nXCoorResult + ( min( nHeight, nYCoorResult + m_nFigHeight) - nYIndex) && nXIndex <= min(nWidth, nXCoorResult + m_nFigWidth) - (min(nHeight, nYCoorResult + m_nFigHeight) - nYIndex)) &&
|
||
0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine(pResultBufferCurent, pSource, 255, nYIndex - (min(nHeight, nYCoorResult + m_nFigHeight) - 5), dEffect);
|
||
}
|
||
else if( nXCoorResult + 5 >= nXIndex &&
|
||
( nYIndex >= nYCoorResult + ( nXIndex - nXCoorResult) && nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight) - ( nXIndex - nXCoorResult)) &&
|
||
0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine(pResultBufferCurent, pSource, 255, nXCoorResult + 5 - nXIndex, dEffect);
|
||
}
|
||
else
|
||
{
|
||
memcpy(pResultBufferCurent, pSource, 4);
|
||
}
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
for(; nXIndex < nWidth; nXIndex++)
|
||
{
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
|
||
}
|
||
}
|
||
else if(2 == m_nType)
|
||
{
|
||
int nYIndex = nYCoorResult;
|
||
|
||
for(; nYIndex < min(nHeight, nYCoorResult + m_nFigHeight/2); nYIndex++)
|
||
{
|
||
pSource += m_nXCoorSource * 4;
|
||
pResultBufferCurent += nXCoorResult * 4;
|
||
|
||
int nXIndex = nXCoorResult;
|
||
|
||
for(; nXIndex < min( nWidth, nXCoorResult + m_nFigWidth); nXIndex++)
|
||
{
|
||
if( nYCoorResult + 5 >= nYIndex &&
|
||
( nXIndex >= nXCoorResult + ( nYIndex - nYCoorResult) && nXIndex <= min( nWidth, nXCoorResult + m_nFigWidth) - ( nYIndex - nYCoorResult)) &&
|
||
0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nYCoorResult + 5 - nYIndex, dEffect);
|
||
}
|
||
else if( min(nWidth, nXCoorResult + m_nFigWidth) - 5 <= nXIndex &&
|
||
( nYIndex >= nYCoorResult + ( min(nWidth, nXCoorResult + m_nFigWidth) - nXIndex) && nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight / 2) - ( min( nWidth, nXCoorResult + m_nFigWidth) - nXIndex)) &&
|
||
0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nXIndex - ( min( nWidth, nXCoorResult + m_nFigWidth) - 5), dEffect);
|
||
}
|
||
else if( min( nHeight, nYCoorResult + m_nFigHeight / 2) - 5 <= nYIndex &&
|
||
( ( nXIndex <= nXCoorResult + m_nFigWidth / 3 - ( min( nHeight, nYCoorResult + m_nFigHeight / 2) - nYIndex) && nXIndex >= nXCoorResult + ( min( nHeight, nYCoorResult + m_nFigHeight / 2) - nYIndex)) ||
|
||
( nXIndex >= nXCoorResult + 2 * m_nFigWidth / 3 + ( min( nHeight, nYCoorResult + m_nFigHeight / 2) - nYIndex) && nXIndex <= min( nWidth, nXCoorResult + m_nFigWidth) - ( min( nHeight, nYCoorResult + m_nFigHeight / 2) - nYIndex))) &&
|
||
0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nYIndex - (min(nHeight, nYCoorResult + m_nFigHeight/2) - 5), dEffect);
|
||
}
|
||
else if( nXCoorResult + 5 >= nXIndex &&
|
||
( nYIndex >= nYCoorResult + ( nXIndex - nXCoorResult) && nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight / 2) - ( nXIndex - nXCoorResult)) &&
|
||
0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nXCoorResult + 5 - nXIndex, dEffect);
|
||
}
|
||
else
|
||
{
|
||
memcpy(pResultBufferCurent, pSource, 4);
|
||
}
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
for(; nXIndex < nWidth; nXIndex++)
|
||
{
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
|
||
}
|
||
for(; nYIndex < min(nHeight, nYCoorResult + m_nFigHeight); nYIndex++)
|
||
{
|
||
pSource += 4 * ( m_nXCoorSource + m_nFigWidth / 3);
|
||
pResultBufferCurent += 4 * ( nXCoorResult + m_nFigWidth / 3);
|
||
|
||
int nXIndex = nXCoorResult + m_nFigWidth / 3;
|
||
|
||
for(; nXIndex < min( nWidth, nXCoorResult + 2 * m_nFigWidth / 3); nXIndex++)
|
||
{
|
||
if
|
||
( min( nWidth, nXCoorResult + 2 * m_nFigWidth / 3) - 5 <= nXIndex
|
||
&& ( nYIndex >= nYCoorResult + m_nFigHeight / 2 + ( min( nWidth, nXCoorResult + 2 * m_nFigWidth / 3) - nXIndex)
|
||
&& nYIndex <= min( nWidth, nXCoorResult + 2 * m_nFigWidth / 3) - ( min( nWidth, nXCoorResult + 2 * m_nFigWidth / 3) - nXIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nXIndex - (min(nWidth, nXCoorResult + 2*m_nFigWidth/3)- 5), dEffect);
|
||
}
|
||
else if
|
||
( min( nHeight, nYCoorResult + m_nFigHeight) - 5 <= nYIndex
|
||
&& ( nXIndex >= nXCoorResult + m_nFigWidth / 3 + ( min( nHeight, nYCoorResult + m_nFigHeight) - nYIndex)
|
||
&& nXIndex <= min( nWidth, nXCoorResult + 2 * m_nFigWidth / 3) - ( min( nHeight, nYCoorResult + m_nFigHeight) - nYIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nYIndex - (min(nHeight, nYCoorResult + m_nFigHeight) - 5), dEffect);
|
||
}
|
||
else if
|
||
( nXCoorResult + m_nFigWidth / 3 + 5 >= nXIndex
|
||
&& ( nYIndex >= nYCoorResult + m_nFigHeight / 2 + ( nXIndex - ( nXCoorResult + m_nFigWidth / 3))
|
||
&& nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight) - ( nXIndex - ( nXCoorResult + m_nFigWidth / 3)))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nXCoorResult + m_nFigWidth/3 + 5 - nXIndex, dEffect);
|
||
}
|
||
else
|
||
{
|
||
memcpy( pResultBufferCurent, pSource, 4);
|
||
}
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
for(; nXIndex < nWidth; nXIndex++)
|
||
{
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
else if(3 == m_nType)
|
||
{
|
||
int nYIndex = nYCoorResult;
|
||
|
||
for(; nYIndex < min( nHeight, nYCoorResult + m_nFigHeight / 3); nYIndex++)
|
||
{
|
||
pSource += m_nXCoorSource * 4;
|
||
pResultBufferCurent += nXCoorResult * 4;
|
||
|
||
int nXIndex = nXCoorResult;
|
||
|
||
for(; nXIndex < min( nWidth, nXCoorResult + m_nFigWidth / 2); nXIndex++)
|
||
{
|
||
if ( nYCoorResult + 5 >= nYIndex
|
||
&& ( nXIndex >= nXCoorResult + ( nYIndex - nYCoorResult) && nXIndex <= min( nWidth, nXCoorResult + m_nFigWidth / 2) - ( nYIndex - nYCoorResult))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nYCoorResult + 5 - nYIndex, dEffect);
|
||
}
|
||
else if
|
||
( min(nWidth, nXCoorResult + m_nFigWidth / 2) - 5 <= nXIndex &&
|
||
( nYIndex >= nYCoorResult + ( min( nWidth, nXCoorResult + m_nFigWidth / 2) - nXIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nXIndex - ( min( nWidth, nXCoorResult + m_nFigWidth / 2) - 5), dEffect);
|
||
}
|
||
else if
|
||
( nXCoorResult + 5 >= nXIndex &&
|
||
( nYIndex >= nYCoorResult + ( nXIndex - nXCoorResult) && nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight / 3) - ( nXIndex - nXCoorResult))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nXCoorResult + 5 - nXIndex, dEffect);
|
||
}
|
||
else
|
||
{
|
||
memcpy( pResultBufferCurent, pSource, 4);
|
||
}
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
for(; nXIndex < nWidth; nXIndex++)
|
||
{
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
|
||
}
|
||
for(; nYIndex < min(nHeight, nYCoorResult + 2 * m_nFigHeight / 3); nYIndex++)
|
||
{
|
||
pSource += 4 * m_nXCoorSource;
|
||
pResultBufferCurent += 4 * nXCoorResult;
|
||
|
||
int nXIndex = nXCoorResult;
|
||
|
||
for(; nXIndex < min( nWidth, nXCoorResult + m_nFigWidth); nXIndex++)
|
||
{
|
||
if ( nYCoorResult + m_nFigHeight / 3 + 5 >= nYIndex &&
|
||
( nXIndex <= nXCoorResult + m_nFigWidth - ( nYIndex - nYCoorResult - m_nFigHeight / 3) && nXIndex >= nXCoorResult + m_nFigWidth / 2 + ( nYIndex - nYCoorResult - m_nFigHeight / 3))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nYCoorResult + m_nFigHeight / 3 + 5 - nYIndex, dEffect);
|
||
}
|
||
else if
|
||
( min( nWidth, nXCoorResult + m_nFigWidth) - 5 <= nXIndex &&
|
||
( nYIndex >= nYCoorResult + m_nFigHeight / 3 + ( min( nWidth, nXCoorResult + m_nFigWidth) - nXIndex) && nYIndex <= min( nHeight, nYCoorResult + 2 * m_nFigHeight / 3) - ( min( nWidth, nXCoorResult + m_nFigWidth) - nXIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine(pResultBufferCurent, pSource, 0, nXIndex - (min(nWidth, nXCoorResult + m_nFigWidth) - 5), dEffect);
|
||
}
|
||
else if
|
||
( ( min( nHeight, nYCoorResult + 2 * m_nFigHeight / 3) - 5 <= nYIndex) &&
|
||
( nXIndex <= nXCoorResult + m_nFigWidth - ( min( nHeight, nYCoorResult + 2 * m_nFigHeight / 3) - nYIndex) && nXIndex >= nXCoorResult + m_nFigWidth / 2 + ( min( nHeight, nYCoorResult + 2 * m_nFigHeight / 3) - nYIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nYIndex - (min(nHeight, nYCoorResult + 2*m_nFigHeight/3) - 5), dEffect);
|
||
}
|
||
else if( nXCoorResult + 5 >= nXIndex && 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nXCoorResult + 5 - nXIndex, dEffect);
|
||
}
|
||
else
|
||
{
|
||
memcpy( pResultBufferCurent, pSource, 4);
|
||
}
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
for(; nXIndex < nWidth; nXIndex++)
|
||
{
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
|
||
}
|
||
for(; nYIndex < min( nHeight, nYCoorResult + m_nFigHeight); nYIndex++)
|
||
{
|
||
pSource += 4 * m_nXCoorSource;
|
||
pResultBufferCurent += 4 * nXCoorResult;
|
||
|
||
int nXIndex = nXCoorResult;
|
||
|
||
for(; nXIndex < min( nWidth, nXCoorResult + m_nFigWidth / 2); nXIndex++)
|
||
{
|
||
if( min( nHeight, nYCoorResult + m_nFigHeight) - 5 <= nYIndex &&
|
||
( nXIndex >= nXCoorResult + ( min( nHeight, nYCoorResult + m_nFigHeight) - nYIndex) && nXIndex <= nXCoorResult + m_nFigWidth / 2 - ( min( nHeight, nYCoorResult + m_nFigHeight) - nYIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nYIndex - (min(nHeight, nYCoorResult + m_nFigHeight) - 5), dEffect);
|
||
}
|
||
else if( min(nWidth, nXCoorResult + m_nFigWidth / 2) - 5 <= nXIndex &&
|
||
( nYIndex >= nYCoorResult + 2 * m_nFigHeight / 3 + ( min( nWidth, nXCoorResult + m_nFigWidth / 2) - nXIndex) && nYIndex <= nYCoorResult + m_nFigHeight - ( min( nWidth, nXCoorResult + m_nFigWidth / 2) - nXIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nXIndex - ( min( nWidth, nXCoorResult + m_nFigWidth/2) - 5), dEffect);
|
||
}
|
||
else if( nXCoorResult + 5 >= nXIndex &&
|
||
nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight) - ( nXIndex - nXCoorResult)
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nXCoorResult + 5 - nXIndex, dEffect);
|
||
}
|
||
else
|
||
{
|
||
memcpy( pResultBufferCurent, pSource, 4);
|
||
}
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
for(; nXIndex < nWidth; nXIndex++)
|
||
{
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
else if(4 == m_nType)
|
||
{
|
||
int nYIndex = nYCoorResult;
|
||
|
||
for(; nYIndex < min( nHeight, nYCoorResult + m_nFigHeight / 3); nYIndex++)
|
||
{
|
||
pSource += 4 * ( m_nXCoorSource + m_nFigWidth / 2);
|
||
pResultBufferCurent += 4 * ( nXCoorResult + m_nFigWidth / 2);
|
||
|
||
int nXIndex = nXCoorResult + m_nFigWidth / 2;
|
||
|
||
for(; nXIndex < min( nWidth, nXCoorResult + m_nFigWidth); nXIndex++)
|
||
{
|
||
if ( nYCoorResult + 5 >= nYIndex &&
|
||
( nXIndex >= nXCoorResult + m_nFigWidth/2 + ( nYIndex - nYCoorResult) && nXIndex <= min( nWidth, nXCoorResult + m_nFigWidth) - ( nYIndex - nYCoorResult))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nYCoorResult + 5 - nYIndex, dEffect);
|
||
}
|
||
else if
|
||
( min( nWidth, nXCoorResult + m_nFigWidth) - 5 <= nXIndex &&
|
||
( nYIndex >= nYCoorResult + ( min( nWidth, nXCoorResult + m_nFigWidth) - nXIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nXIndex - ( min( nWidth, nXCoorResult + m_nFigWidth) - 5), dEffect);
|
||
}
|
||
else if
|
||
( nXCoorResult + m_nFigWidth / 2 + 5 >= nXIndex &&
|
||
( nYIndex >= nYCoorResult + ( nXIndex - nXCoorResult - m_nFigWidth / 2) && nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight / 3) - ( nXIndex - nXCoorResult - m_nFigWidth / 2))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nXCoorResult + m_nFigWidth/2 + 5 - nXIndex, dEffect);
|
||
}
|
||
else
|
||
{
|
||
memcpy( pResultBufferCurent, pSource, 4);
|
||
}
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
for(; nXIndex < nWidth; nXIndex++)
|
||
{
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
|
||
}
|
||
for(; nYIndex < min(nHeight, nYCoorResult + 2 * m_nFigHeight / 3); nYIndex++)
|
||
{
|
||
pSource += 4 * m_nXCoorSource;
|
||
pResultBufferCurent += 4 * nXCoorResult;
|
||
|
||
int nXIndex = nXCoorResult;
|
||
|
||
for(; nXIndex < min( nWidth, nXCoorResult + m_nFigWidth); nXIndex++)
|
||
{
|
||
if( nYCoorResult + m_nFigHeight / 3 + 5 >= nYIndex &&
|
||
( nXIndex <= nXCoorResult + m_nFigWidth / 2 - ( nYIndex - nYCoorResult - m_nFigHeight / 3) && nXIndex >= nXCoorResult + ( nYIndex - nYCoorResult - m_nFigHeight / 3))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nYCoorResult + m_nFigHeight / 3 + 5 - nYIndex, dEffect);
|
||
}
|
||
else if( min(nWidth, nXCoorResult + m_nFigWidth) - 5 <= nXIndex && 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nXIndex - (min(nWidth, nXCoorResult + m_nFigWidth) - 5), dEffect);
|
||
}
|
||
else if( ( min( nHeight, nYCoorResult + 2 * m_nFigHeight / 3) - 5 <= nYIndex) &&
|
||
( nXIndex <= nXCoorResult + m_nFigWidth / 2 - ( min( nHeight, nYCoorResult + 2 * m_nFigHeight / 3) - nYIndex) && nXIndex >= nXCoorResult + ( min( nHeight, nYCoorResult + 2 * m_nFigHeight / 3) - nYIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nYIndex - ( min( nHeight, nYCoorResult + 2 * m_nFigHeight / 3) - 5), dEffect);
|
||
}
|
||
else if( nXCoorResult + 5 >= nXIndex &&
|
||
( nYIndex >= nYCoorResult + m_nFigHeight / 3 + ( nXIndex - nXCoorResult) && nYIndex <= min( nHeight, nYCoorResult + 2 * m_nFigHeight / 3) - ( nXIndex - nXCoorResult))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nXCoorResult + 5 - nXIndex, dEffect);
|
||
}
|
||
else
|
||
{
|
||
memcpy( pResultBufferCurent, pSource, 4);
|
||
}
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
for(; nXIndex < nWidth; nXIndex++)
|
||
{
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
|
||
}
|
||
for(; nYIndex < min( nHeight, nYCoorResult + m_nFigHeight); nYIndex++)
|
||
{
|
||
pSource += 4 * ( m_nXCoorSource + m_nFigWidth / 2);
|
||
pResultBufferCurent += 4 * ( nXCoorResult + m_nFigWidth / 2);
|
||
|
||
int nXIndex = nXCoorResult + m_nFigWidth / 2;
|
||
|
||
for(; nXIndex < min( nWidth, nXCoorResult + m_nFigWidth); nXIndex++)
|
||
{
|
||
if( min( nHeight, nYCoorResult + m_nFigHeight) - 5 <= nYIndex &&
|
||
( nXIndex >= nXCoorResult + m_nFigWidth / 2 + ( min( nHeight, nYCoorResult + m_nFigHeight) - nYIndex) && nXIndex <= nXCoorResult + m_nFigWidth - ( min( nHeight, nYCoorResult + m_nFigHeight) - nYIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nYIndex - ( nYCoorResult + m_nFigHeight - 5), dEffect);
|
||
}
|
||
else if( min(nWidth, nXCoorResult + m_nFigWidth) - 5 <= nXIndex &&
|
||
nYIndex <= min( nWidth, nXCoorResult + m_nFigWidth) - ( min( nWidth, nXCoorResult + m_nFigWidth) - nXIndex)
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nXIndex - ( min( nWidth, nXCoorResult + m_nFigWidth) - 5), dEffect);
|
||
}
|
||
else if( nXCoorResult + m_nFigWidth / 2 + 5 >= nXIndex &&
|
||
( nYIndex >= nYCoorResult + 2 * m_nFigHeight / 3 + ( nXIndex - nXCoorResult - m_nFigWidth / 2) && nYIndex <= nYCoorResult + m_nFigHeight - ( nXIndex - nXCoorResult - m_nFigWidth / 2))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine(pResultBufferCurent, pSource, 255, nXCoorResult + m_nFigWidth/2 + 5 - nXIndex, dEffect);
|
||
}
|
||
else
|
||
{
|
||
memcpy( pResultBufferCurent, pSource, 4);
|
||
}
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
for(; nXIndex < nWidth; nXIndex++)
|
||
{
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
else if(5 == m_nType)
|
||
{
|
||
int nYIndex = nYCoorResult;
|
||
|
||
for(; nYIndex < min( nHeight, nYCoorResult + m_nFigHeight / 2); nYIndex++)
|
||
{
|
||
pSource += 4 * ( m_nXCoorSource + m_nFigWidth / 3);
|
||
pResultBufferCurent += 4 * ( nXCoorResult + m_nFigWidth / 3);
|
||
|
||
int nXIndex = nXCoorResult + m_nFigWidth / 3;
|
||
|
||
for(; nXIndex < min( nWidth, nXCoorResult + 2 * m_nFigWidth / 3); nXIndex++)
|
||
{
|
||
if( nYCoorResult + 5 >= nYIndex &&
|
||
( nXIndex >= nXCoorResult + m_nFigWidth / 3 + ( nYIndex - nYCoorResult) && nXIndex <= min( nWidth, nXCoorResult + 2 * m_nFigWidth / 3) - ( nYIndex - nYCoorResult))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nYCoorResult + 5 - nYIndex, dEffect);
|
||
}
|
||
else if( min(nWidth, nXCoorResult + 2 * m_nFigWidth / 3) - 5 <= nXIndex &&
|
||
( nYIndex >= nYCoorResult + ( min( nWidth, nXCoorResult + 2 * m_nFigWidth / 3) - nXIndex) && nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight / 2) - ( min( nWidth, nXCoorResult + 2 * m_nFigWidth / 3) - nXIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nXIndex - ( min( nWidth, nXCoorResult + 2 * m_nFigWidth / 3) - 5), dEffect);
|
||
}
|
||
else if( nXCoorResult + m_nFigWidth / 3 + 5 >= nXIndex &&
|
||
( nYIndex >= nYCoorResult + ( nXIndex - nXCoorResult - m_nFigWidth / 3) && nYIndex <= min( nHeight, nYCoorResult + 2 * m_nFigHeight / 3) - ( nXIndex - nXCoorResult - m_nFigWidth / 3))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nXCoorResult + m_nFigWidth / 3 + 5 - nXIndex, dEffect);
|
||
}
|
||
else
|
||
{
|
||
memcpy( pResultBufferCurent, pSource, 4);
|
||
}
|
||
pResultBufferCurent += 4; pSource += 4;
|
||
}
|
||
for(; nXIndex < nWidth; nXIndex++)
|
||
{
|
||
pResultBufferCurent += 4; pSource += 4;
|
||
}
|
||
|
||
}
|
||
for(; nYIndex < min(nHeight, nYCoorResult + m_nFigHeight); nYIndex++)
|
||
{
|
||
pSource += 4 * m_nXCoorSource;
|
||
pResultBufferCurent += 4 * nXCoorResult;
|
||
|
||
int nXIndex = nXCoorResult;
|
||
|
||
for(; nXIndex < min( nWidth, nXCoorResult + m_nFigWidth); nXIndex++)
|
||
{
|
||
if( nYCoorResult + m_nFigHeight / 2 + 5 >= nYIndex &&
|
||
( ( nXIndex >= nXCoorResult + ( nYIndex - nYCoorResult - m_nFigHeight / 2) && nXIndex <= nXCoorResult + m_nFigWidth / 3 - ( nYIndex - nYCoorResult - m_nFigHeight / 2))
|
||
|| nXIndex >= nXCoorResult + 2 * m_nFigWidth / 3 + ( nYIndex - nYCoorResult - m_nFigHeight / 2) && nXIndex <= min( nWidth, nXCoorResult + m_nFigWidth) - ( nYIndex - nYCoorResult - m_nFigHeight / 2))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nYCoorResult + m_nFigHeight / 2 + 5 - nYIndex, dEffect);
|
||
}
|
||
else if( min( nWidth, nXCoorResult + m_nFigWidth) - 5 <= nXIndex &&
|
||
( nYIndex >= nYCoorResult + m_nFigHeight / 2 + ( min( nWidth, nXCoorResult + m_nFigWidth) - nXIndex) && nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight) - ( min( nWidth, nXCoorResult + m_nFigWidth) - nXIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nXIndex - ( min( nWidth, nXCoorResult + m_nFigWidth) - 5), dEffect);
|
||
}
|
||
else if( min( nHeight, nYCoorResult + m_nFigHeight) - 5 <= nYIndex &&
|
||
( nXIndex <= min( nWidth, nXCoorResult + m_nFigWidth) + ( min( nHeight, nYCoorResult + m_nFigHeight) - nYIndex) && nXIndex >= nXCoorResult + ( min( nHeight, nYCoorResult + m_nFigHeight) - nYIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nYIndex - ( min( nHeight, nYCoorResult + m_nFigHeight) - 5), dEffect);
|
||
}
|
||
else if( nXCoorResult + 5 >= nXIndex &&
|
||
( nYIndex >= nYCoorResult + m_nFigHeight / 2 + ( nXIndex - nXCoorResult) && nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight) - ( nXIndex - nXCoorResult))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nXCoorResult + 5 - nXIndex, dEffect);
|
||
}
|
||
else
|
||
{
|
||
memcpy( pResultBufferCurent, pSource, 4);
|
||
}
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
for(; nXIndex < nWidth; nXIndex++)
|
||
{
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
else if(6 == m_nType)
|
||
{
|
||
int nYIndex = nYCoorResult;
|
||
|
||
for(; nYIndex < min( nHeight, nYCoorResult + m_nFigHeight / 3); nYIndex++)
|
||
{
|
||
pSource += 4 * m_nXCoorSource;
|
||
pResultBufferCurent += 4 * nXCoorResult;
|
||
|
||
int nXIndex = nXCoorResult;
|
||
|
||
for(; nXIndex < min( nWidth, nXCoorResult + m_nFigWidth); nXIndex++)
|
||
{
|
||
if( nYCoorResult + 5 >= nYIndex &&
|
||
(nXIndex >= nXCoorResult + ( nYIndex - nYCoorResult) && nXIndex <= min( nWidth, nXCoorResult + m_nFigWidth) - ( nYIndex - nYCoorResult))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nYCoorResult + 5 - nYIndex, dEffect);
|
||
}
|
||
else if( min(nWidth, nXCoorResult + m_nFigWidth) - 5 <= nXIndex &&
|
||
( nYIndex >= nYCoorResult + ( min( nWidth, nXCoorResult + m_nFigWidth) - nXIndex) && nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight / 3) - ( min( nWidth, nXCoorResult + m_nFigWidth) - nXIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nXIndex - ( min( nWidth, nXCoorResult + m_nFigWidth) - 5), dEffect);
|
||
}
|
||
else if( min( nHeight, nYCoorResult + m_nFigHeight / 3) - 5 <= nYIndex &&
|
||
( nXIndex >= nXCoorResult + m_nFigWidth / 2 + ( min( nHeight, nYCoorResult + m_nFigHeight / 3) - nYIndex) && nXIndex <= min( nWidth, nXCoorResult + m_nFigWidth) - ( min( nHeight, nYCoorResult + m_nFigHeight / 3) - nYIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nYIndex - ( min( nHeight, nYCoorResult + m_nFigHeight / 3) - 5), dEffect);
|
||
}
|
||
else if( nXCoorResult + 5 >= nXIndex &&
|
||
nYIndex >= nYCoorResult + ( nXIndex - nXCoorResult)
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nXCoorResult + 5 - nXIndex, dEffect);
|
||
}
|
||
else
|
||
{
|
||
memcpy( pResultBufferCurent, pSource, 4);
|
||
}
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
for(; nXIndex < nWidth; nXIndex++)
|
||
{
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
|
||
}
|
||
for(; nYIndex < min( nHeight, nYCoorResult + m_nFigHeight); nYIndex++)
|
||
{
|
||
pSource += 4 * m_nXCoorSource;
|
||
pResultBufferCurent += 4 * nXCoorResult;
|
||
|
||
int nXIndex = nXCoorResult;
|
||
|
||
for(; nXIndex < min( nWidth, nXCoorResult + m_nFigWidth / 2); nXIndex++)
|
||
{
|
||
if( min( nWidth, nXCoorResult + m_nFigWidth / 2) - 5 <= nXIndex &&
|
||
( nYIndex >= nYCoorResult + m_nFigHeight / 3 + ( min( nWidth, nXCoorResult + m_nFigWidth / 2) - nXIndex) && nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight) - ( min( nWidth, nXCoorResult + m_nFigWidth / 2) - nXIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nXIndex - ( min( nWidth, nXCoorResult + m_nFigWidth / 2) - 5), dEffect);
|
||
}
|
||
else if( min( nHeight, nYCoorResult + m_nFigHeight) - 5 <= nYIndex &&
|
||
( nXIndex >= nXCoorResult + ( min( nHeight, nYCoorResult + m_nFigHeight) - nYIndex) && nXIndex <= min( nWidth, nXCoorResult + m_nFigWidth / 2) - ( min( nHeight, nYCoorResult + m_nFigHeight) - nYIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nYIndex - ( min( nHeight, nYCoorResult + m_nFigHeight) - 5), dEffect);
|
||
}
|
||
else if( nXCoorResult + 5 >= nXIndex &&
|
||
nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight) - ( nXIndex - nXCoorResult)
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nXCoorResult + 5 - nXIndex, dEffect);
|
||
}
|
||
else
|
||
{
|
||
memcpy( pResultBufferCurent, pSource, 4);
|
||
}
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
for(; nXIndex < nWidth; nXIndex++)
|
||
{
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
else if(7 == m_nType)
|
||
{
|
||
int nYIndex = nYCoorResult;
|
||
|
||
for(; nYIndex < min( nHeight, nYCoorResult + m_nFigHeight / 2); nYIndex++)
|
||
{
|
||
pSource += 4 * m_nXCoorSource;
|
||
pResultBufferCurent += 4 * nXCoorResult;
|
||
|
||
int nXIndex = nXCoorResult;
|
||
|
||
for(; nXIndex < min( nWidth, nXCoorResult + m_nFigWidth / 3); nXIndex++)
|
||
{
|
||
if( nYCoorResult + 5 >= nYIndex &&
|
||
( nXIndex >= nXCoorResult + ( nYIndex - nYCoorResult) && nXIndex <= min( nWidth, nXCoorResult + m_nFigWidth / 3) - ( nYIndex - nYCoorResult))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nYCoorResult + 5 - nYIndex, dEffect);
|
||
}
|
||
else if( min( nWidth, nXCoorResult + m_nFigWidth / 3) - 5 <= nXIndex &&
|
||
( nYIndex >= nYCoorResult + ( min( nWidth, nXCoorResult + m_nFigWidth / 3) - nXIndex) && nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight / 2) - ( min( nWidth, nXCoorResult + m_nFigWidth / 3) - nXIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nXIndex - ( min( nWidth, nXCoorResult + m_nFigWidth / 3) - 5), dEffect);
|
||
}
|
||
else if( nXCoorResult + 5 >= nXIndex &&
|
||
nYIndex >= nYCoorResult + ( nXIndex - nXCoorResult)
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nXCoorResult + 5 - nXIndex, dEffect);
|
||
}
|
||
else
|
||
{
|
||
memcpy( pResultBufferCurent, pSource, 4);
|
||
}
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
for(; nXIndex < nWidth; nXIndex++)
|
||
{
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
|
||
}
|
||
for(; nYIndex < min( nHeight, nYCoorResult + m_nFigHeight); nYIndex++)
|
||
{
|
||
pSource += 4 * m_nXCoorSource;
|
||
pResultBufferCurent += 4 * nXCoorResult;
|
||
|
||
int nXIndex = nXCoorResult;
|
||
|
||
for(; nXIndex < min( nWidth, nXCoorResult + m_nFigWidth); nXIndex++)
|
||
{
|
||
if( min( nWidth, nXCoorResult + m_nFigWidth) - 5 <= nXIndex &&
|
||
( nYIndex >= nYCoorResult + m_nFigHeight / 2 + ( min( nWidth, nXCoorResult + m_nFigWidth) - nXIndex) && nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight) - ( min( nWidth, nXCoorResult + m_nFigWidth) - nXIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nXIndex - ( min( nWidth, nXCoorResult + m_nFigWidth) - 5), dEffect);
|
||
}
|
||
else if( min( nHeight, nYCoorResult + m_nFigHeight) - 5 <= nYIndex &&
|
||
( nXIndex >= nXCoorResult + ( min( nHeight, nYCoorResult + m_nFigHeight) - nYIndex) && nXIndex <= min( nWidth, nXCoorResult + m_nFigWidth) - ( min( nHeight, nYCoorResult + m_nFigHeight) - nYIndex))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nYIndex - ( min( nHeight, nYCoorResult + m_nFigHeight) - 5), dEffect);
|
||
}
|
||
else if( nYCoorResult + m_nFigHeight / 2 + 5 >= nYIndex &&
|
||
( nXIndex <= min( nWidth, nXCoorResult + m_nFigWidth) - ( nYIndex - ( nYCoorResult + m_nFigHeight / 2)) && nXIndex >= nXCoorResult + m_nFigWidth / 3 + ( nYIndex - ( nYCoorResult + m_nFigHeight / 2)))
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 0, nYCoorResult + m_nFigHeight / 2 + 5 - nYIndex, dEffect);
|
||
}
|
||
else if( nXCoorResult + 5 >= nXIndex &&
|
||
nYIndex <= min( nHeight, nYCoorResult + m_nFigHeight) - ( nXIndex - nXCoorResult)
|
||
&& 0 != dEffect)
|
||
{
|
||
DrawAlphaBlendingLine( pResultBufferCurent, pSource, 255, nXCoorResult + 5 - nXIndex, dEffect);
|
||
}
|
||
else
|
||
{
|
||
memcpy( pResultBufferCurent, pSource, 4);
|
||
}
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
for(; nXIndex < nWidth; nXIndex++)
|
||
{
|
||
pResultBufferCurent += 4;
|
||
pSource += 4;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
else
|
||
{
|
||
return FALSE;
|
||
}
|
||
ippiCopy_8u_C4R(pResultBufferMiddle, 4 * nWidth, pResult, 4 * nWidth, roiSize);
|
||
|
||
delete pResultBuffer;
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
|
||
|
||
public:
|
||
|
||
int m_nFigHeight;
|
||
int m_nFigWidth;
|
||
int m_nPicHeight;
|
||
int m_nPicWidth;
|
||
int m_nType;
|
||
BYTE* m_pBGRASource;
|
||
int m_nXCoorSource;
|
||
int m_nYCoorSource;
|
||
|
||
};
|
||
|
||
class CUtility
|
||
{
|
||
public:
|
||
DWORD m_dwBaseRnd;
|
||
|
||
protected:
|
||
|
||
BOOL DrawFilmsPerf(BYTE* pBGRA, int nWidth, int nHeight, int nBlendColor, int nBkColor, float dX, float dY, float dWidth, float dHeight, float dRadius)
|
||
{
|
||
BYTE* pBuffer = pBGRA;
|
||
pBuffer += 4 * nWidth * (nHeight - 1);
|
||
|
||
Gdiplus::Bitmap oImage( nWidth, nHeight, -4*nWidth, PixelFormat32bppARGB, pBuffer );
|
||
if( Gdiplus::Ok == oImage.GetLastStatus() )
|
||
{
|
||
Gdiplus::Graphics oRender( &oImage );
|
||
|
||
oRender.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias);
|
||
oRender.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);
|
||
oRender.SetInterpolationMode(Gdiplus::InterpolationModeBilinear);
|
||
|
||
Gdiplus::GraphicsPath oPath;
|
||
|
||
oPath.AddLine(dX + dRadius, dY, dX + dWidth - (dRadius * 2), dY);
|
||
oPath.AddArc(dX + dWidth - (dRadius * 2), dY, dRadius * 2, dRadius * 2, 270, 90);
|
||
oPath.AddLine(dX + dWidth, dY + dRadius, dX + dWidth, dY + dHeight - (dRadius * 2));
|
||
oPath.AddArc(dX + dWidth - (dRadius * 2), dY + dHeight - (dRadius * 2), dRadius * 2, dRadius * 2,0,90);
|
||
oPath.AddLine(dX + dWidth - (dRadius * 2), dY + dHeight, dX + dRadius, dY + dHeight);
|
||
oPath.AddArc(dX, dY + dHeight - (dRadius * 2), dRadius * 2, dRadius * 2, 90, 90);
|
||
oPath.AddLine(dX, dY + dHeight - (dRadius * 2), dX, dY + dRadius);
|
||
oPath.AddArc(dX, dY, dRadius * 2, dRadius * 2, 180, 90);
|
||
oPath.CloseFigure();
|
||
|
||
Gdiplus::PathGradientBrush *oBrush = new Gdiplus::PathGradientBrush(&oPath);
|
||
oBrush->SetCenterPoint(Gdiplus::PointF(dX + dWidth / 2, dY + dHeight / 2));
|
||
oBrush->SetCenterColor(Color(nBkColor, nBkColor, nBkColor));
|
||
Color *oColor = new Color( nBkColor, nBkColor, nBkColor);
|
||
int nColorCount = 1;
|
||
oBrush->SetSurroundColors(oColor, &nColorCount);
|
||
|
||
oRender.FillPath(oBrush, &oPath);
|
||
|
||
Gdiplus::Pen *oPen = new Gdiplus::Pen(Color( nBlendColor, nBlendColor, nBlendColor), 1);
|
||
oRender.DrawArc( oPen, dX + dWidth - (dRadius * 2), dY, dRadius * 2, dRadius * 2, 315, 45);
|
||
oRender.DrawLine( oPen, dX + dWidth, dY + dRadius - 1, dX + dWidth, dY + dHeight - dRadius + 1);
|
||
oRender.DrawArc( oPen, dX + dWidth - (dRadius * 2), dY + dHeight - (dRadius * 2), dRadius * 2, dRadius * 2,0,90);
|
||
oRender.DrawLine( oPen, dX + dWidth - dRadius + 1, dY + dHeight, dX + dRadius - 1, dY + dHeight);
|
||
oRender.DrawArc( oPen, dX, dY + dHeight - (dRadius * 2), dRadius * 2, dRadius * 2, 90, 45);
|
||
|
||
delete oColor;
|
||
delete oPen;
|
||
delete oBrush;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL DrawFilmsBorder(BYTE* pBGRA, int nWidth, int nHeight, int nFilmColorMid, int nFilmColorBorder, float dBorderWidth, float dBorderHeight, BOOL bVertical)
|
||
{
|
||
BYTE* pBuffer = pBGRA;
|
||
pBuffer += 4 * nWidth * (nHeight - 1);
|
||
|
||
Gdiplus::Bitmap oImage( nWidth, nHeight, -4*nWidth, PixelFormat32bppARGB, pBuffer );
|
||
if( Gdiplus::Ok == oImage.GetLastStatus() )
|
||
{
|
||
Gdiplus::Graphics oRender( &oImage );
|
||
|
||
oRender.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias);
|
||
oRender.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);
|
||
oRender.SetInterpolationMode(Gdiplus::InterpolationModeBilinear);
|
||
|
||
Gdiplus::Color clMid(nFilmColorMid, nFilmColorMid, nFilmColorMid);
|
||
Gdiplus::Color clBorder(nFilmColorBorder, nFilmColorBorder, nFilmColorBorder);
|
||
|
||
if ( bVertical )
|
||
{
|
||
Gdiplus::SolidBrush *oSolidBrush = new Gdiplus::SolidBrush(clMid);
|
||
oRender.FillRectangle(oSolidBrush, -1.0, -1.0, float(nWidth + 1.0), float(nHeight + 1.0));
|
||
|
||
Gdiplus::LinearGradientBrush* oGradBrush1 = new Gdiplus::LinearGradientBrush(Gdiplus::PointF( -1.0, -1.0), Gdiplus::PointF( dBorderWidth + 1, -1.0), clBorder, clMid);
|
||
oRender.FillRectangle(oGradBrush1, -1.0, -1.0, dBorderWidth + 1, float(nHeight) + 1);
|
||
|
||
Gdiplus::LinearGradientBrush* oGradBrush2 = new Gdiplus::LinearGradientBrush(Gdiplus::PointF( nWidth + 1, -1.0), Gdiplus::PointF( nWidth - dBorderWidth -2.0, -1.0), clBorder, clMid);
|
||
oRender.FillRectangle(oGradBrush2, nWidth - dBorderWidth - 1, -1.0, dBorderWidth + 1, float(nHeight) + 1);
|
||
|
||
delete oGradBrush1;
|
||
delete oGradBrush2;
|
||
delete oSolidBrush;
|
||
}
|
||
else
|
||
{
|
||
Gdiplus::SolidBrush *oSolidBrush = new Gdiplus::SolidBrush(clMid);
|
||
oRender.FillRectangle(oSolidBrush, -1.0, -1.0, float(nWidth + 1.0), float(nHeight + 1.0));
|
||
|
||
Gdiplus::LinearGradientBrush* oGradBrush1 = new Gdiplus::LinearGradientBrush(Gdiplus::PointF( -1.0, -1.0), Gdiplus::PointF( -1.0, dBorderHeight + 1), clBorder, clMid);
|
||
oRender.FillRectangle(oGradBrush1, -1.0, -1.0, float(nWidth) + 2.0, dBorderHeight + 1);
|
||
|
||
Gdiplus::LinearGradientBrush* oGradBrush2 = new Gdiplus::LinearGradientBrush(Gdiplus::PointF( -1.0, float(nHeight) + 1.0), Gdiplus::PointF( -1.0, nHeight - dBorderHeight - 1.0), clBorder, clMid);
|
||
oRender.FillRectangle(oGradBrush2, float(-1.0), float(nHeight - dBorderHeight - 1.0), float(nWidth + 2.0), float(dBorderHeight + 2.0));
|
||
|
||
delete oGradBrush1;
|
||
delete oGradBrush2;
|
||
delete oSolidBrush;
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
public:
|
||
|
||
CUtility()
|
||
{
|
||
//g_sBurningPalette = 0;
|
||
g_pBurningMask = 0;
|
||
|
||
g_nBurningMaskWidth = -1;
|
||
g_nBurningMaskHeight = -1;
|
||
|
||
g_nRand = -1;
|
||
|
||
//InitBurningPalette();
|
||
|
||
g_pShotSource1 = 0;
|
||
g_pShotSource2 = 0;
|
||
g_nShotWidth = -1;
|
||
g_nShotHeight = -1;
|
||
g_nShotType = -1;
|
||
|
||
g_ppWipeRandomStrips = 0;
|
||
g_nWipeStripsCount = -1;
|
||
|
||
m_dwBaseRnd = ::rand();
|
||
|
||
}
|
||
~CUtility()
|
||
{
|
||
//if (g_sBurningPalette)
|
||
// delete[] g_sBurningPalette;
|
||
if (g_pBurningMask)
|
||
delete[] g_pBurningMask;
|
||
if (g_pShotSource1)
|
||
delete[] g_pShotSource1;
|
||
if (g_pShotSource2)
|
||
delete[] g_pShotSource2;
|
||
for(int nIndex = 0; nIndex < g_nWipeStripsCount; nIndex++ )
|
||
{
|
||
if(g_ppWipeRandomStrips[nIndex])
|
||
delete[] g_ppWipeRandomStrips[nIndex];
|
||
}
|
||
if (g_ppWipeRandomStrips)
|
||
delete g_ppWipeRandomStrips;
|
||
}
|
||
|
||
//void InitBurningPalette()
|
||
//{
|
||
// if (!g_sBurningPalette)
|
||
// g_sBurningPalette = new Ipp32s[768];
|
||
|
||
// int r,g,b;
|
||
// r = 256+256+255;
|
||
// g = 256+255;
|
||
// b = 255;
|
||
//
|
||
// for( int i = 255; i > 239; i-- )
|
||
// {
|
||
// g_sBurningPalette[i] = 255;
|
||
// g_sBurningPalette[i+256] = 255;
|
||
// g_sBurningPalette[i+512] = 255;
|
||
// }
|
||
//
|
||
// for(int i = 239; i > 15; i--)
|
||
// {
|
||
// g_sBurningPalette[i] = (r > 255) ? 255 : r;
|
||
// g_sBurningPalette[i+256] = (g > 255) ? 255 : g;
|
||
// g_sBurningPalette[i+512] = (b > 255) ? 255 : b;
|
||
// r = (r > 3) ? (r - 4) : 0;
|
||
// g = (g > 3) ? (g - 4) : 0;
|
||
// b = (b > 3) ? (b - 4) : 0;
|
||
// }
|
||
// for(int i = 15; i >= 0; i--)
|
||
// {
|
||
// g_sBurningPalette[i] = 0;
|
||
// g_sBurningPalette[i+256] = 0;
|
||
// g_sBurningPalette[i+512] = 0;
|
||
// }
|
||
//}
|
||
BOOL GenerateBurningMask( int nWidth, int nHeight )
|
||
{
|
||
if ((nWidth == g_nBurningMaskWidth) && (nHeight == g_nBurningMaskHeight) && (g_pBurningMask))
|
||
return TRUE;
|
||
|
||
if (g_pBurningMask)
|
||
delete []g_pBurningMask;
|
||
|
||
int nSize = nWidth * nHeight;
|
||
if( nSize <= 0 )
|
||
return FALSE;
|
||
|
||
CRandom rnd( m_dwBaseRnd );
|
||
|
||
g_nBurningMaskWidth = nWidth;
|
||
g_nBurningMaskHeight = nHeight;
|
||
|
||
g_pBurningMask = new BYTE[nSize];
|
||
if( !g_pBurningMask )
|
||
return FALSE;
|
||
|
||
ZeroMemory( g_pBurningMask, nSize );
|
||
|
||
Ipp16s* pBuffer = new Ipp16s[nSize];
|
||
if( !pBuffer )
|
||
{
|
||
delete [] g_pBurningMask;
|
||
g_pBurningMask = NULL;
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
ZeroMemory( pBuffer, nSize * sizeof(Ipp16s) );
|
||
|
||
IppiSize roiSize = {nWidth, nHeight};
|
||
|
||
int nH = 512;
|
||
float fR = (float)nWidth;
|
||
|
||
for( int k = 2; k <= 5; k++ )
|
||
{
|
||
if( k != 5 )
|
||
nH /= 2;
|
||
else
|
||
nH = 2;
|
||
|
||
fR /= 3;
|
||
int nRadius = int(fR);
|
||
int nSquareRadius = int(fR*fR) + 1;
|
||
int nSign = rnd.Rand( 2 ) ? -nH : nH;
|
||
double dFactorRadius = 1.0 / nSquareRadius;
|
||
|
||
for( int p = 20 * k; p > 0; p-- )
|
||
{
|
||
int nCenterX = rnd.Rand( nWidth );
|
||
int nCenterY = rnd.Rand( nHeight );
|
||
|
||
int nX1 = nCenterX - nRadius;
|
||
int nX2 = nCenterX + nRadius;
|
||
int nY1 = nCenterY - nRadius;
|
||
int nY2 = nCenterY + nRadius;
|
||
|
||
if( nX1 < 0 ) nX1 = 0;
|
||
if( nX2 >= nWidth) nX2 = nWidth - 1;
|
||
if( nY1 < 0 ) nY1 = 0;
|
||
if( nY2 >= nHeight) nY2 = nHeight - 1;
|
||
|
||
Ipp16s* pItem = pBuffer + nY1 * nWidth + nX1;
|
||
int nStride = nWidth - (nX2 - nX1 + 1);
|
||
|
||
int dy = nY1 - nCenterY;
|
||
for( int nRow = nY2 - nY1; nRow >= 0; --nRow, pItem += nStride, ++dy )
|
||
{
|
||
int dx = nX1 - nCenterX;
|
||
for( int nPos = nX2 - nX1; nPos >= 0; --nPos, ++pItem, ++dx )
|
||
{
|
||
int dot = dx*dx + dy*dy;
|
||
if( dot <= nSquareRadius )
|
||
{
|
||
double dTemp = (nSquareRadius - dot) * dFactorRadius;
|
||
*pItem += Ipp16s(nSign * dTemp * dTemp);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
Ipp16s nMin, nMax;
|
||
ippiMin_16s_C1R(pBuffer, 2*nWidth, roiSize, &nMin);
|
||
ippiMax_16s_C1R(pBuffer, 2*nWidth, roiSize, &nMax);
|
||
nMax = max( nMax, nMin + 1 );
|
||
|
||
float fFactor = 255.0f/float(nMax - nMin);
|
||
Ipp8u* pMaskItem = g_pBurningMask;
|
||
Ipp16s* pBufItem = pBuffer;
|
||
for( int nPos = nSize; nPos > 0; --nPos, ++pBufItem, ++pMaskItem )
|
||
{
|
||
*pMaskItem = fFactor * (*pBufItem - nMin);
|
||
}
|
||
|
||
delete[] pBuffer;
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
void GenerateRand(int nRandMax)
|
||
{
|
||
if (-1 != g_nRand)
|
||
return;
|
||
|
||
CRandom rnd( m_dwBaseRnd );
|
||
|
||
g_nRand = rnd.Rand( nRandMax + 1 );
|
||
}
|
||
|
||
BOOL RunTetris( CTetrisFigure *pList, int nFiguresCount, float dFrame, BYTE *pBGRAResult, int nWidth, int nHeight, int nStep, int *pnBottomLineFigures)
|
||
{
|
||
if( !pList )
|
||
return FALSE;
|
||
|
||
if( dFrame * nFiguresCount < 1 )
|
||
{
|
||
return pList[0].Cpy( pBGRAResult, pList[0].m_nXCoorSource, nHeight - pnBottomLineFigures[0] + pList[0].m_nYCoorSource, nWidth, nHeight, 1 );
|
||
}
|
||
|
||
if( nStep + 2 == nFiguresCount )
|
||
{
|
||
for( int i = 0; i <= nFiguresCount; i++ )
|
||
{
|
||
pList[i].Cpy( pBGRAResult, pList[i].m_nXCoorSource, pList[i].m_nYCoorSource, nWidth, nHeight, (1 - dFrame) * nFiguresCount );
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
pList[nStep].Cpy( pBGRAResult, pList[nStep].m_nXCoorSource, pList[nStep].m_nYCoorSource, nWidth, nHeight, 1);
|
||
|
||
nStep += 1;
|
||
|
||
if( dFrame * nFiguresCount < nStep + 1 )
|
||
{
|
||
pList[nStep].Cpy( pBGRAResult, pList[nStep].m_nXCoorSource, nHeight - pnBottomLineFigures[nStep] + pList[nStep].m_nYCoorSource, nWidth, nHeight, 1);
|
||
}
|
||
else
|
||
{
|
||
RunTetris( pList, nFiguresCount, dFrame, pBGRAResult, nWidth, nHeight, nStep, pnBottomLineFigures );
|
||
}
|
||
|
||
return TRUE;
|
||
|
||
}
|
||
|
||
BOOL CollapseTetris(CTetrisFigure *pList, int nFiguresCount, float dFrame, BYTE *pBGRAResult, int nWidth, int nHeight, int nStep, int *pnBottomLineFigures)
|
||
{
|
||
if(!pList)
|
||
return FALSE;
|
||
|
||
if( dFrame * nFiguresCount < 1 )
|
||
{
|
||
for( int i = 0; i <= nFiguresCount; i++ )
|
||
{
|
||
pList[i].Cpy( pBGRAResult, pList[i].m_nXCoorSource, pList[i].m_nYCoorSource, nWidth, nHeight, dFrame * nFiguresCount);
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
nStep += 1;
|
||
|
||
if( nStep > nFiguresCount )
|
||
return TRUE;
|
||
|
||
if( dFrame * nFiguresCount < nStep + 1 )
|
||
{
|
||
pList[nStep - 1].Cpy( pBGRAResult, pList[nStep - 1].m_nXCoorSource, pList[nStep - 1].m_nYCoorSource + (pList[nStep - 1].m_nYCoorSource + pList[nStep - 1].m_nFigHeight) * (nStep - dFrame * nFiguresCount), nWidth, nHeight, 1);
|
||
|
||
for(int i = nStep; i <= nFiguresCount; i++)
|
||
{
|
||
pList[i].Cpy( pBGRAResult, pList[i].m_nXCoorSource, pList[i].m_nYCoorSource, nWidth, nHeight, 1);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
CollapseTetris( pList, nFiguresCount, dFrame, pBGRAResult, nWidth, nHeight, nStep, pnBottomLineFigures );
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
void GenerateShot(int nWidth, int nHeight, int nDirection, int nType, BOOL bInverse, BOOL bRapprochement, double dPercent, BYTE nBkColor, BYTE nFilmColorMid, BYTE nFilmColorBorder, BYTE nBlendColor)
|
||
{
|
||
if(g_pShotSource1 && g_pShotSource2 && nType == g_nShotType && g_nShotWidth == nWidth && g_nShotHeight == nHeight)
|
||
return;
|
||
|
||
if(g_pShotSource1)
|
||
delete[] g_pShotSource1;
|
||
if(g_pShotSource2)
|
||
delete[] g_pShotSource2;
|
||
|
||
g_nShotWidth = nWidth;
|
||
g_nShotHeight = nHeight;
|
||
g_nShotType = nType;
|
||
|
||
g_pShotSource1 = new BYTE[nWidth*nHeight*4];
|
||
g_pShotSource2 = new BYTE[nWidth*nHeight*4];
|
||
|
||
BOOL bVertical = (1 == nDirection? TRUE : FALSE);
|
||
|
||
if( 1 == nDirection )
|
||
{
|
||
double dUnit = nWidth / 35.;
|
||
const double dWidthPerf = 2.8 * dUnit;
|
||
const double dHeightPerf = 1.98 * dUnit;
|
||
const double dRadiusPerf = 0.5 * dUnit;
|
||
const double dStepPerf = (4.75 * dUnit < 10? 10 : 4.75 * dUnit);
|
||
const double dBorderWidth = 1.01 * dUnit;
|
||
const double dMidLineWidth = 0.4 * dUnit;
|
||
const double dRadiusFactor = 1.3 * sqrt(2.) / 2 * dRadiusPerf;
|
||
|
||
double dStartY1 = 0;
|
||
double dStartY2 = 0;
|
||
|
||
double dAdditional = nHeight;
|
||
if ( bRapprochement )
|
||
dAdditional += -nHeight * dPercent / 2;
|
||
|
||
if ( !bInverse )
|
||
dStartY2 = dAdditional;
|
||
else
|
||
dStartY1 = dAdditional;
|
||
|
||
const double dFullBorderWidth = dBorderWidth + dWidthPerf + dMidLineWidth;
|
||
|
||
DrawFilmsBorder(g_pShotSource1, nWidth, nHeight, nFilmColorMid, nFilmColorBorder, dFullBorderWidth, 0.1 * dFullBorderWidth, bVertical);
|
||
DrawFilmsBorder(g_pShotSource2, nWidth, nHeight, nFilmColorMid, nFilmColorBorder, dFullBorderWidth, 0.1 * dFullBorderWidth, bVertical);
|
||
|
||
for ( double dCurY = - 2 * nHeight - dStartY1; dCurY < nHeight + dStepPerf; dCurY += dStepPerf)
|
||
{
|
||
DrawFilmsPerf(g_pShotSource1, nWidth, nHeight, nBlendColor, nBkColor, dBorderWidth, dCurY, dWidthPerf, dHeightPerf, dRadiusPerf);
|
||
DrawFilmsPerf(g_pShotSource1, nWidth, nHeight, nBlendColor, nBkColor, nWidth - dBorderWidth - dWidthPerf, dCurY, dWidthPerf, dHeightPerf, dRadiusPerf);
|
||
}
|
||
for ( double dCurY = - 2 * nHeight - dStartY2; dCurY < nHeight + dStepPerf; dCurY += dStepPerf)
|
||
{
|
||
DrawFilmsPerf(g_pShotSource2, nWidth, nHeight, nBlendColor, nBkColor, dBorderWidth, dCurY, dWidthPerf, dHeightPerf, dRadiusPerf);
|
||
DrawFilmsPerf(g_pShotSource2, nWidth, nHeight, nBlendColor, nBkColor, nWidth - dBorderWidth - dWidthPerf, dCurY, dWidthPerf, dHeightPerf, dRadiusPerf);
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
double dUnit = nHeight / 35.;
|
||
const double dWidthPerf = 2.8 * dUnit;
|
||
const double dHeightPerf = 1.98 * dUnit;
|
||
const double dRadiusPerf = 0.5 * dUnit;
|
||
const double dStepPerf = (4.75 * dUnit < 10? 10 : 4.75 * dUnit);
|
||
const double dBorderWidth = 1.01 * dUnit;
|
||
const double dMidLineWidth = 0.4 * dUnit;
|
||
const double dRadiusFactor = 1.3 * sqrt(2.) / 2 * dRadiusPerf;
|
||
|
||
double dStartX1 = 0;
|
||
double dStartX2 = 0;
|
||
|
||
double dAdditional = nWidth;
|
||
if ( bRapprochement )
|
||
dAdditional += -nWidth * dPercent / 2;
|
||
|
||
if ( !bInverse )
|
||
dStartX2 = dAdditional;
|
||
else
|
||
dStartX1 = dAdditional;
|
||
|
||
const double dFullBorderWidth = dBorderWidth + dWidthPerf + dMidLineWidth;
|
||
|
||
DrawFilmsBorder(g_pShotSource1, nWidth, nHeight, nFilmColorMid, nFilmColorBorder, 0.1 * dFullBorderWidth, dFullBorderWidth, bVertical);
|
||
DrawFilmsBorder(g_pShotSource2, nWidth, nHeight, nFilmColorMid, nFilmColorBorder, 0.1 * dFullBorderWidth, dFullBorderWidth, bVertical);
|
||
|
||
for ( double dCurX = - 2*nWidth - dStartX1; dCurX < nWidth + dStepPerf; dCurX += dStepPerf)
|
||
{
|
||
DrawFilmsPerf(g_pShotSource1, nWidth, nHeight, nBlendColor, nBkColor, dCurX, dBorderWidth, dHeightPerf, dWidthPerf, dRadiusPerf);
|
||
DrawFilmsPerf(g_pShotSource1, nWidth, nHeight, nBlendColor, nBkColor, dCurX, nHeight - dBorderWidth - dWidthPerf, dHeightPerf, dWidthPerf, dRadiusPerf);
|
||
}
|
||
for ( double dCurX = - 2*nWidth - dStartX2; dCurX < nWidth + dStepPerf; dCurX += dStepPerf)
|
||
{
|
||
DrawFilmsPerf(g_pShotSource2, nWidth, nHeight, nBlendColor, nBkColor, dCurX, dBorderWidth, dHeightPerf, dWidthPerf, dRadiusPerf);
|
||
DrawFilmsPerf(g_pShotSource2, nWidth, nHeight, nBlendColor, nBkColor, dCurX, nHeight - dBorderWidth - dWidthPerf, dHeightPerf, dWidthPerf, dRadiusPerf);
|
||
}
|
||
}
|
||
return;
|
||
|
||
//if( 1 == nDirection)
|
||
//{
|
||
|
||
// const double dUnit = nWidth / 35.;
|
||
// const double dWidthPerf = 2.8 * dUnit;
|
||
// const double dHeightPerf = 1.98 * dUnit;
|
||
// const double dRadiusPerf = 0.5 * dUnit;
|
||
// const double dStepPerf = 4.75 * dUnit;
|
||
// const double dBorderWidth = 1.01 * dUnit;
|
||
// const double dRadiusFactor = 1.3 * sqrt(2.) / 2 * dRadiusPerf;
|
||
//
|
||
// BYTE *pBuffer = g_pShotSource1;
|
||
|
||
// for (int nIndex = 0; nIndex < 2; nIndex++ )
|
||
// {
|
||
// if ( 0 == nIndex )
|
||
// pBuffer = g_pShotSource1;
|
||
// else
|
||
// pBuffer = g_pShotSource2;
|
||
|
||
// for(int nYIndex = 0; nYIndex < nHeight; nYIndex++)
|
||
// {
|
||
// int nAdditional = nHeight;
|
||
// if ( bRapprochement )
|
||
// {
|
||
// nAdditional += - nHeight * dPercent / 2;
|
||
// }
|
||
// int nYIndexS1 = nYIndex;
|
||
// int nYIndexS2 = nYIndex + nAdditional;
|
||
// if(!bInverse)
|
||
// {
|
||
// nYIndexS1 += nAdditional;
|
||
// nYIndexS2 -= nAdditional;
|
||
// }
|
||
// int nIndexS;
|
||
// if ( 0 == nIndex )
|
||
// nIndexS = nYIndexS1;
|
||
// else
|
||
// nIndexS = nYIndexS2;
|
||
|
||
// for(int nXIndex = 0; nXIndex < nWidth; nXIndex++)
|
||
// {
|
||
// //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
// const int nYStepCount = nIndexS % int(dStepPerf); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD> = <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
// const int nFirstFocus = dBorderWidth + dRadiusFactor; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// const int nSecondFocus = dBorderWidth + dWidthPerf - dRadiusFactor; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// const int nFullBorderWidth = dBorderWidth + dWidthPerf; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>)
|
||
// const double dSqrRadiusPerf = dRadiusPerf * dRadiusPerf;
|
||
// const double dSqrDecRadiusPerf = (dRadiusPerf - 1) * (dRadiusPerf - 1);
|
||
// const double dSqrIncRadiusPerf = (dRadiusPerf + 1) * (dRadiusPerf + 1);
|
||
|
||
|
||
// if( nXIndex <= dBorderWidth || nXIndex > nWidth - dBorderWidth ||
|
||
// ((( nXIndex > dBorderWidth && nXIndex <= nFullBorderWidth) || ( nXIndex >= nWidth - nFullBorderWidth && nXIndex < nWidth - dBorderWidth)) && nYStepCount > int(dHeightPerf) ) ||
|
||
// /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>*/ /*<2A><><EFBFBD><EFBFBD><EFBFBD>*/
|
||
// (nXIndex <= nFirstFocus && (nYStepCount) <= dRadiusFactor && (nXIndex - nFirstFocus) * (nXIndex - nFirstFocus) + (nYStepCount - dRadiusFactor) * (nYStepCount - dRadiusFactor) > dSqrRadiusPerf) ||
|
||
// (nXIndex <= nFirstFocus && (nYStepCount) >= dHeightPerf - dRadiusFactor && (nXIndex - nFirstFocus) * (nXIndex - nFirstFocus) + (nYStepCount - dHeightPerf + dRadiusFactor) * (nYStepCount - dHeightPerf + dRadiusFactor) > dSqrRadiusPerf) ||
|
||
// (nXIndex >= nSecondFocus && nXIndex <= nFullBorderWidth && (nYStepCount) >= dHeightPerf - dRadiusFactor && (nXIndex - nSecondFocus) * (nXIndex - nSecondFocus) + (nYStepCount - dHeightPerf + dRadiusFactor) * (nYStepCount - dHeightPerf + dRadiusFactor) > dSqrRadiusPerf) ||
|
||
// (nXIndex >= nSecondFocus && nXIndex <= nFullBorderWidth && (nYStepCount) <= dRadiusFactor && (nXIndex - nSecondFocus) * (nXIndex - nSecondFocus) + (nYStepCount - dRadiusFactor) * (nYStepCount - dRadiusFactor) > dSqrRadiusPerf) ||
|
||
// /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||
// (nXIndex <= nWidth - nSecondFocus && nXIndex >= nWidth - nFullBorderWidth && (nYStepCount) <= dRadiusFactor && (nXIndex - (nWidth - nSecondFocus)) * (nXIndex - (nWidth - nSecondFocus)) + (nYStepCount - dRadiusFactor) * (nYStepCount - dRadiusFactor) > dSqrRadiusPerf) ||
|
||
// (nXIndex <= nWidth - nSecondFocus && nXIndex >= nWidth - nFullBorderWidth && (nYStepCount) >= dHeightPerf - dRadiusFactor && (nXIndex - (nWidth - nSecondFocus)) * (nXIndex - (nWidth - nSecondFocus)) + (nYStepCount - dHeightPerf + dRadiusFactor) * (nYStepCount - dHeightPerf + dRadiusFactor) > dSqrRadiusPerf) ||
|
||
// (nXIndex >= nWidth - nFirstFocus && (nYStepCount) >= dHeightPerf - dRadiusFactor && (nXIndex - (nWidth - nFirstFocus)) * (nXIndex - (nWidth - nFirstFocus)) + (nYStepCount - dHeightPerf + dRadiusFactor) * (nYStepCount - dHeightPerf + dRadiusFactor) > dSqrRadiusPerf) ||
|
||
// (nXIndex >= nWidth - nFirstFocus && (nYStepCount) <= dRadiusFactor && (nXIndex - (nWidth - nFirstFocus)) * (nXIndex - (nWidth - nFirstFocus)) + (nYStepCount - dRadiusFactor) * (nYStepCount - dRadiusFactor) > dSqrRadiusPerf))
|
||
// {
|
||
// for(int i = 0; i < 3; i++)
|
||
// {
|
||
// if(nXIndex <= nFullBorderWidth)
|
||
// {
|
||
// *pBuffer = nFilmColorBorder * (1 - double(nXIndex) / double (nFullBorderWidth) ) + nFilmColorMid * (double(nXIndex) / double (nFullBorderWidth));
|
||
// }
|
||
// else
|
||
// {
|
||
// *pBuffer = nFilmColorBorder * double(nXIndex - (nWidth - nFullBorderWidth))/double(nFullBorderWidth) + nFilmColorMid * (1 - double(nXIndex - (nWidth - nFullBorderWidth))/double(nFullBorderWidth));
|
||
// }
|
||
// pBuffer++;
|
||
// }
|
||
// *pBuffer = 255;
|
||
// pBuffer++;
|
||
// }
|
||
// else if( nXIndex > nFullBorderWidth && nXIndex < nWidth - nFullBorderWidth)
|
||
// {
|
||
// for(int i = 0; i < 3; i++)
|
||
// {
|
||
// *pBuffer = nFilmColorMid;
|
||
// pBuffer++;
|
||
// }
|
||
// *pBuffer = 255;
|
||
// pBuffer++;
|
||
// }
|
||
// else
|
||
// {
|
||
// const double dLeftFirstSqrRad = ( nXIndex - nFirstFocus) * ( nXIndex - nFirstFocus) + (nYStepCount - dRadiusFactor) * (nYStepCount - dRadiusFactor);
|
||
// const double dLeftSecondSqrRad = ( nXIndex - nSecondFocus) * ( nXIndex - nSecondFocus) + (nYStepCount - dRadiusFactor) * (nYStepCount - dRadiusFactor);
|
||
// const double dRightFirstSqrRad = ( nXIndex - ( nWidth - nSecondFocus)) * ( nXIndex - ( nWidth - nSecondFocus)) + (nYStepCount - dRadiusFactor) * (nYStepCount - dRadiusFactor);
|
||
// const double dRightSecondSqrRad = ( nXIndex - ( nWidth - nFirstFocus)) * ( nXIndex - ( nWidth - nFirstFocus)) + (nYStepCount - dRadiusFactor) * (nYStepCount - dRadiusFactor);
|
||
//
|
||
// if //<2F><><EFBFBD><EFBFBD><EFBFBD>
|
||
// ( nXIndex >= dBorderWidth &&
|
||
// (( nYStepCount == 0 && nXIndex <= nSecondFocus && nXIndex >= nFirstFocus)
|
||
// ||
|
||
// ( dLeftFirstSqrRad > dSqrDecRadiusPerf && dLeftFirstSqrRad < dSqrIncRadiusPerf
|
||
// && nXIndex <= nFirstFocus && nYStepCount <= dRadiusFactor)
|
||
// ||
|
||
// ( dLeftSecondSqrRad > dSqrDecRadiusPerf && dLeftSecondSqrRad < dSqrIncRadiusPerf
|
||
// && nXIndex >= nSecondFocus && nXIndex <= nFullBorderWidth && nYStepCount <= dRadiusFactor)
|
||
// ||
|
||
// (nXIndex > nFullBorderWidth - 1 && nXIndex < nFullBorderWidth + 1 )) ||
|
||
// //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// nXIndex <= nWidth - dBorderWidth &&
|
||
// (( nYStepCount == 0 && nXIndex >= nWidth - nSecondFocus && nXIndex <= nWidth - nFirstFocus )
|
||
// ||
|
||
// ( dRightFirstSqrRad > dSqrDecRadiusPerf && dRightFirstSqrRad < dSqrIncRadiusPerf
|
||
// && nXIndex >= nWidth - nFullBorderWidth && nXIndex <= nWidth - nSecondFocus && nYStepCount <= dRadiusFactor)
|
||
// ||
|
||
// ( dRightSecondSqrRad > dSqrDecRadiusPerf && dRightSecondSqrRad < dSqrIncRadiusPerf
|
||
// && nXIndex >= nWidth - nFirstFocus && nYStepCount <= dRadiusFactor)
|
||
// ||
|
||
// (nXIndex > nWidth - dBorderWidth - 1 && nXIndex < nWidth - dBorderWidth + 1 ))
|
||
// )
|
||
// {
|
||
// for(int i = 0; i < 3; i++)
|
||
// {
|
||
// *pBuffer = nBlendColor;
|
||
// *pBuffer++;
|
||
// }
|
||
// *pBuffer = 255;
|
||
// pBuffer++;
|
||
// }
|
||
// else
|
||
// {
|
||
// for(int i = 0; i < 3; i++)
|
||
// {
|
||
// *pBuffer = nBkColor;
|
||
// *pBuffer++;
|
||
// }
|
||
// *pBuffer = 255;
|
||
// pBuffer++;
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
//}
|
||
//else
|
||
//{
|
||
|
||
// const double dUnit = nHeight / 35.;
|
||
// const double dWidthPerf = 2.8 * dUnit;
|
||
// const double dHeightPerf = 1.98 * dUnit;
|
||
// const double dRadiusPerf = 0.5 * dUnit;
|
||
// const double dStepPerf = 4.75 * dUnit;
|
||
// const double dBorderWidth = 1. * dUnit;
|
||
// const double dRadiusFactor = 1.3 * sqrt(2.) / 2 * dRadiusPerf;
|
||
|
||
// BYTE *pBuffer = g_pShotSource1;
|
||
|
||
// for (int nIndex = 0; nIndex < 2; nIndex++ )
|
||
// {
|
||
// if ( 0 == nIndex )
|
||
// pBuffer = g_pShotSource1;
|
||
// else
|
||
// pBuffer = g_pShotSource2;
|
||
|
||
// for(int nYIndex = 0; nYIndex < nHeight; nYIndex++)
|
||
// {
|
||
// for(int nXIndex = 0; nXIndex < nWidth; nXIndex++)
|
||
// {
|
||
// int nAdditional = nWidth;
|
||
// if ( bRapprochement )
|
||
// {
|
||
// nAdditional -= nWidth * dPercent / 2;
|
||
// }
|
||
// int nXIndexS2 = nXIndex;
|
||
// int nXIndexS1 = nXIndex + nAdditional;
|
||
// if(!bInverse)
|
||
// {
|
||
// nXIndexS2 += nAdditional;
|
||
// nXIndexS1 -= nAdditional;
|
||
// }
|
||
// int nIndexS = 0;
|
||
// if ( 0 == nIndex)
|
||
// nIndexS = nXIndexS1;
|
||
// else
|
||
// nIndexS = nXIndexS2;
|
||
|
||
|
||
// //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
// const int nXStepCount = nIndexS % int(dStepPerf); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>(<28><><EFBFBD> = <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
// const int nFirstFocus = dBorderWidth + dRadiusFactor; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// const int nSecondFocus = dBorderWidth + dWidthPerf - dRadiusFactor; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// const int nFullBorderWidth = dBorderWidth + dWidthPerf; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>)
|
||
// const double dSqrRadiusPerf = dRadiusPerf * dRadiusPerf;
|
||
// const double dSqrDecRadiusPerf = (dRadiusPerf - 1) * (dRadiusPerf - 1);
|
||
// const double dSqrIncRadiusPerf = (dRadiusPerf + 1) * (dRadiusPerf + 1);
|
||
|
||
|
||
// if( nYIndex <= dBorderWidth || nYIndex >= nHeight - dBorderWidth ||
|
||
// ((( nYIndex > dBorderWidth && nYIndex <= nFullBorderWidth) || ( nYIndex >= nHeight - nFullBorderWidth && nYIndex < nHeight - dBorderWidth)) && nXStepCount > int(dHeightPerf) ) ||
|
||
// /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>*/ /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
||
// (nYIndex <= nFirstFocus && nXStepCount <= dRadiusFactor && (nYIndex - nFirstFocus) * (nYIndex - nFirstFocus) + (nXStepCount - dRadiusFactor) * (nXStepCount - dRadiusFactor) > dSqrRadiusPerf) ||
|
||
// (nYIndex <= nFirstFocus && nXStepCount >= dHeightPerf - dRadiusFactor && (nYIndex - nFirstFocus) * (nYIndex - nFirstFocus) + (nXStepCount - dHeightPerf + dRadiusFactor) * (nXStepCount - dHeightPerf + dRadiusFactor) > dSqrRadiusPerf) ||
|
||
// (nYIndex >= nSecondFocus && nYIndex <= dBorderWidth + dWidthPerf && nXStepCount >= dHeightPerf - dRadiusFactor && (nYIndex - nSecondFocus) * (nYIndex - nSecondFocus) + (nXStepCount - dHeightPerf + dRadiusFactor) * (nXStepCount - dHeightPerf + dRadiusFactor) > dSqrRadiusPerf) ||
|
||
// (nYIndex >= nSecondFocus && nYIndex <= dBorderWidth + dWidthPerf && nXStepCount <= dRadiusFactor && (nYIndex - nSecondFocus) * (nYIndex - nSecondFocus) + (nXStepCount - dRadiusFactor) * (nXStepCount - dRadiusFactor) > dSqrRadiusPerf) ||
|
||
// /*<2A><><EFBFBD><EFBFBD><EFBFBD>*/
|
||
// (nYIndex <= nHeight - nSecondFocus && nYIndex >= nHeight - dBorderWidth - dWidthPerf && nXStepCount <= dRadiusFactor && (nYIndex - (nHeight - nSecondFocus)) * (nYIndex - (nHeight - nSecondFocus)) + (nXStepCount - dRadiusFactor) * (nXStepCount - dRadiusFactor) > dSqrRadiusPerf) ||
|
||
// (nYIndex <= nHeight - nSecondFocus && nYIndex >= nHeight - dBorderWidth - dWidthPerf && nXStepCount >= dHeightPerf - dRadiusFactor && (nYIndex - (nHeight - nSecondFocus)) * (nYIndex - (nHeight - nSecondFocus)) + (nXStepCount - dHeightPerf + dRadiusFactor) * (nXStepCount - dHeightPerf + dRadiusFactor) > dSqrRadiusPerf) ||
|
||
// (nYIndex >= nHeight - nFirstFocus && nXStepCount >= dHeightPerf - dRadiusFactor && (nYIndex - (nHeight - nFirstFocus)) * (nYIndex - (nHeight - nFirstFocus)) + (nXStepCount - dHeightPerf + dRadiusFactor) * (nXStepCount - dHeightPerf + dRadiusFactor) > dSqrRadiusPerf ) ||
|
||
// (nYIndex >= nHeight - nFirstFocus && nXStepCount <= dRadiusFactor && (nYIndex - (nHeight - nFirstFocus)) * (nYIndex - (nHeight - nFirstFocus)) + (nXStepCount - dRadiusFactor) * (nXStepCount- dRadiusFactor) > dSqrRadiusPerf))
|
||
// {
|
||
// for(int i = 0; i < 3; i++)
|
||
// {
|
||
// if( nYIndex <= nFullBorderWidth)
|
||
// {
|
||
// *pBuffer = nFilmColorBorder * (1 - nYIndex / (dBorderWidth + dWidthPerf)) + nFilmColorMid * (nYIndex / (dBorderWidth + dWidthPerf));
|
||
// //double dKoef = double(nYIndex) / double(nFullBorderWidth);
|
||
// //*pBuffer = nFilmColorBorder * (1 - dKoef ) + nFilmColorMid * dKoef;
|
||
// }
|
||
// else
|
||
// {
|
||
// *pBuffer = nFilmColorBorder * (nYIndex - (nHeight - (dBorderWidth + dWidthPerf))) / (dBorderWidth + dWidthPerf) + nFilmColorMid * (1 - (nYIndex - (nHeight - (dBorderWidth + dWidthPerf)))/ (dBorderWidth + dWidthPerf));
|
||
// //double dKoef = double(nYIndex - (nHeight - nFullBorderWidth)) / double(nFullBorderWidth);
|
||
// //*pBuffer = nFilmColorBorder * dKoef + nFilmColorMid * (1 - dKoef);
|
||
// }
|
||
// pBuffer++;
|
||
// }
|
||
// *pBuffer = 255;
|
||
// pBuffer++;
|
||
// }
|
||
// else if(nYIndex > nFullBorderWidth && nYIndex < nHeight - nFullBorderWidth)
|
||
// {
|
||
// for(int i = 0; i < 3; i++)
|
||
// {
|
||
// *pBuffer = nFilmColorMid;
|
||
// pBuffer++;
|
||
// }
|
||
// *pBuffer = 255;
|
||
// pBuffer++;
|
||
// }
|
||
// else
|
||
// {
|
||
// const double dTopFirstSqrRad = ( nYIndex - nFirstFocus) * ( nYIndex - nFirstFocus) + (nXStepCount - dHeightPerf + dRadiusFactor ) * ( nXStepCount - dHeightPerf + dRadiusFactor);
|
||
// const double dTopSecondSqrRad = ( nYIndex - nFirstFocus) * ( nYIndex - nFirstFocus) + (nXStepCount - dRadiusFactor) * ( nXStepCount - dRadiusFactor);
|
||
// const double dBottomFirstSqrRad = ( nYIndex - ( nHeight - nSecondFocus)) * ( nYIndex - ( nHeight - nSecondFocus)) + (nXStepCount - dHeightPerf + dRadiusFactor) * ( nXStepCount - dHeightPerf + dRadiusFactor);
|
||
// const double dBottomSecondSqrRad = ( nYIndex - ( nHeight - nSecondFocus)) * ( nYIndex - ( nHeight - nSecondFocus)) + (nXStepCount - dRadiusFactor) * ( nXStepCount - dRadiusFactor);
|
||
|
||
// if(
|
||
// nYIndex >= dBorderWidth &&nYIndex <= nHeight - dBorderWidth &&
|
||
// ((( nXStepCount > dHeightPerf - 1 && nXStepCount < dHeightPerf + 1 && nYIndex > nFirstFocus - 10/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/)
|
||
// ||
|
||
// ( dTopFirstSqrRad > dSqrDecRadiusPerf && dTopFirstSqrRad < dSqrIncRadiusPerf
|
||
// && nYIndex < nFirstFocus && nXStepCount >= dHeightPerf - dRadiusFactor)
|
||
// ||
|
||
// ( dTopSecondSqrRad > dSqrDecRadiusPerf && dTopSecondSqrRad < dSqrIncRadiusPerf
|
||
// && nYIndex < nFirstFocus && nXStepCount <= dRadiusFactor)
|
||
// ||
|
||
// (nYIndex < dBorderWidth + 1 && nYIndex > dBorderWidth - 1) )
|
||
// ||
|
||
// (( nXStepCount > dHeightPerf - 1 && nXStepCount < dHeightPerf + 1 && nYIndex >= nHeight - nSecondFocus )
|
||
// ||
|
||
// ( dBottomFirstSqrRad > dSqrDecRadiusPerf && dBottomFirstSqrRad < dSqrIncRadiusPerf
|
||
// && nYIndex >= nHeight - nFullBorderWidth && nYIndex <= nHeight - nSecondFocus && nXStepCount >= dHeightPerf - dRadiusFactor) ||
|
||
// ( dBottomSecondSqrRad > dSqrDecRadiusPerf && dBottomSecondSqrRad < dSqrIncRadiusPerf
|
||
// && nYIndex >= nHeight - nFullBorderWidth && nYIndex <= nHeight - nSecondFocus && nXStepCount <= dRadiusFactor)
|
||
// ||
|
||
// (nYIndex < nHeight - nFullBorderWidth + 1 && nYIndex > nHeight - nFullBorderWidth - 1 ) )))
|
||
// {
|
||
// for(int i = 0; i < 3; i++)
|
||
// {
|
||
// *pBuffer = nBlendColor;
|
||
// pBuffer++;
|
||
// }
|
||
// }
|
||
// else
|
||
// {
|
||
// for(int i = 0; i < 3; i++)
|
||
// {
|
||
// *pBuffer = nBkColor;
|
||
// pBuffer++;
|
||
// }
|
||
// }
|
||
// *pBuffer = 255;
|
||
// pBuffer++;
|
||
// }
|
||
// }
|
||
// }
|
||
// }
|
||
//}
|
||
//return;
|
||
}
|
||
|
||
|
||
|
||
|
||
void GenerateWipeStrips(int nCount)
|
||
{
|
||
if ( g_ppWipeRandomStrips && g_nWipeStripsCount == nCount )
|
||
return;
|
||
|
||
if ( g_ppWipeRandomStrips )
|
||
{
|
||
for(int nIndex = 0; nIndex < g_nWipeStripsCount; nIndex++ )
|
||
{
|
||
if(g_ppWipeRandomStrips[nIndex])
|
||
delete[] g_ppWipeRandomStrips[nIndex];
|
||
}
|
||
if (g_ppWipeRandomStrips)
|
||
delete[] g_ppWipeRandomStrips;
|
||
}
|
||
|
||
g_nWipeStripsCount = nCount;
|
||
|
||
CRandom rnd( m_dwBaseRnd );
|
||
|
||
g_ppWipeRandomStrips = new int*[nCount];
|
||
for( int nIndex = 0; nIndex < nCount; nIndex++ )
|
||
{
|
||
g_ppWipeRandomStrips[nIndex] = new int[256];
|
||
}
|
||
for(int nCountIndex = 0; nCountIndex < nCount; nCountIndex++ )
|
||
{
|
||
for(int nTime = 0; nTime < 256; nTime++)
|
||
{
|
||
g_ppWipeRandomStrips[nCountIndex][nTime] = rnd.Rand( 100 );
|
||
}
|
||
}
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
public:
|
||
|
||
int g_nBurningMaskWidth;
|
||
int g_nBurningMaskHeight;
|
||
|
||
//Ipp32s* g_sBurningPalette;
|
||
Ipp8u* g_pBurningMask;
|
||
|
||
int g_nRand;
|
||
|
||
BYTE* g_pShotSource1;
|
||
BYTE* g_pShotSource2;
|
||
int g_nShotWidth;
|
||
int g_nShotHeight;
|
||
int g_nShotType;
|
||
|
||
int** g_ppWipeRandomStrips;
|
||
int g_nWipeStripsCount;
|
||
|
||
};
|
||
|
||
|
||
class CMaskGraduate
|
||
{
|
||
public:
|
||
DWORD m_dwBaseRnd;
|
||
|
||
public:
|
||
|
||
CMaskGraduate()
|
||
{
|
||
m_nMaskWidth = -1;
|
||
m_nMaskHeight = -1;
|
||
m_nMaskType = -1;
|
||
g_nTilesX = -1;
|
||
g_nTilesY = -1;
|
||
|
||
m_pMask = 0;
|
||
|
||
g_nSize = 0;
|
||
g_pGraduation = NULL;
|
||
|
||
m_dwBaseRnd = ::rand();
|
||
}
|
||
|
||
~CMaskGraduate()
|
||
{
|
||
if ( m_pMask )
|
||
delete []m_pMask;
|
||
|
||
if ( g_pGraduation )
|
||
delete []g_pGraduation;
|
||
}
|
||
|
||
void GenerateMask(int nWidth, int nHeight, int nType)
|
||
{
|
||
if ((nWidth == m_nMaskWidth) && (nHeight == m_nMaskHeight) && (m_pMask) && (nType == m_nMaskType))
|
||
return ;
|
||
|
||
if (m_pMask)
|
||
delete []m_pMask;
|
||
|
||
int nSize = nWidth * nHeight;
|
||
if( !nSize )
|
||
return;
|
||
|
||
m_nMaskType = nType;
|
||
m_nMaskWidth = nWidth;
|
||
m_nMaskHeight = nHeight;
|
||
|
||
if ( Constants::c_nGraduateSideLeftToRight <= nType && Constants::c_nGraduateCornerRightTop >= nType)
|
||
{
|
||
g_nTilesX = 5;
|
||
g_nTilesY = 5;
|
||
}
|
||
else if ( Constants::c_nGraduateClockBottomClockwise <= nType && Constants::c_nGraduateClock3AnglesReverse >= nType )
|
||
{
|
||
g_nTilesX = 2;
|
||
g_nTilesY = 2;
|
||
}
|
||
g_nTileWidth = nWidth / g_nTilesX;
|
||
g_nTileHeight = nHeight / g_nTilesY;
|
||
|
||
m_pMask = new Ipp16u[nSize];
|
||
if( !m_pMask )
|
||
return;
|
||
|
||
::memset( m_pMask, 255, nSize * sizeof(Ipp16u) );
|
||
RandomShuffle(g_nTilesX * g_nTilesY);
|
||
|
||
if ( Constants::c_nGraduateSideLeftToRight <= nType && Constants::c_nGraduateCornerRightTop >= nType)
|
||
WipeSide();
|
||
else if ( Constants::c_nGraduateClockBottomClockwise <= nType && Constants::c_nGraduateClock3AnglesReverse >= nType )
|
||
Clock();
|
||
return;
|
||
}
|
||
|
||
|
||
protected:
|
||
|
||
void WipeSide()
|
||
{
|
||
CBuffer<double> oTable( m_nMaskWidth + m_nMaskHeight );
|
||
if( oTable.IsEmpty() )
|
||
{
|
||
::memset( m_pMask, 255, m_nMaskWidth * m_nMaskHeight * sizeof(Ipp16u) );
|
||
return;
|
||
}
|
||
|
||
double dFactorX = 1.0 / g_nTileWidth;
|
||
double dFactorY = 1.0 / g_nTileHeight;
|
||
|
||
double* pTable = oTable.GetPtr();
|
||
|
||
int nTileX = -1;
|
||
for( int i = 0; i < m_nMaskWidth; ++i, ++pTable )
|
||
{
|
||
if( Constants::c_nGraduateSideTopToBottom == m_nMaskType ||
|
||
Constants::c_nGraduateSideBottomToTop == m_nMaskType )
|
||
{
|
||
*pTable = 0;
|
||
}
|
||
else
|
||
{
|
||
if( ++nTileX >= g_nTileWidth )
|
||
nTileX = 0;
|
||
|
||
*pTable = nTileX * dFactorX;
|
||
}
|
||
}
|
||
|
||
int nTileY = -1;
|
||
for( int i = 0; i < m_nMaskHeight; ++i, ++pTable )
|
||
{
|
||
if( Constants::c_nGraduateSideLeftToRight == m_nMaskType ||
|
||
Constants::c_nGraduateSideRightToLeft == m_nMaskType )
|
||
{
|
||
*pTable = 0;
|
||
}
|
||
else
|
||
{
|
||
if( ++nTileY >= g_nTileHeight )
|
||
nTileY = 0;
|
||
|
||
*pTable = nTileY * dFactorY;
|
||
}
|
||
}
|
||
|
||
if( Constants::c_nGraduateSideRightToLeft == m_nMaskType ||
|
||
Constants::c_nGraduateCornerRightTop == m_nMaskType ||
|
||
Constants::c_nGraduateCornerRightBottom == m_nMaskType )
|
||
{
|
||
double* pTableX = oTable.GetPtr();
|
||
|
||
for( int i = 0; i < m_nMaskWidth; ++i, ++pTableX )
|
||
{
|
||
*pTableX = 1 - *pTableX;
|
||
}
|
||
}
|
||
|
||
if( Constants::c_nGraduateSideTopToBottom == m_nMaskType ||
|
||
Constants::c_nGraduateCornerLeftTop == m_nMaskType ||
|
||
Constants::c_nGraduateCornerRightTop == m_nMaskType )
|
||
{
|
||
double* pTableY = oTable.GetPtr() + m_nMaskWidth;
|
||
|
||
for( int i = 0; i < m_nMaskHeight; ++i, ++pTableY )
|
||
{
|
||
*pTableY = 1 - *pTableY;
|
||
}
|
||
}
|
||
|
||
double dFactor = 65535.0 / (g_nTilesX * g_nTilesY);
|
||
|
||
Ipp16u* pBuffer = m_pMask;
|
||
|
||
double* pTableY = oTable.GetPtr() + m_nMaskWidth;
|
||
for( int nY = 0; nY < m_nMaskHeight; ++nY, ++pTableY )
|
||
{
|
||
int* pStensil = g_pGraduation + nY / g_nTileHeight * g_nTilesX;
|
||
|
||
double* pTableX = oTable.GetPtr();
|
||
for( int nX = 0; nX < m_nMaskWidth; ++nX, ++pTableX )
|
||
{
|
||
int nCurTileX = nX / g_nTileWidth;
|
||
|
||
*pBuffer++ = Ipp16u((max(pTableX[0], pTableY[0]) + pStensil[nCurTileX]) * dFactor);
|
||
}
|
||
}
|
||
}
|
||
|
||
void Clock()
|
||
{
|
||
Ipp16u* pBuffer = m_pMask;
|
||
|
||
int nAnglesCount = 1;
|
||
double dStartAngle = 0;
|
||
|
||
if( Constants::c_nGraduateClockLeftOpposite == m_nMaskType ||
|
||
Constants::c_nGraduateClockLeftClockwise == m_nMaskType ||
|
||
Constants::c_nGraduateClockLeftReverse == m_nMaskType )
|
||
{
|
||
dStartAngle = 180 * IPP_PI180;
|
||
}
|
||
else
|
||
if( Constants::c_nGraduateClockTopOpposite == m_nMaskType ||
|
||
Constants::c_nGraduateClockTopClockwise == m_nMaskType ||
|
||
Constants::c_nGraduateClockTopReverse == m_nMaskType )
|
||
{
|
||
dStartAngle = 270 * IPP_PI180;
|
||
}
|
||
else
|
||
if( Constants::c_nGraduateClockBottomOpposite == m_nMaskType ||
|
||
Constants::c_nGraduateClockBottomClockwise == m_nMaskType ||
|
||
Constants::c_nGraduateClockBottomReverse == m_nMaskType )
|
||
{
|
||
dStartAngle = 90 * IPP_PI180;
|
||
}
|
||
else
|
||
if( Constants::c_nGraduateClock2AnglesClockwise == m_nMaskType ||
|
||
Constants::c_nGraduateClock2AnglesReverse == m_nMaskType )
|
||
{
|
||
dStartAngle = 270 * IPP_PI180;
|
||
nAnglesCount = 2;
|
||
}
|
||
else
|
||
if( Constants::c_nGraduateClock3AnglesClockwise == m_nMaskType ||
|
||
Constants::c_nGraduateClock3AnglesReverse == m_nMaskType )
|
||
{
|
||
dStartAngle = 270 * IPP_PI180;
|
||
nAnglesCount = 3;
|
||
}
|
||
|
||
double dFactor = 1;
|
||
int nOffset = 0;
|
||
BOOL bReverse = FALSE;
|
||
|
||
if( Constants::c_nGraduateClockRightOpposite == m_nMaskType ||
|
||
Constants::c_nGraduateClockLeftOpposite == m_nMaskType ||
|
||
Constants::c_nGraduateClockTopOpposite == m_nMaskType ||
|
||
Constants::c_nGraduateClockBottomOpposite == m_nMaskType)
|
||
{
|
||
bReverse = TRUE;
|
||
nOffset = 0;
|
||
dFactor = 1.0 / IPP_PI;
|
||
}
|
||
else
|
||
if( Constants::c_nGraduateClockRightClockwise == m_nMaskType ||
|
||
Constants::c_nGraduateClockLeftClockwise == m_nMaskType ||
|
||
Constants::c_nGraduateClockTopClockwise == m_nMaskType ||
|
||
Constants::c_nGraduateClockBottomClockwise == m_nMaskType ||
|
||
Constants::c_nGraduateClock2AnglesClockwise == m_nMaskType ||
|
||
Constants::c_nGraduateClock3AnglesClockwise == m_nMaskType )
|
||
{
|
||
nOffset = 1;
|
||
dFactor = -1.0 / IPP_2PI;
|
||
}
|
||
else
|
||
if( Constants::c_nGraduateClockRightReverse == m_nMaskType ||
|
||
Constants::c_nGraduateClockLeftReverse == m_nMaskType ||
|
||
Constants::c_nGraduateClockTopReverse == m_nMaskType ||
|
||
Constants::c_nGraduateClockBottomReverse == m_nMaskType ||
|
||
Constants::c_nGraduateClock2AnglesReverse == m_nMaskType ||
|
||
Constants::c_nGraduateClock3AnglesReverse == m_nMaskType )
|
||
{
|
||
dFactor = 1.0 / IPP_2PI;
|
||
}
|
||
|
||
double dValueFactor = 65535.0 / (g_nTilesX * g_nTilesY);
|
||
|
||
struct TTile
|
||
{
|
||
int tile;
|
||
float x;
|
||
};
|
||
|
||
CBuffer<TTile> table( m_nMaskWidth );
|
||
if( table.IsEmpty() )
|
||
{
|
||
::memset( pBuffer, 255, m_nMaskWidth * m_nMaskHeight );
|
||
return;
|
||
}
|
||
|
||
for( int i = 0; i < m_nMaskWidth; ++i )
|
||
{
|
||
table[i].tile = i / g_nTileWidth;
|
||
table[i].x = i - (table[i].tile + 0.5) * g_nTileWidth;
|
||
}
|
||
|
||
for( int nY = 0; nY < m_nMaskHeight; nY++ )
|
||
{
|
||
int nCurTileY = nY / g_nTileHeight;
|
||
double dY = nY - (nCurTileY + 0.5) * g_nTileHeight;
|
||
|
||
nCurTileY *= g_nTilesX;
|
||
|
||
TTile* pTile = table.GetPtr();
|
||
|
||
for( int nX = 0; nX < m_nMaskWidth; ++nX, ++pTile )
|
||
{
|
||
double dAngle = atan2( dY, double(pTile->x) );
|
||
if( dAngle < 0 )
|
||
dAngle += IPP_2PI;
|
||
|
||
dAngle += dStartAngle;
|
||
dAngle *= nAnglesCount;
|
||
dAngle -= int(dAngle * (1.0 / IPP_2PI)) * IPP_2PI;
|
||
|
||
double dCur = nOffset + dAngle * dFactor;
|
||
if( bReverse )
|
||
{
|
||
if( dAngle > IPP_PI )
|
||
dCur = 2 - dCur;
|
||
}
|
||
|
||
*pBuffer++ = Ipp16u((dCur + g_pGraduation[pTile->tile + nCurTileY]) * dValueFactor);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
BOOL RandomShuffle(int nSize)
|
||
{
|
||
|
||
if (nSize < 1)
|
||
return FALSE;
|
||
if (nSize == g_nSize)
|
||
return TRUE;
|
||
|
||
g_nSize = nSize;
|
||
g_pGraduation = new int[g_nSize];
|
||
|
||
if (NULL == g_pGraduation)
|
||
return FALSE;
|
||
|
||
for (int index = 0; index < g_nSize; ++index)
|
||
g_pGraduation[index] = index;
|
||
|
||
//srand( 1 );
|
||
CRandom rnd( m_dwBaseRnd );
|
||
|
||
for (int index = 0; index < g_nSize; ++index)
|
||
{
|
||
int nSwapIndex = rnd.Rand( g_nSize );
|
||
int nSwapValue = g_pGraduation[nSwapIndex];
|
||
|
||
g_pGraduation[nSwapIndex] = g_pGraduation[index];
|
||
g_pGraduation[index] = nSwapValue;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
public:
|
||
|
||
Ipp16u* m_pMask;
|
||
|
||
protected:
|
||
|
||
int m_nMaskWidth;
|
||
int m_nMaskHeight;
|
||
|
||
int g_nSize;
|
||
int* g_pGraduation;
|
||
int m_nMaskType;
|
||
int g_nTilesX;
|
||
int g_nTilesY;
|
||
int g_nTileWidth;
|
||
int g_nTileHeight;
|
||
};
|
||
|
||
|
||
class CMask
|
||
{
|
||
public:
|
||
DWORD m_dwBaseRnd;
|
||
|
||
CMask()
|
||
{
|
||
m_nMaskWidth = -1;
|
||
m_nMaskHeight = -1;
|
||
m_nMaskType = -1;
|
||
|
||
m_pMask = 0;
|
||
|
||
m_dwBaseRnd = ::rand();
|
||
}
|
||
~CMask()
|
||
{
|
||
if ( m_pMask )
|
||
delete []m_pMask;
|
||
}
|
||
|
||
void GenerateMask(int nWidth, int nHeight, int nType)
|
||
{
|
||
if ((nWidth == m_nMaskWidth) && (nHeight == m_nMaskHeight) && (m_pMask) && (nType == m_nMaskType))
|
||
return ;
|
||
|
||
if (m_pMask)
|
||
delete []m_pMask;
|
||
|
||
int nSize = nWidth * nHeight;
|
||
if( !nSize )
|
||
return;
|
||
|
||
m_nMaskType = nType;
|
||
m_nMaskWidth = nWidth;
|
||
m_nMaskHeight = nHeight;
|
||
|
||
m_pMask = new BYTE[nSize];
|
||
if( !m_pMask )
|
||
return;
|
||
|
||
|
||
ZeroMemory( m_pMask, nSize );
|
||
|
||
if ( Constants::c_nBowTileHorizontal == nType || Constants::c_nBowTileSmoothHorizontal == nType ||
|
||
Constants::c_nBowTileVertical == nType || Constants::c_nBowTileSmoothVertical == nType)
|
||
BowTile();
|
||
else
|
||
if ( Constants::c_nDiagonalBoxOut == nType || Constants::c_nDiagonalSmoothBoxOut == nType)
|
||
DiagonalBoxOut();
|
||
else
|
||
if ( Constants::c_nDiagonalCrossOut == nType || Constants::c_nDiagonalSmoothCrossOut == nType)
|
||
DiagonalCrossOut();
|
||
else
|
||
if ( Constants::c_nDiagonalDownRight == nType || Constants::c_nDiagonalSmoothDownRight == nType ||
|
||
Constants::c_nDiagonalDownLeft == nType || Constants::c_nDiagonalSmoothDownLeft == nType ||
|
||
Constants::c_nDiagonalUpRight == nType || Constants::c_nDiagonalSmoothUpRight == nType ||
|
||
Constants::c_nDiagonalUpLeft == nType || Constants::c_nDiagonalSmoothUpLeft == nType)
|
||
Diagonal();
|
||
else
|
||
if ( Constants::c_nFunIn == nType || Constants::c_nFunSmoothIn == nType)
|
||
FunIn();
|
||
else
|
||
if ( Constants::c_nFunOut == nType || Constants::c_nFunSmoothOut == nType)
|
||
FunOut();
|
||
else
|
||
if ( Constants::c_nFunUp == nType || Constants::c_nFunSmoothUp == nType)
|
||
FunUp();
|
||
else
|
||
if ( Constants::c_nFilledVDown == nType || Constants::c_nFilledVSmoothDown == nType ||
|
||
Constants::c_nFilledVRight == nType || Constants::c_nFilledVSmoothRight == nType ||
|
||
Constants::c_nFilledVLeft == nType || Constants::c_nFilledVSmoothLeft == nType ||
|
||
Constants::c_nFilledVUp == nType || Constants::c_nFilledVSmoothUp == nType )
|
||
FilledV();
|
||
|
||
else
|
||
if ( Constants::c_nInsertDownLeft == nType || Constants::c_nInsertSmoothDownLeft == nType ||
|
||
Constants::c_nInsertDownRight == nType || Constants::c_nInsertSmoothDownRight == nType ||
|
||
Constants::c_nInsertUpLeft == nType || Constants::c_nInsertSmoothUpLeft == nType ||
|
||
Constants::c_nInsertUpRight == nType || Constants::c_nInsertSmoothUpRight == nType )
|
||
Insert();
|
||
else
|
||
if ( Constants::c_nRevealUp == nType || Constants::c_nRevealDown == nType ||
|
||
Constants::c_nRevealLeft == nType || Constants::c_nRevealRight == nType)
|
||
Reveal();
|
||
else
|
||
if ( Constants::c_nSplitHorizontal == nType || Constants::c_nSplitSmoothHorizontal == nType ||
|
||
Constants::c_nSplitVertical == nType || Constants::c_nSplitSmoothVertical == nType )
|
||
Split();
|
||
else
|
||
if ( Constants::c_nSweepIn == nType || Constants::c_nSweepSmoothIn == nType )
|
||
SweepIn();
|
||
else
|
||
if ( Constants::c_nSweepOut == nType || Constants::c_nSweepSmoothOut == nType )
|
||
SweepOut();
|
||
else
|
||
if ( Constants::c_nSweepUp == nType || Constants::c_nSweepSmoothUp == nType )
|
||
SweepUp();
|
||
else
|
||
if ( Constants::c_nZigZagSmoothVertical == nType || Constants::c_nZigZagVertical == nType )
|
||
ZigZagVer();
|
||
else
|
||
if ( Constants::c_nZigZagSmoothHorizontal == nType || Constants::c_nZigZagHorizontal == nType )
|
||
ZigZagHor();
|
||
else
|
||
if ( Constants::c_nPinwheelCurvedSN5A <= nType && Constants::c_nPinwheelPropeller12Smooth >= nType )
|
||
PinwheelCurved();
|
||
else if ( Constants::c_nWipeSmoothDiamond == nType || Constants::c_nWipeSmoothDiamondIn == nType)
|
||
Diamonds( 1, 1, nType != Constants::c_nWipeSmoothDiamondIn );
|
||
else if ( Constants::c_nWipeSmoothDiamonds == nType || Constants::c_nWipeDiamonds == nType )
|
||
Diamonds( 5, 5, TRUE );
|
||
else if ( Constants::c_nWipeSmoothCircle == nType || Constants::c_nWipeSmoothCircleIn == nType )
|
||
Circles( 1, nType != Constants::c_nWipeSmoothCircleIn );
|
||
else if ( Constants::c_nWipeSmoothCircles == nType || Constants::c_nWipeCircles == nType)
|
||
Circles( 5, TRUE );
|
||
else if ( Constants::c_nWipeSmoothWideStar == nType || Constants::c_nWipeSmoothNarrowStar == nType ||
|
||
Constants::c_nWipeSmoothWideFlower == nType || Constants::c_nWipeSmoothNarrowFlower == nType)
|
||
StarFlower();
|
||
else if ( Constants::c_nWipeSmoothWideStars == nType || Constants::c_nWipeSmoothNarrowStars == nType ||
|
||
Constants::c_nWipeSmoothWideFlowers == nType || Constants::c_nWipeSmoothNarrowFlowers == nType)
|
||
StarsFlowers();
|
||
else if ( Constants::c_nWipeSmoothWideKeyHole == nType || Constants::c_nWipeSmoothNarrowKeyHole == nType)
|
||
KeyHole();
|
||
else if ( Constants::c_nWipeSmoothWideKeyHoles == nType || Constants::c_nWipeSmoothNarrowKeyHoles == nType)
|
||
KeyHoles();
|
||
else if ( Constants::c_nCircleCornerLeftBottom == nType || Constants::c_nCircleCornerSmoothLeftBottom == nType ||
|
||
Constants::c_nCircleCornerLeftTop == nType || Constants::c_nCircleCornerSmoothLeftTop == nType ||
|
||
Constants::c_nCircleCornerRightBottom == nType || Constants::c_nCircleCornerSmoothRightBottom == nType ||
|
||
Constants::c_nCircleCornerRightTop == nType || Constants::c_nCircleCornerSmoothRightTop == nType )
|
||
CircleCorner();
|
||
|
||
else if( Constants::c_nBarsHorizontal == nType)
|
||
BarsHorizontal();
|
||
else if( Constants::c_nBarsVertical == nType)
|
||
BarsVertical();
|
||
else if( Constants::c_nWipeSmoothBoxIn == nType || Constants::c_nWipeSmoothBoxOut == nType)
|
||
Box();
|
||
else if( Constants::c_nEnhancedAlphaNoise == nType )
|
||
Noise();
|
||
else if( Constants::c_nEnhancedShutter == nType )
|
||
Shutter();
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
protected:
|
||
|
||
void BowTile()
|
||
{
|
||
CBuffer<double> oTable(m_nMaskWidth + m_nMaskHeight);
|
||
if( oTable.IsEmpty() )
|
||
{
|
||
::memset( m_pMask, 255, m_nMaskWidth * m_nMaskHeight );
|
||
return;
|
||
}
|
||
|
||
double dFactorX = 2.0 / m_nMaskWidth;
|
||
double dFactorY = 2.0 / m_nMaskHeight;
|
||
double dSignX = (Constants::c_nBowTileHorizontal == m_nMaskType || Constants::c_nBowTileSmoothHorizontal == m_nMaskType) ? -128 : 128;
|
||
double dSignY = (Constants::c_nBowTileHorizontal == m_nMaskType || Constants::c_nBowTileSmoothHorizontal == m_nMaskType) ? 128 : -128;
|
||
|
||
double* pTableY = oTable.GetPtr();
|
||
for( int nX = 0; nX < m_nMaskWidth; ++nX )
|
||
{
|
||
*pTableY++ = abs(nX * dFactorX - 1) * dSignX;
|
||
}
|
||
|
||
for( int nY = m_nMaskHeight - 1; nY >= 0; --nY )
|
||
{
|
||
*pTableY++ = abs(nY * dFactorY - 1) * dSignY + 127.5;
|
||
}
|
||
|
||
double* pLimit = pTableY - m_nMaskHeight;
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
for( pTableY -= 1; pTableY >= pLimit; --pTableY )
|
||
{
|
||
for( double* pTableX = oTable.GetPtr(); pTableX < pLimit; ++pTableX )
|
||
{
|
||
*pBuffer++ = BYTE(pTableY[0] + pTableX[0]);
|
||
}
|
||
}
|
||
}
|
||
|
||
void DiagonalBoxOut()
|
||
{
|
||
CBuffer<double> oTable(m_nMaskWidth + m_nMaskHeight);
|
||
if( oTable.IsEmpty() )
|
||
{
|
||
::memset( m_pMask, 255, m_nMaskWidth * m_nMaskHeight );
|
||
return;
|
||
}
|
||
|
||
double dFactorX = 2.0 / m_nMaskWidth;
|
||
double dFactorY = 2.0 / m_nMaskHeight;
|
||
|
||
double* pTableY = oTable.GetPtr();
|
||
for( int nX = 0; nX < m_nMaskWidth; ++nX )
|
||
{
|
||
*pTableY++ = abs(nX * dFactorX - 1) * 255;
|
||
}
|
||
|
||
for( int nY = m_nMaskHeight - 1; nY >= 0; --nY )
|
||
{
|
||
*pTableY++ = (1 - abs(nY * dFactorY - 1)) * 255;
|
||
}
|
||
|
||
double* pLimit = pTableY - m_nMaskHeight;
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
for( pTableY -= 1; pTableY >= pLimit; --pTableY )
|
||
{
|
||
for( double* pTableX = oTable.GetPtr(); pTableX < pLimit; ++pTableX )
|
||
{
|
||
*pBuffer++ = BYTE(abs(pTableY[0] - pTableX[0]));
|
||
}
|
||
}
|
||
}
|
||
void DiagonalCrossOut()
|
||
{
|
||
CBuffer<double> oTable(m_nMaskWidth + m_nMaskHeight);
|
||
if( oTable.IsEmpty() )
|
||
{
|
||
::memset( m_pMask, 255, m_nMaskWidth * m_nMaskHeight );
|
||
return;
|
||
}
|
||
|
||
double dFactorX = 2.0 / m_nMaskWidth;
|
||
double dFactorY = 2.0 / m_nMaskHeight;
|
||
|
||
double* pTableY = oTable.GetPtr();
|
||
for( int nX = 0; nX < m_nMaskWidth; ++nX )
|
||
{
|
||
*pTableY++ = abs(nX * dFactorX - 1) * 255;
|
||
}
|
||
|
||
for( int nY = m_nMaskHeight - 1; nY >= 0; --nY )
|
||
{
|
||
*pTableY++ = abs(nY * dFactorY - 1) * 255;
|
||
}
|
||
|
||
double* pLimit = pTableY - m_nMaskHeight;
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
for( pTableY -= 1; pTableY >= pLimit; --pTableY )
|
||
{
|
||
for( double* pTableX = oTable.GetPtr(); pTableX < pLimit; ++pTableX )
|
||
{
|
||
*pBuffer++ = BYTE(abs(pTableX[0] - pTableY[0]));
|
||
}
|
||
}
|
||
}
|
||
|
||
void Diagonal()
|
||
{
|
||
CBuffer<double> oTable(m_nMaskWidth + m_nMaskHeight);
|
||
if( oTable.IsEmpty() )
|
||
{
|
||
::memset( m_pMask, 255, m_nMaskWidth * m_nMaskHeight );
|
||
return;
|
||
}
|
||
|
||
double dOffset = 255.0 / (m_nMaskHeight + m_nMaskWidth);
|
||
double dFactorX = dOffset;
|
||
double dFactorY = dOffset;
|
||
|
||
if( Constants::c_nDiagonalDownRight == m_nMaskType ||
|
||
Constants::c_nDiagonalSmoothDownRight == m_nMaskType)
|
||
{
|
||
dOffset *= m_nMaskHeight;
|
||
dFactorX *= 1;
|
||
dFactorY *= -1;
|
||
}
|
||
else
|
||
if( Constants::c_nDiagonalDownLeft == m_nMaskType ||
|
||
Constants::c_nDiagonalSmoothDownLeft == m_nMaskType)
|
||
{
|
||
dOffset *= m_nMaskWidth + m_nMaskHeight;
|
||
dFactorX *= -1;
|
||
dFactorY *= -1;
|
||
}
|
||
else
|
||
if( Constants::c_nDiagonalUpRight == m_nMaskType ||
|
||
Constants::c_nDiagonalSmoothUpRight == m_nMaskType)
|
||
{
|
||
dOffset *= 0;
|
||
dFactorX *= 1;
|
||
dFactorY *= 1;
|
||
}
|
||
else
|
||
if( Constants::c_nDiagonalUpLeft == m_nMaskType ||
|
||
Constants::c_nDiagonalSmoothUpLeft == m_nMaskType)
|
||
{
|
||
dOffset *= m_nMaskWidth;
|
||
dFactorX *= -1;
|
||
dFactorY *= 1;
|
||
}
|
||
|
||
double* pTableY = oTable.GetPtr();
|
||
for( int nX = 0; nX < m_nMaskWidth; ++nX )
|
||
{
|
||
*pTableY++ = nX * dFactorX;
|
||
}
|
||
|
||
for( int nY = m_nMaskHeight - 1; nY >= 0; --nY )
|
||
{
|
||
*pTableY++ = nY * dFactorY + dOffset;
|
||
}
|
||
|
||
double* pLimit = pTableY - m_nMaskHeight;
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
for( pTableY -= 1; pTableY >= pLimit; --pTableY )
|
||
{
|
||
for( double* pTableX = oTable.GetPtr(); pTableX < pLimit; ++pTableX )
|
||
{
|
||
*pBuffer++ = BYTE(pTableY[0] + pTableX[0]);
|
||
}
|
||
}
|
||
}
|
||
|
||
void FunIn()
|
||
{
|
||
const double c_dFactor = 255 / IPP_PI;
|
||
|
||
CBuffer<double> oTable(m_nMaskWidth + m_nMaskHeight);
|
||
if( oTable.IsEmpty() )
|
||
{
|
||
::memset( m_pMask, 255, m_nMaskWidth * m_nMaskHeight );
|
||
return;
|
||
}
|
||
|
||
double dHalfWidth = m_nMaskWidth / 2.0;
|
||
double dHalfHeight = m_nMaskHeight / 2.0;
|
||
|
||
double* pTableY = oTable.GetPtr();
|
||
for( int nX = 0; nX < m_nMaskWidth; ++nX )
|
||
{
|
||
*pTableY++ = nX - dHalfWidth;
|
||
}
|
||
|
||
for( int nY = m_nMaskHeight - 1; nY >= 0; --nY )
|
||
{
|
||
*pTableY++ = nY - dHalfHeight * (nY >= dHalfHeight ? 1.5 : 0.5);
|
||
}
|
||
|
||
double* pLimit = pTableY - m_nMaskHeight;
|
||
Ipp8u* pBuffer = m_pMask;
|
||
double* pHalfLimit = pLimit + m_nMaskHeight / 2;
|
||
|
||
for( pTableY -= 1; pTableY >= pLimit; --pTableY )
|
||
{
|
||
for( double* pTableX = oTable.GetPtr(); pTableX < pLimit; ++pTableX )
|
||
{
|
||
double dAngle = abs(atan2( pTableX[0], pTableY[0] ));
|
||
|
||
if( pTableY >= pHalfLimit )
|
||
dAngle = IPP_PI - dAngle;
|
||
|
||
*pBuffer++ = BYTE(dAngle * c_dFactor);
|
||
}
|
||
}
|
||
}
|
||
|
||
void FunOut()
|
||
{
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
const double dFactor = 255 / IPP_2PI;
|
||
|
||
int nHalfWidth = m_nMaskWidth / 2;
|
||
int nHalfHeight = m_nMaskHeight / 2;
|
||
|
||
double offset1 = m_nMaskWidth * 0.75;
|
||
double offset2 = m_nMaskWidth * 0.25;
|
||
|
||
for( int nY = 0; nY < m_nMaskHeight; ++nY )
|
||
{
|
||
double dY = nY - nHalfHeight;
|
||
|
||
for( int nX = 0; nX < m_nMaskWidth; ++nX )
|
||
{
|
||
double dAngle;
|
||
|
||
if( nX > nHalfWidth )
|
||
{
|
||
dAngle = IPP_PI - atan2( dY, nX - offset1 );
|
||
}
|
||
else
|
||
{
|
||
dAngle = atan2( dY, nX - offset2 );
|
||
if( dAngle < 0 )
|
||
dAngle += IPP_2PI;
|
||
}
|
||
*pBuffer++ = int(dAngle * dFactor);
|
||
}
|
||
}
|
||
}
|
||
|
||
void FunUp()
|
||
{
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
const double dFactor = 255 / IPP_PI2;
|
||
|
||
double dHalfWidth = m_nMaskWidth / 2.0;
|
||
|
||
for( int nY = 0; nY < m_nMaskHeight; nY++ )
|
||
{
|
||
double y = nY - m_nMaskHeight;
|
||
|
||
for( int nX = 0; nX < m_nMaskWidth; nX++ )
|
||
{
|
||
double dAngle = IPP_PI - abs(atan2( nX - dHalfWidth, y ));
|
||
*pBuffer++ = int(dAngle * dFactor);
|
||
}
|
||
}
|
||
}
|
||
|
||
void FilledV()
|
||
{
|
||
double dFactorX = 128.0 / m_nMaskWidth;
|
||
double dFactorY = 128.0 / m_nMaskHeight;
|
||
double dOffsetX = 128.0;
|
||
double dOffsetY = 128.0;
|
||
|
||
if( Constants::c_nFilledVDown == m_nMaskType ||
|
||
Constants::c_nFilledVSmoothDown == m_nMaskType )
|
||
{
|
||
dFactorX *= 2; dOffsetX *= -1;
|
||
dFactorY *= -1; dOffsetY *= 1;
|
||
}
|
||
else
|
||
if( Constants::c_nFilledVRight == m_nMaskType ||
|
||
Constants::c_nFilledVSmoothRight == m_nMaskType )
|
||
{
|
||
dFactorX *= 1; dOffsetX *= 0;
|
||
dFactorY *= 2; dOffsetY *= -1;
|
||
}
|
||
else
|
||
if( Constants::c_nFilledVLeft == m_nMaskType ||
|
||
Constants::c_nFilledVSmoothLeft == m_nMaskType )
|
||
{
|
||
dFactorX *= -1; dOffsetX *= 1;
|
||
dFactorY *= 2; dOffsetY *= -1;
|
||
}
|
||
else
|
||
if( Constants::c_nFilledVUp == m_nMaskType ||
|
||
Constants::c_nFilledVSmoothUp == m_nMaskType )
|
||
{
|
||
dFactorX *= 2; dOffsetX *= -1;
|
||
dFactorY *= 1; dOffsetY *= 0;
|
||
}
|
||
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
for( int nY = 0; nY < m_nMaskHeight; ++nY )
|
||
{
|
||
double dY = abs(nY * dFactorY + dOffsetY);
|
||
|
||
for( int nX = 0; nX < m_nMaskWidth; ++nX )
|
||
{
|
||
*pBuffer++ = BYTE(abs(nX * dFactorX + dOffsetX) + dY);
|
||
}
|
||
}
|
||
}
|
||
void Insert()
|
||
{
|
||
double dFactorX = 255.0 / m_nMaskWidth;
|
||
double dFactorY = 255.0 / m_nMaskHeight;
|
||
double dOffsetX = 255.0;
|
||
double dOffsetY = 255.0;
|
||
|
||
if( Constants::c_nInsertDownLeft == m_nMaskType ||
|
||
Constants::c_nInsertSmoothDownLeft == m_nMaskType )
|
||
{
|
||
dFactorX *= -1; dOffsetX *= 1;
|
||
dFactorY *= -1; dOffsetY *= 1;
|
||
}
|
||
else
|
||
if( Constants::c_nInsertDownRight == m_nMaskType ||
|
||
Constants::c_nInsertSmoothDownRight == m_nMaskType )
|
||
{
|
||
dFactorX *= 1; dOffsetX *= 0;
|
||
dFactorY *= -1; dOffsetY *= 1;
|
||
}
|
||
else
|
||
if( Constants::c_nInsertUpLeft == m_nMaskType ||
|
||
Constants::c_nInsertSmoothUpLeft == m_nMaskType )
|
||
{
|
||
dFactorX *= -1; dOffsetX *= 1;
|
||
dFactorY *= 1; dOffsetY *= 0;
|
||
}
|
||
else
|
||
if( Constants::c_nInsertUpRight == m_nMaskType ||
|
||
Constants::c_nInsertSmoothUpRight == m_nMaskType )
|
||
{
|
||
dFactorX *= 1; dOffsetX *= 0;
|
||
dFactorY *= 1; dOffsetY *= 0;
|
||
}
|
||
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
for( int nY = 0; nY < m_nMaskHeight; nY++ )
|
||
{
|
||
double dY = nY * dFactorY + dOffsetY;
|
||
|
||
for( int nX = 0; nX < m_nMaskWidth; nX++ )
|
||
{
|
||
double dX = nX * dFactorX + dOffsetX;
|
||
|
||
*pBuffer++ = BYTE(max(dX, dY));
|
||
}
|
||
}
|
||
}
|
||
|
||
void Reveal()
|
||
{
|
||
double dFactor = 255.0;
|
||
double dOffset = 255.0;
|
||
BOOL bHor = TRUE;
|
||
|
||
if( Constants::c_nRevealUp == m_nMaskType)
|
||
{
|
||
dFactor /= m_nMaskHeight; dOffset *= 0; bHor = FALSE;
|
||
}
|
||
else if( Constants::c_nRevealDown == m_nMaskType)
|
||
{
|
||
dFactor /= -m_nMaskHeight; dOffset *= 1; bHor = FALSE;
|
||
}
|
||
else if( Constants::c_nRevealLeft == m_nMaskType)
|
||
{
|
||
dFactor /= -m_nMaskWidth; dOffset *= 1;
|
||
}
|
||
else if( Constants::c_nRevealRight == m_nMaskType)
|
||
{
|
||
dFactor /= m_nMaskWidth; dOffset *= 0;
|
||
}
|
||
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
for ( int nY = 0; nY < m_nMaskHeight; nY++ )
|
||
{
|
||
for ( int nX = 0; nX < m_nMaskWidth; nX++ )
|
||
{
|
||
*pBuffer++ = BYTE((bHor ? nX : nY) * dFactor + dOffset);
|
||
}
|
||
}
|
||
}
|
||
void Split()
|
||
{
|
||
BOOL bHor = FALSE;
|
||
double dFactor = 511;
|
||
|
||
if( Constants::c_nSplitHorizontal == m_nMaskType ||
|
||
Constants::c_nSplitSmoothHorizontal == m_nMaskType )
|
||
{
|
||
dFactor /= m_nMaskHeight; bHor = FALSE;
|
||
}
|
||
else
|
||
if( Constants::c_nSplitVertical == m_nMaskType ||
|
||
Constants::c_nSplitSmoothVertical == m_nMaskType )
|
||
{
|
||
dFactor /= m_nMaskWidth; bHor = TRUE;
|
||
}
|
||
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
for ( int nY = 0; nY < m_nMaskHeight; nY++ )
|
||
{
|
||
for ( int nX = 0; nX < m_nMaskWidth; nX++ )
|
||
{
|
||
*pBuffer++ = BYTE(abs((bHor ? nX : nY) * dFactor - 255.5));
|
||
}
|
||
}
|
||
}
|
||
void SweepIn()
|
||
{
|
||
double dAngFactor = 255 / (IPP_PI2 - atan( m_nMaskHeight / (2.0 * m_nMaskWidth) ));
|
||
|
||
double dFactor = m_nMaskHeight / (2.0 * m_nMaskWidth );
|
||
double dOffset = m_nMaskHeight * 0.25;
|
||
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
for ( int nY = 0; nY < m_nMaskHeight; nY++ )
|
||
{
|
||
double dY = nY - dOffset;
|
||
|
||
for ( int nX = 0; nX < m_nMaskWidth; nX++ )
|
||
{
|
||
double dAngle;
|
||
|
||
if ( dY > nX * dFactor )
|
||
{
|
||
double y = nX;
|
||
double x = dY;
|
||
|
||
dAngle = abs(atan2( y, x ));
|
||
}
|
||
else
|
||
{
|
||
double y = nX - m_nMaskWidth;
|
||
double x = dY - dOffset - dOffset;
|
||
|
||
dAngle = IPP_PI - abs(atan2( y, x ));
|
||
}
|
||
|
||
*pBuffer++ = BYTE(dAngle * dAngFactor);
|
||
}
|
||
}
|
||
}
|
||
void SweepOut()
|
||
{
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
const double dFactor = 255 / IPP_PI;
|
||
int nHalfWidth = m_nMaskWidth / 2;
|
||
int nHalfHeight = m_nMaskHeight / 2;
|
||
|
||
for ( int nY = 0; nY < m_nMaskHeight; nY++ )
|
||
{
|
||
for ( int nX = 0; nX < m_nMaskWidth; nX++ )
|
||
{
|
||
double x = nY - nHalfHeight;
|
||
double y = nX;
|
||
|
||
if( nX > nHalfWidth)
|
||
y -= m_nMaskWidth;
|
||
|
||
double dAngle = abs( atan2( y, x ) );
|
||
|
||
*pBuffer++ = BYTE(dAngle * dFactor);
|
||
}
|
||
}
|
||
}
|
||
void SweepUp()
|
||
{
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
const double dFactor = 255 / IPP_PI2;
|
||
|
||
int nHalfWidth = m_nMaskWidth / 2;
|
||
|
||
for ( int nY = 0; nY < m_nMaskHeight; nY++ )
|
||
{
|
||
for ( int nX = 0; nX < m_nMaskWidth; nX++ )
|
||
{
|
||
double dAngle;
|
||
|
||
if( nX > nHalfWidth )
|
||
{
|
||
double y = nY;
|
||
double x = nX - m_nMaskWidth;
|
||
|
||
dAngle = IPP_PI - abs( atan2( y, x ));
|
||
}
|
||
else
|
||
{
|
||
double y = nY;
|
||
double x = nX;
|
||
|
||
dAngle = abs( atan2( y, x ));
|
||
}
|
||
|
||
*pBuffer++ = BYTE(dAngle * dFactor);
|
||
}
|
||
}
|
||
}
|
||
|
||
void ZigZagHor()
|
||
{
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
const int nZigZagCount = 4;
|
||
|
||
double dZigZagWidth = m_nMaskWidth / (nZigZagCount * 2.0);
|
||
double dZigZagHeight = m_nMaskHeight / 5.0;
|
||
double dTimeUnit = 255.0 / (m_nMaskHeight * 0.6);
|
||
|
||
double factor = dZigZagHeight / dZigZagWidth;
|
||
double dAddOffset = (m_nMaskHeight + dZigZagHeight) / 2.0;
|
||
double dSubOffset = (m_nMaskHeight - dZigZagHeight) / 2.0;
|
||
|
||
for( int nY = 0; nY < m_nMaskHeight; nY++ )
|
||
{
|
||
int part = 0;
|
||
|
||
for( int nX = 0; nX < m_nMaskWidth; ++nX, ++part )
|
||
{
|
||
if( part >= dZigZagWidth * 2 )
|
||
part = 0;
|
||
|
||
int value = 0;
|
||
|
||
if( part < dZigZagWidth )
|
||
{
|
||
double offset = (dZigZagWidth - part) * factor;
|
||
|
||
if( nY > dAddOffset - part * factor )
|
||
value = int((nY - dSubOffset - offset) * dTimeUnit);
|
||
else
|
||
value = int((offset - nY + dSubOffset) * dTimeUnit);
|
||
}
|
||
else
|
||
{
|
||
double offset = (dZigZagWidth * 2 - part) * factor;
|
||
|
||
if(nY > dSubOffset + (part - dZigZagWidth) * factor )
|
||
value = int((nY - dAddOffset + offset) * dTimeUnit);
|
||
else
|
||
value = int((dAddOffset - nY - offset) * dTimeUnit);
|
||
}
|
||
|
||
*pBuffer++ = value;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
void ZigZagVer()
|
||
{
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
const int nZigZagCount = 4;
|
||
|
||
double dZigZagHeight = m_nMaskHeight / (nZigZagCount * 2.0);
|
||
double dZigZagWidth = m_nMaskWidth / 5.0;
|
||
double dTimeUnit = 255 / (m_nMaskWidth * 0.6);
|
||
|
||
double factor = dZigZagWidth / dZigZagHeight;
|
||
double dAddOffset = (m_nMaskWidth + dZigZagWidth) / 2.0;
|
||
double dSubOffset = (m_nMaskWidth - dZigZagWidth) / 2.0;
|
||
|
||
int part = 0;
|
||
|
||
for( int nY = 0; nY < m_nMaskHeight; ++nY, ++part )
|
||
{
|
||
if( part >= dZigZagHeight * 2 )
|
||
part = 0;
|
||
|
||
for( int nX = 0; nX < m_nMaskWidth; ++nX )
|
||
{
|
||
int value = 0;
|
||
|
||
if( part < dZigZagHeight )
|
||
{
|
||
double offset = (dZigZagHeight - part) * factor;
|
||
|
||
if( nX > - part * factor + dAddOffset )
|
||
value = int((nX - dSubOffset - offset) * dTimeUnit);
|
||
else
|
||
value = int((dSubOffset - nX + offset) * dTimeUnit);
|
||
}
|
||
else
|
||
{
|
||
double offset = (dZigZagHeight * 2 - part) * factor;
|
||
|
||
if( nX > (part - dZigZagHeight) * factor + dSubOffset )
|
||
value = int((nX - dAddOffset + offset) * dTimeUnit);
|
||
else
|
||
value = int((dAddOffset - nX - offset) * dTimeUnit);
|
||
}
|
||
|
||
*pBuffer++ = value;
|
||
}
|
||
}
|
||
}
|
||
|
||
void PinwheelCurved()
|
||
{
|
||
double dParts = 1;
|
||
double dAmplitFactor = 0.1;
|
||
double dPhaseFactor = 2.0;
|
||
|
||
switch( m_nMaskType )
|
||
{
|
||
case Constants::c_nPinwheelCurvedSN5A: dParts = 5; dAmplitFactor = 0.1; dPhaseFactor = 10.0; break;
|
||
case Constants::c_nPinwheelCurvedSN7A: dParts = 7; dAmplitFactor = 0.1; dPhaseFactor = 10.0; break;
|
||
case Constants::c_nPinwheelCurvedSN12A: dParts = 12; dAmplitFactor = 0.1; dPhaseFactor = 10.0; break;
|
||
case Constants::c_nPinwheelCurvedSW5A: dParts = 5; dAmplitFactor = 0.1; dPhaseFactor = 2.0; break;
|
||
case Constants::c_nPinwheelCurvedSW7A: dParts = 7; dAmplitFactor = 0.1; dPhaseFactor = 2.0; break;
|
||
case Constants::c_nPinwheelCurvedSW12A: dParts = 12; dAmplitFactor = 0.1; dPhaseFactor = 2.0; break;
|
||
case Constants::c_nPinwheelCurvedLN5A: dParts = 5; dAmplitFactor = 0.8; dPhaseFactor = 2.0; break;
|
||
case Constants::c_nPinwheelCurvedLN7A: dParts = 7; dAmplitFactor = 0.8; dPhaseFactor = 2.0; break;
|
||
case Constants::c_nPinwheelCurvedLN12A: dParts = 12; dAmplitFactor = 0.8; dPhaseFactor = 2.0; break;
|
||
case Constants::c_nPinwheelPropeller4: dParts = 4; dAmplitFactor = 0.4; dPhaseFactor = 10.0; break;
|
||
case Constants::c_nPinwheelPropeller7: dParts = 7; dAmplitFactor = 0.4; dPhaseFactor = 10.0; break;
|
||
case Constants::c_nPinwheelPropeller12: dParts = 12; dAmplitFactor = 0.4; dPhaseFactor = 10.0; break;
|
||
|
||
case Constants::c_nPinwheelCurvedSN5ASmooth: dParts = 5; dAmplitFactor = 0.1; dPhaseFactor = 10.0; break;
|
||
case Constants::c_nPinwheelCurvedSN7ASmooth: dParts = 7; dAmplitFactor = 0.1; dPhaseFactor = 10.0; break;
|
||
case Constants::c_nPinwheelCurvedSN12ASmooth: dParts = 12; dAmplitFactor = 0.1; dPhaseFactor = 10.0; break;
|
||
case Constants::c_nPinwheelCurvedSW5ASmooth: dParts = 5; dAmplitFactor = 0.1; dPhaseFactor = 2.0; break;
|
||
case Constants::c_nPinwheelCurvedSW7ASmooth: dParts = 7; dAmplitFactor = 0.1; dPhaseFactor = 2.0; break;
|
||
case Constants::c_nPinwheelCurvedSW12ASmooth: dParts = 12; dAmplitFactor = 0.1; dPhaseFactor = 2.0; break;
|
||
case Constants::c_nPinwheelCurvedLN5ASmooth: dParts = 5; dAmplitFactor = 0.8; dPhaseFactor = 2.0; break;
|
||
case Constants::c_nPinwheelCurvedLN7ASmooth: dParts = 7; dAmplitFactor = 0.8; dPhaseFactor = 2.0; break;
|
||
case Constants::c_nPinwheelCurvedLN12ASmooth: dParts = 12; dAmplitFactor = 0.8; dPhaseFactor = 2.0; break;
|
||
case Constants::c_nPinwheelPropeller4Smooth: dParts = 4; dAmplitFactor = 0.4; dPhaseFactor = 10.0; break;
|
||
case Constants::c_nPinwheelPropeller7Smooth: dParts = 7; dAmplitFactor = 0.4; dPhaseFactor = 10.0; break;
|
||
case Constants::c_nPinwheelPropeller12Smooth: dParts = 12; dAmplitFactor = 0.4; dPhaseFactor = 10.0; break;
|
||
}
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
int nSizeTable = int(m_nMaskWidth + m_nMaskHeight);
|
||
double* pTable = new double[(nSizeTable + 1)];
|
||
if( !pTable )
|
||
{
|
||
memset( m_pMask, 255, m_nMaskWidth * m_nMaskHeight );
|
||
return;
|
||
}
|
||
|
||
double dMaxRadius = (m_nMaskWidth * m_nMaskWidth + m_nMaskHeight * m_nMaskHeight) / 4.0;
|
||
double dFactor = dMaxRadius / nSizeTable;
|
||
|
||
double dAmplit = sqrt(dMaxRadius) * dAmplitFactor; // * 4;
|
||
if ( ( m_nMaskType >= Constants::c_nPinwheelPropeller4 && m_nMaskType <= Constants::c_nPinwheelPropeller12 ) ||
|
||
( m_nMaskType >= Constants::c_nPinwheelPropeller4Smooth && m_nMaskType <= Constants::c_nPinwheelPropeller12Smooth ))
|
||
dAmplit = dMaxRadius * dAmplitFactor;
|
||
double dPhase = IPP_2PI / m_nMaskWidth * dPhaseFactor;
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
pTable[0] = 0;
|
||
for( int i = 1; i <= nSizeTable; i++ )
|
||
{
|
||
double dr = sqrt(i * dFactor);
|
||
pTable[i] = sin( dr * dPhase ) * dAmplit / dr;
|
||
}
|
||
|
||
// <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
int nSizeHelp = max(m_nMaskWidth, m_nMaskHeight);
|
||
double* pHelp = new double[nSizeHelp * 2];
|
||
if( !pHelp )
|
||
{
|
||
delete [] pTable;
|
||
memset( m_pMask, 255, m_nMaskWidth * m_nMaskHeight );
|
||
return;
|
||
}
|
||
|
||
int nMinSize = nSizeHelp / 2;
|
||
int nMaxSize = nSizeHelp - nMinSize;
|
||
|
||
dFactor = nSizeTable / dMaxRadius;
|
||
|
||
double* pItem = pHelp;
|
||
for( int i = -nMinSize; i < nMaxSize; ++i, pItem += 2 )
|
||
{
|
||
pItem[1] = i;
|
||
pItem[0] = i * i * dFactor;
|
||
}
|
||
|
||
Ipp8u* pBuffer = m_pMask;
|
||
int nWidth = m_nMaskWidth;
|
||
int nHeight = m_nMaskHeight;
|
||
|
||
double* pItemY = pHelp + (nMinSize - nHeight / 2) * 2;
|
||
double* pItemX = pHelp + (nMinSize - nWidth / 2) * 2;
|
||
|
||
dParts *= 255 / IPP_2PI;
|
||
|
||
for( int nY = nHeight; nY > 0; --nY, pItemY += 2, pItemX -= nWidth * 2 )
|
||
{
|
||
for ( int nX = nWidth; nX > 0; --nX, pItemX += 2 )
|
||
{
|
||
double dot = pItemY[0] + pItemX[0];
|
||
|
||
int index = int(dot);
|
||
double dr = pTable[index];
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if( index < nSizeTable )
|
||
{
|
||
dot -= index;
|
||
dr += (pTable[index + 1] - dr) * dot;
|
||
}
|
||
|
||
double x = pItemX[1] - dr * pItemY[1];
|
||
double y = pItemY[1] + dr * pItemX[1];
|
||
|
||
double dAngle = atan2( y, x );
|
||
if( dAngle < 0 )
|
||
dAngle += IPP_2PI;
|
||
|
||
*pBuffer++ = int( dAngle * dParts);
|
||
}
|
||
}
|
||
|
||
delete [] pHelp;
|
||
delete [] pTable;
|
||
}
|
||
|
||
void Diamonds( int nHorDiamonds, int nVerDiamonds, BOOL bOut )
|
||
{
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
double dPartWidth = double(m_nMaskWidth) / nHorDiamonds;
|
||
double dPartHeight = double(m_nMaskHeight) / nVerDiamonds;
|
||
double dHalfWidth = dPartWidth / 2;
|
||
double dHalfHeight = dPartHeight / 2;
|
||
|
||
double dFactorX = 255.0 / dPartWidth;
|
||
double dFactorY = 255.0 / dPartHeight;
|
||
|
||
double dMaxY = dPartHeight;
|
||
for ( int nY = 0; nY < m_nMaskHeight; nY++ )
|
||
{
|
||
if( dMaxY < nY )
|
||
dMaxY += dPartHeight;
|
||
|
||
double dY = abs( dMaxY - nY - dHalfHeight ) * dFactorY;
|
||
|
||
double dMaxX = dPartWidth;
|
||
for ( int nX = 0; nX < m_nMaskWidth; nX++ )
|
||
{
|
||
if( dMaxX < nX )
|
||
dMaxX += dPartWidth;
|
||
|
||
int nValue = int(abs( dMaxX - nX - dHalfWidth ) * dFactorX + dY);
|
||
|
||
*pBuffer++ = bOut ? nValue : 255 - nValue;
|
||
}
|
||
}
|
||
}
|
||
void Circles( double dMaxCountCircles, BOOL bOut )
|
||
{
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
double dPartSize = max(m_nMaskWidth, m_nMaskHeight) / (dMaxCountCircles - 0.001);
|
||
double dHalfSize = dPartSize / 2;
|
||
double dStartX = (m_nMaskWidth - (int(m_nMaskWidth / dPartSize) + 1) * dPartSize) / 2 + dPartSize;
|
||
double dStartY = (m_nMaskHeight - (int(m_nMaskHeight / dPartSize) + 1) * dPartSize) / 2 + dPartSize;
|
||
|
||
double dFactor = 255 / sqrt(dHalfSize * dHalfSize * 2);
|
||
|
||
double dMaxY = dStartY;
|
||
for ( int nY = 0; nY < m_nMaskHeight; nY++ )
|
||
{
|
||
if( dMaxY < nY )
|
||
dMaxY += dPartSize;
|
||
|
||
double dy = dMaxY - nY - dHalfSize;
|
||
dy *= dy;
|
||
|
||
double dMaxX = dStartX;
|
||
for ( int nX = 0; nX < m_nMaskWidth; nX++ )
|
||
{
|
||
if( dMaxX < nX )
|
||
dMaxX += dPartSize;
|
||
|
||
double dx = dMaxX - nX - dHalfSize;
|
||
|
||
int nValue = sqrt(dx * dx + dy) * dFactor;
|
||
|
||
*pBuffer++ = bOut ? nValue : 255 - nValue;
|
||
}
|
||
}
|
||
}
|
||
|
||
void StarFlower()
|
||
{
|
||
int nType = m_nMaskType;
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
const int nStarsPoints = 5;
|
||
const int nCountSectors = nStarsPoints * 2;
|
||
|
||
const double dFactor = ::sin(IPP_PI2 * (nCountSectors - 4) / nCountSectors) / ::sin(IPP_PI2 * (nCountSectors - 8) / nCountSectors); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
const double dSector = IPP_2PI / nCountSectors;
|
||
const double dReSector = nCountSectors / IPP_2PI;
|
||
|
||
const double f1 = (dFactor - 1) * nCountSectors / IPP_2PI;
|
||
const double f2 = 1 / sqrt(dFactor * (dFactor - 2 * cos(dSector)) + 1);
|
||
|
||
for ( int nY = 0; nY < m_nMaskHeight; nY++ )
|
||
{
|
||
for ( int nX = 0; nX < m_nMaskWidth; nX++ )
|
||
{
|
||
double y = nY - m_nMaskHeight / 2;
|
||
double x = nX - m_nMaskWidth / 2;
|
||
|
||
double dCurRadius = sqrt(x * x + y * y);
|
||
double angle = atan2( y, x ) - IPP_PI2;
|
||
|
||
if( angle < 0 )
|
||
angle += IPP_2PI;
|
||
|
||
int nCurSector = angle * dReSector;
|
||
double nCurAngle = angle - nCurSector * dSector;
|
||
|
||
double dSmallRadius; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if ( nCurSector & 1 )
|
||
{
|
||
if( Constants::c_nWipeSmoothWideFlower == nType ||
|
||
Constants::c_nWipeSmoothNarrowFlower == nType )
|
||
{
|
||
dSmallRadius = dCurRadius / (1 + nCurAngle * f1);
|
||
}
|
||
else
|
||
{
|
||
double dValue = 1 / tan( asin( f2 * (dFactor * sin(dSector - nCurAngle) + sin(nCurAngle))));
|
||
dSmallRadius = dCurRadius / (sin(nCurAngle) * dValue + cos(nCurAngle));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if( Constants::c_nWipeSmoothWideFlower == nType ||
|
||
Constants::c_nWipeSmoothNarrowFlower == nType )
|
||
{
|
||
dSmallRadius = dCurRadius / (dFactor - nCurAngle * f1);
|
||
}
|
||
else
|
||
{
|
||
double dValue = 1 / tan(asin( f2 * (dFactor * sin(nCurAngle) + sin(dSector - nCurAngle))));
|
||
dSmallRadius = dCurRadius / (sin(dSector - nCurAngle) * dValue + cos(dSector - nCurAngle));
|
||
}
|
||
}
|
||
double dCurTime = 255. * dSmallRadius * 2 / sqrt( double (m_nMaskHeight * m_nMaskHeight + m_nMaskWidth * m_nMaskWidth));
|
||
|
||
*pBuffer++ = int(dCurTime) & 255;
|
||
}
|
||
}
|
||
}
|
||
|
||
void StarsFlowers()
|
||
{
|
||
int nType = m_nMaskType;
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
for ( int nYIndex = 0; nYIndex < m_nMaskHeight; nYIndex++ )
|
||
{
|
||
for ( int nXIndex = 0; nXIndex < m_nMaskWidth; nXIndex++ )
|
||
{
|
||
const int nHorStars = 5;
|
||
const int nVerStars = 5;
|
||
int nPartWidth = m_nMaskWidth / nHorStars;
|
||
int nPartHeight = m_nMaskHeight / nVerStars;
|
||
|
||
int nHorIndex = nXIndex / nPartWidth;
|
||
int nVerIndex = nYIndex / nPartHeight;
|
||
|
||
const int nStarsPoints = 5;
|
||
const int nCountSectors = nStarsPoints * 2;
|
||
const int nSector = 360 / nCountSectors;
|
||
double dRad = 3.14159265 / 180;
|
||
double dFactor = sin(dRad * ( 90 - nSector)) / sin(dRad * ( 90 - 2 * nSector)); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
double dValue = 300;
|
||
|
||
for(int nIndex = 0; nIndex < 2; nIndex++ )
|
||
{
|
||
double dY = nYIndex - (nVerIndex + 0.5) * nPartHeight;
|
||
double dX = nXIndex - (nHorIndex + 0.5) * nPartWidth;
|
||
double dCurRadius = sqrt(dX * dX + dY * dY);
|
||
double dSecY = (dY >= 0 ? 1.0 : -1.0);
|
||
int nAngle = (dCurRadius ? acos( dX / dCurRadius) * dSecY : 0) /dRad;
|
||
nAngle = ( nAngle < 0? 360 + nAngle : nAngle);
|
||
|
||
nAngle -= 90;
|
||
nAngle = ( nAngle < 0? 360 + nAngle : nAngle);
|
||
|
||
int nCurSector = nAngle / nSector;
|
||
int nCurAngle = nAngle % nSector;
|
||
|
||
double dSmallRadius; // <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if ( nCurSector % 2 )
|
||
{
|
||
if (Constants::c_nWipeSmoothWideFlowers == nType || Constants::c_nWipeSmoothNarrowFlowers == nType)
|
||
dSmallRadius = dCurRadius * nSector / (nSector + nCurAngle * (dFactor - 1));
|
||
else
|
||
{
|
||
double dValue = 1 / tan(asin( ( dFactor * sin( dRad * (nSector - nCurAngle)) + sin(dRad * nCurAngle ) )/sqrt( dFactor * dFactor + 1 - 2 * dFactor * cos(dRad * nSector)) ));
|
||
dSmallRadius = dCurRadius / (sin(dRad * nCurAngle) * dValue + cos(dRad * nCurAngle));
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (Constants::c_nWipeSmoothWideFlowers == nType || Constants::c_nWipeSmoothNarrowFlowers == nType)
|
||
dSmallRadius = dCurRadius * nSector / (dFactor * nSector + nCurAngle * (1 - dFactor));
|
||
else
|
||
{
|
||
double dValue = 1 / tan(asin( ( dFactor * sin( dRad * (nCurAngle)) + sin(dRad * (nSector - nCurAngle) ) )/sqrt( dFactor * dFactor + 1 - 2 * dFactor * cos(dRad * nSector)) ));
|
||
dSmallRadius = dCurRadius / (sin(dRad * (nSector - nCurAngle)) * dValue + cos(dRad * (nSector - nCurAngle)));
|
||
}
|
||
}
|
||
double dCurTime = 255. * dSmallRadius * 2 / sqrt( double (nPartHeight * nPartHeight + nPartWidth * nPartWidth));
|
||
|
||
dValue = (dCurTime < dValue? dCurTime : dValue);
|
||
|
||
if (nIndex == 0)
|
||
{
|
||
if ( nYIndex % nPartHeight > nPartHeight / 2)
|
||
nVerIndex++;
|
||
else
|
||
nVerIndex--;
|
||
if ( nVerIndex < 0 || nVerIndex >= nVerStars )
|
||
nIndex = 2;
|
||
}
|
||
}
|
||
*pBuffer = int(dValue) % 255;
|
||
pBuffer++;
|
||
}
|
||
}
|
||
}
|
||
|
||
void KeyHoles()
|
||
{
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
for ( int nYIndex = 0; nYIndex < m_nMaskHeight; nYIndex++ )
|
||
{
|
||
for ( int nXIndex = 0; nXIndex < m_nMaskWidth; nXIndex++ )
|
||
{
|
||
const int nHorHoles = 5;
|
||
const int nVerHoles = 5;
|
||
int nPartWidth = m_nMaskWidth / nHorHoles;
|
||
int nPartHeight = m_nMaskHeight / nVerHoles;
|
||
|
||
int nHorIndex = nXIndex / nPartWidth;
|
||
int nVerIndex = nYIndex / nPartHeight;
|
||
|
||
double dResValue = 300;
|
||
|
||
for(int nIndex =0; nIndex < 2; nIndex++)
|
||
{
|
||
int nX = nXIndex - nHorIndex * nPartWidth;
|
||
int nY = nYIndex - nVerIndex * nPartHeight;
|
||
int nValue;
|
||
int nValue1;
|
||
double dUnit = 255. * 8. / (nPartWidth * 3. );
|
||
if ( nY - 2. * nPartHeight / 3. <= - abs(8. * ( nX - nPartWidth / 2. ) / 3.))
|
||
{
|
||
nValue = (2. * nPartHeight / 3. - nY) * dUnit / 6.;
|
||
}
|
||
else
|
||
{
|
||
int nX1 = nX - nPartWidth / 2.;
|
||
int nY1 = nY - 2. * nPartHeight / 3.;
|
||
int nCurY = nY1 + 12. * abs(nX1) / 3.;
|
||
nValue = nCurY * dUnit / 3.;
|
||
}
|
||
nValue1 = sqrt(double(( nX - nPartWidth / 2. ) * ( nX - nPartWidth / 2. ) + ( nY - 2 * nPartHeight / 3. ) * ( nY - 2. * nPartHeight / 3. ))) * dUnit / 2.;
|
||
if ( nValue1 < nValue || 2. * nPartHeight / 3. < nY)
|
||
nValue = nValue1;
|
||
|
||
double dValue = sqrt( nValue / 255.) * 255;
|
||
|
||
dResValue = (dValue < dResValue? dValue : dResValue);
|
||
|
||
if (nIndex == 0)
|
||
{
|
||
if ( nYIndex % nPartHeight > nPartHeight / 2)
|
||
nVerIndex++;
|
||
else
|
||
nVerIndex--;
|
||
if ( nVerIndex < 0 || nVerIndex >= nVerHoles )
|
||
nIndex = 2;
|
||
}
|
||
|
||
}
|
||
*pBuffer = dResValue ;
|
||
pBuffer++;
|
||
}
|
||
}
|
||
}
|
||
|
||
void KeyHole()
|
||
{
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
for ( int nYIndex = 0; nYIndex < m_nMaskHeight; nYIndex++ )
|
||
{
|
||
for ( int nXIndex = 0; nXIndex < m_nMaskWidth; nXIndex++ )
|
||
{
|
||
int nValue;
|
||
int nValue1;
|
||
double dUnit = 255. * 8 / (m_nMaskWidth * 3 );
|
||
if ( nYIndex - 2 * m_nMaskHeight / 3 <= - abs(8. * ( nXIndex - m_nMaskWidth / 2 ) / 3.))
|
||
{
|
||
nValue = (2 * m_nMaskHeight / 3 - nYIndex) * dUnit / 6;
|
||
}
|
||
else
|
||
{
|
||
int nX = nXIndex - m_nMaskWidth / 2;
|
||
int nY = nYIndex - 2 * m_nMaskHeight / 3;
|
||
int nCurY = nY + 12 * abs(nX) / 3;
|
||
nValue = nCurY * dUnit / 3;
|
||
}
|
||
nValue1 = sqrt(double(( nXIndex - m_nMaskWidth / 2 ) * ( nXIndex - m_nMaskWidth / 2 ) + ( nYIndex - 2 * m_nMaskHeight / 3 ) * ( nYIndex - 2 * m_nMaskHeight / 3 ))) * dUnit / 2;
|
||
if ( nValue1 < nValue || 2 * m_nMaskHeight / 3 < nYIndex)
|
||
nValue = nValue1;
|
||
|
||
double dValue = sqrt(nValue / 255.);
|
||
*pBuffer = dValue * 255;
|
||
pBuffer++;
|
||
}
|
||
}
|
||
}
|
||
|
||
void CircleCorner()
|
||
{
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
double dW = m_nMaskWidth;
|
||
double dH = m_nMaskHeight;
|
||
|
||
double dFactor = 255 / sqrt(dW * dW + dH * dH);
|
||
double dX = 0, dY = 0;
|
||
|
||
switch( m_nMaskType )
|
||
{
|
||
case Constants::c_nCircleCornerLeftBottom:
|
||
case Constants::c_nCircleCornerSmoothLeftBottom: dX = 0; dY = 0; break;
|
||
case Constants::c_nCircleCornerLeftTop:
|
||
case Constants::c_nCircleCornerSmoothLeftTop: dX = 0; dY = dH; break;
|
||
case Constants::c_nCircleCornerRightBottom:
|
||
case Constants::c_nCircleCornerSmoothRightBottom: dX = dW; dY = 0; break;
|
||
case Constants::c_nCircleCornerRightTop:
|
||
case Constants::c_nCircleCornerSmoothRightTop: dX = dW; dY = dH; break;
|
||
}
|
||
|
||
for ( int nY = 0; nY < m_nMaskHeight; nY++ )
|
||
{
|
||
for ( int nX = 0; nX < m_nMaskWidth; nX++ )
|
||
{
|
||
double y = nY - dY;
|
||
double x = nX - dX;
|
||
|
||
*pBuffer++ = BYTE(dFactor * sqrt( x * x + y * y ));
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
void BarsHorizontal()
|
||
{
|
||
CRandom rnd( m_dwBaseRnd );
|
||
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
for( int nY = 0; nY < m_nMaskHeight; ++nY, pBuffer += m_nMaskWidth )
|
||
{
|
||
::memset( pBuffer, rnd.Rand( 255 ), m_nMaskWidth );
|
||
}
|
||
}
|
||
|
||
void BarsVertical()
|
||
{
|
||
CRandom rnd( m_dwBaseRnd );
|
||
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
for( int i = 0; i < m_nMaskWidth; ++i )
|
||
{
|
||
*pBuffer++ = rnd.Rand( 255 );
|
||
}
|
||
|
||
for( int nY = 1; nY < m_nMaskHeight; ++nY, pBuffer += m_nMaskWidth )
|
||
{
|
||
::memcpy( pBuffer, m_pMask, m_nMaskWidth );
|
||
}
|
||
}
|
||
|
||
|
||
void Box()
|
||
{
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
int nIn = 1;
|
||
if ( Constants::c_nWipeSmoothBoxIn == m_nMaskType )
|
||
nIn = 0;
|
||
|
||
double dFactorX = 511.0 / m_nMaskWidth ;
|
||
double dFactorY = 511.0 / m_nMaskHeight;
|
||
|
||
double dHalfWidth = m_nMaskWidth / 2.0;
|
||
double dHalfHeight = m_nMaskHeight / 2.0;
|
||
|
||
for( int nY = 0; nY < m_nMaskHeight; nY++ )
|
||
{
|
||
double y = dFactorY * abs(nY - dHalfHeight);
|
||
|
||
for( int nX = 0; nX < m_nMaskWidth; nX++ )
|
||
{
|
||
double x = dFactorX * abs(nX - dHalfWidth);
|
||
|
||
*pBuffer++ = 255 * (1 - nIn) + (2 * nIn - 1) * max(x, y);
|
||
}
|
||
}
|
||
}
|
||
void Noise()
|
||
{
|
||
CRandom rnd( m_dwBaseRnd );
|
||
|
||
int nSize = m_nMaskWidth * m_nMaskHeight;
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
for( int i = 0; i < nSize; ++i, ++pBuffer )
|
||
{
|
||
pBuffer[0] = rnd.Rand( 256 );
|
||
}
|
||
}
|
||
|
||
void Shutter()
|
||
{
|
||
const int c_nPathCount = 10;
|
||
|
||
double interval = m_nMaskHeight / double(c_nPathCount);
|
||
if( interval < 10 )
|
||
interval = 10;
|
||
|
||
double factor = 255 / interval;
|
||
Ipp8u* pBuffer = m_pMask;
|
||
|
||
double y = 0;
|
||
for( int row = 0; row < m_nMaskHeight; ++row, ++y )
|
||
{
|
||
if( y > interval )
|
||
y = 0;
|
||
|
||
memset( pBuffer, 255 - int(y * factor), m_nMaskWidth );
|
||
pBuffer += m_nMaskWidth;
|
||
}
|
||
}
|
||
public:
|
||
|
||
int m_nMaskWidth;
|
||
int m_nMaskHeight;
|
||
|
||
Ipp8u* m_pMask;
|
||
int m_nMaskType;
|
||
|
||
};
|
||
|
||
class CPuzzleFigure
|
||
{
|
||
public:
|
||
|
||
CPuzzleFigure()
|
||
{
|
||
m_nFigHeight = 0;
|
||
m_nFigWidth = 0;
|
||
|
||
m_nPicHeight = 0;
|
||
m_nPicWidth = 0;
|
||
|
||
m_nLeftFactor = 0;
|
||
m_nRightFactor = 0;
|
||
m_nTopFactor = 0;
|
||
m_nBottomFactor = 0;
|
||
|
||
m_nXCoorSource = 0;
|
||
m_nYCoorSource = 0;
|
||
}
|
||
CPuzzleFigure(int nFigWidth, int nFigHeight, int nTopFactor, int nRightFactor, int nBottomFactor, int nLeftFactor, BYTE* pBGRASource, int nPicWidth, int nPicHeight, int nXCoorSource, int nYCoorSource)
|
||
{
|
||
m_nFigHeight = nFigHeight;
|
||
m_nFigWidth = nFigWidth;
|
||
|
||
m_nLeftFactor = nLeftFactor;
|
||
m_nRightFactor = nRightFactor;
|
||
m_nTopFactor = nTopFactor;
|
||
m_nBottomFactor = nBottomFactor;
|
||
|
||
m_nPicHeight = nPicHeight;
|
||
m_nPicWidth = nPicWidth;
|
||
|
||
m_pBGRASource = pBGRASource;
|
||
|
||
m_nXCoorSource = nXCoorSource;
|
||
m_nYCoorSource = nYCoorSource;
|
||
}
|
||
~CPuzzleFigure()
|
||
{
|
||
}
|
||
|
||
private:
|
||
|
||
void DrawAlphaBlendingLine(BYTE* pBGRAResult, BYTE* pBGRASource, int nColor, int nNumLine, double dEffect)
|
||
{
|
||
int nAlpha = 7 * (1 << nNumLine);
|
||
|
||
nColor = nColor * nAlpha + 127;
|
||
nAlpha = 255 - nAlpha;
|
||
|
||
if( 1 == dEffect )
|
||
{
|
||
pBGRAResult[0] = (nColor + pBGRASource[0] * nAlpha) * 0x8081U >> (7 + 16);
|
||
pBGRAResult[1] = (nColor + pBGRASource[1] * nAlpha) * 0x8081U >> (7 + 16);
|
||
pBGRAResult[2] = (nColor + pBGRASource[2] * nAlpha) * 0x8081U >> (7 + 16);
|
||
}
|
||
else
|
||
{
|
||
double factor = 1 - dEffect;
|
||
pBGRAResult[0] = BYTE(dEffect * ((nColor + pBGRASource[0] * nAlpha) * 0x8081U >> (7 + 16)) + pBGRASource[0] * factor + 0.5);
|
||
pBGRAResult[1] = BYTE(dEffect * ((nColor + pBGRASource[1] * nAlpha) * 0x8081U >> (7 + 16)) + pBGRASource[0] * factor + 0.5);
|
||
pBGRAResult[2] = BYTE(dEffect * ((nColor + pBGRASource[2] * nAlpha) * 0x8081U >> (7 + 16)) + pBGRASource[0] * factor + 0.5);
|
||
|
||
}
|
||
pBGRAResult[3] = 255;
|
||
}
|
||
|
||
public:
|
||
|
||
void SetValue(int nFigWidth, int nFigHeight, int nTopFactor, int nRightFactor, int nBottomFactor, int nLeftFactor, BYTE* pBGRASource, int nPicWidth, int nPicHeight, int nXCoorSource, int nYCoorSource)
|
||
{
|
||
m_nFigHeight = nFigHeight;
|
||
m_nFigWidth = nFigWidth;
|
||
|
||
m_nLeftFactor = nLeftFactor;
|
||
m_nRightFactor = nRightFactor;
|
||
m_nTopFactor = nTopFactor;
|
||
m_nBottomFactor = nBottomFactor;
|
||
|
||
m_nPicHeight = nPicHeight;
|
||
m_nPicWidth = nPicWidth;
|
||
|
||
m_pBGRASource = pBGRASource;
|
||
|
||
m_nXCoorSource = nXCoorSource;
|
||
m_nYCoorSource = nYCoorSource;
|
||
|
||
}
|
||
|
||
|
||
BOOL Cpy(BYTE* pBGRAResult, int nXCoorResult, int nYCoorResult, int nWidth, int nHeight, int nAlpha)
|
||
{
|
||
|
||
if(!pBGRAResult || nWidth != m_nPicWidth || nHeight != m_nPicHeight)
|
||
return FALSE;
|
||
|
||
int nSize = 4 * nHeight * nWidth;
|
||
|
||
BYTE* pSource = m_pBGRASource;
|
||
BYTE* pResult = pBGRAResult;
|
||
|
||
//double dDiagonal = sqrt(double(m_nFigHeight * m_nFigHeight + m_nFigWidth * m_nFigWidth));
|
||
//
|
||
//double dUnit = 1 / (72.0 * sqrt (2.0)) * dDiagonal;
|
||
double dDiagonal = min(m_nFigHeight, m_nFigWidth);
|
||
|
||
double dUnit = 1 / (72.0) * dDiagonal;
|
||
int nCircleWidth = 26 * dUnit; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>.<2E>. 2 * <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - (<28><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
int nRadius = 15 * dUnit; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
int nSqrRadius = nRadius * nRadius;
|
||
int nSqrIncRadius = ( nRadius + 1 ) * ( nRadius + 1 );
|
||
int nSqrDecRadius = ( nRadius - 1 ) * ( nRadius - 1 );
|
||
|
||
int nInStep = 37 * dUnit;
|
||
|
||
int nXStartRes = nXCoorResult - nCircleWidth;
|
||
int nYStartRes = nYCoorResult - nCircleWidth;
|
||
int nXStartSur = m_nXCoorSource - nCircleWidth;
|
||
int nYStartSur = m_nYCoorSource - nCircleWidth;
|
||
|
||
int nFullHeight = m_nFigHeight + 2 * nCircleWidth; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
int nFullWidth = m_nFigWidth + 2 * nCircleWidth; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
int nXSource = m_nXCoorSource - nCircleWidth;
|
||
int nYSource = m_nYCoorSource - nCircleWidth;
|
||
int nXResult = nXCoorResult - nCircleWidth;
|
||
int nYResult = nYCoorResult - nCircleWidth;
|
||
|
||
double dStep = 11 * dUnit;
|
||
double dSrez = sqrt(nSqrRadius - dStep * dStep);
|
||
double dAngle = acos(11 * dUnit / nRadius) * 180 / IPP_PI;
|
||
|
||
|
||
if ( nXStartRes < 0 )
|
||
{
|
||
nXStartSur += -nXStartRes;
|
||
nXStartRes = 0;
|
||
}
|
||
if (nYStartRes < 0)
|
||
{
|
||
nYStartSur += -nYStartRes;
|
||
nYStartRes = 0;
|
||
}
|
||
|
||
for ( int nYIndexResult = nYStartRes, nYIndexSource = nYStartSur; nYIndexResult < min( nHeight, nYResult + nFullHeight); nYIndexResult++, nYIndexSource++)
|
||
{
|
||
for(int nXIndexResult = nXStartRes, nXIndexSource = nXStartSur; nXIndexResult < min( nWidth, nXResult + nFullWidth); nXIndexResult++, nXIndexSource++)
|
||
{
|
||
BOOL bIn = FALSE;
|
||
|
||
int nYS = nYIndexSource;
|
||
int nXS = nXIndexSource;
|
||
|
||
if ( (nYS > nYSource + nCircleWidth && nYS < nYSource + nFullHeight - nCircleWidth &&
|
||
nXS > nXSource + nCircleWidth && nXS <= nXSource + nFullWidth - nCircleWidth &&
|
||
(m_nTopFactor >= 0 || (m_nTopFactor == -1 && ( nYS - nYSource - nInStep ) * ( nYS - nYSource - nInStep ) + ( nXS - nXSource - nFullWidth / 2 ) * ( nXS - nXSource - nFullWidth / 2 ) >= nSqrRadius ))&&
|
||
(m_nLeftFactor >= 0 || (m_nLeftFactor == -1 && ( nYS - nYSource - nFullHeight / 2 ) * ( nYS - nYSource - nFullHeight / 2 ) + ( nXS - nXSource - nInStep ) * ( nXS - nXSource - nInStep ) >= nSqrRadius ))&&
|
||
(m_nRightFactor >= 0 || (m_nRightFactor == -1 && ( nYS - nYSource - nFullHeight / 2 ) * ( nYS - nYSource - nFullHeight / 2 ) + ( nXS - nXSource - nFullWidth + nInStep ) * ( nXS - nXSource - nFullWidth + nInStep ) >= nSqrRadius ))&&
|
||
(m_nBottomFactor >= 0 || (m_nBottomFactor == -1 && ( nYS - nYSource - nFullHeight + nInStep ) * ( nYS - nYSource - nFullHeight + nInStep ) + ( nXS - nXSource - nFullWidth / 2 ) * ( nXS - nXSource - nFullWidth / 2 ) >= nSqrRadius ))
|
||
)
|
||
|
||
||
|
||
(m_nTopFactor == 1 && ( nYS - nYSource - nRadius ) * ( nYS - nYSource - nRadius ) + ( nXS - nXSource - nFullWidth / 2 ) * ( nXS - nXSource - nFullWidth / 2 ) <= nSqrDecRadius )||
|
||
(m_nLeftFactor == 1 && ( nYS - nYSource - nFullHeight / 2 ) * ( nYS - nYSource - nFullHeight / 2 ) + ( nXS - nXSource - nRadius ) * ( nXS - nXSource - nRadius ) <= nSqrDecRadius )||
|
||
(m_nRightFactor == 1 && ( nYS - nYSource - nFullHeight / 2 ) * ( nYS - nYSource - nFullHeight / 2 ) + ( nXS - nXSource - nFullWidth + nRadius ) * ( nXS - nXSource - nFullWidth + nRadius ) <= nSqrDecRadius )||
|
||
(m_nBottomFactor == 1 && ( nYS - nYSource - nFullHeight + nRadius ) * ( nYS - nYSource - nFullHeight + nRadius ) + ( nXS - nXSource - nFullWidth / 2 ) * ( nXS - nXSource - nFullWidth / 2 ) <= nSqrDecRadius )
|
||
)
|
||
{
|
||
bIn = TRUE;
|
||
}
|
||
int nResultIndex = 4 * nWidth * nYIndexResult + 4 * nXIndexResult;
|
||
int nSourceIndex = 4 * nWidth * nYIndexSource + 4 * nXIndexSource;
|
||
if ( bIn )
|
||
{
|
||
double dKoef = nAlpha / 255.0;
|
||
pResult[ nResultIndex + 0 ] = pSource[ nSourceIndex + 0 ] * dKoef + ( 1 - dKoef) * pResult[ nResultIndex + 0 ];
|
||
pResult[ nResultIndex + 1 ] = pSource[ nSourceIndex + 1 ] * dKoef + ( 1 - dKoef) * pResult[ nResultIndex + 1 ];
|
||
pResult[ nResultIndex + 2 ] = pSource[ nSourceIndex + 2 ] * dKoef + ( 1 - dKoef) * pResult[ nResultIndex + 2 ];
|
||
pResult[ nResultIndex + 3 ] = pSource[ nSourceIndex + 3 ] * dKoef + ( 1 - dKoef) * pResult[ nResultIndex + 3 ];
|
||
}
|
||
|
||
|
||
|
||
|
||
// if ( 1 == m_nTopFactor )
|
||
// {
|
||
// int nDistance = sqrt(double(( nYS - nYSource - nRadius ) * ( nYS - nYSource - nRadius ) + ( nXS - nXSource - nFullWidth / 2 ) * ( nXS - nXSource - nFullWidth / 2 )));
|
||
//
|
||
// if ( nDistance > nRadius && nYS >= nYSource + nCircleWidth && nYS <= nYSource + nCircleWidth + 5 && nXS >= nXSource + nCircleWidth + (5 - (nYSource + nCircleWidth + 5 - nYS)) && nXS <= nXSource + nFullWidth - nCircleWidth - (5 - (nYSource + nCircleWidth + 5 - nYS)))
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 0, nYSource + nCircleWidth + 5 - nYS, dEffect);
|
||
// if ( nDistance <= nRadius && nDistance >= nRadius - 5 && nYS <= nYSource + nCircleWidth )
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 0, 5 - (nRadius - nDistance), dEffect);
|
||
// }
|
||
// else if ( -1 == m_nTopFactor )
|
||
// {
|
||
// int nDistance = sqrt(double(( nYS - nYSource - nInStep ) * ( nYS - nYSource - nInStep ) + ( nXS - nXSource - nFullWidth / 2 ) * ( nXS - nXSource - nFullWidth / 2 )));
|
||
//
|
||
// if ( nDistance <= nRadius + 5 && nDistance >= nRadius && nYS >= nYSource + nCircleWidth )
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 0, 5- (nDistance - nRadius), dEffect);
|
||
// if ( nDistance > nRadius && nYS >= nYSource + nCircleWidth && nYS <= nYSource + nCircleWidth + 5 && nXS >= nXSource + nCircleWidth + (5 - (nYSource + nCircleWidth + 5 - nYS)) && nXS <= nXSource + nFullWidth - nCircleWidth - (5 - (nYSource + nCircleWidth + 5 - nYS)))
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 0, nYSource + nCircleWidth + 5 - nYS, dEffect);
|
||
// }
|
||
// else
|
||
// {
|
||
// if ( nYS >= nYSource + nCircleWidth && nYS <= nYSource + nCircleWidth + 5 && nXS >= nXSource + nCircleWidth + (5 - (nYSource + nCircleWidth + 5 - nYS)) && nXS <= nXSource + nFullWidth - nCircleWidth - (5 - (nYSource + nCircleWidth + 5 - nYS)))
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 0, nYSource + nCircleWidth + 5 - nYS, dEffect);
|
||
// }
|
||
|
||
// if ( 1 == m_nBottomFactor )
|
||
// {
|
||
// int nDistance = sqrt(double(( nYS - nYSource - nFullHeight + nRadius ) * ( nYS - nYSource - nFullHeight + nRadius ) + ( nXS - nXSource - nFullWidth / 2 ) * ( nXS - nXSource - nFullWidth / 2 )));
|
||
//
|
||
// if ( nDistance > nRadius && nYS <= nYSource + nFullHeight - nCircleWidth && nYS >= nYSource + nFullHeight - nCircleWidth - 5 && nXS >= nXSource + nCircleWidth + (nYSource + nFullHeight - nCircleWidth - nYS) && nXS <= nXSource + nFullWidth - nCircleWidth - (nYSource + nFullHeight - nCircleWidth - nYS))
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 255, 5 - (nYSource + nFullHeight - nCircleWidth - nYS), dEffect);
|
||
// if ( nDistance <= nRadius && nDistance >= nRadius - 5 && nYS >= nYSource + nFullHeight - nCircleWidth )
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 255, 5 - (nRadius - nDistance), dEffect);
|
||
// }
|
||
// else if ( -1 == m_nBottomFactor )
|
||
// {
|
||
// int nDistance = sqrt(double(( nYS - nYSource - nFullHeight + nInStep ) * ( nYS - nYSource - nFullHeight + nInStep ) + ( nXS - nXSource - nFullWidth / 2 ) * ( nXS - nXSource - nFullWidth / 2 )));
|
||
|
||
// if ( nDistance <= nRadius + 5 && nDistance >= nRadius && nYS <= nYSource + nFullHeight - nCircleWidth )
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 255, 5 - (nDistance - nRadius), dEffect);
|
||
|
||
// if ( nDistance > nRadius && nYS <= nYSource + nFullHeight - nCircleWidth && nYS >= nYSource + nFullHeight - nCircleWidth - 5 && nXS >= nXSource + nCircleWidth + (nYSource + nFullHeight - nCircleWidth - nYS) && nXS <= nXSource + nFullWidth - nCircleWidth - (nYSource + nFullHeight - nCircleWidth - nYS))
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 255, 5 - (nYSource + nFullHeight - nCircleWidth - nYS), dEffect);
|
||
// }
|
||
// else
|
||
// {
|
||
// if ( nYS <= nYSource + nFullHeight - nCircleWidth && nYS >= nYSource + nFullHeight - nCircleWidth - 5 && nXS >= nXSource + nCircleWidth + (nYSource + nFullHeight - nCircleWidth - nYS) && nXS <= nXSource + nFullWidth - nCircleWidth - (nYSource + nFullHeight - nCircleWidth - nYS))
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 255, 5 - (nYSource + nFullHeight - nCircleWidth - nYS), dEffect);
|
||
// }
|
||
//
|
||
// if ( 1 == m_nLeftFactor )
|
||
// {
|
||
// int nDistance = sqrt(double(( nYS - nYSource - nFullHeight / 2 ) * ( nYS - nYSource - nFullHeight / 2 ) + ( nXS - nXSource - nRadius ) * ( nXS - nXSource - nRadius )));
|
||
//
|
||
// if ( nDistance > nRadius && nXS >= nXSource + nCircleWidth && nXS <= nXSource + nCircleWidth + 5 && nYS >= nYSource + nCircleWidth + (5 - (nXSource + nCircleWidth + 5 - nXS))&& nYS <= nYSource + nFullHeight - nCircleWidth - (5 - (nXSource + nCircleWidth + 5 - nXS)))
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 255, nXSource + nCircleWidth + 5 - nXS, dEffect);
|
||
|
||
// if ( nDistance <= nRadius && nDistance >= nRadius - 5 && nXS <= nXSource + nCircleWidth )
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 255, 5 - (nRadius - nDistance), dEffect);
|
||
// }
|
||
// else if ( -1 == m_nLeftFactor )
|
||
// {
|
||
// int nDistance = sqrt(double(( nYS - nYSource - nFullHeight / 2 ) * ( nYS - nYSource - nFullHeight / 2 ) + ( nXS - nXSource - nInStep ) * ( nXS - nXSource - nInStep )));
|
||
|
||
// if ( nDistance <= nRadius + 5 && nDistance >= nRadius && nXS >= nXSource + nCircleWidth )
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 255, 5- (nDistance - nRadius), dEffect);
|
||
|
||
// if ( nDistance > nRadius && nXS >= nXSource + nCircleWidth && nXS <= nXSource + nCircleWidth + 5 && nYS >= nYSource + nCircleWidth + (5 - (nXSource + nCircleWidth + 5 - nXS))&& nYS <= nYSource + nFullHeight - nCircleWidth - (5 - (nXSource + nCircleWidth + 5 - nXS)))
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 255, nXSource + nCircleWidth + 5 - nXS, dEffect);
|
||
// }
|
||
// else
|
||
// {
|
||
// if ( nXS >= nXSource + nCircleWidth && nXS <= nXSource + nCircleWidth + 5 && nYS >= nYSource + nCircleWidth + (5 - (nXSource + nCircleWidth + 5 - nXS))&& nYS <= nYSource + nFullHeight - nCircleWidth - (5 - (nXSource + nCircleWidth + 5 - nXS)))
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 255, nXSource + nCircleWidth + 5 - nXS, dEffect);
|
||
// }
|
||
|
||
// if ( 1 == m_nRightFactor )
|
||
// {
|
||
// int nDistance = sqrt(double(( nYS - nYSource - nFullHeight / 2 ) * ( nYS - nYSource - nFullHeight / 2 ) + ( nXS - nXSource - nFullWidth + nRadius ) * ( nXS - nXSource - nFullWidth + nRadius )));
|
||
//
|
||
// if ( nDistance > nRadius && nXS <= nXSource + nFullWidth - nCircleWidth && nXS >= nXSource + nFullWidth - nCircleWidth - 5 && nYS >= nYSource + nCircleWidth + (nXSource + nFullWidth - nCircleWidth - nXS)&& nYS <= nYSource + nFullHeight - nCircleWidth - (nXSource + nFullWidth - nCircleWidth - nXS))
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 0, 5 - (nXSource + nFullWidth - nCircleWidth - nXS), dEffect);
|
||
|
||
// if ( nDistance <= nRadius && nDistance >= nRadius - 5 && nXS >= nXSource + nFullWidth - nCircleWidth )
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 0, 5 - (nRadius - nDistance), dEffect);
|
||
// }
|
||
// else if ( -1 == m_nRightFactor )
|
||
// {
|
||
// int nDistance = sqrt(double(( nYS - nYSource - nFullHeight / 2 ) * ( nYS - nYSource - nFullHeight / 2 ) + ( nXS - nXSource - nFullWidth + nInStep ) * ( nXS - nXSource - nFullWidth + nInStep )));
|
||
//
|
||
// if ( nDistance <= nRadius + 5 && nDistance >= nRadius && nXS <= nXSource + nFullWidth - nCircleWidth )
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 0, 5- (nDistance - nRadius), dEffect);
|
||
|
||
// if ( nDistance > nRadius && nXS <= nXSource + nFullWidth - nCircleWidth && nXS >= nXSource + nFullWidth - nCircleWidth - 5 && nYS >= nYSource + nCircleWidth + (nXSource + nFullWidth - nCircleWidth - nXS)&& nYS <= nYSource + nFullHeight - nCircleWidth - (nXSource + nFullWidth - nCircleWidth - nXS))
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 0, 5 - (nXSource + nFullWidth - nCircleWidth - nXS), dEffect);
|
||
|
||
// }
|
||
// else
|
||
// {
|
||
// if ( nXS <= nXSource + nFullWidth - nCircleWidth && nXS >= nXSource + nFullWidth - nCircleWidth - 5 && nYS >= nYSource + nCircleWidth + (nXSource + nFullWidth - nCircleWidth - nXS)&& nYS <= nYSource + nFullHeight - nCircleWidth - (nXSource + nFullWidth - nCircleWidth - nXS))
|
||
// DrawAlphaBlendingLine(pResult + nResultIndex, pSource + nSourceIndex, 0, 5 - (nXSource + nFullWidth - nCircleWidth - nXS), dEffect);
|
||
// }
|
||
}
|
||
}
|
||
|
||
|
||
int nXCur = nXResult;
|
||
int nYCur = nYResult;
|
||
BYTE* pBuffer = pResult;
|
||
pBuffer += 4 * nWidth * (nHeight - 1);
|
||
|
||
Gdiplus::Bitmap oImage( nWidth, nHeight, -4*nWidth, PixelFormat32bppARGB, pBuffer );
|
||
if( Gdiplus::Ok == oImage.GetLastStatus() )
|
||
{
|
||
Gdiplus::Graphics oRender( &oImage );
|
||
|
||
oRender.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAlias);
|
||
oRender.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);
|
||
oRender.SetInterpolationMode(Gdiplus::InterpolationModeBilinear);
|
||
|
||
double dAlphaKoef = nAlpha / 255.0;
|
||
int nAlphaBlack = 448 * dAlphaKoef;
|
||
int nAlphaWhite = 448 * dAlphaKoef;
|
||
|
||
for (int nIndex = 0; nIndex < 4; nIndex++ )
|
||
{
|
||
nAlphaBlack /= 2;
|
||
if (nIndex == 1)
|
||
{
|
||
nAlphaBlack = 224 * dAlphaKoef;
|
||
nAlphaWhite = 224 * dAlphaKoef;
|
||
}
|
||
Gdiplus::Pen oPen( Color( nAlphaBlack, 0, 0, 0) , 1);
|
||
if ( 0 == m_nRightFactor )
|
||
oRender.DrawLine(&oPen, float(nXResult + nFullWidth - nCircleWidth - nIndex), nHeight - float(nYResult + nFullHeight - nCircleWidth - nIndex), float(nXResult + nFullWidth - nCircleWidth - nIndex), nHeight - float(nYResult + nCircleWidth + nIndex));
|
||
else
|
||
{
|
||
if ( 1 == m_nRightFactor)
|
||
oRender.DrawArc(&oPen, float(nXResult + nFullWidth - 2 * nRadius + nIndex), nHeight - float(nYResult + nFullHeight / 2 + nRadius - nIndex), float(2 * (nRadius - nIndex)), float(2 * (nRadius - nIndex)), 180 + dAngle, 360 - 2 * dAngle);
|
||
else if ( -1 == m_nRightFactor)
|
||
oRender.DrawArc(&oPen, float(nXResult + nFullWidth - 2 * nRadius - nIndex - 2 * dStep), nHeight - float(nYResult + nFullHeight / 2 + nRadius + nIndex), float(2 * (nRadius + nIndex)), float(2 * (nRadius + nIndex)), dAngle + nIndex, 360 - 2 * dAngle - 2* nIndex);
|
||
oRender.DrawLine(&oPen, float(nXResult + nFullWidth - nCircleWidth - nIndex), nHeight - float(nYResult + nFullHeight - nCircleWidth - nIndex), float(nXResult + nFullWidth - nCircleWidth - nIndex), nHeight - float(nYResult + nFullHeight / 2 + dSrez +nIndex));
|
||
oRender.DrawLine(&oPen, float(nXResult + nFullWidth - nCircleWidth - nIndex), nHeight - float(nYResult + nFullHeight / 2 - dSrez - nIndex), float(nXResult + nFullWidth - nCircleWidth - nIndex), nHeight - float(nYResult + nCircleWidth + nIndex));
|
||
}
|
||
|
||
if ( 0 == m_nTopFactor )
|
||
oRender.DrawLine(&oPen, float(nXResult + nCircleWidth + nIndex), nHeight - float(nYResult + nCircleWidth + nIndex), float(nXResult + nFullWidth - nCircleWidth - nIndex), nHeight - float(nYResult + nCircleWidth + nIndex));
|
||
else
|
||
{
|
||
if ( 1 == m_nTopFactor)
|
||
oRender.DrawArc(&oPen, float(nXResult + nFullWidth / 2 - nRadius + nIndex), nHeight - float(nYResult + 2 * nRadius - nIndex), float(2 * (nRadius - nIndex)), float(2 * (nRadius - nIndex)), 270 + dAngle, 360 - 2 * dAngle);
|
||
else if ( -1 == m_nTopFactor)
|
||
oRender.DrawArc(&oPen, float(nXResult + nFullWidth / 2 - nRadius - nIndex), nHeight - float(nYResult + 2 * nRadius + nIndex + 2 * dStep), float(2 * (nRadius + nIndex)), float(2 * (nRadius + nIndex)), 90 + dAngle + nIndex, 360 - 2 * dAngle - 2* nIndex);
|
||
oRender.DrawLine(&oPen, float(nXResult + nFullWidth - nCircleWidth - nIndex), nHeight - float(nYResult + nCircleWidth + nIndex), float(nXResult + nFullWidth / 2 + dSrez + nIndex), nHeight - float(nYResult + nCircleWidth + nIndex));
|
||
oRender.DrawLine(&oPen, float(nXResult + nFullWidth / 2 - dSrez - nIndex), nHeight - float(nYResult + nCircleWidth + nIndex), float(nXResult + nCircleWidth + nIndex), nHeight - float(nYResult + nCircleWidth + nIndex));
|
||
}
|
||
|
||
nAlphaWhite /= 2;
|
||
oPen.SetColor(Color(nAlphaWhite, 255, 255, 255));
|
||
|
||
if ( 0 == m_nLeftFactor )
|
||
oRender.DrawLine(&oPen, float(nXResult + nCircleWidth + nIndex), nHeight - float(nYResult + nCircleWidth + nIndex), float(nXResult + nCircleWidth + nIndex), nHeight - float(nYResult + nFullHeight - nCircleWidth - nIndex));
|
||
else
|
||
{
|
||
if ( 1 == m_nLeftFactor)
|
||
oRender.DrawArc(&oPen, float(nXResult + nIndex), nHeight - float(nYResult + nFullHeight / 2 + nRadius - nIndex), float(2 * (nRadius - nIndex)), float(2 * (nRadius - nIndex)), dAngle, 360 - 2 * dAngle);
|
||
else if ( -1 == m_nLeftFactor)
|
||
oRender.DrawArc(&oPen, float(nXResult - nIndex + 2 * dStep), nHeight - float(nYResult + nFullHeight / 2 + nRadius + nIndex), float(2 * (nRadius + nIndex)), float(2 * (nRadius + nIndex)), 180 + dAngle + nIndex, 360 - 2 * dAngle - 2* nIndex);
|
||
oRender.DrawLine(&oPen, float(nXResult + nCircleWidth + nIndex), nHeight - float(nYResult + nCircleWidth + nIndex), float(nXResult + nCircleWidth + nIndex), nHeight - float(nYResult + nFullHeight / 2 - dSrez - nIndex));
|
||
oRender.DrawLine(&oPen, float(nXResult + nCircleWidth + nIndex), nHeight - float(nYResult + nFullHeight / 2 + dSrez + nIndex), float(nXResult + nCircleWidth + nIndex), nHeight - float(nYResult + nFullHeight - nCircleWidth - nIndex));
|
||
}
|
||
|
||
if ( 0 == m_nBottomFactor )
|
||
oRender.DrawLine(&oPen, float(nXResult + nCircleWidth + nIndex), nHeight - float(nYResult + nFullHeight - nCircleWidth - nIndex), float(nXResult + nFullWidth - nCircleWidth - nIndex), nHeight - float(nYResult + nFullHeight - nCircleWidth - nIndex));
|
||
else
|
||
{
|
||
if ( 1 == m_nBottomFactor)
|
||
oRender.DrawArc(&oPen, float(nXResult + nFullWidth / 2 - nRadius + nIndex), nHeight - float(nYResult + nFullHeight - nIndex), float(2 * (nRadius - nIndex)), float(2 * (nRadius - nIndex)), 90 + dAngle, 360 - 2 * dAngle);
|
||
else if ( -1 == m_nBottomFactor)
|
||
oRender.DrawArc(&oPen, float(nXResult + nFullWidth / 2 - nRadius - nIndex), nHeight - float(nYResult + nFullHeight + nIndex - 2 * dStep), float(2 * (nRadius + nIndex)), float(2 * (nRadius + nIndex)), 270 + dAngle + nIndex, 360 - 2 * dAngle - 2* nIndex);
|
||
oRender.DrawLine(&oPen, float(nXResult + nFullWidth - nCircleWidth - nIndex), nHeight - float(nYResult + nFullHeight - nCircleWidth - nIndex), float(nXResult + nFullWidth / 2 + dSrez + nIndex), nHeight - float(nYResult + nFullHeight - nCircleWidth - nIndex));
|
||
oRender.DrawLine(&oPen, float(nXResult + nFullWidth / 2 - dSrez - nIndex), nHeight - float(nYResult + nFullHeight - nCircleWidth - nIndex), float(nXResult + nCircleWidth + nIndex), nHeight - float(nYResult + nFullHeight - nCircleWidth - nIndex));
|
||
}
|
||
|
||
|
||
}
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL Draw(Gdiplus::Graphics *oMainRender, Gdiplus::TextureBrush *oBrush, double dXCoorResult, double dYCoorResult, int nWidth, int nHeight, double dEffect)
|
||
{
|
||
if(!oMainRender || !oBrush || nWidth != m_nPicWidth || nHeight != m_nPicHeight )
|
||
return FALSE;
|
||
|
||
int nSize = 4 * nHeight * nWidth;
|
||
|
||
|
||
double dDiagonal = min(m_nFigHeight, m_nFigWidth);
|
||
|
||
double dUnit = 1 / (72.0) * dDiagonal;
|
||
double dCircleWidth = 26 * dUnit; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20>.<2E>. 2 * <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - (<28><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
double dRadius = 15 * dUnit; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
double dSqrRadius = dRadius * dRadius;
|
||
double dDiff = dCircleWidth - dRadius;
|
||
|
||
double dInStep = 37 * dUnit;
|
||
|
||
double dStep = 11 * dUnit;
|
||
double dSrez = sqrt(dSqrRadius - dStep * dStep);
|
||
double dAngle = acos(11 * dUnit / dRadius) * 180 / IPP_PI;
|
||
|
||
double dXSur = m_nXCoorSource;
|
||
double dYSur = m_nYCoorSource;
|
||
|
||
double dFullHeight = m_nFigHeight + 2 * dCircleWidth; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
double dFullWidth = m_nFigWidth + 2 * dCircleWidth; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
double dXResult = dXCoorResult - dCircleWidth;
|
||
double dYResult = dYCoorResult - dCircleWidth;
|
||
|
||
|
||
Gdiplus::GraphicsPath oPathAddEllipse;
|
||
if ( 1 == m_nLeftFactor )
|
||
oPathAddEllipse.AddEllipse( float(dXSur - dCircleWidth), nHeight - float(dYSur + m_nFigHeight / 2 + dRadius), float(2 * dRadius), float(2 * dRadius)); // left
|
||
if ( 1 == m_nRightFactor )
|
||
oPathAddEllipse.AddEllipse( float(dXSur + dCircleWidth + m_nFigWidth - 2 * dRadius), nHeight - float(dYSur + m_nFigHeight / 2 + dRadius), float(2 * dRadius), float(2 * dRadius)); //right
|
||
if ( 1 == m_nBottomFactor )
|
||
oPathAddEllipse.AddEllipse( float(dXSur + m_nFigWidth / 2 - dRadius), nHeight - float(dYSur + m_nFigHeight + dCircleWidth), float(2 * dRadius), float(2 * dRadius)); //bottom
|
||
if ( 1 == m_nTopFactor )
|
||
oPathAddEllipse.AddEllipse( float(dXSur + m_nFigWidth / 2 - dRadius), nHeight - float(dYSur - dCircleWidth + 2 * dRadius), float(2 * dRadius), float(2 * dRadius)); //top
|
||
oPathAddEllipse.CloseFigure();
|
||
|
||
Gdiplus::GraphicsPath oPathExclEllipse;
|
||
if ( -1 == m_nLeftFactor )
|
||
oPathExclEllipse.AddEllipse( float(dXSur - dCircleWidth + 2 * dDiff), nHeight - float(dYSur + m_nFigHeight / 2 + dRadius), float(2 * dRadius), float(2 * dRadius)); // left
|
||
if ( -1 == m_nRightFactor )
|
||
oPathExclEllipse.AddEllipse( float(dXSur + dCircleWidth + m_nFigWidth - 2 * dRadius - 2 * dDiff), nHeight - float(dYSur + m_nFigHeight / 2 + dRadius), float(2 * dRadius), float(2 * dRadius)); //right
|
||
if ( -1 == m_nBottomFactor )
|
||
oPathExclEllipse.AddEllipse( float(dXSur + m_nFigWidth / 2 - dRadius), nHeight - float(dYSur + m_nFigHeight + dCircleWidth - 2 * dDiff),float(2 * dRadius), float(2 * dRadius)); //bottom
|
||
if ( -1 == m_nTopFactor )
|
||
oPathExclEllipse.AddEllipse( float(dXSur + m_nFigWidth / 2 - dRadius), nHeight - float(dYSur - dCircleWidth + 2 * dRadius + 2 * dDiff), float(2 * dRadius), float(2 * dRadius)); //top
|
||
oPathExclEllipse.CloseFigure();
|
||
|
||
Gdiplus::Region oRegion(&oPathAddEllipse);
|
||
|
||
oRegion.Union(Gdiplus::RectF(dXSur, nHeight - (dYSur + m_nFigHeight), m_nFigWidth, m_nFigHeight));
|
||
oRegion.Exclude(&oPathExclEllipse);
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
oBrush->TranslateTransform(-float(m_nXCoorSource - dXCoorResult), float(m_nYCoorSource - dYCoorResult), MatrixOrderAppend);
|
||
oRegion.Translate(-float(m_nXCoorSource - dXCoorResult), float(m_nYCoorSource - dYCoorResult));
|
||
|
||
oMainRender->FillRegion(oBrush, &oRegion);
|
||
|
||
|
||
|
||
int nAlphaBlack = 448 * dEffect;
|
||
int nAlphaWhite = 448 * dEffect;
|
||
|
||
for (int nIndex = 0; nIndex < 4; nIndex++ )
|
||
{
|
||
nAlphaBlack /= 2;
|
||
if (nIndex == 1)
|
||
{
|
||
nAlphaBlack = 224 * dEffect;
|
||
nAlphaWhite = 224 * dEffect;
|
||
}
|
||
Gdiplus::Pen oPen( Color( nAlphaBlack, 0, 0, 0) , 1);
|
||
if ( 0 == m_nRightFactor )
|
||
oMainRender->DrawLine(&oPen, float(dXResult + dFullWidth - dCircleWidth - nIndex), nHeight - float(dYResult + dFullHeight - dCircleWidth - nIndex), float(dXResult + dFullWidth - dCircleWidth - nIndex), nHeight - float(dYResult + dCircleWidth + nIndex));
|
||
else
|
||
{
|
||
if ( 1 == m_nRightFactor)
|
||
oMainRender->DrawArc(&oPen, float(dXResult + dFullWidth - 2 * dRadius + nIndex), nHeight - float(dYResult + dFullHeight / 2 + dRadius - nIndex), float(2 * (dRadius - nIndex)), float(2 * (dRadius - nIndex)), 180 + dAngle, 360 - 2 * dAngle);
|
||
else if ( -1 == m_nRightFactor)
|
||
oMainRender->DrawArc(&oPen, float(dXResult + dFullWidth - 2 * dRadius - nIndex - 2 * dStep), nHeight - float(dYResult + dFullHeight / 2 + dRadius + nIndex), float(2 * (dRadius + nIndex)), float(2 * (dRadius + nIndex)), dAngle + nIndex, 360 - 2 * dAngle - 2* nIndex);
|
||
oMainRender->DrawLine(&oPen, float(dXResult + dFullWidth - dCircleWidth - nIndex), nHeight - float(dYResult + dFullHeight - dCircleWidth - nIndex), float(dXResult + dFullWidth - dCircleWidth - nIndex), nHeight - float(dYResult + dFullHeight / 2 + dSrez +nIndex));
|
||
oMainRender->DrawLine(&oPen, float(dXResult + dFullWidth - dCircleWidth - nIndex), nHeight - float(dYResult + dFullHeight / 2 - dSrez - nIndex), float(dXResult + dFullWidth - dCircleWidth - nIndex), nHeight - float(dYResult + dCircleWidth + nIndex));
|
||
}
|
||
|
||
if ( 0 == m_nTopFactor )
|
||
oMainRender->DrawLine(&oPen, float(dXResult + dCircleWidth + nIndex), nHeight - float(dYResult + dCircleWidth + nIndex), float(dXResult + dFullWidth - dCircleWidth - nIndex), nHeight - float(dYResult + dCircleWidth + nIndex));
|
||
else
|
||
{
|
||
if ( 1 == m_nTopFactor)
|
||
oMainRender->DrawArc(&oPen, float(dXResult + dFullWidth / 2 - dRadius + nIndex), nHeight - float(dYResult + 2 * dRadius - nIndex), float(2 * (dRadius - nIndex)), float(2 * (dRadius - nIndex)), 270 + dAngle, 360 - 2 * dAngle);
|
||
else if ( -1 == m_nTopFactor)
|
||
oMainRender->DrawArc(&oPen, float(dXResult + dFullWidth / 2 - dRadius - nIndex), nHeight - float(dYResult + 2 * dRadius + nIndex + 2 * dStep), float(2 * (dRadius + nIndex)), float(2 * (dRadius + nIndex)), 90 + dAngle + nIndex, 360 - 2 * dAngle - 2* nIndex);
|
||
oMainRender->DrawLine(&oPen, float(dXResult + dFullWidth - dCircleWidth - nIndex), nHeight - float(dYResult + dCircleWidth + nIndex), float(dXResult + dFullWidth / 2 + dSrez + nIndex), nHeight - float(dYResult + dCircleWidth + nIndex));
|
||
oMainRender->DrawLine(&oPen, float(dXResult + dFullWidth / 2 - dSrez - nIndex), nHeight - float(dYResult + dCircleWidth + nIndex), float(dXResult + dCircleWidth + nIndex), nHeight - float(dYResult + dCircleWidth + nIndex));
|
||
}
|
||
|
||
nAlphaWhite /= 2;
|
||
oPen.SetColor(Color(nAlphaWhite, 255, 255, 255));
|
||
|
||
if ( 0 == m_nLeftFactor )
|
||
oMainRender->DrawLine(&oPen, float(dXResult + dCircleWidth + nIndex), nHeight - float(dYResult + dCircleWidth + nIndex), float(dXResult + dCircleWidth + nIndex), nHeight - float(dYResult + dFullHeight - dCircleWidth - nIndex));
|
||
else
|
||
{
|
||
if ( 1 == m_nLeftFactor)
|
||
oMainRender->DrawArc(&oPen, float(dXResult + nIndex), nHeight - float(dYResult + dFullHeight / 2 + dRadius - nIndex), float(2 * (dRadius - nIndex)), float(2 * (dRadius - nIndex)), dAngle, 360 - 2 * dAngle);
|
||
else if ( -1 == m_nLeftFactor)
|
||
oMainRender->DrawArc(&oPen, float(dXResult - nIndex + 2 * dStep), nHeight - float(dYResult + dFullHeight / 2 + dRadius + nIndex), float(2 * (dRadius + nIndex)), float(2 * (dRadius + nIndex)), 180 + dAngle + nIndex, 360 - 2 * dAngle - 2* nIndex);
|
||
oMainRender->DrawLine(&oPen, float(dXResult + dCircleWidth + nIndex), nHeight - float(dYResult + dCircleWidth + nIndex), float(dXResult + dCircleWidth + nIndex), nHeight - float(dYResult + dFullHeight / 2 - dSrez - nIndex));
|
||
oMainRender->DrawLine(&oPen, float(dXResult + dCircleWidth + nIndex), nHeight - float(dYResult + dFullHeight / 2 + dSrez + nIndex), float(dXResult + dCircleWidth + nIndex), nHeight - float(dYResult + dFullHeight - dCircleWidth - nIndex));
|
||
}
|
||
|
||
if ( 0 == m_nBottomFactor )
|
||
oMainRender->DrawLine(&oPen, float(dXResult + dCircleWidth + nIndex), nHeight - float(dYResult + dFullHeight - dCircleWidth - nIndex), float(dXResult + dFullWidth - dCircleWidth - nIndex), nHeight - float(dYResult + dFullHeight - dCircleWidth - nIndex));
|
||
else
|
||
{
|
||
if ( 1 == m_nBottomFactor)
|
||
oMainRender->DrawArc(&oPen, float(dXResult + dFullWidth / 2 - dRadius + nIndex), nHeight - float(dYResult + dFullHeight - nIndex), float(2 * (dRadius - nIndex)), float(2 * (dRadius - nIndex)), 90 + dAngle, 360 - 2 * dAngle);
|
||
else if ( -1 == m_nBottomFactor)
|
||
oMainRender->DrawArc(&oPen, float(dXResult + dFullWidth / 2 - dRadius - nIndex), nHeight - float(dYResult + dFullHeight + nIndex - 2 * dStep), float(2 * (dRadius + nIndex)), float(2 * (dRadius + nIndex)), 270 + dAngle + nIndex, 360 - 2 * dAngle - 2* nIndex);
|
||
oMainRender->DrawLine(&oPen, float(dXResult + dFullWidth - dCircleWidth - nIndex), nHeight - float(dYResult + dFullHeight - dCircleWidth - nIndex), float(dXResult + dFullWidth / 2 + dSrez + nIndex), nHeight - float(dYResult + dFullHeight - dCircleWidth - nIndex));
|
||
oMainRender->DrawLine(&oPen, float(dXResult + dFullWidth / 2 - dSrez - nIndex), nHeight - float(dYResult + dFullHeight - dCircleWidth - nIndex), float(dXResult + dCircleWidth + nIndex), nHeight - float(dYResult + dFullHeight - dCircleWidth - nIndex));
|
||
}
|
||
|
||
|
||
}
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
oRegion.Translate(float(m_nXCoorSource - dXCoorResult), - float(m_nYCoorSource - dYCoorResult));
|
||
oBrush->TranslateTransform(float(m_nXCoorSource - dXCoorResult), - float(m_nYCoorSource - dYCoorResult), MatrixOrderAppend);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
|
||
public:
|
||
|
||
int m_nFigHeight;
|
||
int m_nFigWidth;
|
||
int m_nPicHeight;
|
||
int m_nPicWidth;
|
||
|
||
int m_nLeftFactor; // -1, 0, +1
|
||
int m_nRightFactor; // -1 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
int m_nTopFactor; // 0 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
int m_nBottomFactor; // +1 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
BYTE* m_pBGRASource;
|
||
int m_nXCoorSource; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
int m_nYCoorSource; //
|
||
|
||
|
||
};
|
||
|
||
|
||
class CPuzzleUtility
|
||
{
|
||
public:
|
||
DWORD m_dwBaseRnd;
|
||
|
||
CPuzzleUtility()
|
||
{
|
||
g_pShuffle = 0;
|
||
g_nShuffleCount = -1;
|
||
|
||
g_pCorners = 0;
|
||
g_nCornersCount = -1;
|
||
|
||
g_pHorizontalFactor = 0;
|
||
g_pVerticalFactor = 0;
|
||
g_nRow = -1;
|
||
g_nCol = -1;
|
||
g_nTypeShuffle = -1;
|
||
g_nTypeCorners = -1;
|
||
g_nTypeGenerate = -1;
|
||
|
||
m_dwBaseRnd = ::rand();
|
||
}
|
||
~CPuzzleUtility()
|
||
{
|
||
if ( g_pShuffle )
|
||
delete []g_pShuffle;
|
||
|
||
if ( g_pCorners )
|
||
delete []g_pCorners;
|
||
|
||
if ( g_pHorizontalFactor )
|
||
delete []g_pHorizontalFactor;
|
||
if ( g_pVerticalFactor )
|
||
delete []g_pVerticalFactor;
|
||
}
|
||
|
||
|
||
void GenerateRandomShuffle(int nXCount, int nYCount, int nShuffle, int nPuzzleType)
|
||
{
|
||
int nCount = nXCount * nYCount;
|
||
if ( g_pShuffle && nCount == g_nShuffleCount && nPuzzleType == g_nTypeShuffle)
|
||
return;
|
||
|
||
if ( g_pShuffle )
|
||
delete []g_pShuffle;
|
||
|
||
g_nTypeShuffle = nPuzzleType;
|
||
g_nShuffleCount = nCount;
|
||
g_pShuffle = new int[nCount];
|
||
|
||
for(int nIndex = 0; nIndex < nCount; nIndex++)
|
||
g_pShuffle[nIndex] = nIndex;
|
||
|
||
if ( 0 == nShuffle )
|
||
return;
|
||
else if ( 1 == nShuffle )
|
||
{
|
||
::srand( m_dwBaseRnd );
|
||
std::random_shuffle(g_pShuffle, g_pShuffle + nCount);
|
||
return;
|
||
}
|
||
else if ( 2 == nShuffle )
|
||
{
|
||
for (int nIndex = 0; nIndex < nCount; nIndex++ )
|
||
{
|
||
g_pShuffle[nIndex] = nCount - 1 - nIndex;
|
||
}
|
||
return;
|
||
}
|
||
else if ( 3 == nShuffle )
|
||
{
|
||
int nYLevel = 0;
|
||
for (int nYIndex = 0; nYIndex < nYCount; nYIndex++, nYLevel = (nYLevel + 1) % 2 )
|
||
{
|
||
for (int nXIndex = 0; nXIndex < nXCount; nXIndex++ )
|
||
{
|
||
int nIndex = nYIndex * nXCount + nXIndex;
|
||
if ( 0 == nYLevel )
|
||
g_pShuffle[nIndex] = nCount - 1 - nIndex;
|
||
else
|
||
g_pShuffle[nIndex] = nCount - 1 - (nYIndex * nXCount + nXCount - 1 - nXIndex);
|
||
}
|
||
}
|
||
}
|
||
else if ( 4 == nShuffle )
|
||
{
|
||
for (int nYIndex = 0; nYIndex < nYCount; nYIndex++ )
|
||
{
|
||
for (int nXIndex = 0; nXIndex < nXCount; nXIndex++ )
|
||
{
|
||
int nIndex = nYIndex * nXCount + nXIndex;
|
||
if ( nXIndex % 2 == 0 )
|
||
{
|
||
int nCurX = nXIndex / 2;
|
||
g_pShuffle[nIndex] = nCount - 1 - nYIndex * nXCount - nCurX;
|
||
}
|
||
else
|
||
{
|
||
int nCurX = (nXIndex + 1) / 2;
|
||
g_pShuffle[nIndex] = nCount - 1 - (nYIndex * nXCount + nXCount - 1 - nCurX);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return;
|
||
|
||
}
|
||
void GenerateCorners(int nWidth, int nHeight, int nCount, int nType, int nPuzzleType)
|
||
{
|
||
if ( g_pCorners && nCount == g_nCornersCount && nPuzzleType == g_nTypeCorners && nHeight == g_nPicHeight && nWidth == g_nPicWidth )
|
||
return;
|
||
|
||
if ( g_pCorners )
|
||
delete []g_pCorners;
|
||
|
||
g_nPicWidth = nWidth;
|
||
g_nPicHeight = nHeight;
|
||
|
||
g_nTypeCorners = nPuzzleType;
|
||
g_nCornersCount = nCount;
|
||
|
||
g_pCorners = new int[nCount];
|
||
if ( (0 <= nType && nType <= 3) || 5 == nType || 6 == nType || 7 == nType)
|
||
{
|
||
for ( int nIndex = 0; nIndex < nCount; nIndex++)
|
||
g_pCorners[nIndex] = nType;
|
||
}
|
||
else if ( 4 == nType )
|
||
{
|
||
CRandom rnd( m_dwBaseRnd );
|
||
|
||
for ( int nIndex = 0; nIndex < nCount; nIndex++)
|
||
g_pCorners[nIndex] = rnd.Rand( 4 );
|
||
}
|
||
return;
|
||
|
||
}
|
||
void GeneratePuzzle(int nRow, int nCol, int nPuzzleType)
|
||
{
|
||
if ( g_pHorizontalFactor && g_pVerticalFactor && nRow == g_nRow && nCol == g_nCol && nPuzzleType == g_nTypeGenerate)
|
||
return;
|
||
|
||
if ( g_pHorizontalFactor )
|
||
delete []g_pHorizontalFactor;
|
||
if ( g_pVerticalFactor )
|
||
delete []g_pVerticalFactor;
|
||
|
||
int nSize = nCol * nRow * 2;
|
||
|
||
g_nTypeGenerate = nPuzzleType;
|
||
g_nRow = nRow;
|
||
g_nCol = nCol;
|
||
|
||
g_pHorizontalFactor = new int[nSize];
|
||
g_pVerticalFactor = new int[nSize];
|
||
|
||
CRandom rnd( m_dwBaseRnd );
|
||
|
||
for ( int nYIndex = 0, nIndex = 0; nYIndex < nRow; nYIndex++ )
|
||
{
|
||
for ( int nXIndex = 0; nXIndex < nCol; nXIndex++, nIndex += 2 )
|
||
{
|
||
if ( 1 == nRow )
|
||
{
|
||
g_pHorizontalFactor[nIndex + 0] = 0;
|
||
g_pHorizontalFactor[nIndex + 1] = 0;
|
||
continue;
|
||
}
|
||
if ( 0 == nYIndex )
|
||
{
|
||
g_pHorizontalFactor[nIndex + 0] = 0;
|
||
g_pHorizontalFactor[nIndex + 1] = -1 + 2 * rnd.Rand( 2 );
|
||
}
|
||
else if ( nRow - 1 == nYIndex )
|
||
{
|
||
g_pHorizontalFactor[nIndex + 1] = 0;
|
||
g_pHorizontalFactor[nIndex + 0] = - g_pHorizontalFactor[nIndex - nCol * 2 + 1];
|
||
}
|
||
else
|
||
{
|
||
g_pHorizontalFactor[nIndex + 1] = -1 + 2 * rnd.Rand( 2 );
|
||
g_pHorizontalFactor[nIndex + 0] = - g_pHorizontalFactor[nIndex - nCol * 2 + 1];
|
||
}
|
||
|
||
if ( 1 == nCol )
|
||
{
|
||
g_pVerticalFactor[nIndex + 0] = 0;
|
||
g_pVerticalFactor[nIndex + 1] = 0;
|
||
continue;
|
||
}
|
||
if ( 0 == nXIndex )
|
||
{
|
||
g_pVerticalFactor[nIndex + 0] = 0;
|
||
g_pVerticalFactor[nIndex + 1] = -1 + 2 * rnd.Rand( 2 );
|
||
}
|
||
else if ( nCol - 1 == nXIndex )
|
||
{
|
||
g_pVerticalFactor[nIndex + 1] = 0;
|
||
g_pVerticalFactor[nIndex + 0] = - g_pVerticalFactor[nIndex - 1];
|
||
}
|
||
else
|
||
{
|
||
g_pVerticalFactor[nIndex + 1] = -1 + 2 * rnd.Rand( 2 );
|
||
g_pVerticalFactor[nIndex + 0] = - g_pVerticalFactor[nIndex - 1];
|
||
}
|
||
|
||
}
|
||
}
|
||
return;
|
||
}
|
||
|
||
|
||
|
||
int GetStartX(int nFigWidth, int nFigHeight, int nXResult, int nYResult, int nIndex, int nCurX)
|
||
{
|
||
int nXStart = 0;
|
||
|
||
switch(nIndex)
|
||
{
|
||
case 0: nXStart = - nFigWidth; break;
|
||
case 1: nXStart = g_nPicWidth + nFigWidth; break;
|
||
case 2: nXStart = g_nPicWidth + nFigWidth; break;
|
||
case 3: nXStart = - nFigWidth; break;
|
||
case 5: nXStart = nXResult; break;
|
||
case 6: nXStart = nXResult; break;
|
||
case 7:
|
||
{
|
||
if (nCurX % 2)
|
||
nXStart = -nFigWidth;
|
||
else
|
||
nXStart = g_nPicWidth + nFigWidth;
|
||
}
|
||
}
|
||
|
||
return nXStart;
|
||
}
|
||
|
||
int GetStartY(int nFigWidth, int nFigHeight, int nXResult, int nYResult, int nIndex)
|
||
{
|
||
int nYStart = 0;
|
||
|
||
switch(nIndex)
|
||
{
|
||
case 0: nYStart = - nFigHeight; break;
|
||
case 1: nYStart = - nFigHeight; break;
|
||
case 2: nYStart = g_nPicHeight + nFigHeight; break;
|
||
case 3: nYStart = g_nPicHeight + nFigHeight; break;
|
||
case 5: nYStart = - nFigHeight; break;
|
||
case 6: nYStart = g_nPicHeight + nFigHeight; break;
|
||
case 7: nYStart = - nFigHeight; break;
|
||
}
|
||
|
||
return nYStart;
|
||
}
|
||
public:
|
||
|
||
//<2F><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||
int *g_pShuffle;
|
||
int g_nShuffleCount;
|
||
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
int *g_pCorners;
|
||
int g_nCornersCount;
|
||
|
||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
int *g_pHorizontalFactor;
|
||
int *g_pVerticalFactor;
|
||
int g_nRow;
|
||
int g_nCol;
|
||
int g_nTypeShuffle;
|
||
int g_nTypeCorners;
|
||
int g_nTypeGenerate;
|
||
|
||
protected:
|
||
|
||
int g_nPicWidth;
|
||
int g_nPicHeight;
|
||
|
||
|
||
};
|
||
class CFigure
|
||
{
|
||
public:
|
||
|
||
CFigure()
|
||
{
|
||
m_dBigRadius = -1;
|
||
|
||
m_nPicHeight = -1;
|
||
m_nPicWidth = -1;
|
||
|
||
m_pBGRASource = 0;
|
||
|
||
m_dXCoorSource = -1;
|
||
m_dYCoorSource = -1;
|
||
m_arrPoints = 0;
|
||
|
||
m_nFigureType = -1;
|
||
m_nPointsCount = -1;
|
||
}
|
||
~CFigure()
|
||
{
|
||
if ( m_arrPoints )
|
||
delete[] m_arrPoints;
|
||
}
|
||
|
||
public:
|
||
|
||
void SetValue(int nFigureType, double dSide, BYTE* pBGRASource, int nPicWidth, int nPicHeight, double dXCoorSource, double dYCoorSource)
|
||
{
|
||
|
||
m_nPicHeight = nPicHeight;
|
||
m_nPicWidth = nPicWidth;
|
||
|
||
m_pBGRASource = pBGRASource;
|
||
|
||
m_dXCoorSource = dXCoorSource;
|
||
m_dYCoorSource = dYCoorSource;
|
||
|
||
m_arrPoints = 0;
|
||
m_nPointsCount = -1;
|
||
|
||
m_nFigureType = nFigureType;
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
if ( 6 == m_nFigureType )
|
||
{
|
||
m_dBigRadius = dSide;
|
||
m_dShiftX = m_dBigRadius / 2;
|
||
m_dShiftY = sqrt(3.0) * m_dBigRadius / 2;
|
||
}
|
||
else if ( 30 == m_nFigureType || 31 == m_nFigureType)
|
||
{
|
||
m_dBigRadius = sqrt(3.0) * dSide / 3; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
m_dShiftY = m_dBigRadius / 2; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
m_dShiftX = dSide / 2;
|
||
}
|
||
else if ( 41 == m_nFigureType )
|
||
{
|
||
m_dBigRadius = dSide / sqrt(2.0);
|
||
}
|
||
else if ( 42 == m_nFigureType )
|
||
{
|
||
m_dShiftX = dSide / 2;
|
||
m_dShiftY = dSide * ( 12.0 / 25.0 ) / 2;
|
||
}
|
||
else if ( 43 == m_nFigureType )
|
||
{
|
||
m_dShiftX = dSide / 2;
|
||
m_dShiftY = dSide * ( 12.0 / 25.0 ) / 2;
|
||
}
|
||
}
|
||
|
||
BOOL Draw(Gdiplus::Graphics *oMainRender, Gdiplus::TextureBrush *oBrush, double dXCoorResult, double dYCoorResult, int nWidth, int nHeight, double dEffect)
|
||
{
|
||
if(!oMainRender || !oBrush || nWidth != m_nPicWidth || nHeight != m_nPicHeight)
|
||
return FALSE;
|
||
|
||
int nSize = 4 * nHeight * nWidth;
|
||
|
||
CreatePolygon(m_nFigureType, m_dXCoorSource, m_dYCoorSource);
|
||
|
||
Gdiplus::GraphicsPath oPath;
|
||
oPath.AddPolygon(m_arrPoints, m_nPointsCount);
|
||
oPath.CloseFigure();
|
||
|
||
Gdiplus::Region oRegion(&oPath);
|
||
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
oBrush->TranslateTransform(-float(m_dXCoorSource - dXCoorResult), -float(m_dYCoorSource - dYCoorResult), MatrixOrderAppend);
|
||
oRegion.Translate(-float(m_dXCoorSource - dXCoorResult), -float(m_dYCoorSource - dYCoorResult));
|
||
|
||
oMainRender->FillRegion(oBrush, &oRegion);
|
||
|
||
if (6 == m_nFigureType)
|
||
DrawHexagonBorder(oMainRender, dXCoorResult, dYCoorResult, dEffect);
|
||
else if ( 30 == m_nFigureType || 31 == m_nFigureType )
|
||
DrawTriangleBorder(oMainRender, dXCoorResult, dYCoorResult, dEffect);
|
||
else if ( 41 == m_nFigureType )
|
||
DrawRhombusBorder(oMainRender, dXCoorResult, dYCoorResult, dEffect);
|
||
else if ( 42 == m_nFigureType )
|
||
DrawBrickBorder(oMainRender, dXCoorResult, dYCoorResult, dEffect);
|
||
else if ( 43 == m_nFigureType )
|
||
DrawInclinedBrickBorder(oMainRender, dXCoorResult, dYCoorResult, dEffect);
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
oRegion.Translate(float(m_dXCoorSource - dXCoorResult), float(m_dYCoorSource - dYCoorResult));
|
||
oBrush->TranslateTransform(float(m_dXCoorSource - dXCoorResult), float(m_dYCoorSource - dYCoorResult), MatrixOrderAppend);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
protected:
|
||
|
||
BOOL CreatePolygon(int nNumber, double dX, double dY)
|
||
{
|
||
if (m_arrPoints)
|
||
delete []m_arrPoints;
|
||
if (6 == nNumber)
|
||
{
|
||
m_nPointsCount = 6;
|
||
m_arrPoints = new Gdiplus::PointF[6];
|
||
int nRadius = m_dBigRadius;
|
||
double dXShift = m_dShiftX;
|
||
double dYShift = m_dShiftY;
|
||
|
||
m_arrPoints[0].X = dX - dXShift;
|
||
m_arrPoints[0].Y = dY + dYShift;
|
||
m_arrPoints[1].X = dX + dXShift;
|
||
m_arrPoints[1].Y = dY + dYShift;
|
||
m_arrPoints[2].X = dX + nRadius;
|
||
m_arrPoints[2].Y = dY;
|
||
m_arrPoints[3].X = dX + dXShift;
|
||
m_arrPoints[3].Y = dY - dYShift;
|
||
|
||
m_arrPoints[4].X = dX - dXShift;
|
||
m_arrPoints[4].Y = dY - dYShift;
|
||
m_arrPoints[5].X = dX - nRadius;
|
||
m_arrPoints[5].Y = dY;
|
||
|
||
}
|
||
|
||
else if ( 30 == nNumber )
|
||
{
|
||
m_nPointsCount = 3;
|
||
m_arrPoints = new Gdiplus::PointF[3];
|
||
m_arrPoints[0].X = dX - m_dShiftX;
|
||
m_arrPoints[0].Y = dY + m_dShiftY;
|
||
|
||
m_arrPoints[1].X = dX;
|
||
m_arrPoints[1].Y = dY - m_dBigRadius;
|
||
|
||
m_arrPoints[2].X = dX + m_dShiftX;
|
||
m_arrPoints[2].Y = dY + m_dShiftY;
|
||
}
|
||
else if ( 31 == nNumber )
|
||
{
|
||
m_nPointsCount = 3;
|
||
m_arrPoints = new Gdiplus::PointF[3];
|
||
m_arrPoints[0].X = dX;
|
||
m_arrPoints[0].Y = dY + m_dBigRadius;
|
||
|
||
m_arrPoints[1].X = dX - m_dShiftX;
|
||
m_arrPoints[1].Y = dY - m_dShiftY;
|
||
|
||
m_arrPoints[2].X = dX + m_dShiftX;
|
||
m_arrPoints[2].Y = dY - m_dShiftY;
|
||
}
|
||
else if ( 41 == m_nFigureType )
|
||
{
|
||
m_nPointsCount = 4;
|
||
m_arrPoints = new Gdiplus::PointF[4];
|
||
|
||
m_arrPoints[0].X = dX - m_dBigRadius;
|
||
m_arrPoints[0].Y = dY;
|
||
|
||
m_arrPoints[1].X = dX;
|
||
m_arrPoints[1].Y = dY + m_dBigRadius;
|
||
|
||
m_arrPoints[2].X = dX + m_dBigRadius;
|
||
m_arrPoints[2].Y = dY;
|
||
|
||
m_arrPoints[3].X = dX;
|
||
m_arrPoints[3].Y = dY - m_dBigRadius;
|
||
}
|
||
else if ( 42 == m_nFigureType )
|
||
{
|
||
m_nPointsCount = 4;
|
||
m_arrPoints = new Gdiplus::PointF[4];
|
||
|
||
m_arrPoints[0].X = dX - m_dShiftX;
|
||
m_arrPoints[0].Y = dY - m_dShiftY;
|
||
|
||
m_arrPoints[1].X = dX + m_dShiftX;
|
||
m_arrPoints[1].Y = dY - m_dShiftY;
|
||
|
||
m_arrPoints[2].X = dX + m_dShiftX;
|
||
m_arrPoints[2].Y = dY + m_dShiftY;
|
||
|
||
m_arrPoints[3].X = dX - m_dShiftX;
|
||
m_arrPoints[3].Y = dY + m_dShiftY;
|
||
}
|
||
else if ( 43 == m_nFigureType )
|
||
{
|
||
m_nPointsCount = 4;
|
||
m_arrPoints = new Gdiplus::PointF[4];
|
||
|
||
double dCos = cos(-IPP_PI4);
|
||
double dSin = sin(-IPP_PI4);
|
||
|
||
m_arrPoints[3].X = - m_dShiftX * dCos - (- m_dShiftY) * dSin + dX;
|
||
m_arrPoints[3].Y = - m_dShiftX * dSin + (- m_dShiftY) * dCos + dY;
|
||
|
||
m_arrPoints[2].X = m_dShiftX * dCos - (- m_dShiftY) * dSin + dX;
|
||
m_arrPoints[2].Y = m_dShiftX * dSin + (- m_dShiftY) * dCos + dY;
|
||
|
||
m_arrPoints[1].X = m_dShiftX * dCos - ( m_dShiftY) * dSin + dX;
|
||
m_arrPoints[1].Y = m_dShiftX * dSin + ( m_dShiftY) * dCos + dY;
|
||
|
||
m_arrPoints[0].X = - m_dShiftX * dCos - ( m_dShiftY) * dSin + dX;
|
||
m_arrPoints[0].Y = - m_dShiftX * dSin + ( m_dShiftY) * dCos + dY;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
|
||
BOOL DrawHexagonBorder(Gdiplus::Graphics *oMainRender, double dXCoorResult, double dYCoorResult, double dEffect)
|
||
{
|
||
Gdiplus::Pen oPen(Color(0, 0, 0), 1);
|
||
CreatePolygon(m_nFigureType, dXCoorResult, dYCoorResult);
|
||
|
||
int nAlphaBlack = 448 * dEffect;
|
||
int nAlphaWhite = 448 * dEffect;
|
||
|
||
for ( int nIndex = 0; nIndex < 5; nIndex++ )
|
||
{
|
||
nAlphaBlack /= 2;
|
||
if (nIndex == 1)
|
||
{
|
||
nAlphaBlack = 224 * dEffect;
|
||
nAlphaWhite = 224 * dEffect;
|
||
}
|
||
nAlphaWhite /= 2;
|
||
//oPen.SetColor(Color(nAlphaWhite, 255, 255, 255));
|
||
oPen.SetColor(Color(nAlphaBlack, 0, 0, 0));
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[0], m_arrPoints[1]);
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[1], m_arrPoints[2]);
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[2], m_arrPoints[3]);
|
||
//oPen.SetColor(Color(nAlphaBlack, 0, 0, 0));
|
||
oPen.SetColor(Color(nAlphaWhite, 255, 255, 255));
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[3], m_arrPoints[4]);
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[4], m_arrPoints[5]);
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[5], m_arrPoints[0]);
|
||
|
||
m_arrPoints[0].X++;
|
||
m_arrPoints[0].Y--;
|
||
|
||
m_arrPoints[1].X--;
|
||
m_arrPoints[1].Y--;
|
||
|
||
m_arrPoints[2].X--;
|
||
|
||
m_arrPoints[3].X--;
|
||
m_arrPoints[3].Y++;
|
||
|
||
m_arrPoints[4].X++;
|
||
m_arrPoints[4].Y++;
|
||
|
||
m_arrPoints[5].X++;
|
||
|
||
}
|
||
return TRUE;
|
||
}
|
||
BOOL DrawTriangleBorder(Gdiplus::Graphics *oMainRender, double dXCoorResult, double dYCoorResult, double dEffect)
|
||
{
|
||
if (30 == m_nFigureType )
|
||
{
|
||
Gdiplus::Pen oPen(Color(0, 0, 0), 1);
|
||
CreatePolygon(m_nFigureType, dXCoorResult, dYCoorResult);
|
||
|
||
int nAlphaBlack = 448 * dEffect;
|
||
int nAlphaWhite = 448 * dEffect;
|
||
|
||
for ( int nIndex = 0; nIndex < 5; nIndex++ )
|
||
{
|
||
nAlphaBlack /= 2;
|
||
if (nIndex == 1 || nIndex == 2)
|
||
{
|
||
nAlphaBlack = 224 * dEffect;
|
||
nAlphaWhite = 224 * dEffect;
|
||
}
|
||
nAlphaWhite /= 2;
|
||
if(nIndex == 0)
|
||
{
|
||
nAlphaWhite = 128;
|
||
nAlphaBlack = 128;
|
||
}
|
||
oPen.SetColor(Color(nAlphaWhite, 255, 255, 255));
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[0], m_arrPoints[1]);
|
||
oPen.SetColor(Color(nAlphaBlack, 0, 0, 0));
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[1], m_arrPoints[2]);
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[2], m_arrPoints[0]);
|
||
|
||
m_arrPoints[0].X ++;
|
||
m_arrPoints[0].Y -= float(0.4);
|
||
|
||
m_arrPoints[1].Y++;
|
||
|
||
m_arrPoints[2].X --;
|
||
m_arrPoints[2].Y -= float(0.4);
|
||
|
||
|
||
}
|
||
}
|
||
else if ( 31 == m_nFigureType)
|
||
{
|
||
Gdiplus::Pen oPen(Color(0, 0, 0), 1);
|
||
CreatePolygon(m_nFigureType, dXCoorResult, dYCoorResult);
|
||
|
||
int nAlphaBlack = 448 * dEffect;
|
||
int nAlphaWhite = 448 * dEffect;
|
||
|
||
for ( int nIndex = 0; nIndex < 5; nIndex++ )
|
||
{
|
||
nAlphaBlack /= 2;
|
||
if (nIndex == 1 || nIndex == 2)
|
||
{
|
||
nAlphaBlack = 224 * dEffect;
|
||
nAlphaWhite = 224 * dEffect;
|
||
}
|
||
nAlphaWhite /= 2;
|
||
if(nIndex == 0)
|
||
{
|
||
nAlphaWhite = 128;
|
||
nAlphaBlack = 128;
|
||
}
|
||
oPen.SetColor(Color(nAlphaWhite, 255, 255, 255));
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[0], m_arrPoints[1]);
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[1], m_arrPoints[2]);
|
||
oPen.SetColor(Color(nAlphaBlack, 0, 0, 0));
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[2], m_arrPoints[0]);
|
||
|
||
m_arrPoints[0].Y--;
|
||
|
||
m_arrPoints[1].X ++;
|
||
m_arrPoints[1].Y += float(0.4);
|
||
|
||
m_arrPoints[2].X --;
|
||
m_arrPoints[2].Y += float(0.4);
|
||
|
||
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL DrawRhombusBorder(Gdiplus::Graphics *oMainRender, double dXCoorResult, double dYCoorResult, double dEffect)
|
||
{
|
||
Gdiplus::Pen oPen(Color(0, 0, 0), 1);
|
||
CreatePolygon(m_nFigureType, dXCoorResult, dYCoorResult);
|
||
|
||
int nAlphaBlack = 448 * dEffect;
|
||
int nAlphaWhite = 448 * dEffect;
|
||
|
||
for ( int nIndex = 0; nIndex < 5; nIndex++ )
|
||
{
|
||
nAlphaBlack /= 2;
|
||
if (nIndex == 1)
|
||
{
|
||
nAlphaBlack = 224 * dEffect;
|
||
nAlphaWhite = 224 * dEffect;
|
||
}
|
||
nAlphaWhite /= 2;
|
||
//oPen.SetColor(Color(nAlphaWhite, 255, 255, 255));
|
||
oPen.SetColor(Color(nAlphaBlack, 0, 0, 0));
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[0], m_arrPoints[1]);
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[1], m_arrPoints[2]);
|
||
//oPen.SetColor(Color(nAlphaBlack, 0, 0, 0));
|
||
oPen.SetColor(Color(nAlphaWhite, 255, 255, 255));
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[2], m_arrPoints[3]);
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[3], m_arrPoints[0]);
|
||
|
||
m_arrPoints[0].X++;
|
||
m_arrPoints[1].Y--;
|
||
m_arrPoints[2].X--;
|
||
m_arrPoints[3].Y++;
|
||
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
BOOL DrawBrickBorder(Gdiplus::Graphics *oMainRender, double dXCoorResult, double dYCoorResult, double dEffect)
|
||
{
|
||
Gdiplus::Pen oPen(Color(0, 0, 0), 1);
|
||
CreatePolygon(m_nFigureType, dXCoorResult, dYCoorResult);
|
||
|
||
int nAlphaBlack = 448 * dEffect;
|
||
int nAlphaWhite = 448 * dEffect;
|
||
|
||
for ( int nIndex = 0; nIndex < 5; nIndex++ )
|
||
{
|
||
nAlphaBlack /= 2;
|
||
if (nIndex == 1)
|
||
{
|
||
nAlphaBlack = 224 * dEffect;
|
||
nAlphaWhite = 224 * dEffect;
|
||
}
|
||
nAlphaWhite /= 2;
|
||
//oPen.SetColor(Color(nAlphaWhite, 255, 255, 255));
|
||
oPen.SetColor(Color(nAlphaBlack, 0, 0, 0));
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[1], m_arrPoints[2]);
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[2], m_arrPoints[3]);
|
||
//oPen.SetColor(Color(nAlphaBlack, 0, 0, 0));
|
||
oPen.SetColor(Color(nAlphaWhite, 255, 255, 255));
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[0], m_arrPoints[1]);
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[3], m_arrPoints[0]);
|
||
|
||
m_arrPoints[0].X++;
|
||
m_arrPoints[0].Y++;
|
||
|
||
m_arrPoints[1].X--;
|
||
m_arrPoints[1].Y++;
|
||
|
||
m_arrPoints[2].X--;
|
||
m_arrPoints[2].Y--;
|
||
|
||
m_arrPoints[3].X++;
|
||
m_arrPoints[3].Y--;
|
||
|
||
}
|
||
return TRUE;
|
||
}
|
||
BOOL DrawInclinedBrickBorder(Gdiplus::Graphics *oMainRender, double dXCoorResult, double dYCoorResult, double dEffect)
|
||
{
|
||
Gdiplus::Pen oPen(Color(0, 0, 0), 1);
|
||
CreatePolygon(m_nFigureType, dXCoorResult, dYCoorResult);
|
||
|
||
int nAlphaBlack = 448 * dEffect;
|
||
int nAlphaWhite = 448 * dEffect;
|
||
|
||
for ( int nIndex = 0; nIndex < 5; nIndex++ )
|
||
{
|
||
nAlphaBlack /= 2;
|
||
if (nIndex == 1)
|
||
{
|
||
nAlphaBlack = 224 * dEffect;
|
||
nAlphaWhite = 224 * dEffect;
|
||
}
|
||
nAlphaWhite /= 2;
|
||
//oPen.SetColor(Color(nAlphaWhite, 255, 255, 255));
|
||
oPen.SetColor(Color(nAlphaBlack, 0, 0, 0));
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[0], m_arrPoints[1]);
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[1], m_arrPoints[2]);
|
||
//oPen.SetColor(Color(nAlphaBlack, 0, 0, 0));
|
||
oPen.SetColor(Color(nAlphaWhite, 255, 255, 255));
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[2], m_arrPoints[3]);
|
||
oMainRender->DrawLine(&oPen, m_arrPoints[3], m_arrPoints[0]);
|
||
|
||
m_arrPoints[1].X--;
|
||
m_arrPoints[2].Y++;
|
||
m_arrPoints[3].X++;
|
||
m_arrPoints[0].Y--;
|
||
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
public:
|
||
double m_dBigRadius;
|
||
|
||
int m_nPicHeight;
|
||
int m_nPicWidth;
|
||
|
||
BYTE* m_pBGRASource;
|
||
|
||
double m_dXCoorSource;
|
||
double m_dYCoorSource;
|
||
|
||
int m_nFigureType;
|
||
// 30, 31 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
// 6 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// 41 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 45 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
// 42 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 25:12)
|
||
// 43 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> 45 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
protected:
|
||
|
||
double m_dShiftY; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
double m_dShiftX; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
|
||
Gdiplus::PointF* m_arrPoints;
|
||
int m_nPointsCount;
|
||
|
||
};
|
||
|
||
|
||
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
#pragma warning(default: 4244)
|