blob: d6ec4f0cf0f9d3b1597cc55fb4648eb85147265e [file] [log] [blame]
// Copyright 2016 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#include "fpdfsdk/cfx_systemhandler.h"
#include <memory>
#include "core/fxge/include/fx_ge.h"
#include "fpdfsdk/formfiller/cffl_formfiller.h"
#include "fpdfsdk/include/fsdk_mgr.h"
namespace {
int CharSet2CP(int charset) {
if (charset == FXFONT_SHIFTJIS_CHARSET)
return 932;
if (charset == FXFONT_GB2312_CHARSET)
return 936;
if (charset == FXFONT_HANGEUL_CHARSET)
return 949;
if (charset == FXFONT_CHINESEBIG5_CHARSET)
return 950;
return 0;
}
} // namespace
void CFX_SystemHandler::SetCursor(int32_t nCursorType) {
m_pEnv->FFI_SetCursor(nCursorType);
}
void CFX_SystemHandler::InvalidateRect(FX_HWND hWnd, FX_RECT rect) {
CPDFSDK_Annot* pSDKAnnot = (CPDFSDK_Annot*)hWnd;
CPDFSDK_PageView* pPageView = pSDKAnnot->GetPageView();
UnderlyingPageType* pPage = pSDKAnnot->GetUnderlyingPage();
if (!pPage || !pPageView)
return;
CFX_Matrix page2device;
pPageView->GetCurrentMatrix(page2device);
CFX_Matrix device2page;
device2page.SetReverse(page2device);
FX_FLOAT left, top, right, bottom;
device2page.Transform((FX_FLOAT)rect.left, (FX_FLOAT)rect.top, left, top);
device2page.Transform((FX_FLOAT)rect.right, (FX_FLOAT)rect.bottom, right,
bottom);
CFX_FloatRect rcPDF(left, bottom, right, top);
rcPDF.Normalize();
m_pEnv->FFI_Invalidate(pPage, rcPDF.left, rcPDF.top, rcPDF.right,
rcPDF.bottom);
}
void CFX_SystemHandler::OutputSelectedRect(void* pFormFiller,
CFX_FloatRect& rect) {
CFFL_FormFiller* pFFL = (CFFL_FormFiller*)pFormFiller;
if (!pFFL)
return;
CFX_FloatPoint leftbottom = CFX_FloatPoint(rect.left, rect.bottom);
CFX_FloatPoint righttop = CFX_FloatPoint(rect.right, rect.top);
CFX_FloatPoint ptA = pFFL->PWLtoFFL(leftbottom);
CFX_FloatPoint ptB = pFFL->PWLtoFFL(righttop);
CPDFSDK_Annot* pAnnot = pFFL->GetSDKAnnot();
UnderlyingPageType* pPage = pAnnot->GetUnderlyingPage();
ASSERT(pPage);
m_pEnv->FFI_OutputSelectedRect(pPage, ptA.x, ptB.y, ptB.x, ptA.y);
}
bool CFX_SystemHandler::IsSelectionImplemented() const {
if (m_pEnv) {
FPDF_FORMFILLINFO* pInfo = m_pEnv->GetFormFillInfo();
if (pInfo && pInfo->FFI_OutputSelectedRect)
return true;
}
return false;
}
bool CFX_SystemHandler::FindNativeTrueTypeFont(CFX_ByteString sFontFaceName) {
CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
if (!pFontMgr)
return false;
CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper();
if (!pFontMapper)
return false;
if (pFontMapper->m_InstalledTTFonts.empty())
pFontMapper->LoadInstalledFonts();
for (const auto& font : pFontMapper->m_InstalledTTFonts) {
if (font.Compare(sFontFaceName.AsStringC()))
return true;
}
return false;
}
CPDF_Font* CFX_SystemHandler::AddNativeTrueTypeFontToPDF(
CPDF_Document* pDoc,
CFX_ByteString sFontFaceName,
uint8_t nCharset) {
if (!pDoc)
return nullptr;
std::unique_ptr<CFX_Font> pFXFont(new CFX_Font);
pFXFont->LoadSubst(sFontFaceName, TRUE, 0, 0, 0, CharSet2CP(nCharset), FALSE);
return pDoc->AddFont(pFXFont.get(), nCharset, FALSE);
}
int32_t CFX_SystemHandler::SetTimer(int32_t uElapse,
TimerCallback lpTimerFunc) {
return m_pEnv->FFI_SetTimer(uElapse, lpTimerFunc);
}
void CFX_SystemHandler::KillTimer(int32_t nID) {
m_pEnv->FFI_KillTimer(nID);
}
FX_SYSTEMTIME CFX_SystemHandler::GetLocalTime() {
return m_pEnv->FFI_GetLocalTime();
}
bool CFX_SystemHandler::IsSHIFTKeyDown(uint32_t nFlag) const {
return !!m_pEnv->FFI_IsSHIFTKeyDown(nFlag);
}
bool CFX_SystemHandler::IsCTRLKeyDown(uint32_t nFlag) const {
return !!m_pEnv->FFI_IsCTRLKeyDown(nFlag);
}
bool CFX_SystemHandler::IsALTKeyDown(uint32_t nFlag) const {
return !!m_pEnv->FFI_IsALTKeyDown(nFlag);
}