mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 07:23:34 +08:00
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@62634 954022d7-b5bf-4e40-9824-e11837661b57
1482 lines
46 KiB
C++
1482 lines
46 KiB
C++
#pragma once
|
|
#include "../../../Common/ASCUtils.h"
|
|
#include "../Interfaces/ASCRenderer.h"
|
|
#include "../../../Common/XmlUtils.h"
|
|
#include "../agg/ap_aggplusenums.h"
|
|
|
|
#include <gdiplus.h>
|
|
|
|
// pen -----------------------------------------------------------
|
|
const long c_ag_LineCapFlat = 0;
|
|
const long c_ag_LineCapSquare = 1;
|
|
const long c_ag_LineCapTriangle = 3;
|
|
const long c_ag_LineCapNoAnchor = 16;
|
|
const long c_ag_LineCapSquareAnchor = 17;
|
|
const long c_ag_LineCapRoundAnchor = 18;
|
|
const long c_ag_LineCapDiamondAnchor = 19;
|
|
const long c_ag_LineCapArrowAnchor = 20;
|
|
const long c_ag_LineCapAnchorMask = 240;
|
|
const long c_ag_LineCapCustom = 255;
|
|
|
|
const long c_ag_DashCapFlat = 0;
|
|
const long c_ag_DashCapRound = 2;
|
|
const long c_ag_DashCapTriangle = 3;
|
|
|
|
const long c_ag_LineJoinMiter = 0;
|
|
const long c_ag_LineJoinBevel = 1;
|
|
const long c_ag_LineJoinRound = 2;
|
|
const long c_ag_LineJoinMiterClipped = 3;
|
|
|
|
const long c_ag_PenAlignmentCenter = 0;
|
|
const long c_ag_PenAlignmentInset = 1;
|
|
const long c_ag_PenAlignmentOutset = 2;
|
|
const long c_ag_PenAlignmentLeft = 3;
|
|
const long c_ag_PenAlignmentRight = 4;
|
|
// --------------------------------------------------------------
|
|
// brush --------------------------------------------------------
|
|
// old constants for brush type
|
|
const long c_BrushTypeSolid_ = 0;
|
|
const long c_BrushTypeHorizontal_ = 1;
|
|
const long c_BrushTypeVertical_ = 2;
|
|
const long c_BrushTypeDiagonal1_ = 3;
|
|
const long c_BrushTypeDiagonal2_ = 4;
|
|
const long c_BrushTypeCenter_ = 5;
|
|
const long c_BrushTypePathGradient1_ = 6;
|
|
const long c_BrushTypePathGradient2_ = 7;
|
|
const long c_BrushTypeTexture_ = 8;
|
|
const long c_BrushTypeHatch1_ = 9;
|
|
const long c_BrushTypeHatch53_ = 61;
|
|
const long c_BrushTypeGradient1_ = 62;
|
|
const long c_BrushTypeGradient6_ = 70;
|
|
|
|
const long c_BrushTypeSolid = 1000;
|
|
const long c_BrushTypeHorizontal = 2001;
|
|
const long c_BrushTypeVertical = 2002;
|
|
const long c_BrushTypeDiagonal1 = 2003;
|
|
const long c_BrushTypeDiagonal2 = 2004;
|
|
const long c_BrushTypeCenter = 2005;
|
|
const long c_BrushTypePathGradient1 = 2006;
|
|
const long c_BrushTypePathGradient2 = 2007;
|
|
const long c_BrushTypeCylinderHor = 2008;
|
|
const long c_BrushTypeCylinderVer = 2009;
|
|
const long c_BrushTypeTexture = 3008;
|
|
const long c_BrushTypePattern = 3009;
|
|
const long c_BrushTypeHatch1 = 4009;
|
|
const long c_BrushTypeHatch53 = 4061;
|
|
|
|
const long c_BrushTextureModeStretch = 0;
|
|
const long c_BrushTextureModeTile = 1;
|
|
const long c_BrushTextureModeTileCenter = 2;
|
|
// --------------------------------------------------------------
|
|
|
|
//using namespace Gdiplus;
|
|
|
|
namespace NSStructures
|
|
{
|
|
class CPen
|
|
{
|
|
public:
|
|
long Color;
|
|
long Alpha;
|
|
double Size;
|
|
|
|
byte DashStyle;
|
|
byte LineStartCap;
|
|
byte LineEndCap;
|
|
byte LineJoin;
|
|
|
|
double* DashPattern;
|
|
long Count;
|
|
|
|
double DashOffset;
|
|
|
|
LONG Align;
|
|
double MiterLimit;
|
|
|
|
public:
|
|
|
|
CString ToXmlString(CString strRootNodeName = _T("pen"), BOOL bAttributed = FALSE)
|
|
{
|
|
XmlUtils::CXmlWriter oXmlWriter;
|
|
|
|
if (!bAttributed)
|
|
{
|
|
oXmlWriter.WriteNodeBegin(strRootNodeName);
|
|
oXmlWriter.WriteNode(_T("color"), Color);
|
|
oXmlWriter.WriteNode(_T("alpha"), Alpha);
|
|
oXmlWriter.WriteNode(_T("size"), Size);
|
|
oXmlWriter.WriteNode(_T("style"), DashStyle);
|
|
oXmlWriter.WriteNode(_T("line-start-cap"), LineStartCap);
|
|
oXmlWriter.WriteNode(_T("line-end-cap"), LineEndCap);
|
|
oXmlWriter.WriteNode(_T("line-join"), LineJoin);
|
|
oXmlWriter.WriteNode(_T("dash-pattern-count"), Count);
|
|
oXmlWriter.WriteNodeBegin(_T("dash-pattern"));
|
|
if (DashPattern != NULL)
|
|
{
|
|
for (int i = 0; i < Count; ++i)
|
|
{
|
|
oXmlWriter.WriteNode(_T("dash"), DashPattern[i]);
|
|
}
|
|
}
|
|
oXmlWriter.WriteNodeEnd(_T("dash-pattern"));
|
|
oXmlWriter.WriteNode(_T("dash-offset"), DashOffset);
|
|
oXmlWriter.WriteNode(_T("alignment"), Align);
|
|
oXmlWriter.WriteNodeEnd(strRootNodeName);
|
|
}
|
|
else
|
|
{
|
|
oXmlWriter.WriteNodeBegin(strRootNodeName, TRUE);
|
|
|
|
ToXmlAttributes(oXmlWriter);
|
|
|
|
oXmlWriter.WriteNodeEnd(strRootNodeName, TRUE);
|
|
}
|
|
|
|
return oXmlWriter.GetXmlString();
|
|
}
|
|
void FromXmlString(CString& strXml)
|
|
{
|
|
XmlUtils::CXmlReader oXmlReader;
|
|
|
|
oXmlReader.SetXmlString(strXml);
|
|
oXmlReader.ReadRootNode();
|
|
|
|
FromXmlAttributes(oXmlReader);
|
|
}
|
|
|
|
void ToXmlAttributes(XmlUtils::CXmlWriter& oXmlWriter)
|
|
{
|
|
oXmlWriter.WriteAttribute(_T("color"), Color);
|
|
oXmlWriter.WriteAttribute(_T("alpha"), Alpha);
|
|
oXmlWriter.WriteAttribute(_T("size"), Size);
|
|
|
|
oXmlWriter.WriteAttribute(_T("style"), DashStyle);
|
|
oXmlWriter.WriteAttribute(_T("line-start-cap"), LineStartCap);
|
|
oXmlWriter.WriteAttribute(_T("line-end-cap"), LineEndCap);
|
|
oXmlWriter.WriteAttribute(_T("line-join"), LineJoin);
|
|
|
|
oXmlWriter.WriteAttribute(_T("dash-offset"), DashOffset);
|
|
oXmlWriter.WriteAttribute(_T("alignment"), Align);
|
|
}
|
|
void FromXmlAttributes(XmlUtils::CXmlReader& oXmlReader)
|
|
{
|
|
Color = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("color"), _T("0")));
|
|
Alpha = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("alpha"), _T("0")));
|
|
Size = XmlUtils::GetDouble(oXmlReader.ReadNodeAttributeOrValue(_T("size"), _T("0")));
|
|
|
|
DashStyle = (byte)XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("style"), _T("0")));
|
|
LineStartCap = (byte)XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("line-start-cap"), _T("0")));
|
|
LineEndCap = (byte)XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("line-end-cap"), _T("0")));
|
|
LineJoin = (byte)XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("line-join"), _T("0")));
|
|
|
|
RELEASEARRAYOBJECTS(DashPattern);
|
|
Count = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("dash-pattern-count"), _T("0")));
|
|
if (Count != 0)
|
|
{
|
|
XmlUtils::CXmlNode oPatternNode;
|
|
oXmlReader.ReadNodeList(_T("dash-pattern"));
|
|
if (oPatternNode.FromXmlString(oXmlReader.ReadNodeXml(0)))
|
|
{
|
|
XmlUtils::CXmlNodes oDashNodes;
|
|
if (oPatternNode.GetNodes(_T("dash"), oDashNodes))
|
|
{
|
|
Count = oDashNodes.GetCount();
|
|
if (Count != 0)
|
|
{
|
|
DashPattern = new double[Count];
|
|
XmlUtils::CXmlNode oDashNode;
|
|
for (int i = 0; i < Count; ++i)
|
|
{
|
|
oDashNodes.GetAt(i, oDashNode);
|
|
DashPattern[i] = XmlUtils::GetDouble(oDashNode.GetText());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
DashOffset = XmlUtils::GetDouble(oXmlReader.ReadNodeAttributeOrValue(_T("dash-offset"), _T("0")));
|
|
|
|
Align = XmlUtils::GetInteger(oXmlReader.ReadNodeAttribute(_T("alignment"), _T("0")));
|
|
}
|
|
void FromXmlNode(XmlUtils::CXmlNode& oXmlNode)
|
|
{
|
|
Color = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("color"), _T("0")));
|
|
Alpha = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("alpha"), _T("0")));
|
|
Size = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("size"), _T("0")));
|
|
|
|
DashStyle = (byte)XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("style"), _T("0")));
|
|
LineStartCap = (byte)XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("line-start-cap"), _T("0")));
|
|
LineEndCap = (byte)XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("line-end-cap"), _T("0")));
|
|
LineJoin = (byte)XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("line-join"), _T("0")));
|
|
|
|
RELEASEARRAYOBJECTS(DashPattern);
|
|
Count = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("dash-pattern-count"), _T("0")));
|
|
if (Count != 0)
|
|
{
|
|
XmlUtils::CXmlNode oPatternNode;
|
|
if (oXmlNode.GetNode(_T("dash-pattern"), oPatternNode))
|
|
{
|
|
XmlUtils::CXmlNodes oDashNodes;
|
|
if (oPatternNode.GetNodes(_T("dash"), oDashNodes))
|
|
{
|
|
Count = oDashNodes.GetCount();
|
|
if (Count != 0)
|
|
{
|
|
DashPattern = new double[Count];
|
|
XmlUtils::CXmlNode oDashNode;
|
|
for (int i = 0; i < Count; ++i)
|
|
{
|
|
oDashNodes.GetAt(i, oDashNode);
|
|
DashPattern[i] = XmlUtils::GetDouble(oDashNode.GetText());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
DashOffset = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("dash-offset"), _T("0")));
|
|
|
|
Align = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("alignment"), _T("0")));
|
|
}
|
|
|
|
void FromXmlNode2(XmlUtils::CXmlNode& oXmlNode)
|
|
{
|
|
Color = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("pen-color"), _T("0")));
|
|
Alpha = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("pen-alpha"), _T("0")));
|
|
Size = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("pen-size"), _T("0")));
|
|
DashOffset = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("dash-offset"), _T("0")));
|
|
|
|
DashStyle = (byte)XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("pen-style"), _T("0")));
|
|
LineStartCap = (byte)XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("pen-line-start-cap"), _T("0")));
|
|
LineEndCap = (byte)XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("pen-line-end-cap"), _T("0")));
|
|
LineJoin = (byte)XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("pen-line-join"), _T("0")));
|
|
|
|
RELEASEARRAYOBJECTS(DashPattern);
|
|
Count = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("pen-dash-pattern-count"), _T("0")));
|
|
if (Count != 0)
|
|
{
|
|
XmlUtils::CXmlNode oPatternNode;
|
|
if (oXmlNode.GetNode(_T("dash-pattern"), oPatternNode))
|
|
{
|
|
XmlUtils::CXmlNodes oDashNodes;
|
|
if (oPatternNode.GetNodes(_T("dash"), oDashNodes))
|
|
{
|
|
Count = oDashNodes.GetCount();
|
|
if (Count != 0)
|
|
{
|
|
DashPattern = new double[Count];
|
|
XmlUtils::CXmlNode oDashNode;
|
|
for (int i = 0; i < Count; ++i)
|
|
{
|
|
oDashNodes.GetAt(i, oDashNode);
|
|
DashPattern[i] = XmlUtils::GetDouble(oDashNode.GetText());
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
DashOffset = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("pen-dash-offset"), _T("0")));
|
|
|
|
Align = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("pen-alignment"), _T("0")));
|
|
}
|
|
|
|
void GetDashPattern(double* arrDashPattern, long& nCount) const
|
|
{
|
|
if (nCount == Count)
|
|
{
|
|
for (int i = 0; i < Count; ++i)
|
|
{
|
|
arrDashPattern[i] = DashPattern[i];
|
|
}
|
|
}
|
|
}
|
|
void SetDashPattern(double* arrDashPattern, long nCount)
|
|
{
|
|
if ((arrDashPattern == NULL) || (nCount == 0))
|
|
{
|
|
Count = 0;
|
|
RELEASEARRAYOBJECTS(DashPattern);
|
|
}
|
|
else
|
|
{
|
|
if (Count != nCount)
|
|
{
|
|
Count = nCount;
|
|
RELEASEARRAYOBJECTS(DashPattern);
|
|
DashPattern = new double[Count];
|
|
}
|
|
|
|
for (int i = 0; i < Count; ++i)
|
|
{
|
|
DashPattern[i] = arrDashPattern[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
void ScaleAlpha( double dScale )
|
|
{
|
|
long dNewAlpha = long(Alpha * dScale + 0.5);
|
|
|
|
if( dNewAlpha > 255 ) dNewAlpha = 255;
|
|
else if( dNewAlpha < 0 ) dNewAlpha = 0;
|
|
|
|
Alpha = dNewAlpha;
|
|
}
|
|
|
|
BOOL IsEqual(CPen* pPen)
|
|
{
|
|
if (NULL == pPen)
|
|
return FALSE;
|
|
|
|
return ((Color == pPen->Color) && (Alpha == pPen->Alpha) && (Size == pPen->Size) &&
|
|
(DashStyle == pPen->DashStyle) && (LineStartCap == pPen->LineStartCap) &&
|
|
(LineEndCap == pPen->LineEndCap) && (LineJoin == pPen->LineJoin));
|
|
}
|
|
void SetToRenderer(IASCRenderer *pRenderer)
|
|
{
|
|
pRenderer->put_PenColor(Color);
|
|
pRenderer->put_PenAlpha(Alpha);
|
|
pRenderer->put_PenSize(Size);
|
|
pRenderer->put_PenDashStyle(DashStyle);
|
|
pRenderer->put_PenLineStartCap(LineStartCap);
|
|
pRenderer->put_PenLineEndCap(LineEndCap);
|
|
pRenderer->put_PenLineJoin(LineJoin);
|
|
pRenderer->put_PenAlign(Align);
|
|
|
|
if (DashStyle != Aggplus::DashStyleSolid)
|
|
{
|
|
SAFEARRAYBOUND rgsab;
|
|
rgsab.lLbound = 0;
|
|
rgsab.cElements = Count;
|
|
|
|
SAFEARRAY* pArray = SafeArrayCreate(VT_R8, 1, &rgsab);
|
|
memcpy(pArray->pvData, DashPattern, Count * sizeof(double));
|
|
|
|
pRenderer->PenDashPattern(pArray);
|
|
|
|
RELEASEARRAY(pArray);
|
|
pRenderer->put_PenDashOffset(DashOffset);
|
|
}
|
|
}
|
|
void SetDefaultParams()
|
|
{
|
|
Color = 0;
|
|
Alpha = 255;
|
|
Size = 1;
|
|
|
|
DashStyle = 0;
|
|
LineStartCap = 0;
|
|
LineEndCap = 0;
|
|
LineJoin = 0;
|
|
|
|
DashPattern = NULL;
|
|
Count = 0;
|
|
|
|
DashOffset = 0;
|
|
Align = Gdiplus::PenAlignmentCenter;
|
|
MiterLimit = 0.5;
|
|
}
|
|
|
|
|
|
public:
|
|
|
|
CPen()
|
|
{
|
|
SetDefaultParams();
|
|
}
|
|
CPen( const CPen& other )
|
|
{
|
|
SetDefaultParams();
|
|
*this = other;
|
|
}
|
|
CPen& operator=(const CPen& other)
|
|
{
|
|
Color = other.Color;
|
|
Alpha = other.Alpha;
|
|
Size = other.Size;
|
|
|
|
DashStyle = other.DashStyle;
|
|
LineStartCap = other.LineStartCap;
|
|
LineEndCap = other.LineEndCap;
|
|
LineJoin = other.LineJoin;
|
|
|
|
RELEASEARRAYOBJECTS(DashPattern);
|
|
Count = other.Count;
|
|
if (Count != 0)
|
|
{
|
|
DashPattern = new double[Count];
|
|
for (int i = 0; i < Count; ++i)
|
|
{
|
|
DashPattern[i] = other.DashPattern[i];
|
|
}
|
|
}
|
|
|
|
DashOffset = other.DashOffset;
|
|
|
|
Align = other.Align;
|
|
MiterLimit = other.MiterLimit;
|
|
|
|
return *this;
|
|
}
|
|
virtual ~CPen()
|
|
{
|
|
RELEASEARRAYOBJECTS(DashPattern);
|
|
}
|
|
};
|
|
|
|
class CBrush
|
|
{
|
|
public:
|
|
struct TSubColor
|
|
{
|
|
long color;
|
|
long position; // [0..65536]
|
|
};
|
|
|
|
public:
|
|
long Type;
|
|
|
|
long Color1;
|
|
long Color2;
|
|
long Alpha1;
|
|
long Alpha2;
|
|
|
|
CString TexturePath;
|
|
long TextureAlpha;
|
|
long TextureMode;
|
|
|
|
BOOL Rectable;
|
|
Gdiplus::RectF Rect;
|
|
|
|
double LinearAngle;
|
|
|
|
ATL::CSimpleArray<TSubColor> m_arrSubColors;
|
|
|
|
public:
|
|
void LoadSubColors( const CString& str )
|
|
{
|
|
m_arrSubColors.RemoveAll();
|
|
|
|
if( str.IsEmpty() )
|
|
return;
|
|
|
|
TSubColor subcolor;
|
|
int start = 0;
|
|
|
|
for(;;)
|
|
{
|
|
int pos = str.Find( _T(','), start );
|
|
if( pos < 0 )
|
|
break;
|
|
|
|
subcolor.color = ::_ttoi( str.Mid( start, pos - start ) );
|
|
start = pos + 1;
|
|
|
|
pos = str.Find( _T(';'), start );
|
|
if( pos < 0 )
|
|
break;
|
|
|
|
subcolor.position = ::_ttoi( str.Mid( start, pos - start ) );
|
|
start = pos + 1;
|
|
|
|
m_arrSubColors.Add( subcolor );
|
|
}
|
|
}
|
|
|
|
CString ToXmlString(CString strRootNodeName = _T("brush"), BOOL bAttributed = FALSE)
|
|
{
|
|
XmlUtils::CXmlWriter oXmlWriter;
|
|
|
|
if (!bAttributed)
|
|
{
|
|
oXmlWriter.WriteNodeBegin(strRootNodeName);
|
|
|
|
oXmlWriter.WriteNode(_T("type"), Type);
|
|
oXmlWriter.WriteNode(_T("color1"), Color1);
|
|
oXmlWriter.WriteNode(_T("color2"), Color2);
|
|
oXmlWriter.WriteNode(_T("alpha1"), Alpha1);
|
|
oXmlWriter.WriteNode(_T("alpha2"), Alpha2);
|
|
oXmlWriter.WriteNode(_T("texturepath"), TexturePath);
|
|
oXmlWriter.WriteNode(_T("texturealpha"), TextureAlpha);
|
|
oXmlWriter.WriteNode(_T("texturemode"), TextureMode);
|
|
oXmlWriter.WriteNode(_T("rectable"), Rectable);
|
|
oXmlWriter.WriteNode(_T("linearangle"), LinearAngle);
|
|
|
|
oXmlWriter.WriteNodeBegin(_T("rectangle"), TRUE);
|
|
oXmlWriter.WriteAttribute(_T("left"), Rect.X);
|
|
oXmlWriter.WriteAttribute(_T("top"), Rect.Y);
|
|
oXmlWriter.WriteAttribute(_T("width"), Rect.Width);
|
|
oXmlWriter.WriteAttribute(_T("height"), Rect.Height);
|
|
oXmlWriter.WriteNodeEnd(_T("rectangle"), TRUE);
|
|
|
|
oXmlWriter.WriteNodeEnd(strRootNodeName);
|
|
}
|
|
else
|
|
{
|
|
oXmlWriter.WriteNodeBegin(strRootNodeName, TRUE);
|
|
|
|
ToXmlAttributes(oXmlWriter);
|
|
|
|
oXmlWriter.WriteNodeEnd(strRootNodeName, TRUE);
|
|
}
|
|
|
|
return oXmlWriter.GetXmlString();
|
|
}
|
|
void FromXmlString(CString& strXml)
|
|
{
|
|
XmlUtils::CXmlReader oXmlReader;
|
|
|
|
oXmlReader.SetXmlString(strXml);
|
|
oXmlReader.ReadRootNode();
|
|
|
|
FromXmlAttributes(oXmlReader);
|
|
}
|
|
|
|
void ToXmlAttributes(XmlUtils::CXmlWriter& oXmlWriter)
|
|
{
|
|
oXmlWriter.WriteAttribute(_T("type"), Type);
|
|
oXmlWriter.WriteAttribute(_T("color1"), Color1);
|
|
oXmlWriter.WriteAttribute(_T("color2"), Color2);
|
|
oXmlWriter.WriteAttribute(_T("alpha1"), Alpha1);
|
|
oXmlWriter.WriteAttribute(_T("alpha2"), Alpha2);
|
|
oXmlWriter.WriteAttribute(_T("texturepath"), TexturePath);
|
|
oXmlWriter.WriteAttribute(_T("texturealpha"), TextureAlpha);
|
|
oXmlWriter.WriteAttribute(_T("texturemode"), TextureMode);
|
|
oXmlWriter.WriteAttribute(_T("rectable"), Rectable);
|
|
oXmlWriter.WriteAttribute(_T("linearangle"), LinearAngle);
|
|
|
|
oXmlWriter.WriteAttribute(_T("rect-left"), Rect.X);
|
|
oXmlWriter.WriteAttribute(_T("rect-top"), Rect.Y);
|
|
oXmlWriter.WriteAttribute(_T("rect-width"), Rect.Width);
|
|
oXmlWriter.WriteAttribute(_T("rect-height"), Rect.Height);
|
|
}
|
|
void FromXmlAttributes(XmlUtils::CXmlReader& oXmlReader)
|
|
{
|
|
Type = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("type"), _T("0")));
|
|
Type = ConstantCompatible(Type);
|
|
|
|
Color1 = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("color1"), _T("0")));
|
|
Color2 = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("color2"), _T("0")));
|
|
Alpha1 = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("alpha1"), _T("0")));
|
|
Alpha2 = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("alpha2"), _T("0")));
|
|
|
|
TexturePath = oXmlReader.ReadNodeAttributeOrValue(_T("texturepath"), _T(""));
|
|
TextureAlpha = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("texturealpha"), _T("0")));
|
|
TextureMode = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("texturemode"), _T("0")));
|
|
|
|
Rectable = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("rectable"), _T("0")));
|
|
LinearAngle = XmlUtils::GetDouble(oXmlReader.ReadNodeAttributeOrValue(_T("linearangle"), _T("0")));
|
|
|
|
Rect.X = (Gdiplus::REAL)XmlUtils::GetDouble(oXmlReader.ReadNodeAttributeOrValue(_T("rect-left")));
|
|
Rect.Y = (Gdiplus::REAL)XmlUtils::GetDouble(oXmlReader.ReadNodeAttributeOrValue(_T("rect-top")));
|
|
Rect.Width = (Gdiplus::REAL)XmlUtils::GetDouble(oXmlReader.ReadNodeAttributeOrValue(_T("rect-width")));
|
|
Rect.Height = (Gdiplus::REAL)XmlUtils::GetDouble(oXmlReader.ReadNodeAttributeOrValue(_T("rect-height")));
|
|
|
|
LoadSubColors( oXmlReader.ReadNodeAttribute( _T("subcolors") ) );
|
|
|
|
if (oXmlReader.ReadNode(_T("rectangle")))
|
|
{
|
|
Rect.X = (Gdiplus::REAL)XmlUtils::GetDouble(oXmlReader.ReadNodeAttribute(_T("left")));
|
|
Rect.Y = (Gdiplus::REAL)XmlUtils::GetDouble(oXmlReader.ReadNodeAttribute(_T("top")));
|
|
Rect.Width = (Gdiplus::REAL)XmlUtils::GetDouble(oXmlReader.ReadNodeAttribute(_T("width")));
|
|
Rect.Height = (Gdiplus::REAL)XmlUtils::GetDouble(oXmlReader.ReadNodeAttribute(_T("height")));
|
|
}
|
|
}
|
|
void FromXmlNode(XmlUtils::CXmlNode& oXmlNode)
|
|
{
|
|
Type = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("type"), _T("0")));
|
|
Type = ConstantCompatible(Type);
|
|
|
|
Color1 = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("color1"), _T("0")));
|
|
Color2 = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("color2"), _T("0")));
|
|
Alpha1 = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("alpha1"), _T("0")));
|
|
Alpha2 = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("alpha2"), _T("0")));
|
|
|
|
TexturePath = oXmlNode.GetAttributeOrValue(_T("texturepath"), _T(""));
|
|
TextureAlpha = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("texturealpha"), _T("0")));
|
|
TextureMode = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("texturemode"), _T("0")));
|
|
|
|
Rectable = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("rectable"), _T("0")));
|
|
LinearAngle = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("linearangle"), _T("0")));
|
|
|
|
Rect.X = (Gdiplus::REAL)XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("rect-left")));
|
|
Rect.Y = (Gdiplus::REAL)XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("rect-top")));
|
|
Rect.Width = (Gdiplus::REAL)XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("rect-width")));
|
|
Rect.Height = (Gdiplus::REAL)XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("rect-height")));
|
|
|
|
XmlUtils::CXmlNode oNodeRect;
|
|
if (oXmlNode.GetNode(_T("rectangle"), oNodeRect))
|
|
{
|
|
Rect.X = (Gdiplus::REAL)XmlUtils::GetDouble(oNodeRect.GetAttributeOrValue(_T("left")));
|
|
Rect.Y = (Gdiplus::REAL)XmlUtils::GetDouble(oNodeRect.GetAttributeOrValue(_T("top")));
|
|
Rect.Width = (Gdiplus::REAL)XmlUtils::GetDouble(oNodeRect.GetAttributeOrValue(_T("width")));
|
|
Rect.Height = (Gdiplus::REAL)XmlUtils::GetDouble(oNodeRect.GetAttributeOrValue(_T("height")));
|
|
}
|
|
}
|
|
|
|
void FromXmlNode2(XmlUtils::CXmlNode& oXmlNode)
|
|
{
|
|
Type = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("brush-type"), _T("0")));
|
|
Type = ConstantCompatible(Type);
|
|
|
|
Color1 = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("brush-color1"), _T("0")));
|
|
Color2 = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("brush-color2"), _T("0")));
|
|
Alpha1 = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("brush-alpha1"), _T("0")));
|
|
Alpha2 = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("brush-alpha2"), _T("0")));
|
|
|
|
TexturePath = oXmlNode.GetAttributeOrValue(_T("brush-texturepath"), _T(""));
|
|
TextureAlpha = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("brush-texturealpha"), _T("0")));
|
|
TextureMode = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("brush-texturemode"), _T("0")));
|
|
|
|
Rectable = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("brush-rectable"), _T("0")));
|
|
LinearAngle = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("brush-linearangle"), _T("0")));
|
|
|
|
Rect.X = (Gdiplus::REAL)XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("brush-rect-left")));
|
|
Rect.Y = (Gdiplus::REAL)XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("brush-rect-top")));
|
|
Rect.Width = (Gdiplus::REAL)XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("brush-rect-width")));
|
|
Rect.Height = (Gdiplus::REAL)XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("brush-rect-height")));
|
|
|
|
XmlUtils::CXmlNode oNodeRect;
|
|
if (oXmlNode.GetNode(_T("brush-rectangle"), oNodeRect))
|
|
{
|
|
Rect.X = (Gdiplus::REAL)XmlUtils::GetDouble(oNodeRect.GetAttributeOrValue(_T("left")));
|
|
Rect.Y = (Gdiplus::REAL)XmlUtils::GetDouble(oNodeRect.GetAttributeOrValue(_T("top")));
|
|
Rect.Width = (Gdiplus::REAL)XmlUtils::GetDouble(oNodeRect.GetAttributeOrValue(_T("width")));
|
|
Rect.Height = (Gdiplus::REAL)XmlUtils::GetDouble(oNodeRect.GetAttributeOrValue(_T("height")));
|
|
}
|
|
}
|
|
|
|
|
|
inline LONG ConstantCompatible(LONG nConstant)
|
|
{
|
|
if( c_BrushTypeDiagonal1_ == nConstant )
|
|
nConstant = c_BrushTypeDiagonal2_;
|
|
else if( c_BrushTypeDiagonal2_ == nConstant )
|
|
nConstant = c_BrushTypeDiagonal1_;
|
|
|
|
if (1000 <= nConstant)
|
|
return nConstant;
|
|
if (c_BrushTypeSolid_ == nConstant)
|
|
return nConstant + 1000;
|
|
if (c_BrushTypeHorizontal_ <= nConstant && c_BrushTypePathGradient2_ >= nConstant)
|
|
return nConstant + 2000;
|
|
if (c_BrushTypeTexture_ == nConstant)
|
|
return nConstant + 3000;
|
|
if (c_BrushTypeHatch1_ <= nConstant && c_BrushTypeHatch53_ >= nConstant)
|
|
return nConstant + 4000;
|
|
if (c_BrushTypeGradient1_ <= nConstant && c_BrushTypeGradient6_ >= nConstant)
|
|
return nConstant + 2000 - 61;
|
|
|
|
return 1000;
|
|
}
|
|
|
|
void ScaleAlpha1( double dScale )
|
|
{
|
|
long dNewAlpha = long(Alpha1 * dScale + 0.5);
|
|
|
|
if( dNewAlpha > 255 ) dNewAlpha = 255;
|
|
else if( dNewAlpha < 0 ) dNewAlpha = 0;
|
|
|
|
Alpha1 = dNewAlpha;
|
|
}
|
|
void ScaleAlpha2( double dScale )
|
|
{
|
|
long dNewAlpha = long(Alpha2 * dScale + 0.5);
|
|
|
|
if( dNewAlpha > 255 ) dNewAlpha = 255;
|
|
else if( dNewAlpha < 0 ) dNewAlpha = 0;
|
|
|
|
Alpha2 = dNewAlpha;
|
|
}
|
|
|
|
void ScaleTextureAlpha( double dScale )
|
|
{
|
|
long dNewAlpha = long(TextureAlpha * dScale + 0.5);
|
|
|
|
if( dNewAlpha > 255 ) dNewAlpha = 255;
|
|
else if( dNewAlpha < 0 ) dNewAlpha = 0;
|
|
|
|
TextureAlpha = dNewAlpha;
|
|
}
|
|
|
|
|
|
BOOL IsEqual(CBrush* pBrush)
|
|
{
|
|
if (NULL == pBrush)
|
|
return FALSE;
|
|
|
|
/*return ((Type == pBrush->Type) &&
|
|
(Color1 == pBrush->Color1) && (Color2 == pBrush->Color2) &&
|
|
(Alpha1 == pBrush->Alpha1) && (Alpha2 == pBrush->Alpha2));*/
|
|
|
|
return ((Type == pBrush->Type) &&
|
|
(Color1 == pBrush->Color1) && (Color2 == pBrush->Color2) &&
|
|
(Alpha1 == pBrush->Alpha1) && (Alpha2 == pBrush->Alpha2) && (LinearAngle == pBrush->LinearAngle) &&
|
|
(TexturePath == pBrush->TexturePath) && (TextureAlpha == pBrush->TextureAlpha) && (TextureMode == pBrush->TextureMode) &&
|
|
(Rectable == pBrush->Rectable) && (Rect.Equals(pBrush->Rect)));
|
|
}
|
|
|
|
void SetDefaultParams()
|
|
{
|
|
Type = c_BrushTypeSolid;
|
|
|
|
Color1 = 0;
|
|
Alpha1 = 255;
|
|
Color2 = 0;
|
|
Alpha2 = 255;
|
|
|
|
TextureAlpha = 255;
|
|
TextureMode = c_BrushTextureModeStretch;
|
|
|
|
LinearAngle = 0;
|
|
|
|
TexturePath = _T("");
|
|
|
|
Rectable = FALSE;
|
|
|
|
Rect.X = 0.0F;
|
|
Rect.Y = 0.0F;
|
|
Rect.Width = 0.0F;
|
|
Rect.Height = 0.0F;
|
|
|
|
m_arrSubColors.RemoveAll();
|
|
}
|
|
|
|
public:
|
|
|
|
CBrush()
|
|
{
|
|
SetDefaultParams();
|
|
}
|
|
CBrush( const CBrush& other )
|
|
{
|
|
Type = other.Type;
|
|
|
|
Color1 = other.Color1;
|
|
Alpha1 = other.Alpha1;
|
|
Color2 = other.Color2;
|
|
Alpha2 = other.Alpha2;
|
|
|
|
TexturePath = other.TexturePath;
|
|
TextureAlpha = other.TextureAlpha;
|
|
TextureMode = other.TextureMode;
|
|
|
|
Rectable = other.Rectable;
|
|
Rect = other.Rect;
|
|
|
|
LinearAngle = other.LinearAngle;
|
|
m_arrSubColors = other.m_arrSubColors;
|
|
}
|
|
CBrush& operator=(const CBrush& other)
|
|
{
|
|
Type = other.Type;
|
|
|
|
Color1 = other.Color1;
|
|
Alpha1 = other.Alpha1;
|
|
Color2 = other.Color2;
|
|
Alpha2 = other.Alpha2;
|
|
|
|
TexturePath = other.TexturePath;
|
|
TextureAlpha = other.TextureAlpha;
|
|
TextureMode = other.TextureMode;
|
|
|
|
Rectable = other.Rectable;
|
|
Rect = other.Rect;
|
|
|
|
LinearAngle = other.LinearAngle;
|
|
m_arrSubColors = other.m_arrSubColors;
|
|
|
|
return *this;
|
|
}
|
|
virtual ~CBrush()
|
|
{
|
|
}
|
|
|
|
BOOL IsTexture()
|
|
{
|
|
return (c_BrushTypeTexture == Type || c_BrushTypePattern == Type);
|
|
}
|
|
BOOL IsOneColor()
|
|
{
|
|
return (c_BrushTypeSolid == Type);
|
|
}
|
|
BOOL IsTwoColor()
|
|
{
|
|
return ((c_BrushTypeHorizontal <= Type && c_BrushTypeCylinderVer >= Type) ||
|
|
(c_BrushTypeHatch1 <= Type && c_BrushTypeHatch53 >= Type));
|
|
}
|
|
|
|
void SetToRenderer(IASCRenderer *pRenderer)
|
|
{
|
|
Type = ConstantCompatible(Type);
|
|
pRenderer->put_BrushType(Type);
|
|
if (IsOneColor())
|
|
{
|
|
pRenderer->put_BrushColor1(Color1);
|
|
pRenderer->put_BrushAlpha1(Alpha1);
|
|
}
|
|
else if (IsTexture())
|
|
{
|
|
BSTR bstrTexturePath = TexturePath.AllocSysString();
|
|
pRenderer->put_BrushTexturePath(bstrTexturePath);
|
|
SysFreeString(bstrTexturePath);
|
|
pRenderer->put_BrushTextureMode(TextureMode);
|
|
pRenderer->put_BrushTextureAlpha(TextureAlpha);
|
|
pRenderer->BrushRect(Rectable, Rect.X, Rect.Y, Rect.Width, Rect.Height);
|
|
}
|
|
else if (IsTwoColor())
|
|
{
|
|
pRenderer->put_BrushColor1(Color1);
|
|
pRenderer->put_BrushAlpha1(Alpha1);
|
|
pRenderer->put_BrushColor2(Color2);
|
|
pRenderer->put_BrushAlpha2(Alpha2);
|
|
}
|
|
}
|
|
|
|
void SetToRenderer(IASCRenderer *pRenderer, const float &fTransparency)
|
|
{
|
|
Type = ConstantCompatible(Type);
|
|
pRenderer->put_BrushType(Type);
|
|
if (IsOneColor())
|
|
{
|
|
pRenderer->put_BrushColor1(Color1);
|
|
pRenderer->put_BrushAlpha1((LONG)(Alpha1 * fTransparency));
|
|
}
|
|
else if (IsTexture())
|
|
{
|
|
BSTR bstrTexturePath = TexturePath.AllocSysString();
|
|
pRenderer->put_BrushTexturePath(bstrTexturePath);
|
|
SysFreeString(bstrTexturePath);
|
|
pRenderer->put_BrushTextureMode(TextureMode);
|
|
pRenderer->put_BrushTextureAlpha((LONG)(TextureAlpha * fTransparency));
|
|
pRenderer->BrushRect(Rectable, Rect.X, Rect.Y, Rect.Width, Rect.Height);
|
|
}
|
|
else if (IsTwoColor())
|
|
{
|
|
pRenderer->put_BrushColor1(Color1);
|
|
pRenderer->put_BrushAlpha1((LONG)(Alpha1 * fTransparency));
|
|
pRenderer->put_BrushColor2(Color2);
|
|
pRenderer->put_BrushAlpha2((LONG)(Alpha2 * fTransparency));
|
|
}
|
|
}
|
|
};
|
|
class CFont
|
|
{
|
|
public:
|
|
|
|
CString Path;
|
|
CString Name;
|
|
double Size;
|
|
BOOL Bold;
|
|
BOOL Italic;
|
|
byte Underline;
|
|
byte Strikeout;
|
|
|
|
BOOL StringGID;
|
|
double CharSpace;
|
|
|
|
public:
|
|
|
|
CString ToXmlString(CString strRootNodeName = _T("font"), BOOL bAttributed = FALSE)
|
|
{
|
|
XmlUtils::CXmlWriter oXmlWriter;
|
|
|
|
if (!bAttributed)
|
|
{
|
|
oXmlWriter.WriteNodeBegin(strRootNodeName);
|
|
oXmlWriter.WriteNode(_T("name"), Name);
|
|
oXmlWriter.WriteNode(_T("size"), Size);
|
|
oXmlWriter.WriteNode(_T("bold"), Bold);
|
|
oXmlWriter.WriteNode(_T("italic"), Italic);
|
|
oXmlWriter.WriteNode(_T("underline"), Underline);
|
|
oXmlWriter.WriteNode(_T("strikeout"), Strikeout);
|
|
oXmlWriter.WriteNode(_T("path"), Path);
|
|
oXmlWriter.WriteNode(_T("gid"), StringGID);
|
|
oXmlWriter.WriteNodeEnd(strRootNodeName);
|
|
}
|
|
else
|
|
{
|
|
oXmlWriter.WriteNodeBegin(strRootNodeName, TRUE);
|
|
|
|
ToXmlAttributes(oXmlWriter);
|
|
|
|
oXmlWriter.WriteNodeEnd(strRootNodeName, TRUE);
|
|
}
|
|
|
|
return oXmlWriter.GetXmlString();
|
|
}
|
|
void FromXmlString(CString& strXml)
|
|
{
|
|
XmlUtils::CXmlReader oXmlReader;
|
|
|
|
oXmlReader.SetXmlString(strXml);
|
|
oXmlReader.ReadRootNode();
|
|
|
|
FromXmlAttributes(oXmlReader);
|
|
}
|
|
|
|
void ToXmlAttributes(XmlUtils::CXmlWriter& oXmlWriter)
|
|
{
|
|
oXmlWriter.WriteAttribute(_T("name"), Name);
|
|
oXmlWriter.WriteAttribute(_T("size"), Size);
|
|
oXmlWriter.WriteAttribute(_T("bold"), Bold);
|
|
oXmlWriter.WriteAttribute(_T("italic"), Italic);
|
|
oXmlWriter.WriteAttribute(_T("underline"), Underline);
|
|
oXmlWriter.WriteAttribute(_T("strikeout"), Strikeout);
|
|
oXmlWriter.WriteAttribute(_T("path"), Path);
|
|
oXmlWriter.WriteAttribute(_T("gid"), StringGID);
|
|
}
|
|
void FromXmlAttributes(XmlUtils::CXmlReader& oXmlReader)
|
|
{
|
|
Name = oXmlReader.ReadNodeAttributeOrValue(_T("name"), _T("Arial"));
|
|
Size = XmlUtils::GetDouble(oXmlReader.ReadNodeAttributeOrValue(_T("size"), _T("0")));
|
|
Bold = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("bold"), _T("0")));
|
|
Italic = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("italic"), _T("0")));
|
|
Underline = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("underline"), _T("0")));
|
|
Strikeout = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("strikeout"), _T("0")));
|
|
Path = oXmlReader.ReadNodeAttributeOrValue(_T("path"), _T(""));
|
|
StringGID = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("gid"), _T("0")));
|
|
}
|
|
void FromXmlNode(XmlUtils::CXmlNode& oXmlNode)
|
|
{
|
|
Name = oXmlNode.GetAttributeOrValue(_T("name"), _T("Arial"));
|
|
Size = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("size"), _T("0")));
|
|
Bold = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("bold"), _T("0")));
|
|
Italic = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("italic"), _T("0")));
|
|
Underline = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("underline"), _T("0")));
|
|
Strikeout = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("strikeout"), _T("0")));
|
|
Path = oXmlNode.GetAttributeOrValue(_T("path"), _T(""));
|
|
StringGID = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("gid"), _T("0")));
|
|
}
|
|
|
|
void FromXmlNode2(XmlUtils::CXmlNode& oXmlNode)
|
|
{
|
|
Name = oXmlNode.GetAttributeOrValue(_T("font-name"), _T("Arial"));
|
|
Size = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("font-size"), _T("0")));
|
|
Bold = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("font-bold"), _T("0")));
|
|
Italic = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("font-italic"), _T("0")));
|
|
Underline = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("font-underline"), _T("0")));
|
|
Strikeout = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("font-strikeout"), _T("0")));
|
|
Path = oXmlNode.GetAttributeOrValue(_T("font-path"), _T(""));
|
|
StringGID = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("font-gid"), _T("0")));
|
|
}
|
|
|
|
BOOL IsEqual(CFont* pFont)
|
|
{
|
|
if (NULL == pFont)
|
|
return FALSE;
|
|
|
|
return ((Name == pFont->Name) && (Path == pFont->Path) && (StringGID == pFont->StringGID) && (Size == pFont->Size) &&
|
|
(Bold == pFont->Bold) && (Italic == pFont->Italic) &&
|
|
(Underline == pFont->Underline) && (Strikeout == pFont->Strikeout));
|
|
}
|
|
|
|
LONG GetStyle() const
|
|
{
|
|
LONG lStyle = 0;
|
|
if (Bold)
|
|
lStyle |= 0x01;
|
|
if (Italic)
|
|
lStyle |= 0x02;
|
|
lStyle |= Underline << 2;
|
|
lStyle |= Strikeout << 7;
|
|
return lStyle;
|
|
}
|
|
void SetStyle(LONG const& lStyle)
|
|
{
|
|
Bold = (0x01 == (0x01 & lStyle));
|
|
Italic = (0x02 == (0x02 & lStyle));
|
|
Underline = (byte)(0x7C & lStyle) >> 2;
|
|
Strikeout = (byte)(0x0180 & lStyle) >> 7;
|
|
}
|
|
void SetToRenderer(IASCRenderer *pRenderer)
|
|
{
|
|
BSTR bstrName = Name.AllocSysString();
|
|
pRenderer->put_FontName(bstrName);
|
|
SysFreeString(bstrName);
|
|
|
|
BSTR bstrPath = Path.AllocSysString();
|
|
pRenderer->put_FontPath(bstrPath);
|
|
SysFreeString(bstrPath);
|
|
|
|
pRenderer->put_FontSize(Size);
|
|
pRenderer->put_FontStyle(GetStyle());
|
|
pRenderer->put_FontStringGID(StringGID);
|
|
pRenderer->put_FontCharSpace(CharSpace);
|
|
}
|
|
void SetDefaultParams()
|
|
{
|
|
Name = _T("Arial");
|
|
Path = _T("");
|
|
|
|
Size = 0;
|
|
Bold = FALSE;
|
|
Italic = FALSE;
|
|
Underline = 0;
|
|
Strikeout = 0;
|
|
|
|
StringGID = FALSE;
|
|
CharSpace = 0.0;
|
|
}
|
|
|
|
|
|
public:
|
|
|
|
CFont()
|
|
{
|
|
SetDefaultParams();
|
|
}
|
|
CFont( const CFont& other )
|
|
{
|
|
*this = other;
|
|
}
|
|
CFont& operator=(const CFont& other)
|
|
{
|
|
Name = other.Name;
|
|
Path = other.Path;
|
|
Size = other.Size;
|
|
Bold = other.Bold;
|
|
Italic = other.Italic;
|
|
Underline = other.Underline;
|
|
Strikeout = other.Strikeout;
|
|
|
|
StringGID = other.StringGID;
|
|
CharSpace = other.CharSpace;
|
|
|
|
return *this;
|
|
}
|
|
virtual ~CFont()
|
|
{
|
|
}
|
|
};
|
|
class CFormat
|
|
{
|
|
public:
|
|
|
|
BOOL AntiAliasPen;
|
|
BOOL AntiAliasBrush;
|
|
BOOL AntiAliasText;
|
|
|
|
long StringAlignmentVertical;
|
|
long StringAlignmentHorizontal;
|
|
|
|
BOOL WordWrapBySymbol;
|
|
|
|
long ImageAlphMode;
|
|
|
|
public:
|
|
|
|
CString ToXmlString(CString strRootNodeName = _T("format"), BOOL bAttributed = FALSE)
|
|
{
|
|
XmlUtils::CXmlWriter oXmlWriter;
|
|
|
|
if (!bAttributed)
|
|
{
|
|
oXmlWriter.WriteNodeBegin(strRootNodeName);
|
|
oXmlWriter.WriteNode(_T("antialiaspen"), AntiAliasPen);
|
|
oXmlWriter.WriteNode(_T("antialiasbrush"), AntiAliasBrush);
|
|
oXmlWriter.WriteNode(_T("antialiastext"), AntiAliasText);
|
|
oXmlWriter.WriteNode(_T("stringalignmentvertical"), StringAlignmentVertical);
|
|
oXmlWriter.WriteNode(_T("stringalignmenthorizontal"), StringAlignmentHorizontal);
|
|
oXmlWriter.WriteNode(_T("wordwrapbysymbol"), WordWrapBySymbol);
|
|
oXmlWriter.WriteNode(_T("imagealphmode"), ImageAlphMode);
|
|
oXmlWriter.WriteNodeEnd(strRootNodeName);
|
|
}
|
|
else
|
|
{
|
|
oXmlWriter.WriteNodeBegin(strRootNodeName, TRUE);
|
|
|
|
ToXmlAttributes(oXmlWriter);
|
|
|
|
oXmlWriter.WriteNodeEnd(strRootNodeName, TRUE);
|
|
}
|
|
|
|
return oXmlWriter.GetXmlString();
|
|
}
|
|
void FromXmlString(CString strXml)
|
|
{
|
|
XmlUtils::CXmlReader oXmlReader;
|
|
|
|
oXmlReader.SetXmlString(strXml);
|
|
oXmlReader.ReadRootNode();
|
|
|
|
FromXmlAttributes(oXmlReader);
|
|
}
|
|
|
|
void ToXmlAttributes(XmlUtils::CXmlWriter& oXmlWriter)
|
|
{
|
|
oXmlWriter.WriteAttribute(_T("antialiaspen"), AntiAliasPen);
|
|
oXmlWriter.WriteAttribute(_T("antialiasbrush"), AntiAliasBrush);
|
|
oXmlWriter.WriteAttribute(_T("antialiastext"), AntiAliasText);
|
|
oXmlWriter.WriteAttribute(_T("stringalignmentvertical"), StringAlignmentVertical);
|
|
oXmlWriter.WriteAttribute(_T("stringalignmenthorizontal"), StringAlignmentHorizontal);
|
|
oXmlWriter.WriteAttribute(_T("wordwrapbysymbol"), WordWrapBySymbol);
|
|
oXmlWriter.WriteAttribute(_T("imagealphmode"), ImageAlphMode);
|
|
}
|
|
void FromXmlAttributes(XmlUtils::CXmlReader& oXmlReader)
|
|
{
|
|
AntiAliasPen = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("antialiaspen"), _T("1")));
|
|
AntiAliasBrush = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("antialiasbrush"), _T("1")));
|
|
AntiAliasText = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("antialiastext"), _T("0")));
|
|
StringAlignmentVertical = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("stringalignmentvertical"), _T("0")));
|
|
StringAlignmentHorizontal = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("stringalignmenthorizontal"), _T("0")));
|
|
WordWrapBySymbol = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("wordwrapbysymbol"), _T("0")));
|
|
ImageAlphMode = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("imagealphmode"), _T("0")));
|
|
}
|
|
void FromXmlNode(XmlUtils::CXmlNode& oXmlNode)
|
|
{
|
|
AntiAliasPen = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("antialiaspen"), _T("1")));
|
|
AntiAliasBrush = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("antialiasbrush"), _T("1")));
|
|
AntiAliasText = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("antialiastext"), _T("0")));
|
|
StringAlignmentVertical = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("font-stringalignmentvertical"), _T("1")));
|
|
StringAlignmentHorizontal = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("font-stringalignmenthorizontal"), _T("1")));
|
|
WordWrapBySymbol = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("wordwrapbysymbol"), _T("0")));
|
|
ImageAlphMode = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("imagealphmode"), _T("0")));
|
|
}
|
|
|
|
public:
|
|
|
|
CFormat()
|
|
{
|
|
AntiAliasPen = TRUE;
|
|
AntiAliasBrush = TRUE;
|
|
AntiAliasText = TRUE;
|
|
StringAlignmentVertical = 0;
|
|
StringAlignmentHorizontal = 0;
|
|
WordWrapBySymbol = FALSE;
|
|
ImageAlphMode = 0;
|
|
}
|
|
CFormat( const CFormat& other )
|
|
{
|
|
AntiAliasPen = other.AntiAliasPen;
|
|
AntiAliasBrush = other.AntiAliasBrush;
|
|
AntiAliasText = other.AntiAliasText;
|
|
StringAlignmentVertical = other.StringAlignmentVertical;
|
|
StringAlignmentHorizontal = other.StringAlignmentHorizontal;
|
|
WordWrapBySymbol = other.WordWrapBySymbol;
|
|
ImageAlphMode = other.ImageAlphMode;
|
|
}
|
|
CFormat& operator=(const CFormat& other)
|
|
{
|
|
AntiAliasPen = other.AntiAliasPen;
|
|
AntiAliasBrush = other.AntiAliasBrush;
|
|
AntiAliasText = other.AntiAliasText;
|
|
StringAlignmentVertical = other.StringAlignmentVertical;
|
|
StringAlignmentHorizontal = other.StringAlignmentHorizontal;
|
|
WordWrapBySymbol = other.WordWrapBySymbol;
|
|
ImageAlphMode = other.ImageAlphMode;
|
|
|
|
return *this;
|
|
}
|
|
~CFormat()
|
|
{
|
|
}
|
|
};
|
|
|
|
class CShadow
|
|
{
|
|
public:
|
|
|
|
BOOL Visible;
|
|
double DistanceX;
|
|
double DistanceY;
|
|
double BlurSize;
|
|
long Color;
|
|
long Alpha;
|
|
|
|
public:
|
|
|
|
CString ToXmlString(CString strRootNodeName = _T("shadow"), BOOL bAttributed = FALSE)
|
|
{
|
|
XmlUtils::CXmlWriter oXmlWriter;
|
|
|
|
if (!bAttributed)
|
|
{
|
|
oXmlWriter.WriteNodeBegin(strRootNodeName);
|
|
oXmlWriter.WriteNode(_T("visible"), Visible);
|
|
oXmlWriter.WriteNode(_T("distancex"), DistanceX);
|
|
oXmlWriter.WriteNode(_T("distancey"), DistanceY);
|
|
oXmlWriter.WriteNode(_T("blursize"), BlurSize);
|
|
oXmlWriter.WriteNode(_T("color"), Color);
|
|
oXmlWriter.WriteNode(_T("alpha"), Alpha);
|
|
oXmlWriter.WriteNodeEnd(strRootNodeName);
|
|
}
|
|
else
|
|
{
|
|
oXmlWriter.WriteNodeBegin(strRootNodeName, TRUE);
|
|
|
|
ToXmlAttributes(oXmlWriter);
|
|
|
|
oXmlWriter.WriteNodeEnd(strRootNodeName, TRUE);
|
|
}
|
|
|
|
return oXmlWriter.GetXmlString();
|
|
}
|
|
void FromXmlString(CString& strXml)
|
|
{
|
|
XmlUtils::CXmlReader oXmlReader;
|
|
|
|
oXmlReader.SetXmlString(strXml);
|
|
oXmlReader.ReadRootNode();
|
|
|
|
FromXmlAttributes(oXmlReader);
|
|
}
|
|
|
|
void ToXmlAttributes(XmlUtils::CXmlWriter& oXmlWriter)
|
|
{
|
|
oXmlWriter.WriteAttribute(_T("visible"), Visible);
|
|
oXmlWriter.WriteAttribute(_T("distancex"), DistanceX);
|
|
oXmlWriter.WriteAttribute(_T("distancey"), DistanceY);
|
|
oXmlWriter.WriteAttribute(_T("blursize"), BlurSize);
|
|
oXmlWriter.WriteAttribute(_T("color"), Color);
|
|
oXmlWriter.WriteAttribute(_T("alpha"), Alpha);
|
|
}
|
|
void FromXmlAttributes(XmlUtils::CXmlReader& oXmlReader)
|
|
{
|
|
Visible = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("visible"), _T("0")));
|
|
DistanceX = XmlUtils::GetDouble(oXmlReader.ReadNodeAttributeOrValue(_T("distancex"), _T("0")));
|
|
DistanceY = XmlUtils::GetDouble(oXmlReader.ReadNodeAttributeOrValue(_T("distancey"), _T("0")));
|
|
BlurSize = XmlUtils::GetDouble(oXmlReader.ReadNodeAttributeOrValue(_T("blursize"), _T("0")));
|
|
Color = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("color"), _T("0")));
|
|
Alpha = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("alpha"), _T("0")));
|
|
}
|
|
void FromXmlNode(XmlUtils::CXmlNode& oXmlNode)
|
|
{
|
|
Visible = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("visible"), _T("0")));
|
|
DistanceX = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("distancex"), _T("0")));
|
|
DistanceY = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("distancey"), _T("0")));
|
|
BlurSize = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("blursize"), _T("0")));
|
|
Color = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("color"), _T("0")));
|
|
Alpha = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("alpha"), _T("0")));
|
|
}
|
|
void SetDefaultParams()
|
|
{
|
|
Visible = FALSE;
|
|
DistanceX = 15;
|
|
DistanceY = 15;
|
|
BlurSize = 0;
|
|
Color = 0;
|
|
Alpha = 120;
|
|
}
|
|
|
|
public:
|
|
|
|
CShadow()
|
|
{
|
|
SetDefaultParams();
|
|
}
|
|
CShadow( const CShadow& other )
|
|
{
|
|
Visible = other.Visible;
|
|
DistanceX = other.DistanceX;
|
|
DistanceY = other.DistanceY;
|
|
BlurSize = other.BlurSize;
|
|
Color = other.Color;
|
|
Alpha = other.Alpha;
|
|
|
|
}
|
|
CShadow& operator=(const CShadow& other)
|
|
{
|
|
Visible = other.Visible;
|
|
DistanceX = other.DistanceX;
|
|
DistanceY = other.DistanceY;
|
|
BlurSize = other.BlurSize;
|
|
Color = other.Color;
|
|
Alpha = other.Alpha;
|
|
|
|
return *this;
|
|
}
|
|
virtual ~CShadow()
|
|
{
|
|
}
|
|
};
|
|
class CBackground
|
|
{
|
|
public:
|
|
long Color;
|
|
long Alpha;
|
|
|
|
public:
|
|
|
|
CString ToXmlString(CString strRootNodeName = _T("background"), BOOL bAttributed = FALSE)
|
|
{
|
|
XmlUtils::CXmlWriter oXmlWriter;
|
|
|
|
if (!bAttributed)
|
|
{
|
|
oXmlWriter.WriteNodeBegin(strRootNodeName);
|
|
oXmlWriter.WriteNode(_T("color"), Color);
|
|
oXmlWriter.WriteNode(_T("alpha"), Alpha);
|
|
oXmlWriter.WriteNodeEnd(strRootNodeName);
|
|
}
|
|
else
|
|
{
|
|
oXmlWriter.WriteNodeBegin(strRootNodeName, TRUE);
|
|
|
|
ToXmlAttributes(oXmlWriter);
|
|
|
|
oXmlWriter.WriteNodeEnd(strRootNodeName, TRUE);
|
|
}
|
|
|
|
return oXmlWriter.GetXmlString();
|
|
}
|
|
void FromXmlString(CString& strXml)
|
|
{
|
|
XmlUtils::CXmlReader oXmlReader;
|
|
|
|
oXmlReader.SetXmlString(strXml);
|
|
oXmlReader.ReadRootNode();
|
|
|
|
FromXmlAttributes(oXmlReader);
|
|
}
|
|
|
|
void ToXmlAttributes(XmlUtils::CXmlWriter& oXmlWriter)
|
|
{
|
|
oXmlWriter.WriteAttribute(_T("color"), Color);
|
|
oXmlWriter.WriteAttribute(_T("alpha"), Alpha);
|
|
}
|
|
void FromXmlAttributes(XmlUtils::CXmlReader& oXmlReader)
|
|
{
|
|
Color = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("color"), _T("0")));
|
|
Alpha = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("alpha"), _T("0")));
|
|
}
|
|
void FromXmlNode(XmlUtils::CXmlNode& oXmlNode)
|
|
{
|
|
Color = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("color"), _T("0")));
|
|
Alpha = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("alpha"), _T("0")));
|
|
}
|
|
|
|
public:
|
|
|
|
CBackground()
|
|
{
|
|
Color = 0;
|
|
Alpha = 0;
|
|
}
|
|
CBackground( const CBackground& other )
|
|
{
|
|
Color = other.Color;
|
|
Alpha = other.Alpha;
|
|
}
|
|
CBackground& operator=(const CBackground& other)
|
|
{
|
|
Color = other.Color;
|
|
Alpha = other.Alpha;
|
|
|
|
return *this;
|
|
}
|
|
virtual ~CBackground()
|
|
{
|
|
}
|
|
};
|
|
class CEdgeText
|
|
{
|
|
public:
|
|
|
|
long Visible;
|
|
double Dist;
|
|
long Color;
|
|
long Alpha;
|
|
|
|
public:
|
|
|
|
CString ToXmlString(CString strRootNodeName = _T("edgetext"), BOOL bAttributed = FALSE)
|
|
{
|
|
XmlUtils::CXmlWriter oXmlWriter;
|
|
|
|
if (!bAttributed)
|
|
{
|
|
oXmlWriter.WriteNodeBegin(strRootNodeName);
|
|
oXmlWriter.WriteNode(_T("visible"), Visible);
|
|
oXmlWriter.WriteNode(_T("dist"), Dist);
|
|
oXmlWriter.WriteNode(_T("color"), Color);
|
|
oXmlWriter.WriteNode(_T("alpha"), Alpha);
|
|
oXmlWriter.WriteNodeEnd(strRootNodeName);
|
|
}
|
|
else
|
|
{
|
|
oXmlWriter.WriteNodeBegin(strRootNodeName, TRUE);
|
|
|
|
ToXmlAttributes(oXmlWriter);
|
|
|
|
oXmlWriter.WriteNodeEnd(strRootNodeName, TRUE);
|
|
}
|
|
|
|
return oXmlWriter.GetXmlString();
|
|
}
|
|
void FromXmlString(CString& strXml)
|
|
{
|
|
XmlUtils::CXmlReader oXmlReader;
|
|
|
|
oXmlReader.SetXmlString(strXml);
|
|
oXmlReader.ReadRootNode();
|
|
|
|
FromXmlAttributes(oXmlReader);
|
|
}
|
|
|
|
void ToXmlAttributes(XmlUtils::CXmlWriter& oXmlWriter)
|
|
{
|
|
oXmlWriter.WriteAttribute(_T("visible"), Visible);
|
|
oXmlWriter.WriteAttribute(_T("dist"), Dist);
|
|
oXmlWriter.WriteAttribute(_T("color"), Color);
|
|
oXmlWriter.WriteAttribute(_T("alpha"), Alpha);
|
|
}
|
|
void FromXmlAttributes(XmlUtils::CXmlReader& oXmlReader)
|
|
{
|
|
Visible = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("edge-visible"), _T("0")));
|
|
Dist = XmlUtils::GetDouble(oXmlReader.ReadNodeAttributeOrValue(_T("edge-dist"), _T("0")));
|
|
Color = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("edge-color"), _T("0")));
|
|
Alpha = XmlUtils::GetInteger(oXmlReader.ReadNodeAttributeOrValue(_T("edge-alpha"), _T("0")));
|
|
}
|
|
void FromXmlNode(XmlUtils::CXmlNode& oXmlNode)
|
|
{
|
|
Visible = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("edge-visible"), _T("0")));
|
|
Dist = XmlUtils::GetDouble(oXmlNode.GetAttributeOrValue(_T("edge-dist"), _T("0")));
|
|
Color = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("edge-color"), _T("0")));
|
|
Alpha = XmlUtils::GetInteger(oXmlNode.GetAttributeOrValue(_T("edge-alpha"), _T("0")));
|
|
}
|
|
void SetDefaultParams()
|
|
{
|
|
Visible = 0;
|
|
Dist = 5;
|
|
Color = 0;
|
|
Alpha = 255;
|
|
}
|
|
|
|
public:
|
|
|
|
CEdgeText()
|
|
{
|
|
SetDefaultParams();
|
|
}
|
|
CEdgeText( const CEdgeText& other )
|
|
{
|
|
Visible = other.Visible;
|
|
Dist = other.Dist;
|
|
Color = other.Color;
|
|
Alpha = other.Alpha;
|
|
}
|
|
CEdgeText& operator=(const CEdgeText& other)
|
|
{
|
|
Visible = other.Visible;
|
|
Dist = other.Dist;
|
|
Color = other.Color;
|
|
Alpha = other.Alpha;
|
|
|
|
return *this;
|
|
}
|
|
virtual ~CEdgeText()
|
|
{
|
|
}
|
|
};
|
|
|
|
static void SetMatrix(Gdiplus::Matrix& oDst, const Gdiplus::Matrix& oSrc)
|
|
{
|
|
Gdiplus::REAL mass[6];
|
|
oSrc.GetElements(mass);
|
|
|
|
oDst.SetElements(mass[0], mass[1], mass[2], mass[3], mass[4], mass[5]);
|
|
}
|
|
} |