Text kerning in Java components and Batik

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Text kerning in Java components and Batik

victor-38
Good day!
 
I have a problem synchronizing text in Java Swing text components (JTextPane) with the the text in SVG document.
My text component is positioned on the top of JSVCanvas and the idea is to allow user edit text and then copy it to SVGDocument to be rendered. The problem is that text kerning in Java components and SVG is different. When text inserted to SVGDocument using SVG text element it has position and height like in JTextPane (after User-space to SVG-space transform), but distance between characters is different. Does anyone know how add text to SVG document exactly how it appears in Java (JTextPane or JTextField) component?
 
I tried:
* Disable kerning in SVG and position each glyph individually using Java GlyphVector and SVG <text x="..." y="...">. Doesn't work.
* Use AWTGVTFont to create GVTGlyphVector and get glyph positions Batik. Doesn't work, all glyph info is null in AWTGVTFont, probably it can't be used individually.
* Create text graphics node to let it render text in custom java component. I created own SVGOMText element and when I try to convert it to text graphics node using GVTBuilder it throws exception telling that visibility info can't be converted. It seems to work only in document context.
 
Thank you!
Reply | Threaded
Open this post in threaded view
|

Re: Text kerning in Java components and Batik

thomas.deweese
Hi Victor,

Victor wrote:

> I have a problem synchronizing text in Java Swing text components
> (JTextPane) with the the text in SVG document.
> My text component is positioned on the top of JSVCanvas and the idea is
> to allow user edit text and then copy it to SVGDocument to be rendered.
> The problem is that text kerning in Java components and SVG is
> different. When text inserted to SVGDocument using SVG text element it
> has position and height like in JTextPane (after User-space to SVG-space
> transform), but distance between characters is different.

   It is worth noting that a small difference in font-size or scale
factor may be unnoticeable for the height of the text but for any
length of text may become huge.

> Does anyone know how add text to SVG document exactly how it appears
> in Java (JTextPane or JTextField) component?

    The default rendering of the SVG text comes directly from an
AWT GlyphVector.  So they should match as long as it is a platform
font (i.e. not an SVG font).

> I tried:
> * Disable kerning in SVG and position each glyph individually using Java
> GlyphVector and SVG <text x="..." y="...">. Doesn't work.

    What do you mean?  The text isn't positioned where you say it should
be?  Are you using a list of x/y's?  Sounds like your translation may
be a little off.  Ask AWT what the text-length is and draw a line that
length in the document.

> * Use AWTGVTFont to create GVTGlyphVector and get glyph positions Batik.
> Doesn't work, all glyph info is null in AWTGVTFont, probably it can't be
> used individually.

    You could use the existing SVG Text API's to get the location of
each character in the string.  There is a fairly complete example
in 'samples/tests/spec/scripting/text_content.svg'.

> * Create text graphics node to let it render text in custom java
> component. I created own SVGOMText element and when I try to convert
> it to text graphics node using GVTBuilder it throws exception telling
> that visibility info can't be converted. It seems to work only in
> document context.

    It needs CSS.  The easiest way to get this is a document.

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]