#include "StdAfx.h" #include "MyBrush.h" #include <math.h>
CMyBrush::CMyBrush(int nLength) { ASSERT(nLength >= 5 && nLength < 200);
m_nLength = nLength | 1; //确保长度为奇数
m_nMid = m_nLength / 2;
m_pBuf = new BYTE [m_nLength * m_nLength];
memset(m_pBuf, 0, m_nLength*m_nLength);
for (int i=0; i<256; i++)
{
for (int j=0; j<256; j++)
{
m_a256x256[i][j] = ((i+1) * (j+1) - 1) / 256;
}
}
m_fWidthHalfCircle = 0.f;
m_nWidthHalfSuibi = 0;
m_aRGB[0] = m_aRGB[1] = m_aRGB[2] = 255;
}
CMyBrush::~CMyBrush(void) { if (m_pBuf != NULL) delete [] m_pBuf, m_pBuf = NULL; }
COLORREF CMyBrush::SetColor( COLORREF rgb ) { COLORREF clrOld = RGB(m_aRGB[0], m_aRGB[1], m_aRGB[2]); m_aRGB[0] = GetRValue(rgb); m_aRGB[1] = GetGValue(rgb); m_aRGB[2] = GetBValue(rgb); return clrOld; }
void CMyBrush::SetWidthSuibiBrush( int nWidth, BYTE gray ) { if (nWidth < 2) nWidth = 2; else if (nWidth > m_nLength) nWidth = m_nLength;
m_nWidthHalfSuibi = nWidth/2;
m_nHalfRect = m_nWidthHalfSuibi;
m_fWidthHalfCircle = 0.f; //将圆刷子宽度清0,确保与水笔刷子互斥
memset(m_pBuf, 0, m_nLength*m_nLength);
BYTE *pi = m_pBuf+(m_nMid-m_nHalfRect)*m_nLength;
for (int i = -m_nHalfRect; i<=m_nHalfRect; i++, pi += m_nLength) //初始化
{
BYTE *pij = pi + (m_nMid - m_nHalfRect);
for (int j=-m_nHalfRect; j<=m_nHalfRect; j++, pij++)
{
int sum = j - i;
if (sum >= 0 && sum <= m_nWidthHalfSuibi) //两条平行线之间
{
*pij = gray;
}
}
}
}
void CMyBrush::SetWidthCircleBrush( float fWidth ) { if (fWidth < 1.f) { fWidth = 1.f; } else if (fWidth > m_nLength - 6.f) { fWidth = m_nLength - 6.f; }
if (abs(fWidth - 2*m_fWidthHalfCircle) < 0.001f)
return;
m_nWidthHalfSuibi = 0; //将水笔刷子宽度清0
m_fWidthHalfCircle = fWidth / 2.f;
if (m_fWidthHalfCircle >= 3.f)
{
m_fBorderInner = 1.0f;
m_fBorderOuter = 1.0f;
m_fBorderOuter2 = 1.0f;
}
if (m_fWidthHalfCircle >= 2.5f)
{
m_fBorderInner = 0.75f;
m_fBorderOuter = 1.0f;
m_fBorderOuter2 = 1.25f;
}
else if (m_fWidthHalfCircle >= 2.0f)
{
m_fBorderInner = 0.75f;
m_fBorderOuter = 1.0f;
m_fBorderOuter2 = 1.0f;
}
else if (m_fWidthHalfCircle >= 1.25f)
{
m_fBorderInner = 0.75f;
m_fBorderOuter = 0.75f;
m_fBorderOuter2 = 1.0f;
}
else if (m_fWidthHalfCircle >= 0.75f)
{
m_fBorderInner = 0.5f;
m_fBorderOuter = 0.75f;
m_fBorderOuter2 = 1.0f;
}
else if (m_fWidthHalfCircle >= 0.5f)
{
m_fBorderInner = 0.5f;
m_fBorderOuter = 0.75f;
m_fBorderOuter2 = 0.75f;
}
else
{
ASSERT(FALSE);
}
m_nHalfRect =int(m_fWidthHalfCircle + m_fBorderOuter + m_fBorderOuter2) + 1;
ASSERT(m_nHalfRect <= m_nMid);
memset(m_pBuf, 0, m_nLength*m_nLength);
BYTE *pi = m_pBuf+(m_nMid-m_nHalfRect)*m_nLength;
for (int i = -m_nHalfRect; i<=m_nHalfRect; i++, pi += m_nLength) //初始化圆刷子
{
float i2 = i*i;
BYTE *pij = pi + (m_nMid - m_nHalfRect);
for (int j=-m_nHalfRect; j<=m_nHalfRect; j++, pij++)
{
float sum2 = i2 + j*j;
float fDis = sqrt(sum2); //计算到圆心距离
*pij = DisToGrayCircle(fDis);
}
}
}
BYTE CMyBrush::DisToGrayCircle(float fDis) { BYTE byNode1 = 176; BYTE byNode2 = 32;
if (fDis <= m_fWidthHalfCircle - m_fBorderInner)
{
return 255;
}
else if (fDis < m_fWidthHalfCircle) //内层模糊圈
{
float fRatio = (m_fWidthHalfCircle - fDis)/m_fBorderInner;
return int(fRatio*(255-byNode1))+byNode1;
}
else if (fDis < m_fWidthHalfCircle + m_fBorderOuter) ////外层模糊圈1
{
float fRatio = (m_fWidthHalfCircle + m_fBorderOuter - fDis)/m_fBorderOuter;
return int(fRatio*(byNode1-byNode2))+byNode2;
}
else if (fDis < m_fWidthHalfCircle + m_fBorderOuter + m_fBorderOuter2) ////外层模糊圈2
{
float fRatio = (m_fWidthHalfCircle + m_fBorderOuter + m_fBorderOuter2 - fDis)/m_fBorderOuter2;
return int(fRatio*byNode2);
}
else
{
return 0;
}
}
BYTE CMyBrush::DisToGrayLine(float fDis) { fDis = abs(fDis);
float fk = 1.0f;
if (fDis > fk)
{
return 0;
}
else
{
float fRatio = (fk - fDis)/fk;
return BYTE(fRatio*255);
}
}