| 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 |