Hi Glenn,

A dedicated class with meaningful fields (e.g., xPlacement, xAdvance)
would probably be preferable to an array of 4 int. This would be safer
and easier to understand and use.

For the rest, that sounds good.

Vincent


Glenn Adams wrote:
> Folks,
> 
> I'd like to mention a change I will implement on IFPainter#drawText method
> in order to accommodate complex scripts (as well as non-complex script usage
> in a variety of written languages). I'm bringing this up now so there can be
> discussion ahead of time if needed.
> 
> Basically, the change is to generalize the int[] dx parameter to be a two
> dimensional array of glyph placement/advancement adjustments.
> 
> The current interface is:
> 
> void drawText(int x, int y, int letterSpacing, int wordSpacing, int[] dx,
> String text) throws IFException;
> 
> The modified method interface would read as follows:
> 
> void drawText(int x, int y, int letterSpacing, int wordSpacing, int[][]
> adjustments, String text) throws IFException;
> 
> The adjustments array is optional (in which case it is null). If non-null,
> it is effectively typed as int[][4], i.e., an array of int[4] arrays, where
> the four elements of each row are:
> 
> a[0] = x placement adjustment
> a[1] = y placement adjustment
> a[2] = x advance adjustment
> a[3] = y advance adjustment
> 
> The [x,y] placement adjustments are added to the current point to determine
> the effective glyph (char) origin, and the [x,y] advance adjustments are
> applied to the current point after rendering the glyph (char) and performing
> the default (implicit) advance.
> 
> To be more explicit, the algorithm using these adjustments is effectively as
> follows (ignoring word and letter spacing for the moment):
> 
> int curPointX = x;
> int curPointY = y;
> for ( int i = 0, n = glyphs.length; i < n; i++ ) {
>   int g = glyphs [ i ];
>   int gx = curPointX;
>   int gy = curPointY;
>   int[] a = ( adjustments != null ) ? adjustments[i] : null;
>   if ( a != null ) {
>     gx += a[0];
>     gy += a[1];
>   }
>   drawGlyph ( g, gx, gy );
>   curPointX += font.getGlyphAdvanceX ( g );
>   curPointY += font.getGlyphAdvanceY ( g );
>   if ( a != null ) {
>     curPointX += a[2];
>     curPointY += a[3];
>   }
> }
> 
> It is mandatory to provide this generality in order to support not only
> complex scripts, but also non-complex scripts (e.g, Latin, Greek, Cyrillic,
> CJK, etc) when used with non-spacing marks (in many written languages) and
> also for other advanced typographic effects.
> 
> Attached is a simple example of the use of this feature in order to adjust
> the placement (and advance) of U+064E ARABIC FATHA and U+0650 ARABIC KASRA,
> respectively, the upper and lower non-spacing marks shown in this example.
> 
> Regards,
> Glenn
> 

Reply via email to