mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
Brush offset, brush scale, tile flip
This commit is contained in:
@ -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)
|
||||
{
|
||||
|
||||
@ -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);
|
||||
//----------------------------------------------------------------------------------------
|
||||
// Функции для работы со шрифтами
|
||||
//----------------------------------------------------------------------------------------
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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);
|
||||
//----------------------------------------------------------------------------------------
|
||||
// Функции для работы со шрифтами
|
||||
//----------------------------------------------------------------------------------------
|
||||
|
||||
@ -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");
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
@ -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());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user