fx_unicode.cpp revision ee451cb395940862dad63c85adfe8f2fd55e864c
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" 8extern const FX_DWORD gs_FX_TextLayout_CodeProperties[65536]; 9extern const FX_WCHAR gs_FX_TextLayout_VerticalMirror[64]; 10extern const FX_WCHAR gs_FX_TextLayout_BidiMirror[512]; 11FX_DWORD FX_GetUnicodeProperties(FX_WCHAR wch) 12{ 13 return gs_FX_TextLayout_CodeProperties[(FX_WORD)wch]; 14} 15FX_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} 20FX_BOOL FX_IsRotationCode(FX_WCHAR ch) 21{ 22 return (gs_FX_TextLayout_CodeProperties[(FX_WORD)ch] & 0x8000) != 0; 23} 24FX_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} 29FX_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} 35FX_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} 51FX_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