[mapserver-dev] Fwd: RE: [FriBidi] Incorrect Arabic text rendering in maperver

Stephen Woodbridge woodbri at swoodbridge.com
Mon Mar 21 21:26:48 EDT 2011


Hmmm, I just realized this never make it to the dev list.

-Steve W

-------- Original Message --------
Subject: RE: [FriBidi] Incorrect Arabic text rendering in maperver
Date: Sun, 13 Mar 2011 03:40:52 -0400
From: Ian Walberg <ian.walberg at airborne.aero>
To: Stephen Woodbridge <woodbri at swoodbridge.com>
CC: Behdad Esfahbod <behdad.esfahbod at gmail.com>, 
<mapserver-devs at lists.osgeo.org>

Stephen,

Attached is the modified mapserver mapstring.c file which includes 
changes based on your code snippet.

We have tested this today in our configuration and this solves the issue 
we had.

I have not previous submitted a change so I am not sure what the process is.

Regards

Ian

-----Original Message-----
From: Stephen Woodbridge [mailto:woodbri at swoodbridge.com]
Sent: Saturday, March 12, 2011 7:35 PM
To: Ian Walberg
Subject: Re: [FriBidi] Incorrect Arabic text rendering in maperver

Ian,

I'm have not followed all of this thread, but from what I have gathered, 
  the mapserver code needs to walk over the string and remove these 
characters which seems reasonable.

So if you are up to making a patch to mapserver and attaching that to a 
  the bug you opened, we can see if we can get it reviewed and added to 
  6.0 which just went to beta.

FRIBIDI_CHAR_FILL is evidently a three byte sequence if I recall from an 
  earlier post on this thread.

  > Also does FRIBIDI_CHAR_FILL get converted to a single utf8 character?
  > What is its value?
\xef\xbb\xbf.

This is untested, but I think something like this should work to remove
the FRIBIDI_CHAR_FILL character sequences. You will need to adapt it to
the mapserver code.

/* scan str and compress out FRIBIDI_CHAR_FILL UTF8 characters */
if (utf8) {
    len = strlen(str);
    for (i=0, j=0; i<len; i++, j++) {
      if (str[i] == '\xef' && str[i+1] == '\xbb' && str[i+2] == '\xbf')
        i += 3;
      if (i != j) str[j] = str[i];
    }
    str[j] = '\0';
}

-Steve W

On 3/12/2011 7:04 PM, Behdad Esfahbod wrote:
> On 03/09/11 14:08, Ian Walberg wrote:
>> Behdad,
>
> Hello,
>
>> We are back looking at this again and have tried a few combinations and none seem to work.
>>
>> Here is the test change we made to fribidi-arabic.c
>>
>> for (i = 0; i<  len - 1; i++) {
>>      register FriBidiChar c;
>>      if (FRIBIDI_LEVEL_IS_RTL(embedding_levels[i])&&
>>          embedding_levels[i] == embedding_levels[i+1]&&
>>          (c = PAIR_MATCH(table, size, str[i], str[i+1])))
>>        {
>>          /* str[i] = FRIBIDI_CHAR_FILL; */
>> // Do we need to remove this next line as well?
>>          FRIBIDI_SET_BITS(ar_props[i], FRIBIDI_MASK_LIGATURED);
>>          /* str[i+1] = c; */
>>          str[i] = c;
>>        }
>>    }
>
> I suggest instead of changing the FriBidi code you simply walk over the output
> string and remove the filler character.
>
> behdad
>
>
>> The assumption is that we would make the 'real' change to mapserver and not here.
>
>> Thanks
>>
>> Ian

-------------- next part --------------
A non-text attachment was scrubbed...
Name: mapstring.c
Type: application/octet-stream
Size: 52594 bytes
Desc: not available
Url : http://lists.osgeo.org/pipermail/mapserver-dev/attachments/20110321/b8c1db3d/mapstring-0001.obj


More information about the mapserver-dev mailing list