| // 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 "../../include/fpdftext/fpdf_text.h" |
| extern const FX_WCHAR g_UnicodeData_Normalization[65536]; |
| extern const FX_WCHAR g_UnicodeData_Normalization_Map1[5376]; |
| extern const FX_WCHAR g_UnicodeData_Normalization_Map2[1734]; |
| extern const FX_WCHAR g_UnicodeData_Normalization_Map3[1164]; |
| extern const FX_WCHAR g_UnicodeData_Normalization_Map4[488]; |
| FX_LPCWSTR g_UnicodeData_Normalization_Maps[5] = { |
| NULL, |
| g_UnicodeData_Normalization_Map1, |
| g_UnicodeData_Normalization_Map2, |
| g_UnicodeData_Normalization_Map3, |
| g_UnicodeData_Normalization_Map4 |
| }; |
| FX_STRSIZE FX_Unicode_GetNormalization(FX_WCHAR wch, FX_LPWSTR 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; |
| } |
| FX_LPCWSTR 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; |
| } |
| FX_STRSIZE FX_WideString_GetNormalization(FX_WSTR wsSrc, FX_LPWSTR pDst) |
| { |
| FX_STRSIZE nCount = 0; |
| for (FX_STRSIZE len = 0; len < wsSrc.GetLength(); len ++) { |
| FX_WCHAR wch = wsSrc.GetAt(len); |
| if(pDst) { |
| nCount += FX_Unicode_GetNormalization(wch, pDst + nCount); |
| } else { |
| nCount += FX_Unicode_GetNormalization(wch, pDst); |
| } |
| } |
| return nCount; |
| } |
| FX_STRSIZE FX_WideString_GetNormalization(FX_WSTR wsSrc, CFX_WideString &wsDst) |
| { |
| FX_STRSIZE nLen = FX_WideString_GetNormalization(wsSrc, (FX_LPWSTR)NULL); |
| if (!nLen) { |
| return 0; |
| } |
| FX_LPWSTR pBuf = wsDst.GetBuffer(nLen); |
| FX_WideString_GetNormalization(wsSrc, pBuf); |
| wsDst.ReleaseBuffer(nLen); |
| return nLen; |
| } |