moved some stuff to cffLib
git-svn-id: svn://svn.code.sf.net/p/fonttools/code/trunk@225 4cde692c-a291-49d1-8350-778aa11640f8
This commit is contained in:
parent
0b63b28615
commit
dbc2c173b3
@ -1,7 +1,7 @@
|
||||
"""cffLib.py -- read/write tools for Adobe CFF fonts."""
|
||||
|
||||
#
|
||||
# $Id: cffLib.py,v 1.7 2002-05-13 11:24:43 jvr Exp $
|
||||
# $Id: cffLib.py,v 1.8 2002-05-13 16:19:37 jvr Exp $
|
||||
#
|
||||
|
||||
import struct, sstruct
|
||||
@ -10,6 +10,115 @@ import types
|
||||
from fontTools.misc import psCharStrings
|
||||
|
||||
|
||||
topDictOperators = [
|
||||
# opcode name argument type
|
||||
(0, 'version', 'SID'),
|
||||
(1, 'Notice', 'SID'),
|
||||
(2, 'FullName', 'SID'),
|
||||
(3, 'FamilyName', 'SID'),
|
||||
(4, 'Weight', 'SID'),
|
||||
(5, 'FontBBox', 'array'),
|
||||
(13, 'UniqueID', 'number'),
|
||||
(14, 'XUID', 'array'),
|
||||
(15, 'charset', 'number'),
|
||||
(16, 'Encoding', 'number'),
|
||||
(17, 'CharStrings', 'number'),
|
||||
(18, 'Private', ('number', 'number')),
|
||||
((12, 0), 'Copyright', 'SID'),
|
||||
((12, 1), 'isFixedPitch', 'number'),
|
||||
((12, 2), 'ItalicAngle', 'number'),
|
||||
((12, 3), 'UnderlinePosition', 'number'),
|
||||
((12, 4), 'UnderlineThickness', 'number'),
|
||||
((12, 5), 'PaintType', 'number'),
|
||||
((12, 6), 'CharstringType', 'number'),
|
||||
((12, 7), 'FontMatrix', 'array'),
|
||||
((12, 8), 'StrokeWidth', 'number'),
|
||||
((12, 20), 'SyntheticBase', 'number'),
|
||||
((12, 21), 'PostScript', 'SID'),
|
||||
((12, 22), 'BaseFontName', 'SID'),
|
||||
# CID additions
|
||||
((12, 30), 'ROS', ('SID', 'SID', 'number')),
|
||||
((12, 31), 'CIDFontVersion', 'number'),
|
||||
((12, 32), 'CIDFontRevision', 'number'),
|
||||
((12, 33), 'CIDFontType', 'number'),
|
||||
((12, 34), 'CIDCount', 'number'),
|
||||
((12, 35), 'UIDBase', 'number'),
|
||||
((12, 36), 'FDArray', 'number'),
|
||||
((12, 37), 'FDSelect', 'number'),
|
||||
((12, 38), 'FontName', 'SID'),
|
||||
# MM, Chameleon. Pft.
|
||||
]
|
||||
|
||||
topDictDefaults = {
|
||||
'isFixedPitch': 0,
|
||||
'ItalicAngle': 0,
|
||||
'UnderlineThickness': 50,
|
||||
'PaintType': 0,
|
||||
'CharstringType': 2,
|
||||
'FontMatrix': [0.001, 0, 0, 0.001, 0, 0],
|
||||
'FontBBox': [0, 0, 0, 0],
|
||||
'StrokeWidth': 0,
|
||||
'charset': 0,
|
||||
'Encoding': 0,
|
||||
# CID defaults
|
||||
'CIDFontVersion': 0,
|
||||
'CIDFontRevision': 0,
|
||||
'CIDFontType': 0,
|
||||
'CIDCount': 8720,
|
||||
}
|
||||
|
||||
class TopDictDecompiler(psCharStrings.DictDecompiler):
|
||||
|
||||
operators = psCharStrings.buildOperatorDict(topDictOperators)
|
||||
dictDefaults = topDictDefaults
|
||||
|
||||
|
||||
privateDictOperators = [
|
||||
# opcode name argument type
|
||||
(6, 'BlueValues', 'array'),
|
||||
(7, 'OtherBlues', 'array'),
|
||||
(8, 'FamilyBlues', 'array'),
|
||||
(9, 'FamilyOtherBlues', 'array'),
|
||||
(10, 'StdHW', 'number'),
|
||||
(11, 'StdVW', 'number'),
|
||||
(19, 'Subrs', 'number'),
|
||||
(20, 'defaultWidthX', 'number'),
|
||||
(21, 'nominalWidthX', 'number'),
|
||||
((12, 9), 'BlueScale', 'number'),
|
||||
((12, 10), 'BlueShift', 'number'),
|
||||
((12, 11), 'BlueFuzz', 'number'),
|
||||
((12, 12), 'StemSnapH', 'array'),
|
||||
((12, 13), 'StemSnapV', 'array'),
|
||||
((12, 14), 'ForceBold', 'number'),
|
||||
((12, 15), 'ForceBoldThreshold', 'number'),
|
||||
((12, 16), 'lenIV', 'number'),
|
||||
((12, 17), 'LanguageGroup', 'number'),
|
||||
((12, 18), 'ExpansionFactor', 'number'),
|
||||
((12, 19), 'initialRandomSeed', 'number'),
|
||||
]
|
||||
|
||||
privateDictDefaults = {
|
||||
'defaultWidthX': 0,
|
||||
'nominalWidthX': 0,
|
||||
'BlueScale': 0.039625,
|
||||
'BlueShift': 7,
|
||||
'BlueFuzz': 1,
|
||||
'ForceBold': 0,
|
||||
'ForceBoldThreshold': 0,
|
||||
'lenIV': -1,
|
||||
'LanguageGroup': 0,
|
||||
'ExpansionFactor': 0.06,
|
||||
'initialRandomSeed': 0,
|
||||
}
|
||||
|
||||
class PrivateDictDecompiler(psCharStrings.DictDecompiler):
|
||||
|
||||
operators = psCharStrings.buildOperatorDict(privateDictOperators)
|
||||
dictDefaults = privateDictDefaults
|
||||
|
||||
|
||||
|
||||
|
||||
cffHeaderFormat = """
|
||||
major: B
|
||||
minor: B
|
||||
@ -31,14 +140,12 @@ class CFFFontSet:
|
||||
topDicts = readINDEX(file)
|
||||
strings = IndexedStrings(readINDEX(file))
|
||||
globalSubrs = readINDEX(file)
|
||||
|
||||
self.GlobalSubrs = map(psCharStrings.T2CharString, globalSubrs)
|
||||
|
||||
file.seek(0, 0)
|
||||
|
||||
for i in range(len(topDicts)):
|
||||
font = self.fonts[self.fontNames[i]] = CFFFont()
|
||||
font.GlobalSubrs = self.GlobalSubrs # Hmm.
|
||||
file.seek(0, 0)
|
||||
font.decompile(file, topDicts[i], strings, self) # maybe only 'on demand'?
|
||||
|
||||
def compile(self):
|
||||
@ -110,7 +217,7 @@ class IndexedStrings:
|
||||
|
||||
class CFFFont:
|
||||
|
||||
defaults = psCharStrings.topDictDefaults
|
||||
defaults = topDictDefaults
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
@ -135,7 +242,7 @@ class CFFFont:
|
||||
raise NotImplementedError
|
||||
|
||||
def decompile(self, file, topDictData, strings, fontSet):
|
||||
top = psCharStrings.TopDictDecompiler(strings)
|
||||
top = TopDictDecompiler(strings)
|
||||
top.decompile(topDictData)
|
||||
self.fromDict(top.getDict())
|
||||
|
||||
@ -290,13 +397,13 @@ class CFFFont:
|
||||
|
||||
class PrivateDict:
|
||||
|
||||
defaults = psCharStrings.privateDictDefaults
|
||||
defaults = privateDictDefaults
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def decompile(self, data, privateData, strings):
|
||||
p = psCharStrings.PrivateDictDecompiler(strings)
|
||||
p = PrivateDictDecompiler(strings)
|
||||
p.decompile(privateData)
|
||||
self.fromDict(p.getDict())
|
||||
|
||||
|
@ -71,7 +71,7 @@ class ByteCodeDecompilerBase:
|
||||
return string.atof(number), index
|
||||
|
||||
|
||||
def _buildOperatorDict(operatorList):
|
||||
def buildOperatorDict(operatorList):
|
||||
dict = {}
|
||||
for item in operatorList:
|
||||
if len(item) == 2:
|
||||
@ -139,7 +139,7 @@ t2Operators = [
|
||||
class T2CharString(ByteCodeDecompilerBase):
|
||||
|
||||
operandEncoding = t2OperandEncoding
|
||||
operators = _buildOperatorDict(t2Operators)
|
||||
operators = buildOperatorDict(t2Operators)
|
||||
|
||||
def __init__(self, bytecode=None, program=None):
|
||||
if program is None:
|
||||
@ -259,7 +259,7 @@ t1Operators = [
|
||||
class T1CharString(T2CharString):
|
||||
|
||||
operandEncoding = t1OperandEncoding
|
||||
operators = _buildOperatorDict(t1Operators)
|
||||
operators = buildOperatorDict(t1Operators)
|
||||
|
||||
def decompile(self):
|
||||
if self.program is not None:
|
||||
@ -860,113 +860,6 @@ class DictDecompiler(ByteCodeDecompilerBase):
|
||||
return self.popall()
|
||||
|
||||
|
||||
topDictOperators = [
|
||||
# opcode name argument type
|
||||
(0, 'version', 'SID'),
|
||||
(1, 'Notice', 'SID'),
|
||||
(2, 'FullName', 'SID'),
|
||||
(3, 'FamilyName', 'SID'),
|
||||
(4, 'Weight', 'SID'),
|
||||
(5, 'FontBBox', 'array'),
|
||||
(13, 'UniqueID', 'number'),
|
||||
(14, 'XUID', 'array'),
|
||||
(15, 'charset', 'number'),
|
||||
(16, 'Encoding', 'number'),
|
||||
(17, 'CharStrings', 'number'),
|
||||
(18, 'Private', ('number', 'number')),
|
||||
((12, 0), 'Copyright', 'SID'),
|
||||
((12, 1), 'isFixedPitch', 'number'),
|
||||
((12, 2), 'ItalicAngle', 'number'),
|
||||
((12, 3), 'UnderlinePosition', 'number'),
|
||||
((12, 4), 'UnderlineThickness', 'number'),
|
||||
((12, 5), 'PaintType', 'number'),
|
||||
((12, 6), 'CharstringType', 'number'),
|
||||
((12, 7), 'FontMatrix', 'array'),
|
||||
((12, 8), 'StrokeWidth', 'number'),
|
||||
((12, 20), 'SyntheticBase', 'number'),
|
||||
((12, 21), 'PostScript', 'SID'),
|
||||
((12, 22), 'BaseFontName', 'SID'),
|
||||
# CID additions
|
||||
((12, 30), 'ROS', ('SID', 'SID', 'number')),
|
||||
((12, 31), 'CIDFontVersion', 'number'),
|
||||
((12, 32), 'CIDFontRevision', 'number'),
|
||||
((12, 33), 'CIDFontType', 'number'),
|
||||
((12, 34), 'CIDCount', 'number'),
|
||||
((12, 35), 'UIDBase', 'number'),
|
||||
((12, 36), 'FDArray', 'number'),
|
||||
((12, 37), 'FDSelect', 'number'),
|
||||
((12, 38), 'FontName', 'SID'),
|
||||
# MM, Chameleon. Pft.
|
||||
]
|
||||
|
||||
topDictDefaults = {
|
||||
'isFixedPitch': 0,
|
||||
'ItalicAngle': 0,
|
||||
'UnderlineThickness': 50,
|
||||
'PaintType': 0,
|
||||
'CharstringType': 2,
|
||||
'FontMatrix': [0.001, 0, 0, 0.001, 0, 0],
|
||||
'FontBBox': [0, 0, 0, 0],
|
||||
'StrokeWidth': 0,
|
||||
'charset': 0,
|
||||
'Encoding': 0,
|
||||
# CID defaults
|
||||
'CIDFontVersion': 0,
|
||||
'CIDFontRevision': 0,
|
||||
'CIDFontType': 0,
|
||||
'CIDCount': 8720,
|
||||
}
|
||||
|
||||
class TopDictDecompiler(DictDecompiler):
|
||||
|
||||
operators = _buildOperatorDict(topDictOperators)
|
||||
dictDefaults = topDictDefaults
|
||||
|
||||
|
||||
privateDictOperators = [
|
||||
# opcode name argument type
|
||||
(6, 'BlueValues', 'array'),
|
||||
(7, 'OtherBlues', 'array'),
|
||||
(8, 'FamilyBlues', 'array'),
|
||||
(9, 'FamilyOtherBlues', 'array'),
|
||||
(10, 'StdHW', 'number'),
|
||||
(11, 'StdVW', 'number'),
|
||||
(19, 'Subrs', 'number'),
|
||||
(20, 'defaultWidthX', 'number'),
|
||||
(21, 'nominalWidthX', 'number'),
|
||||
((12, 9), 'BlueScale', 'number'),
|
||||
((12, 10), 'BlueShift', 'number'),
|
||||
((12, 11), 'BlueFuzz', 'number'),
|
||||
((12, 12), 'StemSnapH', 'array'),
|
||||
((12, 13), 'StemSnapV', 'array'),
|
||||
((12, 14), 'ForceBold', 'number'),
|
||||
((12, 15), 'ForceBoldThreshold', 'number'),
|
||||
((12, 16), 'lenIV', 'number'),
|
||||
((12, 17), 'LanguageGroup', 'number'),
|
||||
((12, 18), 'ExpansionFactor', 'number'),
|
||||
((12, 19), 'initialRandomSeed', 'number'),
|
||||
]
|
||||
|
||||
privateDictDefaults = {
|
||||
'defaultWidthX': 0,
|
||||
'nominalWidthX': 0,
|
||||
'BlueScale': 0.039625,
|
||||
'BlueShift': 7,
|
||||
'BlueFuzz': 1,
|
||||
'ForceBold': 0,
|
||||
'ForceBoldThreshold': 0,
|
||||
'lenIV': -1,
|
||||
'LanguageGroup': 0,
|
||||
'ExpansionFactor': 0.06,
|
||||
'initialRandomSeed': 0,
|
||||
}
|
||||
|
||||
class PrivateDictDecompiler(DictDecompiler):
|
||||
|
||||
operators = _buildOperatorDict(privateDictOperators)
|
||||
dictDefaults = privateDictDefaults
|
||||
|
||||
|
||||
def calcSubrBias(subrs):
|
||||
nSubrs = len(subrs)
|
||||
if nSubrs < 1240:
|
||||
|
Loading…
x
Reference in New Issue
Block a user