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 "core/fpdfapi/fpdf_cmaps/cmap_int.h" | 7 #include "core/fpdfapi/fpdf_cmaps/cmap_int.h" |
8 | 8 |
9 #include "core/fpdfapi/fpdf_font/font_int.h" | 9 #include "core/fpdfapi/fpdf_font/font_int.h" |
10 #include "core/fpdfapi/include/cpdf_modulemgr.h" | 10 #include "core/fpdfapi/include/cpdf_modulemgr.h" |
(...skipping 12 matching lines...) Expand all Loading... |
23 for (int i = 0; i < nCMaps; i++) { | 23 for (int i = 0; i < nCMaps; i++) { |
24 if (FXSYS_strcmp(name, pCMaps[i].m_Name)) { | 24 if (FXSYS_strcmp(name, pCMaps[i].m_Name)) { |
25 continue; | 25 continue; |
26 } | 26 } |
27 pMap = &pCMaps[i]; | 27 pMap = &pCMaps[i]; |
28 break; | 28 break; |
29 } | 29 } |
30 } | 30 } |
31 extern "C" { | 31 extern "C" { |
32 static int compareWord(const void* p1, const void* p2) { | 32 static int compareWord(const void* p1, const void* p2) { |
33 return (*(FX_WORD*)p1) - (*(FX_WORD*)p2); | 33 return (*(uint16_t*)p1) - (*(uint16_t*)p2); |
34 } | 34 } |
35 }; | 35 }; |
36 extern "C" { | 36 extern "C" { |
37 static int compareWordRange(const void* key, const void* element) { | 37 static int compareWordRange(const void* key, const void* element) { |
38 if (*(FX_WORD*)key < *(FX_WORD*)element) { | 38 if (*(uint16_t*)key < *(uint16_t*)element) { |
39 return -1; | 39 return -1; |
40 } | 40 } |
41 if (*(FX_WORD*)key > ((FX_WORD*)element)[1]) { | 41 if (*(uint16_t*)key > ((uint16_t*)element)[1]) { |
42 return 1; | 42 return 1; |
43 } | 43 } |
44 return 0; | 44 return 0; |
45 } | 45 } |
46 }; | 46 }; |
47 extern "C" { | 47 extern "C" { |
48 static int compareDWordRange(const void* p1, const void* p2) { | 48 static int compareDWordRange(const void* p1, const void* p2) { |
49 FX_DWORD key = *(FX_DWORD*)p1; | 49 FX_DWORD key = *(FX_DWORD*)p1; |
50 FX_WORD hiword = (FX_WORD)(key >> 16); | 50 uint16_t hiword = (uint16_t)(key >> 16); |
51 FX_WORD* element = (FX_WORD*)p2; | 51 uint16_t* element = (uint16_t*)p2; |
52 if (hiword < element[0]) { | 52 if (hiword < element[0]) { |
53 return -1; | 53 return -1; |
54 } | 54 } |
55 if (hiword > element[0]) { | 55 if (hiword > element[0]) { |
56 return 1; | 56 return 1; |
57 } | 57 } |
58 FX_WORD loword = (FX_WORD)key; | 58 uint16_t loword = (uint16_t)key; |
59 if (loword < element[1]) { | 59 if (loword < element[1]) { |
60 return -1; | 60 return -1; |
61 } | 61 } |
62 if (loword > element[2]) { | 62 if (loword > element[2]) { |
63 return 1; | 63 return 1; |
64 } | 64 } |
65 return 0; | 65 return 0; |
66 } | 66 } |
67 }; | 67 }; |
68 extern "C" { | 68 extern "C" { |
69 static int compareDWordSingle(const void* p1, const void* p2) { | 69 static int compareDWordSingle(const void* p1, const void* p2) { |
70 FX_DWORD key = *(FX_DWORD*)p1; | 70 FX_DWORD key = *(FX_DWORD*)p1; |
71 FX_DWORD value = ((*(FX_WORD*)p2) << 16) | ((FX_WORD*)p2)[1]; | 71 FX_DWORD value = ((*(uint16_t*)p2) << 16) | ((uint16_t*)p2)[1]; |
72 if (key < value) { | 72 if (key < value) { |
73 return -1; | 73 return -1; |
74 } | 74 } |
75 if (key > value) { | 75 if (key > value) { |
76 return 1; | 76 return 1; |
77 } | 77 } |
78 return 0; | 78 return 0; |
79 } | 79 } |
80 }; | 80 }; |
81 FX_WORD FPDFAPI_CIDFromCharCode(const FXCMAP_CMap* pMap, FX_DWORD charcode) { | 81 uint16_t FPDFAPI_CIDFromCharCode(const FXCMAP_CMap* pMap, FX_DWORD charcode) { |
82 if (charcode >> 16) { | 82 if (charcode >> 16) { |
83 while (1) { | 83 while (1) { |
84 if (pMap->m_DWordMapType == FXCMAP_CMap::Range) { | 84 if (pMap->m_DWordMapType == FXCMAP_CMap::Range) { |
85 FX_WORD* found = | 85 uint16_t* found = |
86 (FX_WORD*)FXSYS_bsearch(&charcode, pMap->m_pDWordMap, | 86 (uint16_t*)FXSYS_bsearch(&charcode, pMap->m_pDWordMap, |
87 pMap->m_DWordCount, 8, compareDWordRange); | 87 pMap->m_DWordCount, 8, compareDWordRange); |
88 if (found) { | 88 if (found) { |
89 return found[3] + (FX_WORD)charcode - found[1]; | 89 return found[3] + (uint16_t)charcode - found[1]; |
90 } | 90 } |
91 } else if (pMap->m_DWordMapType == FXCMAP_CMap::Single) { | 91 } else if (pMap->m_DWordMapType == FXCMAP_CMap::Single) { |
92 FX_WORD* found = | 92 uint16_t* found = |
93 (FX_WORD*)FXSYS_bsearch(&charcode, pMap->m_pDWordMap, | 93 (uint16_t*)FXSYS_bsearch(&charcode, pMap->m_pDWordMap, |
94 pMap->m_DWordCount, 6, compareDWordSingle); | 94 pMap->m_DWordCount, 6, compareDWordSingle); |
95 if (found) { | 95 if (found) { |
96 return found[2]; | 96 return found[2]; |
97 } | 97 } |
98 } | 98 } |
99 if (pMap->m_UseOffset == 0) { | 99 if (pMap->m_UseOffset == 0) { |
100 return 0; | 100 return 0; |
101 } | 101 } |
102 pMap = pMap + pMap->m_UseOffset; | 102 pMap = pMap + pMap->m_UseOffset; |
103 } | 103 } |
104 return 0; | 104 return 0; |
105 } | 105 } |
106 FX_WORD code = (FX_WORD)charcode; | 106 uint16_t code = (uint16_t)charcode; |
107 while (1) { | 107 while (1) { |
108 if (!pMap->m_pWordMap) { | 108 if (!pMap->m_pWordMap) { |
109 return 0; | 109 return 0; |
110 } | 110 } |
111 if (pMap->m_WordMapType == FXCMAP_CMap::Single) { | 111 if (pMap->m_WordMapType == FXCMAP_CMap::Single) { |
112 FX_WORD* found = (FX_WORD*)FXSYS_bsearch( | 112 uint16_t* found = (uint16_t*)FXSYS_bsearch( |
113 &code, pMap->m_pWordMap, pMap->m_WordCount, 4, compareWord); | 113 &code, pMap->m_pWordMap, pMap->m_WordCount, 4, compareWord); |
114 if (found) { | 114 if (found) { |
115 return found[1]; | 115 return found[1]; |
116 } | 116 } |
117 } else if (pMap->m_WordMapType == FXCMAP_CMap::Range) { | 117 } else if (pMap->m_WordMapType == FXCMAP_CMap::Range) { |
118 FX_WORD* found = (FX_WORD*)FXSYS_bsearch( | 118 uint16_t* found = (uint16_t*)FXSYS_bsearch( |
119 &code, pMap->m_pWordMap, pMap->m_WordCount, 6, compareWordRange); | 119 &code, pMap->m_pWordMap, pMap->m_WordCount, 6, compareWordRange); |
120 if (found) { | 120 if (found) { |
121 return found[2] + code - found[0]; | 121 return found[2] + code - found[0]; |
122 } | 122 } |
123 } | 123 } |
124 if (pMap->m_UseOffset == 0) { | 124 if (pMap->m_UseOffset == 0) { |
125 return 0; | 125 return 0; |
126 } | 126 } |
127 pMap = pMap + pMap->m_UseOffset; | 127 pMap = pMap + pMap->m_UseOffset; |
128 } | 128 } |
129 return 0; | 129 return 0; |
130 } | 130 } |
131 FX_DWORD FPDFAPI_CharCodeFromCID(const FXCMAP_CMap* pMap, FX_WORD cid) { | 131 FX_DWORD FPDFAPI_CharCodeFromCID(const FXCMAP_CMap* pMap, uint16_t cid) { |
132 while (1) { | 132 while (1) { |
133 if (pMap->m_WordMapType == FXCMAP_CMap::Single) { | 133 if (pMap->m_WordMapType == FXCMAP_CMap::Single) { |
134 const FX_WORD* pCur = pMap->m_pWordMap; | 134 const uint16_t* pCur = pMap->m_pWordMap; |
135 const FX_WORD* pEnd = pMap->m_pWordMap + pMap->m_WordCount * 2; | 135 const uint16_t* pEnd = pMap->m_pWordMap + pMap->m_WordCount * 2; |
136 while (pCur < pEnd) { | 136 while (pCur < pEnd) { |
137 if (pCur[1] == cid) { | 137 if (pCur[1] == cid) { |
138 return pCur[0]; | 138 return pCur[0]; |
139 } | 139 } |
140 pCur += 2; | 140 pCur += 2; |
141 } | 141 } |
142 } else if (pMap->m_WordMapType == FXCMAP_CMap::Range) { | 142 } else if (pMap->m_WordMapType == FXCMAP_CMap::Range) { |
143 const FX_WORD* pCur = pMap->m_pWordMap; | 143 const uint16_t* pCur = pMap->m_pWordMap; |
144 const FX_WORD* pEnd = pMap->m_pWordMap + pMap->m_WordCount * 3; | 144 const uint16_t* pEnd = pMap->m_pWordMap + pMap->m_WordCount * 3; |
145 while (pCur < pEnd) { | 145 while (pCur < pEnd) { |
146 if (cid >= pCur[2] && cid <= pCur[2] + pCur[1] - pCur[0]) { | 146 if (cid >= pCur[2] && cid <= pCur[2] + pCur[1] - pCur[0]) { |
147 return pCur[0] + cid - pCur[2]; | 147 return pCur[0] + cid - pCur[2]; |
148 } | 148 } |
149 pCur += 3; | 149 pCur += 3; |
150 } | 150 } |
151 } | 151 } |
152 if (pMap->m_UseOffset == 0) { | 152 if (pMap->m_UseOffset == 0) { |
153 return 0; | 153 return 0; |
154 } | 154 } |
155 pMap = pMap + pMap->m_UseOffset; | 155 pMap = pMap + pMap->m_UseOffset; |
156 } | 156 } |
157 while (1) { | 157 while (1) { |
158 if (pMap->m_DWordMapType == FXCMAP_CMap::Range) { | 158 if (pMap->m_DWordMapType == FXCMAP_CMap::Range) { |
159 const FX_WORD* pCur = pMap->m_pDWordMap; | 159 const uint16_t* pCur = pMap->m_pDWordMap; |
160 const FX_WORD* pEnd = pMap->m_pDWordMap + pMap->m_DWordCount * 4; | 160 const uint16_t* pEnd = pMap->m_pDWordMap + pMap->m_DWordCount * 4; |
161 while (pCur < pEnd) { | 161 while (pCur < pEnd) { |
162 if (cid >= pCur[3] && cid <= pCur[3] + pCur[2] - pCur[1]) { | 162 if (cid >= pCur[3] && cid <= pCur[3] + pCur[2] - pCur[1]) { |
163 return (((FX_DWORD)pCur[0] << 16) | pCur[1]) + cid - pCur[3]; | 163 return (((FX_DWORD)pCur[0] << 16) | pCur[1]) + cid - pCur[3]; |
164 } | 164 } |
165 pCur += 4; | 165 pCur += 4; |
166 } | 166 } |
167 } else if (pMap->m_DWordMapType == FXCMAP_CMap::Single) { | 167 } else if (pMap->m_DWordMapType == FXCMAP_CMap::Single) { |
168 const FX_WORD* pCur = pMap->m_pDWordMap; | 168 const uint16_t* pCur = pMap->m_pDWordMap; |
169 const FX_WORD* pEnd = pMap->m_pDWordMap + pMap->m_DWordCount * 3; | 169 const uint16_t* pEnd = pMap->m_pDWordMap + pMap->m_DWordCount * 3; |
170 while (pCur < pEnd) { | 170 while (pCur < pEnd) { |
171 if (pCur[2] == cid) { | 171 if (pCur[2] == cid) { |
172 return ((FX_DWORD)pCur[0] << 16) | pCur[1]; | 172 return ((FX_DWORD)pCur[0] << 16) | pCur[1]; |
173 } | 173 } |
174 pCur += 3; | 174 pCur += 3; |
175 } | 175 } |
176 } | 176 } |
177 if (pMap->m_UseOffset == 0) { | 177 if (pMap->m_UseOffset == 0) { |
178 return 0; | 178 return 0; |
179 } | 179 } |
180 pMap = pMap + pMap->m_UseOffset; | 180 pMap = pMap + pMap->m_UseOffset; |
181 } | 181 } |
182 return 0; | 182 return 0; |
183 } | 183 } |
184 | 184 |
185 void FPDFAPI_LoadCID2UnicodeMap(CIDSet charset, | 185 void FPDFAPI_LoadCID2UnicodeMap(CIDSet charset, |
186 const FX_WORD*& pMap, | 186 const uint16_t*& pMap, |
187 FX_DWORD& count) { | 187 FX_DWORD& count) { |
188 CPDF_FontGlobals* pFontGlobals = | 188 CPDF_FontGlobals* pFontGlobals = |
189 CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals(); | 189 CPDF_ModuleMgr::Get()->GetPageModule()->GetFontGlobals(); |
190 pMap = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap; | 190 pMap = pFontGlobals->m_EmbeddedToUnicodes[charset].m_pMap; |
191 count = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count; | 191 count = pFontGlobals->m_EmbeddedToUnicodes[charset].m_Count; |
192 } | 192 } |
OLD | NEW |