mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-02-10 18:05:41 +08:00
Merge pull request 'Fix flipY in tiles' (#651) from fix/docx-renderer into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/651
This commit is contained in:
@ -648,11 +648,15 @@ namespace NSDocxRenderer
|
||||
if ((nType > 0xFF) && (c_BrushTypeTexture == m_oCurrentPage.m_oBrush.Type))
|
||||
{
|
||||
double x = 0, y = 0, w = 0, h = 0;
|
||||
if (m_oCurrentPage.IsCurrVectorClockwise())
|
||||
h = -1; // to flip image later
|
||||
|
||||
if (m_oCurrentPage.m_oBrush.Image)
|
||||
pInfo = m_oImageManager.WriteImage(m_oCurrentPage.m_oBrush.Image, x, y, w, h);
|
||||
else
|
||||
pInfo = m_oImageManager.WriteImage(m_oCurrentPage.m_oBrush.TexturePath, x, y, w, h);
|
||||
pInfo = m_oImageManager.WriteImage(m_oCurrentPage.m_oBrush.TexturePath);
|
||||
}
|
||||
|
||||
m_oCurrentPage.DrawPath(nType, pInfo);
|
||||
return S_OK;
|
||||
}
|
||||
@ -712,7 +716,7 @@ namespace NSDocxRenderer
|
||||
}
|
||||
HRESULT CDocument::DrawImageFromFile(const std::wstring& sVal, double fX, double fY, double fWidth, double fHeight)
|
||||
{
|
||||
m_oCurrentPage.WriteImage(m_oImageManager.WriteImage(sVal, fX, fY, fWidth, fHeight), fX, fY, fWidth, fHeight);
|
||||
m_oCurrentPage.WriteImage(m_oImageManager.WriteImage(sVal), fX, fY, fWidth, fHeight);
|
||||
return S_OK;
|
||||
}
|
||||
//------------------------------------------------------------------------------------------
|
||||
|
||||
@ -277,6 +277,10 @@ namespace NSDocxRenderer
|
||||
m_arShapes.push_back(shape);
|
||||
}
|
||||
}
|
||||
bool CPage::IsCurrVectorClockwise() const
|
||||
{
|
||||
return m_oCurrVectorGraphics.IsClockwise();
|
||||
}
|
||||
|
||||
void CPage::AddText(
|
||||
const PUINT pUnicodes,
|
||||
|
||||
@ -68,6 +68,7 @@ namespace NSDocxRenderer
|
||||
void PathEnd();
|
||||
void PathClose();
|
||||
void DrawPath(LONG lType, const std::shared_ptr<CImageInfo> pInfo);
|
||||
bool IsCurrVectorClockwise() const;
|
||||
|
||||
void AddText(
|
||||
const PUINT pUnicodes,
|
||||
|
||||
@ -147,7 +147,7 @@ namespace NSDocxRenderer
|
||||
return GenerateImageID(pImage);
|
||||
}
|
||||
|
||||
std::shared_ptr<CImageInfo> CImageManager::WriteImage(const std::wstring& strFile, double& x, double& y, double& width, double& height)
|
||||
std::shared_ptr<CImageInfo> CImageManager::WriteImage(const std::wstring& strFile)
|
||||
{
|
||||
Aggplus::CImage image(strFile);
|
||||
return GenerateImageID(&image);
|
||||
|
||||
@ -20,14 +20,14 @@ namespace NSDocxRenderer
|
||||
void Clear();
|
||||
|
||||
std::shared_ptr<CImageInfo> WriteImage(Aggplus::CImage* pImage, double& x, double& y, double& width, double& height);
|
||||
std::shared_ptr<CImageInfo> WriteImage(const std::wstring& strFile, double& x, double& y, double& width, double& height);
|
||||
std::shared_ptr<CImageInfo> WriteImage(const std::wstring& strFile);
|
||||
std::shared_ptr<CImageInfo> GenerateImageID(Aggplus::CImage* pImage);
|
||||
|
||||
static CImageInfo::ImageType GetImageType(Aggplus::CImage* pFrame);
|
||||
static void FlipY(Aggplus::CImage* pImage);
|
||||
|
||||
private:
|
||||
std::shared_ptr<CImageInfo> GenerateImageID(const std::wstring& strFileName);
|
||||
void FlipY(Aggplus::CImage* pImage);
|
||||
|
||||
int m_lMaxSizeImage {1200};
|
||||
int m_lNextIDImage {0};
|
||||
CCalculatorCRC32 m_oCRC;
|
||||
|
||||
@ -195,7 +195,7 @@ namespace NSDocxRenderer
|
||||
double x0 = m_arData.back().points.back().x;
|
||||
double y0 = m_arData.back().points.back().y;
|
||||
|
||||
std::list<Point> points = {{x1, y1}, {x2, y2}, {x3, y3}};
|
||||
std::vector<Point> points = {{x1, y1}, {x2, y2}, {x3, y3}};
|
||||
ePathCommandType type = ePathCommandType::pctCurve;
|
||||
m_arData.push_back({type, points});
|
||||
|
||||
@ -308,6 +308,48 @@ namespace NSDocxRenderer
|
||||
}
|
||||
}
|
||||
}
|
||||
void CVectorGraphics::Reverse()
|
||||
{
|
||||
}
|
||||
bool CVectorGraphics::IsClockwise() const
|
||||
{
|
||||
if (m_arData.empty())
|
||||
return false;
|
||||
|
||||
double area = 0;
|
||||
double last_x = 0;
|
||||
double last_y = 0;
|
||||
bool is_first = true;
|
||||
for (const auto& command : m_arData)
|
||||
{
|
||||
if (is_first)
|
||||
{
|
||||
is_first = false;
|
||||
last_x = command.points.back().x;
|
||||
last_y = command.points.back().y;
|
||||
continue;
|
||||
}
|
||||
if (command.type == ePathCommandType::pctClose)
|
||||
break;
|
||||
|
||||
const auto& points = command.points;
|
||||
if (command.type == ePathCommandType::pctCurve)
|
||||
{
|
||||
area += 3.0 * ((points[2].y - last_y) * (points[0].x + points[1].x)
|
||||
- (points[2].x - last_x) * (points[0].y + points[1].y)
|
||||
+ points[0].y * (last_x - points[1].x)
|
||||
- points[0].x * (last_y - points[1].y)
|
||||
+ points[2].y * (points[1].x + last_x / 3.0)
|
||||
- points[2].x * (points[1].y + last_y / 3.0)) / 20.0;
|
||||
}
|
||||
else
|
||||
area += (points[0].y * last_x - points[0].x * last_y) / 2.0;
|
||||
|
||||
last_x = command.points.back().x;
|
||||
last_y = command.points.back().y;
|
||||
}
|
||||
return area >= 0;
|
||||
}
|
||||
|
||||
// ClipRegionTypeWinding = 0x0000;
|
||||
// ClipRegionTypeEvenOdd = 0x0001;
|
||||
|
||||
@ -31,7 +31,7 @@ namespace NSDocxRenderer
|
||||
struct CPathCommand
|
||||
{
|
||||
ePathCommandType type;
|
||||
std::list<Point> points;
|
||||
std::vector<Point> points;
|
||||
};
|
||||
|
||||
CVectorGraphics() noexcept;
|
||||
@ -79,6 +79,7 @@ namespace NSDocxRenderer
|
||||
void Rotate(const double& rotation);
|
||||
void Transform(const Aggplus::CMatrix& matrix);
|
||||
void DrawOnRenderer(IRenderer* renderer) const noexcept;
|
||||
bool IsClockwise() const;
|
||||
|
||||
static CVectorGraphics CalcBoolean(const CVectorGraphics& vg1, const CVectorGraphics& vg2, long clipType, long fillType = c_nWindingFillMode, bool isLuminosity = false);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user