Fix scale tile texture

This commit is contained in:
Prokhorov Kirill
2025-11-18 10:12:59 +03:00
parent 200c17ee40
commit 0019f589bc
8 changed files with 59 additions and 20 deletions

View File

@ -419,6 +419,7 @@ namespace Aggplus
m_bReleaseImage = FALSE;
Alpha = 255;
m_bUseBounds = false;
m_bIsScale = false;
}
CBrushTexture::CBrushTexture(const std::wstring& strName, WrapMode wrapMode) : CBrush(BrushTypeTextureFill), m_wrapMode(wrapMode)
@ -427,6 +428,7 @@ namespace Aggplus
m_bReleaseImage = TRUE;
Alpha = 255;
m_bUseBounds = false;
m_bIsScale = false;
}
CBrushTexture::CBrushTexture(CImage *pImage, WrapMode wrapMode) : CBrush(BrushTypeTextureFill), m_wrapMode(wrapMode)
@ -435,6 +437,7 @@ namespace Aggplus
m_bReleaseImage = FALSE;
Alpha = 255;
m_bUseBounds = false;
m_bIsScale = false;
}
CBrushTexture::~CBrushTexture()

View File

@ -205,6 +205,10 @@ public:
bool m_bUseBounds;
CDoubleRect m_oBounds;
bool m_bIsScale;
double m_dScaleX;
double m_dScaleY;
BYTE Alpha;
};
}

View File

@ -847,7 +847,8 @@ namespace Aggplus
double dScaleY = m_dDpiY / m_dDpiTile;
brushMatrix.Scale(dScaleX, dScaleY, Aggplus::MatrixOrderAppend);
brushMatrix.Scale(r - x, b - y, Aggplus::MatrixOrderAppend);
if (ptxBrush->m_bIsScale)
brushMatrix.Scale(ptxBrush->m_dScaleX, ptxBrush->m_dScaleY, Aggplus::MatrixOrderAppend);
}
brushMatrix.Translate(x, y, Aggplus::MatrixOrderAppend);

View File

@ -613,6 +613,20 @@ HRESULT CGraphicsRenderer::put_BrushTransform(const Aggplus::CMatrix& oMatrix)
m_oBrush.Transform = oMatrix;
return S_OK;
}
HRESULT CGraphicsRenderer::get_BrushScale(bool& isScale, double& scaleX, double& scaleY) const
{
isScale = m_oBrush.IsScale;
scaleX = m_oBrush.ScaleX;
scaleY = m_oBrush.ScaleY;
return S_OK;
}
HRESULT CGraphicsRenderer::put_BrushScale(bool isScale, const double& scaleX, const double& scaleY)
{
m_oBrush.IsScale = isScale;
m_oBrush.ScaleX = scaleX;
m_oBrush.ScaleY = scaleY;
return S_OK;
}
HRESULT CGraphicsRenderer::BrushRect(const INT& val, const double& left, const double& top, const double& width, const double& height)
{
m_oBrush.Rectable = val;
@ -1041,6 +1055,13 @@ HRESULT CGraphicsRenderer::DrawPath(const LONG& nType)
pTextureBrush->m_oBounds.right = pTextureBrush->m_oBounds.left + m_oBrush.Rect.Width;
pTextureBrush->m_oBounds.bottom = pTextureBrush->m_oBounds.top + m_oBrush.Rect.Height;
}
if (m_oBrush.IsScale == 1)
{
pTextureBrush->m_bIsScale = true;
pTextureBrush->m_dScaleX = m_oBrush.ScaleX;
pTextureBrush->m_dScaleY = m_oBrush.ScaleY;
}
}
pBrush = pTextureBrush;

View File

@ -189,6 +189,8 @@ public:
virtual HRESULT put_BrushLinearAngle(const double& dAngle);
virtual HRESULT get_BrushTransform(Aggplus::CMatrix& oMatrix);
virtual HRESULT put_BrushTransform(const Aggplus::CMatrix& oMatrix);
virtual HRESULT get_BrushScale(bool& isScale, double& scaleX, double& scaleY) const;
virtual HRESULT put_BrushScale(bool isScale, const double& scaleX, const double& scaleY);
virtual HRESULT BrushRect(const INT& val, const double& left, const double& top, const double& width, const double& height);
virtual HRESULT get_BrushRect(Aggplus::RectF& rect, bool& rectable) const;
virtual HRESULT BrushBounds(const double& left, const double& top, const double& width, const double& height);

View File

@ -242,6 +242,8 @@ public:
virtual HRESULT put_BrushTransform(const Aggplus::CMatrix& oMatrix) = 0;
virtual HRESULT get_BrushLinearAngle(double* dAngle) = 0;
virtual HRESULT put_BrushLinearAngle(const double& dAngle) = 0;
virtual HRESULT get_BrushScale(bool& isScale, double& scaleX, double& scaleY) const = 0;
virtual HRESULT put_BrushScale(bool isScale, const double& scaleX, const double& scaleY) = 0;
virtual HRESULT BrushRect(const INT& val, const double& left, const double& top, const double& width, const double& height) = 0;
virtual HRESULT get_BrushRect(Aggplus::RectF& rect, bool& rectable) const = 0;
virtual HRESULT BrushBounds(const double& left, const double& top, const double& width, const double& height) = 0;

View File

@ -356,7 +356,6 @@ namespace NSOnlineOfficeBinToPdf
CBufferReader oReader(pBuffer, lBufferLen);
Aggplus::CGraphicsPath path;
Aggplus::CMatrix transMatrSc;
Aggplus::CMatrix transMatrRot;
Aggplus::RectF clipRect;
bool isClose = false;
@ -714,21 +713,7 @@ namespace NSOnlineOfficeBinToPdf
double m1 = oReader.ReadDouble();
double m2 = oReader.ReadDouble();
Aggplus::RectF rect;
bool rectable;
pRenderer->get_BrushRect(rect, rectable);
if (rectable)
{
rect.Scale(m1, m2);
pRenderer->BrushRect(true, rect.X, rect.Y, rect.Width, rect.Height);
}
LONG type;
pRenderer->get_BrushTextureMode(&type);
if (type == c_BrushTextureModeStretch)
transMatrSc.Scale(m1, m2);
else if (rectable)
pRenderer->BrushRect(true, rect.X, rect.Y, m1, m2);
pRenderer->put_BrushScale(true, m1, m2);
break;
}
case ctDrawPath:
@ -736,11 +721,21 @@ namespace NSOnlineOfficeBinToPdf
if (isTexture)
{
Aggplus::CGraphicsPath clipPath;
Aggplus::CGraphicsPath drawPath;
clipPath.AddRectangle(clipRect.X, clipRect.Y, clipRect.Width, clipRect.Height);
clipPath.Transform(&transMatrSc);
clipPath.Transform(&transMatrRot);
path = Aggplus::CalcBooleanOperation(path, clipPath, Aggplus::Intersection);
if (!transMatrRot.IsIdentity())
{
double left, top, width, height;
clipPath.GetBounds(left, top, width, height);
pRenderer->BrushRect(true, left, top, width, height);
drawPath.AddRectangle(left, top, width, height);
}
else
drawPath = path;
path = Aggplus::CalcBooleanOperation(drawPath, clipPath, Aggplus::Intersection);
isTexture = false;
}
@ -759,7 +754,6 @@ namespace NSOnlineOfficeBinToPdf
path.Reset();
transMatrRot.Reset();
transMatrSc.Reset();
break;
}
case ctDrawImageFromFile:

View File

@ -287,6 +287,10 @@ namespace NSStructures
Aggplus::RectF Rect;
Aggplus::CDoubleRect Bounds;
int IsScale;
double ScaleX;
double ScaleY;
double LinearAngle;
std::vector<TSubColor> m_arrSubColors;
NSStructures::GradientInfo m_oGradientInfo;
@ -418,6 +422,10 @@ namespace NSStructures
Rect.Width = 0.0F;
Rect.Height = 0.0F;
IsScale = FALSE;
ScaleX = 1.0;
ScaleY = 1.0;
Bounds.left = 0;
Bounds.top = 0;
Bounds.right = 0;
@ -457,6 +465,10 @@ namespace NSStructures
Rect = other.Rect;
Bounds = other.Bounds;
IsScale = other.IsScale;
ScaleX = other.ScaleX;
ScaleY = other.ScaleY;
LinearAngle = other.LinearAngle;
m_arrSubColors = other.m_arrSubColors;
m_oGradientInfo = other.m_oGradientInfo;