| // Copyright 2014 PDFium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| |
| #include "core/fpdftext/unicodenormalization.h" |
| |
| #include "core/fpdftext/unicodenormalizationdata.h" |
| #include "core/include/fxcrt/fx_string.h" |
| |
| namespace { |
| |
| const uint16_t* const g_UnicodeData_Normalization_Maps[5] = { |
| nullptr, g_UnicodeData_Normalization_Map1, g_UnicodeData_Normalization_Map2, |
| g_UnicodeData_Normalization_Map3, g_UnicodeData_Normalization_Map4}; |
| |
| } // namespace |
| |
| FX_STRSIZE FX_Unicode_GetNormalization(FX_WCHAR wch, FX_WCHAR* pDst) { |
| wch = wch & 0xFFFF; |
| FX_WCHAR wFind = g_UnicodeData_Normalization[wch]; |
| if (!wFind) { |
| if (pDst) { |
| *pDst = wch; |
| } |
| return 1; |
| } |
| if (wFind >= 0x8000) { |
| wch = wFind - 0x8000; |
| wFind = 1; |
| } else { |
| wch = wFind & 0x0FFF; |
| wFind >>= 12; |
| } |
| const uint16_t* pMap = g_UnicodeData_Normalization_Maps[wFind]; |
| if (pMap == g_UnicodeData_Normalization_Map4) { |
| pMap = g_UnicodeData_Normalization_Map4 + wch; |
| wFind = (FX_WCHAR)(*pMap++); |
| } else { |
| pMap += wch; |
| } |
| if (pDst) { |
| FX_WCHAR n = wFind; |
| while (n--) { |
| *pDst++ = *pMap++; |
| } |
| } |
| return (FX_STRSIZE)wFind; |
| } |