mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 14:00:32 +08:00
315 lines
7.9 KiB
C++
315 lines
7.9 KiB
C++
#pragma once
|
||
//#include "Const.h"
|
||
|
||
#include "SVGWriter.h"
|
||
#include "VMLWriter.h"
|
||
//#include "CanvasWriter.h"
|
||
#include "../../DesktopEditor/graphics/GraphicsPath.h"
|
||
|
||
namespace NSHtmlRenderer
|
||
{
|
||
class CVectorGraphicsWriter
|
||
{
|
||
public:
|
||
CSVGWriter m_oSVG;
|
||
CVMLWriter m_oVML;
|
||
//CCanvasWriter m_oCanvas;
|
||
|
||
Aggplus::CGraphicsPathSimpleConverter* m_pSimpleConverter;
|
||
|
||
NSStructures::CPen* m_pPen;
|
||
NSStructures::CBrush* m_pBrush;
|
||
|
||
Aggplus::CMatrix* m_pFullTransform;
|
||
|
||
LONG m_lCurrentObjectInPage;
|
||
|
||
LONG m_lCurrentPageNumber;
|
||
double m_dWidth;
|
||
double m_dHeight;
|
||
|
||
public:
|
||
CVectorGraphicsWriter() : m_oSVG(), m_oVML()/*, m_oCanvas()*/
|
||
{
|
||
m_pSimpleConverter = NULL;
|
||
m_lCurrentObjectInPage = 0;
|
||
}
|
||
~CVectorGraphicsWriter()
|
||
{
|
||
}
|
||
|
||
void SetSettings(NSStructures::CPen* pPen, NSStructures::CBrush* pBrush, Aggplus::CGraphicsPathSimpleConverter* pSimpleConverter)
|
||
{
|
||
m_pPen = pPen;
|
||
m_pBrush = pBrush;
|
||
m_pSimpleConverter = pSimpleConverter;
|
||
|
||
m_oSVG.SetSettings(m_pPen, m_pBrush);
|
||
m_oVML.SetSettings(m_pPen, m_pBrush);
|
||
//m_oCanvas.SetSettings(m_pPen, m_pBrush, m_pSimpleConverter);
|
||
}
|
||
|
||
|
||
inline void NewPage(double& dW, double& dH, const LONG& lPageNumber)
|
||
{
|
||
m_lCurrentPageNumber = lPageNumber;
|
||
m_dWidth = dW;
|
||
m_dHeight = dH;
|
||
|
||
m_oSVG.NewDocument(m_dWidth, m_dHeight, m_lCurrentPageNumber);
|
||
m_oVML.NewDocument(m_dWidth, m_dHeight, m_lCurrentPageNumber);
|
||
}
|
||
inline void EndPage()
|
||
{
|
||
m_oSVG.CloseFile();
|
||
m_oVML.CloseFile();
|
||
//m_oCanvas.CloseFile();
|
||
|
||
m_lCurrentObjectInPage = 0;
|
||
}
|
||
|
||
inline void WriteEndPath()
|
||
{
|
||
m_oSVG.WritePathEnd();
|
||
m_oVML.WritePathEnd();
|
||
//m_oCanvas.WritePathEnd();
|
||
}
|
||
|
||
inline void WritePathStart()
|
||
{
|
||
m_oSVG.WritePathStart();
|
||
m_oVML.WritePathStart();
|
||
//m_oCanvas.WritePathStart();
|
||
}
|
||
inline void WritePathClose()
|
||
{
|
||
m_oSVG.WritePathClose();
|
||
m_oVML.WritePathClose();
|
||
//m_oCanvas.WritePathClose();
|
||
}
|
||
|
||
inline void WritePathMoveTo(double& x, double& y)
|
||
{
|
||
m_oSVG.WritePathMoveTo(x, y);
|
||
m_oVML.WritePathMoveTo(x, y);
|
||
//m_oCanvas.WritePathMoveTo(x,y);
|
||
}
|
||
inline void WritePathLineTo(double& x, double& y)
|
||
{
|
||
m_oSVG.WritePathLineTo(x, y);
|
||
m_oVML.WritePathLineTo(x, y);
|
||
//m_oCanvas.WritePathLineTo(x, y);
|
||
}
|
||
inline void WritePathCurveTo(double& x1, double& y1, double& x2, double& y2, double& x3, double& y3)
|
||
{
|
||
m_oSVG.WritePathCurveTo(x1, y1, x2, y2, x3, y3);
|
||
m_oVML.WritePathCurveTo(x1, y1, x2, y2, x3, y3);
|
||
//m_oCanvas.WritePathCurveTo(x1, y1, x2, y2, x3, y3);
|
||
}
|
||
inline void WriteDrawPath(LONG lType, CImageInfo& oInfo, const double& dAngle)
|
||
{
|
||
// вот мега заглушка под некоторые таблицы из pdf
|
||
// проблема в том, что приходит path нулевой толщины - а след-но он не рисуется.
|
||
// здесь это отслеживаем и правим пат. Не очень хорошо, так как всякие пунктирности
|
||
// в таких патах - теряются при таком подходе
|
||
if (0x00 == (lType & 0xFF))
|
||
{
|
||
double x = 0;
|
||
double y = 0;
|
||
double r = 0;
|
||
double b = 0;
|
||
m_pSimpleConverter->PathCommandGetBounds(x, y, r, b);
|
||
|
||
r += x;
|
||
b += y;
|
||
|
||
if ((fabs(r - x) < 0.5) || (fabs(b - y) < 0.5))
|
||
{
|
||
m_pFullTransform->TransformPoint(x, y);
|
||
m_pFullTransform->TransformPoint(r, b);
|
||
|
||
int _x = round(x);
|
||
int _y = round(y);
|
||
int _r = round(r);
|
||
int _b = round(b);
|
||
|
||
if ((_x == _r) || (_y == _b))
|
||
{
|
||
LONG lPenColor = m_pPen->Color;
|
||
LONG lPenAlpha = m_pPen->Alpha;
|
||
double dPenW = m_pPen->Size;
|
||
|
||
m_pPen->Color = m_pBrush->Color1;
|
||
m_pPen->Alpha = m_pBrush->Alpha1;
|
||
m_pPen->Size = c_ag_1pxWidth;
|
||
|
||
WriteEndPath();
|
||
WritePathStart();
|
||
WritePathMoveTo(x, y);
|
||
WritePathLineTo(r, b);
|
||
|
||
WriteDrawPath(0x01, oInfo, dAngle);
|
||
|
||
m_pPen->Color = lPenColor;
|
||
m_pPen->Alpha = lPenAlpha;
|
||
m_pPen->Size = dPenW;
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
|
||
m_oSVG.WriteDrawPath(lType, m_pFullTransform, m_pSimpleConverter, oInfo, dAngle);
|
||
m_oVML.WriteDrawPath(lType, m_pFullTransform, m_pSimpleConverter, oInfo, dAngle);
|
||
|
||
m_pSimpleConverter->PathCommandEnd();
|
||
//m_oCanvas.WriteDrawPath(lType, m_pFullTransform, m_pSimpleConverter, lIdTx);
|
||
}
|
||
|
||
inline void WritePathClip()
|
||
{
|
||
m_oSVG.WritePathClip();
|
||
m_oVML.WritePathClip();
|
||
//m_oCanvas.WritePathClip();
|
||
}
|
||
inline void WritePathClipEnd()
|
||
{
|
||
m_oSVG.WritePathClipEnd();
|
||
m_oVML.WritePathClipEnd();
|
||
//m_oCanvas.WritePathClipEnd();
|
||
}
|
||
inline void SetClipMode(LONG lClipMode)
|
||
{
|
||
m_oSVG.m_lClipMode = lClipMode;
|
||
m_oVML.m_lClipMode = lClipMode;
|
||
}
|
||
inline void WriteImage(double& x, double& y, double& width, double& height, CImageInfo& oInfo, double dAngle)
|
||
{
|
||
m_oSVG.WriteImage(oInfo, x, y, width, height, dAngle);
|
||
m_oVML.WriteImage(oInfo, x, y, width, height, dAngle);
|
||
}
|
||
inline void WritePathResetClip()
|
||
{
|
||
m_oSVG.WritePathResetClip();
|
||
m_oVML.WritePathResetClip();
|
||
//m_oCanvas.WritePathResetClip();
|
||
}
|
||
|
||
inline bool IsGraphics()
|
||
{
|
||
// 10 цифр на номер страницы
|
||
return ((g_vml_string_document.GetLength() + 10) < (int)m_oVML.m_oDocument.GetCurSize());
|
||
}
|
||
|
||
inline void WriteToDocument(CStringWriter* pDocument, const CDstInfo& oInfo)
|
||
{
|
||
m_oSVG.WriteToMainHtml_1(pDocument, oInfo);
|
||
m_oVML.WriteToMainHtml(pDocument, oInfo);
|
||
m_oSVG.WriteToMainHtml_2(pDocument);
|
||
}
|
||
};
|
||
|
||
class CSVGGraphicsWriter
|
||
{
|
||
public:
|
||
CSVGWriter m_oSVG;
|
||
Aggplus::CGraphicsPathSimpleConverter* m_pSimpleConverter;
|
||
|
||
NSStructures::CPen* m_pPen;
|
||
NSStructures::CBrush* m_pBrush;
|
||
|
||
Aggplus::CMatrix* m_pFullTransform;
|
||
|
||
double m_dWidth;
|
||
double m_dHeight;
|
||
|
||
public:
|
||
CSVGGraphicsWriter() : m_oSVG()
|
||
{
|
||
m_pSimpleConverter = NULL;
|
||
}
|
||
~CSVGGraphicsWriter()
|
||
{
|
||
}
|
||
|
||
void SetSettings(NSStructures::CPen* pPen, NSStructures::CBrush* pBrush, Aggplus::CGraphicsPathSimpleConverter* pSimpleConverter)
|
||
{
|
||
m_pPen = pPen;
|
||
m_pBrush = pBrush;
|
||
m_pSimpleConverter = pSimpleConverter;
|
||
|
||
m_oSVG.SetSettings(m_pPen, m_pBrush);
|
||
}
|
||
|
||
|
||
inline void NewPage(double& dW, double& dH)
|
||
{
|
||
m_dWidth = dW;
|
||
m_dHeight = dH;
|
||
}
|
||
inline void EndPage()
|
||
{
|
||
m_oSVG.CloseFile();
|
||
}
|
||
|
||
inline void WriteEndPath()
|
||
{
|
||
m_oSVG.WritePathEnd();
|
||
}
|
||
|
||
inline void WritePathStart()
|
||
{
|
||
m_oSVG.WritePathStart();
|
||
}
|
||
inline void WritePathClose()
|
||
{
|
||
m_oSVG.WritePathClose();
|
||
}
|
||
|
||
inline void WritePathMoveTo(double& x, double& y)
|
||
{
|
||
m_oSVG.WritePathMoveTo(x, y);
|
||
}
|
||
inline void WritePathLineTo(double& x, double& y)
|
||
{
|
||
m_oSVG.WritePathLineTo(x, y);
|
||
}
|
||
inline void WritePathCurveTo(double& x1, double& y1, double& x2, double& y2, double& x3, double& y3)
|
||
{
|
||
m_oSVG.WritePathCurveTo(x1, y1, x2, y2, x3, y3);
|
||
}
|
||
inline void WriteDrawPath(LONG lType)
|
||
{
|
||
CImageInfo oInfo;
|
||
m_oSVG.WriteDrawPath(lType, m_pFullTransform, m_pSimpleConverter, oInfo, 0.0);
|
||
m_pSimpleConverter->PathCommandEnd();
|
||
}
|
||
|
||
inline void WritePathClip()
|
||
{
|
||
m_oSVG.WritePathClip();
|
||
}
|
||
inline void WritePathClipEnd()
|
||
{
|
||
m_oSVG.WritePathClipEnd();
|
||
}
|
||
inline void SetClipMode(LONG lClipMode)
|
||
{
|
||
m_oSVG.m_lClipMode = lClipMode;
|
||
}
|
||
inline void WriteImage(double& x, double& y, double& width, double& height, CImageInfo& oInfo, double dAngle)
|
||
{
|
||
m_oSVG.WriteImage(oInfo, x, y, width, height, dAngle);
|
||
}
|
||
inline void WritePathResetClip()
|
||
{
|
||
m_oSVG.WritePathResetClip();
|
||
}
|
||
|
||
inline bool IsGraphics()
|
||
{
|
||
// 10 цифр на номер страницы
|
||
return ((g_vml_string_document.GetLength() + 10) < (int)m_oSVG.m_oDocument.GetCurSize());
|
||
}
|
||
};
|
||
}
|