@@ -1700,12 +1700,19 @@ var Font = (function Font() {
1700
1700
tables .push (cmap );
1701
1701
}
1702
1702
1703
+ var cidToGidMap = properties .cidToGidMap || [];
1704
+ var gidToCidMap = [0 ];
1705
+ for (var j = cidToGidMap .length - 1 ; j >= 0 ; j --) {
1706
+ var gid = cidToGidMap [j ];
1707
+ if (gid )
1708
+ gidToCidMap [gid ] = j ;
1709
+ }
1710
+
1703
1711
var glyphs = [], ids = [];
1704
1712
var usedUnicodes = [];
1705
- var cidToGidMap = properties .cidToGidMap ;
1706
1713
var unassignedUnicodeItems = [];
1707
1714
for (var i = 1 ; i < numGlyphs ; i ++) {
1708
- var cid = cidToGidMap ? cidToGidMap . indexOf ( i ) : i ;
1715
+ var cid = gidToCidMap [ i ] || i ;
1709
1716
var unicode = this .toUnicode [cid ];
1710
1717
if (!unicode || isSpecialUnicode (unicode ) ||
1711
1718
unicode in usedUnicodes ) {
@@ -1716,21 +1723,21 @@ var Font = (function Font() {
1716
1723
glyphs .push ({ unicode : unicode , code : cid });
1717
1724
ids .push (i );
1718
1725
}
1719
- // checking if unassigned symbols will fit the user defined symbols
1720
- // if those symbols too many, probably they will not be used anyway
1721
- if ( unassignedUnicodeItems . length <= kSizeOfGlyphArea ) {
1722
- var unusedUnicode = kCmapGlyphOffset ;
1723
- for ( var j = 0 , jj = unassignedUnicodeItems . length ; j < jj ; j ++) {
1724
- var i = unassignedUnicodeItems [ j ] ;
1725
- var cid = cidToGidMap ? cidToGidMap . indexOf ( i ) : i ;
1726
- while ( unusedUnicode in usedUnicodes )
1727
- unusedUnicode ++;
1728
- var unicode = unusedUnicode ++ ;
1729
- this . toUnicode [ cid ] = unicode ;
1730
- usedUnicodes [ unicode ] = true ;
1731
- glyphs . push ({ unicode : unicode , code : cid }) ;
1732
- ids .push (i );
1733
- }
1726
+ // trying to fit as many unassigned symbols as we can
1727
+ // in the range allocated for the user defined symbols
1728
+ var unusedUnicode = kCmapGlyphOffset ;
1729
+ for ( var j = 0 , jj = unassignedUnicodeItems . length ; j < jj ; j ++) {
1730
+ var i = unassignedUnicodeItems [ j ];
1731
+ var cid = gidToCidMap [ i ] || i ;
1732
+ while ( unusedUnicode in usedUnicodes )
1733
+ unusedUnicode ++;
1734
+ if ( unusedUnicode >= kCmapGlyphOffset + kSizeOfGlyphArea )
1735
+ break ;
1736
+ var unicode = unusedUnicode ++ ;
1737
+ this . toUnicode [ cid ] = unicode ;
1738
+ usedUnicodes [ unicode ] = true ;
1739
+ glyphs .push ({ unicode : unicode , code : cid } );
1740
+ ids . push ( i );
1734
1741
}
1735
1742
cmap .data = createCMapTable (glyphs , ids );
1736
1743
} else {
0 commit comments