def getDigests(font): digests = {} for glyphName in font.keys(): pen = DigestPointPen() font[glyphName].drawPoints(pen) digests[glyphName] = pen.getDigest() return digests
def __init__(self, glyph, soft=False): p = DigestPointPen(ignoreSmoothAndName=True) glyph.drawPoints(p) self.digest = p.getDigest() self.glyph = MathGlyph(glyph) self.t = time.time() self.name = glyph.name self.soft = soft
def getDigest(dGlyph): """copied from robofab ObjectsBase.py. """ mp = DigestPointPen() dGlyph.drawPoints(mp) digest = mp.getDigestPointsOnly(needSort=False) # we need to round to int. intDigest = digest #[ (int(p[0]), int(p[1])) for p in digest] return intDigest
def Glyph2String(glyph): from robofab.pens.digestPen import DigestPointPen import pickle p = DigestPointPen(glyph) glyph.drawPoints(p) info = {} info['name'] = glyph.name info['width'] = glyph.width info['points'] = p.getDigest() return str(pickle.dumps(info))
def testSegmentPenInterface(self): for glyph in self.font: digestPen = DigestPointPen(ignoreSmoothAndName=True) pen = SegmentToPointPen(digestPen) glyph.draw(pen) digest1 = digestPen.getDigest() digestPen = DigestPointPen(ignoreSmoothAndName=True) glyph.drawPoints(digestPen) digest2 = digestPen.getDigest() self.assertEqual(digest1, digest2, "%r not the same for gl.draw() and gl.drawPoints()" % glyph.name)
def _doTest(self, shapeFunc, shapeName): pen = DigestPointPen(ignoreSmoothAndName=True) shapeFunc(pen) digest1 = pen.getDigest() digestPen = DigestPointPen(ignoreSmoothAndName=True) pen = PointToSegmentPen(SegmentToPointPen(digestPen)) shapeFunc(pen) digest2 = digestPen.getDigest() self.assertEqual(digest1, digest2, "%r failed round tripping" % shapeName)
def testFabPenCompatibility(self): for glyph in self.font: digestPen = DigestPointPen(ignoreSmoothAndName=True) pen = FabToFontToolsPenAdapter(SegmentToPointPen(digestPen)) glyph.draw(pen) digest1 = digestPen.getDigest() digestPen = DigestPointPen(ignoreSmoothAndName=True) glyph.drawPoints(digestPen) digest2 = digestPen.getDigest() self.assertEqual(digest1, digest2, "%r not the same for gl.draw() and gl.drawPoints()" % glyph.name)
def testReversContourFromGlyphSet(self): glyphSet = GlyphSet(getDemoFontGlyphSetPath()) digestPen = DigestPointPen() glyphSet["testglyph1"].drawPoints(digestPen) digest1 = digestPen.getDigest() digestPen = DigestPointPen() pen = ReverseContourPointPen(digestPen) glyphSet["testglyph1.reversed"].drawPoints(pen) digest2 = digestPen.getDigest() self.assertEqual(digest1, digest2)
def testMoveGlyph(self): for glyph in self.font: pen = DigestPointPen() glyph.drawPoints(pen) digest1 = pen.getDigest() glyph.move((100, 200)) glyph.move((-100, -200)) pen = DigestPointPen() glyph.drawPoints(pen) digest2 = pen.getDigest() self.assertEqual(digest1, digest2, "%r not the same after moving twice" % glyph.name)
def testScaleGlyph(self): for glyph in self.font: pen = DigestPointPen() glyph.drawPoints(pen) digest1 = pen.getDigest() glyph.scale((2, 2)) glyph.scale((.5, .5)) pen = DigestPointPen() glyph.drawPoints(pen) digest2 = pen.getDigest() self.assertEqual(digest1, digest2, "%r not the same after scaling twice" % glyph.name)
def testGuessSmoothPen(self): glyphSet = GlyphSet(getDemoFontGlyphSetPath()) for name in glyphSet.keys(): digestPen = DigestPointPen() glyphSet[name].drawPoints(digestPen) digest1 = digestPen.getDigest() digestPen = DigestPointPen() pen = GuessSmoothPointPen(digestPen) glyphSet[name].drawPoints(pen) digest2 = digestPen.getDigest() self.assertEqual(digest1, digest2)
def testAppendSegment(self): for glyph in self.font: pen = DigestPointPen() glyph.drawPoints(pen) digest1 = pen.getDigest() for contour in glyph: contour.insertSegment(2, "curve", [(100, 100), (200, 200), (300, 300)]) contour.removeSegment(2) pen = DigestPointPen() glyph.drawPoints(pen) digest2 = pen.getDigest() self.assertEqual(digest1, digest2, "%r not the same after inserting and removing segment" % glyph.name)
def testStartSegment(self): for glyph in self.font: pen = DigestPointPen() glyph.drawPoints(pen) digest1 = pen.getDigest() for contour in glyph: contour.setStartSegment(2) contour.setStartSegment(-2) pen = DigestPointPen() glyph.drawPoints(pen) digest2 = pen.getDigest() self.assertEqual(digest1, digest2, "%r not the same after seting start segment twice" % glyph.name)
def testReverseContour(self): for glyph in self.font: pen = DigestPointPen() glyph.drawPoints(pen) digest1 = pen.getDigest() for contour in glyph: contour.reverseContour() contour.reverseContour() pen = DigestPointPen() glyph.drawPoints(pen) digest2 = pen.getDigest() self.assertEqual(digest1, digest2, "%r not the same after reversing twice" % glyph.name)
def testDigestGlyph(glyph): from robofab.pens.digestPen import DigestPointPen pen = DigestPointPen() glyph.draw(pen) return ( glyph.name, glyph.width, glyph.unicode, glyph.mark, glyph.note, pen.getDigest() )
def testCopyGlyph(self): for glyph in self.font: pen = DigestPointPen() glyph.drawPoints(pen) digest1 = pen.getDigest() copy = glyph.copy() pen = DigestPointPen() copy.drawPoints(pen) digest2 = pen.getDigest() self.assertEqual(digest1, digest2, "%r not the same after copying" % glyph.name) self.assertEqual(glyph.lib, copy.lib, "%r's lib not the same after copying" % glyph.name) self.assertEqual(glyph.width, copy.width, "%r's width not the same after copying" % glyph.name) self.assertEqual(glyph.unicodes, copy.unicodes, "%r's unicodes not the same after copying" % glyph.name)
def testReverseContourOpenPath(self): digestPen = DigestPointPen() TestShapes.openPath(digestPen) d1 = digestPen.getDigest() digestPen = DigestPointPen() pen = ReverseContourPointPen(digestPen) pen.beginPath() pen.addPoint((600, 100), "move") pen.addPoint((600, 600), "line") pen.addPoint((100, 600), "line") pen.addPoint((100, 100), "line") pen.endPath() d2 = digestPen.getDigest() self.assertEqual(d1, d2)
def testDuplicateContours(self, glyph): """ Contours shouldn't be duplicated on each other. """ contours = {} for index, contour in enumerate(glyph): contour = contour.copy() contour.autoStartSegment() pen = DigestPointPen() contour.drawPoints(pen) digest = pen.getDigest() if digest not in contours: contours[digest] = [] contours[digest].append(index) duplicateContours = [] for digest, indexes in contours.items(): if len(indexes) > 1: duplicateContours.append(indexes[0]) glyph.mark = (1, 0, 0, 0.6)
def testDuplicateContours(glyph): """ Contours shouldn't be duplicated on each other. """ contours = {} for index, contour in enumerate(glyph): contour = contour.copy() contour.autoStartSegment() pen = DigestPointPen() contour.drawPoints(pen) digest = pen.getDigest() if digest not in contours: contours[digest] = [] contours[digest].append(index) duplicateContours = [] for digest, indexes in contours.items(): if len(indexes) > 1: duplicateContours.append(indexes[0]) return duplicateContours
def test_duplicate_contours(self): """ One or more contours are duplicated. """ font = robofab.world.OpenFont(self.operator.path) for glyph in font: contours = {} for index, contour in enumerate(glyph): contour = contour.copy() contour.autoStartSegment() pen = DigestPointPen() contour.drawPoints(pen) digest = pen.getDigest() if digest not in contours: contours[digest] = [] contours[digest].append(index) duplicateContours = [] for digest, indexes in contours.items(): if len(indexes) > 1: duplicateContours.append(indexes[0]) if duplicateContours: self.fail('{0} has duplicated contours {1}'.format(glyph.name, duplicateContours))
def testSegmentPenInterface(self): for glyph in self.font: digestPen = DigestPointPen(ignoreSmoothAndName=True) pen = SegmentToPointPen(digestPen) glyph.draw(pen) digest1 = digestPen.getDigest() digestPen = DigestPointPen(ignoreSmoothAndName=True) glyph.drawPoints(digestPen) digest2 = digestPen.getDigest() self.assertEqual( digest1, digest2, "%r not the same for gl.draw() and gl.drawPoints()" % glyph.name)
def testFabPenCompatibility(self): for glyph in self.font: digestPen = DigestPointPen(ignoreSmoothAndName=True) pen = FabToFontToolsPenAdapter(SegmentToPointPen(digestPen)) glyph.draw(pen) digest1 = digestPen.getDigest() digestPen = DigestPointPen(ignoreSmoothAndName=True) glyph.drawPoints(digestPen) digest2 = digestPen.getDigest() self.assertEqual( digest1, digest2, "%r not the same for gl.draw() and gl.drawPoints()" % glyph.name)
def testScaleGlyph(self): for glyph in self.font: pen = DigestPointPen() glyph.drawPoints(pen) digest1 = pen.getDigest() glyph.scale((2, 2)) glyph.scale((.5, .5)) pen = DigestPointPen() glyph.drawPoints(pen) digest2 = pen.getDigest() self.assertEqual( digest1, digest2, "%r not the same after scaling twice" % glyph.name)
def testReverseContour(self): for glyph in self.font: pen = DigestPointPen() glyph.drawPoints(pen) digest1 = pen.getDigest() for contour in glyph: contour.reverseContour() contour.reverseContour() pen = DigestPointPen() glyph.drawPoints(pen) digest2 = pen.getDigest() self.assertEqual( digest1, digest2, "%r not the same after reversing twice" % glyph.name)
def testStartSegment(self): for glyph in self.font: pen = DigestPointPen() glyph.drawPoints(pen) digest1 = pen.getDigest() for contour in glyph: contour.setStartSegment(2) contour.setStartSegment(-2) pen = DigestPointPen() glyph.drawPoints(pen) digest2 = pen.getDigest() self.assertEqual( digest1, digest2, "%r not the same after seting start segment twice" % glyph.name)
def testAppendSegment(self): for glyph in self.font: pen = DigestPointPen() glyph.drawPoints(pen) digest1 = pen.getDigest() for contour in glyph: contour.insertSegment(2, "curve", [(100, 100), (200, 200), (300, 300)]) contour.removeSegment(2) pen = DigestPointPen() glyph.drawPoints(pen) digest2 = pen.getDigest() self.assertEqual( digest1, digest2, "%r not the same after inserting and removing segment" % glyph.name)
def testCopyGlyph(self): for glyph in self.font: pen = DigestPointPen() glyph.drawPoints(pen) digest1 = pen.getDigest() copy = glyph.copy() pen = DigestPointPen() copy.drawPoints(pen) digest2 = pen.getDigest() self.assertEqual(digest1, digest2, "%r not the same after copying" % glyph.name) self.assertEqual( glyph.lib, copy.lib, "%r's lib not the same after copying" % glyph.name) self.assertEqual( glyph.width, copy.width, "%r's width not the same after copying" % glyph.name) self.assertEqual( glyph.unicodes, copy.unicodes, "%r's unicodes not the same after copying" % glyph.name)
def makeGlyph(glyphList, font, message, mark, saveBackup): # Initialize the progress bar tickCount = len(glyphList) bar = ProgressBar(message, tickCount) tick = 0 testingFont = _RFont() for item in glyphList: glyphName, advanceWidth, components = item # If the font has the glyph, lots of checking is required to see if changes have been made if font.has_key(glyphName): glyph = font[glyphName] #Build new glyph for comparisons testingFont.newGlyph(glyphName, clear=True) newGlyph = testingFont[glyphName] newGlyphCount = 0 while newGlyphCount < len(components): component, x, y = components[newGlyphCount] newGlyph.appendComponent(component, offset=(x,y)) newGlyphCount = newGlyphCount+1 newGlyph.width = advanceWidth newGlyph.round() # Make digest of the new glyph pointPen = DigestPointPen() newGlyph.drawPoints(pointPen) newDigest = pointPen.getDigest() # Make digest of the old glyph pointPen = DigestPointPen() glyph.drawPoints(pointPen) oldDigest = pointPen.getDigest() # Check the advance width if glyph.width != advanceWidth: glyph.width = advanceWidth if mark == 1: glyph.mark = 200 # If the digests don't match, rebuild components if oldDigest != newDigest: if saveBackup == 1: backupName = glyph.name + '.bkup' font.insertGlyph(glyph, as=backupName) font[backupName].update() glyph.clearComponents() count = 0 while count < len(components): component, x, y = components[count] glyph.appendComponent(component, offset=(x,y)) count = count+1 if mark == 1: glyph.mark = 200 # Clean up things glyph.update() bar.tick(tick) tick = tick+1 # If the glyph is not in the font, build a new glyph else: font.newGlyph(glyphName, clear=True) glyph = font[glyphName] glyph.width = advanceWidth count = 0 while count < len(components): component, x, y = components[count] glyph.appendComponent(component, offset=(x,y)) count = count+1 if mark == 1: glyph.mark = 300 glyph.update() bar.tick(tick) tick = tick+1 font.update() testingFont.close() bar.close()
f1_glyphset = set(f1.keys()) f2_glyphset = set(f2.keys()) commonGlyphs = list(f1_glyphset.intersection(f2_glyphset)) notSameGlyphsList = [] sameGlyphsList = [] blankGlyphsList = [] blankGlyphsString = "" notSameGlyphsString = "" sameGlyphsString = "" for g in commonGlyphs: g1 = f1[g] g2 = f2[g] p1 = DigestPointPen() g1.drawPoints(p1) d1 = p1.getDigest() p2 = DigestPointPen() g2.drawPoints(p2) d2 = p2.getDigest() if d1 != d2: notSameGlyphsList += [str(g)] if d1 == () or d2 == (): blankGlyphsList += [str(g)] else: sameGlyphsList += [str(g)] # Sort the lists
base = os.path.split(os.path.split(__file__)[0])[0] masterPath = os.path.join(base, 'sources/2-build') paths = [] for filename in os.listdir(masterPath): if filename.endswith('.ufo'): paths.append(os.path.join(masterPath, filename)) srcPath = os.path.join(masterPath, 'Decovar-Regular24.ufo') src = OpenFont(srcPath, showUI=False) for path in paths: f = OpenFont(path, showUI=False) for g in f: if src.has_key(g.name): destPen = DigestPointPen() g.drawPoints(destPen) destDigest = destPen.getDigest() srcPen = DigestPointPen() src[g.name].drawPoints(srcPen) srcDigest = srcPen.getDigest() if destDigest == srcDigest: g.mark = (0, .5, 1, .5) f.save() f.close() print 'done'
def testDigestGlyph(glyph): from robofab.pens.digestPen import DigestPointPen pen = DigestPointPen() glyph.draw(pen) return (glyph.name, glyph.width, glyph.unicode, glyph.mark, glyph.note, pen.getDigest())
def getDigest(dGlyph): """copied from robofab ObjectsBase.py. """ mp = DigestPointPen() dGlyph.drawPoints(mp) return mp.getDigestPointsOnly(needSort=True)
f1_glyphset = set(f1.keys()) f2_glyphset = set(f2.keys()) commonGlyphs = list(f1_glyphset.intersection(f2_glyphset)) notSameGlyphsList = [] sameGlyphsList = [] blankGlyphsList = [] blankGlyphsString = "" notSameGlyphsString = "" sameGlyphsString = "" for g in commonGlyphs: g1 = f1[g] g2 = f2[g] p1 = DigestPointPen() g1.drawPoints(p1) d1 = p1.getDigest() p2 = DigestPointPen() g2.drawPoints(p2) d2 = p2.getDigest() if d1 != d2: notSameGlyphsList += [g] if d1 == () or d2 == (): blankGlyphsList += [g] else: sameGlyphsList += [g] blankGlyphsString = '/{0}'.format('/'.join(blankGlyphsList))
# robofab manual # Usepens howto # attribute examples from robofab.world import OpenFont from robofab.pens.digestPen import DigestPointPen f = OpenFont() myPen = DigestPointPen() f['period'].drawPoints(myPen) print myPen.getDigest()
from robofab.world import SelectFont, NewFont from robofab.pens.digestPen import DigestPointPen from sets import Set font1 = SelectFont("Select base font") font2 = SelectFont("Select alternate font") font1Names = Set(font1.keys()) font2Names = Set(font2.keys()) commonNames = font1Names & font2Names uncommonNames = font2Names - font1Names for glyphName in commonNames: glyph1 = font1[glyphName] pointPen = DigestPointPen() glyph1.drawPoints(pointPen) digest1 = pointPen.getDigest() glyph2 = font2[glyphName] pointPen = DigestPointPen() glyph2.drawPoints(pointPen) digest2 = pointPen.getDigest() if digest1 != digest2: print '> alt >', glyphName glyph3 = font1.insertGlyph(glyph2, name=glyphName+'.alt') glyph3.mark = 1 glyph3.update() for glyphName in uncommonNames:
from robofab.world import SelectFont, NewFont from robofab.pens.digestPen import DigestPointPen from sets import Set font1 = SelectFont("Select base font") font2 = SelectFont("Select alternate font") font1Names = Set(font1.keys()) font2Names = Set(font2.keys()) commonNames = font1Names & font2Names uncommonNames = font2Names - font1Names for glyphName in commonNames: glyph1 = font1[glyphName] pointPen = DigestPointPen() glyph1.drawPoints(pointPen) digest1 = pointPen.getDigest() glyph2 = font2[glyphName] pointPen = DigestPointPen() glyph2.drawPoints(pointPen) digest2 = pointPen.getDigest() if digest1 != digest2: print '> alt >', glyphName # note: as of robofab svn version 200, the "as" argument in insertGlyph has changed to "name" glyph3 = font1.insertGlyph(glyph2, name=glyphName + '.alt') glyph3.mark = 1 glyph3.update()