From dbc2c173b35360386c907a3c70cb931ae4c3fac9 Mon Sep 17 00:00:00 2001 From: jvr Date: Mon, 13 May 2002 16:19:51 +0000 Subject: [PATCH] moved some stuff to cffLib git-svn-id: svn://svn.code.sf.net/p/fonttools/code/trunk@225 4cde692c-a291-49d1-8350-778aa11640f8 --- Lib/fontTools/cffLib.py | 123 ++++++++++++++++++++++++++-- Lib/fontTools/misc/psCharStrings.py | 113 +------------------------ 2 files changed, 118 insertions(+), 118 deletions(-) diff --git a/Lib/fontTools/cffLib.py b/Lib/fontTools/cffLib.py index 0a37de5d8..17201ab65 100644 --- a/Lib/fontTools/cffLib.py +++ b/Lib/fontTools/cffLib.py @@ -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()) diff --git a/Lib/fontTools/misc/psCharStrings.py b/Lib/fontTools/misc/psCharStrings.py index a65013901..717988844 100644 --- a/Lib/fontTools/misc/psCharStrings.py +++ b/Lib/fontTools/misc/psCharStrings.py @@ -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: