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

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