Commit 72b7e35b authored by Ilya.Kirillov's avatar Ilya.Kirillov Committed by Alexander Trofimov

Добавлен класс для работы с карандашом.

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@62042 954022d7-b5bf-4e40-9824-e11837661b57
parent 7c5e3c8e
This diff is collapsed.
......@@ -10,7 +10,8 @@ namespace Metafile
{
EMF_OBJECT_UNKNOWN = 0x00,
EMF_OBJECT_BRUSH = 0x01,
EMF_OBJECT_FONT = 0x02
EMF_OBJECT_FONT = 0x02,
EMF_OBJECT_PEN = 0x03
} EEmfObjectType;
class CEmfObjectBase
......@@ -69,6 +70,32 @@ namespace Metafile
TEmfLogFontEx LogFontEx;
TEmfDesignVector DesignVector;
};
class CEmfLogPen : public CEmfObjectBase
{
public:
CEmfLogPen()
{
StyleEntry = NULL;
}
virtual ~CEmfLogPen()
{
if (StyleEntry)
delete[] StyleEntry;
}
virtual EEmfObjectType GetType()
{
return EMF_OBJECT_PEN;
}
public:
unsigned long PenStyle;
unsigned long Width;
TEmfColor Color;
unsigned long NumStyleEntries;
unsigned long* StyleEntry;
};
}
#endif // _EMF_OBJECTS_H
\ No newline at end of file
......@@ -117,6 +117,7 @@ namespace Metafile
{
case EMF_OBJECT_BRUSH: m_pDC->SetBrush((CEmfLogBrushEx*)pObject); break;
case EMF_OBJECT_FONT: m_pDC->SetFont((CEmfLogFont*)pObject); break;
case EMF_OBJECT_PEN: m_pDC->SetPen((CEmfLogPen*)pObject); break;
}
}
}
......@@ -138,7 +139,14 @@ namespace Metafile
pNewDC->m_oTransform.Copy(&m_oTransform);
pNewDC->m_oTextColor.Copy(&m_oTextColor);
pNewDC->m_pBrush = m_pBrush;
pNewDC->m_oBgColor.Copy(&m_oBgColor);
pNewDC->m_pBrush = m_pBrush;
pNewDC->m_pFont = m_pFont;
pNewDC->m_pPen = m_pPen;
pNewDC->m_ulTextAlign = m_ulTextAlign;
pNewDC->m_ulBgMode = m_ulBgMode;
pNewDC->m_ulMiterLimit = m_ulMiterLimit;
pNewDC->m_ulFillMode = m_ulFillMode;
return pNewDC;
}
......@@ -194,4 +202,29 @@ namespace Metafile
{
return m_oBgColor;
}
void CEmfDC::SetMiterLimit(unsigned long ulMiter)
{
m_ulMiterLimit = ulMiter;
}
unsigned long CEmfDC::GetMiterLimit()
{
return m_ulMiterLimit;
}
void CEmfDC::SetFillMode(unsigned long ulFillMode)
{
m_ulFillMode = ulFillMode;
}
unsigned long CEmfDC::GetFillMode()
{
return m_ulFillMode;
}
void CEmfDC::SetPen(CEmfLogPen* pPen)
{
m_pPen = pPen;
}
CEmfLogPen* CEmfDC::GetPen()
{
return m_pPen;
}
}
\ No newline at end of file
......@@ -54,16 +54,25 @@ namespace Metafile
unsigned long GetBgMode();
void SetBgColor(TEmfColor& oColor);
TEmfColor& GetBgColor();
void SetMiterLimit(unsigned long ulMiter);
unsigned long GetMiterLimit();
void SetFillMode(unsigned long ulFillMode);
unsigned long GetFillMode();
void SetPen(CEmfLogPen* pPen);
CEmfLogPen* GetPen();
private:
CEmfLogBrushEx* m_pBrush;
CEmfLogPen* m_pPen;
CEmfLogFont* m_pFont;
TEmfXForm m_oTransform;
TEmfColor m_oTextColor;
TEmfColor m_oBgColor;
unsigned long m_ulTextAlign;
unsigned long m_ulBgMode;
unsigned long m_ulMiterLimit;
unsigned long m_ulFillMode;
};
}
......
......@@ -32,6 +32,14 @@ namespace Metafile
return;
m_pRenderer = pRenderer;
long lL = m_pEmfFile->m_oHeader.oBounds.lLeft;
long lR = m_pEmfFile->m_oHeader.oBounds.lRight;
long lT = m_pEmfFile->m_oHeader.oBounds.lTop;
long lB = m_pEmfFile->m_oHeader.oBounds.lBottom;
m_dScaleX = (lR - lL <= 0) ? 1 : m_dW / (double)(lR - lL);
m_dScaleY = (lB - lT <= 0) ? 1 : m_dH / (double)(lB - lT);
}
~CEmfRendererOutput()
{
......@@ -242,7 +250,24 @@ namespace Metafile
void StartPath()
{
UpdateTransform();
UpdateBrush();
m_lDrawPathType = -1;
if (true == UpdateBrush())
{
CEmfDC* pDC = m_pEmfFile->GetDC();
if (ALTERNATE == pDC->GetFillMode())
m_lDrawPathType = c_nEvenOddFillMode;
else// if (WINDING == pDC->GetFillMode())
m_lDrawPathType = c_nWindingFillMode;
}
if (true == UpdatePen())
{
if (-1 == m_lDrawPathType)
m_lDrawPathType = c_nStroke;
else
m_lDrawPathType |= c_nStroke;
}
m_pRenderer->BeginCommand(c_nPathType);
m_pRenderer->PathCommandStart();
......@@ -265,7 +290,8 @@ namespace Metafile
}
void DrawPath()
{
m_pRenderer->DrawPath(c_nWindingFillMode);
if (-1 != m_lDrawPathType)
m_pRenderer->DrawPath(m_lDrawPathType);
}
void EndPath()
{
......@@ -278,22 +304,12 @@ namespace Metafile
double TransX(long lX)
{
long lL = m_pEmfFile->m_oHeader.oBounds.lLeft;
long lR = m_pEmfFile->m_oHeader.oBounds.lRight;
if (lR - lL <= 0)
return 0;
return m_dW * (double)(lX - lL) / (double)(lR - lL);
return m_dScaleX * (double)(lX - lL);
}
double TransY(long lY)
{
long lT = m_pEmfFile->m_oHeader.oBounds.lTop;
long lB = m_pEmfFile->m_oHeader.oBounds.lBottom;
if (lB - lT <= 0)
return 0;
return m_dH * (double)(lY - lT) / (double)(lB - lT);
return m_dScaleY * (double)(lY - lT);
}
bool UpdateBrush()
......@@ -325,22 +341,88 @@ namespace Metafile
if (!pDC)
return;
long lL = m_pEmfFile->m_oHeader.oBounds.lLeft;
long lR = m_pEmfFile->m_oHeader.oBounds.lRight;
long lT = m_pEmfFile->m_oHeader.oBounds.lTop;
long lB = m_pEmfFile->m_oHeader.oBounds.lBottom;
if (lB - lT <= 0 || lR - lL <= 0)
return;
double dKoefX = m_dW / (double)(lR - lL);
double dKoefY = m_dW / (double)(lR - lL);
double dKoefX = m_dScaleX;
double dKoefY = m_dScaleY;
TEmfXForm* pMatrix = pDC->GetTransform();
m_pRenderer->ResetTransform();
m_pRenderer->SetTransform(pMatrix->M11, pMatrix->M12 * dKoefY / dKoefX, pMatrix->M21 * dKoefX / dKoefY, pMatrix->M22, pMatrix->Dx * dKoefX, pMatrix->Dy * dKoefY);
}
bool UpdatePen()
{
CEmfDC* pDC = m_pEmfFile->GetDC();
if (!pDC)
return false;
CEmfLogPen* pPen = pDC->GetPen();
if (!pPen)
return false;
long lColor = METAFILE_RGBA(pPen->Color.r, pPen->Color.g, pPen->Color.b);
// TODO: dWidth PS_GEOMETRIC
double dWidth = pPen->Width * m_dScaleX;
if (dWidth <= 0.01)
dWidth = 0;
unsigned long ulPenType = pPen->PenStyle & PS_TYPE_MASK;
unsigned long ulPenEndCap = pPen->PenStyle & PS_ENDCAP_MASK;
unsigned long ulPenJoin = pPen->PenStyle & PS_JOIN_MASK;
unsigned long ulPenStyle = pPen->PenStyle & PS_STYLE_MASK;
BYTE nCapStyle = 0;
if (0 == ulPenEndCap)
nCapStyle = 2;
else if (1 == ulPenEndCap)
nCapStyle = 1;
else if (2 == ulPenEndCap)
nCapStyle = 0;
BYTE nJoinStyle = 0;
if (0 == ulPenJoin)
nJoinStyle = 2;
else if (1 == ulPenJoin)
nJoinStyle = 1;
else if (2 == ulPenJoin)
nJoinStyle = 2;
double dMiterLimit = pDC->GetMiterLimit() * m_dScaleX;
// TODO: , PS_SOLID.
// TODO: PS_USERSTYLE
unsigned long ulDashStyle;
if (PS_ALTERNATE == ulPenStyle || PS_USERSTYLE == ulPenStyle || PS_INSIDEFRAME == ulPenStyle)
ulDashStyle = (BYTE)PS_SOLID;
else if (PS_NULL != ulPenStyle)
ulDashStyle = (BYTE)ulPenStyle;
m_pRenderer->put_PenDashStyle(ulDashStyle);
m_pRenderer->put_PenLineJoin(nJoinStyle);
m_pRenderer->put_PenLineStartCap(nCapStyle);
m_pRenderer->put_PenLineEndCap(nCapStyle);
m_pRenderer->put_PenColor(lColor);
m_pRenderer->put_PenSize(dWidth);
m_pRenderer->put_PenAlpha(255);
m_pRenderer->put_PenMiterLimit(dMiterLimit);
//// TO DO: AVSRenderer, ushROPMode
//// .
//// Pen'a, .
//switch (pDC->ushROPMode)
//{
// case R2_BLACK: m_pRenderer->put_PenColor(0); break;
// case R2_NOP: m_pRenderer->put_PenAlpha(0); break;
// case R2_COPYPEN: break;
// case R2_WHITE: m_pRenderer->put_PenColor(METAFILE_RGBA(255, 255, 255)); break;
//}
if (PS_NULL == ulPenStyle)
return false;
return true;
}
private:
......@@ -355,6 +437,8 @@ namespace Metafile
double m_dY; //
double m_dW; // /,
double m_dH; // .
double m_dScaleX;
double m_dScaleY;
CEmfFile* m_pEmfFile;
};
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment