diff options
author | Lei Zhang <thestig@chromium.org> | 2015-10-29 15:01:55 -0700 |
---|---|---|
committer | Lei Zhang <thestig@chromium.org> | 2015-10-29 15:01:55 -0700 |
commit | ee02ea37e8f85920885600d56df706d690e648ff (patch) | |
tree | 055bbc66a5c95a8bc75ccc491f73505bb8eb6676 /core/src/fxcrt/fx_unicode.cpp | |
parent | 5a88b1131c450dee0500a02f80f0838385e4c4d2 (diff) | |
download | pdfium-ee02ea37e8f85920885600d56df706d690e648ff.tar.xz |
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 .
Diffstat (limited to 'core/src/fxcrt/fx_unicode.cpp')
-rw-r--r-- | core/src/fxcrt/fx_unicode.cpp | 48 |
1 files changed, 25 insertions, 23 deletions
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<size_t>(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; |