OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "xfa/fgas/font/fgas_gefont.h" | 7 #include "xfa/fgas/font/fgas_gefont.h" |
8 | 8 |
9 #include "xfa/fgas/crt/fgas_codepage.h" | 9 #include "xfa/fgas/crt/fgas_codepage.h" |
10 #include "xfa/fgas/font/fgas_fontutils.h" | 10 #include "xfa/fgas/font/fgas_fontutils.h" |
11 #include "xfa/fxfa/include/xfa_fontmgr.h" | 11 #include "xfa/fxfa/include/xfa_fontmgr.h" |
12 | 12 |
13 // static | 13 // static |
14 CFGAS_GEFont* CFGAS_GEFont::LoadFont(const FX_WCHAR* pszFontFamily, | 14 CFGAS_GEFont* CFGAS_GEFont::LoadFont(const FX_WCHAR* pszFontFamily, |
15 uint32_t dwFontStyles, | 15 uint32_t dwFontStyles, |
16 uint16_t wCodePage, | 16 uint16_t wCodePage, |
17 IFGAS_FontMgr* pFontMgr) { | 17 IFGAS_FontMgr* pFontMgr) { |
18 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ | 18 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
19 if (NULL != pFontMgr) { | 19 if (NULL != pFontMgr) { |
20 return pFontMgr->GetFontByCodePage(wCodePage, dwFontStyles, pszFontFamily); | 20 return pFontMgr->GetFontByCodePage(wCodePage, dwFontStyles, pszFontFamily); |
21 } | 21 } |
22 return NULL; | 22 return NULL; |
23 #else | 23 #else |
24 CFGAS_GEFont* pFont = new CFGAS_GEFont(pFontMgr); | 24 CFGAS_GEFont* pFont = new CFGAS_GEFont(pFontMgr); |
25 if (!pFont->LoadFont(pszFontFamily, dwFontStyles, wCodePage)) { | 25 if (!pFont->LoadFontInternal(pszFontFamily, dwFontStyles, wCodePage)) { |
26 pFont->Release(); | 26 pFont->Release(); |
27 return NULL; | 27 return NULL; |
28 } | 28 } |
29 return pFont; | 29 return pFont; |
30 #endif | 30 #endif |
31 } | 31 } |
32 | 32 |
33 // static | 33 // static |
34 CFGAS_GEFont* CFGAS_GEFont::LoadFont(CFX_Font* pExtFont, | 34 CFGAS_GEFont* CFGAS_GEFont::LoadFont(CFX_Font* pExtFont, |
35 IFGAS_FontMgr* pFontMgr, | 35 IFGAS_FontMgr* pFontMgr) { |
36 FX_BOOL bTakeOver) { | |
37 CFGAS_GEFont* pFont = new CFGAS_GEFont(pFontMgr); | 36 CFGAS_GEFont* pFont = new CFGAS_GEFont(pFontMgr); |
38 if (!pFont->LoadFont(pExtFont, bTakeOver)) { | 37 if (!pFont->LoadFontInternal(pExtFont)) { |
39 pFont->Release(); | 38 pFont->Release(); |
40 return NULL; | 39 return NULL; |
41 } | 40 } |
42 return pFont; | 41 return pFont; |
43 } | 42 } |
44 | 43 |
45 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 44 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
46 // static | 45 // static |
47 CFGAS_GEFont* CFGAS_GEFont::LoadFont(const uint8_t* pBuffer, | 46 CFGAS_GEFont* CFGAS_GEFont::LoadFont(const uint8_t* pBuffer, |
48 int32_t iLength, | 47 int32_t iLength, |
49 IFGAS_FontMgr* pFontMgr) { | 48 IFGAS_FontMgr* pFontMgr) { |
50 CFGAS_GEFont* pFont = new CFGAS_GEFont(pFontMgr); | 49 CFGAS_GEFont* pFont = new CFGAS_GEFont(pFontMgr); |
51 if (!pFont->LoadFont(pBuffer, iLength)) { | 50 if (!pFont->LoadFontInternal(pBuffer, iLength)) { |
52 pFont->Release(); | 51 pFont->Release(); |
53 return nullptr; | 52 return nullptr; |
54 } | 53 } |
55 return pFont; | |
56 } | |
57 | |
58 // static | |
59 CFGAS_GEFont* CFGAS_GEFont::LoadFont(const FX_WCHAR* pszFileName) { | |
60 CFGAS_GEFont* pFont = new CFGAS_GEFont(nullptr); | |
61 if (!pFont->LoadFontInternal(pszFileName)) { | |
62 pFont->Release(); | |
63 return nullptr; | |
64 } | |
65 return pFont; | 54 return pFont; |
66 } | 55 } |
67 | 56 |
68 // static | 57 // static |
69 CFGAS_GEFont* CFGAS_GEFont::LoadFont(IFX_Stream* pFontStream, | 58 CFGAS_GEFont* CFGAS_GEFont::LoadFont(IFX_Stream* pFontStream, |
70 IFGAS_FontMgr* pFontMgr, | 59 IFGAS_FontMgr* pFontMgr, |
71 FX_BOOL bSaveStream) { | 60 FX_BOOL bSaveStream) { |
72 CFGAS_GEFont* pFont = new CFGAS_GEFont(pFontMgr); | 61 CFGAS_GEFont* pFont = new CFGAS_GEFont(pFontMgr); |
73 if (!pFont->LoadFont(pFontStream, bSaveStream)) { | 62 if (!pFont->LoadFontInternal(pFontStream, bSaveStream)) { |
74 pFont->Release(); | 63 pFont->Release(); |
75 return nullptr; | 64 return nullptr; |
76 } | 65 } |
77 return pFont; | 66 return pFont; |
78 } | 67 } |
79 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 68 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
80 | 69 |
81 CFGAS_GEFont::CFGAS_GEFont(IFGAS_FontMgr* pFontMgr) | 70 CFGAS_GEFont::CFGAS_GEFont(IFGAS_FontMgr* pFontMgr) |
82 : | 71 : |
83 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ | 72 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 } | 148 } |
160 delete this; | 149 delete this; |
161 } | 150 } |
162 } | 151 } |
163 CFGAS_GEFont* CFGAS_GEFont::Retain() { | 152 CFGAS_GEFont* CFGAS_GEFont::Retain() { |
164 ++m_iRefCount; | 153 ++m_iRefCount; |
165 return this; | 154 return this; |
166 } | 155 } |
167 | 156 |
168 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 157 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
169 FX_BOOL CFGAS_GEFont::LoadFont(const FX_WCHAR* pszFontFamily, | 158 FX_BOOL CFGAS_GEFont::LoadFontInternal(const FX_WCHAR* pszFontFamily, |
170 uint32_t dwFontStyles, | 159 uint32_t dwFontStyles, |
171 uint16_t wCodePage) { | 160 uint16_t wCodePage) { |
172 if (m_pFont) { | 161 if (m_pFont) { |
173 return FALSE; | 162 return FALSE; |
174 } | 163 } |
175 CFX_ByteString csFontFamily; | 164 CFX_ByteString csFontFamily; |
176 if (pszFontFamily != NULL) { | 165 if (pszFontFamily != NULL) { |
177 csFontFamily = CFX_ByteString::FromUnicode(pszFontFamily); | 166 csFontFamily = CFX_ByteString::FromUnicode(pszFontFamily); |
178 } | 167 } |
179 uint32_t dwFlags = 0; | 168 uint32_t dwFlags = 0; |
180 if (dwFontStyles & FX_FONTSTYLE_FixedPitch) { | 169 if (dwFontStyles & FX_FONTSTYLE_FixedPitch) { |
181 dwFlags |= FXFONT_FIXED_PITCH; | 170 dwFlags |= FXFONT_FIXED_PITCH; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 csFontFamily += ",Italic"; | 203 csFontFamily += ",Italic"; |
215 } | 204 } |
216 m_pFont->LoadSubst(csFontFamily, TRUE, dwFlags, iWeight, 0, wCodePage); | 205 m_pFont->LoadSubst(csFontFamily, TRUE, dwFlags, iWeight, 0, wCodePage); |
217 FX_BOOL bRet = m_pFont->GetFace() != nullptr; | 206 FX_BOOL bRet = m_pFont->GetFace() != nullptr; |
218 if (bRet) { | 207 if (bRet) { |
219 bRet = InitFont(); | 208 bRet = InitFont(); |
220 } | 209 } |
221 return bRet; | 210 return bRet; |
222 } | 211 } |
223 | 212 |
224 FX_BOOL CFGAS_GEFont::LoadFont(const uint8_t* pBuffer, int32_t length) { | 213 FX_BOOL CFGAS_GEFont::LoadFontInternal(const uint8_t* pBuffer, int32_t length) { |
225 if (m_pFont) { | 214 if (m_pFont) { |
226 return FALSE; | 215 return FALSE; |
227 } | 216 } |
228 m_pFont = new CFX_Font; | 217 m_pFont = new CFX_Font; |
229 FX_BOOL bRet = m_pFont->LoadEmbedded(pBuffer, length); | 218 FX_BOOL bRet = m_pFont->LoadEmbedded(pBuffer, length); |
230 if (bRet) { | 219 if (bRet) { |
231 bRet = InitFont(); | 220 bRet = InitFont(); |
232 } | 221 } |
233 m_wCharSet = 0xFFFF; | 222 m_wCharSet = 0xFFFF; |
234 return bRet; | 223 return bRet; |
235 } | 224 } |
236 | 225 |
237 FX_BOOL CFGAS_GEFont::LoadFontInternal(const FX_WCHAR* pszFileName) { | 226 FX_BOOL CFGAS_GEFont::LoadFontInternal(IFX_Stream* pFontStream, |
238 if (m_pFont || m_pStream || m_pFileRead) { | 227 FX_BOOL bSaveStream) { |
239 return FALSE; | |
240 } | |
241 m_pStream = IFX_Stream::CreateStream( | |
242 pszFileName, FX_STREAMACCESS_Binary | FX_STREAMACCESS_Read); | |
243 m_pFileRead = FX_CreateFileRead(m_pStream); | |
244 FX_BOOL bRet = FALSE; | |
245 if (m_pStream && m_pFileRead) { | |
246 m_pFont = new CFX_Font; | |
247 bRet = m_pFont->LoadFile(m_pFileRead); | |
248 if (bRet) { | |
249 bRet = InitFont(); | |
250 } else { | |
251 m_pFileRead->Release(); | |
252 m_pFileRead = nullptr; | |
253 } | |
254 } | |
255 m_wCharSet = 0xFFFF; | |
256 return bRet; | |
257 } | |
258 | |
259 FX_BOOL CFGAS_GEFont::LoadFont(IFX_Stream* pFontStream, FX_BOOL bSaveStream) { | |
260 if (m_pFont || m_pFileRead || !pFontStream || pFontStream->GetLength() < 1) { | 228 if (m_pFont || m_pFileRead || !pFontStream || pFontStream->GetLength() < 1) { |
261 return FALSE; | 229 return FALSE; |
262 } | 230 } |
263 if (bSaveStream) { | 231 if (bSaveStream) { |
264 m_pStream = pFontStream; | 232 m_pStream = pFontStream; |
265 } | 233 } |
266 m_pFileRead = FX_CreateFileRead(pFontStream); | 234 m_pFileRead = FX_CreateFileRead(pFontStream); |
267 m_pFont = new CFX_Font; | 235 m_pFont = new CFX_Font; |
268 FX_BOOL bRet = m_pFont->LoadFile(m_pFileRead); | 236 FX_BOOL bRet = m_pFont->LoadFile(m_pFileRead); |
269 if (bRet) { | 237 if (bRet) { |
270 bRet = InitFont(); | 238 bRet = InitFont(); |
271 } else { | 239 } else { |
272 m_pFileRead->Release(); | 240 m_pFileRead->Release(); |
273 m_pFileRead = nullptr; | 241 m_pFileRead = nullptr; |
274 } | 242 } |
275 m_wCharSet = 0xFFFF; | 243 m_wCharSet = 0xFFFF; |
276 return bRet; | 244 return bRet; |
277 } | 245 } |
278 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ | 246 #endif // _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ |
279 | 247 |
280 FX_BOOL CFGAS_GEFont::LoadFont(CFX_Font* pExtFont, FX_BOOL bTakeOver) { | 248 FX_BOOL CFGAS_GEFont::LoadFontInternal(CFX_Font* pExtFont) { |
281 if (m_pFont || !pExtFont) { | 249 if (m_pFont || !pExtFont) { |
282 return FALSE; | 250 return FALSE; |
283 } | 251 } |
284 m_pFont = pExtFont; | 252 m_pFont = pExtFont; |
285 FX_BOOL bRet = !!m_pFont; | 253 m_bExtFont = TRUE; |
286 if (bRet) { | |
287 m_bExtFont = !bTakeOver; | |
288 bRet = InitFont(); | |
289 } else { | |
290 m_bExtFont = TRUE; | |
291 } | |
292 m_wCharSet = 0xFFFF; | 254 m_wCharSet = 0xFFFF; |
293 return bRet; | 255 return InitFont(); |
294 } | 256 } |
295 | 257 |
296 FX_BOOL CFGAS_GEFont::InitFont() { | 258 FX_BOOL CFGAS_GEFont::InitFont() { |
297 if (!m_pFont) | 259 if (!m_pFont) |
298 return FALSE; | 260 return FALSE; |
299 if (!m_pFontEncoding) { | 261 if (!m_pFontEncoding) { |
300 m_pFontEncoding = FX_CreateFontEncodingEx(m_pFont); | 262 m_pFontEncoding = FX_CreateFontEncodingEx(m_pFont); |
301 if (!m_pFontEncoding) | 263 if (!m_pFontEncoding) |
302 return FALSE; | 264 return FALSE; |
303 } | 265 } |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
534 } | 496 } |
535 if (m_pRectArray != NULL) { | 497 if (m_pRectArray != NULL) { |
536 m_pRectArray->RemoveAll(); | 498 m_pRectArray->RemoveAll(); |
537 } | 499 } |
538 } | 500 } |
539 CFGAS_GEFont* CFGAS_GEFont::GetSubstFont(int32_t iGlyphIndex) const { | 501 CFGAS_GEFont* CFGAS_GEFont::GetSubstFont(int32_t iGlyphIndex) const { |
540 iGlyphIndex = ((uint32_t)iGlyphIndex) >> 24; | 502 iGlyphIndex = ((uint32_t)iGlyphIndex) >> 24; |
541 return iGlyphIndex == 0 ? const_cast<CFGAS_GEFont*>(this) | 503 return iGlyphIndex == 0 ? const_cast<CFGAS_GEFont*>(this) |
542 : m_SubstFonts[iGlyphIndex - 1]; | 504 : m_SubstFonts[iGlyphIndex - 1]; |
543 } | 505 } |
OLD | NEW |