@@ -1471,8 +1471,7 @@ def __init__(self, name: str, fp: BinaryIO) -> None:
14711471 self .subr_index = self .INDEX (self .fp )
14721472 # Top DICT DATA
14731473 self .top_dict = self .getdict (self .dict_index [0 ])
1474- if (12 , 30 ) in self .top_dict :
1475- raise NotImplementedError ("CFF CIDFont not implemented" )
1474+ self .is_cidfont = (12 , 30 ) in self .top_dict
14761475 (charset_pos ,) = self .top_dict .get (15 , [0 ])
14771476 (encoding_pos ,) = self .top_dict .get (16 , [0 ])
14781477 (charstring_pos ,) = self .top_dict .get (17 , [0 ])
@@ -1481,17 +1480,24 @@ def __init__(self, name: str, fp: BinaryIO) -> None:
14811480 self .charstring = self .INDEX (self .fp )
14821481 self .nglyphs = len (self .charstring )
14831482 self ._parse_charset (int (charset_pos ))
1484- self ._parse_encoding (int (encoding_pos ))
1483+ if not self .is_cidfont :
1484+ self .name2gid = {self .getstr (sid ): gid for gid , sid in self .gid2sid .items ()}
1485+ self ._parse_encoding (int (encoding_pos ))
1486+ self .code2name = {
1487+ code : self .getstr (self .gid2sid [gid ])
1488+ for code , gid in self .code2gid .items ()
1489+ if gid in self .gid2sid
1490+ }
1491+ else :
1492+ self .cid2gid = {sid : gid for gid , sid in self .gid2sid .items ()}
14851493
14861494 def _parse_encoding (self , encoding_pos : int ) -> None :
14871495 # Encodings
14881496 self .code2gid = {}
1489- self .gid2code = {}
14901497 if encoding_pos in (0 , 1 ):
14911498 for code , sid in enumerate (self .PREDEFINED_ENCODINGS [encoding_pos ]):
14921499 if gid := self .name2gid .get (self .getstr (sid )):
14931500 self .code2gid [code ] = gid
1494- self .gid2code [gid ] = code
14951501 return
14961502 self .fp .seek (encoding_pos )
14971503 (format ,) = self .fp .read (1 )
@@ -1504,7 +1510,6 @@ def _parse_encoding(self, encoding_pos: int) -> None:
15041510 struct .unpack ("B" * n , self .fp .read (n )), start = 1
15051511 ):
15061512 self .code2gid [code ] = gid
1507- self .gid2code [gid ] = code
15081513 elif format == 1 :
15091514 # Format 1
15101515 (n ,) = struct .unpack ("B" , self .fp .read (1 ))
@@ -1513,7 +1518,6 @@ def _parse_encoding(self, encoding_pos: int) -> None:
15131518 (first , nleft ) = struct .unpack ("BB" , self .fp .read (2 ))
15141519 for code in range (first , first + nleft + 1 ):
15151520 self .code2gid [code ] = gid
1516- self .gid2code [gid ] = code
15171521 gid += 1
15181522 else :
15191523 raise ValueError ("unsupported encoding format: %r" % format )
@@ -1526,13 +1530,12 @@ def _parse_encoding(self, encoding_pos: int) -> None:
15261530
15271531 def _parse_charset (self , charset_pos : int ) -> None :
15281532 # Charsets
1529- self .name2gid = {}
1530- self .gid2name = {}
1533+ self .gid2sid = {}
15311534 if charset_pos in (0 , 1 , 2 ):
1535+ if self .is_cidfont :
1536+ raise ValueError ("no predefined charsets for CID CFF fonts" )
15321537 for gid , sid in enumerate (self .PREDEFINED_CHARSETS [charset_pos ], start = 1 ):
1533- sidname = self .getstr (sid )
1534- self .name2gid [sidname ] = gid
1535- self .gid2name [gid ] = sidname
1538+ self .gid2sid [gid ] = sid
15361539 return
15371540 self .fp .seek (charset_pos )
15381541 (format ,) = self .fp .read (1 )
@@ -1543,9 +1546,7 @@ def _parse_charset(self, charset_pos: int) -> None:
15431546 for gid , sid in enumerate (
15441547 struct .unpack (">" + "H" * n , self .fp .read (2 * n )), start = 1
15451548 ):
1546- sidname = self .getstr (sid )
1547- self .name2gid [sidname ] = gid
1548- self .gid2name [gid ] = sidname
1549+ self .gid2sid [gid ] = sid
15491550 elif format in (1 , 2 ):
15501551 # Format 1 & 2
15511552 range_f = ">HB" if format == 1 else ">HH"
@@ -1554,9 +1555,7 @@ def _parse_charset(self, charset_pos: int) -> None:
15541555 while gid < self .nglyphs :
15551556 (first , nleft ) = struct .unpack (range_f , self .fp .read (range_f_size ))
15561557 for sid in range (first , first + nleft + 1 ):
1557- sidname = self .getstr (sid )
1558- self .name2gid [sidname ] = gid
1559- self .gid2name [gid ] = sidname
1558+ self .gid2sid [gid ] = sid
15601559 gid += 1
15611560 else :
15621561 raise ValueError ("unsupported charset format: %r" % format )
0 commit comments