FX_WCHAR FX_GetMirrorChar(FX_WCHAR wch, FX_BOOL bRTL, FX_BOOL bVertical) { FX_DWORD dwProps = FX_GetUnicodeProperties(wch); FX_DWORD dwTemp = (dwProps & 0xFF800000); if (bRTL && dwTemp < 0xFF800000) { size_t idx = dwTemp >> 23; if (idx < kFXTextLayoutBidiMirrorSize) { wch = kFXTextLayoutBidiMirror[idx]; dwProps = FX_GetUnicodeProperties(wch); } }
bool CFX_BidiChar::AppendChar(FX_WCHAR wch) { uint32_t dwProps = FX_GetUnicodeProperties(wch); int32_t iBidiCls = (dwProps & FX_BIDICLASSBITSMASK) >> FX_BIDICLASSBITS; Direction direction = NEUTRAL; switch (iBidiCls) { case FX_BIDICLASS_L: case FX_BIDICLASS_AN: case FX_BIDICLASS_EN: direction = LEFT; break; case FX_BIDICLASS_R: case FX_BIDICLASS_AL: direction = RIGHT; break; } bool bChangeDirection = (direction != m_CurrentSegment.direction); if (bChangeDirection) StartNewSegment(direction); m_CurrentSegment.count++; return bChangeDirection; }
wchar_t GetFormChar(wchar_t wch, wchar_t prev, wchar_t next) { CFX_Char c(wch, FX_GetUnicodeProperties(wch)); CFX_Char p(prev, FX_GetUnicodeProperties(prev)); CFX_Char n(next, FX_GetUnicodeProperties(next)); return GetFormChar(&c, &p, &n); }
FX_BOOL FX_IsCtrlCode(FX_WCHAR ch) { FX_DWORD dwRet = (FX_GetUnicodeProperties(ch) & FX_CHARTYPEBITSMASK); return dwRet == FX_CHARTYPE_Tab || dwRet == FX_CHARTYPE_Control; }