<div dir="ltr"><div><div><div>You're right. This is a bit of a hack.<br></div>The problem is that freetype2 does not support OpenType Layout extension tables<br><br><a href="http://freetype.org/opentype/index.html">http://freetype.org/opentype/index.html</a><br><br></div>Anyway, the main issue here was readability. Misplaced base glyphs did have an adverse effect on readability. Misplaced diacritics on the other hand do not. They're actually barely even noticeable.<br><br></div>Still, if you think it's worth the trouble, I'd be more than willing to dig deeper into it. I mean to see if it can be done any better using freetype, and if not, to consider starting a new text rendering module using Pango or HarfBuzz.<br><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 6, 2015 at 9:29 PM, Rémi Denis-Courmont <span dir="ltr"><<a href="mailto:remi@remlab.net" target="_blank">remi@remlab.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Le mardi 06 janvier 2015, 13:42:08 Salah-Eddin Shaban a écrit :<br>
<div><div class="h5">> ---<br>
>  modules/text_renderer/freetype.c | 27 +++++++++++++++++++++++++--<br>
>  1 file changed, 25 insertions(+), 2 deletions(-)<br>
><br>
> diff --git a/modules/text_renderer/freetype.c<br>
> b/modules/text_renderer/freetype.c index 1670aa7..050ace6 100644<br>
> --- a/modules/text_renderer/freetype.c<br>
> +++ b/modules/text_renderer/freetype.c<br>
> @@ -1361,6 +1361,10 @@ static int ProcessLines( filter_t *p_filter,<br>
>              /* Render the part */<br>
>              bool b_break_line = false;<br>
>              int i_glyph_last = 0;<br>
> +            FT_Vector advance = {<br>
> +                .x = 0,<br>
> +                .y = 0,<br>
> +            };<br>
>              while( i_part_length > 0 )<br>
>              {<br>
>                  const text_style_t *p_glyph_style = pp_styles[i_index];<br>
> @@ -1373,6 +1377,16 @@ static int ProcessLines( filter_t *p_filter,<br>
>                  if( i_glyph_index == 0 && character == 0xFEFF )<br>
>                      goto next;<br>
><br>
> +/* These are the most common Arabic diacritics */<br>
> +#define DIACRITIC( a ) ( a >= 0x064B && a <= 0x0653 )<br>
> +<br>
> +                /* Diacritics should be rendered over the preceding base<br>
> glyph */<br>
> +                if( DIACRITIC( character ) )<br>
> +                {<br>
> +                    pen.x -= advance.x;<br>
> +                    pen.y -= advance.y;<br>
> +                }<br>
> +<br>
<br>
</div></div>As far as I know, the font is supposed to specify the relative position of a<br>
character to the previous one. That is not supposed to be hard-coded by the<br>
Unicode code point: combining characters do not look the same in all fonts.<br>
<br>
So this seems too simplistic to be correct.<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Rémi Denis-Courmont<br>
<a href="http://www.remlab.net/" target="_blank">http://www.remlab.net/</a><br>
<br>
</font></span></blockquote></div><br></div>