mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 07:23:34 +08:00
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@62380 954022d7-b5bf-4e40-9824-e11837661b57
181 lines
4.6 KiB
C++
181 lines
4.6 KiB
C++
#include "MetaFile.h"
|
|
|
|
#include "../../graphics/GraphicsRenderer.h"
|
|
#include "../../raster/BgraFrame.h"
|
|
|
|
#include "Common/MetaFileRenderer.h"
|
|
|
|
namespace MetaFile
|
|
{
|
|
CMetaFile::CMetaFile(CApplicationFonts *pAppFonts)
|
|
{
|
|
m_pAppFonts = pAppFonts;
|
|
|
|
// Ñîçäàåì ìåíåäæåð øðèôòîâ ñ ñîáñòâåííûì êýøåì
|
|
m_pFontManager = pAppFonts->GenerateFontManager();
|
|
CFontsCache* pMeasurerCache = new CFontsCache();
|
|
pMeasurerCache->SetStreams(pAppFonts->GetStreams());
|
|
m_pFontManager->SetOwnerCache(pMeasurerCache);
|
|
m_oWmfFile.SetFontManager(m_pFontManager);
|
|
m_oEmfFile.SetFontManager(m_pFontManager);
|
|
|
|
m_lType = 0;
|
|
}
|
|
CMetaFile::~CMetaFile()
|
|
{
|
|
Close();
|
|
RELEASEINTERFACE(m_pFontManager);
|
|
}
|
|
CFontManager* CMetaFile::get_FontManager()
|
|
{
|
|
return m_pFontManager;
|
|
}
|
|
bool CMetaFile::LoadFromFile(const wchar_t *wsFilePath)
|
|
{
|
|
// TODO: Ñåé÷àñ ïðè çàãðóçêå êàæäîé íîâîé êàðòèíêè ìû ïåðåñîçäàåì
|
|
// FontManager, ïîòîìó ÷òî ñåé÷àñ â íåì êýø áåç îãðàíè÷åíèÿ.
|
|
//------------------------------------------------------
|
|
RELEASEINTERFACE(m_pFontManager);
|
|
m_pFontManager = m_pAppFonts->GenerateFontManager();
|
|
CFontsCache* pMeasurerCache = new CFontsCache();
|
|
pMeasurerCache->SetStreams(m_pAppFonts->GetStreams());
|
|
m_pFontManager->SetOwnerCache(pMeasurerCache);
|
|
m_oWmfFile.SetFontManager(m_pFontManager);
|
|
m_oEmfFile.SetFontManager(m_pFontManager);
|
|
//------------------------------------------------------
|
|
|
|
|
|
// Ñíà÷àëà ïûòàåìñÿ îòêðûòü ôàéë êàê Wmf
|
|
m_oWmfFile.OpenFromFile(wsFilePath);
|
|
m_oWmfFile.Scan();
|
|
|
|
if (!m_oWmfFile.CheckError())
|
|
{
|
|
m_lType = c_lMetaWmf;
|
|
return true;
|
|
}
|
|
|
|
// Ýòî íå Wmf, ïîïðîáóåì îòêðûòü åãî êàê Emf
|
|
m_oWmfFile.Close();
|
|
|
|
m_oEmfFile.OpenFromFile(wsFilePath);
|
|
m_oEmfFile.Scan();
|
|
|
|
if (!m_oEmfFile.CheckError())
|
|
{
|
|
m_lType = c_lMetaEmf;
|
|
return true;
|
|
}
|
|
|
|
// Ýòî íå Emf
|
|
m_oEmfFile.Close();
|
|
|
|
return false;
|
|
};
|
|
bool CMetaFile::DrawOnRenderer(IRenderer* pRenderer, double dX, double dY, double dWidth, double dHeight)
|
|
{
|
|
if (NULL == pRenderer)
|
|
return false;
|
|
|
|
pRenderer->BeginCommand(c_nImageType);
|
|
|
|
if (c_lMetaWmf == m_lType)
|
|
{
|
|
CMetaFileRenderer oWmfOut(&m_oWmfFile, pRenderer, dX, dY, dWidth, dHeight);
|
|
m_oWmfFile.SetOutputDevice((IOutputDevice*)&oWmfOut);
|
|
m_oWmfFile.PlayMetaFile();
|
|
}
|
|
else if (c_lMetaEmf == m_lType)
|
|
{
|
|
CMetaFileRenderer oEmfOut(&m_oEmfFile, pRenderer, dX, dY, dWidth, dHeight);
|
|
m_oEmfFile.SetOutputDevice((IOutputDevice*)&oEmfOut);
|
|
m_oEmfFile.PlayMetaFile();
|
|
}
|
|
|
|
pRenderer->EndCommand(c_nImageType);
|
|
return true;
|
|
};
|
|
void CMetaFile::Close()
|
|
{
|
|
m_oWmfFile.Close();
|
|
m_oEmfFile.Close();
|
|
|
|
m_lType = 0;
|
|
};
|
|
int CMetaFile::GetType()
|
|
{
|
|
return m_lType;
|
|
}
|
|
void CMetaFile::GetBounds(double* pdX, double* pdY, double* pdW, double* pdH)
|
|
{
|
|
if (c_lMetaWmf == m_lType)
|
|
{
|
|
const TRectD& oRect = m_oWmfFile.GetBounds();
|
|
*pdX = oRect.dLeft;
|
|
*pdY = oRect.dTop;
|
|
*pdW = oRect.dRight - oRect.dLeft;
|
|
*pdH = oRect.dBottom - oRect.dTop;
|
|
}
|
|
else if (c_lMetaEmf == m_lType)
|
|
{
|
|
TEmfRectL* pRect = m_oEmfFile.GetBounds();
|
|
*pdX = pRect->lLeft;
|
|
*pdY = pRect->lTop;
|
|
*pdW = pRect->lRight - pRect->lLeft;
|
|
*pdH = pRect->lBottom - pRect->lTop;
|
|
}
|
|
else
|
|
{
|
|
*pdX = 0;
|
|
*pdY = 0;
|
|
*pdW = 0;
|
|
*pdH = 0;
|
|
}
|
|
};
|
|
void CMetaFile::ConvertToRaster(const wchar_t* wsOutFilePath, unsigned int unFileType, int nWidth, int nHeight)
|
|
{
|
|
CFontManager *pFontManager = m_pAppFonts->GenerateFontManager();
|
|
CFontsCache* pFontCache = new CFontsCache();
|
|
pFontCache->SetStreams(m_pAppFonts->GetStreams());
|
|
pFontManager->SetOwnerCache(pFontCache);
|
|
|
|
CGraphicsRenderer oRenderer;
|
|
oRenderer.SetFontManager(pFontManager);
|
|
|
|
if (-1 == nHeight)
|
|
{
|
|
double dX, dY, dW, dH;
|
|
GetBounds(&dX, &dY, &dW, &dH);
|
|
nHeight = (int)((double)nWidth * dH / dW);
|
|
}
|
|
|
|
//double dDpiX, dDpiY;
|
|
//oRenderer.get_DpiX(&dDpiX);
|
|
//oRenderer.get_DpiX(&dDpiY);
|
|
|
|
double dWidth = nWidth ;//* 72 / 25.4 / dDpiX;
|
|
double dHeight = nHeight ;//* 72 / 25.4 / dDpiY;
|
|
|
|
BYTE* pBgraData = new BYTE[nWidth * nHeight * 4];
|
|
if (!pBgraData)
|
|
return;
|
|
|
|
memset(pBgraData, 0x00, nWidth * nHeight * 4);
|
|
CBgraFrame oFrame;
|
|
oFrame.put_Data(pBgraData);
|
|
oFrame.put_Width(nWidth);
|
|
oFrame.put_Height(nHeight);
|
|
oFrame.put_Stride(-4 * nWidth);
|
|
|
|
oRenderer.CreateFromBgraFrame(&oFrame);
|
|
oRenderer.SetSwapRGB(false);
|
|
oRenderer.put_Width(dWidth);
|
|
oRenderer.put_Height(dHeight);
|
|
|
|
DrawOnRenderer(&oRenderer, 0, 0, dWidth, dHeight);
|
|
|
|
oFrame.SaveFile(wsOutFilePath, unFileType);
|
|
RELEASEINTERFACE(pFontManager);
|
|
}
|
|
}
|