1 // Copyright 2014 PDFium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6 7 #include "../../include/fpdftext/fpdf_text.h" 8 extern const FX_WCHAR g_UnicodeData_Normalization[]; 9 extern const FX_WCHAR g_UnicodeData_Normalization_Map1[]; 10 extern const FX_WCHAR g_UnicodeData_Normalization_Map2[]; 11 extern const FX_WCHAR g_UnicodeData_Normalization_Map3[]; 12 extern const FX_WCHAR g_UnicodeData_Normalization_Map4[]; 13 FX_LPCWSTR g_UnicodeData_Normalization_Maps[5] = { 14 NULL, 15 g_UnicodeData_Normalization_Map1, 16 g_UnicodeData_Normalization_Map2, 17 g_UnicodeData_Normalization_Map3, 18 g_UnicodeData_Normalization_Map4 19 }; 20 FX_STRSIZE FX_Unicode_GetNormalization(FX_WCHAR wch, FX_LPWSTR pDst) 21 { 22 wch = wch & 0xFFFF; 23 FX_WCHAR wFind = g_UnicodeData_Normalization[wch]; 24 if (!wFind) { 25 if (pDst) { 26 *pDst = wch; 27 } 28 return 1; 29 } 30 if(wFind >= 0x8000) { 31 wch = wFind - 0x8000; 32 wFind = 1; 33 } else { 34 wch = wFind & 0x0FFF; 35 wFind >>= 12; 36 } 37 FX_LPCWSTR pMap = g_UnicodeData_Normalization_Maps[wFind]; 38 if (pMap == g_UnicodeData_Normalization_Map4) { 39 pMap = g_UnicodeData_Normalization_Map4 + wch; 40 wFind = (FX_WCHAR)(*pMap ++); 41 } else { 42 pMap += wch; 43 } 44 if (pDst) { 45 FX_WCHAR n = wFind; 46 while (n --) { 47 *pDst ++ = *pMap ++; 48 } 49 } 50 return (FX_STRSIZE)wFind; 51 } 52 FX_STRSIZE FX_WideString_GetNormalization(FX_WSTR wsSrc, FX_LPWSTR pDst) 53 { 54 FX_STRSIZE nCount = 0; 55 for (FX_STRSIZE len = 0; len < wsSrc.GetLength(); len ++) { 56 FX_WCHAR wch = wsSrc.GetAt(len); 57 if(pDst) { 58 nCount += FX_Unicode_GetNormalization(wch, pDst + nCount); 59 } else { 60 nCount += FX_Unicode_GetNormalization(wch, pDst); 61 } 62 } 63 return nCount; 64 } 65 FX_STRSIZE FX_WideString_GetNormalization(FX_WSTR wsSrc, CFX_WideString &wsDst) 66 { 67 FX_STRSIZE nLen = FX_WideString_GetNormalization(wsSrc, (FX_LPWSTR)NULL); 68 if (!nLen) { 69 return 0; 70 } 71 FX_LPWSTR pBuf = wsDst.GetBuffer(nLen); 72 FX_WideString_GetNormalization(wsSrc, pBuf); 73 wsDst.ReleaseBuffer(nLen); 74 return nLen; 75 } 76