Fri 06 Mar 2009 07:05:44 PM UTC, original submission:
Attached two files:
- Simple PDF file containing a subsetted TrueType font Helvetica57-Condensed showing the line "qualita" whom the last "a" is in fact "agrave".
- The extracted subsetted TrueType font Helvetica57-Condensed as embedded in above mentioned PDF file.
When processing the TrueType font with FreeType I notice that its cmap 4 gets rejected "tt_face_build_cmaps: broken cmap sub-table ignored!" (triggered by a test in tt_cmap4_validate) and that the "agrave" character can't be accessed by FT. When I overrule the rejection, "agrave" is accessible and the line "qualita" (with "agrave" at the end) gets rendered ok.
Looking more closely at the cmap 4 data itself:
--8<--
Subtable 2. Platform ID: 3
Specific ID: 1
'cmap' Offset: 0x0000011A
->Format: 4 : Segment mapping to delta values
Length: 412
Version: 0
segCount: 19 (X2 = 38)
searchRange: 32
entrySelector: 4
rangeShift: 6
Seg 1 : St = 0020, En = 007E, D = -31, RO = 0, gId# = N/A
Seg 2 : St = 00A0, En = 00FF, D = 0, RO = 36, gId# = 0
Seg 3 : St = 0152, En = 0153, D = 0, RO = 226, gId# = 96
Seg 4 : St = 0160, En = 0161, D = 0, RO = 228, gId# = 98
Seg 5 : St = 0178, En = 0178, D = 0, RO = 230, gId# = 100
Seg 6 : St = 0192, En = 0192, D = 0, RO = 230, gId# = 101
Seg 7 : St = 02C6, En = 02C6, D = 0, RO = 230, gId# = 102
Seg 8 : St = 02DC, En = 02DC, D = 0, RO = 230, gId# = 103
Seg 9 : St = 2013, En = 2014, D = 0, RO = 230, gId# = 104
Seg 10 : St = 2018, En = 201A, D = 0, RO = 232, gId# = 106
Seg 11 : St = 201C, En = 201E, D = 0, RO = 236, gId# = 109
Seg 12 : St = 2020, En = 2022, D = 0, RO = 240, gId# = 112
Seg 13 : St = 2026, En = 2026, D = 0, RO = 244, gId# = 115
Seg 14 : St = 2030, En = 2030, D = 0, RO = 244, gId# = 116
Seg 15 : St = 2039, En = 203A, D = 0, RO = 244, gId# = 117
Seg 16 : St = 2122, En = 2122, D = 0, RO = 246, gId# = 119
Seg 17 : St = 2212, En = 2212, D = 0, RO = 246, gId# = 120
Seg 18 : St = 2219, En = 2219, D = 0, RO = 246, gId# = 121
Seg 19 : St = FFFF, En = FFFF, D = 12590, RO = 28773, gId# = 14385
--8<--
The rejection is because D is not 1 for the 19th segement with Start = 0xFFFF and End = 0xFFFF but a bogus 12590 value. So I'm wondering if this check is not too strong and we should ignore D value and always map char 0xFFFF to glyph 0 ?
|