| /* |
| * %W% %E% |
| * |
| * (C) Copyright IBM Corp. 2001 - All Rights Reserved |
| * |
| */ |
| |
| #include "layout/LETypes.h" |
| #include "layout/LEScripts.h" |
| #include "unicode/uscript.h" |
| |
| #include "scrptrun.h" |
| |
| le_bool ScriptRun::sameScript(le_int32 scriptOne, le_int32 scriptTwo) |
| { |
| return scriptOne <= qaaiScriptCode || scriptTwo <= qaaiScriptCode || scriptOne == scriptTwo; |
| } |
| |
| le_bool ScriptRun::next() |
| { |
| UErrorCode error = U_ZERO_ERROR; |
| |
| if (scriptEnd >= charLimit) { |
| return false; |
| } |
| |
| scriptCode = zyyyScriptCode; |
| |
| for (scriptStart = scriptEnd; scriptEnd < charLimit; scriptEnd += 1) { |
| LEUnicode16 high = charArray[scriptEnd]; |
| LEUnicode32 ch = high; |
| |
| if (scriptEnd < charLimit - 1 && high >= 0xD800 && high <= 0xDBFF) |
| { |
| LEUnicode16 low = charArray[scriptEnd + 1]; |
| |
| if (low >= 0xDC00 && low <= 0xDFFF) { |
| ch = (high - 0xD800) * 0x0400 + low - 0xDC00 + 0x10000; |
| scriptEnd += 1; |
| } |
| } |
| |
| le_int32 sc = uscript_getScript(ch, &error); |
| |
| if (sameScript(scriptCode, sc)) { |
| if (scriptCode <= qaaiScriptCode && sc > qaaiScriptCode) { |
| scriptCode = sc; |
| } |
| } else { |
| // if the run broke on a surrogate pair, |
| // end it before the high surrogate |
| if (ch >= 0x10000) { |
| scriptEnd -= 1; |
| } |
| |
| break; |
| } |
| } |
| |
| return true; |
| } |
| |