diff -Nur qt-x11-opensource-src-4.2.2-bak/src/gui/text/qfontengine.cpp qt-x11-opensource-src-4.2.2/src/gui/text/qfontengine.cpp --- qt-x11-opensource-src-4.2.2-bak/src/gui/text/qfontengine.cpp 2006-11-28 02:26:09.000000000 +0900 +++ qt-x11-opensource-src-4.2.2/src/gui/text/qfontengine.cpp 2006-12-15 21:06:56.000000000 +0900 @@ -615,7 +615,7 @@ Q_ASSERT(engine != 0); if (engine->type() == Box) continue; - glyphs[i].advance = glyphs[i].offset = QFixedPoint(); + glyphs[glyph_pos].advance = glyphs[glyph_pos].offset = QFixedPoint(); int num = 2; engine->stringToCMap(str + i, surrogate ? 2 : 1, glyphs + glyph_pos, &num, flags); Q_ASSERT(num == 1); // surrogates only give 1 glyph diff -Nur qt-x11-opensource-src-4.2.2-bak/src/gui/text/qtextlayout.cpp qt-x11-opensource-src-4.2.2/src/gui/text/qtextlayout.cpp --- qt-x11-opensource-src-4.2.2-bak/src/gui/text/qtextlayout.cpp 2006-11-28 02:26:09.000000000 +0900 +++ qt-x11-opensource-src-4.2.2/src/gui/text/qtextlayout.cpp 2006-12-15 21:11:05.000000000 +0900 @@ -612,7 +612,7 @@ return oldPos; oldPos++; if (mode == SkipCharacters) { - while (oldPos < len && !attributes[oldPos].charStop) + while (oldPos < len && !attributes[oldPos-1].charStop) oldPos++; } else { while (oldPos < len && attributes[oldPos].whiteSpace) @@ -640,7 +640,7 @@ return 0; oldPos--; if (mode == SkipCharacters) { - while (oldPos && !attributes[oldPos].charStop) + while (oldPos && !attributes[oldPos-1].charStop) oldPos--; } else { while (oldPos && attributes[oldPos].whiteSpace) @@ -674,7 +674,9 @@ const QCharAttributes *attributes = d->attributes(); if (!attributes || pos < 0 || pos > (int)d->layoutData->string.length()) return false; - return attributes[pos].charStop; + if (pos == 0) + return true; + return attributes[pos - 1].charStop; }