Brush offset, brush scale, tile flip

This commit is contained in:
Svetlana Kulikova
2025-12-25 14:26:35 +03:00
parent 1237991ffb
commit 3839ab4c15
8 changed files with 127 additions and 13 deletions

View File

@ -955,6 +955,30 @@ HRESULT CPdfFile::put_BrushTransform(const Aggplus::CMatrix& oMatrix)
return S_FALSE;
return m_pInternal->pWriter->put_BrushTransform(oMatrix);
}
HRESULT CPdfFile::get_BrushOffset(double& offsetX, double& offsetY) const
{
if (!m_pInternal->pWriter)
return S_FALSE;
return m_pInternal->pWriter->get_BrushOffset(offsetX, offsetY);
}
HRESULT CPdfFile::put_BrushOffset(const double& offsetX, const double& offsetY)
{
if (!m_pInternal->pWriter)
return S_FALSE;
return m_pInternal->pWriter->put_BrushOffset(offsetX, offsetY);
}
HRESULT CPdfFile::get_BrushScale(bool& isScale, double& scaleX, double& scaleY) const
{
if (!m_pInternal->pWriter)
return S_FALSE;
return m_pInternal->pWriter->get_BrushScale(isScale, scaleX, scaleY);
}
HRESULT CPdfFile::put_BrushScale(bool isScale, const double& scaleX, const double& scaleY)
{
if (!m_pInternal->pWriter)
return S_FALSE;
return m_pInternal->pWriter->put_BrushScale(isScale, scaleX, scaleY);
}
HRESULT CPdfFile::get_FontName(std::wstring* wsName)
{

View File

@ -236,6 +236,10 @@ public:
virtual HRESULT put_BrushTextureImage(Aggplus::CImage* pImage);
virtual HRESULT get_BrushTransform(Aggplus::CMatrix& oMatrix);
virtual HRESULT put_BrushTransform(const Aggplus::CMatrix& oMatrix);
virtual HRESULT get_BrushOffset(double& offsetX, double& offsetY) const;
virtual HRESULT put_BrushOffset(const double& offsetX, const double& offsetY);
virtual HRESULT get_BrushScale(bool& isScale, double& scaleX, double& scaleY) const;
virtual HRESULT put_BrushScale(bool isScale, const double& scaleX, const double& scaleY);
//----------------------------------------------------------------------------------------
// Функции для работы со шрифтами
//----------------------------------------------------------------------------------------

View File

@ -567,6 +567,26 @@ HRESULT CPdfWriter::put_BrushTransform(const Aggplus::CMatrix& oMatrix)
// TODO:
return S_OK;
}
HRESULT CPdfWriter::get_BrushOffset(double& offsetX, double& offsetY) const
{
m_oBrush.GetBrushOffset(offsetX, offsetY);
return S_OK;
}
HRESULT CPdfWriter::put_BrushOffset(const double& offsetX, const double& offsetY)
{
m_oBrush.SetBrushOffset(offsetX, offsetY);
return S_OK;
}
HRESULT CPdfWriter::get_BrushScale(bool& isScale, double& scaleX, double& scaleY) const
{
m_oBrush.GetBrushScale(isScale, scaleX, scaleY);
return S_OK;
}
HRESULT CPdfWriter::put_BrushScale(bool isScale, const double& scaleX, const double& scaleY)
{
m_oBrush.SetBrushScale(isScale, scaleX, scaleY);
return S_OK;
}
//----------------------------------------------------------------------------------------
// Функции для работы со шрифтами
//----------------------------------------------------------------------------------------
@ -3912,8 +3932,11 @@ void CPdfWriter::UpdateBrush(NSFonts::IApplicationFonts* pAppFonts, const std::w
}
else
{
dL = MM_2_PT(oRect.dLeft);
dB = MM_2_PT(m_dPageHeight - oRect.dTop);
double dOffsetX, dOffsetY;
m_oBrush.GetBrushOffset(dOffsetX, dOffsetY);
dL = MM_2_PT(oRect.dLeft + dOffsetX);
dB = MM_2_PT(m_dPageHeight - oRect.dTop - dOffsetY);
dR = MM_2_PT(oRect.dLeft + oRect.dWidth);
dT = MM_2_PT(m_dPageHeight - oRect.dTop - oRect.dHeight);
}
@ -3930,22 +3953,40 @@ void CPdfWriter::UpdateBrush(NSFonts::IApplicationFonts* pAppFonts, const std::w
dXStepSpacing = dW;
dYStepSpacing = dH;
}
else
else // Tile
{
// Размеры картинки заданы в пикселях. Размеры тайла - это размеры картинки в пунктах.
dW = (double)nImageW * 72.0 / 96.0;
dH = (double)nImageH * 72.0 / 96.0;
dT = dB;
bool isScale;
double scaleX, scaleY;
m_oBrush.GetBrushScale(isScale, scaleX, scaleY);
if (isScale)
{
dW *= scaleX;
dH *= scaleY;
}
}
PdfWriter::EImageTilePatternType ePatternType = PdfWriter::imagetilepatterntype_Default;
if (c_BrushTextureModeTileFlipX == lTextureMode)
ePatternType = PdfWriter::imagetilepatterntype_InverseX;
else if (c_BrushTextureModeTileFlipY == lTextureMode)
ePatternType = PdfWriter::imagetilepatterntype_InverseY;
else if (c_BrushTextureModeTileFlipXY == lTextureMode)
ePatternType = PdfWriter::imagetilepatterntype_InverseXY;
// Нам нужно, чтобы левый нижний угол границ нашего пата являлся точкой переноса для матрицы преобразования.
PdfWriter::CMatrix* pMatrix = m_pPage->GetTransform();
pMatrix->Apply(dL, dT);
PdfWriter::CMatrix oPatternMatrix = *pMatrix;
oPatternMatrix.x = dL;
oPatternMatrix.y = dT;
m_pPage->SetPatternColorSpace(m_pDocument->CreateImageTilePattern(dW, dH, pImage, &oPatternMatrix, PdfWriter::imagetilepatterntype_Default, dXStepSpacing, dYStepSpacing));
m_pPage->SetPatternColorSpace(m_pDocument->CreateImageTilePattern(dW, dH, pImage, &oPatternMatrix, ePatternType, dXStepSpacing, dYStepSpacing));
}
}
else if (c_BrushTypeHatch1 == lBrushType)

View File

@ -133,6 +133,10 @@ public:
HRESULT put_BrushTextureImage(Aggplus::CImage* pImage);
HRESULT get_BrushTransform(Aggplus::CMatrix& oMatrix);
HRESULT put_BrushTransform(const Aggplus::CMatrix& oMatrix);
HRESULT get_BrushOffset(double& offsetX, double& offsetY) const;
HRESULT put_BrushOffset(const double& offsetX, const double& offsetY);
HRESULT get_BrushScale(bool& isScale, double& scaleX, double& scaleY) const;
HRESULT put_BrushScale(bool isScale, const double& scaleX, const double& scaleY);
//----------------------------------------------------------------------------------------
// Функции для работы со шрифтами
//----------------------------------------------------------------------------------------

View File

@ -130,7 +130,9 @@ namespace PdfWriter
pStream->WriteReal(dW);
pStream->WriteStr(" 0 0 ");
pStream->WriteReal(dH);
pStream->WriteStr(" 0 0 cm\12");
pStream->WriteStr(" 0 ");
pStream->WriteReal(dH);
pStream->WriteStr(" cm\12");
pStream->WriteStr("/X1 Do\12");
pStream->WriteStr("Q\12");
@ -138,7 +140,7 @@ namespace PdfWriter
pStream->WriteStr(" 0 0 ");
pStream->WriteReal(-dH);
pStream->WriteStr(" 0 ");
pStream->WriteReal(2 * dH);
pStream->WriteReal(dH);
pStream->WriteStr(" cm\12");
pStream->WriteStr("/X1 Do\12");
}
@ -152,7 +154,9 @@ namespace PdfWriter
pStream->WriteReal(dW);
pStream->WriteStr(" 0 0 ");
pStream->WriteReal(dH);
pStream->WriteStr(" 0 0 cm\12");
pStream->WriteStr(" 0 ");
pStream->WriteReal(dH);
pStream->WriteStr(" cm\12");
pStream->WriteStr("/X1 Do\12");
pStream->WriteStr("Q\12");
@ -161,7 +165,7 @@ namespace PdfWriter
pStream->WriteStr(" 0 0 ");
pStream->WriteReal(-dH);
pStream->WriteStr(" 0 ");
pStream->WriteReal(2 * dH);
pStream->WriteReal(dH);
pStream->WriteStr(" cm\12");
pStream->WriteStr("/X1 Do\12");
pStream->WriteStr("Q\12");
@ -172,7 +176,9 @@ namespace PdfWriter
pStream->WriteReal(dH);
pStream->WriteStr(" ");
pStream->WriteReal(2 * dW);
pStream->WriteStr(" 0 cm\12");
pStream->WriteStr(" ");
pStream->WriteReal(dH);
pStream->WriteStr(" cm\12");
pStream->WriteStr("/X1 Do\12");
pStream->WriteStr("Q\12");
@ -182,7 +188,7 @@ namespace PdfWriter
pStream->WriteStr(" ");
pStream->WriteReal(2 * dW);
pStream->WriteStr(" ");
pStream->WriteReal(2 * dH);
pStream->WriteReal(dH);
pStream->WriteStr(" cm\12");
pStream->WriteStr("/X1 Do\12");
}

View File

@ -925,4 +925,10 @@ void CBrushState::Reset()
m_pShadingColors = NULL;
m_pShadingPoints = NULL;
m_lShadingPointsCount = 0;
m_bIsScale = false;
m_dScaleX = 1.0;
m_dScaleY = 1.0;
m_dOffsetX = 0.0;
m_dOffsetY = 0.0;
}

View File

@ -1060,6 +1060,29 @@ public:
lCount = m_lShadingPointsCount;
}
inline void GetBrushScale(bool& isScale, double& scaleX, double& scaleY) const
{
isScale = m_bIsScale;
scaleX = m_dScaleX;
scaleY = m_dScaleY;
}
inline void SetBrushScale(bool isScale, const double& scaleX, const double& scaleY)
{
m_bIsScale = isScale;
m_dScaleX = scaleX;
m_dScaleY = scaleY;
}
inline void GetBrushOffset(double& offsetX, double& offsetY) const
{
offsetX = m_dOffsetX;
offsetY = m_dOffsetY;
}
inline void SetBrushOffset(const double& offsetX, const double& offsetY)
{
m_dOffsetX = offsetX;
m_dOffsetY = offsetY;
}
inline double* GetDColor2(int& nSize)
{
nSize = m_nColor2Size;
@ -1092,6 +1115,12 @@ private:
LONG m_lShadingPointsCount;
double m_pShadingPattern[6]; // У линейного градиента x0, y0, x1, y1 (2 не используются), у радиального x0, y0, r0, x1, y1, r1
bool m_bIsScale;
double m_dScaleX;
double m_dScaleY;
double m_dOffsetX;
double m_dOffsetY;
double m_dColor2[4];
int m_nColor2Size;
};

View File

@ -340,9 +340,9 @@ TEST_F(CPdfFileTest, ConvertToRaster)
}
}
TEST_F(CPdfFileTest, ConvertToRasterBase64)
TEST_F(CPdfFileTest, Base64ConvertToRaster)
{
//GTEST_SKIP();
GTEST_SKIP();
// чтение и конвертации бинарника
NSFile::CFileBinary oFile;
@ -494,7 +494,7 @@ TEST_F(CPdfFileTest, EditPdf)
TEST_F(CPdfFileTest, EditPdfFromBase64)
{
GTEST_SKIP();
//GTEST_SKIP();
NSFonts::NSApplicationFontStream::SetGlobalMemoryStorage(NSFonts::NSApplicationFontStream::CreateDefaultGlobalMemoryStorage());