- From: Tavmjong Bah <tavmjong@free.fr>
- Date: Tue, 06 Jul 2010 16:52:42 +0200
- To: SVG Working Group WG <public-svg-wg@w3.org>, Alex Danilo <alex@abbra.com>
Hi, Issue 2332, Comment regarding Text layout was discussed at last weeks telcon. I've investigate the issue a bit further and have written up a short report that follows. Tav Summary of issue: The main question is how should ligatures be treated in regards to the 'x', 'y', 'dx', 'dy', and 'rotate' attributes. 10.5 gives rules for how the attributes are applied while 10.7.1 states that ligatures should not be used if explicit values for 'x' or 'y' are given as these create different "text chunks". This negates the need for the rules in 10.5 to apply to 'x' or 'y'. (10.7.1 also state ligatures should not be used if the kerning attribute or letter-spacing attribute is non-zero.) NB The attributes are applied to characters. Current browser behavior (using system fonts): See: http://dev.w3.org/SVG/profiles/1.1F2/ua-tests/ligature-breaking.svg Firefox 4.0b2pre: Uses ligatures, does not support letter-spacing, broken for ligatures with x, y, dx, dy, rotate Chrome 5.0.375.86 beta, Opera 10.60, Batik 1.7: Don't use ligatures. IE9, Safari: Haven't tested. Inkscape: Uses ligatures, letter-spacing does not break ligatures (bug), breaks ligatures with x, y, dx, dy, rotate attributes Discussion: Uses: It appears to me that there are two different use cases for text (this echos the SVG font issue): High quality typesetting and artistic layout. Which of these two is the main goal can determine the desired behavior with regards to ligature. * High quality type setting: In this case, ligatures are usually desirable. In addition it may be desirable to finely control character positioning. This view supports not changing section 10.5 which allows ligatures and the characters that follow ligatures to be placed precisely. It requires, though, that the specified font is available. (Erik notes that in some cases ligatures have Unicode code points that can be explicitly specified.) * Artistic layout: In this case, ligatures may not be desirable. Consider the word "Office". If used in a signboard with large inter-character spacing, you would expect it to be rendered something like this: O f f i c e If you used a ligature, it would be rendered something like this: O ffi c e If the designer has specified 'x' or 'y' (or 'rotate') values, then a ligature is probably not what they intended. Clearly you would not want the layout to vary depending on whether or not a font includes ligatures (e.g. if a fallback font is used with ligatures, when the primary font does not). Latin alphabet perspective: In Latin alphabets, ligatures are mostly a style issue, used to improve the look or readability of text. Their use is never(?) required. (There may be exceptions such as the German ß or Dutch ij but these have separate Unicode points which are likely to be explicitly used.) CSS2 dictates ligatures should not be used if the spacing between the two characters is not the default spacing (e.g line-spacing != 0 or kerning != auto). Non-Latin alphabet perspective: An expert should be consulted to determine if ligature use is mandatory in some cases. Recall that 10.7.1 blocks ligature usage in some cases. Arabic and Hindi scripts may require ligatures, but at the same time they probably don't allow characters to be moved arbitrarily around. Suggested solution: For the short term: Choose the "Artistic layout" perspective. This seems the closest to the spirit of SVG. Change the third and fourth bullet points in 10.5 to: * When multiple XML characters map to a single glyph (e.g., when a ligature is used) - Suppose that the i-th and (i+1)-th XML characters map to a single glyph. In this case, the i-th value for the ‘x’, ‘y’, ‘dx’, ‘dy’ and ‘rotate’ attributes all apply when rendering the glyph. The (i+1)-th values ‘dx’ and ‘dy’ are applied to the subsequent XML character (i.e., the (i+2)-th character), if one exists, by translating the current text position by the given amounts before rendering the first glyph associated with that character. Note that the (i+2)-th character may have its own corresponding 'dx' and 'dy' values that must be included. Further note that 10.7.1 may prevent ligature formation. * When there is a many-to-many mapping of characters to glyphs (e.g., when three characters map to two glyphs, such as when the first glyph expresses the first character and half of the second character, and the second glyph expresses the other half of the second character plus the third character) - Suppose that the i-th, (i+1)-th and (i+2)-th XML characters map to two glyphs. In this case, the i-th value for the ‘x’, ‘y’, ‘dx’ and ‘dy’ values are applied (i.e., the current text position is adjusted) before rendering the first glyph. The rotation transformation corresponding to the i-th ‘rotate’ value is applied to both the two glyphs and the glyph advance values for the first glyph on a group basis (i.e., the rotation value creates a temporary new rotated coordinate system, and the two glyphs are rendered into the temporary rotated coordinate system). The (i+1)-th and (i+2)-th values for the ‘dx’ and ‘dy’ attributes are applied to the subsequent XML character (i.e., the (i+3)-th character), if one exists, by translating the current text position by the given amounts before rendering the first glyph associated with that character. Add a bullet point to 10.7.1: * Ligature formation should not be used when the second or later character that could form part of a ligature has a 'rotation' value different from that of the first character. (Comment: I would think that dx and dy should also break ligatures.) For the long term (SVG2): Add a use-ligature (always, never) attribute which would determine between 10.5 and 10.7.1 behavior. Erik points out that there is the text-rendering attribute that might be useful.
Received on Tuesday, 6 July 2010 14:53:21 UTC