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

Side by Side Diff: fpdfsdk/pdfwindow/PWL_FontMap.cpp

Issue 2594153003: Remove CFX_ArrayTemplate, use unique_ptr in fpdfsdk/pdfwindow (Closed)
Patch Set: Fix compilation Created 3 years, 11 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 | « fpdfsdk/pdfwindow/PWL_FontMap.h ('k') | fpdfsdk/pdfwindow/PWL_Wnd.h » ('j') | 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 "fpdfsdk/pdfwindow/PWL_FontMap.h" 7 #include "fpdfsdk/pdfwindow/PWL_FontMap.h"
8 8
9 #include <utility>
10
9 #include "core/fpdfapi/cpdf_modulemgr.h" 11 #include "core/fpdfapi/cpdf_modulemgr.h"
10 #include "core/fpdfapi/font/cpdf_font.h" 12 #include "core/fpdfapi/font/cpdf_font.h"
11 #include "core/fpdfapi/font/cpdf_fontencoding.h" 13 #include "core/fpdfapi/font/cpdf_fontencoding.h"
12 #include "core/fpdfapi/parser/cpdf_document.h" 14 #include "core/fpdfapi/parser/cpdf_document.h"
13 #include "core/fpdfapi/parser/cpdf_parser.h" 15 #include "core/fpdfapi/parser/cpdf_parser.h"
14 #include "core/fpdfdoc/ipvt_fontmap.h" 16 #include "core/fpdfdoc/ipvt_fontmap.h"
15 #include "fpdfsdk/pdfwindow/PWL_Wnd.h" 17 #include "fpdfsdk/pdfwindow/PWL_Wnd.h"
16 #include "third_party/base/ptr_util.h" 18 #include "third_party/base/ptr_util.h"
19 #include "third_party/base/stl_util.h"
17 20
18 namespace { 21 namespace {
19 22
20 const char kDefaultFontName[] = "Helvetica"; 23 const char kDefaultFontName[] = "Helvetica";
21 24
22 const char* const g_sDEStandardFontName[] = {"Courier", 25 const char* const g_sDEStandardFontName[] = {"Courier",
23 "Courier-Bold", 26 "Courier-Bold",
24 "Courier-BoldOblique", 27 "Courier-BoldOblique",
25 "Courier-Oblique", 28 "Courier-Oblique",
26 "Helvetica", 29 "Helvetica",
(...skipping 23 matching lines...) Expand all
50 if (CPDF_ModuleMgr::Get()) { 53 if (CPDF_ModuleMgr::Get()) {
51 m_pPDFDoc = pdfium::MakeUnique<CPDF_Document>(nullptr); 54 m_pPDFDoc = pdfium::MakeUnique<CPDF_Document>(nullptr);
52 m_pPDFDoc->CreateNewDoc(); 55 m_pPDFDoc->CreateNewDoc();
53 } 56 }
54 } 57 }
55 58
56 return m_pPDFDoc.get(); 59 return m_pPDFDoc.get();
57 } 60 }
58 61
59 CPDF_Font* CPWL_FontMap::GetPDFFont(int32_t nFontIndex) { 62 CPDF_Font* CPWL_FontMap::GetPDFFont(int32_t nFontIndex) {
60 if (nFontIndex >= 0 && nFontIndex < m_aData.GetSize()) { 63 if (nFontIndex >= 0 && nFontIndex < pdfium::CollectionSize<int32_t>(m_Data)) {
61 if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) { 64 if (m_Data[nFontIndex])
62 return pData->pFont; 65 return m_Data[nFontIndex]->pFont;
63 }
64 } 66 }
65
66 return nullptr; 67 return nullptr;
67 } 68 }
68 69
69 CFX_ByteString CPWL_FontMap::GetPDFFontAlias(int32_t nFontIndex) { 70 CFX_ByteString CPWL_FontMap::GetPDFFontAlias(int32_t nFontIndex) {
70 if (nFontIndex >= 0 && nFontIndex < m_aData.GetSize()) { 71 if (nFontIndex >= 0 && nFontIndex < pdfium::CollectionSize<int32_t>(m_Data)) {
71 if (CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex)) { 72 if (m_Data[nFontIndex])
72 return pData->sFontName; 73 return m_Data[nFontIndex]->sFontName;
73 }
74 } 74 }
75 75 return CFX_ByteString();
76 return "";
77 } 76 }
78 77
79 bool CPWL_FontMap::KnowWord(int32_t nFontIndex, uint16_t word) { 78 bool CPWL_FontMap::KnowWord(int32_t nFontIndex, uint16_t word) {
80 if (nFontIndex >= 0 && nFontIndex < m_aData.GetSize()) { 79 if (nFontIndex >= 0 && nFontIndex < pdfium::CollectionSize<int32_t>(m_Data)) {
81 if (m_aData.GetAt(nFontIndex)) { 80 if (m_Data[nFontIndex])
82 return CharCodeFromUnicode(nFontIndex, word) >= 0; 81 return CharCodeFromUnicode(nFontIndex, word) >= 0;
83 }
84 } 82 }
85
86 return false; 83 return false;
87 } 84 }
88 85
89 int32_t CPWL_FontMap::GetWordFontIndex(uint16_t word, 86 int32_t CPWL_FontMap::GetWordFontIndex(uint16_t word,
90 int32_t nCharset, 87 int32_t nCharset,
91 int32_t nFontIndex) { 88 int32_t nFontIndex) {
92 if (nFontIndex > 0) { 89 if (nFontIndex > 0) {
93 if (KnowWord(nFontIndex, word)) 90 if (KnowWord(nFontIndex, word))
94 return nFontIndex; 91 return nFontIndex;
95 } else { 92 } else {
(...skipping 16 matching lines...) Expand all
112 nNewFontIndex = 109 nNewFontIndex =
113 GetFontIndex("Arial Unicode MS", FXFONT_DEFAULT_CHARSET, false); 110 GetFontIndex("Arial Unicode MS", FXFONT_DEFAULT_CHARSET, false);
114 if (nNewFontIndex >= 0) { 111 if (nNewFontIndex >= 0) {
115 if (KnowWord(nNewFontIndex, word)) 112 if (KnowWord(nNewFontIndex, word))
116 return nNewFontIndex; 113 return nNewFontIndex;
117 } 114 }
118 return -1; 115 return -1;
119 } 116 }
120 117
121 int32_t CPWL_FontMap::CharCodeFromUnicode(int32_t nFontIndex, uint16_t word) { 118 int32_t CPWL_FontMap::CharCodeFromUnicode(int32_t nFontIndex, uint16_t word) {
122 CPWL_FontMap_Data* pData = m_aData.GetAt(nFontIndex); 119 if (nFontIndex < 0 || nFontIndex >= pdfium::CollectionSize<int32_t>(m_Data))
123 if (!pData)
124 return -1; 120 return -1;
125 121
126 if (!pData->pFont) 122 CPWL_FontMap_Data* pData = m_Data[nFontIndex].get();
123 if (!pData || !pData->pFont)
127 return -1; 124 return -1;
128 125
129 if (pData->pFont->IsUnicodeCompatible()) 126 if (pData->pFont->IsUnicodeCompatible())
130 return pData->pFont->CharCodeFromUnicode(word); 127 return pData->pFont->CharCodeFromUnicode(word);
131 128
132 return word < 0xFF ? word : -1; 129 return word < 0xFF ? word : -1;
133 } 130 }
134 131
135 CFX_ByteString CPWL_FontMap::GetNativeFontName(int32_t nCharset) { 132 CFX_ByteString CPWL_FontMap::GetNativeFontName(int32_t nCharset) {
136 // searching native font is slow, so we must save time 133 for (const auto& pData : m_NativeFont) {
137 for (int32_t i = 0, sz = m_aNativeFont.GetSize(); i < sz; i++) { 134 if (pData && pData->nCharset == nCharset)
138 if (CPWL_FontMap_Native* pData = m_aNativeFont.GetAt(i)) { 135 return pData->sFontName;
139 if (pData->nCharset == nCharset)
140 return pData->sFontName;
141 }
142 } 136 }
143 137
144 CFX_ByteString sNew = GetNativeFont(nCharset); 138 CFX_ByteString sNew = GetNativeFont(nCharset);
139 if (sNew.IsEmpty())
140 return CFX_ByteString();
145 141
146 if (!sNew.IsEmpty()) { 142 auto pNewData = pdfium::MakeUnique<CPWL_FontMap_Native>();
147 CPWL_FontMap_Native* pNewData = new CPWL_FontMap_Native; 143 pNewData->nCharset = nCharset;
148 pNewData->nCharset = nCharset; 144 pNewData->sFontName = sNew;
149 pNewData->sFontName = sNew; 145 m_NativeFont.push_back(std::move(pNewData));
150
151 m_aNativeFont.Add(pNewData);
152 }
153
154 return sNew; 146 return sNew;
155 } 147 }
156 148
157 void CPWL_FontMap::Empty() { 149 void CPWL_FontMap::Empty() {
158 { 150 m_Data.clear();
159 for (int32_t i = 0, sz = m_aData.GetSize(); i < sz; i++) 151 m_NativeFont.clear();
160 delete m_aData.GetAt(i);
161
162 m_aData.RemoveAll();
163 }
164 {
165 for (int32_t i = 0, sz = m_aNativeFont.GetSize(); i < sz; i++)
166 delete m_aNativeFont.GetAt(i);
167
168 m_aNativeFont.RemoveAll();
169 }
170 } 152 }
171 153
172 void CPWL_FontMap::Initialize() { 154 void CPWL_FontMap::Initialize() {
173 GetFontIndex(kDefaultFontName, FXFONT_ANSI_CHARSET, false); 155 GetFontIndex(kDefaultFontName, FXFONT_ANSI_CHARSET, false);
174 } 156 }
175 157
176 bool CPWL_FontMap::IsStandardFont(const CFX_ByteString& sFontName) { 158 bool CPWL_FontMap::IsStandardFont(const CFX_ByteString& sFontName) {
177 for (size_t i = 0; i < FX_ArraySize(g_sDEStandardFontName); ++i) { 159 for (size_t i = 0; i < FX_ArraySize(g_sDEStandardFontName); ++i) {
178 if (sFontName == g_sDEStandardFontName[i]) 160 if (sFontName == g_sDEStandardFontName[i])
179 return true; 161 return true;
180 } 162 }
181 163
182 return false; 164 return false;
183 } 165 }
184 166
185 int32_t CPWL_FontMap::FindFont(const CFX_ByteString& sFontName, 167 int32_t CPWL_FontMap::FindFont(const CFX_ByteString& sFontName,
186 int32_t nCharset) { 168 int32_t nCharset) {
187 for (int32_t i = 0, sz = m_aData.GetSize(); i < sz; i++) { 169 int32_t i = 0;
188 if (CPWL_FontMap_Data* pData = m_aData.GetAt(i)) { 170 for (const auto& pData : m_Data) {
189 if (nCharset == FXFONT_DEFAULT_CHARSET || nCharset == pData->nCharset) { 171 if (pData &&
190 if (sFontName.IsEmpty() || pData->sFontName == sFontName) 172 (nCharset == FXFONT_DEFAULT_CHARSET || nCharset == pData->nCharset) &&
191 return i; 173 (sFontName.IsEmpty() || pData->sFontName == sFontName)) {
192 } 174 return i;
193 } 175 }
176 ++i;
194 } 177 }
195
196 return -1; 178 return -1;
197 } 179 }
198 180
199 int32_t CPWL_FontMap::GetFontIndex(const CFX_ByteString& sFontName, 181 int32_t CPWL_FontMap::GetFontIndex(const CFX_ByteString& sFontName,
200 int32_t nCharset, 182 int32_t nCharset,
201 bool bFind) { 183 bool bFind) {
202 int32_t nFontIndex = FindFont(EncodeFontAlias(sFontName, nCharset), nCharset); 184 int32_t nFontIndex = FindFont(EncodeFontAlias(sFontName, nCharset), nCharset);
203 if (nFontIndex >= 0) 185 if (nFontIndex >= 0)
204 return nFontIndex; 186 return nFontIndex;
205 187
(...skipping 12 matching lines...) Expand all
218 } 200 }
219 201
220 CPDF_Font* CPWL_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias, 202 CPDF_Font* CPWL_FontMap::FindFontSameCharset(CFX_ByteString& sFontAlias,
221 int32_t nCharset) { 203 int32_t nCharset) {
222 return nullptr; 204 return nullptr;
223 } 205 }
224 206
225 int32_t CPWL_FontMap::AddFontData(CPDF_Font* pFont, 207 int32_t CPWL_FontMap::AddFontData(CPDF_Font* pFont,
226 const CFX_ByteString& sFontAlias, 208 const CFX_ByteString& sFontAlias,
227 int32_t nCharset) { 209 int32_t nCharset) {
228 CPWL_FontMap_Data* pNewData = new CPWL_FontMap_Data; 210 auto pNewData = pdfium::MakeUnique<CPWL_FontMap_Data>();
229 pNewData->pFont = pFont; 211 pNewData->pFont = pFont;
230 pNewData->sFontName = sFontAlias; 212 pNewData->sFontName = sFontAlias;
231 pNewData->nCharset = nCharset; 213 pNewData->nCharset = nCharset;
232 214 m_Data.push_back(std::move(pNewData));
233 m_aData.Add(pNewData); 215 return pdfium::CollectionSize<int32_t>(m_Data) - 1;
234
235 return m_aData.GetSize() - 1;
236 } 216 }
237 217
238 void CPWL_FontMap::AddedFont(CPDF_Font* pFont, 218 void CPWL_FontMap::AddedFont(CPDF_Font* pFont,
239 const CFX_ByteString& sFontAlias) {} 219 const CFX_ByteString& sFontAlias) {}
240 220
241 CFX_ByteString CPWL_FontMap::GetNativeFont(int32_t nCharset) { 221 CFX_ByteString CPWL_FontMap::GetNativeFont(int32_t nCharset) {
242 if (nCharset == FXFONT_DEFAULT_CHARSET) 222 if (nCharset == FXFONT_DEFAULT_CHARSET)
243 nCharset = GetNativeCharset(); 223 nCharset = GetNativeCharset();
244 224
245 CFX_ByteString sFontName = GetDefaultFontByCharset(nCharset); 225 CFX_ByteString sFontName = GetDefaultFontByCharset(nCharset);
246 if (m_pSystemHandler->FindNativeTrueTypeFont(sFontName)) 226 if (!m_pSystemHandler->FindNativeTrueTypeFont(sFontName))
247 return sFontName; 227 return CFX_ByteString();
248 228
249 sFontName.clear();
250 return sFontName; 229 return sFontName;
251 } 230 }
252 231
253 CPDF_Font* CPWL_FontMap::AddFontToDocument(CPDF_Document* pDoc, 232 CPDF_Font* CPWL_FontMap::AddFontToDocument(CPDF_Document* pDoc,
254 CFX_ByteString& sFontName, 233 CFX_ByteString& sFontName,
255 uint8_t nCharset) { 234 uint8_t nCharset) {
256 if (IsStandardFont(sFontName)) 235 if (IsStandardFont(sFontName))
257 return AddStandardFont(pDoc, sFontName); 236 return AddStandardFont(pDoc, sFontName);
258 237
259 return AddSystemFont(pDoc, sFontName, nCharset); 238 return AddSystemFont(pDoc, sFontName, nCharset);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 return EncodeFontAlias(sFontName) + sPostfix; 277 return EncodeFontAlias(sFontName) + sPostfix;
299 } 278 }
300 279
301 CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName) { 280 CFX_ByteString CPWL_FontMap::EncodeFontAlias(const CFX_ByteString& sFontName) {
302 CFX_ByteString sRet = sFontName; 281 CFX_ByteString sRet = sFontName;
303 sRet.Remove(' '); 282 sRet.Remove(' ');
304 return sRet; 283 return sRet;
305 } 284 }
306 285
307 const CPWL_FontMap_Data* CPWL_FontMap::GetFontMapData(int32_t nIndex) const { 286 const CPWL_FontMap_Data* CPWL_FontMap::GetFontMapData(int32_t nIndex) const {
308 if (nIndex >= 0 && nIndex < m_aData.GetSize()) { 287 if (nIndex < 0 || nIndex >= pdfium::CollectionSize<int32_t>(m_Data))
309 return m_aData.GetAt(nIndex); 288 return nullptr;
310 }
311 289
312 return nullptr; 290 return m_Data[nIndex].get();
313 } 291 }
314 292
315 int32_t CPWL_FontMap::GetNativeCharset() { 293 int32_t CPWL_FontMap::GetNativeCharset() {
316 uint8_t nCharset = FXFONT_ANSI_CHARSET; 294 uint8_t nCharset = FXFONT_ANSI_CHARSET;
317 int32_t iCodePage = FXSYS_GetACP(); 295 int32_t iCodePage = FXSYS_GetACP();
318 switch (iCodePage) { 296 switch (iCodePage) {
319 case 932: // Japan 297 case 932: // Japan
320 nCharset = FXFONT_SHIFTJIS_CHARSET; 298 nCharset = FXFONT_SHIFTJIS_CHARSET;
321 break; 299 break;
322 case 936: // Chinese (PRC, Singapore) 300 case 936: // Chinese (PRC, Singapore)
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 return FXFONT_RUSSIAN_CHARSET; 417 return FXFONT_RUSSIAN_CHARSET;
440 418
441 if (word >= 0x0100 && word <= 0x024F) 419 if (word >= 0x0100 && word <= 0x024F)
442 return FXFONT_EASTEUROPE_CHARSET; 420 return FXFONT_EASTEUROPE_CHARSET;
443 421
444 if (word >= 0x1E00 && word <= 0x1EFF) 422 if (word >= 0x1E00 && word <= 0x1EFF)
445 return FXFONT_VIETNAMESE_CHARSET; 423 return FXFONT_VIETNAMESE_CHARSET;
446 424
447 return FXFONT_ANSI_CHARSET; 425 return FXFONT_ANSI_CHARSET;
448 } 426 }
OLDNEW
« no previous file with comments | « fpdfsdk/pdfwindow/PWL_FontMap.h ('k') | fpdfsdk/pdfwindow/PWL_Wnd.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698