Index: core/src/fxcrt/fx_unicode.cpp |
diff --git a/core/src/fxcrt/fx_unicode.cpp b/core/src/fxcrt/fx_unicode.cpp |
index 67ff009513ec4c6fb993a9893d7bab08ffbe0b81..105301e0a87d49b096683e1106406bb6bf5c619e 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; |