def clearAnchors(self, doProgress=True): """clear all anchors in the font""" tickCount = len(self.font) if doProgress: bar = ProgressBar("Cleaning all anchors...", tickCount) tick = 0 for glyphName in self.accentList: if doProgress: bar.label(glyphName) baseName, stripedSuffixName, accentNames, errors = nameBuster( glyphName, self.glyphConstructions) existError = False if len(errors) > 0: existError = True if not existError: toClear = [baseName] for accent, position in accentNames: toClear.append(accent) for glyphName in toClear: try: self.font[glyphName].clearAnchors() except IndexError: pass if doProgress: bar.tick(tick) tick = tick + 1 if doProgress: bar.close()
def clearAnchors(self, doProgress=True): """clear all anchors in the font""" tickCount = len(self.font) if doProgress: bar = ProgressBar("Cleaning all anchors...", tickCount) tick = 0 for glyphName in self.accentList: if doProgress: bar.label(glyphName) baseName, stripedSuffixName, accentNames, errors = nameBuster(glyphName, self.glyphConstructions) existError = False if len(errors) > 0: existError = True if not existError: toClear = [baseName] for accent, position in accentNames: toClear.append(accent) for glyphName in toClear: try: self.font[glyphName].clearAnchors() except IndexError: pass if doProgress: bar.tick(tick) tick = tick+1 if doProgress: bar.close()
def buildAccents(self, clear=True, adjustWidths=True, markGlyph=True, doProgress=True): """build accented glyphs. some flag definitions: clear=1 clear the glyphs if they already exist markGlyph=1 mark the glyph that is created doProgress=1 show a progress bar adjustWidths=1 will fix right and left margins when left or right accents are added""" tickCount = len(self.accentList) if doProgress: bar = ProgressBar('Building accented glyphs...', tickCount) tick = 0 for glyphName in self.accentList: if doProgress: bar.label(glyphName) existError = False anchorError = False baseName, stripedSuffixName, accentNames, errors = nameBuster(glyphName, self.glyphConstructions) if len(errors) > 0: existError = True for accentError in errors: self.accentErrors.append(accentError) if not existError: baseAnchors = [] try: self.font[baseName] except IndexError: self.accentErrors.append('%s: %s does not exist.'%(glyphName, baseName)) existError = True else: for anchor in self.font[baseName].anchors: baseAnchors.append(anchor.name) for accentName, accentPosition in accentNames: accentAnchors = [] try: self.font[accentName] except IndexError: self.accentErrors.append('%s: %s does not exist.'%(glyphName, accentName)) existError = True else: for anchor in self.font[accentName].getAnchors(): accentAnchors.append(anchor.name) if accentPosition not in baseAnchors: self.accentErrors.append('%s: %s not in %s anchors.'%(glyphName, accentPosition, baseName)) anchorError = True if ''.join(['_', accentPosition]) not in accentAnchors: self.accentErrors.append('%s: %s not in %s anchors.'%(glyphName, ''.join(['_', accentPosition]), accentName)) anchorError = True if not existError and not anchorError: destination = self.font.compileGlyph(glyphName, baseName, self.glyphConstructions[stripedSuffixName][1:], adjustWidths) if markGlyph: destination.mark = accentColor if doProgress: bar.tick(tick) tick = tick+1 if doProgress: bar.close()
def save(self, destDir=None, doProgress=False, formatVersion=2): """Save the Font in UFO format.""" # XXX note that when doing "save as" by specifying the destDir argument # _all_ glyphs get loaded into memory. This could be optimized by either # copying those .glif files that have not been edited or (not sure how # well that would work) by simply clearing out self._objects after the # save. from robofab.ufoLib import UFOWriter from robofab.tools.fontlabFeatureSplitter import splitFeaturesForFontLab # if no destination is given, or if # the given destination is the current # path, this is not a save as operation if destDir is None or destDir == self._path: saveAs = False destDir = self._path else: saveAs = True # start a progress bar nonGlyphCount = 5 bar = None if doProgress: from robofab.interface.all.dialogs import ProgressBar bar = ProgressBar("Exporting UFO", nonGlyphCount + len(self._object.keys())) # write writer = UFOWriter(destDir, formatVersion=formatVersion) try: # make a shallow copy of the lib. stuff may be added to it. fontLib = dict(self.lib) # info if bar: bar.label("Saving info...") writer.writeInfo(self.info) if bar: bar.tick() # kerning if self.kerning.changed or saveAs: if bar: bar.label("Saving kerning...") writer.writeKerning(self.kerning.asDict()) if bar: bar.tick() # groups if bar: bar.label("Saving groups...") writer.writeGroups(self.groups) if bar: bar.tick() # features if bar: bar.label("Saving features...") features = self.features.text if features is None: features = "" if formatVersion == 2: writer.writeFeatures(features) elif formatVersion == 1: classes, features = splitFeaturesForFontLab(features) if classes: fontLib["org.robofab.opentype.classes"] = classes.strip() + "\n" if features: featureDict = {} for featureName, featureText in features: featureDict[featureName] = featureText.strip() + "\n" fontLib["org.robofab.opentype.features"] = featureDict fontLib["org.robofab.opentype.featureorder"] = [featureName for featureName, featureText in features] if bar: bar.tick() # lib if formatVersion == 1: fontLib[postScriptHintDataLibKey] = self.psHints.asDict() if bar: bar.label("Saving lib...") writer.writeLib(fontLib) if bar: bar.tick() # glyphs glyphNameToFileNameFunc = self.getGlyphNameToFileNameFunc() glyphSet = writer.getGlyphSet(glyphNameToFileNameFunc) if len(self._scheduledForDeletion) != 0: if bar: bar.label("Removing deleted glyphs...") for glyphName in self._scheduledForDeletion: if glyphSet.has_key(glyphName): glyphSet.deleteGlyph(glyphName) if bar: bar.tick() if bar: bar.label("Saving glyphs...") count = nonGlyphCount if saveAs: glyphNames = self.keys() else: glyphNames = self._object.keys() for glyphName in glyphNames: glyph = self[glyphName] glyph.psHints._saveToLib(glyph.lib) glyph._saveToGlyphSet(glyphSet, glyphName=glyphName, force=saveAs) if bar and not count % 10: bar.tick(count) count = count + 1 glyphSet.writeContents() self._glyphSet = glyphSet # only blindly stop if the user says to except KeyboardInterrupt: bar.close() bar = None # kill the progress bar if bar: bar.close() # reset internal stuff self._path = destDir self._scheduledForDeletion = [] self.setChanged(False)
def save(self, destDir=None, doProgress=False, formatVersion=2): """Save the Font in UFO format.""" # XXX note that when doing "save as" by specifying the destDir argument # _all_ glyphs get loaded into memory. This could be optimized by either # copying those .glif files that have not been edited or (not sure how # well that would work) by simply clearing out self._objects after the # save. from robofab.ufoLib import UFOWriter from robofab.tools.fontlabFeatureSplitter import splitFeaturesForFontLab # if no destination is given, or if # the given destination is the current # path, this is not a save as operation if destDir is None or destDir == self._path: saveAs = False destDir = self._path else: saveAs = True # start a progress bar nonGlyphCount = 5 bar = None if doProgress: from robofab.interface.all.dialogs import ProgressBar bar = ProgressBar("Exporting UFO", nonGlyphCount + len(self._object.keys())) # write writer = UFOWriter(destDir, formatVersion=formatVersion) try: # make a shallow copy of the lib. stuff may be added to it. fontLib = dict(self.lib) # info if bar: bar.label("Saving info...") writer.writeInfo(self.info) if bar: bar.tick() # kerning if self.kerning.changed or saveAs: if bar: bar.label("Saving kerning...") writer.writeKerning(self.kerning.asDict()) if bar: bar.tick() # groups if bar: bar.label("Saving groups...") writer.writeGroups(self.groups) if bar: bar.tick() # features if bar: bar.label("Saving features...") features = self.features.text if features is None: features = "" if formatVersion == 2: writer.writeFeatures(features) elif formatVersion == 1: classes, features = splitFeaturesForFontLab(features) if classes: fontLib["org.robofab.opentype.classes"] = classes.strip( ) + "\n" if features: featureDict = {} for featureName, featureText in features: featureDict[featureName] = featureText.strip() + "\n" fontLib["org.robofab.opentype.features"] = featureDict fontLib["org.robofab.opentype.featureorder"] = [ featureName for featureName, featureText in features ] if bar: bar.tick() # lib if formatVersion == 1: fontLib[postScriptHintDataLibKey] = self.psHints.asDict() if bar: bar.label("Saving lib...") writer.writeLib(fontLib) if bar: bar.tick() # glyphs glyphNameToFileNameFunc = self.getGlyphNameToFileNameFunc() glyphSet = writer.getGlyphSet(glyphNameToFileNameFunc) if len(self._scheduledForDeletion) != 0: if bar: bar.label("Removing deleted glyphs...") for glyphName in self._scheduledForDeletion: if glyphSet.has_key(glyphName): glyphSet.deleteGlyph(glyphName) if bar: bar.tick() if bar: bar.label("Saving glyphs...") count = nonGlyphCount if saveAs: glyphNames = self.keys() else: glyphNames = self._object.keys() for glyphName in glyphNames: glyph = self[glyphName] glyph.psHints._saveToLib(glyph.lib) glyph._saveToGlyphSet(glyphSet, glyphName=glyphName, force=saveAs) if bar and not count % 10: bar.tick(count) count = count + 1 glyphSet.writeContents() self._glyphSet = glyphSet # only blindly stop if the user says to except KeyboardInterrupt: bar.close() bar = None # kill the progress bar if bar: bar.close() # reset internal stuff self._path = destDir self._scheduledForDeletion = [] self.setChanged(False)
def buildAccents(self, clear=True, adjustWidths=True, markGlyph=True, doProgress=True): """build accented glyphs. some flag definitions: clear=1 clear the glyphs if they already exist markGlyph=1 mark the glyph that is created doProgress=1 show a progress bar adjustWidths=1 will fix right and left margins when left or right accents are added""" tickCount = len(self.accentList) if doProgress: bar = ProgressBar('Building accented glyphs...', tickCount) tick = 0 for glyphName in self.accentList: if doProgress: bar.label(glyphName) existError = False anchorError = False baseName, stripedSuffixName, accentNames, errors = nameBuster( glyphName, self.glyphConstructions) if len(errors) > 0: existError = True for accentError in errors: self.accentErrors.append(accentError) if not existError: baseAnchors = [] try: self.font[baseName] except IndexError: self.accentErrors.append('%s: %s does not exist.' % (glyphName, baseName)) existError = True else: for anchor in self.font[baseName].anchors: baseAnchors.append(anchor.name) for accentName, accentPosition in accentNames: accentAnchors = [] try: self.font[accentName] except IndexError: self.accentErrors.append('%s: %s does not exist.' % (glyphName, accentName)) existError = True else: for anchor in self.font[accentName].getAnchors(): accentAnchors.append(anchor.name) if accentPosition not in baseAnchors: self.accentErrors.append( '%s: %s not in %s anchors.' % (glyphName, accentPosition, baseName)) anchorError = True if ''.join(['_', accentPosition]) not in accentAnchors: self.accentErrors.append( '%s: %s not in %s anchors.' % (glyphName, ''.join(['_', accentPosition ]), accentName)) anchorError = True if not existError and not anchorError: destination = self.font.compileGlyph( glyphName, baseName, self.glyphConstructions[stripedSuffixName][1:], adjustWidths) if markGlyph: destination.mark = accentColor if doProgress: bar.tick(tick) tick = tick + 1 if doProgress: bar.close()
def buildAnchors(self, ucXOffset=0, ucYOffset=0, lcXOffset=0, lcYOffset=0, markGlyph=True, doProgress=True): """add the necessary anchors to the glyphs if they don't exist some flag definitions: uc/lc/X/YOffset=20 offset values for the anchors markGlyph=1 mark the glyph that is created doProgress=1 show a progress bar""" accentOffset = 10 tickCount = len(self.accentList) if doProgress: bar = ProgressBar('Adding anchors...', tickCount) tick = 0 for glyphName in self.accentList: if doProgress: bar.label(glyphName) previousPositions = {} baseName, stripedSuffixName, accentNames, errors = nameBuster( glyphName, self.glyphConstructions) existError = False if len(errors) > 0: existError = True for anchorError in errors: self.anchorErrors.append(anchorError) if not existError: existError = False try: self.font[baseName] except IndexError: self.anchorErrors.append(' '.join( [glyphName, ':', baseName, 'does not exist.'])) existError = True for accentName, accentPosition in accentNames: try: self.font[accentName] except IndexError: self.anchorErrors.append(' '.join( [glyphName, ':', accentName, 'does not exist.'])) existError = True if not existError: #glyph = self.font.newGlyph(glyphName, clear=True) for accentName, accentPosition in accentNames: if baseName.split('.')[0] in lowercase_plain: xOffset = lcXOffset - accentOffset yOffset = lcYOffset - accentOffset else: xOffset = ucXOffset - accentOffset yOffset = ucYOffset - accentOffset # should I add a cedilla and ogonek yoffset override here? if accentPosition not in previousPositions.keys(): self._dropAnchor(self.font[baseName], accentPosition, xOffset, yOffset) if markGlyph: self.font[baseName].mark = anchorColor if inFontLab: self.font[baseName].update() else: self._dropAnchor( self.font[previousPositions[accentPosition]], accentPosition, xOffset, yOffset) self._dropAnchor(self.font[accentName], accentPosition, accentOffset, accentOffset, doAccentPosition=1) previousPositions[accentPosition] = accentName if markGlyph: self.font[accentName].mark = anchorColor if inFontLab: self.font[accentName].update() if inFontLab: self.font.update() if doProgress: bar.tick(tick) tick = tick + 1 if doProgress: bar.close()
"""Correct contour direction for all glyphs in the font""" from robofab.world import OpenFont from robofab.interface.all.dialogs import ProgressBar font = OpenFont() bar = ProgressBar('Correcting contour direction...', len(font)) for glyph in font: bar.label(glyph.name) glyph.correctDirection() glyph.update() bar.tick() font.update() bar.close()
def buildAnchors(self, ucXOffset=0, ucYOffset=0, lcXOffset=0, lcYOffset=0, markGlyph=True, doProgress=True): """add the necessary anchors to the glyphs if they don't exist some flag definitions: uc/lc/X/YOffset=20 offset values for the anchors markGlyph=1 mark the glyph that is created doProgress=1 show a progress bar""" accentOffset = 10 tickCount = len(self.accentList) if doProgress: bar = ProgressBar('Adding anchors...', tickCount) tick = 0 for glyphName in self.accentList: if doProgress: bar.label(glyphName) previousPositions = {} baseName, stripedSuffixName, accentNames, errors = nameBuster(glyphName, self.glyphConstructions) existError = False if len(errors) > 0: existError = True for anchorError in errors: self.anchorErrors.append(anchorError) if not existError: existError = False try: self.font[baseName] except IndexError: self.anchorErrors.append(' '.join([glyphName, ':', baseName, 'does not exist.'])) existError = True for accentName, accentPosition in accentNames: try: self.font[accentName] except IndexError: self.anchorErrors.append(' '.join([glyphName, ':', accentName, 'does not exist.'])) existError = True if not existError: #glyph = self.font.newGlyph(glyphName, clear=True) for accentName, accentPosition in accentNames: if baseName.split('.')[0] in lowercase_plain: xOffset = lcXOffset-accentOffset yOffset = lcYOffset-accentOffset else: xOffset = ucXOffset-accentOffset yOffset = ucYOffset-accentOffset # should I add a cedilla and ogonek yoffset override here? if accentPosition not in previousPositions.keys(): self._dropAnchor(self.font[baseName], accentPosition, xOffset, yOffset) if markGlyph: self.font[baseName].mark = anchorColor if inFontLab: self.font[baseName].update() else: self._dropAnchor(self.font[previousPositions[accentPosition]], accentPosition, xOffset, yOffset) self._dropAnchor(self.font[accentName], accentPosition, accentOffset, accentOffset, doAccentPosition=1) previousPositions[accentPosition] = accentName if markGlyph: self.font[accentName].mark = anchorColor if inFontLab: self.font[accentName].update() if inFontLab: self.font.update() if doProgress: bar.tick(tick) tick = tick+1 if doProgress: bar.close()
"""Correct contour direction for all glyphs in the font""" from robofab.world import OpenFont from robofab.interface.all.dialogs import ProgressBar font = OpenFont() bar = ProgressBar('Correcting contour direction...', len(font)) for glyph in font: bar.label(glyph.name) glyph.correctDirection() glyph.update() bar.tick() font.update() bar.close()