summaryrefslogtreecommitdiff
path: root/core/src/fxcrt/fx_unicode.cpp
diff options
context:
space:
mode:
authorLei Zhang <thestig@chromium.org>2015-10-29 15:01:55 -0700
committerLei Zhang <thestig@chromium.org>2015-10-29 15:01:55 -0700
commitee02ea37e8f85920885600d56df706d690e648ff (patch)
tree055bbc66a5c95a8bc75ccc491f73505bb8eb6676 /core/src/fxcrt/fx_unicode.cpp
parent5a88b1131c450dee0500a02f80f0838385e4c4d2 (diff)
downloadpdfium-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.cpp48
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;