Fixed a color bug in OFD

This commit is contained in:
Green
2025-08-04 17:54:26 +03:00
parent c2a733f465
commit a82cf375b7
30 changed files with 286 additions and 107 deletions

View File

@ -53,6 +53,7 @@ HEADERS += \
src/Types/Font.h \ src/Types/Font.h \
src/Types/MultiMedia.h \ src/Types/MultiMedia.h \
src/Types/PageArea.h \ src/Types/PageArea.h \
src/Types/PenSettings.h \
src/Types/Signature.h \ src/Types/Signature.h \
src/Types/TemplatePage.h \ src/Types/TemplatePage.h \
src/Utils/Types.h \ src/Utils/Types.h \
@ -82,6 +83,7 @@ SOURCES += \
src/Types/Font.cpp \ src/Types/Font.cpp \
src/Types/MultiMedia.cpp \ src/Types/MultiMedia.cpp \
src/Types/PageArea.cpp \ src/Types/PageArea.cpp \
src/Types/PenSettings.cpp \
src/Types/Signature.cpp \ src/Types/Signature.cpp \
src/Types/TemplatePage.cpp \ src/Types/TemplatePage.cpp \
src/Utils/Types.cpp \ src/Utils/Types.cpp \

View File

@ -1,6 +1,8 @@
#include "Annotation.h" #include "Annotation.h"
#include "Utils/Utils.h" #include "Utils/Utils.h"
#include "../../../Common/File.h"
namespace OFD namespace OFD
{ {
CParameter::CParameter(CXmlReader& oLiteReader) CParameter::CParameter(CXmlReader& oLiteReader)
@ -106,13 +108,13 @@ CAnnot::~CAnnot()
ClearContainer(m_arAppearances); ClearContainer(m_arAppearances);
} }
void CAnnot::Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const void CAnnot::Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const
{ {
if (!m_bPrint) if (!m_bPrint)
return; return;
for (const CAppearance* pAppearance : m_arAppearances) for (const CAppearance* pAppearance : m_arAppearances)
pAppearance->Draw(pRenderer, oCommonData); pAppearance->Draw(pRenderer, oCommonData, ePageType);
} }
CPageAnnot::CPageAnnot() CPageAnnot::CPageAnnot()
@ -144,10 +146,10 @@ CPageAnnot* CPageAnnot::Read(const std::wstring& wsFilePath, const std::wstring&
return pPageAnnot; return pPageAnnot;
} }
void CPageAnnot::Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const void CPageAnnot::Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const
{ {
for (const CAnnot* pAnnot : m_arAnnots) for (const CAnnot* pAnnot : m_arAnnots)
pAnnot->Draw(pRenderer, oCommonData); pAnnot->Draw(pRenderer, oCommonData, ePageType);
} }
CAnnotation::CAnnotation() CAnnotation::CAnnotation()
@ -195,9 +197,9 @@ bool CAnnotation::Read(const std::wstring& wsFilePath, const std::wstring& wsRoo
return nullptr != m_pPageAnnot; return nullptr != m_pPageAnnot;
} }
void CAnnotation::Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const void CAnnotation::Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const
{ {
if (nullptr != m_pPageAnnot) if (nullptr != m_pPageAnnot)
m_pPageAnnot->Draw(pRenderer, oCommonData); m_pPageAnnot->Draw(pRenderer, oCommonData, ePageType);
} }
} }

View File

@ -34,7 +34,7 @@ public:
CAnnot(CXmlReader& oLiteReader); CAnnot(CXmlReader& oLiteReader);
~CAnnot(); ~CAnnot();
void Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const; void Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const;
private: private:
EAnnotType m_eType; EAnnotType m_eType;
bool m_bVisible; bool m_bVisible;
@ -54,7 +54,7 @@ public:
static CPageAnnot* Read(const std::wstring& wsFilePath, const std::wstring& wsRootPath); static CPageAnnot* Read(const std::wstring& wsFilePath, const std::wstring& wsRootPath);
void Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const; void Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const;
private: private:
std::vector<CAnnot*> m_arAnnots; std::vector<CAnnot*> m_arAnnots;
@ -68,7 +68,7 @@ public:
bool Read(const std::wstring& wsFilePath, const std::wstring& wsRootPath); bool Read(const std::wstring& wsFilePath, const std::wstring& wsRootPath);
void Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const; void Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const;
private: private:
CPageAnnot *m_pPageAnnot; CPageAnnot *m_pPageAnnot;
}; };

View File

@ -30,12 +30,12 @@ bool CContent::Read(CXmlReader& oLiteReader)
return false; return false;
} }
void CContent::Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const void CContent::Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const
{ {
if (nullptr == pRenderer) if (nullptr == pRenderer)
return; return;
for (const CLayer* pLayer : m_arLayers) for (const CLayer* pLayer : m_arLayers)
pLayer->Draw(pRenderer, oCommonData); pLayer->Draw(pRenderer, oCommonData, ePageType);
} }
} }

View File

@ -14,7 +14,7 @@ public:
~CContent(); ~CContent();
bool Read(CXmlReader& oLiteReader); bool Read(CXmlReader& oLiteReader);
void Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const; void Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const;
}; };
} }

View File

@ -4,9 +4,7 @@
namespace OFD namespace OFD
{ {
CGraphicUnit::CGraphicUnit(CXmlReader& oLiteReader) CGraphicUnit::CGraphicUnit(CXmlReader& oLiteReader)
: m_bVisible(true), m_unDrawParam(0), m_dLineWidth(0.353), : m_bVisible(true), m_unDrawParam(0), m_oPenSettings(oLiteReader)
m_eCap(ECap::Butt), m_eJoin(EJoin::Miter), m_dMiterLimit(4.234),
m_dDashOffset(0.), m_uchAlpha(255)
{ {
if (0 == oLiteReader.GetAttributesCount() || !oLiteReader.MoveToFirstAttribute()) if (0 == oLiteReader.GetAttributesCount() || !oLiteReader.MoveToFirstAttribute())
return; return;
@ -27,36 +25,6 @@ CGraphicUnit::CGraphicUnit(CXmlReader& oLiteReader)
m_oCTM.Read(oLiteReader.GetTextA()); m_oCTM.Read(oLiteReader.GetTextA());
else if (L"DrawParam" == wsAttributeName) else if (L"DrawParam" == wsAttributeName)
m_unDrawParam = oLiteReader.GetUInteger(true); m_unDrawParam = oLiteReader.GetUInteger(true);
else if (L"LineWidth" == wsAttributeName)
m_dLineWidth = oLiteReader.GetDouble(true);
else if (L"Cap" == wsAttributeName)
{
const std::wstring wsValue{oLiteReader.GetText()};
if (L"Butt" == wsValue)
m_eCap = ECap::Butt;
else if (L"Round" == wsValue)
m_eCap = ECap::Round;
else if (L"Square" == wsValue)
m_eCap = ECap::Square;
}
else if (L"Join" == wsAttributeName)
{
const std::wstring wsValue{oLiteReader.GetText()};
if (L"Miter" == wsValue)
m_eJoin = EJoin::Miter;
else if (L"Round" == wsValue)
m_eJoin = EJoin::Round;
else if (L"Bevel" == wsValue)
m_eJoin = EJoin::Bevel;
}
else if (L"MiterLimit" == wsAttributeName)
m_dMiterLimit = oLiteReader.GetDouble(true);
else if (L"DashOffset" == wsAttributeName)
m_dDashOffset = oLiteReader.GetDouble(true);
else if (L"Alpha" == wsAttributeName)
m_uchAlpha = oLiteReader.GetUInteger(true);
} while (oLiteReader.MoveToNextAttribute()); } while (oLiteReader.MoveToNextAttribute());
oLiteReader.MoveToElement(); oLiteReader.MoveToElement();
@ -67,6 +35,8 @@ void CGraphicUnit::Apply(IRenderer* pRenderer, TMatrix& oOldTransform) const
if (nullptr == pRenderer) if (nullptr == pRenderer)
return; return;
m_oPenSettings.Apply(pRenderer);
pRenderer->GetTransform(&oOldTransform.m_dM11, &oOldTransform.m_dM12, &oOldTransform.m_dM21, &oOldTransform.m_dM22, &oOldTransform.m_dDx, &oOldTransform.m_dDy); pRenderer->GetTransform(&oOldTransform.m_dM11, &oOldTransform.m_dM12, &oOldTransform.m_dM21, &oOldTransform.m_dM22, &oOldTransform.m_dDx, &oOldTransform.m_dDy);
Aggplus::CMatrix oTransform(oOldTransform.m_dM11, oOldTransform.m_dM12, oOldTransform.m_dM21, oOldTransform.m_dM22, oOldTransform.m_dDx, oOldTransform.m_dDy); Aggplus::CMatrix oTransform(oOldTransform.m_dM11, oOldTransform.m_dM12, oOldTransform.m_dM21, oOldTransform.m_dM22, oOldTransform.m_dDx, oOldTransform.m_dDy);

View File

@ -1,13 +1,9 @@
#ifndef GRAPHICUNIT_H #ifndef GRAPHICUNIT_H
#define GRAPHICUNIT_H #define GRAPHICUNIT_H
#include "../Utils/XmlReader.h" #include "../Types/PenSettings.h"
#include "../Utils/Types.h" #include "../Utils/Types.h"
#include "../../../DesktopEditor/graphics/IRenderer.h"
#include <vector>
namespace OFD namespace OFD
{ {
class CGraphicUnit class CGraphicUnit
@ -17,28 +13,7 @@ class CGraphicUnit
bool m_bVisible; bool m_bVisible;
TMatrix m_oCTM; TMatrix m_oCTM;
unsigned int m_unDrawParam; unsigned int m_unDrawParam;
double m_dLineWidth; CPenSettings m_oPenSettings;
enum class ECap
{
Butt,
Round,
Square
} m_eCap;
enum class EJoin
{
Miter,
Round,
Bevel
} m_eJoin;
double m_dMiterLimit;
double m_dDashOffset;
std::vector<double> m_arDashPattern;
unsigned char m_uchAlpha;
friend class CPathObject;
public: public:
CGraphicUnit(CXmlReader& oLiteReader); CGraphicUnit(CXmlReader& oLiteReader);

View File

@ -8,13 +8,20 @@
namespace OFD namespace OFD
{ {
enum class EPageType
{
Page,
TemplatePage,
Anotation
};
class IPageBlock : public IOFDElement class IPageBlock : public IOFDElement
{ {
public: public:
IPageBlock(CXmlReader& oLiteReader) IPageBlock(CXmlReader& oLiteReader)
: IOFDElement(oLiteReader){}; : IOFDElement(oLiteReader){};
virtual ~IPageBlock(){}; virtual ~IPageBlock(){};
virtual void Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const = 0; virtual void Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const = 0;
}; };
} }

View File

@ -24,7 +24,7 @@ CImageObject::CImageObject(CXmlReader& oLiteReader)
oLiteReader.MoveToElement(); oLiteReader.MoveToElement();
} }
void CImageObject::Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const void CImageObject::Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const
{ {
if (nullptr == pRenderer || nullptr == oCommonData.GetDocumentRes()) if (nullptr == pRenderer || nullptr == oCommonData.GetDocumentRes())
return; return;

View File

@ -12,7 +12,7 @@ class CImageObject : public IPageBlock, public CGraphicUnit
public: public:
CImageObject(CXmlReader& oLiteReader); CImageObject(CXmlReader& oLiteReader);
void Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const override; void Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const override;
}; };
} }

View File

@ -21,12 +21,12 @@ CLayer::~CLayer()
delete pPageBlock; delete pPageBlock;
} }
void CLayer::Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const void CLayer::Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const
{ {
if (nullptr == pRenderer) if (nullptr == pRenderer)
return; return;
for (const IPageBlock* pPageBlock : m_arPageBlocks) for (const IPageBlock* pPageBlock : m_arPageBlocks)
pPageBlock->Draw(pRenderer, oCommonData); pPageBlock->Draw(pRenderer, oCommonData, ePageType);
} }
} }

View File

@ -20,7 +20,7 @@ public:
CLayer(CXmlReader& oLiteReader); CLayer(CXmlReader& oLiteReader);
~CLayer(); ~CLayer();
void Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const override; void Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const override;
}; };
} }

View File

@ -54,7 +54,7 @@ void CPageBlock::ReadIntoContainer(CXmlReader& oLiteReader, std::vector<IPageBlo
} }
} }
void CPageBlock::Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const void CPageBlock::Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const
{ {
if (nullptr == pRenderer) if (nullptr == pRenderer)
return; return;
@ -65,7 +65,7 @@ void CPageBlock::Draw(IRenderer* pRenderer, const CCommonData& oCommonData) cons
pRenderer->SetTransform(dM11, dM12, dM21, dM22, dDx + m_oBoundary.m_dX, dDy + m_oBoundary.m_dY); pRenderer->SetTransform(dM11, dM12, dM21, dM22, dDx + m_oBoundary.m_dX, dDy + m_oBoundary.m_dY);
for (const IPageBlock* pPageBlock : m_arPageBlocks) for (const IPageBlock* pPageBlock : m_arPageBlocks)
pPageBlock->Draw(pRenderer, oCommonData); pPageBlock->Draw(pRenderer, oCommonData, ePageType);
pRenderer->SetTransform(dM11, dM12, dM21, dM22, dDx, dDy); pRenderer->SetTransform(dM11, dM12, dM21, dM22, dDx, dDy);
} }

View File

@ -15,7 +15,7 @@ public:
static void ReadIntoContainer(CXmlReader& oLiteReader, std::vector<IPageBlock*>& arPageBlocks); static void ReadIntoContainer(CXmlReader& oLiteReader, std::vector<IPageBlock*>& arPageBlocks);
void Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const override; void Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const override;
}; };
} }

View File

@ -1,5 +1,7 @@
#include "PathObject.h" #include "PathObject.h"
#include "src/Utils/Utils.h" #include "src/Utils/Utils.h"
#include "../Types/DrawParam.h"
namespace OFD namespace OFD
{ {
@ -132,7 +134,7 @@ void CPathObject::AddElement(const IPathElement* pElement)
m_arElements.push_back(pElement); m_arElements.push_back(pElement);
} }
void CPathObject::Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const void CPathObject::Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const
{ {
if (nullptr == pRenderer || m_arElements.empty()) if (nullptr == pRenderer || m_arElements.empty())
return; return;
@ -168,38 +170,46 @@ void CPathObject::Draw(IRenderer* pRenderer, const CCommonData& oCommonData) con
} }
} }
const CRes* pPublicRes{oCommonData.GetPublicRes()};
std::vector<const CDrawParam*> arDrawParams{pPublicRes->GetDrawParams()};
if (m_bFill) if (m_bFill)
{ {
pRenderer->put_BrushType(c_BrushTypeSolid); pRenderer->put_BrushType(c_BrushTypeSolid);
if (nullptr != m_pFillColor) if (nullptr != m_pFillColor)
{ {
pRenderer->put_BrushColor1(m_pFillColor->ToInt(oCommonData.GetPublicRes())); pRenderer->put_BrushColor1(m_pFillColor->ToInt(pPublicRes));
pRenderer->put_BrushAlpha1(m_pFillColor->GetAlpha()); pRenderer->put_BrushAlpha1(m_pFillColor->GetAlpha());
} }
else else
{ {
pRenderer->put_BrushColor1(0); pRenderer->put_BrushColor1(0);
pRenderer->put_BrushAlpha1(0xff);
if (EPageType::TemplatePage == ePageType)
for (const CDrawParam* pDrawParam : arDrawParams)
if (pDrawParam->ApplyFillColor(pRenderer, pPublicRes))
break;
} }
} }
else else
pRenderer->put_BrushType(c_BrushTypeNotSet); pRenderer->put_BrushType(c_BrushTypeNotSet);
if(m_bStroke) if(m_bStroke)
{ {
pRenderer->put_PenSize(m_dLineWidth);
if (nullptr != m_pStrokeColor) if (nullptr != m_pStrokeColor)
{ {
pRenderer->put_PenColor(m_pStrokeColor->ToInt(oCommonData.GetPublicRes())); pRenderer->put_PenColor(m_pStrokeColor->ToInt(pPublicRes));
pRenderer->put_PenAlpha(m_pStrokeColor->GetAlpha()); pRenderer->put_PenAlpha(m_pStrokeColor->GetAlpha());
} }
else else
{ {
pRenderer->put_PenColor(0); pRenderer->put_PenColor(0);
pRenderer->put_PenAlpha(0xff);
if (EPageType::TemplatePage == ePageType)
for (const CDrawParam* pDrawParam : arDrawParams)
if (pDrawParam->ApplyStrokeColor(pRenderer, pPublicRes))
break;
} }
} }
else else

View File

@ -117,7 +117,7 @@ public:
CPathObject(CXmlReader& oLiteReader); CPathObject(CXmlReader& oLiteReader);
~CPathObject(); ~CPathObject();
void Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const override; void Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const override;
}; };
} }

View File

@ -178,12 +178,14 @@ CTextObject::~CTextObject()
delete pTextCode; delete pTextCode;
} }
void CTextObject::Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const void CTextObject::Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const
{ {
if (nullptr == pRenderer || m_arTextCodes.empty()) if (nullptr == pRenderer || m_arTextCodes.empty())
return; return;
const CFont* pFont = oCommonData.GetPublicRes()->GetFont(m_unFontID); const CRes* pPublicRes{oCommonData.GetPublicRes()};
const CFont* pFont = pPublicRes->GetFont(m_unFontID);
if (nullptr == pFont) if (nullptr == pFont)
return; return;
@ -193,19 +195,25 @@ void CTextObject::Draw(IRenderer* pRenderer, const CCommonData& oCommonData) con
TMatrix oOldTransform; TMatrix oOldTransform;
CGraphicUnit::Apply(pRenderer, oOldTransform); CGraphicUnit::Apply(pRenderer, oOldTransform);
std::vector<const CDrawParam*> arDrawParams{pPublicRes->GetDrawParams()};
if (m_bFill) if (m_bFill)
{ {
pRenderer->put_BrushType(c_BrushTypeSolid); pRenderer->put_BrushType(c_BrushTypeSolid);
if (nullptr != m_pFillColor) if (nullptr != m_pFillColor)
{ {
pRenderer->put_BrushColor1(m_pFillColor->ToInt(oCommonData.GetPublicRes())); pRenderer->put_BrushColor1(m_pFillColor->ToInt(pPublicRes));
pRenderer->put_BrushAlpha1(m_pFillColor->GetAlpha()); pRenderer->put_BrushAlpha1(m_pFillColor->GetAlpha());
} }
else else
{ {
pRenderer->put_BrushColor1(0); pRenderer->put_BrushColor1(0);
pRenderer->put_BrushAlpha1(0xff);
if (EPageType::TemplatePage == ePageType)
for (const CDrawParam* pDrawParam : arDrawParams)
if (pDrawParam->ApplyFillColor(pRenderer, pPublicRes))
break;
} }
} }
else else

View File

@ -58,7 +58,7 @@ public:
CTextObject(CXmlReader& oLiteReader); CTextObject(CXmlReader& oLiteReader);
~CTextObject(); ~CTextObject();
void Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const override; void Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const override;
}; };
} }

View File

@ -118,9 +118,9 @@ bool CDocument::DrawPage(IRenderer* pRenderer, int nPageIndex) const
if (itFound == m_mPages.cend()) if (itFound == m_mPages.cend())
return false; return false;
itFound->second->Draw(pRenderer, m_oCommonData); itFound->second->Draw(pRenderer, m_oCommonData, EPageType::Page);
m_oAnnotation.Draw(pRenderer, m_oCommonData); m_oAnnotation.Draw(pRenderer, m_oCommonData, EPageType::Anotation);
return true; return true;
} }

View File

@ -61,7 +61,7 @@ CPage* CPage::Read(const std::wstring& wsFilePath, const std::wstring& wsRootPat
return pPage; return pPage;
} }
void CPage::Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const void CPage::Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const
{ {
if (nullptr == pRenderer) if (nullptr == pRenderer)
return; return;
@ -73,10 +73,10 @@ void CPage::Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const
const CTemplatePage *pTemplatePage = oCommonData.GetTemplatePage(m_parTemplatePage.first, m_parTemplatePage.second); const CTemplatePage *pTemplatePage = oCommonData.GetTemplatePage(m_parTemplatePage.first, m_parTemplatePage.second);
if (nullptr != pTemplatePage && EZOrder::Background == pTemplatePage->GetZOrder() && nullptr != pTemplatePage->GetPage()) if (nullptr != pTemplatePage && EZOrder::Background == pTemplatePage->GetZOrder() && nullptr != pTemplatePage->GetPage())
pTemplatePage->GetPage()->Draw(pRenderer, oCommonData); pTemplatePage->GetPage()->Draw(pRenderer, oCommonData, EPageType::TemplatePage);
} }
m_oContent.Draw(pRenderer, oCommonData); m_oContent.Draw(pRenderer, oCommonData, ePageType);
pRenderer->EndCommand(c_nImageType); pRenderer->EndCommand(c_nImageType);
} }

View File

@ -18,7 +18,7 @@ public:
~CPage(); ~CPage();
static CPage* Read(const std::wstring& wsFilePath, const std::wstring& wsRootPath); static CPage* Read(const std::wstring& wsFilePath, const std::wstring& wsRootPath);
void Draw(IRenderer* pRenderer, const CCommonData& oCommonData) const; void Draw(IRenderer* pRenderer, const CCommonData& oCommonData, EPageType ePageType) const;
void GetPageSize(double& dWidth, double& dHeight) const; void GetPageSize(double& dWidth, double& dHeight) const;
}; };

View File

@ -135,4 +135,14 @@ const CCompositeGraphicUnit* CRes::GetCompositeGraphicUnit(unsigned int unId) co
{ {
RETURN_ELEMENT_FROM_MAP(CCompositeGraphicUnit, m_mCCompositeGraphicUnits); RETURN_ELEMENT_FROM_MAP(CCompositeGraphicUnit, m_mCCompositeGraphicUnits);
} }
std::vector<const CDrawParam*> CRes::GetDrawParams() const
{
std::vector<const CDrawParam*> arValues;
for (std::map<unsigned int, CDrawParam*>::const_iterator itBegin = m_mDrawParams.cbegin(); itBegin != m_mDrawParams.cend(); ++itBegin)
arValues.push_back(itBegin->second);
return arValues;
}
} }

View File

@ -9,8 +9,6 @@
#include "Types/MultiMedia.h" #include "Types/MultiMedia.h"
#include "Types/CompositeGraphicUnit.h" #include "Types/CompositeGraphicUnit.h"
#include "../../OfficeUtils/src/ZipFolder.h"
namespace OFD namespace OFD
{ {
class CRes class CRes
@ -31,6 +29,8 @@ public:
const CFont* GetFont(unsigned int unId) const; const CFont* GetFont(unsigned int unId) const;
const CMultiMedia* GetMultiMedia(unsigned int unId) const; const CMultiMedia* GetMultiMedia(unsigned int unId) const;
const CCompositeGraphicUnit* GetCompositeGraphicUnit(unsigned int unId) const; const CCompositeGraphicUnit* GetCompositeGraphicUnit(unsigned int unId) const;
std::vector<const CDrawParam*> GetDrawParams() const;
}; };
} }

View File

@ -1,5 +1,7 @@
#include "Color.h" #include "Color.h"
#include "../Res.h"
namespace OFD namespace OFD
{ {
CColor::CColor(CXmlReader& oXmlReader) CColor::CColor(CXmlReader& oXmlReader)

View File

@ -2,10 +2,10 @@
#define COLOR_H #define COLOR_H
#include "../Utils/XmlReader.h" #include "../Utils/XmlReader.h"
#include "../Res.h"
namespace OFD namespace OFD
{ {
class CRes;
class CColor class CColor
{ {
BYTE m_oValues[4]; BYTE m_oValues[4];

View File

@ -3,6 +3,63 @@
namespace OFD namespace OFD
{ {
CDrawParam::CDrawParam(CXmlReader& oXmlReader) CDrawParam::CDrawParam(CXmlReader& oXmlReader)
: IOFDElement(oXmlReader) : IOFDElement(oXmlReader), m_oPenSettings(oXmlReader),
{} m_pStrokeColor(nullptr), m_pFillColor(nullptr)
{
std::string sName;
const int nDepth = oXmlReader.GetDepth();
while (oXmlReader.ReadNextSiblingNode(nDepth))
{
sName = oXmlReader.GetNameA();
if ("ofd:FillColor" == sName)
{
if (nullptr != m_pFillColor)
delete m_pFillColor;
m_pFillColor = new CColor(oXmlReader);
}
else if ("ofd:StrokeColor" == sName)
{
if (nullptr != m_pStrokeColor)
delete m_pStrokeColor;
m_pStrokeColor = new CColor(oXmlReader);
}
}
}
CDrawParam::~CDrawParam()
{
if (nullptr != m_pStrokeColor)
delete m_pStrokeColor;
if (nullptr != m_pFillColor)
delete m_pFillColor;
}
bool CDrawParam::ApplyStrokeColor(IRenderer* pRenderer, const CRes* pPublicRes) const
{
if (nullptr == pRenderer || nullptr == m_pStrokeColor)
return false;
m_oPenSettings.Apply(pRenderer);
pRenderer->put_PenColor(m_pStrokeColor->ToInt(pPublicRes));
pRenderer->put_PenAlpha(m_pStrokeColor->GetAlpha());
return true;
}
bool CDrawParam::ApplyFillColor(IRenderer* pRenderer, const CRes* pPublicRes) const
{
if (nullptr == pRenderer || nullptr == m_pFillColor)
return false;
pRenderer->put_BrushColor1(m_pFillColor->ToInt(pPublicRes));
pRenderer->put_BrushAlpha1(m_pFillColor->GetAlpha());
return true;
}
} }

View File

@ -2,13 +2,23 @@
#define DRAWPARAM_H #define DRAWPARAM_H
#include "../IOFDElement.h" #include "../IOFDElement.h"
#include "PenSettings.h"
#include "Color.h"
namespace OFD namespace OFD
{ {
class CDrawParam : public IOFDElement class CDrawParam : public IOFDElement
{ {
CPenSettings m_oPenSettings;
CColor *m_pStrokeColor;
CColor *m_pFillColor;
public: public:
CDrawParam(CXmlReader& oXmlReader); CDrawParam(CXmlReader& oXmlReader);
~CDrawParam();
bool ApplyStrokeColor(IRenderer* pRenderer, const CRes* pPublicRes) const;
bool ApplyFillColor(IRenderer* pRenderer, const CRes* pPublicRes) const;
}; };
} }
#endif // DRAWPARAM_H #endif // DRAWPARAM_H

View File

@ -0,0 +1,87 @@
#include "PenSettings.h"
namespace OFD
{
CPenSettings::CPenSettings(CXmlReader& oLiteReader)
: m_dLineWidth(0.353), m_eCap(ECap::Butt),
m_eJoin(EJoin::Miter), m_dMiterLimit(4.234), m_dDashOffset(0.)
{
if (0 == oLiteReader.GetAttributesCount() || !oLiteReader.MoveToFirstAttribute())
return;
std::wstring wsAttributeName;
do
{
wsAttributeName = oLiteReader.GetName();
if (L"LineWidth" == wsAttributeName)
m_dLineWidth = oLiteReader.GetDouble(true);
else if (L"Cap" == wsAttributeName)
{
const std::wstring wsValue{oLiteReader.GetText()};
if (L"Butt" == wsValue)
m_eCap = ECap::Butt;
else if (L"Round" == wsValue)
m_eCap = ECap::Round;
else if (L"Square" == wsValue)
m_eCap = ECap::Square;
}
else if (L"Join" == wsAttributeName)
{
const std::wstring wsValue{oLiteReader.GetText()};
if (L"Miter" == wsValue)
m_eJoin = EJoin::Miter;
else if (L"Round" == wsValue)
m_eJoin = EJoin::Round;
else if (L"Bevel" == wsValue)
m_eJoin = EJoin::Bevel;
}
else if (L"MiterLimit" == wsAttributeName)
m_dMiterLimit = oLiteReader.GetDouble(true);
else if (L"DashOffset" == wsAttributeName)
m_dDashOffset = oLiteReader.GetDouble(true);
else if (L"Alpha" == wsAttributeName)
m_uchAlpha = oLiteReader.GetUInteger(true);
} while (oLiteReader.MoveToNextAttribute());
oLiteReader.MoveToElement();
}
void CPenSettings::Apply(IRenderer* pRenderer) const
{
pRenderer->put_PenSize(m_dLineWidth);
pRenderer->put_PenAlpha(m_uchAlpha);
pRenderer->put_BrushAlpha1(m_uchAlpha);
BYTE nCapStyle = 0;
switch (m_eCap)
{
case ECap::Butt: nCapStyle = Aggplus::LineCapFlat; break;
case ECap::Round: nCapStyle = Aggplus::LineCapRound; break;
case ECap::Square: nCapStyle = Aggplus::LineCapSquare; break;
}
pRenderer->put_PenLineStartCap(nCapStyle);
pRenderer->put_PenLineEndCap(nCapStyle);
BYTE nJoinStyle = 0;
switch (m_eJoin)
{
case EJoin::Miter: nJoinStyle = Aggplus::LineJoinMiter; break;
case EJoin::Round: nJoinStyle = Aggplus::LineJoinRound; break;
case EJoin::Bevel: nJoinStyle = Aggplus::LineJoinBevel; break;
}
pRenderer->put_PenLineJoin(nJoinStyle);
if (!m_arDashPattern.empty())
{
pRenderer->put_PenDashStyle(Aggplus::DashStyleCustom);
pRenderer->put_PenDashOffset(m_dDashOffset);
pRenderer->PenDashPattern((double*)m_arDashPattern.data(), m_arDashPattern.size());
}
}
}

View File

@ -0,0 +1,39 @@
#ifndef PENSETTINGS_H
#define PENSETTINGS_H
#include "../Utils/XmlReader.h"
#include "../../../DesktopEditor/graphics/IRenderer.h"
namespace OFD
{
class CPenSettings
{
double m_dLineWidth;
enum class ECap
{
Butt,
Round,
Square
} m_eCap;
enum class EJoin
{
Miter,
Round,
Bevel
} m_eJoin;
double m_dMiterLimit;
double m_dDashOffset;
std::vector<double> m_arDashPattern;
unsigned char m_uchAlpha;
public:
CPenSettings(CXmlReader& oLiteReader);
void Apply(IRenderer* pRenderer) const;
};
}
#endif // PENSETTINGS_H

View File

@ -9,7 +9,7 @@ enum class EZOrder
{ {
Body, Body,
Background Background
} ; };
EZOrder GetZOrderFromString(const std::string& sValue); EZOrder GetZOrderFromString(const std::string& sValue);