Files
core/ASCHTMLRenderer/Writer/VMLWriter.h
Sergey.Konovalov 945d20bc48 откатились изменения с crossplatform до Revision: 59486 Date: 18:53:47, 6 ноября 2014 г.
revert revisions 59572, 59565, 59564, 59563, 59556, 59550, 59548, 59547, 59546, 59545, 59544, 59543, 59542, 59541, 59533, 59531, 59523, 59519, 59503, 59499, 59490.

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@59588 954022d7-b5bf-4e40-9824-e11837661b57
2016-05-20 23:33:23 +03:00

304 lines
9.5 KiB
C++

#pragma once
//#include "..\stdafx.h"
#include "StringWriter.h"
namespace NSHtmlRenderer
{
using namespace NSStrings;
static CString g_vml_bstr_ClosePath = L"x";
static CString g_vml_string_MoveTo = _T("m%d,%d ");
static CString g_vml_string_LineTo = _T("l%d,%d ");
static CString g_vml_string_CurveTo = _T("c%d,%d,%d,%d,%d,%d ");
static CString g_vml_string_shape_vml = _T("<v:shape style=\"position:absolute; width:1; height:1\" stroked=\"%s\" strokecolor=\"#%x\" filled=\"%s\" fillcolor=\"#%x\" path=\"%s\" />\n");
static CString g_vml_string_shape_vml_Dash = _T("<v:shape style=\"position:absolute; width:1; height:1\" stroked=\"%s\" strokecolor=\"#%x\" filled=\"%s\" fillcolor=\"#%x\" path=\"%s\"><v:stroke dashstyle=\"dot\"/></v:shape>\n");
static CString g_vml_string_shape_vmlTextureJPG = _T("<v:shape style=\"position:absolute; width:1; height:1\" stroked=\"%s\" strokecolor=\"#%x\" filled=\"%s\" path=\"%s\"><v:fill src=\"media/image%d.jpg\" type=\"frame\" opacity=\"%.2lf\"/></v:shape>\n");
static CString g_vml_string_shape_vmlTexturePNG = _T("<v:shape style=\"position:absolute; width:1; height:1\" stroked=\"%s\" strokecolor=\"#%x\" filled=\"%s\" path=\"%s\"><v:fill src=\"media/image%d.png\" type=\"frame\" opacity=\"%.2lf\"/></v:shape>\n");
static CString g_vml_string_shape_vmlAlpha = _T("<v:shape style=\"position:absolute; width:1; height:1\" stroked=\"%s\" strokecolor=\"#%x\" filled=\"%s\" fillcolor=\"#%x\" path=\"%s\"><v:fill opacity=\"%.2lf\"/></v:shape>\n");
static CString g_vml_string_shape_vmlAlphaDash = _T("<v:shape style=\"position:absolute; width:1; height:1\" stroked=\"%s\" strokecolor=\"#%x\" filled=\"%s\" fillcolor=\"#%x\" path=\"%s\"><v:fill opacity=\"%.2lf\"/><v:stroke dashstyle=\"dot\"/></v:shape>\n");
static CString g_vml_string_shape_image_jpg = _T("<v:image src=\"media/image%d.jpg\" style=\"left:%d;top:%d;width:%d;height:%d;\"/>");
static CString g_vml_string_shape_image_png = _T("<v:image src=\"media/image%d.png\" style=\"left:%d;top:%d;width:%d;height:%d;\"/>");
static CString g_vml_string_document = _T("<xml xmlns:v=\"urn:schemas-microsoft-com:vml\">\n<v:group id=\"page%d\" style=\"position: absolute; width:1; height:1;\" coordsize=\"1 1\">\n");
static CString g_vml_bstr_document_end = L"</v:group>\n</xml>";
static CString g_vml_string_frame = _T("<v:vmlframe clip=\"true\" origin=\"0,0\" size=\"%d,%d\" src=\"page%d.vml#page%d\" unselectable=\"on\"/>\n");
class CVMLWriter
{
public:
CStringWriter m_oPath;
CStringWriter m_oDocument;
LONG m_lCurDocumentID;
LONG m_lClippingPath;
bool m_bIsClipping;
LONG m_lClipMode;
bool m_bIsClippingNow;
NSStructures::CPen* m_pPen;
NSStructures::CBrush* m_pBrush;
double m_lWidth;
double m_lHeight;
double m_dDpiX;
double m_dDpiY;
public:
CVMLWriter() : m_oPath(), m_oDocument()
{
m_lCurDocumentID = 0;
m_lClippingPath = 0;
m_pPen = NULL;
m_pBrush = NULL;
m_dDpiX = 96;
m_dDpiY = 96;
m_lClipMode = c_nWindingFillMode;
m_bIsClipping = false;
m_bIsClippingNow = false;
}
void SetSettings(NSStructures::CPen* pPen, NSStructures::CBrush* pBrush)
{
m_pPen = pPen;
m_pBrush = pBrush;
}
void CloseFile(CString strFile = _T(""))
{
if (_T("") != strFile)
{
m_oDocument.WriteString(g_vml_bstr_document_end);
//CDirectory::SaveToFile(strFile, m_oDocument.GetCString());
NSFile::CFileBinary oFile;
oFile.CreateFileW(std::wstring(strFile.GetString()));
BYTE* pData;
LONG nDataSize;
NSFile::CUtf8Converter::GetUtf8StringFromUnicode(m_oDocument.GetBuffer(), m_oDocument.GetCurSize(), pData, nDataSize);
oFile.WriteFile(pData, nDataSize);
RELEASEARRAYOBJECTS(pData);
}
if (3000000 < m_oDocument.GetSize())
m_oDocument.Clear();
m_oDocument.ClearNoAttack();
m_oPath.ClearNoAttack();
}
void NewDocument(double& dWidth, double& dHeigth, LONG& lPageNumber)
{
CloseFile(_T(""));
m_lWidth = (int)dWidth;
m_lHeight = (int)dHeigth;
m_lCurDocumentID = lPageNumber;
CString strDocumentStart = _T("");
strDocumentStart.Format(g_vml_string_document, m_lCurDocumentID, (int)m_lWidth, (int)m_lHeight);
m_oDocument.WriteString(strDocumentStart);
}
protected:
inline static LONG ConvertColor(LONG lBGR)
{
return (0x00FFFFFF & (((lBGR & 0xFF) << 16) | (lBGR & 0x0000FF00) | ((lBGR >> 16) & 0xFF)));
}
public:
inline void WritePathEnd()
{
m_oPath.ClearNoAttack();
}
inline void WritePathStart()
{
m_oPath.ClearNoAttack();
}
void WritePathClose()
{
if (m_bIsClippingNow)
return;
m_oPath.WriteString(g_vml_bstr_ClosePath);
}
void WritePathMoveTo(double& x, double& y)
{
if (m_bIsClippingNow)
return;
CString strPath = _T("");
strPath.Format(g_vml_string_MoveTo, round(x), round(y));
m_oPath.WriteString(strPath);
}
void WritePathLineTo(double& x, double& y)
{
if (m_bIsClippingNow)
return;
if (0 == m_oPath.GetCurSize())
{
WritePathMoveTo(x, y);
}
CString strPath = _T("");
strPath.Format(g_vml_string_LineTo, round(x), round(y));
m_oPath.WriteString(strPath);
}
void WritePathCurveTo(double& x1, double& y1, double& x2, double& y2, double& x3, double& y3)
{
if (0 == m_oPath.GetCurSize())
{
WritePathMoveTo(x1, y1);
}
CString strPath = _T("");
strPath.Format(g_vml_string_CurveTo, round(x1), round(y1), round(x2), round(y2), round(x3), round(y3));
m_oPath.WriteString(strPath);
}
void WriteDrawPath(LONG lType, Aggplus::CMatrix* pTransform, Aggplus::CGraphicsPathSimpleConverter* pConverter, CImageInfo& oInfo, const double& dAngle)
{
if (m_oPath.GetCurSize() < 3)
return;
CString strStroked = _T("false");
CString strFilled = _T("false");
bool bStroke = false;
if (m_pPen->Alpha == 0)
lType &= 0xFF00;
if ((-1 == oInfo.m_lID) && (0 == m_pBrush->Alpha1))
lType &= 0xFF;
// canvas
if ((lType & 0x01) == 0x01)
{
bStroke = true;
strStroked = _T("true");
}
if (lType > 0x01)
{
strFilled = _T("true");
}
CString strVML = _T("");
if (-1 != oInfo.m_lID)
{
if (itJPG == oInfo.m_eType)
{
strVML.Format(g_vml_string_shape_vmlTextureJPG, strStroked, ConvertColor(m_pPen->Color), strFilled,
m_oPath.GetCString(), oInfo.m_lID, (double)m_pBrush->TextureAlpha / 255);
}
else
{
strVML.Format(g_vml_string_shape_vmlTexturePNG, strStroked, ConvertColor(m_pPen->Color), strFilled,
m_oPath.GetCString(), oInfo.m_lID, (double)m_pBrush->TextureAlpha / 255);
}
}
else if (0xFF == m_pBrush->Alpha1)
{
if (0x00 == (lType & 0xFF) || (0 == m_pPen->DashStyle))
{
strVML.Format(g_vml_string_shape_vml, strStroked, ConvertColor(m_pPen->Color), strFilled,
ConvertColor(m_pBrush->Color1), m_oPath.GetCString());
}
else
{
strVML.Format(g_vml_string_shape_vml_Dash, strStroked, ConvertColor(m_pPen->Color), strFilled,
ConvertColor(m_pBrush->Color1), m_oPath.GetCString());
}
}
else
{
if (0x00 == (lType & 0xFF) || (0 == m_pPen->DashStyle))
{
strVML.Format(g_vml_string_shape_vmlAlpha, strStroked, ConvertColor(m_pPen->Color), strFilled,
ConvertColor(m_pBrush->Color1), m_oPath.GetCString(), (double)m_pBrush->Alpha1 / 255);
}
else
{
strVML.Format(g_vml_string_shape_vmlAlphaDash, strStroked, ConvertColor(m_pPen->Color), strFilled,
ConvertColor(m_pBrush->Color1), m_oPath.GetCString(), (double)m_pBrush->Alpha1 / 255);
}
}
m_oDocument.WriteString(strVML);
}
void WriteImage(CImageInfo oInfo, const double& x, const double& y, const double& w, const double& h, const double& dAngle)
{
CString strImage = _T("");
if (itJPG == oInfo.m_eType)
strImage.Format(g_vml_string_shape_image_jpg, oInfo.m_lID, round(x), round(y), round(w), round(h));
else
strImage.Format(g_vml_string_shape_image_png, oInfo.m_lID, round(x), round(y), round(w), round(h));
m_oDocument.WriteString(strImage);
}
void WritePathClip()
{
m_bIsClipping = true;
m_bIsClippingNow = true;
++m_lClippingPath;
}
void WritePathClipEnd()
{
m_bIsClippingNow = false;
}
void WritePathResetClip()
{
m_bIsClipping = false;
}
inline void WriteStyleClip()
{
}
void WriteToMainHtml(CStringWriter* pWriter, const CDstInfo& oInfo)
{
if (!oInfo.m_bIsWeb)
{
CString strFrame = _T("");
strFrame.Format(g_vml_string_frame, (int)m_lWidth, (int)m_lHeight, m_lCurDocumentID, m_lCurDocumentID);
pWriter->WriteString(strFrame);
CString strVml = _T("");
strVml.Format(_T("\\page%d.vml"), m_lCurDocumentID);
CloseFile(oInfo.m_strDstFilePath + strVml);
}
else
{
CString s1 = _T("");
s1.Format(_T("<v:vmlframe clip=\"true\" origin=\"0,0\" size=\"%d,%d\" src=\""), (int)m_lWidth, (int)m_lHeight);
s1 += oInfo.m_strAdditionalPath;
CString s2 = _T("");
s2.Format(_T("/page%d.vml#page%d\" unselectable=\"on\"/>\n"), m_lCurDocumentID, m_lCurDocumentID);
s1 += s2;
pWriter->WriteString(s1);
CString strVml = _T("");
strVml.Format(_T("\\page%d.vml"), m_lCurDocumentID);
CloseFile(oInfo.m_strDstFilePath + strVml);
}
}
};
}