1 // Copyright 2017 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 "xfa/fgas/font/cfgas_defaultfontmanager.h"
8
9 #include "xfa/fgas/font/fgas_fontutils.h"
10
CFGAS_DefaultFontManager()11 CFGAS_DefaultFontManager::CFGAS_DefaultFontManager() {}
12
~CFGAS_DefaultFontManager()13 CFGAS_DefaultFontManager::~CFGAS_DefaultFontManager() {}
14
GetFont(CFGAS_FontMgr * pFontMgr,const WideStringView & wsFontFamily,uint32_t dwFontStyles)15 RetainPtr<CFGAS_GEFont> CFGAS_DefaultFontManager::GetFont(
16 CFGAS_FontMgr* pFontMgr,
17 const WideStringView& wsFontFamily,
18 uint32_t dwFontStyles) {
19 WideString wsFontName(wsFontFamily);
20 RetainPtr<CFGAS_GEFont> pFont =
21 pFontMgr->LoadFont(wsFontName.c_str(), dwFontStyles, 0xFFFF);
22 if (!pFont) {
23 const FGAS_FontInfo* pCurFont =
24 FGAS_FontInfoByFontName(wsFontName.AsStringView());
25 if (pCurFont && pCurFont->pReplaceFont) {
26 uint32_t dwStyle = 0;
27 // TODO(dsinclair): Why doesn't this check the other flags?
28 if (FontStyleIsBold(dwFontStyles))
29 dwStyle |= FXFONT_BOLD;
30 if (FontStyleIsItalic(dwFontStyles))
31 dwStyle |= FXFONT_ITALIC;
32
33 const wchar_t* pReplace = pCurFont->pReplaceFont;
34 int32_t iLength = wcslen(pReplace);
35 while (iLength > 0) {
36 const wchar_t* pNameText = pReplace;
37 while (*pNameText != L',' && iLength > 0) {
38 pNameText++;
39 iLength--;
40 }
41 WideString wsReplace = WideString(pReplace, pNameText - pReplace);
42 pFont = pFontMgr->LoadFont(wsReplace.c_str(), dwStyle, 0xFFFF);
43 if (pFont)
44 break;
45
46 iLength--;
47 pNameText++;
48 pReplace = pNameText;
49 }
50 }
51 }
52 if (pFont)
53 m_CacheFonts.push_back(pFont);
54 return pFont;
55 }
56
GetDefaultFont(CFGAS_FontMgr * pFontMgr,const WideStringView & wsFontFamily,uint32_t dwFontStyles)57 RetainPtr<CFGAS_GEFont> CFGAS_DefaultFontManager::GetDefaultFont(
58 CFGAS_FontMgr* pFontMgr,
59 const WideStringView& wsFontFamily,
60 uint32_t dwFontStyles) {
61 RetainPtr<CFGAS_GEFont> pFont =
62 pFontMgr->LoadFont(L"Arial Narrow", dwFontStyles, 0xFFFF);
63 if (!pFont) {
64 pFont = pFontMgr->LoadFont(static_cast<const wchar_t*>(nullptr),
65 dwFontStyles, 0xFFFF);
66 }
67 if (pFont)
68 m_CacheFonts.push_back(pFont);
69 return pFont;
70 }
71