Esempio n. 1
0
def parseGDEF(lines, font):
	container = ttLib.getTableClass('GDEF')()
	log.debug("Parsing GDEF")
	self = ot.GDEF()
	fields = {
		'class definition begin':
			('GlyphClassDef',
			 lambda lines, font: parseClassDef(lines, font, klass=ot.GlyphClassDef)),
		'attachment list begin':
			('AttachList', parseAttachList),
		'carets begin':
			('LigCaretList', parseCaretList),
		'mark attachment class definition begin':
			('MarkAttachClassDef',
			 lambda lines, font: parseClassDef(lines, font, klass=ot.MarkAttachClassDef)),
		'markfilter set definition begin':
			('MarkGlyphSetsDef', parseMarkFilteringSets),
	}
	for attr,parser in fields.values():
		setattr(self, attr, None)
	while lines.peek() is not None:
		typ = lines.peek()[0].lower()
		if typ not in fields:
			log.debug('Skipping %s', typ)
			next(lines)
			continue
		attr,parser = fields[typ]
		assert getattr(self, attr) is None, attr
		setattr(self, attr, parser(lines, font))
	self.Version = 0x00010000 if self.MarkGlyphSetsDef is None else 0x00010002
	container.table = self
	return container
Esempio n. 2
0
def _merge_OTL(font, model, master_fonts, axisTags):

    log.info("Merging OpenType Layout tables")
    merger = VariationMerger(model, axisTags, font)

    merger.mergeTables(font, master_fonts, ['GSUB', 'GDEF', 'GPOS'])
    store = merger.store_builder.finish()
    if not store.VarData:
        return
    try:
        GDEF = font['GDEF'].table
        assert GDEF.Version <= 0x00010002
    except KeyError:
        font['GDEF'] = newTable('GDEF')
        GDEFTable = font["GDEF"] = newTable('GDEF')
        GDEF = GDEFTable.table = ot.GDEF()
        GDEF.GlyphClassDef = None
        GDEF.AttachList = None
        GDEF.LigCaretList = None
        GDEF.MarkAttachClassDef = None
        GDEF.MarkGlyphSetsDef = None

    GDEF.Version = 0x00010003
    GDEF.VarStore = store

    # Optimize
    varidx_map = store.optimize()
    GDEF.remap_device_varidxes(varidx_map)
    if 'GPOS' in font:
        font['GPOS'].table.remap_device_varidxes(varidx_map)
Esempio n. 3
0
    def makeGDEF(self):
        gdef = otTables.GDEF()
        gdef.Version = 1.0
        gdef.GlyphClassDef = otTables.GlyphClassDef()

        inferredGlyphClass = {}
        for lookup in self.lookups_:
            inferredGlyphClass.update(lookup.inferGlyphClasses())

        marks = {}  # glyph --> markClass
        for markClass in self.parseTree.markClasses.values():
            for markClassDef in markClass.definitions:
                for glyph in markClassDef.glyphSet():
                    other = marks.get(glyph)
                    if other not in (None, markClass):
                        name1, name2 = sorted([markClass.name, other.name])
                        raise FeatureLibError(
                            'Glyph %s cannot be both in '
                            'markClass @%s and @%s' % (glyph, name1, name2),
                            markClassDef.location)
                    marks[glyph] = markClass
                    inferredGlyphClass[glyph] = 3

        gdef.GlyphClassDef.classDefs = inferredGlyphClass
        gdef.AttachList = None
        gdef.LigCaretList = None

        markAttachClass = {g: c for g, (c, _) in self.markAttach_.items()}
        if markAttachClass:
            gdef.MarkAttachClassDef = otTables.MarkAttachClassDef()
            gdef.MarkAttachClassDef.classDefs = markAttachClass
        else:
            gdef.MarkAttachClassDef = None

        if self.markFilterSets_:
            gdef.Version = 0x00010002
            m = gdef.MarkGlyphSetsDef = otTables.MarkGlyphSetsDef()
            m.MarkSetTableFormat = 1
            m.MarkSetCount = len(self.markFilterSets_)
            m.Coverage = []
            filterSets = [(id, glyphs)
                          for (glyphs, id) in self.markFilterSets_.items()]
            for i, glyphs in sorted(filterSets):
                coverage = otTables.Coverage()
                coverage.glyphs = sorted(glyphs, key=self.font.getGlyphID)
                m.Coverage.append(coverage)

        if (len(gdef.GlyphClassDef.classDefs) == 0
                and gdef.MarkAttachClassDef is None):
            return None
        result = getTableClass("GDEF")()
        result.table = gdef
        return result
Esempio n. 4
0
def _merge_OTL(font, model, master_fonts, axisTags):

	log.info("Merging OpenType Layout tables")
	merger = VariationMerger(model, axisTags, font)

	merger.mergeTables(font, master_fonts, ['GPOS'])
	store = merger.store_builder.finish()
	try:
		GDEF = font['GDEF'].table
		assert GDEF.Version <= 0x00010002
	except KeyError:
		font['GDEF']= newTable('GDEF')
		GDEFTable = font["GDEF"] = newTable('GDEF')
		GDEF = GDEFTable.table = ot.GDEF()
	GDEF.Version = 0x00010003
	GDEF.VarStore = store
Esempio n. 5
0
 def buildGDEF(self):
     gdef = otTables.GDEF()
     gdef.GlyphClassDef = self.buildGDEFGlyphClassDef_()
     gdef.AttachList = \
         otl.buildAttachList(self.attachPoints_, self.glyphMap)
     gdef.LigCaretList = \
         otl.buildLigCaretList(self.ligCaretCoords_, self.ligCaretPoints_,
                               self.glyphMap)
     gdef.MarkAttachClassDef = self.buildGDEFMarkAttachClassDef_()
     gdef.MarkGlyphSetsDef = self.buildGDEFMarkGlyphSetsDef_()
     gdef.Version = 0x00010002 if gdef.MarkGlyphSetsDef else 1.0
     if any((gdef.GlyphClassDef, gdef.AttachList, gdef.LigCaretList,
             gdef.MarkAttachClassDef, gdef.MarkGlyphSetsDef)):
         result = getTableClass("GDEF")()
         result.table = gdef
         return result
     else:
         return None
Esempio n. 6
0
def add_gdef_table(font, class_defs):
    font["GDEF"] = gdef = newTable("GDEF")
    class_def_table = otTables.GlyphClassDef()
    class_def_table.classDefs = class_defs
    gdef.table = otTables.GDEF()
    gdef.table.GlyphClassDef = class_def_table