예제 #1
0
 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()
예제 #2
0
	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()
예제 #3
0
	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()
예제 #4
0
	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)
예제 #5
0
    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)
예제 #6
0
    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()
예제 #7
0
    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()
예제 #8
0
"""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()
예제 #9
0
	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()	
예제 #10
0
"""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()