From ee02ea37e8f85920885600d56df706d690e648ff Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Thu, 29 Oct 2015 15:01:55 -0700 Subject: XFA: Manual merge of Clean up IFX_BidiChar - Replace IFX_BidiChar with just CFX_BidiChar - Document implementation - Change out parameters to pointers - Remove dead code - Add an enum for bidi directions - Move several externs to a header - Add unit tests Original CL: https://codereview.chromium.org/1197643002 This version does not remove fx_arb.h and fx_arabic.h, as there is code on the XFA branch that still uses parts of it. R=tsepez@chromium.org Review URL: https://codereview.chromium.org/1423103002 . --- core/src/fxcrt/fx_unicode.cpp | 48 ++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 23 deletions(-) (limited to 'core/src/fxcrt/fx_unicode.cpp') diff --git a/core/src/fxcrt/fx_unicode.cpp b/core/src/fxcrt/fx_unicode.cpp index 67ff009513..105301e0a8 100644 --- a/core/src/fxcrt/fx_unicode.cpp +++ b/core/src/fxcrt/fx_unicode.cpp @@ -7,54 +7,56 @@ #include "../../include/fxcrt/fx_ucd.h" FX_DWORD FX_GetUnicodeProperties(FX_WCHAR wch) { - return kTextLayoutCodeProperties[(FX_WORD)wch]; + size_t idx = static_cast(wch); + if (idx < kTextLayoutCodePropertiesSize) + return kTextLayoutCodeProperties[(FX_WORD)wch]; + return 0; } + FX_BOOL FX_IsCtrlCode(FX_WCHAR ch) { - FX_DWORD dwRet = - (kTextLayoutCodeProperties[(FX_WORD)ch] & FX_CHARTYPEBITSMASK); + FX_DWORD dwRet = (FX_GetUnicodeProperties(ch) & FX_CHARTYPEBITSMASK); return dwRet == FX_CHARTYPE_Tab || dwRet == FX_CHARTYPE_Control; } -FX_BOOL FX_IsRotationCode(FX_WCHAR ch) { - return (kTextLayoutCodeProperties[(FX_WORD)ch] & 0x8000) != 0; -} -FX_BOOL FX_IsCombinationChar(FX_WCHAR wch) { - FX_DWORD dwProps = - (kTextLayoutCodeProperties[(FX_WORD)wch] & FX_CHARTYPEBITSMASK); - return dwProps == FX_CHARTYPE_Combination; -} -FX_BOOL FX_IsBidiChar(FX_WCHAR wch) { - FX_DWORD dwProps = kTextLayoutCodeProperties[(FX_WORD)wch]; - int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; - return (FX_BIDICLASS_R == iBidiCls || FX_BIDICLASS_AL == iBidiCls); -} + FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_BOOL bRTL, FX_BOOL bVertical) { - FX_DWORD dwProps = kTextLayoutCodeProperties[(FX_WORD)wch]; + FX_DWORD dwProps = FX_GetUnicodeProperties(wch); FX_DWORD dwTemp = (dwProps & 0xFF800000); if (bRTL && dwTemp < 0xFF800000) { - wch = kFXTextLayoutBidiMirror[dwTemp >> 23]; - dwProps = kTextLayoutCodeProperties[(FX_WORD)wch]; + size_t idx = dwTemp >> 23; + if (idx < kFXTextLayoutBidiMirrorSize) { + wch = kFXTextLayoutBidiMirror[idx]; + dwProps = FX_GetUnicodeProperties(wch); + } } if (bVertical) { dwTemp = (dwProps & 0x007E0000); if (dwTemp < 0x007E0000) { - wch = kFXTextLayoutVerticalMirror[dwTemp >> 17]; + size_t idx = dwTemp >> 17; + if (idx < kFXTextLayoutVerticalMirrorSize) + wch = kFXTextLayoutVerticalMirror[idx]; } } return wch; } + FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_DWORD dwProps, FX_BOOL bRTL, FX_BOOL bVertical) { FX_DWORD dwTemp = (dwProps & 0xFF800000); if (bRTL && dwTemp < 0xFF800000) { - wch = kFXTextLayoutBidiMirror[dwTemp >> 23]; - dwProps = kTextLayoutCodeProperties[(FX_WORD)wch]; + size_t idx = dwTemp >> 23; + if (idx < kFXTextLayoutBidiMirrorSize) { + wch = kFXTextLayoutBidiMirror[idx]; + dwProps = FX_GetUnicodeProperties(wch); + } } if (bVertical) { dwTemp = (dwProps & 0x007E0000); if (dwTemp < 0x007E0000) { - wch = kFXTextLayoutVerticalMirror[dwTemp >> 17]; + size_t idx = dwTemp >> 17; + if (idx < kFXTextLayoutVerticalMirrorSize) + wch = kFXTextLayoutVerticalMirror[idx]; } } return wch; -- cgit v1.2.3