Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(897)

Side by Side Diff: core/fxge/ge/cfx_font.cpp

Issue 2158023002: Pdfium: Fix fonts leaking on ClosePage. (Closed) Base URL: https://pdfium.googlesource.com/pdfium@master
Patch Set: Fix xfa tests. Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "core/fxge/include/fx_font.h" 7 #include "core/fxge/include/fx_font.h"
8 8
9 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h" 9 #include "core/fpdfapi/fpdf_font/include/cpdf_font.h"
10 #include "core/fxge/ge/fx_text_int.h" 10 #include "core/fxge/ge/fx_text_int.h"
11 #include "core/fxge/include/cfx_facecache.h"
12 #include "core/fxge/include/cfx_fontcache.h"
11 #include "core/fxge/include/cfx_fontmgr.h" 13 #include "core/fxge/include/cfx_fontmgr.h"
12 #include "core/fxge/include/cfx_gemodule.h" 14 #include "core/fxge/include/cfx_gemodule.h"
13 #include "core/fxge/include/cfx_pathdata.h" 15 #include "core/fxge/include/cfx_pathdata.h"
14 #include "core/fxge/include/cfx_substfont.h" 16 #include "core/fxge/include/cfx_substfont.h"
15 #include "core/fxge/include/fx_freetype.h" 17 #include "core/fxge/include/fx_freetype.h"
16 18
17 #define EM_ADJUST(em, a) (em == 0 ? (a) : (a)*1000 / em) 19 #define EM_ADJUST(em, a) (em == 0 ? (a) : (a)*1000 / em)
18 20
19 namespace { 21 namespace {
20 22
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
217 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 219 59, 59, 59, 59, 59, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60,
218 }; 220 };
219 221
220 CFX_Font::CFX_Font() 222 CFX_Font::CFX_Font()
221 : 223 :
222 #ifdef PDF_ENABLE_XFA 224 #ifdef PDF_ENABLE_XFA
223 m_bShallowCopy(false), 225 m_bShallowCopy(false),
224 m_pOwnedStream(nullptr), 226 m_pOwnedStream(nullptr),
225 #endif // PDF_ENABLE_XFA 227 #endif // PDF_ENABLE_XFA
226 m_Face(nullptr), 228 m_Face(nullptr),
229 m_FaceCache(nullptr),
227 m_pFontData(nullptr), 230 m_pFontData(nullptr),
228 m_pGsubData(nullptr), 231 m_pGsubData(nullptr),
229 m_dwSize(0), 232 m_dwSize(0),
230 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 233 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
231 m_pPlatformFont(nullptr), 234 m_pPlatformFont(nullptr),
232 #endif 235 #endif
233 m_bEmbedded(FALSE), 236 m_bEmbedded(FALSE),
234 m_bVertical(FALSE) { 237 m_bVertical(FALSE) {
235 } 238 }
236 239
(...skipping 18 matching lines...) Expand all
255 m_Face = pFont->m_Face; 258 m_Face = pFont->m_Face;
256 m_bEmbedded = pFont->m_bEmbedded; 259 m_bEmbedded = pFont->m_bEmbedded;
257 m_bVertical = pFont->m_bVertical; 260 m_bVertical = pFont->m_bVertical;
258 m_dwSize = pFont->m_dwSize; 261 m_dwSize = pFont->m_dwSize;
259 m_pFontData = pFont->m_pFontData; 262 m_pFontData = pFont->m_pFontData;
260 m_pGsubData = pFont->m_pGsubData; 263 m_pGsubData = pFont->m_pGsubData;
261 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 264 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
262 m_pPlatformFont = pFont->m_pPlatformFont; 265 m_pPlatformFont = pFont->m_pPlatformFont;
263 #endif 266 #endif
264 m_pOwnedStream = pFont->m_pOwnedStream; 267 m_pOwnedStream = pFont->m_pOwnedStream;
268 m_FaceCache = pFont->GetFaceCache();
265 return TRUE; 269 return TRUE;
266 } 270 }
271
272 void CFX_Font::SetFace(FXFT_Face face) {
273 ClearFaceCache();
274 m_Face = face;
275 }
276
267 #endif // PDF_ENABLE_XFA 277 #endif // PDF_ENABLE_XFA
268 278
269 CFX_Font::~CFX_Font() { 279 CFX_Font::~CFX_Font() {
270 #ifdef PDF_ENABLE_XFA 280 #ifdef PDF_ENABLE_XFA
271 if (m_bShallowCopy) { 281 if (m_bShallowCopy) {
272 m_OtfFontData.DetachBuffer(); 282 m_OtfFontData.DetachBuffer();
273 return; 283 return;
274 } 284 }
275 #endif // PDF_ENABLE_XFA 285 #endif // PDF_ENABLE_XFA
276 if (m_Face) { 286 if (m_Face) {
277 #ifndef PDF_ENABLE_XFA 287 #ifndef PDF_ENABLE_XFA
278 if (FXFT_Get_Face_External_Stream(m_Face)) { 288 if (FXFT_Get_Face_External_Stream(m_Face)) {
279 FXFT_Clear_Face_External_Stream(m_Face); 289 FXFT_Clear_Face_External_Stream(m_Face);
280 } 290 }
281 #endif // PDF_ENABLE_XFA 291 #endif // PDF_ENABLE_XFA
282 if (m_bEmbedded) 292 DeleteFace();
283 DeleteFace();
284 else
285 CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face);
286 } 293 }
287 #ifdef PDF_ENABLE_XFA 294 #ifdef PDF_ENABLE_XFA
288 delete m_pOwnedStream; 295 delete m_pOwnedStream;
289 #endif // PDF_ENABLE_XFA 296 #endif // PDF_ENABLE_XFA
290 FX_Free(m_pGsubData); 297 FX_Free(m_pGsubData);
291 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && !defined _SKIA_SUPPORT_ 298 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ && !defined _SKIA_SUPPORT_
292 ReleasePlatformResource(); 299 ReleasePlatformResource();
293 #endif 300 #endif
294 } 301 }
295 302
296 void CFX_Font::DeleteFace() { 303 void CFX_Font::DeleteFace() {
297 FXFT_Done_Face(m_Face); 304 ClearFaceCache();
305 if (m_bEmbedded) {
306 FXFT_Done_Face(m_Face);
307 } else {
308 CFX_GEModule::Get()->GetFontMgr()->ReleaseFace(m_Face);
309 }
298 m_Face = nullptr; 310 m_Face = nullptr;
299 } 311 }
300 312
301 void CFX_Font::LoadSubst(const CFX_ByteString& face_name, 313 void CFX_Font::LoadSubst(const CFX_ByteString& face_name,
302 FX_BOOL bTrueType, 314 FX_BOOL bTrueType,
303 uint32_t flags, 315 uint32_t flags,
304 int weight, 316 int weight,
305 int italic_angle, 317 int italic_angle,
306 int CharsetCP, 318 int CharsetCP,
307 FX_BOOL bVertical) { 319 FX_BOOL bVertical) {
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 } 542 }
531 543
532 int CFX_Font::GetMaxAdvanceWidth() const { 544 int CFX_Font::GetMaxAdvanceWidth() const {
533 if (!m_Face) 545 if (!m_Face)
534 return 0; 546 return 0;
535 547
536 return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), 548 return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
537 FXFT_Get_Face_MaxAdvanceWidth(m_Face)); 549 FXFT_Get_Face_MaxAdvanceWidth(m_Face));
538 } 550 }
539 551
552 CFX_FaceCache* CFX_Font::GetFaceCache() const {
553 if (!m_FaceCache) {
554 m_FaceCache = CFX_GEModule::Get()->GetFontCache()->GetCachedFace(this);
npm 2016/09/14 23:07:59 Now you always get the facecache from CFX_GEModule
snake 2016/09/15 10:39:25 Yes. Before: Cached items in CFX_FontCache, was n
555 }
556 return m_FaceCache;
557 }
558
559 void CFX_Font::ClearFaceCache() {
560 if (!m_FaceCache)
561 return;
562 CFX_GEModule::Get()->GetFontCache()->ReleaseCachedFace(this);
563 m_FaceCache = nullptr;
564 }
565
540 int CFX_Font::GetULPos() const { 566 int CFX_Font::GetULPos() const {
541 if (!m_Face) 567 if (!m_Face)
542 return 0; 568 return 0;
543 569
544 return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), 570 return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
545 FXFT_Get_Face_UnderLinePosition(m_Face)); 571 FXFT_Get_Face_UnderLinePosition(m_Face));
546 } 572 }
547 573
548 int CFX_Font::GetULthickness() const { 574 int CFX_Font::GetULthickness() const {
549 if (!m_Face) 575 if (!m_Face)
550 return 0; 576 return 0;
551 577
552 return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face), 578 return EM_ADJUST(FXFT_Get_Face_UnitsPerEM(m_Face),
553 FXFT_Get_Face_UnderLineThickness(m_Face)); 579 FXFT_Get_Face_UnderLineThickness(m_Face));
554 } 580 }
555 581
556 void CFX_Font::AdjustMMParams(int glyph_index, int dest_width, int weight) { 582 void CFX_Font::AdjustMMParams(int glyph_index,
583 int dest_width,
584 int weight) const {
557 FXFT_MM_Var pMasters = nullptr; 585 FXFT_MM_Var pMasters = nullptr;
558 FXFT_Get_MM_Var(m_Face, &pMasters); 586 FXFT_Get_MM_Var(m_Face, &pMasters);
559 if (!pMasters) 587 if (!pMasters)
560 return; 588 return;
561 long coords[2]; 589 long coords[2];
562 if (weight == 0) 590 if (weight == 0)
563 coords[0] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 0)) / 65536; 591 coords[0] = FXFT_Get_MM_Axis_Def(FXFT_Get_MM_Axis(pMasters, 0)) / 65536;
564 else 592 else
565 coords[0] = weight; 593 coords[0] = weight;
566 if (dest_width == 0) { 594 if (dest_width == 0) {
(...skipping 19 matching lines...) Expand all
586 } 614 }
587 int param = min_param + 615 int param = min_param +
588 (max_param - min_param) * (dest_width - min_width) / 616 (max_param - min_param) * (dest_width - min_width) /
589 (max_width - min_width); 617 (max_width - min_width);
590 coords[1] = param; 618 coords[1] = param;
591 } 619 }
592 FXFT_Free(m_Face, pMasters); 620 FXFT_Free(m_Face, pMasters);
593 FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords); 621 FXFT_Set_MM_Design_Coordinates(m_Face, 2, coords);
594 } 622 }
595 623
596 CFX_PathData* CFX_Font::LoadGlyphPath(uint32_t glyph_index, int dest_width) { 624 CFX_PathData* CFX_Font::LoadGlyphPathImpl(uint32_t glyph_index,
625 int dest_width) const {
597 if (!m_Face) 626 if (!m_Face)
598 return nullptr; 627 return nullptr;
599 FXFT_Set_Pixel_Sizes(m_Face, 0, 64); 628 FXFT_Set_Pixel_Sizes(m_Face, 0, 64);
600 FXFT_Matrix ft_matrix = {65536, 0, 0, 65536}; 629 FXFT_Matrix ft_matrix = {65536, 0, 0, 65536};
601 if (m_pSubstFont) { 630 if (m_pSubstFont) {
602 if (m_pSubstFont->m_ItalicAngle) { 631 if (m_pSubstFont->m_ItalicAngle) {
603 int skew = m_pSubstFont->m_ItalicAngle; 632 int skew = m_pSubstFont->m_ItalicAngle;
604 // |skew| is nonpositive so |-skew| is used as the index. We need to make 633 // |skew| is nonpositive so |-skew| is used as the index. We need to make
605 // sure |skew| != INT_MIN since -INT_MIN is undefined. 634 // sure |skew| != INT_MIN since -INT_MIN is undefined.
606 if (skew <= 0 && skew != std::numeric_limits<int>::min() && 635 if (skew <= 0 && skew != std::numeric_limits<int>::min() &&
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
655 params.m_pPoints = pPath->GetPoints(); 684 params.m_pPoints = pPath->GetPoints();
656 params.m_CurX = params.m_CurY = 0; 685 params.m_CurX = params.m_CurY = 0;
657 params.m_CoordUnit = 64 * 64.0; 686 params.m_CoordUnit = 64 * 64.0;
658 FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, &params); 687 FXFT_Outline_Decompose(FXFT_Get_Glyph_Outline(m_Face), &funcs, &params);
659 Outline_CheckEmptyContour(&params); 688 Outline_CheckEmptyContour(&params);
660 pPath->TrimPoints(params.m_PointCount); 689 pPath->TrimPoints(params.m_PointCount);
661 if (params.m_PointCount) 690 if (params.m_PointCount)
662 pPath->GetPoints()[params.m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE; 691 pPath->GetPoints()[params.m_PointCount - 1].m_Flag |= FXPT_CLOSEFIGURE;
663 return pPath; 692 return pPath;
664 } 693 }
694
695 const CFX_GlyphBitmap* CFX_Font::LoadGlyphBitmap(uint32_t glyph_index,
696 FX_BOOL bFontStyle,
697 const CFX_Matrix* pMatrix,
698 int dest_width,
699 int anti_alias,
700 int& text_flags) const {
701 return GetFaceCache()->LoadGlyphBitmap(this, glyph_index, bFontStyle, pMatrix,
702 dest_width, anti_alias, text_flags);
703 }
704
705 const CFX_PathData* CFX_Font::LoadGlyphPath(uint32_t glyph_index,
706 int dest_width) const {
707 return GetFaceCache()->LoadGlyphPath(this, glyph_index, dest_width);
708 }
709
710 #ifdef _SKIA_SUPPORT_
711 CFX_TypeFace* CFX_Font::GetDeviceCache() const {
712 return GetFaceCache()->GetDeviceCache(this);
713 }
714 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698