mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-07-11 03:42:47 +08:00
141 lines
3.3 KiB
C++
141 lines
3.3 KiB
C++
#include "OFDFile_Private.h"
|
|
|
|
#include "../../OfficeUtils/src/OfficeUtils.h"
|
|
#include "Utils/Utils.h"
|
|
|
|
COFDFile_Private::COFDFile_Private(NSFonts::IApplicationFonts* pFonts)
|
|
: m_pAppFonts(pFonts), m_pFontManager(nullptr), m_pTempFolder(nullptr)
|
|
{
|
|
if (nullptr == pFonts)
|
|
return;
|
|
|
|
// Create font manager with its own cache
|
|
m_pFontManager = pFonts->GenerateFontManager();
|
|
NSFonts::IFontsCache* pMeasurerCache = NSFonts::NSFontCache::Create();
|
|
pMeasurerCache->SetStreams(pFonts->GetStreams());
|
|
m_pFontManager->SetOwnerCache(pMeasurerCache);
|
|
pMeasurerCache->SetCacheSize(16);
|
|
}
|
|
|
|
COFDFile_Private::~COFDFile_Private()
|
|
{
|
|
Close();
|
|
|
|
if (nullptr != m_pTempFolder)
|
|
delete m_pTempFolder;
|
|
|
|
RELEASEINTERFACE(m_pFontManager);
|
|
}
|
|
|
|
void COFDFile_Private::Close()
|
|
{}
|
|
|
|
void COFDFile_Private::SetTempDir(const std::wstring& wsPath)
|
|
{
|
|
if (nullptr != m_pTempFolder)
|
|
delete m_pTempFolder;
|
|
|
|
if (!NSDirectory::Exists(wsPath))
|
|
NSDirectory::CreateDirectory(wsPath);
|
|
|
|
int nCounter = 0;
|
|
std::wstring wsTempFolder = wsPath + L"/OFD/";
|
|
|
|
while (NSDirectory::Exists(wsTempFolder))
|
|
{
|
|
wsTempFolder = wsPath + L"/OFD" + std::to_wstring(nCounter) + L'/';
|
|
nCounter++;
|
|
}
|
|
|
|
NSDirectory::CreateDirectory(wsTempFolder);
|
|
|
|
m_pTempFolder = new CFolderSystem(wsTempFolder);
|
|
}
|
|
|
|
std::wstring COFDFile_Private::GetTempDir() const
|
|
{
|
|
return (nullptr != m_pTempFolder) ? m_pTempFolder->getFullFilePath(L"") : std::wstring();
|
|
}
|
|
|
|
bool COFDFile_Private::Read(IFolder* pFolder)
|
|
{
|
|
if (nullptr == pFolder)
|
|
return false;
|
|
|
|
return m_oBase.Read(pFolder);
|
|
}
|
|
|
|
bool COFDFile_Private::LoadFromFile(const std::wstring& wsFilePath)
|
|
{
|
|
if (wsFilePath.empty() || nullptr == m_pTempFolder)
|
|
return false;
|
|
|
|
Close();
|
|
|
|
COfficeUtils oUtils(NULL);
|
|
|
|
if (S_OK != oUtils.ExtractToDirectory(wsFilePath, m_pTempFolder->getFullFilePath(L""), NULL, 0))
|
|
return false;
|
|
|
|
return Read(m_pTempFolder);
|
|
}
|
|
|
|
bool COFDFile_Private::LoadFromMemory(BYTE* pData, DWORD ulLength)
|
|
{
|
|
Close();
|
|
|
|
if (nullptr != m_pTempFolder)
|
|
delete m_pTempFolder;
|
|
|
|
m_pTempFolder = new CZipFolderMemory(pData, ulLength);
|
|
|
|
return Read(m_pTempFolder);
|
|
}
|
|
|
|
unsigned int COFDFile_Private::GetPageCount() const
|
|
{
|
|
return m_oBase.GetPageCount();
|
|
}
|
|
|
|
void COFDFile_Private::GetPageSize(int nPageIndex, double& dWidth, double& dHeight) const
|
|
{
|
|
m_oBase.GetPageSize(nPageIndex, dWidth, dHeight);
|
|
}
|
|
|
|
void COFDFile_Private::DrawPage(IRenderer* pRenderer, int nPageIndex)
|
|
{
|
|
m_oBase.DrawPage(pRenderer, nPageIndex);
|
|
}
|
|
|
|
void COFDFile_Private::DrawPage(IRenderer* pRenderer, int nPageIndex, const double& dX, const double& dY, const double& dWidth, const double& dHeight)
|
|
{
|
|
if (nullptr == pRenderer)
|
|
return;
|
|
|
|
double dPageWidth = 0., dPageHeight = 0.;
|
|
|
|
GetPageSize(nPageIndex, dPageWidth, dPageHeight);
|
|
|
|
if (OFD::IsZeroValue(dPageWidth) || OFD::IsZeroValue(dPageHeight))
|
|
return;
|
|
|
|
double dM11, dM12, dM21, dM22, dDx, dDy;
|
|
pRenderer->GetTransform(&dM11, &dM12, &dM21, &dM22, &dDx, &dDy);
|
|
|
|
Aggplus::CMatrix oTransform(dM11, dM12, dM21, dM22, dDx, dDy);
|
|
|
|
oTransform.Scale(dWidth / dPageWidth, dHeight / dPageHeight);
|
|
oTransform.Translate(dX, dY);
|
|
|
|
pRenderer->SetTransform(oTransform.sx(), oTransform.shy(), oTransform.shx(), oTransform.sy(), oTransform.tx(), oTransform.ty());
|
|
|
|
m_oBase.DrawPage(pRenderer, nPageIndex);
|
|
|
|
pRenderer->SetTransform(dM11, dM12, dM21, dM22, dDx, dDy);
|
|
}
|
|
|
|
NSFonts::IApplicationFonts* COFDFile_Private::GetFonts()
|
|
{
|
|
return m_pAppFonts;
|
|
}
|