Home | History | Annotate | Download | only in fpdfsdk
      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/fxge/cfx_fontmapper.h"
     13 #include "core/fxge/cfx_fontmgr.h"
     14 #include "core/fxge/cfx_gemodule.h"
     15 #include "fpdfsdk/cpdfsdk_annot.h"
     16 #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
     17 #include "fpdfsdk/cpdfsdk_pageview.h"
     18 #include "fpdfsdk/cpdfsdk_widget.h"
     19 #include "fpdfsdk/formfiller/cffl_formfiller.h"
     20 
     21 namespace {
     22 
     23 int CharSet2CP(int charset) {
     24   if (charset == FXFONT_SHIFTJIS_CHARSET)
     25     return 932;
     26   if (charset == FXFONT_GB2312_CHARSET)
     27     return 936;
     28   if (charset == FXFONT_HANGUL_CHARSET)
     29     return 949;
     30   if (charset == FXFONT_CHINESEBIG5_CHARSET)
     31     return 950;
     32   return 0;
     33 }
     34 
     35 }  // namespace
     36 
     37 void CFX_SystemHandler::InvalidateRect(CPDFSDK_Widget* widget, FX_RECT rect) {
     38   CPDFSDK_PageView* pPageView = widget->GetPageView();
     39   UnderlyingPageType* pPage = widget->GetUnderlyingPage();
     40   if (!pPage || !pPageView)
     41     return;
     42 
     43   CFX_Matrix page2device;
     44   pPageView->GetCurrentMatrix(page2device);
     45 
     46   CFX_Matrix device2page;
     47   device2page.SetReverse(page2device);
     48 
     49   CFX_PointF left_top = device2page.Transform(CFX_PointF(
     50       static_cast<FX_FLOAT>(rect.left), static_cast<FX_FLOAT>(rect.top)));
     51   CFX_PointF right_bottom = device2page.Transform(CFX_PointF(
     52       static_cast<FX_FLOAT>(rect.right), static_cast<FX_FLOAT>(rect.bottom)));
     53 
     54   CFX_FloatRect rcPDF(left_top.x, right_bottom.y, right_bottom.x, left_top.y);
     55   rcPDF.Normalize();
     56   m_pFormFillEnv->Invalidate(pPage, rcPDF.ToFxRect());
     57 }
     58 
     59 void CFX_SystemHandler::OutputSelectedRect(CFFL_FormFiller* pFormFiller,
     60                                            CFX_FloatRect& rect) {
     61   if (!pFormFiller)
     62     return;
     63 
     64   CFX_PointF ptA = pFormFiller->PWLtoFFL(CFX_PointF(rect.left, rect.bottom));
     65   CFX_PointF ptB = pFormFiller->PWLtoFFL(CFX_PointF(rect.right, rect.top));
     66 
     67   CPDFSDK_Annot* pAnnot = pFormFiller->GetSDKAnnot();
     68   UnderlyingPageType* pPage = pAnnot->GetUnderlyingPage();
     69   ASSERT(pPage);
     70 
     71   m_pFormFillEnv->OutputSelectedRect(pPage,
     72                                      CFX_FloatRect(ptA.x, ptA.y, ptB.x, ptB.y));
     73 }
     74 
     75 bool CFX_SystemHandler::IsSelectionImplemented() const {
     76   if (!m_pFormFillEnv)
     77     return false;
     78 
     79   FPDF_FORMFILLINFO* pInfo = m_pFormFillEnv->GetFormFillInfo();
     80   return pInfo && pInfo->FFI_OutputSelectedRect;
     81 }
     82 
     83 void CFX_SystemHandler::SetCursor(int32_t nCursorType) {
     84   m_pFormFillEnv->SetCursor(nCursorType);
     85 }
     86 
     87 bool CFX_SystemHandler::FindNativeTrueTypeFont(CFX_ByteString sFontFaceName) {
     88   CFX_FontMgr* pFontMgr = CFX_GEModule::Get()->GetFontMgr();
     89   if (!pFontMgr)
     90     return false;
     91 
     92   CFX_FontMapper* pFontMapper = pFontMgr->GetBuiltinMapper();
     93   if (!pFontMapper)
     94     return false;
     95 
     96   if (pFontMapper->m_InstalledTTFonts.empty())
     97     pFontMapper->LoadInstalledFonts();
     98 
     99   for (const auto& font : pFontMapper->m_InstalledTTFonts) {
    100     if (font.Compare(sFontFaceName.AsStringC()))
    101       return true;
    102   }
    103   for (const auto& fontPair : pFontMapper->m_LocalizedTTFonts) {
    104     if (fontPair.first.Compare(sFontFaceName.AsStringC()))
    105       return true;
    106   }
    107   return false;
    108 }
    109 
    110 CPDF_Font* CFX_SystemHandler::AddNativeTrueTypeFontToPDF(
    111     CPDF_Document* pDoc,
    112     CFX_ByteString sFontFaceName,
    113     uint8_t nCharset) {
    114   if (!pDoc)
    115     return nullptr;
    116 
    117   std::unique_ptr<CFX_Font> pFXFont(new CFX_Font);
    118   pFXFont->LoadSubst(sFontFaceName, true, 0, 0, 0, CharSet2CP(nCharset), false);
    119   return pDoc->AddFont(pFXFont.get(), nCharset, false);
    120 }
    121 
    122 int32_t CFX_SystemHandler::SetTimer(int32_t uElapse,
    123                                     TimerCallback lpTimerFunc) {
    124   return m_pFormFillEnv->SetTimer(uElapse, lpTimerFunc);
    125 }
    126 
    127 void CFX_SystemHandler::KillTimer(int32_t nID) {
    128   m_pFormFillEnv->KillTimer(nID);
    129 }
    130 
    131 bool CFX_SystemHandler::IsSHIFTKeyDown(uint32_t nFlag) const {
    132   return !!m_pFormFillEnv->IsSHIFTKeyDown(nFlag);
    133 }
    134 
    135 bool CFX_SystemHandler::IsCTRLKeyDown(uint32_t nFlag) const {
    136   return !!m_pFormFillEnv->IsCTRLKeyDown(nFlag);
    137 }
    138 
    139 bool CFX_SystemHandler::IsALTKeyDown(uint32_t nFlag) const {
    140   return !!m_pFormFillEnv->IsALTKeyDown(nFlag);
    141 }
    142