tweaking, added some debug info


git-svn-id: svn://svn.code.sf.net/p/fonttools/code/trunk@243 4cde692c-a291-49d1-8350-778aa11640f8
diff --git a/Lib/fontTools/cffLib.py b/Lib/fontTools/cffLib.py
index f0a1307..e4fd199 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.14 2002-05-16 18:38:03 jvr Exp $
+# $Id: cffLib.py,v 1.15 2002-05-17 07:06:32 jvr Exp $
 #
 
 import struct, sstruct
@@ -10,6 +10,9 @@
 from fontTools.misc import psCharStrings
 
 
+DEBUG = 0
+
+
 cffHeaderFormat = """
 	major:   B
 	minor:   B
@@ -27,10 +30,10 @@
 		assert self.major == 1 and self.minor == 0, \
 				"unknown CFF format: %d.%d" % (self.major, self.minor)
 		
-		self.fontNames = list(Index(file))
+		self.fontNames = list(Index(file, "fontNames"))
 		self.topDictIndex = TopDictIndex(file)
-		self.strings = IndexedStrings(list(Index(file)))
-		self.GlobalSubrs = SubrsIndex(file)
+		self.strings = IndexedStrings(file)
+		self.GlobalSubrs = CharStringIndex(file, "GlobalSubrsIndex")
 		self.topDictIndex.strings = self.strings
 		self.topDictIndex.GlobalSubrs = self.GlobalSubrs
 	
@@ -40,6 +43,9 @@
 	def keys(self):
 		return self.fontNames[:]
 	
+	def values(self):
+		return self.topDictIndex
+	
 	def __getitem__(self, name):
 		try:
 			index = self.fontNames.index(name)
@@ -76,7 +82,11 @@
 	
 	"""This class represents what the CFF spec calls an INDEX."""
 	
-	def __init__(self, file):
+	def __init__(self, file, name=None):
+		if name is None:
+			name = self.__class__.__name__
+		if DEBUG:
+			print "loading %s at %s" % (name, file.tell())
 		self.file = file
 		count, = struct.unpack(">H", file.read(2))
 		self.count = count
@@ -85,6 +95,9 @@
 			self.offsets = []
 			return
 		offSize = ord(file.read(1))
+		if DEBUG:
+			print "index count: %s offSize: %s" % (count, offSize)
+		assert offSize <= 4, "offSize too large: %s" % offSize
 		self.offsets = offsets = []
 		pad = '\0' * (4 - offSize)
 		for index in range(count+1):
@@ -116,7 +129,7 @@
 		return data
 
 
-class SubrsIndex(Index):
+class CharStringIndex(Index):
 	
 	def produceItem(self, data, file, offset, size):
 		return psCharStrings.T2CharString(data)
@@ -130,10 +143,17 @@
 			xmlWriter.newline()
 
 
+class TopDictIndex(Index):
+	def produceItem(self, data, file, offset, size):
+		top = TopDict(self.strings, file, offset, self.GlobalSubrs)
+		top.decompile(data)
+		return top
+
+
 class CharStrings:
 	
 	def __init__(self, file, charset):
-		self.charStringsIndex = SubrsIndex(file)
+		self.charStringsIndex = CharStringIndex(file)
 		self.nameToIndex = nameToIndex = {}
 		for i in range(len(charset)):
 			nameToIndex[charset[i]] = i
@@ -142,11 +162,14 @@
 		return self.nameToIndex.keys()
 	
 	def values(self):
-		return list(self.charStringsIndex)
+		return self.charStringsIndex
 	
 	def has_key(self, name):
 		return self.nameToIndex.has_key(name)
 	
+	def __len__(self):
+		return len(self.charStringsIndex)
+	
 	def __getitem__(self, name):
 		index = self.nameToIndex[name]
 		return self.charStringsIndex[index]
@@ -162,13 +185,6 @@
 			xmlWriter.newline()
 
 
-class TopDictIndex(Index):
-	def produceItem(self, data, file, offset, size):
-		top = TopDict(self.strings, file, offset, self.GlobalSubrs)
-		top.decompile(data)
-		return top
-
-
 def buildOperatorDict(table):
 	d = {}
 	for op, name, arg, default, conv in table:
@@ -216,13 +232,14 @@
 	def read(self, parent, value):
 		file = parent.file
 		file.seek(parent.offset + value)  # Offset(self)
-		return SubrsIndex(file)
+		return CharStringIndex(file, "SubrsIndex")
 
 class CharStringsConverter(PrivateDictConverter):
 	def read(self, parent, value):
 		file = parent.file
+		charset = parent.charset
 		file.seek(value)  # Offset(0)
-		return CharStrings(file, parent.charset)
+		return CharStrings(file, charset)
 
 class CharsetConverter:
 	def read(self, parent, value):
@@ -359,6 +376,8 @@
 	
 	def __init__(self, strings, file, offset):
 		self.rawDict = {}
+		if DEBUG:
+			print "loading %s at %s" % (self, offset)
 		self.file = file
 		self.offset = offset
 		self.strings = strings
@@ -424,14 +443,20 @@
 	def toXML(self, xmlWriter, progress):
 		self.decompileAllCharStrings()
 		BaseDict.toXML(self, xmlWriter, progress)
+	
 	def decompileAllCharStrings(self):
 		if self.CharstringType == 2:
 			# Type 2 CharStrings
-			decompiler = psCharStrings.SimpleT2Decompiler(self.Private.Subrs, self.GlobalSubrs)
+			if hasattr(self.Private, "Subrs"):
+				Subrs = self.Private.Subrs
+			else:
+				Subrs = []
+			decompiler = psCharStrings.SimpleT2Decompiler(Subrs, self.GlobalSubrs)
 			for charString in self.CharStrings.values():
 				if charString.needsDecompilation():
 					decompiler.reset()
 					decompiler.execute(charString)
+				charString.compile()
 		else:
 			# Type 1 CharStrings
 			for charString in self.CharStrings.values():
@@ -445,14 +470,15 @@
 	decompiler = PrivateDictDecompiler
 
 
-
-# SID
-
 class IndexedStrings:
 	
-	def __init__(self, strings=None):
-		if strings is None:
+	"""SID -> string mapping."""
+	
+	def __init__(self, file=None):
+		if file is None:
 			strings = []
+		else:
+			strings = list(Index(file, "IndexedStrings"))
 		self.strings = strings
 	
 	def __getitem__(self, SID):