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 "../../../include/fxge/fx_ge.h" | 7 #include "../../../include/fxge/fx_ge.h" |
8 #include "../../../include/fxge/fx_freetype.h" | 8 #include "../../../include/fxge/fx_freetype.h" |
9 #include "text_int.h" | 9 #include "text_int.h" |
10 #define EM_ADJUST(em, a) (em == 0 ? (a) : (a)*1000 / em) | 10 #define EM_ADJUST(em, a) (em == 0 ? (a) : (a)*1000 / em) |
11 extern void _FPDFAPI_GetInternalFontData(int id1, | 11 extern void _FPDFAPI_GetInternalFontData(int id1, |
12 const uint8_t*& data, | 12 const uint8_t*& data, |
13 FX_DWORD& size); | 13 FX_DWORD& size); |
14 CFX_Font::CFX_Font() { | 14 CFX_Font::CFX_Font() { |
15 m_pSubstFont = NULL; | 15 m_pSubstFont = NULL; |
16 m_Face = NULL; | 16 m_Face = NULL; |
17 m_bEmbedded = FALSE; | 17 m_bEmbedded = FALSE; |
18 m_bVertical = FALSE; | 18 m_bVertical = FALSE; |
19 m_pFontData = NULL; | 19 m_pFontData = NULL; |
20 m_pFontDataAllocation = NULL; | 20 m_pFontDataAllocation = NULL; |
21 m_dwSize = 0; | 21 m_dwSize = 0; |
22 m_pOwnedStream = NULL; | |
23 m_pGsubData = NULL; | 22 m_pGsubData = NULL; |
24 m_pPlatformFont = NULL; | 23 m_pPlatformFont = NULL; |
25 m_pPlatformFontCollection = NULL; | 24 m_pPlatformFontCollection = NULL; |
26 m_pDwFont = NULL; | 25 m_pDwFont = NULL; |
27 m_hHandle = NULL; | 26 m_hHandle = NULL; |
28 m_bDwLoaded = FALSE; | 27 m_bDwLoaded = FALSE; |
29 } | 28 } |
30 CFX_Font::~CFX_Font() { | 29 CFX_Font::~CFX_Font() { |
31 delete m_pSubstFont; | 30 delete m_pSubstFont; |
32 m_pSubstFont = NULL; | 31 m_pSubstFont = NULL; |
33 FX_Free(m_pFontDataAllocation); | 32 FX_Free(m_pFontDataAllocation); |
34 m_pFontDataAllocation = NULL; | 33 m_pFontDataAllocation = NULL; |
35 if (m_Face) { | 34 if (m_Face) { |
36 if (FXFT_Get_Face_External_Stream(m_Face)) { | 35 if (FXFT_Get_Face_External_Stream(m_Face)) { |
37 FXFT_Clear_Face_External_Stream(m_Face); | 36 FXFT_Clear_Face_External_Stream(m_Face); |
38 } | 37 } |
39 if (m_bEmbedded) { | 38 if (m_bEmbedded) { |
40 DeleteFace(); | 39 DeleteFace(); |
41 } else { | 40 } else { |
42 CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face); | 41 CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face); |
43 } | 42 } |
44 } | 43 } |
45 FX_Free(m_pOwnedStream); | |
46 m_pOwnedStream = NULL; | |
47 FX_Free(m_pGsubData); | 44 FX_Free(m_pGsubData); |
48 m_pGsubData = NULL; | 45 m_pGsubData = NULL; |
49 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ | 46 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ |
50 ReleasePlatformResource(); | 47 ReleasePlatformResource(); |
51 #endif | 48 #endif |
52 } | 49 } |
53 void CFX_Font::DeleteFace() { | 50 void CFX_Font::DeleteFace() { |
54 FXFT_Done_Face(m_Face); | 51 FXFT_Done_Face(m_Face); |
55 m_Face = NULL; | 52 m_Face = NULL; |
56 } | 53 } |
(...skipping 15 matching lines...) Expand all Loading... |
72 m_pPlatformFont = m_pSubstFont->m_ExtHandle; | 69 m_pPlatformFont = m_pSubstFont->m_ExtHandle; |
73 m_pSubstFont->m_ExtHandle = NULL; | 70 m_pSubstFont->m_ExtHandle = NULL; |
74 } | 71 } |
75 #endif | 72 #endif |
76 if (m_Face) { | 73 if (m_Face) { |
77 m_pFontData = FXFT_Get_Face_Stream_Base(m_Face); | 74 m_pFontData = FXFT_Get_Face_Stream_Base(m_Face); |
78 m_dwSize = FXFT_Get_Face_Stream_Size(m_Face); | 75 m_dwSize = FXFT_Get_Face_Stream_Size(m_Face); |
79 } | 76 } |
80 return TRUE; | 77 return TRUE; |
81 } | 78 } |
82 extern "C" { | 79 |
83 unsigned long _FTStreamRead(FXFT_Stream stream, | |
84 unsigned long offset, | |
85 unsigned char* buffer, | |
86 unsigned long count) { | |
87 if (count == 0) { | |
88 return 0; | |
89 } | |
90 IFX_FileRead* pFile = (IFX_FileRead*)stream->descriptor.pointer; | |
91 int res = pFile->ReadBlock(buffer, offset, count); | |
92 if (res) { | |
93 return count; | |
94 } | |
95 return 0; | |
96 } | |
97 void _FTStreamClose(FXFT_Stream stream) {} | |
98 }; | |
99 FX_BOOL _LoadFile(FXFT_Library library, | |
100 FXFT_Face* Face, | |
101 IFX_FileRead* pFile, | |
102 FXFT_Stream* stream) { | |
103 FXFT_Stream stream1 = (FXFT_Stream)FX_Alloc(uint8_t, sizeof(FXFT_StreamRec)); | |
104 stream1->base = NULL; | |
105 stream1->size = (unsigned long)pFile->GetSize(); | |
106 stream1->pos = 0; | |
107 stream1->descriptor.pointer = pFile; | |
108 stream1->close = _FTStreamClose; | |
109 stream1->read = _FTStreamRead; | |
110 FXFT_Open_Args args; | |
111 args.flags = FT_OPEN_STREAM; | |
112 args.stream = stream1; | |
113 if (FXFT_Open_Face(library, &args, 0, Face)) { | |
114 FX_Free(stream1); | |
115 return FALSE; | |
116 } | |
117 if (stream) { | |
118 *stream = stream1; | |
119 } | |
120 return TRUE; | |
121 } | |
122 FX_BOOL CFX_Font::LoadFile(IFX_FileRead* pFile) { | |
123 m_bEmbedded = FALSE; | |
124 FXFT_Library library; | |
125 if (CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary == NULL) { | |
126 FXFT_Init_FreeType(&CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary); | |
127 } | |
128 library = CFX_GEModule::Get()->GetFontMgr()->m_FTLibrary; | |
129 FXFT_Stream stream = NULL; | |
130 if (!_LoadFile(library, &m_Face, pFile, &stream)) { | |
131 return FALSE; | |
132 } | |
133 m_pOwnedStream = stream; | |
134 FXFT_Set_Pixel_Sizes(m_Face, 0, 64); | |
135 return TRUE; | |
136 } | |
137 int CFX_Font::GetGlyphWidth(FX_DWORD glyph_index) { | 80 int CFX_Font::GetGlyphWidth(FX_DWORD glyph_index) { |
138 if (!m_Face) { | 81 if (!m_Face) { |
139 return 0; | 82 return 0; |
140 } | 83 } |
141 if (m_pSubstFont && (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM)) { | 84 if (m_pSubstFont && (m_pSubstFont->m_SubstFlags & FXFONT_SUBST_MM)) { |
142 AdjustMMParams(glyph_index, 0, 0); | 85 AdjustMMParams(glyph_index, 0, 0); |
143 } | 86 } |
144 int err = FXFT_Load_Glyph( | 87 int err = FXFT_Load_Glyph( |
145 m_Face, glyph_index, | 88 m_Face, glyph_index, |
146 FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); | 89 FXFT_LOAD_NO_SCALE | FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); |
(...skipping 23 matching lines...) Expand all Loading... |
170 } | 113 } |
171 FX_BOOL CFX_Font::LoadEmbedded(const uint8_t* data, FX_DWORD size) { | 114 FX_BOOL CFX_Font::LoadEmbedded(const uint8_t* data, FX_DWORD size) { |
172 m_pFontDataAllocation = FX_Alloc(uint8_t, size); | 115 m_pFontDataAllocation = FX_Alloc(uint8_t, size); |
173 FXSYS_memcpy(m_pFontDataAllocation, data, size); | 116 FXSYS_memcpy(m_pFontDataAllocation, data, size); |
174 m_Face = FT_LoadFont((uint8_t*)m_pFontDataAllocation, size); | 117 m_Face = FT_LoadFont((uint8_t*)m_pFontDataAllocation, size); |
175 m_pFontData = (uint8_t*)m_pFontDataAllocation; | 118 m_pFontData = (uint8_t*)m_pFontDataAllocation; |
176 m_bEmbedded = TRUE; | 119 m_bEmbedded = TRUE; |
177 m_dwSize = size; | 120 m_dwSize = size; |
178 return m_Face != NULL; | 121 return m_Face != NULL; |
179 } | 122 } |
180 FX_BOOL CFX_Font::IsTTFont() { | 123 |
181 if (m_Face == NULL) { | 124 FX_BOOL CFX_Font::IsTTFont() const { |
| 125 if (!m_Face) |
182 return FALSE; | 126 return FALSE; |
183 } | |
184 return FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT; | 127 return FXFT_Is_Face_TT_OT(m_Face) == FXFT_FACE_FLAG_SFNT; |
185 } | 128 } |
| 129 |
186 int CFX_Font::GetAscent() const { | 130 int CFX_Font::GetAscent() const { |
187 if (m_Face == NULL) { | 131 if (!m_Face) |
188 return 0; | 132 return 0; |
189 } | 133 return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), |
190 int ascent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), | 134 FXFT_Get_Face_Ascender(m_Face)); |
191 FXFT_Get_Face_Ascender(m_Face)); | |
192 return ascent; | |
193 } | 135 } |
| 136 |
194 int CFX_Font::GetDescent() const { | 137 int CFX_Font::GetDescent() const { |
195 if (m_Face == NULL) { | 138 if (!m_Face) |
196 return 0; | 139 return 0; |
197 } | 140 return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), |
198 int descent = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), | 141 FXFT_Get_Face_Descender(m_Face)); |
199 FXFT_Get_Face_Descender(m_Face)); | |
200 return descent; | |
201 } | 142 } |
| 143 |
202 FX_BOOL CFX_Font::GetGlyphBBox(FX_DWORD glyph_index, FX_RECT& bbox) { | 144 FX_BOOL CFX_Font::GetGlyphBBox(FX_DWORD glyph_index, FX_RECT& bbox) { |
203 if (m_Face == NULL) { | 145 if (!m_Face) |
204 return FALSE; | 146 return FALSE; |
205 } | 147 |
206 if (FXFT_Is_Face_Tricky(m_Face)) { | 148 if (FXFT_Is_Face_Tricky(m_Face)) { |
207 int error = FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72); | 149 int error = FXFT_Set_Char_Size(m_Face, 0, 1000 * 64, 72, 72); |
208 if (error) { | 150 if (error) { |
209 return FALSE; | 151 return FALSE; |
210 } | 152 } |
211 error = FXFT_Load_Glyph(m_Face, glyph_index, | 153 error = FXFT_Load_Glyph(m_Face, glyph_index, |
212 FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); | 154 FXFT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH); |
213 if (error) { | 155 if (error) { |
214 return FALSE; | 156 return FALSE; |
215 } | 157 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 bbox.top = | 200 bbox.top = |
259 (FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face)) * | 201 (FXFT_Get_Glyph_HoriBearingY(m_Face) - FXFT_Get_Glyph_Height(m_Face)) * |
260 1000 / em; | 202 1000 / em; |
261 bbox.right = | 203 bbox.right = |
262 (FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face)) * | 204 (FXFT_Get_Glyph_HoriBearingX(m_Face) + FXFT_Get_Glyph_Width(m_Face)) * |
263 1000 / em; | 205 1000 / em; |
264 bbox.bottom = (FXFT_Get_Glyph_HoriBearingY(m_Face)) * 1000 / em; | 206 bbox.bottom = (FXFT_Get_Glyph_HoriBearingY(m_Face)) * 1000 / em; |
265 } | 207 } |
266 return TRUE; | 208 return TRUE; |
267 } | 209 } |
268 FX_BOOL CFX_Font::IsItalic() { | 210 |
269 if (m_Face == NULL) { | 211 FX_BOOL CFX_Font::IsItalic() const { |
| 212 if (!m_Face) |
270 return FALSE; | 213 return FALSE; |
271 } | 214 |
272 FX_BOOL ret = FXFT_Is_Face_Italic(m_Face) == FXFT_STYLE_FLAG_ITALIC; | 215 FX_BOOL ret = FXFT_Is_Face_Italic(m_Face) == FXFT_STYLE_FLAG_ITALIC; |
273 if (!ret) { | 216 if (!ret) { |
274 CFX_ByteString str(FXFT_Get_Face_Style_Name(m_Face)); | 217 CFX_ByteString str(FXFT_Get_Face_Style_Name(m_Face)); |
275 str.MakeLower(); | 218 str.MakeLower(); |
276 if (str.Find("italic") != -1) { | 219 if (str.Find("italic") != -1) { |
277 ret = TRUE; | 220 ret = TRUE; |
278 } | 221 } |
279 } | 222 } |
280 return ret; | 223 return ret; |
281 } | 224 } |
282 FX_BOOL CFX_Font::IsBold() { | 225 |
283 if (m_Face == NULL) { | 226 FX_BOOL CFX_Font::IsBold() const { |
| 227 if (!m_Face) |
284 return FALSE; | 228 return FALSE; |
285 } | |
286 return FXFT_Is_Face_Bold(m_Face) == FXFT_STYLE_FLAG_BOLD; | 229 return FXFT_Is_Face_Bold(m_Face) == FXFT_STYLE_FLAG_BOLD; |
287 } | 230 } |
288 FX_BOOL CFX_Font::IsFixedWidth() { | 231 |
289 if (m_Face == NULL) { | 232 FX_BOOL CFX_Font::IsFixedWidth() const { |
| 233 if (!m_Face) |
290 return FALSE; | 234 return FALSE; |
291 } | |
292 return FXFT_Is_Face_fixedwidth(m_Face); | 235 return FXFT_Is_Face_fixedwidth(m_Face); |
293 } | 236 } |
| 237 |
294 CFX_WideString CFX_Font::GetPsName() const { | 238 CFX_WideString CFX_Font::GetPsName() const { |
295 if (m_Face == NULL) { | 239 if (m_Face == NULL) { |
296 return CFX_WideString(); | 240 return CFX_WideString(); |
297 } | 241 } |
298 CFX_WideString psName = | 242 CFX_WideString psName = |
299 CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(m_Face)); | 243 CFX_WideString::FromLocal(FXFT_Get_Postscript_Name(m_Face)); |
300 if (psName.IsEmpty()) { | 244 if (psName.IsEmpty()) { |
301 psName = CFX_WideString::FromLocal("Untitled"); | 245 psName = CFX_WideString::FromLocal("Untitled"); |
302 } | 246 } |
303 return psName; | 247 return psName; |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 bbox.top = FXFT_Get_Face_yMin(m_Face); | 284 bbox.top = FXFT_Get_Face_yMin(m_Face); |
341 bbox.right = FXFT_Get_Face_xMax(m_Face); | 285 bbox.right = FXFT_Get_Face_xMax(m_Face); |
342 } else { | 286 } else { |
343 bbox.left = FXFT_Get_Face_xMin(m_Face) * 1000 / em; | 287 bbox.left = FXFT_Get_Face_xMin(m_Face) * 1000 / em; |
344 bbox.top = FXFT_Get_Face_yMin(m_Face) * 1000 / em; | 288 bbox.top = FXFT_Get_Face_yMin(m_Face) * 1000 / em; |
345 bbox.right = FXFT_Get_Face_xMax(m_Face) * 1000 / em; | 289 bbox.right = FXFT_Get_Face_xMax(m_Face) * 1000 / em; |
346 bbox.bottom = FXFT_Get_Face_yMax(m_Face) * 1000 / em; | 290 bbox.bottom = FXFT_Get_Face_yMax(m_Face) * 1000 / em; |
347 } | 291 } |
348 return TRUE; | 292 return TRUE; |
349 } | 293 } |
350 int CFX_Font::GetHeight() { | 294 |
351 if (m_Face == NULL) { | 295 int CFX_Font::GetHeight() const { |
| 296 if (!m_Face) |
352 return 0; | 297 return 0; |
353 } | 298 |
354 int height = | 299 return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), |
355 EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), FXFT_Get_Face_Height(m_Face)); | 300 FXFT_Get_Face_Height(m_Face)); |
356 return height; | |
357 } | 301 } |
358 int CFX_Font::GetMaxAdvanceWidth() { | 302 |
359 if (m_Face == NULL) { | 303 int CFX_Font::GetMaxAdvanceWidth() const { |
| 304 if (!m_Face) |
360 return 0; | 305 return 0; |
361 } | 306 |
362 int width = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), | 307 return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), |
363 FXFT_Get_Face_MaxAdvanceWidth(m_Face)); | 308 FXFT_Get_Face_MaxAdvanceWidth(m_Face)); |
364 return width; | |
365 } | 309 } |
366 int CFX_Font::GetULPos() { | 310 |
367 if (m_Face == NULL) { | 311 int CFX_Font::GetULPos() const { |
| 312 if (!m_Face) |
368 return 0; | 313 return 0; |
369 } | 314 |
370 int pos = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), | 315 return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), |
371 FXFT_Get_Face_UnderLinePosition(m_Face)); | 316 FXFT_Get_Face_UnderLinePosition(m_Face)); |
372 return pos; | |
373 } | 317 } |
374 int CFX_Font::GetULthickness() { | 318 |
375 if (m_Face == NULL) { | 319 int CFX_Font::GetULthickness() const { |
| 320 if (!m_Face) |
376 return 0; | 321 return 0; |
377 } | 322 |
378 int thickness = EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), | 323 return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), |
379 FXFT_Get_Face_UnderLineThickness(m_Face)); | 324 FXFT_Get_Face_UnderLineThickness(m_Face)); |
380 return thickness; | |
381 } | 325 } |
382 | 326 |
383 CFX_UnicodeEncoding::CFX_UnicodeEncoding(CFX_Font* pFont) : m_pFont(pFont) { | 327 CFX_UnicodeEncoding::CFX_UnicodeEncoding(CFX_Font* pFont) : m_pFont(pFont) { |
384 } | 328 } |
385 | 329 |
386 CFX_UnicodeEncoding::~CFX_UnicodeEncoding() { | 330 CFX_UnicodeEncoding::~CFX_UnicodeEncoding() { |
387 } | 331 } |
388 | 332 |
389 FX_DWORD CFX_UnicodeEncoding::GlyphFromCharCode(FX_DWORD charcode) { | 333 FX_DWORD CFX_UnicodeEncoding::GlyphFromCharCode(FX_DWORD charcode) { |
390 FXFT_Face face = m_pFont->GetFace(); | 334 FXFT_Face face = m_pFont->GetFace(); |
391 if (!face) | 335 if (!face) |
392 return charcode; | 336 return charcode; |
393 | 337 |
394 if (FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE) == 0) | 338 if (FXFT_Select_Charmap(face, FXFT_ENCODING_UNICODE) == 0) |
395 return FXFT_Get_Char_Index(face, charcode); | 339 return FXFT_Get_Char_Index(face, charcode); |
396 | 340 |
397 if (m_pFont->m_pSubstFont && m_pFont->m_pSubstFont->m_Charset == 2) { | 341 if (m_pFont->GetSubstFont() && m_pFont->GetSubstFont()->m_Charset == 2) { |
398 FX_DWORD index = 0; | 342 FX_DWORD index = 0; |
399 if (FXFT_Select_Charmap(face, FXFT_ENCODING_MS_SYMBOL) == 0) | 343 if (FXFT_Select_Charmap(face, FXFT_ENCODING_MS_SYMBOL) == 0) |
400 index = FXFT_Get_Char_Index(face, charcode); | 344 index = FXFT_Get_Char_Index(face, charcode); |
401 if (!index && !FXFT_Select_Charmap(face, FXFT_ENCODING_APPLE_ROMAN)) | 345 if (!index && !FXFT_Select_Charmap(face, FXFT_ENCODING_APPLE_ROMAN)) |
402 return FXFT_Get_Char_Index(face, charcode); | 346 return FXFT_Get_Char_Index(face, charcode); |
403 } | 347 } |
404 return charcode; | 348 return charcode; |
405 } | 349 } |
OLD | NEW |