1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #include "fpdfsdk/cfx_systemhandler.h"
8 
9 #include <memory>
10 
11 #include "core/fpdfapi/parser/cpdf_document.h"
12 #include "core/fxcrt/fx_codepage.h"
13 #include "core/fxge/cfx_font.h"
14 #include "core/fxge/cfx_fontmapper.h"
15 #include "core/fxge/cfx_fontmgr.h"
16 #include "core/fxge/cfx_gemodule.h"
17 #include "fpdfsdk/cpdfsdk_annot.h"
18 #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
19 #include "fpdfsdk/cpdfsdk_pageview.h"
20 #include "fpdfsdk/cpdfsdk_widget.h"
21 #include "fpdfsdk/formfiller/cffl_formfiller.h"
22 
23 namespace {
24 
CharSet2CP(int charset)25 int CharSet2CP(int charset) {
26   if (charset == FX_CHARSET_ShiftJIS)
27     return FX_CODEPAGE_ShiftJIS;
28   if (charset == FX_CHARSET_ChineseSimplified)
29     return FX_CODEPAGE_ChineseSimplified;
30   if (charset == FX_CHARSET_Hangul)
31     return FX_CODEPAGE_Hangul;
32   if (charset == FX_CHARSET_ChineseTraditional)
33     return FX_CODEPAGE_ChineseTraditional;
34   return FX_CODEPAGE_DefANSI;
35 }
36 
37 }  // namespace
38 
CFX_SystemHandler(CPDFSDK_FormFillEnvironment * pFormFillEnv)39 CFX_SystemHandler::CFX_SystemHandler(CPDFSDK_FormFillEnvironment* pFormFillEnv)
40     : m_pFormFillEnv(pFormFillEnv) {}
41 
~CFX_SystemHandler()42 CFX_SystemHandler::~CFX_SystemHandler() {}
43 
InvalidateRect(CPDFSDK_Widget * widget,const CFX_FloatRect & rect)44 void CFX_SystemHandler::InvalidateRect(CPDFSDK_Widget* widget,
45                                        const CFX_FloatRect& rect) {
46   CPDFSDK_PageView* pPageView = widget->GetPageView();
47   UnderlyingPageType* pPage = widget->GetUnderlyingPage();
48   if (!pPage || !pPageView)
49     return;
50 
51   CFX_Matrix page2device;
52   pPageView->GetCurrentMatrix(page2device);
53 
54   CFX_Matrix device2page = page2device.GetInverse();
55 
56   CFX_PointF left_top = device2page.Transform(CFX_PointF(rect.left, rect.top));
57   CFX_PointF right_bottom =
58       device2page.Transform(CFX_PointF(rect.right, rect.bottom));
59 
60   CFX_FloatRect rcPDF(left_top.x, right_bottom.y, right_bottom.x, left_top.y);
61   rcPDF.Normalize();
62   m_pFormFillEnv->Invalidate(pPage, rcPDF.GetOuterRect());
63 }
64 
OutputSelectedRect(CFFL_FormFiller * pFormFiller,CFX_FloatRect & rect)65 void CFX_SystemHandler::OutputSelectedRect(CFFL_FormFiller* pFormFiller,
66                                            CFX_FloatRect& rect) {
67   if (!pFormFiller)
68     return;
69 
70   CFX_PointF ptA = pFormFiller->PWLtoFFL(CFX_PointF(rect.left, rect.bottom));
71   CFX_PointF ptB = pFormFiller->PWLtoFFL(CFX_PointF(rect.right, rect.top));
72 
73   CPDFSDK_Annot* pAnnot = pFormFiller->GetSDKAnnot();
74   UnderlyingPageType* pPage = pAnnot->GetUnderlyingPage();
75   ASSERT(pPage);
76 
77   m_pFormFillEnv->OutputSelectedRect(pPage,
78                                      CFX_FloatRect(ptA.x, ptA.y, ptB.x, ptB.y));
79 }
80 
IsSelectionImplemented() const81 bool CFX_SystemHandler::IsSelectionImplemented() const {
82   if (!m_pFormFillEnv)
83     return false;
84 
85   FPDF_FORMFILLINFO* pInfo = m_pFormFillEnv->GetFormFillInfo();
86   return pInfo && pInfo->FFI_OutputSelectedRect;
87 }
88 
SetCursor(int32_t nCursorType)89 void CFX_SystemHandler::SetCursor(int32_t nCursorType) {
90   m_pFormFillEnv->SetCursor(nCursorType);
91 }
92 
FindNativeTrueTypeFont(ByteString sFontFaceName)93 bool CFX_SystemHandler::FindNativeTrueTypeFont(ByteString sFontFaceName) {
94   CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
95   if (!pFontMgr)
96     return false;
97 
98   CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper();
99   if (!pFontMapper)
100     return false;
101 
102   if (pFontMapper->m_InstalledTTFonts.empty())
103     pFontMapper->LoadInstalledFonts();
104 
105   for (const auto& font : pFontMapper->m_InstalledTTFonts) {
106     if (font.Compare(sFontFaceName.AsStringView()))
107       return true;
108   }
109   for (const auto& fontPair : pFontMapper->m_LocalizedTTFonts) {
110     if (fontPair.first.Compare(sFontFaceName.AsStringView()))
111       return true;
112   }
113   return false;
114 }
115 
AddNativeTrueTypeFontToPDF(CPDF_Document * pDoc,ByteString sFontFaceName,uint8_t nCharset)116 CPDF_Font* CFX_SystemHandler::AddNativeTrueTypeFontToPDF(
117     CPDF_Document* pDoc,
118     ByteString sFontFaceName,
119     uint8_t nCharset) {
120   if (!pDoc)
121     return nullptr;
122 
123   auto pFXFont = pdfium::MakeUnique<CFX_Font>();
124   pFXFont->LoadSubst(sFontFaceName, true, 0, 0, 0, CharSet2CP(nCharset), false);
125   return pDoc->AddFont(pFXFont.get(), nCharset, false);
126 }
127 
SetTimer(int32_t uElapse,TimerCallback lpTimerFunc)128 int32_t CFX_SystemHandler::SetTimer(int32_t uElapse,
129                                     TimerCallback lpTimerFunc) {
130   return m_pFormFillEnv->SetTimer(uElapse, lpTimerFunc);
131 }
132 
KillTimer(int32_t nID)133 void CFX_SystemHandler::KillTimer(int32_t nID) {
134   m_pFormFillEnv->KillTimer(nID);
135 }
136