def deepAppendGlyph(self, glyph, gToAppend, offset=(0,0)):
		if not gToAppend.components:
			glyph.appendGlyph(gToAppend, offset)
		else:
			for component in gToAppend.components:
				compGlyph = self.font[component.baseGlyph].copy()

				# handle component transformations
				componentTransformation = component.transformation
				# when undoing a paste anchor or a delete anchor action, RoboFont returns component.transformation as a list instead of a tuple
				if type(componentTransformation) is list:
					componentTransformation = tuple(componentTransformation)
				if componentTransformation != (1, 0, 0, 1, 0, 0): # if component is skewed and/or is shifted
					matrix = componentTransformation[0:4]
					if matrix != (1, 0, 0, 1): # if component is skewed
						transformObj = Identity.transform(matrix + (0, 0)) # ignore the original component's shifting values
						compGlyph.transform(transformObj)

				glyph.appendGlyph(compGlyph, map(sum, zip(component.offset, offset))) # add the two tuples of offset
			for contour in gToAppend:
				glyph.appendContour(contour, offset)

		# if the assembled glyph still has components, recursively remove and replace them 1-by-1 by the glyphs they reference
		if glyph.components:
			nestedComponent = glyph.components[-1] # start from the end
			glyph.removeComponent(nestedComponent)
			glyph = self.deepAppendGlyph(glyph, self.font[nestedComponent.baseGlyph], nestedComponent.offset)

		return glyph
    def _deepAppendGlyph(self, glyph, gToAppend, font, offset=(0, 0)):
        if not gToAppend.components:
            glyph.appendGlyph(gToAppend, offset)
        else:
            for component in gToAppend.components:
                if component.baseGlyph not in font.keys():
                    # avoid traceback in the case where the selected glyph
                    # is referencing a component whose glyph is not in the font
                    continue

                compGlyph = font[component.baseGlyph].copy()

                if component.transformation != (1, 0, 0, 1, 0, 0):
                    # if component is skewed and/or is shifted:
                    matrix = component.transformation[0:4]
                    if matrix != (1, 0, 0, 1):  # if component is skewed
                        transformObj = Identity.transform(matrix + (0, 0))
                        # ignore the original component's shifting values
                        compGlyph.transform(transformObj)

                # add the two tuples of offset:
                totalOffset = tuple(map(sum, zip(component.offset, offset)))
                glyph.appendGlyph(compGlyph, totalOffset)

            for contour in gToAppend:
                glyph.appendContour(contour, offset)

        # if the assembled glyph still has components, recursively
        # remove and replace them 1-by-1 by the glyphs they reference:
        if glyph.components:
            nestedComponent = glyph.components[-1]
            glyph.removeComponent(nestedComponent)
            glyph = self._deepAppendGlyph(glyph, font[nestedComponent.baseGlyph], font, nestedComponent.offset)

        return glyph
    def deepAppendGlyph(self, glyph, gToAppend, offset=(0, 0)):
        if not gToAppend.components:
            glyph.appendGlyph(gToAppend, offset)
        else:
            for component in gToAppend.components:
                # avoid traceback in the case where the selected glyph is
                # referencing a component whose glyph is not in the font
                if component.baseGlyph not in self.font.keys():
                    print("WARNING: %s is referencing a glyph named %s, which "
                          "does not exist in the font." %
                          (self.font.selection[0], component.baseGlyph))
                    continue

                compGlyph = self.font[component.baseGlyph].copy()

                # handle component transformations
                componentTransformation = component.transformation
                # when undoing a paste anchor or a delete anchor action,
                # RoboFont returns component.transformation as a list instead
                # of a tuple
                if type(componentTransformation) is list:
                    componentTransformation = tuple(componentTransformation)
                # if component is skewed and/or is shifted
                if componentTransformation != (1, 0, 0, 1, 0, 0):
                    matrix = componentTransformation[0:4]
                    if matrix != (1, 0, 0, 1):  # if component is skewed
                        # ignore the original component's shifting values
                        if self.rf3:
                            compGlyph.transform(matrix + (0, 0))
                        else:
                            transformObj = Identity.transform(matrix + (0, 0))
                            compGlyph.transform(transformObj)

                # add the two tuples of offset
                glyph.appendGlyph(
                    compGlyph, tuple(map(sum, zip(component.offset, offset))))
            for contour in gToAppend:
                glyph.appendContour(contour, offset)

        # if the assembled glyph still has components, recursively
        # remove and replace them 1-by-1 by the glyphs they reference
        if glyph.components:
            nestedComponent = glyph.components[-1]  # start from the end
            glyph.removeComponent(nestedComponent)
            glyph = self.deepAppendGlyph(glyph,
                                         self.font[nestedComponent.baseGlyph],
                                         nestedComponent.offset)
        return glyph
Beispiel #4
0
    def _deepAppendGlyph(self, glyph, gToAppend, font, offset=(0, 0)):
        if not gToAppend.components:
            glyph.appendGlyph(gToAppend, offset)
        else:
            for component in gToAppend.components:
                if component.baseGlyph not in font.keys():
                    # avoid traceback in the case where the selected glyph
                    # is referencing a component whose glyph is not in the font
                    continue

                compGlyph = font[component.baseGlyph].copy()

                if component.transformation != (1, 0, 0, 1, 0, 0):
                    # if component is skewed and/or is shifted:
                    matrix = component.transformation[0:4]
                    if matrix != (1, 0, 0, 1):  # if component is skewed
                        transformObj = Identity.transform(matrix + (0, 0))
                        # ignore the original component's shifting values
                        compGlyph.transform(transformObj)

                # add the two tuples of offset:
                totalOffset = map(sum, zip(component.offset, offset))
                glyph.appendGlyph(compGlyph, totalOffset)

            for contour in gToAppend:
                glyph.appendContour(contour, offset)

        # if the assembled glyph still has components, recursively
        # remove and replace them 1-by-1 by the glyphs they reference:
        if glyph.components:
            nestedComponent = glyph.components[-1]
            glyph.removeComponent(nestedComponent)
            glyph = self._deepAppendGlyph(glyph,
                                          font[nestedComponent.baseGlyph],
                                          font, nestedComponent.offset)

        return glyph