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 CWin32FontInfo final : public IFX_SystemFontInfo | 21 class CFX_Win32FontInfo final : public IFX_SystemFontInfo |
22 { | 22 { |
23 public: | 23 public: |
24 CWin32FontInfo(); | 24 CFX_Win32FontInfo(); |
25 ~CWin32FontInfo(); | 25 ~CFX_Win32FontInfo(); |
26 virtual void Release(); | 26 virtual void Release(); |
27 virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper); | 27 virtual FX_BOOL EnumFontList(CFX_FontMapper* pMapper); |
28 virtual void* MapFont(int weight, FX_BOOL bItalic, int charset
, int pitch_family, const FX_CHAR* face, int& iExact); | 28 virtual void* MapFont(int weight, FX_BOOL bItalic, int charset
, int pitch_family, const FX_CHAR* face, int& iExact); |
29 virtual void* GetFont(const FX_CHAR* face) | 29 virtual void* GetFont(const FX_CHAR* face) |
30 { | 30 { |
31 return NULL; | 31 return NULL; |
32 } | 32 } |
33 virtual FX_DWORD GetFontData(void* hFont, FX_DWORD table, uint8_t* buffer
, FX_DWORD size); | 33 virtual FX_DWORD GetFontData(void* hFont, FX_DWORD table, uint8_t* buffer
, FX_DWORD size); |
34 virtual void DeleteFont(void* hFont); | 34 virtual void DeleteFont(void* hFont); |
35 virtual FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name); | 35 virtual FX_BOOL GetFaceName(void* hFont, CFX_ByteString& name); |
36 virtual FX_BOOL GetFontCharset(void* hFont, int& charset); | 36 virtual FX_BOOL GetFontCharset(void* hFont, int& charset); |
37 FX_BOOL IsOpenTypeFromDiv(const LOGFONTA *plf); | 37 FX_BOOL IsOpenTypeFromDiv(const LOGFONTA *plf); |
38 FX_BOOL IsSupportFontFormDiv(const LOGFONTA* plf
); | 38 FX_BOOL IsSupportFontFormDiv(const LOGFONTA* plf
); |
39 void AddInstalledFont(const LOGFONTA *plf, FX
_DWORD FontType); | 39 void AddInstalledFont(const LOGFONTA *plf, FX
_DWORD FontType); |
40 void GetGBPreference(CFX_ByteString& face, in
t weight, int picth_family); | 40 void GetGBPreference(CFX_ByteString& face, in
t weight, int picth_family); |
41 void GetJapanesePreference(CFX_ByteString& fa
ce, int weight, int picth_family); | 41 void GetJapanesePreference(CFX_ByteString& fa
ce, int weight, int picth_family); |
42 CFX_ByteString FindFont(const CFX_ByteString& name); | 42 CFX_ByteString FindFont(const CFX_ByteString& name); |
43 HDC m_hDC; | 43 HDC m_hDC; |
44 CFX_FontMapper* m_pMapper; | 44 CFX_FontMapper* m_pMapper; |
45 CFX_ByteString m_LastFamily; | 45 CFX_ByteString m_LastFamily; |
46 CFX_ByteString m_KaiTi, m_FangSong; | 46 CFX_ByteString m_KaiTi, m_FangSong; |
47 }; | 47 }; |
48 CWin32FontInfo::CWin32FontInfo() | 48 CFX_Win32FontInfo::CFX_Win32FontInfo() |
49 { | 49 { |
50 m_hDC = CreateCompatibleDC(NULL); | 50 m_hDC = CreateCompatibleDC(NULL); |
51 } | 51 } |
52 CWin32FontInfo::~CWin32FontInfo() | 52 CFX_Win32FontInfo::~CFX_Win32FontInfo() |
53 { | 53 { |
54 m_pMapper = NULL; | 54 m_pMapper = NULL; |
55 } | 55 } |
56 void CWin32FontInfo::Release() | 56 void CFX_Win32FontInfo::Release() |
57 { | 57 { |
58 DeleteDC(m_hDC); | 58 DeleteDC(m_hDC); |
59 delete this; | 59 delete this; |
60 } | 60 } |
61 #define TT_MAKE_TAG(x1, x2, x3, x4) (((FX_DWORD)x1<<24)|((FX_DWORD)x2<<16)|((FX_
DWORD)x3<<8)|(FX_DWORD)x4) | 61 #define TT_MAKE_TAG(x1, x2, x3, x4) (((FX_DWORD)x1<<24)|((FX_DWORD)x2<<16)|((FX_
DWORD)x3<<8)|(FX_DWORD)x4) |
62 FX_BOOL CWin32FontInfo::IsOpenTypeFromDiv(const LOGFONTA *plf) | 62 FX_BOOL CFX_Win32FontInfo::IsOpenTypeFromDiv(const LOGFONTA *plf) |
63 { | 63 { |
64 HFONT hFont = CreateFontIndirectA(plf); | 64 HFONT hFont = CreateFontIndirectA(plf); |
65 FX_BOOL ret = FALSE; | 65 FX_BOOL ret = FALSE; |
66 FX_DWORD font_size = GetFontData(hFont, 0, NULL, 0); | 66 FX_DWORD font_size = GetFontData(hFont, 0, NULL, 0); |
67 if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) { | 67 if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) { |
68 FX_DWORD lVersion = 0; | 68 FX_DWORD lVersion = 0; |
69 GetFontData(hFont, 0, (uint8_t*)(&lVersion), sizeof(FX_DWORD)); | 69 GetFontData(hFont, 0, (uint8_t*)(&lVersion), sizeof(FX_DWORD)); |
70 lVersion = (((FX_DWORD)(uint8_t)(lVersion)) << 24) | ((FX_DWORD)((uint8_
t)(lVersion >> 8))) << 16 | | 70 lVersion = (((FX_DWORD)(uint8_t)(lVersion)) << 24) | ((FX_DWORD)((uint8_
t)(lVersion >> 8))) << 16 | |
71 ((FX_DWORD)((uint8_t)(lVersion >> 16))) << 8 | ((uint8_t)(lVe
rsion >> 24)); | 71 ((FX_DWORD)((uint8_t)(lVersion >> 16))) << 8 | ((uint8_t)(lVe
rsion >> 24)); |
72 if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') || | 72 if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') || |
73 lVersion == 0x00010000 || | 73 lVersion == 0x00010000 || |
74 lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') || | 74 lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') || |
75 lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') || | 75 lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') || |
76 lVersion == 0x00020000) { | 76 lVersion == 0x00020000) { |
77 ret = TRUE; | 77 ret = TRUE; |
78 } | 78 } |
79 } | 79 } |
80 DeleteFont(hFont); | 80 DeleteFont(hFont); |
81 return ret; | 81 return ret; |
82 } | 82 } |
83 FX_BOOL CWin32FontInfo::IsSupportFontFormDiv(const LOGFONTA* plf) | 83 FX_BOOL CFX_Win32FontInfo::IsSupportFontFormDiv(const LOGFONTA* plf) |
84 { | 84 { |
85 HFONT hFont = CreateFontIndirectA(plf); | 85 HFONT hFont = CreateFontIndirectA(plf); |
86 FX_BOOL ret = FALSE; | 86 FX_BOOL ret = FALSE; |
87 FX_DWORD font_size = GetFontData(hFont, 0, NULL, 0); | 87 FX_DWORD font_size = GetFontData(hFont, 0, NULL, 0); |
88 if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) { | 88 if (font_size != GDI_ERROR && font_size >= sizeof(FX_DWORD)) { |
89 FX_DWORD lVersion = 0; | 89 FX_DWORD lVersion = 0; |
90 GetFontData(hFont, 0, (uint8_t*)(&lVersion), sizeof(FX_DWORD)); | 90 GetFontData(hFont, 0, (uint8_t*)(&lVersion), sizeof(FX_DWORD)); |
91 lVersion = (((FX_DWORD)(uint8_t)(lVersion)) << 24) | ((FX_DWORD)((uint8_
t)(lVersion >> 8))) << 16 | | 91 lVersion = (((FX_DWORD)(uint8_t)(lVersion)) << 24) | ((FX_DWORD)((uint8_
t)(lVersion >> 8))) << 16 | |
92 ((FX_DWORD)((uint8_t)(lVersion >> 16))) << 8 | ((uint8_t)(lVe
rsion >> 24)); | 92 ((FX_DWORD)((uint8_t)(lVersion >> 16))) << 8 | ((uint8_t)(lVe
rsion >> 24)); |
93 if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') || | 93 if (lVersion == TT_MAKE_TAG('O', 'T', 'T', 'O') || |
94 lVersion == 0x00010000 || | 94 lVersion == 0x00010000 || |
95 lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') || | 95 lVersion == TT_MAKE_TAG('t', 't', 'c', 'f') || |
96 lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') || | 96 lVersion == TT_MAKE_TAG('t', 'r', 'u', 'e') || |
97 lVersion == 0x00020000) { | 97 lVersion == 0x00020000) { |
98 ret = TRUE; | 98 ret = TRUE; |
99 } else if ((lVersion & 0xFFFF0000) == TT_MAKE_TAG(0x80, 0x01, 0x00, 0x00
) || | 99 } else if ((lVersion & 0xFFFF0000) == TT_MAKE_TAG(0x80, 0x01, 0x00, 0x00
) || |
100 (lVersion & 0xFFFF0000) == TT_MAKE_TAG('%', '!', 0, 0)) { | 100 (lVersion & 0xFFFF0000) == TT_MAKE_TAG('%', '!', 0, 0)) { |
101 ret = TRUE; | 101 ret = TRUE; |
102 } | 102 } |
103 } | 103 } |
104 DeleteFont(hFont); | 104 DeleteFont(hFont); |
105 return ret; | 105 return ret; |
106 } | 106 } |
107 void CWin32FontInfo::AddInstalledFont(const LOGFONTA *plf, FX_DWORD FontType) | 107 void CFX_Win32FontInfo::AddInstalledFont(const LOGFONTA *plf, FX_DWORD FontType) |
108 { | 108 { |
109 CFX_ByteString name(plf->lfFaceName, -1); | 109 CFX_ByteString name(plf->lfFaceName, -1); |
110 if (name[0] == '@') { | 110 if (name[0] == '@') { |
111 return; | 111 return; |
112 } | 112 } |
113 if (name == m_LastFamily) { | 113 if (name == m_LastFamily) { |
114 m_pMapper->AddInstalledFont(name, plf->lfCharSet); | 114 m_pMapper->AddInstalledFont(name, plf->lfCharSet); |
115 return; | 115 return; |
116 } | 116 } |
117 if (!(FontType & TRUETYPE_FONTTYPE) && !(FontType & DEVICE_FONTTYPE)) { | 117 if (!(FontType & TRUETYPE_FONTTYPE) && !(FontType & DEVICE_FONTTYPE)) { |
118 return; | 118 return; |
119 } | 119 } |
120 if (!(FontType & TRUETYPE_FONTTYPE)) { | 120 if (!(FontType & TRUETYPE_FONTTYPE)) { |
121 if (!IsSupportFontFormDiv(plf)) { | 121 if (!IsSupportFontFormDiv(plf)) { |
122 return; | 122 return; |
123 } | 123 } |
124 } | 124 } |
125 m_pMapper->AddInstalledFont(name, plf->lfCharSet); | 125 m_pMapper->AddInstalledFont(name, plf->lfCharSet); |
126 m_LastFamily = name; | 126 m_LastFamily = name; |
127 } | 127 } |
128 static int CALLBACK FontEnumProc( | 128 static int CALLBACK FontEnumProc( |
129 const LOGFONTA *plf, | 129 const LOGFONTA *plf, |
130 const TEXTMETRICA *lpntme, | 130 const TEXTMETRICA *lpntme, |
131 FX_DWORD FontType, | 131 FX_DWORD FontType, |
132 LPARAM lParam | 132 LPARAM lParam |
133 ) | 133 ) |
134 { | 134 { |
135 CWin32FontInfo* pFontInfo = (CWin32FontInfo*)lParam; | 135 CFX_Win32FontInfo* pFontInfo = (CFX_Win32FontInfo*)lParam; |
136 if (pFontInfo->m_pMapper->GetFontEnumerator()) { | 136 if (pFontInfo->m_pMapper->GetFontEnumerator()) { |
137 pFontInfo->m_pMapper->GetFontEnumerator()->HitFont(); | 137 pFontInfo->m_pMapper->GetFontEnumerator()->HitFont(); |
138 } | 138 } |
139 pFontInfo->AddInstalledFont(plf, FontType); | 139 pFontInfo->AddInstalledFont(plf, FontType); |
140 return 1; | 140 return 1; |
141 } | 141 } |
142 FX_BOOL CWin32FontInfo::EnumFontList(CFX_FontMapper* pMapper) | 142 FX_BOOL CFX_Win32FontInfo::EnumFontList(CFX_FontMapper* pMapper) |
143 { | 143 { |
144 m_pMapper = pMapper; | 144 m_pMapper = pMapper; |
145 LOGFONTA lf; | 145 LOGFONTA lf; |
146 FXSYS_memset(&lf, 0, sizeof(LOGFONTA)); | 146 FXSYS_memset(&lf, 0, sizeof(LOGFONTA)); |
147 lf.lfCharSet = DEFAULT_CHARSET; | 147 lf.lfCharSet = DEFAULT_CHARSET; |
148 lf.lfFaceName[0] = 0; | 148 lf.lfFaceName[0] = 0; |
149 lf.lfPitchAndFamily = 0; | 149 lf.lfPitchAndFamily = 0; |
150 EnumFontFamiliesExA(m_hDC, &lf, (FONTENUMPROCA)FontEnumProc, (uintptr_t)this
, 0); | 150 EnumFontFamiliesExA(m_hDC, &lf, (FONTENUMPROCA)FontEnumProc, (uintptr_t)this
, 0); |
151 if (pMapper->GetFontEnumerator()) { | 151 if (pMapper->GetFontEnumerator()) { |
152 pMapper->GetFontEnumerator()->Finish(); | 152 pMapper->GetFontEnumerator()->Finish(); |
(...skipping 20 matching lines...) Expand all Loading... |
173 {"Courier-Oblique", "Courier New", FALSE, TRUE}, | 173 {"Courier-Oblique", "Courier New", FALSE, TRUE}, |
174 {"Helvetica", "Arial", FALSE, FALSE}, | 174 {"Helvetica", "Arial", FALSE, FALSE}, |
175 {"Helvetica-Bold", "Arial", TRUE, FALSE}, | 175 {"Helvetica-Bold", "Arial", TRUE, FALSE}, |
176 {"Helvetica-BoldOblique", "Arial", TRUE, TRUE}, | 176 {"Helvetica-BoldOblique", "Arial", TRUE, TRUE}, |
177 {"Helvetica-Oblique", "Arial", FALSE, TRUE}, | 177 {"Helvetica-Oblique", "Arial", FALSE, TRUE}, |
178 {"Times-Roman", "Times New Roman", FALSE, FALSE}, | 178 {"Times-Roman", "Times New Roman", FALSE, FALSE}, |
179 {"Times-Bold", "Times New Roman", TRUE, FALSE}, | 179 {"Times-Bold", "Times New Roman", TRUE, FALSE}, |
180 {"Times-BoldItalic", "Times New Roman", TRUE, TRUE}, | 180 {"Times-BoldItalic", "Times New Roman", TRUE, TRUE}, |
181 {"Times-Italic", "Times New Roman", FALSE, TRUE}, | 181 {"Times-Italic", "Times New Roman", FALSE, TRUE}, |
182 }; | 182 }; |
183 CFX_ByteString CWin32FontInfo::FindFont(const CFX_ByteString& name) | 183 CFX_ByteString CFX_Win32FontInfo::FindFont(const CFX_ByteString& name) |
184 { | 184 { |
185 if (m_pMapper == NULL) { | 185 if (m_pMapper == NULL) { |
186 return name; | 186 return name; |
187 } | 187 } |
188 int nFonts = m_pMapper->m_InstalledTTFonts.GetSize(); | 188 int nFonts = m_pMapper->m_InstalledTTFonts.GetSize(); |
189 for (int i = 0; i < nFonts; i ++) { | 189 for (int i = 0; i < nFonts; i ++) { |
190 CFX_ByteString thisname = m_pMapper->m_InstalledTTFonts[i]; | 190 CFX_ByteString thisname = m_pMapper->m_InstalledTTFonts[i]; |
191 if (thisname[0] == ' ') { | 191 if (thisname[0] == ' ') { |
192 if (thisname.Mid(1, name.GetLength()) == name) { | 192 if (thisname.Mid(1, name.GetLength()) == name) { |
193 return m_pMapper->m_InstalledTTFonts[i + 1]; | 193 return m_pMapper->m_InstalledTTFonts[i + 1]; |
(...skipping 23 matching lines...) Expand all Loading... |
217 int size = sizeof g_JpFontNameMap; | 217 int size = sizeof g_JpFontNameMap; |
218 void* pFontnameMap = (void*)g_JpFontNameMap; | 218 void* pFontnameMap = (void*)g_JpFontNameMap; |
219 _FontNameMap* found = (_FontNameMap*)FXSYS_bsearch(name.c_str(), pFontnameMa
p, | 219 _FontNameMap* found = (_FontNameMap*)FXSYS_bsearch(name.c_str(), pFontnameMa
p, |
220 size / sizeof (_FontNameMap), sizeof (_FontNameMap), c
ompareString); | 220 size / sizeof (_FontNameMap), sizeof (_FontNameMap), c
ompareString); |
221 if (found == NULL) { | 221 if (found == NULL) { |
222 return FALSE; | 222 return FALSE; |
223 } | 223 } |
224 name = found->m_pSubFontName; | 224 name = found->m_pSubFontName; |
225 return TRUE; | 225 return TRUE; |
226 } | 226 } |
227 void CWin32FontInfo::GetGBPreference(CFX_ByteString& face, int weight, int picth
_family) | 227 void CFX_Win32FontInfo::GetGBPreference(CFX_ByteString& face, int weight, int pi
cth_family) |
228 { | 228 { |
229 if (face.Find("KaiTi") >= 0 || face.Find("\xbf\xac") >= 0) { | 229 if (face.Find("KaiTi") >= 0 || face.Find("\xbf\xac") >= 0) { |
230 if (m_KaiTi.IsEmpty()) { | 230 if (m_KaiTi.IsEmpty()) { |
231 m_KaiTi = FindFont("KaiTi"); | 231 m_KaiTi = FindFont("KaiTi"); |
232 if (m_KaiTi.IsEmpty()) { | 232 if (m_KaiTi.IsEmpty()) { |
233 m_KaiTi = "SimSun"; | 233 m_KaiTi = "SimSun"; |
234 } | 234 } |
235 } | 235 } |
236 face = m_KaiTi; | 236 face = m_KaiTi; |
237 } else if (face.Find("FangSong") >= 0 || face.Find("\xb7\xc2\xcb\xce") >= 0)
{ | 237 } else if (face.Find("FangSong") >= 0 || face.Find("\xb7\xc2\xcb\xce") >= 0)
{ |
238 if (m_FangSong.IsEmpty()) { | 238 if (m_FangSong.IsEmpty()) { |
239 m_FangSong = FindFont("FangSong"); | 239 m_FangSong = FindFont("FangSong"); |
240 if (m_FangSong.IsEmpty()) { | 240 if (m_FangSong.IsEmpty()) { |
241 m_FangSong = "SimSun"; | 241 m_FangSong = "SimSun"; |
242 } | 242 } |
243 } | 243 } |
244 face = m_FangSong; | 244 face = m_FangSong; |
245 } else if (face.Find("SimSun") >= 0 || face.Find("\xcb\xce") >= 0) { | 245 } else if (face.Find("SimSun") >= 0 || face.Find("\xcb\xce") >= 0) { |
246 face = "SimSun"; | 246 face = "SimSun"; |
247 } else if (face.Find("SimHei") >= 0 || face.Find("\xba\xda") >= 0) { | 247 } else if (face.Find("SimHei") >= 0 || face.Find("\xba\xda") >= 0) { |
248 face = "SimHei"; | 248 face = "SimHei"; |
249 } else if (!(picth_family & FF_ROMAN) && weight > 550) { | 249 } else if (!(picth_family & FF_ROMAN) && weight > 550) { |
250 face = "SimHei"; | 250 face = "SimHei"; |
251 } else { | 251 } else { |
252 face = "SimSun"; | 252 face = "SimSun"; |
253 } | 253 } |
254 } | 254 } |
255 void CWin32FontInfo::GetJapanesePreference(CFX_ByteString& face, int weight, int
picth_family) | 255 void CFX_Win32FontInfo::GetJapanesePreference(CFX_ByteString& face, int weight,
int picth_family) |
256 { | 256 { |
257 if (face.Find("Gothic") >= 0 || face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e"
) >= 0) { | 257 if (face.Find("Gothic") >= 0 || face.Find("\x83\x53\x83\x56\x83\x62\x83\x4e"
) >= 0) { |
258 if (face.Find("PGothic") >= 0 || face.Find("\x82\x6f\x83\x53\x83\x56\x83
\x62\x83\x4e") >= 0) { | 258 if (face.Find("PGothic") >= 0 || face.Find("\x82\x6f\x83\x53\x83\x56\x83
\x62\x83\x4e") >= 0) { |
259 face = "MS PGothic"; | 259 face = "MS PGothic"; |
260 } else if (face.Find("UI Gothic") >= 0) { | 260 } else if (face.Find("UI Gothic") >= 0) { |
261 face = "MS UI Gothic"; | 261 face = "MS UI Gothic"; |
262 } else { | 262 } else { |
263 if (face.Find("HGSGothicM") >= 0 || face.Find("HGMaruGothicMPRO") >=
0) { | 263 if (face.Find("HGSGothicM") >= 0 || face.Find("HGMaruGothicMPRO") >=
0) { |
264 face = "MS PGothic"; | 264 face = "MS PGothic"; |
265 } else { | 265 } else { |
(...skipping 12 matching lines...) Expand all Loading... |
278 } | 278 } |
279 if (_GetSubFontName(face)) { | 279 if (_GetSubFontName(face)) { |
280 return; | 280 return; |
281 } | 281 } |
282 if (!(picth_family & FF_ROMAN) && weight > 400) { | 282 if (!(picth_family & FF_ROMAN) && weight > 400) { |
283 face = "MS PGothic"; | 283 face = "MS PGothic"; |
284 } else { | 284 } else { |
285 face = "MS PMincho"; | 285 face = "MS PMincho"; |
286 } | 286 } |
287 } | 287 } |
288 void* CWin32FontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int pitc
h_family, const FX_CHAR* cstr_face, int& iExact) | 288 void* CFX_Win32FontInfo::MapFont(int weight, FX_BOOL bItalic, int charset, int p
itch_family, const FX_CHAR* cstr_face, int& iExact) |
289 { | 289 { |
290 CFX_ByteString face = cstr_face; | 290 CFX_ByteString face = cstr_face; |
291 int iBaseFont; | 291 int iBaseFont; |
292 for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++) | 292 for (iBaseFont = 0; iBaseFont < 12; iBaseFont ++) |
293 if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) { | 293 if (face == CFX_ByteStringC(Base14Substs[iBaseFont].m_pName)) { |
294 face = Base14Substs[iBaseFont].m_pWinName; | 294 face = Base14Substs[iBaseFont].m_pWinName; |
295 weight = Base14Substs[iBaseFont].m_bBold ? FW_BOLD : FW_NORMAL; | 295 weight = Base14Substs[iBaseFont].m_bBold ? FW_BOLD : FW_NORMAL; |
296 bItalic = Base14Substs[iBaseFont].m_bItalic; | 296 bItalic = Base14Substs[iBaseFont].m_bItalic; |
297 iExact = TRUE; | 297 iExact = TRUE; |
298 break; | 298 break; |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 face = "MingLiU"; | 351 face = "MingLiU"; |
352 } else { | 352 } else { |
353 face = "PMingLiU"; | 353 face = "PMingLiU"; |
354 } | 354 } |
355 break; | 355 break; |
356 } | 356 } |
357 hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, OUT_TT_O
NLY_PRECIS, | 357 hFont = ::CreateFontA(-10, 0, 0, 0, weight, bItalic, 0, 0, charset, OUT_TT_O
NLY_PRECIS, |
358 0, 0, subst_pitch_family, face); | 358 0, 0, subst_pitch_family, face); |
359 return hFont; | 359 return hFont; |
360 } | 360 } |
361 void CWin32FontInfo::DeleteFont(void* hFont) | 361 void CFX_Win32FontInfo::DeleteFont(void* hFont) |
362 { | 362 { |
363 ::DeleteObject(hFont); | 363 ::DeleteObject(hFont); |
364 } | 364 } |
365 FX_DWORD CWin32FontInfo::GetFontData(void* hFont, FX_DWORD table, uint8_t* buffe
r, FX_DWORD size) | 365 FX_DWORD CFX_Win32FontInfo::GetFontData(void* hFont, FX_DWORD table, uint8_t* bu
ffer, FX_DWORD size) |
366 { | 366 { |
367 HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont); | 367 HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont); |
368 table = FXDWORD_FROM_MSBFIRST(table); | 368 table = FXDWORD_FROM_MSBFIRST(table); |
369 size = ::GetFontData(m_hDC, table, 0, buffer, size); | 369 size = ::GetFontData(m_hDC, table, 0, buffer, size); |
370 ::SelectObject(m_hDC, hOldFont); | 370 ::SelectObject(m_hDC, hOldFont); |
371 if (size == GDI_ERROR) { | 371 if (size == GDI_ERROR) { |
372 return 0; | 372 return 0; |
373 } | 373 } |
374 return size; | 374 return size; |
375 } | 375 } |
376 FX_BOOL CWin32FontInfo::GetFaceName(void* hFont, CFX_ByteString& name) | 376 FX_BOOL CFX_Win32FontInfo::GetFaceName(void* hFont, CFX_ByteString& name) |
377 { | 377 { |
378 char facebuf[100]; | 378 char facebuf[100]; |
379 HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont); | 379 HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont); |
380 int ret = ::GetTextFaceA(m_hDC, 100, facebuf); | 380 int ret = ::GetTextFaceA(m_hDC, 100, facebuf); |
381 ::SelectObject(m_hDC, hOldFont); | 381 ::SelectObject(m_hDC, hOldFont); |
382 if (ret == 0) { | 382 if (ret == 0) { |
383 return FALSE; | 383 return FALSE; |
384 } | 384 } |
385 name = facebuf; | 385 name = facebuf; |
386 return TRUE; | 386 return TRUE; |
387 } | 387 } |
388 FX_BOOL CWin32FontInfo::GetFontCharset(void* hFont, int& charset) | 388 FX_BOOL CFX_Win32FontInfo::GetFontCharset(void* hFont, int& charset) |
389 { | 389 { |
390 TEXTMETRIC tm; | 390 TEXTMETRIC tm; |
391 HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont); | 391 HFONT hOldFont = (HFONT)::SelectObject(m_hDC, (HFONT)hFont); |
392 ::GetTextMetrics(m_hDC, &tm); | 392 ::GetTextMetrics(m_hDC, &tm); |
393 ::SelectObject(m_hDC, hOldFont); | 393 ::SelectObject(m_hDC, hOldFont); |
394 charset = tm.tmCharSet; | 394 charset = tm.tmCharSet; |
395 return TRUE; | 395 return TRUE; |
396 } | 396 } |
397 IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault() | 397 IFX_SystemFontInfo* IFX_SystemFontInfo::CreateDefault() |
398 { | 398 { |
399 return FX_NEW CWin32FontInfo; | 399 return new CFX_Win32FontInfo; |
400 } | 400 } |
401 void CFX_GEModule::InitPlatform() | 401 void CFX_GEModule::InitPlatform() |
402 { | 402 { |
403 CWin32Platform* pPlatformData = FX_NEW CWin32Platform; | 403 CWin32Platform* pPlatformData = FX_NEW CWin32Platform; |
404 if (!pPlatformData) { | 404 if (!pPlatformData) { |
405 return; | 405 return; |
406 } | 406 } |
407 OSVERSIONINFO ver; | 407 OSVERSIONINFO ver; |
408 ver.dwOSVersionInfoSize = sizeof(ver); | 408 ver.dwOSVersionInfoSize = sizeof(ver); |
409 GetVersionEx(&ver); | 409 GetVersionEx(&ver); |
(...skipping 799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1209 SelectObject(m_hDC, m_hOldBitmap); | 1209 SelectObject(m_hDC, m_hOldBitmap); |
1210 DeleteDC(m_hDC); | 1210 DeleteDC(m_hDC); |
1211 } | 1211 } |
1212 if (m_hBitmap) { | 1212 if (m_hBitmap) { |
1213 DeleteObject(m_hBitmap); | 1213 DeleteObject(m_hBitmap); |
1214 } | 1214 } |
1215 delete GetBitmap(); | 1215 delete GetBitmap(); |
1216 } | 1216 } |
1217 | 1217 |
1218 #endif // _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ | 1218 #endif // _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ |
OLD | NEW |