Index: core/src/fxge/ge/fx_ge_fontmap.cpp |
diff --git a/core/src/fxge/ge/fx_ge_fontmap.cpp b/core/src/fxge/ge/fx_ge_fontmap.cpp |
index b9850f85db810e7afc9638f522ce0d1ffe8a1015..06b58ea3abc89218be842397200844985c82b89f 100644 |
--- a/core/src/fxge/ge/fx_ge_fontmap.cpp |
+++ b/core/src/fxge/ge/fx_ge_fontmap.cpp |
@@ -4,6 +4,7 @@ |
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
+#include <algorithm> |
#include <limits> |
#include <vector> |
@@ -197,17 +198,17 @@ const struct FX_FontStyle { |
{"Bold", 4}, {"Italic", 6}, {"BoldItalic", 10}, {"Reg", 3}, {"Regular", 7}, |
}; |
-const struct CHARSET_MAP { |
- uint8_t charset; |
+const struct CODEPAGE_MAP { |
FX_WORD codepage; |
+ uint8_t charset; |
} g_Codepage2CharsetTable[] = { |
- {1, 0}, {2, 42}, {254, 437}, {255, 850}, {222, 874}, |
- {128, 932}, {134, 936}, {129, 949}, {136, 950}, {238, 1250}, |
- {204, 1251}, {0, 1252}, {161, 1253}, {162, 1254}, {177, 1255}, |
- {178, 1256}, {186, 1257}, {163, 1258}, {130, 1361}, {77, 10000}, |
- {78, 10001}, {79, 10003}, {80, 10008}, {81, 10002}, {83, 10005}, |
- {84, 10004}, {85, 10006}, {86, 10081}, {87, 10021}, {88, 10029}, |
- {89, 10007}, |
+ {0, 1}, {42, 2}, {437, 254}, {850, 255}, {874, 222}, |
+ {932, 128}, {936, 134}, {949, 129}, {950, 136}, {1250, 238}, |
+ {1251, 204}, {1252, 0}, {1253, 161}, {1254, 162}, {1255, 177}, |
+ {1256, 178}, {1257, 186}, {1258, 163}, {1361, 130}, {10000, 77}, |
+ {10001, 78}, {10002, 81}, {10003, 79}, {10004, 84}, {10005, 83}, |
+ {10006, 85}, {10007, 89}, {10008, 80}, {10021, 87}, {10029, 88}, |
+ {10081, 86}, |
}; |
const FX_DWORD kTableNAME = FXDWORD_GET_MSBFIRST("name"); |
@@ -281,21 +282,15 @@ CFX_ByteString FPDF_LoadTableFromTT(FXSYS_FILE* pFile, |
} |
uint8_t GetCharsetFromCodePage(FX_WORD codepage) { |
- int32_t iEnd = sizeof(g_Codepage2CharsetTable) / sizeof(CHARSET_MAP) - 1; |
- FXSYS_assert(iEnd >= 0); |
- int32_t iStart = 0, iMid; |
- do { |
- iMid = (iStart + iEnd) / 2; |
- const CHARSET_MAP& cp = g_Codepage2CharsetTable[iMid]; |
- if (codepage == cp.codepage) { |
- return cp.charset; |
- } |
- if (codepage < cp.codepage) { |
- iEnd = iMid - 1; |
- } else { |
- iStart = iMid + 1; |
- } |
- } while (iStart <= iEnd); |
+ const CODEPAGE_MAP* pEnd = |
+ g_Codepage2CharsetTable + FX_ArraySize(g_Codepage2CharsetTable); |
+ const CODEPAGE_MAP* pCharmap = |
+ std::lower_bound(g_Codepage2CharsetTable, pEnd, codepage, |
+ [](const CODEPAGE_MAP& charset, FX_WORD page) { |
+ return charset.codepage < page; |
+ }); |
+ if (pCharmap < pEnd && codepage == pCharmap->codepage) |
+ return pCharmap->charset; |
return 1; |
} |