forked from mirrors/gecko-dev
Bug 1296050 - When checking whether bidi resolution is needed, ignore Unicode directional-control characters that do not actually introduce right-to-left-ness. r=xidorn
This commit is contained in:
parent
882bb6e2b5
commit
e45cb1544d
2 changed files with 24 additions and 1 deletions
|
|
@ -461,7 +461,7 @@ nsTextFragment::UpdateBidiFlag(const char16_t* aBuffer, uint32_t aLength)
|
||||||
char16_t ch2 = *cp++;
|
char16_t ch2 = *cp++;
|
||||||
utf32Char = SURROGATE_TO_UCS4(ch1, ch2);
|
utf32Char = SURROGATE_TO_UCS4(ch1, ch2);
|
||||||
}
|
}
|
||||||
if (UTF32_CHAR_IS_BIDI(utf32Char) || IsBidiControl(utf32Char)) {
|
if (UTF32_CHAR_IS_BIDI(utf32Char) || IsBidiControlRTL(utf32Char)) {
|
||||||
mState.mIsBidi = true;
|
mState.mIsBidi = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -111,10 +111,19 @@ typedef enum nsCharType nsCharType;
|
||||||
* Return false, otherwise
|
* Return false, otherwise
|
||||||
*/
|
*/
|
||||||
#define LRM_CHAR 0x200e
|
#define LRM_CHAR 0x200e
|
||||||
|
#define RLM_CHAR 0x200f
|
||||||
|
|
||||||
#define LRE_CHAR 0x202a
|
#define LRE_CHAR 0x202a
|
||||||
|
#define RLE_CHAR 0x202b
|
||||||
|
#define PDF_CHAR 0x202c
|
||||||
|
#define LRO_CHAR 0x202d
|
||||||
#define RLO_CHAR 0x202e
|
#define RLO_CHAR 0x202e
|
||||||
|
|
||||||
#define LRI_CHAR 0x2066
|
#define LRI_CHAR 0x2066
|
||||||
|
#define RLI_CHAR 0x2067
|
||||||
|
#define FSI_CHAR 0x2068
|
||||||
#define PDI_CHAR 0x2069
|
#define PDI_CHAR 0x2069
|
||||||
|
|
||||||
#define ALM_CHAR 0x061C
|
#define ALM_CHAR 0x061C
|
||||||
inline bool IsBidiControl(uint32_t aChar) {
|
inline bool IsBidiControl(uint32_t aChar) {
|
||||||
return ((LRE_CHAR <= aChar && aChar <= RLO_CHAR) ||
|
return ((LRE_CHAR <= aChar && aChar <= RLO_CHAR) ||
|
||||||
|
|
@ -123,6 +132,20 @@ typedef enum nsCharType nsCharType;
|
||||||
(aChar & 0xfffffe) == LRM_CHAR);
|
(aChar & 0xfffffe) == LRM_CHAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Give a UTF-32 codepoint
|
||||||
|
* Return true if the codepoint is a Bidi control character that may result
|
||||||
|
* in RTL directionality and therefore needs to trigger bidi resolution;
|
||||||
|
* return false otherwise.
|
||||||
|
*/
|
||||||
|
inline bool IsBidiControlRTL(uint32_t aChar) {
|
||||||
|
return aChar == RLM_CHAR ||
|
||||||
|
aChar == RLE_CHAR ||
|
||||||
|
aChar == RLO_CHAR ||
|
||||||
|
aChar == RLI_CHAR ||
|
||||||
|
aChar == ALM_CHAR;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Give an nsString.
|
* Give an nsString.
|
||||||
* @return true if the string contains right-to-left characters
|
* @return true if the string contains right-to-left characters
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue