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

Side by Side Diff: xfa/fgas/font/fgas_gefont.cpp

Issue 2002673002: Use std::map for CFX_GEFont::m_FontMapper (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Created 4 years, 7 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
« no previous file with comments | « xfa/fgas/font/fgas_gefont.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "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"
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 m_pFontMgr(pFontMgr), 98 m_pFontMgr(pFontMgr),
99 m_iRefCount(1), 99 m_iRefCount(1),
100 m_bExtFont(FALSE), 100 m_bExtFont(FALSE),
101 m_pStream(NULL), 101 m_pStream(NULL),
102 m_pFileRead(NULL), 102 m_pFileRead(NULL),
103 m_pFontEncoding(NULL), 103 m_pFontEncoding(NULL),
104 m_pCharWidthMap(NULL), 104 m_pCharWidthMap(NULL),
105 m_pRectArray(NULL), 105 m_pRectArray(NULL),
106 m_pBBoxMap(NULL), 106 m_pBBoxMap(NULL),
107 m_pProvider(NULL), 107 m_pProvider(NULL),
108 m_wCharSet(0xFFFF), 108 m_wCharSet(0xFFFF) {
109 m_FontMapper(16) {
110 } 109 }
111 110
112 CFX_GEFont::CFX_GEFont(const CFX_GEFont& src, uint32_t dwFontStyles) 111 CFX_GEFont::CFX_GEFont(const CFX_GEFont& src, uint32_t dwFontStyles)
113 : 112 :
114 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_ 113 #if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
115 m_bUseLogFontStyle(FALSE), 114 m_bUseLogFontStyle(FALSE),
116 m_dwLogFontStyle(0), 115 m_dwLogFontStyle(0),
117 #endif 116 #endif
118 m_pFont(NULL), 117 m_pFont(NULL),
119 m_pFontMgr(src.m_pFontMgr), 118 m_pFontMgr(src.m_pFontMgr),
120 m_iRefCount(1), 119 m_iRefCount(1),
121 m_bExtFont(FALSE), 120 m_bExtFont(FALSE),
122 m_pStream(NULL), 121 m_pStream(NULL),
123 m_pFileRead(NULL), 122 m_pFileRead(NULL),
124 m_pFontEncoding(NULL), 123 m_pFontEncoding(NULL),
125 m_pCharWidthMap(NULL), 124 m_pCharWidthMap(NULL),
126 m_pRectArray(NULL), 125 m_pRectArray(NULL),
127 m_pBBoxMap(NULL), 126 m_pBBoxMap(NULL),
128 m_pProvider(NULL), 127 m_pProvider(NULL),
129 m_wCharSet(0xFFFF), 128 m_wCharSet(0xFFFF) {
130 m_FontMapper(16) { 129 ASSERT(src.m_pFont);
131 m_pFont = new CFX_Font; 130 m_pFont = new CFX_Font;
132 ASSERT(m_pFont != NULL);
133 ASSERT(src.m_pFont != NULL);
134 m_pFont->LoadClone(src.m_pFont); 131 m_pFont->LoadClone(src.m_pFont);
135 CFX_SubstFont* pSubst = m_pFont->GetSubstFont(); 132 CFX_SubstFont* pSubst = m_pFont->GetSubstFont();
136 if (!pSubst) { 133 if (!pSubst) {
137 pSubst = new CFX_SubstFont; 134 pSubst = new CFX_SubstFont;
138 m_pFont->SetSubstFont(pSubst); 135 m_pFont->SetSubstFont(pSubst);
139 } 136 }
140 pSubst->m_Weight = 137 pSubst->m_Weight =
141 (dwFontStyles & FX_FONTSTYLE_Bold) ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL; 138 (dwFontStyles & FX_FONTSTYLE_Bold) ? FXFONT_FW_BOLD : FXFONT_FW_NORMAL;
142 if (dwFontStyles & FX_FONTSTYLE_Italic) { 139 if (dwFontStyles & FX_FONTSTYLE_Italic) {
143 pSubst->m_SubstFlags |= FXFONT_SUBST_ITALIC; 140 pSubst->m_SubstFlags |= FXFONT_SUBST_ITALIC;
144 } 141 }
145 InitFont(); 142 InitFont();
146 } 143 }
147 144
148 CFX_GEFont::~CFX_GEFont() { 145 CFX_GEFont::~CFX_GEFont() {
149 for (int32_t i = 0; i < m_SubstFonts.GetSize(); i++) 146 for (int32_t i = 0; i < m_SubstFonts.GetSize(); i++)
150 m_SubstFonts[i]->Release(); 147 m_SubstFonts[i]->Release();
151 148
152 m_SubstFonts.RemoveAll(); 149 m_SubstFonts.RemoveAll();
153 m_FontMapper.RemoveAll(); 150 m_FontMapper.clear();
154 if (m_pFileRead) 151 if (m_pFileRead)
155 m_pFileRead->Release(); 152 m_pFileRead->Release();
156 153
157 if (m_pStream) 154 if (m_pStream)
158 m_pStream->Release(); 155 m_pStream->Release();
159 156
160 delete m_pFontEncoding; 157 delete m_pFontEncoding;
Lei Zhang 2016/05/20 20:42:21 BTW, lots of unique_ptr candidates.
Tom Sepez 2016/05/20 21:32:15 Ack, followup someday.
161 delete m_pCharWidthMap; 158 delete m_pCharWidthMap;
162 delete m_pRectArray; 159 delete m_pRectArray;
163 delete m_pBBoxMap; 160 delete m_pBBoxMap;
164 if (!m_bExtFont) 161 if (!m_bExtFont)
165 delete m_pFont; 162 delete m_pFont;
166 } 163 }
167 164
168 void CFX_GEFont::Release() { 165 void CFX_GEFont::Release() {
169 if (--m_iRefCount < 1) { 166 if (--m_iRefCount < 1) {
170 if (m_pFontMgr != NULL) { 167 if (m_pFontMgr != NULL) {
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 return iGlyphIndex; 470 return iGlyphIndex;
474 } 471 }
475 const FGAS_FONTUSB* pFontUSB = FGAS_GetUnicodeBitField(wUnicode); 472 const FGAS_FONTUSB* pFontUSB = FGAS_GetUnicodeBitField(wUnicode);
476 if (pFontUSB == NULL) { 473 if (pFontUSB == NULL) {
477 return 0xFFFF; 474 return 0xFFFF;
478 } 475 }
479 uint16_t wBitField = pFontUSB->wBitField; 476 uint16_t wBitField = pFontUSB->wBitField;
480 if (wBitField >= 128) { 477 if (wBitField >= 128) {
481 return 0xFFFF; 478 return 0xFFFF;
482 } 479 }
483 IFX_Font* pFont = NULL; 480 auto it = m_FontMapper.find(wUnicode);
484 m_FontMapper.Lookup((void*)(uintptr_t)wUnicode, (void*&)pFont); 481 IFX_Font* pFont = it != m_FontMapper.end() ? it->second : nullptr;
485 if (pFont != NULL && pFont != (IFX_Font*)this) { 482 if (pFont && pFont != this) {
486 iGlyphIndex = 483 iGlyphIndex =
487 ((CFX_GEFont*)pFont)->GetGlyphIndex(wUnicode, FALSE, NULL, bCharCode); 484 ((CFX_GEFont*)pFont)->GetGlyphIndex(wUnicode, FALSE, NULL, bCharCode);
488 if (iGlyphIndex != 0xFFFF) { 485 if (iGlyphIndex != 0xFFFF) {
489 int32_t i = m_SubstFonts.Find(pFont); 486 int32_t i = m_SubstFonts.Find(pFont);
490 if (i > -1) { 487 if (i > -1) {
491 iGlyphIndex |= ((i + 1) << 24); 488 iGlyphIndex |= ((i + 1) << 24);
492 if (ppFont != NULL) { 489 if (ppFont)
493 *ppFont = pFont; 490 *ppFont = pFont;
494 }
495 return iGlyphIndex; 491 return iGlyphIndex;
496 } 492 }
497 } 493 }
498 } 494 }
499 if (m_pFontMgr != NULL && bRecursive) { 495 if (m_pFontMgr && bRecursive) {
500 CFX_WideString wsFamily; 496 CFX_WideString wsFamily;
501 GetFamilyName(wsFamily); 497 GetFamilyName(wsFamily);
502 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_ 498 #if _FXM_PLATFORM_ == _FXM_PLATFORM_WINDOWS_
503 IFX_Font* pFont = m_pFontMgr->GetDefFontByUnicode(wUnicode, GetFontStyles(), 499 IFX_Font* pFont = m_pFontMgr->GetDefFontByUnicode(wUnicode, GetFontStyles(),
504 wsFamily.c_str()); 500 wsFamily.c_str());
505 #else 501 #else
506 IFX_Font* pFont = m_pFontMgr->GetFontByUnicode(wUnicode, GetFontStyles(), 502 IFX_Font* pFont = m_pFontMgr->GetFontByUnicode(wUnicode, GetFontStyles(),
507 wsFamily.c_str()); 503 wsFamily.c_str());
508 if (NULL == pFont) { 504 if (!pFont)
509 pFont = m_pFontMgr->GetFontByUnicode(wUnicode, GetFontStyles(), NULL); 505 pFont = m_pFontMgr->GetFontByUnicode(wUnicode, GetFontStyles(), NULL);
510 }
511 #endif 506 #endif
512 if (pFont != NULL) { 507 if (pFont) {
513 if (pFont == (IFX_Font*)this) { 508 if (pFont == this) {
514 pFont->Release(); 509 pFont->Release();
515 return 0xFFFF; 510 return 0xFFFF;
516 } 511 }
517 m_FontMapper.SetAt((void*)(uintptr_t)wUnicode, (void*)pFont); 512 m_FontMapper[wUnicode] = pFont;
518 int32_t i = m_SubstFonts.GetSize(); 513 int32_t i = m_SubstFonts.GetSize();
519 m_SubstFonts.Add(pFont); 514 m_SubstFonts.Add(pFont);
520 iGlyphIndex = 515 iGlyphIndex =
521 ((CFX_GEFont*)pFont)->GetGlyphIndex(wUnicode, FALSE, NULL, bCharCode); 516 ((CFX_GEFont*)pFont)->GetGlyphIndex(wUnicode, FALSE, NULL, bCharCode);
522 if (iGlyphIndex != 0xFFFF) { 517 if (iGlyphIndex != 0xFFFF) {
523 iGlyphIndex |= ((i + 1) << 24); 518 iGlyphIndex |= ((i + 1) << 24);
524 if (ppFont != NULL) { 519 if (ppFont)
525 *ppFont = pFont; 520 *ppFont = pFont;
526 }
527 return iGlyphIndex; 521 return iGlyphIndex;
528 } 522 }
529 } 523 }
530 } 524 }
531 return 0xFFFF; 525 return 0xFFFF;
532 } 526 }
533 int32_t CFX_GEFont::GetAscent() const { 527 int32_t CFX_GEFont::GetAscent() const {
534 return m_pFont->GetAscent(); 528 return m_pFont->GetAscent();
535 } 529 }
536 int32_t CFX_GEFont::GetDescent() const { 530 int32_t CFX_GEFont::GetDescent() const {
(...skipping 13 matching lines...) Expand all
550 } 544 }
551 if (m_pRectArray != NULL) { 545 if (m_pRectArray != NULL) {
552 m_pRectArray->RemoveAll(); 546 m_pRectArray->RemoveAll();
553 } 547 }
554 } 548 }
555 IFX_Font* CFX_GEFont::GetSubstFont(int32_t iGlyphIndex) const { 549 IFX_Font* CFX_GEFont::GetSubstFont(int32_t iGlyphIndex) const {
556 iGlyphIndex = ((uint32_t)iGlyphIndex) >> 24; 550 iGlyphIndex = ((uint32_t)iGlyphIndex) >> 24;
557 return iGlyphIndex == 0 ? const_cast<CFX_GEFont*>(this) 551 return iGlyphIndex == 0 ? const_cast<CFX_GEFont*>(this)
558 : m_SubstFonts[iGlyphIndex - 1]; 552 : m_SubstFonts[iGlyphIndex - 1];
559 } 553 }
OLDNEW
« no previous file with comments | « xfa/fgas/font/fgas_gefont.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698