Index: fpdfsdk/cfx_systemhandler.cpp |
diff --git a/fpdfsdk/cfx_systemhandler.cpp b/fpdfsdk/cfx_systemhandler.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4ca407886ce4b70c3694261435a98c28c10ebc2e |
--- /dev/null |
+++ b/fpdfsdk/cfx_systemhandler.cpp |
@@ -0,0 +1,143 @@ |
+// 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 "fpdfsdk/formfiller/cffl_formfiller.h" |
+#include "fpdfsdk/include/fsdk_mgr.h" |
+ |
+namespace { |
+ |
+int CharSet2CP(int charset) { |
+ if (charset == 128) |
+ return 932; |
+ if (charset == 134) |
+ return 936; |
+ if (charset == 129) |
+ return 949; |
+ if (charset == 136) |
+ 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); |
+} |
+ |
+FX_BOOL CFX_SystemHandler::IsSelectionImplemented() { |
+ if (m_pEnv) { |
+ FPDF_FORMFILLINFO* pInfo = m_pEnv->GetFormFillInfo(); |
+ if (pInfo && pInfo->FFI_OutputSelectedRect) |
+ return TRUE; |
+ } |
+ return FALSE; |
+} |
+ |
+FX_BOOL CFX_SystemHandler::FindNativeTrueTypeFont( |
+ int32_t nCharset, |
+ 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; |
+ |
+ CFX_Font* pFXFont = new CFX_Font(); |
+ pFXFont->LoadSubst(sFontFaceName, TRUE, 0, 0, 0, CharSet2CP(nCharset), FALSE); |
+ CPDF_Font* pFont = pDoc->AddFont(pFXFont, nCharset, FALSE); |
+ delete pFXFont; |
+ return pFont; |
+} |
+ |
+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(); |
+} |
+ |
+FX_BOOL CFX_SystemHandler::IsSHIFTKeyDown(uint32_t nFlag) { |
+ return m_pEnv->FFI_IsSHIFTKeyDown(nFlag); |
+} |
+ |
+FX_BOOL CFX_SystemHandler::IsCTRLKeyDown(uint32_t nFlag) { |
+ return m_pEnv->FFI_IsCTRLKeyDown(nFlag); |
+} |
+ |
+FX_BOOL CFX_SystemHandler::IsALTKeyDown(uint32_t nFlag) { |
+ return m_pEnv->FFI_IsALTKeyDown(nFlag); |
+} |
+ |
+FX_BOOL CFX_SystemHandler::IsINSERTKeyDown(uint32_t nFlag) { |
+ return m_pEnv->FFI_IsINSERTKeyDown(nFlag); |
+} |