Esempio n. 1
0
	def compile(self, offset):
		nTracks = len(self)
		sizes = self.sizes()
		nSizes = len(sizes)

		# offset to the start of the size subtable
		offset += TRACK_DATA_FORMAT_SIZE + TRACK_TABLE_ENTRY_FORMAT_SIZE*nTracks
		trackDataHeader = sstruct.pack(
			TRACK_DATA_FORMAT,
			{'nTracks': nTracks, 'nSizes': nSizes, 'sizeTableOffset': offset})

		entryDataList = []
		perSizeDataList = []
		# offset to per-size tracking values
		offset += SIZE_VALUE_FORMAT_SIZE*nSizes
		# sort track table entries by track value
		for track, entry in sorted(self.items()):
			assert entry.nameIndex is not None
			entry.track = track
			entry.offset = offset
			entryDataList += [sstruct.pack(TRACK_TABLE_ENTRY_FORMAT, entry)]
			# sort per-size values by size
			for size, value in sorted(entry.items()):
				perSizeDataList += [struct.pack(PER_SIZE_VALUE_FORMAT, value)]
			offset += PER_SIZE_VALUE_FORMAT_SIZE*nSizes
		# sort size values
		sizeDataList = [struct.pack(SIZE_VALUE_FORMAT, fl2fi(sv, 16)) for sv in sorted(sizes)]

		data = bytesjoin([trackDataHeader] + entryDataList + sizeDataList + perSizeDataList)
		return data
Esempio n. 2
0
	def compile(self, offset):
		nTracks = len(self)
		sizes = self.sizes()
		nSizes = len(sizes)

		# offset to the start of the size subtable
		offset += TRACK_DATA_FORMAT_SIZE + TRACK_TABLE_ENTRY_FORMAT_SIZE*nTracks
		trackDataHeader = sstruct.pack(
			TRACK_DATA_FORMAT,
			{'nTracks': nTracks, 'nSizes': nSizes, 'sizeTableOffset': offset})

		entryDataList = []
		perSizeDataList = []
		# offset to per-size tracking values
		offset += SIZE_VALUE_FORMAT_SIZE*nSizes
		# sort track table entries by track value
		for track, entry in sorted(self.items()):
			assert entry.nameIndex is not None
			entry.track = track
			entry.offset = offset
			entryDataList += [sstruct.pack(TRACK_TABLE_ENTRY_FORMAT, entry)]
			# sort per-size values by size
			for size, value in sorted(entry.items()):
				perSizeDataList += [struct.pack(PER_SIZE_VALUE_FORMAT, value)]
			offset += PER_SIZE_VALUE_FORMAT_SIZE*nSizes
		# sort size values
		sizeDataList = [struct.pack(SIZE_VALUE_FORMAT, fl2fi(sv, 16)) for sv in sorted(sizes)]

		data = bytesjoin([trackDataHeader] + entryDataList + sizeDataList + perSizeDataList)
		return data
Esempio n. 3
0
 def xmlWrite(self, xmlWriter, font, value, name, attrs):
     if value >= 0x10000:
         value = fi2fl(value, 16)
     if value % 1 != 0:
         # Write as hex
         value = "0x%08x" % fl2fi(value, 16)
     xmlWriter.simpletag(name, attrs + [("value", value)])
     xmlWriter.newline()
Esempio n. 4
0
 def compile(self, axisTags, includePostScriptName):
     result = [sstruct.pack(FVAR_INSTANCE_FORMAT, self)]
     for axis in axisTags:
         fixedCoord = fl2fi(self.coordinates[axis], 16)
         result.append(struct.pack(">l", fixedCoord))
     if includePostScriptName:
         result.append(struct.pack(">H", self.postscriptNameID))
     return bytesjoin(result)
Esempio n. 5
0
 def compile(self, ttFont):
     axisTags = [axis.axisTag for axis in ttFont["fvar"].axes]
     header = {
         "majorVersion": 1,
         "minorVersion": 0,
         "reserved": 0,
         "axisCount": len(axisTags)
     }
     result = [sstruct.pack(AVAR_HEADER_FORMAT, header)]
     for axis in axisTags:
         mappings = sorted(self.segments[axis].items())
         result.append(struct.pack(">H", len(mappings)))
         for key, value in mappings:
             fixedKey = fl2fi(key, 14)
             fixedValue = fl2fi(value, 14)
             result.append(struct.pack(">hh", fixedKey, fixedValue))
     return bytesjoin(result)
Esempio n. 6
0
	def xmlWrite(self, xmlWriter, font, value, name, attrs):
		if value >= 0x10000:
			value = fi2fl(value, 16)
		if value % 1 != 0:
			# Write as hex
			value = "0x%08x" % fl2fi(value, 16)
		xmlWriter.simpletag(name, attrs + [("value", value)])
		xmlWriter.newline()
 def compileIntermediateCoord(self, axisTags):
     needed = False
     for axis in axisTags:
         minValue, value, maxValue = self.axes.get(axis, (0.0, 0.0, 0.0))
         defaultMinValue = min(value, 0.0)  # -0.3 --> -0.3; 0.7 --> 0.0
         defaultMaxValue = max(value, 0.0)  # -0.3 -->  0.0; 0.7 --> 0.7
         if (minValue != defaultMinValue) or (maxValue != defaultMaxValue):
             needed = True
             break
     if not needed:
         return None
     minCoords = []
     maxCoords = []
     for axis in axisTags:
         minValue, value, maxValue = self.axes.get(axis, (0.0, 0.0, 0.0))
         minCoords.append(struct.pack(">h", fl2fi(minValue, 14)))
         maxCoords.append(struct.pack(">h", fl2fi(maxValue, 14)))
     return bytesjoin(minCoords + maxCoords)
Esempio n. 8
0
 def compileCoord(self, axisTags):
     result = bytearray()
     axes = self.axes
     for axis in axisTags:
         triple = axes.get(axis)
         if triple is None:
             result.extend(b'\0\0')
         else:
             result.extend(struct.pack(">h", fl2fi(triple[1], 14)))
     return bytes(result)
Esempio n. 9
0
 def compile(self, ttFont):
     if hasattr(self, "kernTables"):
         nTables = len(self.kernTables)
     else:
         nTables = 0
     if self.version == 1.0:
         # AAT Apple's "new" format.
         data = struct.pack(">LL", fl2fi(self.version, 16), nTables)
     else:
         data = struct.pack(">HH", self.version, nTables)
     if hasattr(self, "kernTables"):
         for subtable in self.kernTables:
             data = data + subtable.compile(ttFont)
     return data
Esempio n. 10
0
	def compile(self, ttFont):
		if hasattr(self, "kernTables"):
			nTables = len(self.kernTables)
		else:
			nTables = 0
		if self.version == 1.0:
			# AAT Apple's "new" format.
			data = struct.pack(">ll", fl2fi(self.version, 16), nTables)
		else:
			data = struct.pack(">HH", self.version, nTables)
		if hasattr(self, "kernTables"):
			for subtable in self.kernTables:
				data = data + subtable.compile(ttFont)
		return data
Esempio n. 11
0
def pack(fmt, obj):
    formatstring, names, fixes = getformat(fmt)
    elements = []
    if not isinstance(obj, dict):
        obj = obj.__dict__
    for name in names:
        value = obj[name]
        if name in fixes:
            # fixed point conversion
            value = fl2fi(value, fixes[name])
        elif isinstance(value, basestring):
            value = tobytes(value)
        elements.append(value)
    data = struct.pack(*(formatstring, ) + tuple(elements))
    return data
Esempio n. 12
0
def pack(fmt, obj):
	formatstring, names, fixes = getformat(fmt)
	elements = []
	if not isinstance(obj, dict):
		obj = obj.__dict__
	for name in names:
		value = obj[name]
		if name in fixes:
			# fixed point conversion
			value = fl2fi(value, fixes[name])
		elif isinstance(value, basestring):
			value = tobytes(value)
		elements.append(value)
	data = struct.pack(*(formatstring,) + tuple(elements))
	return data
Esempio n. 13
0
	def compile(self, more, haveInstructions, glyfTable):
		data = b""

		# reset all flags we will calculate ourselves
		flags = self.flags & (ROUND_XY_TO_GRID | USE_MY_METRICS |
				SCALED_COMPONENT_OFFSET | UNSCALED_COMPONENT_OFFSET |
				NON_OVERLAPPING)
		if more:
			flags = flags | MORE_COMPONENTS
		if haveInstructions:
			flags = flags | WE_HAVE_INSTRUCTIONS

		if hasattr(self, "firstPt"):
			if (0 <= self.firstPt <= 255) and (0 <= self.secondPt <= 255):
				data = data + struct.pack(">BB", self.firstPt, self.secondPt)
			else:
				data = data + struct.pack(">HH", self.firstPt, self.secondPt)
				flags = flags | ARG_1_AND_2_ARE_WORDS
		else:
			x = int(round(self.x))
			y = int(round(self.y))
			flags = flags | ARGS_ARE_XY_VALUES
			if (-128 <= x <= 127) and (-128 <= y <= 127):
				data = data + struct.pack(">bb", x, y)
			else:
				data = data + struct.pack(">hh", x, y)
				flags = flags | ARG_1_AND_2_ARE_WORDS

		if hasattr(self, "transform"):
			transform = [[fl2fi(x,14) for x in row] for row in self.transform]
			if transform[0][1] or transform[1][0]:
				flags = flags | WE_HAVE_A_TWO_BY_TWO
				data = data + struct.pack(">hhhh",
						transform[0][0], transform[0][1],
						transform[1][0], transform[1][1])
			elif transform[0][0] != transform[1][1]:
				flags = flags | WE_HAVE_AN_X_AND_Y_SCALE
				data = data + struct.pack(">hh",
						transform[0][0], transform[1][1])
			else:
				flags = flags | WE_HAVE_A_SCALE
				data = data + struct.pack(">h",
						transform[0][0])

		glyphID = glyfTable.getGlyphID(self.glyphName)
		return struct.pack(">HH", flags, glyphID) + data
Esempio n. 14
0
	def compile(self, more, haveInstructions, glyfTable):
		data = b""

		# reset all flags we will calculate ourselves
		flags = self.flags & (ROUND_XY_TO_GRID | USE_MY_METRICS |
				SCALED_COMPONENT_OFFSET | UNSCALED_COMPONENT_OFFSET |
				NON_OVERLAPPING | OVERLAP_COMPOUND)
		if more:
			flags = flags | MORE_COMPONENTS
		if haveInstructions:
			flags = flags | WE_HAVE_INSTRUCTIONS

		if hasattr(self, "firstPt"):
			if (0 <= self.firstPt <= 255) and (0 <= self.secondPt <= 255):
				data = data + struct.pack(">BB", self.firstPt, self.secondPt)
			else:
				data = data + struct.pack(">HH", self.firstPt, self.secondPt)
				flags = flags | ARG_1_AND_2_ARE_WORDS
		else:
			x = otRound(self.x)
			y = otRound(self.y)
			flags = flags | ARGS_ARE_XY_VALUES
			if (-128 <= x <= 127) and (-128 <= y <= 127):
				data = data + struct.pack(">bb", x, y)
			else:
				data = data + struct.pack(">hh", x, y)
				flags = flags | ARG_1_AND_2_ARE_WORDS

		if hasattr(self, "transform"):
			transform = [[fl2fi(x,14) for x in row] for row in self.transform]
			if transform[0][1] or transform[1][0]:
				flags = flags | WE_HAVE_A_TWO_BY_TWO
				data = data + struct.pack(">hhhh",
						transform[0][0], transform[0][1],
						transform[1][0], transform[1][1])
			elif transform[0][0] != transform[1][1]:
				flags = flags | WE_HAVE_AN_X_AND_Y_SCALE
				data = data + struct.pack(">hh",
						transform[0][0], transform[1][1])
			else:
				flags = flags | WE_HAVE_A_SCALE
				data = data + struct.pack(">h",
						transform[0][0])

		glyphID = glyfTable.getGlyphID(self.glyphName)
		return struct.pack(">HH", flags, glyphID) + data
Esempio n. 15
0
 def write(self, writer, font, tableDict, value, repeatIndex=None):
     writer.writeLong(fl2fi(value, 16))
Esempio n. 16
0
	def write(self, writer, font, tableDict, value, repeatIndex=None):
		writer.writeLong(fl2fi(value, 16))
Esempio n. 17
0
	def write(self, writer, font, tableDict, value, repeatIndex=None):
		writer.writeShort(fl2fi(value, 14))
Esempio n. 18
0
 def fromFloat(v):
     return fl2fi(v, 16)
Esempio n. 19
0
 def write(self, writer, font, tableDict, value, repeatIndex=None):
     writer.writeShort(fl2fi(value, 14))
Esempio n. 20
0
	def fromFloat(v):
		return fl2fi(v, 16)
Esempio n. 21
0
 def write(self, writer, font, tableDict, value, repeatIndex=None):
     if value < 0x10000:
         value = fl2fi(value, 16)
     value = int(round(value))
     assert (value >> 16) == 1, "Unsupported version 0x%08x" % value
     writer.writeLong(value)
Esempio n. 22
0
	def write(self, writer, font, tableDict, value, repeatIndex=None):
		if value < 0x10000:
			value = fl2fi(value, 16)
		value = int(round(value))
		assert (value >> 16) == 1, "Unsupported version 0x%08x" % value
		writer.writeLong(value)
Esempio n. 23
0
 def compileCoord(self, axisTags):
     result = []
     for axis in axisTags:
         _minValue, value, _maxValue = self.axes.get(axis, (0.0, 0.0, 0.0))
         result.append(struct.pack(">h", fl2fi(value, 14)))
     return bytesjoin(result)