mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 06:22:44 +08:00
101 lines
1.9 KiB
C++
101 lines
1.9 KiB
C++
#pragma once
|
|
#include "EMFInterpreter.h"
|
|
#include "..\..\Objects\ASCFontManager.h"
|
|
#include "TemporaryCS.h"
|
|
|
|
class CEMFFile
|
|
{
|
|
public:
|
|
CRITICAL_SECTION m_oCS;
|
|
|
|
CEMFInterpreter m_oEMF;
|
|
|
|
HENHMETAFILE m_hEmf;
|
|
HDC m_memDC;
|
|
|
|
LONG m_lObjects;
|
|
|
|
public:
|
|
CEMFFile()
|
|
{
|
|
m_hEmf = NULL;
|
|
m_memDC = NULL;
|
|
m_lObjects = 0;
|
|
|
|
InitializeCriticalSection(&m_oCS);
|
|
}
|
|
~CEMFFile()
|
|
{
|
|
DeleteCriticalSection(&m_oCS);
|
|
}
|
|
|
|
inline void SetFontManager(IASCFontManager* pManager)
|
|
{
|
|
m_oEMF.SetFontManager(pManager);
|
|
}
|
|
|
|
void Open(BSTR bsFileName)
|
|
{
|
|
HDC hDC = GetDC(NULL);
|
|
m_memDC = CreateCompatibleDC(hDC);
|
|
|
|
ReleaseDC(NULL, hDC);
|
|
|
|
m_hEmf = GetEnhMetaFile(bsFileName);
|
|
|
|
ENHMETAHEADER EmfHeader;
|
|
if (::GetEnhMetaFileHeader(m_hEmf, sizeof(ENHMETAHEADER), &EmfHeader))
|
|
{
|
|
m_lObjects = EmfHeader.nHandles;
|
|
}
|
|
|
|
m_oEMF.Init(m_memDC, (UINT)m_lObjects);
|
|
}
|
|
|
|
void Close()
|
|
{
|
|
m_oEMF.SetRenderer(NULL);
|
|
if (NULL != m_hEmf)
|
|
{
|
|
DeleteEnhMetaFile(m_hEmf);
|
|
m_hEmf = NULL;
|
|
}
|
|
if (NULL != m_memDC)
|
|
{
|
|
DeleteDC(m_memDC);
|
|
}
|
|
}
|
|
|
|
void DrawOnRenderer(IASCRenderer* pRenderer, double x, double y, double width, double height)
|
|
{
|
|
CTemporaryCS oCS (&m_oCS);
|
|
|
|
if (NULL == pRenderer)
|
|
return;
|
|
|
|
m_oEMF.SetRenderer(pRenderer);
|
|
m_oEMF.SetRectDst(x, y, width, height);
|
|
|
|
RECT oRect;
|
|
oRect.left = 0;
|
|
oRect.top = 0;
|
|
oRect.right = 100;
|
|
oRect.bottom = 100;
|
|
|
|
int nEmumRes = ::EnumEnhMetaFile(m_memDC, m_hEmf, (ENHMFENUMPROC)EnumEMFCallbak, (void*)this, &oRect);
|
|
}
|
|
|
|
protected:
|
|
static int CALLBACK EnumEMFCallbak(HDC hDC, HANDLETABLE FAR *lpHandleTable, ENHMETARECORD FAR *lpEnhMetaRecord,
|
|
int nObj, LPARAM lpData)
|
|
{
|
|
CEMFFile* pFile = (CEMFFile*)lpData;
|
|
|
|
pFile->m_oEMF.SetRecord(lpEnhMetaRecord);
|
|
pFile->m_oEMF.SetTable(lpHandleTable);
|
|
|
|
pFile->m_oEMF.ProduceRecord();
|
|
|
|
return 1;
|
|
}
|
|
}; |