1999-12-16 21:34:53 +00:00
|
|
|
import DefaultTable
|
|
|
|
import array
|
|
|
|
import Numeric
|
|
|
|
from fontTools import ttLib
|
|
|
|
import struct
|
|
|
|
|
|
|
|
class table__l_o_c_a(DefaultTable.DefaultTable):
|
|
|
|
|
|
|
|
dependencies = ['glyf']
|
|
|
|
|
|
|
|
def decompile(self, data, ttFont):
|
|
|
|
longFormat = ttFont['head'].indexToLocFormat
|
|
|
|
if longFormat:
|
2000-02-13 17:00:45 +00:00
|
|
|
format = "i"
|
1999-12-16 21:34:53 +00:00
|
|
|
else:
|
|
|
|
format = "H"
|
|
|
|
locations = array.array(format)
|
|
|
|
locations.fromstring(data)
|
|
|
|
if ttLib.endian <> "big":
|
|
|
|
locations.byteswap()
|
|
|
|
locations = Numeric.array(locations, Numeric.Int32)
|
|
|
|
if not longFormat:
|
|
|
|
locations = locations * 2
|
|
|
|
if len(locations) <> (ttFont['maxp'].numGlyphs + 1):
|
|
|
|
raise ttLib.TTLibError, "corrupt 'loca' table"
|
|
|
|
self.locations = locations
|
|
|
|
|
|
|
|
def compile(self, ttFont):
|
|
|
|
locations = self.locations
|
|
|
|
if max(locations) < 0x20000:
|
|
|
|
locations = locations / 2
|
|
|
|
locations = locations.astype(Numeric.Int16)
|
|
|
|
ttFont['head'].indexToLocFormat = 0
|
|
|
|
else:
|
|
|
|
ttFont['head'].indexToLocFormat = 1
|
|
|
|
if ttLib.endian <> "big":
|
|
|
|
locations = locations.byteswapped()
|
|
|
|
return locations.tostring()
|
|
|
|
|
|
|
|
def set(self, locations):
|
|
|
|
self.locations = Numeric.array(locations, Numeric.Int32)
|
|
|
|
|
|
|
|
def toXML(self, writer, ttFont):
|
|
|
|
writer.comment("The 'loca' table will be calculated by the compiler")
|
|
|
|
writer.newline()
|
|
|
|
|
|
|
|
def __getitem__(self, index):
|
|
|
|
return self.locations[index]
|
|
|
|
|
|
|
|
def __len__(self):
|
|
|
|
return len(self.locations)
|
|
|
|
|
|
|
|
def __cmp__(self, other):
|
|
|
|
return cmp(len(self), len(other)) or not Numeric.alltrue(Numeric.equal(self.locations, other.locations))
|
|
|
|
|