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
>