Exemple #1
0
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
Exemple #2
0
    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
Exemple #3
0
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
Exemple #4
0
 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()
Exemple #5
0
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
Exemple #6
0
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)