Compare commits

...

4 Commits

7 changed files with 57 additions and 8 deletions

View File

@ -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;
}
//------------------------------------------------------------------------------------------

View File

@ -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,

View File

@ -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,

View File

@ -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);

View File

@ -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;

View File

@ -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,45 @@ namespace NSDocxRenderer
}
}
}
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;

View File

@ -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);