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/fxcrt/fx_ext.h" 8 extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536]; 9 extern const FX_WCHAR gs_FX_TextLayout_VerticalMirror[64]; 10 extern const FX_WCHAR gs_FX_TextLayout_BidiMirror[512]; 11 FX_DWORD FX_GetUnicodeProperties(FX_WCHAR wch) 12 { 13 return gs_FX_TextLayout_CodeProperties[(FX_WORD)wch]; 14 } 15 FX_BOOL FX_IsCtrlCode(FX_WCHAR ch) 16 { 17 FX_DWORD dwRet = (gs_FX_TextLayout_CodeProperties[(FX_WORD)ch] & FX_CHARTYPEBITSMASK); 18 return dwRet == FX_CHARTYPE_Tab || dwRet == FX_CHARTYPE_Control; 19 } 20 FX_BOOL FX_IsRotationCode(FX_WCHAR ch) 21 { 22 return (gs_FX_TextLayout_CodeProperties[(FX_WORD)ch] & 0x8000) != 0; 23 } 24 FX_BOOL FX_IsCombinationChar(FX_WCHAR wch) 25 { 26 FX_DWORD dwProps = (gs_FX_TextLayout_CodeProperties[(FX_WORD)wch] & FX_CHARTYPEBITSMASK); 27 return dwProps == FX_CHARTYPE_Combination; 28 } 29 FX_BOOL FX_IsBidiChar(FX_WCHAR wch) 30 { 31 FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch]; 32 FX_INT32 iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; 33 return (FX_BIDICLASS_R == iBidiCls || FX_BIDICLASS_AL == iBidiCls); 34 } 35 FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_BOOL bRTL, FX_BOOL bVertical) 36 { 37 FX_DWORD dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch]; 38 FX_DWORD dwTemp = (dwProps & 0xFF800000); 39 if (bRTL && dwTemp < 0xFF800000) { 40 wch = gs_FX_TextLayout_BidiMirror[dwTemp >> 23]; 41 dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch]; 42 } 43 if (bVertical) { 44 dwTemp = (dwProps & 0x007E0000); 45 if (dwTemp < 0x007E0000) { 46 wch = gs_FX_TextLayout_VerticalMirror[dwTemp >> 17]; 47 } 48 } 49 return wch; 50 } 51 FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_DWORD dwProps, FX_BOOL bRTL, FX_BOOL bVertical) 52 { 53 FX_DWORD dwTemp = (dwProps & 0xFF800000); 54 if (bRTL && dwTemp < 0xFF800000) { 55 wch = gs_FX_TextLayout_BidiMirror[dwTemp >> 23]; 56 dwProps = gs_FX_TextLayout_CodeProperties[(FX_WORD)wch]; 57 } 58 if (bVertical) { 59 dwTemp = (dwProps & 0x007E0000); 60 if (dwTemp < 0x007E0000) { 61 wch = gs_FX_TextLayout_VerticalMirror[dwTemp >> 17]; 62 } 63 } 64 return wch; 65 } 66