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 >