Example #1
0
 def _makeMarkClass(cls, markClasses, accentName, x, y, className):
     """ Make a MarkClassDefinition statement given the accent name,
     position, class name, and pre-existing mark classes.
     Return None if a mark class with the same name and anchor already
     exists. Or create new mark class with unique name when different.
     """
     glyphs = ast.GlyphName(accentName)
     anchor = cls._makeAnchorFormatA(x, y)
     className = ast.makeFeaClassName(className)
     markClass = markClasses.get(className)
     if markClass is None:
         markClass = ast.MarkClass(className)
         markClasses[className] = markClass
     else:
         if accentName in markClass.glyphs:
             mcdef = markClass.glyphs[accentName]
             if cls._anchorsAreEqual(anchor, mcdef.anchor):
                 logger.debug(
                     "Glyph %s already defined in markClass @%s",
                     accentName,
                     className,
                 )
                 return None
             else:
                 # same accent glyph defined with different anchors for the
                 # same markClass; make a new unique markClass definition
                 newClassName = ast.makeFeaClassName(className, markClasses)
                 markClass = ast.MarkClass(newClassName)
                 markClasses[newClassName] = markClass
     mcdef = ast.MarkClassDefinition(markClass, anchor, glyphs)
     markClass.addDefinition(mcdef)
     return mcdef
Example #2
0
 def _makeMarkClass(cls, markClasses, accentName, x, y, className):
     """ Make a MarkClassDefinition statement given the accent name,
     position, class name, and pre-existing mark classes.
     Return None if a mark class with the same name and anchor already
     exists. Or create new mark class with unique name when different.
     """
     glyphs = ast.GlyphName(accentName)
     anchor = cls._makeAnchorFormatA(x, y)
     className = ast.makeFeaClassName(className)
     markClass = markClasses.get(className)
     if markClass is None:
         markClass = ast.MarkClass(className)
         markClasses[className] = markClass
     else:
         if accentName in markClass.glyphs:
             mcdef = markClass.glyphs[accentName]
             if cls._anchorsAreEqual(anchor, mcdef.anchor):
                 logger.debug(
                     "Glyph %s already defined in markClass @%s",
                     accentName,
                     className,
                 )
                 return None
             else:
                 # same accent glyph defined with different anchors for the
                 # same markClass; make a new unique markClass definition
                 newClassName = ast.makeFeaClassName(className, markClasses)
                 markClass = ast.MarkClass(newClassName)
                 markClasses[newClassName] = markClass
     mcdef = ast.MarkClassDefinition(markClass, anchor, glyphs)
     markClass.addDefinition(mcdef)
     return mcdef
Example #3
0
 def _defineMarkClass(self, glyphName, x, y, className, markClasses):
     anchor = ast.Anchor(x=otRound(x), y=otRound(y))
     markClass = markClasses.get(className)
     if markClass is None:
         markClass = ast.MarkClass(className)
         markClasses[className] = markClass
     else:
         if glyphName in markClass.glyphs:
             mcdef = markClass.glyphs[glyphName]
             if self._anchorsAreEqual(anchor, mcdef.anchor):
                 self.log.debug(
                     "Glyph %s already defined in markClass @%s",
                     glyphName,
                     className,
                 )
                 return None
             else:
                 # same mark glyph defined with different anchors for the
                 # same markClass; make a new unique markClass definition
                 newClassName = ast.makeFeaClassName(className, markClasses)
                 markClass = ast.MarkClass(newClassName)
                 markClasses[newClassName] = markClass
     glyphName = ast.GlyphName(glyphName)
     mcdef = ast.MarkClassDefinition(markClass, anchor, glyphName)
     markClass.addDefinition(mcdef)
     return mcdef
Example #4
0
 def _makeMarkClassDefinitions(self):
     markGlyphSets = self._groupMarkGlyphsByAnchor()
     currentClasses = self.context.feaFile.markClasses
     allMarkClasses = self.context.markClasses = {}
     classPrefix = self.markClassPrefix
     newDefs = []
     for markAnchorName, glyphAnchorPairs in sorted(markGlyphSets.items()):
         className = ast.makeFeaClassName(classPrefix + markAnchorName)
         for glyphName, anchor in glyphAnchorPairs.items():
             mcd = self._defineMarkClass(glyphName, anchor.x, anchor.y,
                                         className, currentClasses)
             if mcd is not None:
                 newDefs.append(mcd)
                 # this may be different because of name clashes
                 className = mcd.markClass.name
             allMarkClasses[anchor.key] = currentClasses[className]
     return newDefs