summaryrefslogtreecommitdiff
path: root/core/src/fxcrt/fx_unicode.cpp
diff options
context:
space:
mode:
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;