[prev in list] [next in list] [prev in thread] [next in thread]
List: kfm-devel
Subject: Re: [PATCH] [Bug 91955] Bidi algorithm: incorrect implementation of
From: Mitz Pettel <bugs.kde.org () mitzpettel ! com>
Date: 2004-11-03 11:26:46
Message-ID: 3F170C1D-2D8B-11D9-99B1-0003937C3DB0 () mitzpettel ! com
[Download RAW message or body]
On Nov 3, 2004, at 12:03 PM, Lars Knoll wrote:
>
> Did you check khtmltests/i18n/bidi.html that you don't break any
> existing test
> cases? The patch looks good at first sight but without extensive
> testing I
> can't really tell.
And on Nov 3, 2004, at 12:36 PM, Stephan Kulow wrote:
> The patch breaks more than that. But bidi.html shows already enough of
> them.
Oh dear, as Stephan pointed out, what I submitted breaks mostly
everything. I simply submitted the wrong diff. Sorry about that!
This is the correct diff now, which as far as I could see doesn't break
anything in bidi.html and also corrects bug 91955.
["bidi.cpp.diff" (bidi.cpp.diff)]
Index: bidi.cpp
===================================================================
RCS file: /home/kde/kdelibs/khtml/rendering/bidi.cpp,v
retrieving revision 1.198
diff -u -r1.198 bidi.cpp
--- bidi.cpp 26 Oct 2004 18:58:41 -0000 1.198
+++ bidi.cpp 3 Nov 2004 11:18:33 -0000
@@ -856,26 +856,19 @@
case QChar::DirS:
case QChar::DirWS:
case QChar::DirON:
- if(dir != QChar::DirL) {
+ if( bidi.status.eor != QChar::DirL ) {
//last stuff takes embedding dir
- if( bidi.context->dir == QChar::DirR ) {
- if(!(bidi.status.eor == QChar::DirR)) {
- // AN or EN
- appendRun( bidi );
- dir = QChar::DirR;
- }
- else
- bidi.eor = bidi.last;
+ if(bidi.context->dir == QChar::DirL || bidi.status.lastStrong == QChar::DirL) {
appendRun( bidi );
dir = QChar::DirL;
+ bidi.eor = bidi.current;
bidi.status.eor = QChar::DirL;
} else {
- if(bidi.status.eor == QChar::DirR) {
- appendRun( bidi );
- dir = QChar::DirL;
- } else {
- bidi.eor = bidi.current; bidi.status.eor = QChar::DirL; break;
- }
+ dir = QChar::DirR; // stuff before neutrals must have been R
+ bidi.eor = bidi.last;
+ appendRun( bidi );
+ dir = QChar::DirL;
+ bidi.status.eor = QChar::DirL;
}
} else {
bidi.eor = bidi.current; bidi.status.eor = QChar::DirL;
@@ -911,16 +904,18 @@
case QChar::DirON:
if( !(bidi.status.eor == QChar::DirR) && !(bidi.status.eor == QChar::DirAL) ) {
//last stuff takes embedding dir
- if(bidi.context->dir == QChar::DirR || bidi.status.lastStrong == QChar::DirR) {
+ if(bidi.context->dir == QChar::DirR || bidi.status.lastStrong == QChar::DirR
+ || bidi.status.lastStrong == QChar::DirAL) {
appendRun( bidi );
dir = QChar::DirR;
bidi.eor = bidi.current;
- bidi.status.eor = QChar::DirR;
+ bidi.status.eor = QChar::DirR;
} else {
+ dir = QChar::DirL; // stuff before neutrals must have been L
bidi.eor = bidi.last;
appendRun( bidi );
dir = QChar::DirR;
- bidi.status.eor = QChar::DirR;
+ bidi.status.eor = QChar::DirR;
}
} else {
bidi.eor = bidi.current; bidi.status.eor = QChar::DirR;
@@ -940,10 +935,7 @@
if(!(bidi.status.lastStrong == QChar::DirAL)) {
// if last strong was AL change EN to AN
if(dir == QChar::DirON) {
- if(bidi.status.lastStrong == QChar::DirAL)
- dir = QChar::DirAN;
- else
- dir = QChar::DirL;
+ dir = QChar::DirL;
}
switch(bidi.status.last)
{
@@ -1115,7 +1107,6 @@
break;
case QChar::DirEN:
if ( bidi.status.last == QChar::DirL ) {
- bidi.status.last = QChar::DirL;
break;
}
// fall through
I deeply apologize for the erroneous submission.
-- Mitz Pettel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic