| 267 | return iter( self[i] for i in xrange(len(self)) ) |
| 268 | |
| 269 | def __init__(self, name, fp): |
| 270 | self.name = name |
| 271 | self.fp = fp |
| 272 | # Header |
| 273 | (_major,_minor,hdrsize,offsize) = struct.unpack('BBBB', self.fp.read(4)) |
| 274 | self.fp.read(hdrsize-4) |
| 275 | # Name INDEX |
| 276 | self.name_index = self.INDEX(self.fp) |
| 277 | # Top DICT INDEX |
| 278 | self.dict_index = self.INDEX(self.fp) |
| 279 | # String INDEX |
| 280 | self.string_index = self.INDEX(self.fp) |
| 281 | # Global Subr INDEX |
| 282 | self.subr_index = self.INDEX(self.fp) |
| 283 | # Top DICT DATA |
| 284 | self.top_dict = getdict(self.dict_index[0]) |
| 285 | (charset_pos,) = self.top_dict.get(15, [0]) |
| 286 | (encoding_pos,) = self.top_dict.get(16, [0]) |
| 287 | (charstring_pos,) = self.top_dict.get(17, [0]) |
| 288 | # CharStrings |
| 289 | self.fp.seek(charstring_pos) |
| 290 | self.charstring = self.INDEX(self.fp) |
| 291 | self.nglyphs = len(self.charstring) |
| 292 | # Encodings |
| 293 | self.code2gid = {} |
| 294 | self.gid2code = {} |
| 295 | self.fp.seek(encoding_pos) |
| 296 | format = self.fp.read(1) |
| 297 | if format == '\x00': |
| 298 | # Format 0 |
| 299 | (n,) = struct.unpack('B', self.fp.read(1)) |
| 300 | for (code,gid) in enumerate(struct.unpack('B'*n, self.fp.read(n))): |
| 301 | self.code2gid[code] = gid |
| 302 | self.gid2code[gid] = code |
| 303 | elif format == '\x01': |
| 304 | # Format 1 |
| 305 | (n,) = struct.unpack('B', self.fp.read(1)) |
| 306 | code = 0 |
| 307 | for i in xrange(n): |
| 308 | (first,nleft) = struct.unpack('BB', self.fp.read(2)) |
| 309 | for gid in xrange(first,first+nleft+1): |
| 310 | self.code2gid[code] = gid |
| 311 | self.gid2code[gid] = code |
| 312 | code += 1 |
| 313 | else: |
| 314 | raise ValueError('unsupported encoding format: %r' % format) |
| 315 | # Charsets |
| 316 | self.name2gid = {} |
| 317 | self.gid2name = {} |
| 318 | self.fp.seek(charset_pos) |
| 319 | format = self.fp.read(1) |
| 320 | if format == '\x00': |
| 321 | # Format 0 |
| 322 | n = self.nglyphs-1 |
| 323 | for (gid,sid) in enumerate(struct.unpack('>'+'H'*n, self.fp.read(2*n))): |
| 324 | gid += 1 |
| 325 | name = self.getstr(sid) |
| 326 | self.name2gid[name] = gid |