Thanks, that's a good suggestion. I've been contemplating that for a while now.
On Tue, Aug 31, 2010 at 9:24 PM, Vincent Hennebert <[email protected]>wrote: > 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 > > >
