PRBool HasRTLChars(nsAString& aString) { PRInt32 length = aString.Length(); for (PRInt32 i = 0; i < length; i++) { if ((UCS2_CHAR_IS_BIDI(aString.CharAt(i)) ) || ((NS_IS_HIGH_SURROGATE(aString.CharAt(i))) && (++i < length) && (NS_IS_LOW_SURROGATE(aString.CharAt(i))) && (UTF32_CHAR_IS_BIDI(SURROGATE_TO_UCS4(aString.CharAt(i-1), aString.CharAt(i)))))) { return PR_TRUE; } } return PR_FALSE; }
// To save time we only do this when we really want to know, not during // every allocation void nsTextFragment::UpdateBidiFlag(const PRUnichar* aBuffer, PRUint32 aLength) { if (mState.mIs2b && !mState.mIsBidi) { const PRUnichar* cp = aBuffer; const PRUnichar* end = cp + aLength; while (cp < end) { PRUnichar ch1 = *cp++; PRUint32 utf32Char = ch1; if (NS_IS_HIGH_SURROGATE(ch1) && cp < end && NS_IS_LOW_SURROGATE(*cp)) { PRUnichar ch2 = *cp++; utf32Char = SURROGATE_TO_UCS4(ch1, ch2); } if (UTF32_CHAR_IS_BIDI(utf32Char) || IS_BIDI_CONTROL_CHAR(utf32Char)) { mState.mIsBidi = PR_TRUE; break; } } } }
// To save time we only do this when we really want to know, not during // every allocation void nsTextFragment::UpdateBidiFlag(const char16_t* aBuffer, uint32_t aLength) { if (mState.mIs2b && !mState.mIsBidi) { const char16_t* cp = aBuffer; const char16_t* end = cp + aLength; while (cp < end) { char16_t ch1 = *cp++; uint32_t utf32Char = ch1; if (NS_IS_HIGH_SURROGATE(ch1) && cp < end && NS_IS_LOW_SURROGATE(*cp)) { char16_t ch2 = *cp++; utf32Char = SURROGATE_TO_UCS4(ch1, ch2); } if (UTF32_CHAR_IS_BIDI(utf32Char) || IsBidiControl(utf32Char)) { mState.mIsBidi = true; break; } } } }