| 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;
|
|
|