mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 01:11:43 +08:00
269 lines
7.7 KiB
C++
269 lines
7.7 KiB
C++
#pragma once
|
||
|
||
#include <PaintStruct.h>
|
||
#include <ImageSerializeObjects.h>
|
||
|
||
namespace ImageStudio
|
||
{
|
||
namespace Paint
|
||
{
|
||
class CPaintState
|
||
{
|
||
public:
|
||
|
||
CPaintState()
|
||
{
|
||
m_dTextAngle = 0.0;
|
||
}
|
||
virtual ~CPaintState()
|
||
{
|
||
}
|
||
|
||
BOOL GetPenAntiAlias() const
|
||
{
|
||
return m_oFormat.GetAntiAliasPen();
|
||
}
|
||
BOOL GetBrushAntiAlias() const
|
||
{
|
||
return m_oFormat.GetAntiAliasBrush();
|
||
}
|
||
BOOL GetTextAntiAlias() const
|
||
{
|
||
return m_oFormat.GetAntiAliasText();
|
||
}
|
||
long GetStringAlignmentVertical() const
|
||
{
|
||
return m_oFormat.GetStringAlignmentVertical();
|
||
}
|
||
long GetStringAlignmentHorizontal() const
|
||
{
|
||
return m_oFormat.GetStringAlignmentHorizontal();
|
||
}
|
||
long GetImageAlphaMode() const
|
||
{
|
||
return m_oFormat.GetImageAlphaMode();
|
||
}
|
||
double GetTextAngle() const
|
||
{
|
||
return m_dTextAngle;
|
||
}
|
||
|
||
Painter::CPen& GetPen()
|
||
{
|
||
return m_oPen;
|
||
}
|
||
Painter::CBrush& GetBrush()
|
||
{
|
||
return m_oBrush;
|
||
}
|
||
Painter::CFont& GetFont()
|
||
{
|
||
return m_oFont;
|
||
}
|
||
Painter::CFormat& GetFormat()
|
||
{
|
||
return m_oFormat;
|
||
}
|
||
Painter::CShadow& GetShadow()
|
||
{
|
||
return m_oShadow;
|
||
}
|
||
Painter::CEdgeText& GetEdge()
|
||
{
|
||
return m_oEdge;
|
||
}
|
||
|
||
void SetPen(const Painter::CPen& oPen)
|
||
{
|
||
m_oPen.FromPen(oPen);
|
||
}
|
||
void SetPen(const ImageStudio::Serialize::Paint::Structures::Pen& oPen)
|
||
{
|
||
if (oPen.IsValidColor()) m_oPen.SetColor(oPen.GetColor());
|
||
if (oPen.IsValidAlpha()) m_oPen.SetAlpha(oPen.GetAlpha());
|
||
if (oPen.IsValidSize()) m_oPen.SetSize(oPen.GetSize());
|
||
if (oPen.IsValidAntiAliasPen()) m_oFormat.SetAntiAliasPen(oPen.GetAntiAliasPen());
|
||
|
||
m_oPen.SetAlignment( oPen.GetAlignment() );
|
||
}
|
||
virtual void SetBrush(const Painter::CBrush& oBrush)
|
||
{
|
||
m_oBrush.FromBrush(oBrush);
|
||
}
|
||
virtual void SetBrush(const ImageStudio::Serialize::Paint::Structures::Brush& oBrush)
|
||
{
|
||
if (oBrush.IsValidTexturePath()) m_oBrush.SetTexturePath(oBrush.GetTexturePath());
|
||
if (oBrush.IsValidTextureAlpha()) m_oBrush.SetTextureAlpha(oBrush.GetTextureAlpha());
|
||
if (oBrush.IsValidTextureMode()) m_oBrush.SetTextureMode(oBrush.GetTextureMode());
|
||
if (oBrush.IsValidColor1()) m_oBrush.SetColor1(oBrush.GetColor1());
|
||
if (oBrush.IsValidColor2()) m_oBrush.SetColor2(oBrush.GetColor2());
|
||
if (oBrush.IsValidAlpha1()) m_oBrush.SetAlpha1(oBrush.GetAlpha1());
|
||
if (oBrush.IsValidAlpha2()) m_oBrush.SetAlpha2(oBrush.GetAlpha2());
|
||
if (oBrush.IsValidGradientAngle()) m_oBrush.SetGradientAngle(oBrush.GetGradientAngle());
|
||
if (oBrush.IsValidType()) m_oBrush.SetType(oBrush.GetType());
|
||
|
||
if (oBrush.IsValidRectable() && oBrush.IsValidRect())
|
||
{
|
||
if (oBrush.GetRectable())
|
||
m_oBrush.SetRect(&oBrush.GetRect());
|
||
else
|
||
m_oBrush.SetRect(NULL);
|
||
}
|
||
}
|
||
void SetFont(const Painter::CFont& oFont)
|
||
{
|
||
m_oFont.FromFont(oFont);
|
||
}
|
||
void SetFont(const ImageStudio::Serialize::Paint::Structures::Font& oFont)
|
||
{
|
||
if (oFont.IsValidName()) m_oFont.SetName(oFont.GetName());
|
||
if (oFont.IsValidSize()) m_oFont.SetFontSize(oFont.GetSize());
|
||
if (oFont.IsValidBold()) m_oFont.SetBold(oFont.GetBold());
|
||
if (oFont.IsValidItalic()) m_oFont.SetItalic(oFont.GetItalic());
|
||
if (oFont.IsValidUnderline()) m_oFont.SetUnderline(oFont.GetUnderline());
|
||
if (oFont.IsValidStrikeout()) m_oFont.SetStrikeout(oFont.GetStrikeout());
|
||
if (oFont.IsValidAntiAliasText()) m_oFormat.SetAntiAliasText(oFont.GetAntiAliasText());
|
||
if (oFont.IsValidStringAlignmentVertical()) m_oFormat.SetStringAlignmentVertical(oFont.GetStringAlignmentVertical());
|
||
if (oFont.IsValidStringAlignmentHorizontal()) m_oFormat.SetStringAlignmentHorizontal(oFont.GetStringAlignmentHorizontal());
|
||
if (oFont.IsValidAngle()) m_dTextAngle = oFont.GetAngle();
|
||
}
|
||
void SetFormat(const Painter::CFormat& oFormat)
|
||
{
|
||
m_oFormat.FromFormat(oFormat);
|
||
}
|
||
void SetShadow(const Painter::CShadow& oShadow)
|
||
{
|
||
m_oShadow.FromShadow(oShadow);
|
||
}
|
||
void SetShadow(const ImageStudio::Serialize::Paint::Structures::Shadow& oShadow)
|
||
{
|
||
if (oShadow.IsValidVisible()) m_oShadow.SetVisible(oShadow.GetVisible());
|
||
if (oShadow.IsValidDistanceX()) m_oShadow.SetDistanceX(oShadow.GetDistanceX());
|
||
if (oShadow.IsValidDistanceY()) m_oShadow.SetDistanceY(oShadow.GetDistanceY());
|
||
if (oShadow.IsValidBlurSize()) m_oShadow.SetBlurSize(oShadow.GetBlurSize());
|
||
if (oShadow.IsValidColor()) m_oShadow.SetColor(oShadow.GetColor());
|
||
if (oShadow.IsValidAlpha()) m_oShadow.SetAlpha(oShadow.GetAlpha());
|
||
}
|
||
void SetEdge(const Painter::CEdgeText& oEdge)
|
||
{
|
||
m_oEdge.FromEdge(oEdge);
|
||
}
|
||
void SetEdge(const ImageStudio::Serialize::Paint::Structures::Edge& oEdge)
|
||
{
|
||
if (oEdge.IsValidVisible()) m_oEdge.SetVisible(oEdge.GetVisible());
|
||
if (oEdge.IsValidDist()) m_oEdge.SetDistance(oEdge.GetDist());
|
||
if (oEdge.IsValidColor()) m_oEdge.SetColor(oEdge.GetColor());
|
||
if (oEdge.IsValidAlpha()) m_oEdge.SetAlpha(oEdge.GetAlpha());
|
||
}
|
||
void SetTextAngle(double dTextAngle)
|
||
{
|
||
m_dTextAngle = dTextAngle;
|
||
}
|
||
|
||
void FromState(CPaintState& oState)
|
||
{
|
||
SetPen(oState.GetPen());
|
||
SetBrush(oState.GetBrush());
|
||
SetFont(oState.GetFont());
|
||
SetFormat(oState.GetFormat());
|
||
SetShadow(oState.GetShadow());
|
||
SetEdge(oState.GetEdge());
|
||
SetTextAngle(oState.GetTextAngle());
|
||
}
|
||
|
||
protected:
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
Painter::CPen m_oPen;
|
||
Painter::CBrush m_oBrush;
|
||
Painter::CFont m_oFont;
|
||
Painter::CFormat m_oFormat;
|
||
Painter::CShadow m_oShadow;
|
||
Painter::CEdgeText m_oEdge;
|
||
|
||
double m_dTextAngle; // <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, TODO: <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD> ?
|
||
};
|
||
class CPaintStateManager : public CPaintState
|
||
{
|
||
public:
|
||
|
||
CPaintStateManager()
|
||
{
|
||
}
|
||
virtual ~CPaintStateManager()
|
||
{
|
||
}
|
||
|
||
Painter::CTextureManager& GetTextureManager()
|
||
{
|
||
return m_oTextures;
|
||
}
|
||
|
||
virtual void SetBrush(const Painter::CBrush& oBrush, BOOL bVerticalFlip)
|
||
{
|
||
CPaintState::SetBrush(oBrush);
|
||
|
||
PreloadBrushTexture(bVerticalFlip);
|
||
}
|
||
virtual void SetBrush(const ImageStudio::Serialize::Paint::Structures::Brush& oBrush, BOOL bVerticalFlip)
|
||
{
|
||
CPaintState::SetBrush(oBrush);
|
||
|
||
PreloadBrushTexture(bVerticalFlip);
|
||
}
|
||
|
||
void SaveState()
|
||
{
|
||
CPaintState oState;
|
||
|
||
oState.FromState(*this);
|
||
|
||
m_arrStates.Add(oState);
|
||
}
|
||
void RestoreState()
|
||
{
|
||
if (m_arrStates.GetCount() < 0)
|
||
return;
|
||
|
||
FromState(m_arrStates[m_arrStates.GetCount() - 1]);
|
||
|
||
m_arrStates.RemoveAt(m_arrStates.GetCount() - 1);
|
||
}
|
||
|
||
protected:
|
||
|
||
void PreloadBrushTexture(BOOL bFlip)
|
||
{
|
||
if (GetBrush().GetType() == Painter::c_BrushTypeTexture)
|
||
{
|
||
int nTextureIndex = m_oTextures.Find(GetBrush().GetTexturePath());
|
||
|
||
if (nTextureIndex < 0)
|
||
m_oTextures.Add(GetBrush().GetTexturePath(), bFlip);
|
||
else
|
||
{
|
||
Painter::CTexture* pTexture = m_oTextures[nTextureIndex];
|
||
if( pTexture )
|
||
{
|
||
if( pTexture->bFlipVertical != bFlip )
|
||
{
|
||
if( pTexture->Bitmap )
|
||
pTexture->Bitmap->RotateFlip( Gdiplus::RotateNoneFlipY );
|
||
|
||
pTexture->bFlipVertical = bFlip;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
protected:
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
CAtlArray<CPaintState> m_arrStates;
|
||
|
||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||
Painter::CTextureManager m_oTextures;
|
||
};
|
||
}
|
||
} |