[css3-writing-modes] inconsistent handling of 'Tr' codepoints in 'text-orientation'

The UTR50 spec defines a Vertical Orientation property [1] for codepoints
in Unicode.  Codepoints marked 'U' are upright by default and those
marked 'R' are rotated by default.  Those marked 'Tu' or 'Tr' require
some form of alternate in the vertical case.

In the definition of the 'text-orientation' property, the CSS3 Writing
Modes spec defines this handling for characters with a vertical
orientation property of 'Tr'.

http://dev.w3.org/csswg/css-writing-modes/#vertical-orientations

# For Tr characters, which are intended to be either transformed or
# rotated sideways, the UA may assume that appropriate glyphs for
# upright typesetting are given in the font and render them upright;
# alternately it may check for such glyphs first, and fall back to
# typesetting them sideways if the appropriate glyphs are missing. 

This defines inconsistent behavior across user agents.  User agents
that just assume the font has vertical alternates for these codepoints
will render differently from user agents that use the alternate
behavior of checking the font and doing a manual rotation.

The "alternate" behavior seems implicitly better at first glance but
it's in fact a very poor tradeoff for the inconsistency it introduces.
As I said during similar discussions related to this property,
correctly checking substitutions like this is tedious work for
implementations. Nat McCully from Adobe made this same point when we
met in Kyoto two years ago.

There are only roughly 50 of these 'Tr' codepoints in Unicode, mostly
pairs of brackets and a sprinkling of ideographic punctuation
characters.  For the most part, fonts that support these characters
provide vertical alternates for them. So specifying this behavior is
not really going to be of much use to authors in practice. For the
fonts I looked at, this only simulates fallback for one or two
codepoints:

Kozuka Mincho Pr6N
3030 cid12218 vert: [] WAVY DASH
ff1b cid00640 vert: [] FULLWIDTH SEMICOLON

MS Mincho:
ff1b uniFF1B vert: [] FULLWIDTH SEMICOLON

For CSS, I think we should keep it simple - for the codepoints marked
'U', 'Tu' or 'Tr', set the glyph upright and enable vertical
alternates, without allowing tricky fallback schemes that expose
authors to inconsistencies across user agents or that require complex
fallback behavior.

Regards,

John Daggett

[1] http://www.unicode.org/Public/vertical/revision-11/VerticalOrientation-11.html

Font data for 'Tr' codepoints in two common Japanese fonts.  When a given codepoint
is supported by the font, the character map glyph id is in column 2 and the vertical
alternate glyph id is in column 4.

Kozuka Mincho Pr6N (supports Adobe Japan1-6 glyph set, publishing industry standard set):
=========================================================================================

Not supported by font:
2329 LEFT-POINTING ANGLE BRACKET
232A RIGHT-POINTING ANGLE BRACKET
301A LEFT WHITE SQUARE BRACKET
301B RIGHT WHITE SQUARE BRACKET
301E DOUBLE PRIME QUOTATION MARK
FE59 SMALL LEFT PARENTHESIS
FE5A SMALL RIGHT PARENTHESIS
FE5B SMALL LEFT CURLY BRACKET
FE5C SMALL RIGHT CURLY BRACKET
FE5D SMALL LEFT TORTOISE SHELL BRACKET
FE5E SMALL RIGHT TORTOISE SHELL BRACKET

Supported by font:
3008 cid00682 vert: [cid07907] LEFT ANGLE BRACKET
3009 cid00683 vert: [cid07908] RIGHT ANGLE BRACKET
300a cid00684 vert: [cid07909] LEFT DOUBLE ANGLE BRACKET
300b cid00685 vert: [cid07910] RIGHT DOUBLE ANGLE BRACKET
300c cid00686 vert: [cid07911] LEFT CORNER BRACKET
300d cid00687 vert: [cid07912] RIGHT CORNER BRACKET
300e cid00688 vert: [cid07913] LEFT WHITE CORNER BRACKET
300f cid00689 vert: [cid07914] RIGHT WHITE CORNER BRACKET
3010 cid00690 vert: [cid07915] LEFT BLACK LENTICULAR BRACKET
3011 cid00691 vert: [cid07916] RIGHT BLACK LENTICULAR BRACKET
3014 cid00676 vert: [cid07901] LEFT TORTOISE SHELL BRACKET
3015 cid00677 vert: [cid07902] RIGHT TORTOISE SHELL BRACKET
3016 cid16197 vert: [cid16329] LEFT WHITE LENTICULAR BRACKET
3017 cid16198 vert: [cid16330] RIGHT WHITE LENTICULAR BRACKET
3018 cid12129 vert: [cid12139] LEFT WHITE TORTOISE SHELL BRACKET
3019 cid12130 vert: [cid12140] RIGHT WHITE TORTOISE SHELL BRACKET
301c cid00665 vert: [cid07894] WAVE DASH
301d cid07608 vert: [cid07956] REVERSED DOUBLE PRIME QUOTATION MARK
301f cid07609 vert: [cid07957] LOW DOUBLE PRIME QUOTATION MARK
3030 cid12218 vert: [] WAVY DASH
30a0 cid16205 vert: [cid16331] KATAKANA-HIRAGANA DOUBLE HYPHEN
30fc cid00660 vert: [cid07891] KATAKANA-HIRAGANA PROLONGED SOUND MARK
ff08 cid00674 vert: [cid07899] FULLWIDTH LEFT PARENTHESIS
ff09 cid00675 vert: [cid07900] FULLWIDTH RIGHT PARENTHESIS
ff1a cid00639 vert: [cid12101] FULLWIDTH COLON
ff1b cid00640 vert: [] FULLWIDTH SEMICOLON
ff3b cid00678 vert: [cid07903] FULLWIDTH LEFT SQUARE BRACKET
ff3d cid00679 vert: [cid07904] FULLWIDTH RIGHT SQUARE BRACKET
ff3f cid00650 vert: [cid07890] FULLWIDTH LOW LINE
ff5b cid00680 vert: [cid07905] FULLWIDTH LEFT CURLY BRACKET
ff5c cid00667 vert: [cid07896] FULLWIDTH VERTICAL LINE
ff5d cid00681 vert: [cid07906] FULLWIDTH RIGHT CURLY BRACKET
ff5e cid00665 vert: [cid07894] FULLWIDTH TILDE
ff5f cid12131 vert: [cid12141] FULLWIDTH LEFT WHITE PARENTHESIS
ff60 cid12132 vert: [cid12142] FULLWIDTH RIGHT WHITE PARENTHESIS
ffe3 cid00649 vert: [cid07889] FULLWIDTH MACRON

MS Mincho (ancient and honorable sole Windows Japanese serif font):
===================================================================

Not supported by font:
2329 LEFT-POINTING ANGLE BRACKET
232A RIGHT-POINTING ANGLE BRACKET
FE59 SMALL LEFT PARENTHESIS
FE5A SMALL RIGHT PARENTHESIS
FE5B SMALL LEFT CURLY BRACKET
FE5C SMALL RIGHT CURLY BRACKET
FE5D SMALL LEFT TORTOISE SHELL BRACKET
FE5E SMALL RIGHT TORTOISE SHELL BRACKET

Supported by font:
3008 uni3008 vert: [glyph18639] LEFT ANGLE BRACKET
3009 uni3009 vert: [glyph18640] RIGHT ANGLE BRACKET
300a uni300A vert: [glyph18641] LEFT DOUBLE ANGLE BRACKET
300b uni300B vert: [glyph18642] RIGHT DOUBLE ANGLE BRACKET
300c uni300C vert: [glyph18643] LEFT CORNER BRACKET
300d uni300D vert: [glyph18644] RIGHT CORNER BRACKET
300e uni300E vert: [glyph18645] LEFT WHITE CORNER BRACKET
300f uni300F vert: [glyph18646] RIGHT WHITE CORNER BRACKET
3010 uni3010 vert: [glyph18647] LEFT BLACK LENTICULAR BRACKET
3011 uni3011 vert: [glyph18648] RIGHT BLACK LENTICULAR BRACKET
3014 uni3014 vert: [glyph18650] LEFT TORTOISE SHELL BRACKET
3015 uni3015 vert: [glyph18651] RIGHT TORTOISE SHELL BRACKET
3016 uni3016 vert: [glyph18652] LEFT WHITE LENTICULAR BRACKET
3017 uni3017 vert: [glyph18653] RIGHT WHITE LENTICULAR BRACKET
3018 uni3018 vert: [glyph18654] LEFT WHITE TORTOISE SHELL BRACKET
3019 uni3019 vert: [glyph18655] RIGHT WHITE TORTOISE SHELL BRACKET
301a uni301A vert: [glyph18656] LEFT WHITE SQUARE BRACKET
301b uni301B vert: [glyph18657] RIGHT WHITE SQUARE BRACKET
301c uni301C vert: [glyph18658] WAVE DASH
301d uni301D vert: [glyph18659] REVERSED DOUBLE PRIME QUOTATION MARK
301e uni301E vert: [glyph18660] DOUBLE PRIME QUOTATION MARK
301f uni301F vert: [glyph18661] LOW DOUBLE PRIME QUOTATION MARK
3030 uni3030 vert: [glyph18662] WAVY DASH
30a0 uni30A0 vert: [glyph18675] KATAKANA-HIRAGANA DOUBLE HYPHEN
30fc uni30FC vert: [glyph18688] KATAKANA-HIRAGANA PROLONGED SOUND MARK
ff08 uniFF08 vert: [glyph18809] FULLWIDTH LEFT PARENTHESIS
ff09 uniFF09 vert: [glyph18810] FULLWIDTH RIGHT PARENTHESIS
ff1a uniFF1A vert: [glyph18813] FULLWIDTH COLON
ff1b uniFF1B vert: [] FULLWIDTH SEMICOLON
ff3b uniFF3B vert: [glyph18815] FULLWIDTH LEFT SQUARE BRACKET
ff3d uniFF3D vert: [glyph18816] FULLWIDTH RIGHT SQUARE BRACKET
ff3f uniFF3F vert: [glyph18817] FULLWIDTH LOW LINE
ff5b uniFF5B vert: [glyph18818] FULLWIDTH LEFT CURLY BRACKET
ff5c uniFF5C vert: [glyph18819] FULLWIDTH VERTICAL LINE
ff5d uniFF5D vert: [glyph18820] FULLWIDTH RIGHT CURLY BRACKET
ff5e uniFF5E vert: [glyph18821] FULLWIDTH TILDE
ff5f uniFF5F vert: [glyph18822] FULLWIDTH LEFT WHITE PARENTHESIS
ff60 uniFF60 vert: [glyph18823] FULLWIDTH RIGHT WHITE PARENTHESIS
ffe3 uniFFE3 vert: [glyph18824] FULLWIDTH MACRON

Received on Friday, 20 September 2013 07:18:59 UTC