Chromium Code Reviews| 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 | 8 |
| 9 #if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_DESKTOP_ | 9 #if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_DESKTOP_ |
| 10 #include <crtdbg.h> | 10 #include <crtdbg.h> |
| 11 | 11 |
| 12 #include "../../../include/fxcodec/fx_codec.h" | 12 #include "../../../include/fxcodec/fx_codec.h" |
| 13 #include "../../../include/fxge/fx_freetype.h" | 13 #include "../../../include/fxge/fx_freetype.h" |
| 14 #include "../../../include/fxge/fx_ge_win32.h" | 14 #include "../../../include/fxge/fx_ge_win32.h" |
| 15 #include "../agg/include/fx_agg_driver.h" | 15 #include "../agg/include/fx_agg_driver.h" |
| 16 #include "../dib/dib_int.h" | 16 #include "../dib/dib_int.h" |
| 17 #include "../ge/text_int.h" | 17 #include "../ge/text_int.h" |
| 18 #include "dwrite_int.h" | 18 #include "dwrite_int.h" |
| 19 #include "win32_int.h" | 19 #include "win32_int.h" |
| 20 | 20 |
| 21 class CFX_Win32FallbackFontInfo final : public CFX_FolderFontInfo { | |
| 22 public: | |
| 23 void* MapFont(int weight, | |
| 24 FX_BOOL bItalic, | |
| 25 int charset, | |
| 26 int pitch_family, | |
| 27 const FX_CHAR* family, | |
| 28 int& iExact) override; | |
| 29 | |
| 30 void* FindFont(int weight, | |
| 31 FX_BOOL bItalic, | |
| 32 int charset, | |
| 33 int pitch_family, | |
| 34 const FX_CHAR* family, | |
| 35 FX_BOOL bMatchName); | |
| 36 }; | |
| 21 class CFX_Win32FontInfo final : public IFX_SystemFontInfo { | 37 class CFX_Win32FontInfo final : public IFX_SystemFontInfo { |
| 22 public: | 38 public: |
| 23 CFX_Win32FontInfo(); | 39 CFX_Win32FontInfo(); |
| 24 ~CFX_Win32FontInfo() override; | 40 ~CFX_Win32FontInfo() override; |
| 25 | 41 |
| 26 // IFX_SystemFontInfo | 42 // IFX_SystemFontInfo |
| 27 void Release() override; | 43 void Release() override; |
| 28 FX_BOOL EnumFontList(CFX_FontMapper* pMapper) override; | 44 FX_BOOL EnumFontList(CFX_FontMapper* pMapper) override; |
| 29 void* MapFont(int weight, | 45 void* MapFont(int weight, |
| 30 FX_BOOL bItalic, | 46 FX_BOOL bItalic, |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 192 if (thisname[0] == ' ') { | 208 if (thisname[0] == ' ') { |
| 193 if (thisname.Mid(1, name.GetLength()) == name) { | 209 if (thisname.Mid(1, name.GetLength()) == name) { |
| 194 return m_pMapper->m_InstalledTTFonts[i + 1]; | 210 return m_pMapper->m_InstalledTTFonts[i + 1]; |
| 195 } | 211 } |
| 196 } else if (thisname.Left(name.GetLength()) == name) { | 212 } else if (thisname.Left(name.GetLength()) == name) { |
| 197 return m_pMapper->m_InstalledTTFonts[i]; | 213 return m_pMapper->m_InstalledTTFonts[i]; |
| 198 } | 214 } |
| 199 } | 215 } |
| 200 return CFX_ByteString(); | 216 return CFX_ByteString(); |
| 201 } | 217 } |
| 218 void* CFX_Win32FallbackFontInfo::MapFont(int weight, | |
| 219 FX_BOOL bItalic, | |
| 220 int charset, | |
| 221 int pitch_family, | |
| 222 const FX_CHAR* cstr_face, | |
| 223 int& iExact) { | |
| 224 CFX_ByteString face = cstr_face; | |
|
Tom Sepez
2015/09/29 16:26:03
nit: prefer CFX_ByteString face(cstr_face);
forshaw
2015/09/29 16:46:23
Acknowledged.
| |
| 225 int iBaseFont; | |
|
Tom Sepez
2015/09/29 16:26:03
nit: move this into the for(), eg for (int iBaseFo
forshaw
2015/09/29 16:46:23
Acknowledged.
| |
| 226 for (iBaseFont = 0; iBaseFont < 12; iBaseFont++) | |
|
Tom Sepez
2015/09/29 16:26:03
use FX_ArraySize(Base14Substs) in place of hard-co
forshaw
2015/09/29 16:46:23
Acknowledged.
| |
| 227 if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) { | |
|
Tom Sepez
2015/09/29 16:26:03
I thought CFX_Bytestring had an operator== method
forshaw
2015/09/29 16:46:23
Acknowledged.
| |
| 228 face = Base14Substs[iBaseFont].m_pWinName; | |
| 229 iExact = 1; | |
| 230 break; | |
| 231 } | |
| 232 if (iBaseFont < 12) { | |
|
Tom Sepez
2015/09/29 16:26:03
move this into the loop in place of the break, eg
forshaw
2015/09/29 16:46:23
Acknowledged.
| |
| 233 return GetFont(face); | |
| 234 } | |
| 235 | |
| 236 FX_BOOL bCJK = TRUE; | |
| 237 switch (charset) { | |
| 238 case FXFONT_SHIFTJIS_CHARSET: | |
| 239 case FXFONT_GB2312_CHARSET: | |
| 240 case FXFONT_CHINESEBIG5_CHARSET: | |
| 241 case FXFONT_HANGEUL_CHARSET: | |
| 242 default: | |
| 243 bCJK = FALSE; | |
| 244 break; | |
| 245 } | |
| 246 if (charset == FXFONT_ANSI_CHARSET && (pitch_family & FXFONT_FF_FIXEDPITCH)) { | |
| 247 return GetFont("Courier New"); | |
| 248 } | |
| 249 return FindFont(weight, bItalic, charset, pitch_family, cstr_face, !bCJK); | |
| 250 } | |
| 251 static FX_DWORD _Win32GetCharset(int charset) { | |
|
Tom Sepez
2015/09/29 16:26:03
These are copied from linux or some such? Rather
forshaw
2015/09/29 16:46:23
Yeah ideally it would be nicer to just have a sing
| |
| 252 switch (charset) { | |
| 253 case FXFONT_SHIFTJIS_CHARSET: | |
| 254 return CHARSET_FLAG_SHIFTJIS; | |
| 255 case FXFONT_GB2312_CHARSET: | |
| 256 return CHARSET_FLAG_GB; | |
| 257 case FXFONT_CHINESEBIG5_CHARSET: | |
| 258 return CHARSET_FLAG_BIG5; | |
| 259 case FXFONT_HANGEUL_CHARSET: | |
| 260 return CHARSET_FLAG_KOREAN; | |
| 261 case FXFONT_SYMBOL_CHARSET: | |
| 262 return CHARSET_FLAG_SYMBOL; | |
| 263 case FXFONT_ANSI_CHARSET: | |
| 264 return CHARSET_FLAG_ANSI; | |
| 265 default: | |
| 266 break; | |
| 267 } | |
| 268 return 0; | |
| 269 } | |
| 270 static int32_t _Win32GetSimilarValue(int weight, | |
| 271 FX_BOOL bItalic, | |
| 272 int pitch_family, | |
| 273 FX_DWORD style) { | |
| 274 int32_t iSimilarValue = 0; | |
| 275 if ((style & FXFONT_BOLD) == (weight > 400)) { | |
| 276 iSimilarValue += 16; | |
| 277 } | |
| 278 if ((style & FXFONT_ITALIC) == bItalic) { | |
| 279 iSimilarValue += 16; | |
| 280 } | |
| 281 if ((style & FXFONT_SERIF) == (pitch_family & FXFONT_FF_ROMAN)) { | |
| 282 iSimilarValue += 16; | |
| 283 } | |
| 284 if ((style & FXFONT_SCRIPT) == (pitch_family & FXFONT_FF_SCRIPT)) { | |
| 285 iSimilarValue += 8; | |
| 286 } | |
| 287 if ((style & FXFONT_FIXED_PITCH) == (pitch_family & FXFONT_FF_FIXEDPITCH)) { | |
| 288 iSimilarValue += 8; | |
| 289 } | |
| 290 return iSimilarValue; | |
| 291 } | |
| 292 | |
| 293 void* CFX_Win32FallbackFontInfo::FindFont(int weight, | |
| 294 FX_BOOL bItalic, | |
| 295 int charset, | |
| 296 int pitch_family, | |
| 297 const FX_CHAR* family, | |
| 298 FX_BOOL bMatchName) { | |
| 299 CFX_FontFaceInfo* pFind = NULL; | |
| 300 FX_DWORD charset_flag = _Win32GetCharset(charset); | |
| 301 int32_t iBestSimilar = 0; | |
| 302 for (const auto& it : m_FontList) { | |
| 303 const CFX_ByteString& bsName = it.first; | |
| 304 CFX_FontFaceInfo* pFont = it.second; | |
| 305 if (!(pFont->m_Charsets & charset_flag) && | |
| 306 charset != FXFONT_DEFAULT_CHARSET) { | |
| 307 continue; | |
| 308 } | |
| 309 int32_t iSimilarValue = 0; | |
| 310 int32_t index = bsName.Find(family); | |
| 311 if (bMatchName && index < 0) { | |
| 312 continue; | |
| 313 } | |
| 314 if (!bMatchName && index > 0) { | |
| 315 iSimilarValue += 64; | |
|
Tom Sepez
2015/09/29 16:26:03
Doesn't this increment get lost when we make the a
forshaw
2015/09/29 16:46:23
Looks that way, this was copied from the Linux ver
| |
| 316 } | |
| 317 iSimilarValue = | |
| 318 _Win32GetSimilarValue(weight, bItalic, pitch_family, pFont->m_Styles); | |
| 319 if (iSimilarValue > iBestSimilar) { | |
| 320 iBestSimilar = iSimilarValue; | |
| 321 pFind = pFont; | |
| 322 } | |
| 323 } | |
| 324 return pFind; | |
| 325 } | |
| 326 | |
| 202 struct _FontNameMap { | 327 struct _FontNameMap { |
| 203 const FX_CHAR* m_pSubFontName; | 328 const FX_CHAR* m_pSubFontName; |
| 204 const FX_CHAR* m_pSrcFontName; | 329 const FX_CHAR* m_pSrcFontName; |
| 205 }; | 330 }; |
| 206 const _FontNameMap g_JpFontNameMap[] = { | 331 const _FontNameMap g_JpFontNameMap[] = { |
| 207 {"MS Mincho", "Heiseimin-W3"}, | 332 {"MS Mincho", "Heiseimin-W3"}, |
| 208 {"MS Gothic", "Jun101-Light"}, | 333 {"MS Gothic", "Jun101-Light"}, |
| 209 }; | 334 }; |
| 210 extern "C" { | 335 extern "C" { |
| 211 static int compareString(const void* key, const void* element) { | 336 static int compareString(const void* key, const void* element) { |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 399 } | 524 } |
| 400 FX_BOOL CFX_Win32FontInfo::GetFontCharset(void* hFont, int& charset) { | 525 FX_BOOL CFX_Win32FontInfo::GetFontCharset(void* hFont, int& charset) { |
| 401 TEXTMETRIC tm; | 526 TEXTMETRIC tm; |
| 402 HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont); | 527 HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont); |
| 403 ::GetTextMetrics(m_hDC, &tm); | 528 ::GetTextMetrics(m_hDC, &tm); |
| 404 ::SelectObject(m_hDC, hOldFont); | 529 ::SelectObject(m_hDC, hOldFont); |
| 405 charset = tm.tmCharSet; | 530 charset = tm.tmCharSet; |
| 406 return TRUE; | 531 return TRUE; |
| 407 } | 532 } |
| 408 IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUnused) { | 533 IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault(const char** pUnused) { |
| 409 return new CFX_Win32FontInfo; | 534 // If GDI disabled then GetDC for the desktop will fail. Select the fallback |
|
Tom Sepez
2015/09/29 16:26:03
nit: is disabled, then
forshaw
2015/09/29 16:46:23
Acknowledged.
| |
| 535 // font information class if GDI is disabled. | |
| 536 HDC hdc = GetDC(NULL); | |
| 537 if (!hdc) { | |
| 538 CFX_Win32FallbackFontInfo* pInfoFallback = new CFX_Win32FallbackFontInfo; | |
| 539 // Construct the font path manually, SHGetKnownFolderPath won't work under | |
| 540 // a restrictive sandbox. | |
| 541 CHAR windows_path[MAX_PATH] = {0}; | |
| 542 DWORD path_len = GetWindowsDirectoryA(windows_path, MAX_PATH); | |
| 543 if (path_len > 0 && path_len < MAX_PATH) { | |
| 544 CFX_ByteString fonts_path(windows_path); | |
| 545 fonts_path += "\\Fonts"; | |
| 546 pInfoFallback->AddPath(fonts_path); | |
| 547 } | |
| 548 return pInfoFallback; | |
| 549 } else { | |
|
Tom Sepez
2015/09/29 16:26:03
nit: else after return not neeed.
forshaw
2015/09/29 16:46:23
Acknowledged.
| |
| 550 ReleaseDC(NULL, hdc); | |
| 551 return new CFX_Win32FontInfo; | |
| 552 } | |
| 410 } | 553 } |
| 411 void CFX_GEModule::InitPlatform() { | 554 void CFX_GEModule::InitPlatform() { |
| 412 CWin32Platform* pPlatformData = new CWin32Platform; | 555 CWin32Platform* pPlatformData = new CWin32Platform; |
| 413 OSVERSIONINFO ver; | 556 OSVERSIONINFO ver; |
| 414 ver.dwOSVersionInfoSize = sizeof(ver); | 557 ver.dwOSVersionInfoSize = sizeof(ver); |
| 415 GetVersionEx(&ver); | 558 GetVersionEx(&ver); |
| 416 pPlatformData->m_bHalfTone = ver.dwMajorVersion >= 5; | 559 pPlatformData->m_bHalfTone = ver.dwMajorVersion >= 5; |
| 417 pPlatformData->m_GdiplusExt.Load(); | 560 pPlatformData->m_GdiplusExt.Load(); |
| 418 m_pPlatformData = pPlatformData; | 561 m_pPlatformData = pPlatformData; |
| 419 m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault(nullptr)); | 562 m_pFontMgr->SetSystemFontInfo(IFX_SystemFontInfo::CreateDefault(nullptr)); |
| (...skipping 889 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1309 SelectObject(m_hDC, m_hOldBitmap); | 1452 SelectObject(m_hDC, m_hOldBitmap); |
| 1310 DeleteDC(m_hDC); | 1453 DeleteDC(m_hDC); |
| 1311 } | 1454 } |
| 1312 if (m_hBitmap) { | 1455 if (m_hBitmap) { |
| 1313 DeleteObject(m_hBitmap); | 1456 DeleteObject(m_hBitmap); |
| 1314 } | 1457 } |
| 1315 delete GetBitmap(); | 1458 delete GetBitmap(); |
| 1316 } | 1459 } |
| 1317 | 1460 |
| 1318 #endif // _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ | 1461 #endif // _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ |
| OLD | NEW |