Subject: bug#11860: 24.1; Arabic - Harakat (diacritics, short vowels) don't appear

From: Kenichi Handa <[email-masked]>
Date: Sun, 19 Aug 2012 22:20:27 +0900

In article <[email-masked]>, Eli Zaretskii <[email-masked]> writes:

> > * ScriptPlace -- perhaps for glyph positioning (GPOS features of opentype)
> > 
> > So at first please check the documentation of ScriptShape
> > and figure out how it works for bidi script; i.e. what order
> > does it expect for input, and what order does it produce.

> From the above page:

>   If fLogicalOrder is set to TRUE in the SCRIPT_ANALYSIS structure, the
>   function always generates glyphs in the same order as the original
>   Unicode characters. If fLogicalOrder is set to FALSE, the function
>   generates right-to-left items in reverse order so that ScriptTextOut
>   does not have to reverse them before calling ExtTextOut.

> And w32uniscribe.c sets that flag to TRUE a few lines before it calls
> ScriptShape, because Emacs itself reorders characters:

I see, so the output ScriptShape is still in logical order,
and that explains this glyph order (the glyph code 969 is
for consonant and 760 is for vowel).

  [0 1 1593 969 8 1 8 12 4 nil]
  [0 1 1593 760 0 3 6 12 4 [1 -2 0]]

But, then...

>   If fLogicalOrder is set to FALSE, the function
>   generates right-to-left items in reverse order so that ScriptTextOut
>   does not have to reverse them before calling ExtTextOut.

Doesn't it mean that, if fLogicalOrder is TRUE, ScriptPlace
generates xadvance and left/right bearing while expecting
that the glyphs are re-ordered before actually rendered?

> You can find some details here:

>    http://msdn.microsoft.com/en-us/library/windows/desktop/dd317792%28v=vs.85%29.aspx

> I hope this will allow you to understand the meaning of the above
> code, by looking at how the results are used in the calls to
> LGLYPH_SET_* macros right below the above snippet.

Thank you for the pointer.  I have questions in the section
"Display Text Using Uniscribe" in that page.  The step 2
says:

    1. Extract an array of bidirectional embedding levels,
       one per range. The embedding level is given by
       (SCRIPT_ITEM) si.(SCRIPT_ANALYSIS) a. (SCRIPT_STATE)
       s.uBidiLevel.

>From what and how to extract that array?

    2. Pass this array to ScriptLayout to generate a map of
       visual positions to logical positions.

There's no place in Emacs that calls ScriptLayout.  Isn't it
a problem?

---
Kenichi Handa
[email-masked]