def readLWFN(path, onlyHeader=0): """reads an LWFN font file, returns raw data""" resRef = Res.FSOpenResFile(path, 1) # read-only try: Res.UseResFile(resRef) n = Res.Count1Resources('POST') data = [] for i in range(501, 501 + n): res = Res.Get1Resource('POST', i) code = ord(res.data[0]) if ord(res.data[1]) <> 0: raise T1Error, 'corrupt LWFN file' if code in [1, 2]: if onlyHeader and code == 2: break data.append(res.data[2:]) elif code in [3, 5]: break elif code == 4: f = open(path, "rb") data.append(f.read()) f.close() elif code == 0: pass # comment, ignore else: raise T1Error, 'bad chunk code: ' + ` code ` finally: Res.CloseResFile(resRef) data = string.join(data, '') assertType1(data) return data
def __init__(self, path, ttFont, res_id=None): self.file = StringIO() self.name = path self.closed = 0 fullname = ttFont['name'].getName( 4, 1, 0) # Full name, mac, default encoding familyname = ttFont['name'].getName( 1, 1, 0) # Fam. name, mac, default encoding psname = ttFont['name'].getName(6, 1, 0) # PostScript name, etc. if fullname is None or fullname is None or psname is None: from fontTools import ttLib raise ttLib.TTLibError( "can't make 'sfnt' resource, no Macintosh 'name' table found") self.fullname = fullname.string self.familyname = familyname.string self.psname = psname.string if self.familyname != self.psname[:len(self.familyname)]: # ugh. force fam name to be the same as first part of ps name, # fondLib otherwise barfs. for i in range(min(len(self.psname), len(self.familyname))): if self.familyname[i] != self.psname[i]: break self.familyname = self.psname[:i] self.ttFont = ttFont self.res_id = res_id if os.path.exists(self.name): os.remove(self.name) # XXX datafork support Res.FSpCreateResFile(self.name, 'DMOV', 'FFIL', 0) self.resref = Res.FSOpenResFile(self.name, 3) # exclusive read/write permission
def MyOpenResFile(path): mode = 1 # read only try: resref = Res.FSOpenResFile(path, mode) except Res.Error: # try data fork resref = Res.FSOpenResourceFile(path, unicode(), mode) return resref
def __init__(self, path, mode='r'): if mode == 'r': permission = 1 # read only elif mode == 'w': permission = 3 # exclusive r/w else: raise error, 'mode should be either "r" or "w"' self.mode = mode self.resref = Res.FSOpenResFile(path, permission) Res.UseResFile(self.resref) self.path = path self.fonds = [] self.getFONDs()
def dataFromFile(pathOrFSSpec, nameOrID="", resType='NFNT'): from Carbon import Res resref = Res.FSOpenResFile(pathOrFSSpec, 1) # readonly try: Res.UseResFile(resref) if not nameOrID: # just take the first in the file res = Res.Get1IndResource(resType, 1) elif type(nameOrID) == types.IntType: res = Res.Get1Resource(resType, nameOrID) else: res = Res.Get1NamedResource(resType, nameOrID) theID, theType, name = res.GetResInfo() data = res.data finally: Res.CloseResFile(resref) return data
def writeLWFN(path, data): Res.FSpCreateResFile(path, "just", "LWFN", 0) resRef = Res.FSOpenResFile(path, 2) # write-only try: Res.UseResFile(resRef) resID = 501 chunks = findEncryptedChunks(data) for isEncrypted, chunk in chunks: if isEncrypted: code = 2 else: code = 1 while chunk: res = Res.Resource( chr(code) + '\0' + chunk[:LWFNCHUNKSIZE - 2]) res.AddResource('POST', resID, '') chunk = chunk[LWFNCHUNKSIZE - 2:] resID = resID + 1 res = Res.Resource(chr(5) + '\0') res.AddResource('POST', resID, '') finally: Res.CloseResFile(resRef)