You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
4.8 KiB
139 lines
4.8 KiB
from fontTools.misc.transform import Identity
|
|
from fontTools.pens.hashPointPen import HashPointPen
|
|
import pytest
|
|
|
|
|
|
class _TestGlyph(object):
|
|
width = 500
|
|
|
|
def drawPoints(self, pen):
|
|
pen.beginPath(identifier="abc")
|
|
pen.addPoint((0.0, 0.0), "line", False, "start", identifier="0000")
|
|
pen.addPoint((10, 110), "line", False, None, identifier="0001")
|
|
pen.addPoint((50.0, 75.0), None, False, None, identifier="0002")
|
|
pen.addPoint((60.0, 50.0), None, False, None, identifier="0003")
|
|
pen.addPoint((50.0, 0.0), "curve", True, "last", identifier="0004")
|
|
pen.endPath()
|
|
|
|
|
|
class _TestGlyph2(_TestGlyph):
|
|
def drawPoints(self, pen):
|
|
pen.beginPath(identifier="abc")
|
|
pen.addPoint((0.0, 0.0), "line", False, "start", identifier="0000")
|
|
# Minor difference to _TestGlyph() is in the next line:
|
|
pen.addPoint((101, 10), "line", False, None, identifier="0001")
|
|
pen.addPoint((50.0, 75.0), None, False, None, identifier="0002")
|
|
pen.addPoint((60.0, 50.0), None, False, None, identifier="0003")
|
|
pen.addPoint((50.0, 0.0), "curve", True, "last", identifier="0004")
|
|
pen.endPath()
|
|
|
|
|
|
class _TestGlyph3(_TestGlyph):
|
|
def drawPoints(self, pen):
|
|
pen.beginPath(identifier="abc")
|
|
pen.addPoint((0.0, 0.0), "line", False, "start", identifier="0000")
|
|
pen.addPoint((10, 110), "line", False, None, identifier="0001")
|
|
pen.endPath()
|
|
# Same segment, but in a different path:
|
|
pen.beginPath(identifier="pth2")
|
|
pen.addPoint((50.0, 75.0), None, False, None, identifier="0002")
|
|
pen.addPoint((60.0, 50.0), None, False, None, identifier="0003")
|
|
pen.addPoint((50.0, 0.0), "curve", True, "last", identifier="0004")
|
|
pen.endPath()
|
|
|
|
|
|
class _TestGlyph4(_TestGlyph):
|
|
def drawPoints(self, pen):
|
|
pen.beginPath(identifier="abc")
|
|
pen.addPoint((0.0, 0.0), "move", False, "start", identifier="0000")
|
|
pen.addPoint((10, 110), "line", False, None, identifier="0001")
|
|
pen.addPoint((50.0, 75.0), None, False, None, identifier="0002")
|
|
pen.addPoint((60.0, 50.0), None, False, None, identifier="0003")
|
|
pen.addPoint((50.0, 0.0), "curve", True, "last", identifier="0004")
|
|
pen.endPath()
|
|
|
|
|
|
class _TestGlyph5(_TestGlyph):
|
|
def drawPoints(self, pen):
|
|
pen.addComponent("b", Identity)
|
|
|
|
|
|
class HashPointPenTest(object):
|
|
def test_addComponent(self):
|
|
pen = HashPointPen(_TestGlyph().width, {"a": _TestGlyph()})
|
|
pen.addComponent("a", (2, 0, 0, 3, -10, 5))
|
|
assert pen.hash == "w500[l0+0l10+110o50+75o60+50c50+0|(+2+0+0+3-10+5)]"
|
|
|
|
def test_NestedComponents(self):
|
|
pen = HashPointPen(
|
|
_TestGlyph().width, {"a": _TestGlyph5(), "b": _TestGlyph()}
|
|
) # "a" contains "b" as a component
|
|
pen.addComponent("a", (2, 0, 0, 3, -10, 5))
|
|
|
|
assert (
|
|
pen.hash
|
|
== "w500[[l0+0l10+110o50+75o60+50c50+0|(+1+0+0+1+0+0)](+2+0+0+3-10+5)]"
|
|
)
|
|
|
|
def test_outlineAndComponent(self):
|
|
pen = HashPointPen(_TestGlyph().width, {"a": _TestGlyph()})
|
|
glyph = _TestGlyph()
|
|
glyph.drawPoints(pen)
|
|
pen.addComponent("a", (2, 0, 0, 2, -10, 5))
|
|
|
|
assert (
|
|
pen.hash
|
|
== "w500l0+0l10+110o50+75o60+50c50+0|[l0+0l10+110o50+75o60+50c50+0|(+2+0+0+2-10+5)]"
|
|
)
|
|
|
|
def test_addComponent_missing_raises(self):
|
|
pen = HashPointPen(_TestGlyph().width, dict())
|
|
with pytest.raises(KeyError) as excinfo:
|
|
pen.addComponent("a", Identity)
|
|
assert excinfo.value.args[0] == "a"
|
|
|
|
def test_similarGlyphs(self):
|
|
pen = HashPointPen(_TestGlyph().width)
|
|
glyph = _TestGlyph()
|
|
glyph.drawPoints(pen)
|
|
|
|
pen2 = HashPointPen(_TestGlyph2().width)
|
|
glyph = _TestGlyph2()
|
|
glyph.drawPoints(pen2)
|
|
|
|
assert pen.hash != pen2.hash
|
|
|
|
def test_similarGlyphs2(self):
|
|
pen = HashPointPen(_TestGlyph().width)
|
|
glyph = _TestGlyph()
|
|
glyph.drawPoints(pen)
|
|
|
|
pen2 = HashPointPen(_TestGlyph3().width)
|
|
glyph = _TestGlyph3()
|
|
glyph.drawPoints(pen2)
|
|
|
|
assert pen.hash != pen2.hash
|
|
|
|
def test_similarGlyphs3(self):
|
|
pen = HashPointPen(_TestGlyph().width)
|
|
glyph = _TestGlyph()
|
|
glyph.drawPoints(pen)
|
|
|
|
pen2 = HashPointPen(_TestGlyph4().width)
|
|
glyph = _TestGlyph4()
|
|
glyph.drawPoints(pen2)
|
|
|
|
assert pen.hash != pen2.hash
|
|
|
|
def test_glyphVsComposite(self):
|
|
# If a glyph contains a component, the decomposed glyph should still
|
|
# compare false
|
|
pen = HashPointPen(_TestGlyph().width, {"a": _TestGlyph()})
|
|
pen.addComponent("a", Identity)
|
|
|
|
pen2 = HashPointPen(_TestGlyph().width)
|
|
glyph = _TestGlyph()
|
|
glyph.drawPoints(pen2)
|
|
|
|
assert pen.hash != pen2.hash
|