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 | 11 |
12 IFX_Font* IFX_Font::LoadFont(const FX_WCHAR* pszFontFamily, | 12 IFX_Font* IFX_Font::LoadFont(const FX_WCHAR* pszFontFamily, |
13 FX_DWORD dwFontStyles, | 13 FX_DWORD dwFontStyles, |
14 FX_WORD wCodePage, | 14 uint16_t wCodePage, |
15 IFX_FontMgr* pFontMgr) { | 15 IFX_FontMgr* pFontMgr) { |
16 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ | 16 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ |
17 if (NULL != pFontMgr) { | 17 if (NULL != pFontMgr) { |
18 return pFontMgr->GetFontByCodePage(wCodePage, dwFontStyles, pszFontFamily); | 18 return pFontMgr->GetFontByCodePage(wCodePage, dwFontStyles, pszFontFamily); |
19 } | 19 } |
20 return NULL; | 20 return NULL; |
21 #else | 21 #else |
22 CFX_GEFont* pFont = new CFX_GEFont(pFontMgr); | 22 CFX_GEFont* pFont = new CFX_GEFont(pFontMgr); |
23 if (!pFont->LoadFont(pszFontFamily, dwFontStyles, wCodePage)) { | 23 if (!pFont->LoadFont(pszFontFamily, dwFontStyles, wCodePage)) { |
24 pFont->Release(); | 24 pFont->Release(); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 } | 182 } |
183 delete this; | 183 delete this; |
184 } | 184 } |
185 } | 185 } |
186 IFX_Font* CFX_GEFont::Retain() { | 186 IFX_Font* CFX_GEFont::Retain() { |
187 ++m_iRefCount; | 187 ++m_iRefCount; |
188 return this; | 188 return this; |
189 } | 189 } |
190 FX_BOOL CFX_GEFont::LoadFont(const FX_WCHAR* pszFontFamily, | 190 FX_BOOL CFX_GEFont::LoadFont(const FX_WCHAR* pszFontFamily, |
191 FX_DWORD dwFontStyles, | 191 FX_DWORD dwFontStyles, |
192 FX_WORD wCodePage) { | 192 uint16_t wCodePage) { |
193 if (m_pFont) { | 193 if (m_pFont) { |
194 return FALSE; | 194 return FALSE; |
195 } | 195 } |
196 CFX_ByteString csFontFamily; | 196 CFX_ByteString csFontFamily; |
197 if (pszFontFamily != NULL) { | 197 if (pszFontFamily != NULL) { |
198 csFontFamily = CFX_ByteString::FromUnicode(pszFontFamily); | 198 csFontFamily = CFX_ByteString::FromUnicode(pszFontFamily); |
199 } | 199 } |
200 FX_DWORD dwFlags = 0; | 200 FX_DWORD dwFlags = 0; |
201 if (dwFontStyles & FX_FONTSTYLE_FixedPitch) { | 201 if (dwFontStyles & FX_FONTSTYLE_FixedPitch) { |
202 dwFlags |= FXFONT_FIXED_PITCH; | 202 dwFlags |= FXFONT_FIXED_PITCH; |
(...skipping 11 matching lines...) Expand all Loading... |
214 dwFlags |= FXFONT_ITALIC; | 214 dwFlags |= FXFONT_ITALIC; |
215 } | 215 } |
216 if (dwFontStyles & FX_FONTSTYLE_Bold) { | 216 if (dwFontStyles & FX_FONTSTYLE_Bold) { |
217 dwFlags |= FXFONT_BOLD; | 217 dwFlags |= FXFONT_BOLD; |
218 } | 218 } |
219 if (dwFontStyles & FX_FONTSTYLE_ExactMatch) { | 219 if (dwFontStyles & FX_FONTSTYLE_ExactMatch) { |
220 dwFlags |= FXFONT_EXACTMATCH; | 220 dwFlags |= FXFONT_EXACTMATCH; |
221 } | 221 } |
222 int32_t iWeight = | 222 int32_t iWeight = |
223 (dwFontStyles & FX_FONTSTYLE_Bold) ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL; | 223 (dwFontStyles & FX_FONTSTYLE_Bold) ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL; |
224 FX_WORD wCharSet = FX_GetCharsetFromCodePage(wCodePage); | 224 uint16_t wCharSet = FX_GetCharsetFromCodePage(wCodePage); |
225 if (wCharSet == 0xFFFF) { | 225 if (wCharSet == 0xFFFF) { |
226 wCharSet = FXSYS_GetACP(); | 226 wCharSet = FXSYS_GetACP(); |
227 } | 227 } |
228 m_wCharSet = wCharSet; | 228 m_wCharSet = wCharSet; |
229 m_pFont = new CFX_Font; | 229 m_pFont = new CFX_Font; |
230 if ((dwFlags & FXFONT_ITALIC) && (dwFlags & FXFONT_BOLD)) { | 230 if ((dwFlags & FXFONT_ITALIC) && (dwFlags & FXFONT_BOLD)) { |
231 csFontFamily += ",BoldItalic"; | 231 csFontFamily += ",BoldItalic"; |
232 } else if (dwFlags & FXFONT_BOLD) { | 232 } else if (dwFlags & FXFONT_BOLD) { |
233 csFontFamily += ",Bold"; | 233 csFontFamily += ",Bold"; |
234 } else if (dwFlags & FXFONT_ITALIC) { | 234 } else if (dwFlags & FXFONT_ITALIC) { |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 m_pCharWidthMap = new CFX_WordDiscreteArray(1024); | 322 m_pCharWidthMap = new CFX_WordDiscreteArray(1024); |
323 } | 323 } |
324 if (!m_pRectArray) { | 324 if (!m_pRectArray) { |
325 m_pRectArray = new CFX_RectMassArray(16); | 325 m_pRectArray = new CFX_RectMassArray(16); |
326 } | 326 } |
327 if (!m_pBBoxMap) { | 327 if (!m_pBBoxMap) { |
328 m_pBBoxMap = new CFX_MapPtrToPtr(16); | 328 m_pBBoxMap = new CFX_MapPtrToPtr(16); |
329 } | 329 } |
330 return TRUE; | 330 return TRUE; |
331 } | 331 } |
332 IFX_Font* CFX_GEFont::Derive(FX_DWORD dwFontStyles, FX_WORD wCodePage) { | 332 IFX_Font* CFX_GEFont::Derive(FX_DWORD dwFontStyles, uint16_t wCodePage) { |
333 if (GetFontStyles() == dwFontStyles) { | 333 if (GetFontStyles() == dwFontStyles) { |
334 return Retain(); | 334 return Retain(); |
335 } | 335 } |
336 return new CFX_GEFont(*this, dwFontStyles); | 336 return new CFX_GEFont(*this, dwFontStyles); |
337 } | 337 } |
338 uint8_t CFX_GEFont::GetCharSet() const { | 338 uint8_t CFX_GEFont::GetCharSet() const { |
339 if (m_wCharSet != 0xFFFF) { | 339 if (m_wCharSet != 0xFFFF) { |
340 return (uint8_t)m_wCharSet; | 340 return (uint8_t)m_wCharSet; |
341 } | 341 } |
342 if (!m_pFont->GetSubstFont()) { | 342 if (!m_pFont->GetSubstFont()) { |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
482 if (iGlyphIndex > 0) { | 482 if (iGlyphIndex > 0) { |
483 if (ppFont != NULL) { | 483 if (ppFont != NULL) { |
484 *ppFont = (IFX_Font*)this; | 484 *ppFont = (IFX_Font*)this; |
485 } | 485 } |
486 return iGlyphIndex; | 486 return iGlyphIndex; |
487 } | 487 } |
488 const FGAS_FONTUSB* pFontUSB = FGAS_GetUnicodeBitField(wUnicode); | 488 const FGAS_FONTUSB* pFontUSB = FGAS_GetUnicodeBitField(wUnicode); |
489 if (pFontUSB == NULL) { | 489 if (pFontUSB == NULL) { |
490 return 0xFFFF; | 490 return 0xFFFF; |
491 } | 491 } |
492 FX_WORD wBitField = pFontUSB->wBitField; | 492 uint16_t wBitField = pFontUSB->wBitField; |
493 if (wBitField >= 128) { | 493 if (wBitField >= 128) { |
494 return 0xFFFF; | 494 return 0xFFFF; |
495 } | 495 } |
496 IFX_Font* pFont = NULL; | 496 IFX_Font* pFont = NULL; |
497 m_FontMapper.Lookup((void*)(uintptr_t)wUnicode, (void*&)pFont); | 497 m_FontMapper.Lookup((void*)(uintptr_t)wUnicode, (void*&)pFont); |
498 if (pFont != NULL && pFont != (IFX_Font*)this) { | 498 if (pFont != NULL && pFont != (IFX_Font*)this) { |
499 iGlyphIndex = | 499 iGlyphIndex = |
500 ((CFX_GEFont*)pFont)->GetGlyphIndex(wUnicode, FALSE, NULL, bCharCode); | 500 ((CFX_GEFont*)pFont)->GetGlyphIndex(wUnicode, FALSE, NULL, bCharCode); |
501 if (iGlyphIndex != 0xFFFF) { | 501 if (iGlyphIndex != 0xFFFF) { |
502 int32_t i = m_SubstFonts.Find(pFont); | 502 int32_t i = m_SubstFonts.Find(pFont); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
563 } | 563 } |
564 if (m_pRectArray != NULL) { | 564 if (m_pRectArray != NULL) { |
565 m_pRectArray->RemoveAll(); | 565 m_pRectArray->RemoveAll(); |
566 } | 566 } |
567 } | 567 } |
568 IFX_Font* CFX_GEFont::GetSubstFont(int32_t iGlyphIndex) const { | 568 IFX_Font* CFX_GEFont::GetSubstFont(int32_t iGlyphIndex) const { |
569 iGlyphIndex = ((FX_DWORD)iGlyphIndex) >> 24; | 569 iGlyphIndex = ((FX_DWORD)iGlyphIndex) >> 24; |
570 return iGlyphIndex == 0 ? (IFX_Font*)this | 570 return iGlyphIndex == 0 ? (IFX_Font*)this |
571 : (IFX_Font*)m_SubstFonts[iGlyphIndex - 1]; | 571 : (IFX_Font*)m_SubstFonts[iGlyphIndex - 1]; |
572 } | 572 } |
OLD | NEW |