reordered/regrouped some methods for clarity
git-svn-id: svn://svn.code.sf.net/p/fonttools/code/trunk@288 4cde692c-a291-49d1-8350-778aa11640f8
diff --git a/Lib/fontTools/ttLib/tables/otBase.py b/Lib/fontTools/ttLib/tables/otBase.py
index b26f531..1ddea2d 100644
--- a/Lib/fontTools/ttLib/tables/otBase.py
+++ b/Lib/fontTools/ttLib/tables/otBase.py
@@ -129,8 +129,46 @@
self.valueFormat = valueFormat
self.pos = None
- def getSubWriter(self):
- return self.__class__(self.tableType, self.valueFormat)
+ # assembler interface
+
+ def getAllData(self):
+ """Assemble all data, including all subtables."""
+ self._doneWriting()
+ tables = self._gatherTables()
+ tables.reverse()
+
+ # Gather all data in two passes: the absolute positions of all
+ # subtable are needed before the actual data can be assembled.
+ pos = 0
+ for table in tables:
+ table.pos = pos
+ pos = pos + table.getDataLength()
+
+ data = []
+ for table in tables:
+ tableData = table.getData()
+ data.append(tableData)
+
+ return "".join(data)
+
+ def getDataLength(self):
+ """Return the length of this table in bytes, without subtables."""
+ l = 0
+ for item in self.items:
+ if hasattr(item, "getData") or hasattr(item, "getCountData"):
+ l = l + 2 # sizeof(UShort)
+ else:
+ l = l + len(item)
+ return l
+
+ def getData(self):
+ """Assemble the data for this writer/table, without subtables."""
+ items = list(self.items) # make a shallow copy
+ for i in range(len(items)):
+ item = items[i]
+ if hasattr(item, "getData"):
+ items[i] = packUShort(item.pos - self.pos)
+ return "".join(items)
def __hash__(self):
# only works after self._doneWriting() has been called
@@ -171,42 +209,10 @@
tables.append(self)
return tables
- def getAllData(self):
- """Return all data, including all subtables."""
- self._doneWriting()
- tables = self._gatherTables()
- tables.reverse()
-
- pos = 0
- for table in tables:
- table.pos = pos
- pos = pos + table.getDataLength()
-
- data = []
- for table in tables:
- tableData = table.getData()
- data.append(tableData)
-
- return "".join(data)
+ # interface for gathering data, as used by table.compile()
- def getDataLength(self):
- """Return the length of this table in bytes, without subtables."""
- l = 0
- for item in self.items:
- if hasattr(item, "getData") or hasattr(item, "getCountData"):
- l = l + 2 # sizeof(UShort)
- else:
- l = l + len(item)
- return l
-
- def getData(self):
- """Return the data for this writer/table, without any subtables."""
- items = list(self.items) # make a shallow copy
- for i in range(len(items)):
- item = items[i]
- if hasattr(item, "getData"):
- items[i] = packUShort(item.pos - self.pos)
- return "".join(items)
+ def getSubWriter(self):
+ return self.__class__(self.tableType, self.valueFormat)
def writeUShort(self, value):
assert 0 <= value < 0x10000