Example #1
0
	def decompile(self, data, ttFont):
		axisTags = [axis.axisTag for axis in ttFont["fvar"].axes]
		glyphs = ttFont.getGlyphOrder()
		sstruct.unpack(GVAR_HEADER_FORMAT, data[0:GVAR_HEADER_SIZE], self)
		assert len(glyphs) == self.glyphCount
		assert len(axisTags) == self.axisCount
		offsets = self.decompileOffsets_(data[GVAR_HEADER_SIZE:], tableFormat=(self.flags & 1), glyphCount=self.glyphCount)
		sharedCoords = tv.decompileSharedTuples(
			axisTags, self.sharedTupleCount, data, self.offsetToSharedTuples)
		self.variations = {}
		offsetToData = self.offsetToGlyphVariationData
		for i in range(self.glyphCount):
			glyphName = glyphs[i]
			glyph = ttFont["glyf"][glyphName]
			numPointsInGlyph = self.getNumPoints_(glyph)
			gvarData = data[offsetToData + offsets[i] : offsetToData + offsets[i + 1]]
			try:
				self.variations[glyphName] = decompileGlyph_(
					numPointsInGlyph, sharedCoords, axisTags, gvarData)
			except Exception:
				log.error(
					"Failed to decompile deltas for glyph '%s' (%d points)",
					glyphName, numPointsInGlyph,
				)
				raise
Example #2
0
 def decompile(self, data, ttFont):
     axisTags = [axis.axisTag for axis in ttFont["fvar"].axes]
     glyphs = ttFont.getGlyphOrder()
     sstruct.unpack(GVAR_HEADER_FORMAT, data[0:GVAR_HEADER_SIZE], self)
     assert len(glyphs) == self.glyphCount
     assert len(axisTags) == self.axisCount
     offsets = self.decompileOffsets_(data[GVAR_HEADER_SIZE:],
                                      tableFormat=(self.flags & 1),
                                      glyphCount=self.glyphCount)
     sharedCoords = tv.decompileSharedTuples(axisTags,
                                             self.sharedTupleCount, data,
                                             self.offsetToSharedTuples)
     self.variations = {}
     offsetToData = self.offsetToGlyphVariationData
     for i in range(self.glyphCount):
         glyphName = glyphs[i]
         glyph = ttFont["glyf"][glyphName]
         numPointsInGlyph = self.getNumPoints_(glyph)
         gvarData = data[offsetToData + offsets[i]:offsetToData +
                         offsets[i + 1]]
         try:
             self.variations[glyphName] = decompileGlyph_(
                 numPointsInGlyph, sharedCoords, axisTags, gvarData)
         except Exception:
             log.error(
                 "Failed to decompile deltas for glyph '%s' (%d points)",
                 glyphName,
                 numPointsInGlyph,
             )
             raise
Example #3
0
	def compile(self, ttFont):
		axisTags = [axis.axisTag for axis in ttFont["fvar"].axes]
		sharedTuples =  tv.compileSharedTuples(
			axisTags, itertools.chain(*self.variations.values()))
		sharedTupleIndices = {coord:i for i, coord in enumerate(sharedTuples)}
		sharedTupleSize = sum([len(c) for c in sharedTuples])
		compiledGlyphs = self.compileGlyphs_(
			ttFont, axisTags, sharedTupleIndices)
		offset = 0
		offsets = []
		for glyph in compiledGlyphs:
			offsets.append(offset)
			offset += len(glyph)
		offsets.append(offset)
		compiledOffsets, tableFormat = self.compileOffsets_(offsets)

		header = {}
		header["version"] = self.version
		header["reserved"] = self.reserved
		header["axisCount"] = len(axisTags)
		header["sharedTupleCount"] = len(sharedTuples)
		header["offsetToSharedTuples"] = GVAR_HEADER_SIZE + len(compiledOffsets)
		header["glyphCount"] = len(compiledGlyphs)
		header["flags"] = tableFormat
		header["offsetToGlyphVariationData"] = header["offsetToSharedTuples"] + sharedTupleSize
		compiledHeader = sstruct.pack(GVAR_HEADER_FORMAT, header)

		result = [compiledHeader, compiledOffsets]
		result.extend(sharedTuples)
		result.extend(compiledGlyphs)
		return bytesjoin(result)
Example #4
0
    def compile(self, ttFont):
        axisTags = [axis.axisTag for axis in ttFont["fvar"].axes]
        sharedTuples = tv.compileSharedTuples(
            axisTags, itertools.chain(*self.variations.values()))
        sharedTupleIndices = {coord: i for i, coord in enumerate(sharedTuples)}
        sharedTupleSize = sum([len(c) for c in sharedTuples])
        compiledGlyphs = self.compileGlyphs_(ttFont, axisTags,
                                             sharedTupleIndices)
        offset = 0
        offsets = []
        for glyph in compiledGlyphs:
            offsets.append(offset)
            offset += len(glyph)
        offsets.append(offset)
        compiledOffsets, tableFormat = self.compileOffsets_(offsets)

        header = {}
        header["version"] = self.version
        header["reserved"] = self.reserved
        header["axisCount"] = len(axisTags)
        header["sharedTupleCount"] = len(sharedTuples)
        header["offsetToSharedTuples"] = GVAR_HEADER_SIZE + len(
            compiledOffsets)
        header["glyphCount"] = len(compiledGlyphs)
        header["flags"] = tableFormat
        header["offsetToGlyphVariationData"] = header[
            "offsetToSharedTuples"] + sharedTupleSize
        compiledHeader = sstruct.pack(GVAR_HEADER_FORMAT, header)

        result = [compiledHeader, compiledOffsets]
        result.extend(sharedTuples)
        result.extend(compiledGlyphs)
        return bytesjoin(result)
Example #5
0
 def decompile(self, data, ttFont):
     axisTags = [axis.axisTag for axis in ttFont["fvar"].axes]
     glyphs = ttFont.getGlyphOrder()
     sstruct.unpack(GVAR_HEADER_FORMAT, data[0:GVAR_HEADER_SIZE], self)
     assert len(glyphs) == self.glyphCount
     assert len(axisTags) == self.axisCount
     offsets = self.decompileOffsets_(data[GVAR_HEADER_SIZE:],
                                      tableFormat=(self.flags & 1),
                                      glyphCount=self.glyphCount)
     sharedCoords = tv.decompileSharedTuples(axisTags,
                                             self.sharedTupleCount, data,
                                             self.offsetToSharedTuples)
     self.variations = _lazy_dict()
     offsetToData = self.offsetToGlyphVariationData
     glyf = ttFont['glyf']
     for i in range(self.glyphCount):
         glyphName = glyphs[i]
         glyph = glyf[glyphName]
         numPointsInGlyph = self.getNumPoints_(glyph)
         gvarData = data[offsetToData + offsets[i]:offsetToData +
                         offsets[i + 1]]
         self.variations[glyphName] = partial(decompileGlyph_,
                                              numPointsInGlyph,
                                              sharedCoords, axisTags,
                                              gvarData)
Example #6
0
def decompileGlyph_(pointCount, sharedTuples, axisTags, data):
	if len(data) < 4:
		return []
	tupleVariationCount, offsetToData = struct.unpack(">HH", data[:4])
	dataPos = offsetToData
	return tv.decompileTupleVariationStore("gvar", axisTags,
                                           tupleVariationCount, pointCount,
                                           sharedTuples, data, 4, offsetToData)
Example #7
0
def decompileGlyph_(pointCount, sharedTuples, axisTags, data):
    if len(data) < 4:
        return []
    tupleVariationCount, offsetToData = struct.unpack(">HH", data[:4])
    dataPos = offsetToData
    return tv.decompileTupleVariationStore("gvar", axisTags,
                                           tupleVariationCount, pointCount,
                                           sharedTuples, data, 4, offsetToData)
Example #8
0
def compileGlyph_(variations, pointCount, axisTags, sharedCoordIndices):
	tupleVariationCount, tuples, data = tv.compileTupleVariationStore(
		variations, pointCount, axisTags, sharedCoordIndices)
	if tupleVariationCount == 0:
		return b""
	result = (struct.pack(">HH", tupleVariationCount, 4 + len(tuples)) +
	          tuples + data)
	if len(result) % 2 != 0:
		result = result + b"\0"  # padding
	return result
Example #9
0
def compileGlyph_(variations, pointCount, axisTags, sharedCoordIndices):
    tupleVariationCount, tuples, data = tv.compileTupleVariationStore(
        variations, pointCount, axisTags, sharedCoordIndices)
    if tupleVariationCount == 0:
        return b""
    result = (struct.pack(">HH", tupleVariationCount, 4 + len(tuples)) +
              tuples + data)
    if len(result) % 2 != 0:
        result = result + b"\0"  # padding
    return result
Example #10
0
def compileGlyph_(variations, pointCount, axisTags, sharedCoordIndices):
    tupleVariationCount, tuples, data = tv.compileTupleVariationStore(
        variations, pointCount, axisTags, sharedCoordIndices)
    if tupleVariationCount == 0:
        return b""
    result = [
        struct.pack(">HH", tupleVariationCount, 4 + len(tuples)), tuples, data
    ]
    if (len(tuples) + len(data)) % 2 != 0:
        result.append(b"\0")  # padding
    return b''.join(result)