Commit 8e37fa84 authored by Yao Wei (魏銘廷)'s avatar Yao Wei (魏銘廷)

New upstream version 0.8.1

parent 2f1987c2
sudo: false
language: python
python:
- 2.7
- 3.4
- 3.5
env:
global:
- TWINE_USERNAME="anthrotype"
- secure: grrVsFD+NUzbNZEv9HXhFh48VKnOWatSh4HRvO/k+DFn8iQvj1mXYXyNM7STOgX3lAxryJHpfcie1UvlE6JLPGvM8TKuq4lqtWlHCaDiNOIiaEp4EGxxhLkSz/Zf7D6501OP1hs/8kFO46QHJteOS0/SXcnIC0Fvq2hDqMb6GUoYKWGyxKwvSfT4AdVPWHEe/p2PNyWAMmJwnx1AwggnsxzDg6zAANCEAiEk7iU+gpNTgXmp+DWo/Av9hglidRjSdq8Fn0x4L+PxMxshJhIbdOB5cFS/Lq1LLBF8yqceht+hAj/pzQnIqE6ALYtXgHUxp/W0BJdJWX16m7TXm4NPWgmgRrRLR/amD+Mp5l1M9UHgwSOdQBU22CkF/hfor0b6ED4Q+Ap6ayy+g6cOp29okGLCMIjXxJU/9rIFjYQ5TFfmD2RvVhUj44e7azGyHNa9goro78mcM9on7a377guODVivVNANPTqm2ZEvLprWmLcz/dlEHFb4ODLvvh4x9hYLPZBF1A9j+qhAGuAFtmOPsPBAJzaSEDAu3DWtwYeGh1+RqagoNhLovB/qfz4YbFygWTj7oQfvmnE0wkAFGqR5EbgLl6o4FKvXl5ZpDj8q/gZdCjwi4VLSTguk0xlIfObLhKq73issjB3Jaxi4Pnl5KcnnhhgtvY3WGx27jMP2yB0=
matrix:
include:
- python: 2.7
- python: 3.6
- python: 3.7
# required to run python3.7 on Travis CI
# https://github.com/travis-ci/travis-ci/issues/9815
dist: xenial
install:
- pip install --upgrade pip setuptools wheel
- pip install tox-travis
......@@ -11,10 +21,20 @@ install:
# When building the distribution packages, we use git to determine the
# package version string (via setuptools_scm), hence we need to fetch
# the whole repo, and not just the last 50 commits.
- if [[ $TRAVIS_PYTHON_VERSION == 3.5 ]]; then git fetch --unshallow; fi
- if [[ $TRAVIS_PYTHON_VERSION == 3.6 ]]; then git fetch --unshallow; fi
script: tox
before_deploy:
- python setup.py sdist bdist_wheel
after_success:
# if it's a tagged commit, upload distribution packages to PyPI
- |
if [ -n "$TRAVIS_TAG" ] && [ "$TRAVIS_REPO_SLUG" == "typemytype/booleanOperations" ] && [ "$TRAVIS_PYTHON_VERSION" == "3.6" ]; then
pip install --upgrade twine pip setuptools wheel
python setup.py sdist
pip wheel --no-deps --wheel-dir dist .
twine upload dist/*.whl dist/*.zip
fi
deploy:
# deploy to Github Releases on tags
- provider: releases
......@@ -27,16 +47,4 @@ deploy:
repo: typemytype/booleanOperations
tags: true
all_branches: true
python: 3.5
# deploy to PyPI on tags
- provider: pypi
server: https://upload.pypi.org/legacy/
on:
repo: typemytype/booleanOperations
tags: true
all_branches: true
python: 3.5
user: anthrotype
password:
secure: B6rFOTA8ol1kt210q7USDVOzLFWUyMIwdZuaUdejYmUb0CXK6W8kKj0H01yBCgjkhtew9YEQSB62jFiGUOJH9L8JjpJO2RG8cHIIblXQfQ5DXogmcEtsAFotQz0o3UO/SYJaMY917XsPCqw3MTgksd2NWwO7H3YCjaWntN4zZxyTWowGr2Vhbj9s8e+MGMtrZ3Is91AcoXNI7HPj2oVhAtPP5GGpceIP7JlOGdHGUFJKuwJLRKVjEURWXN6ZOQNoxuG6KdkpGtJYCFgRCW65e48WpQs8lts/ByyOMyRItPIPI+K/cPOaIvZ7IUhu9SueBgKcW2YVzQrPzD07N5Lhb4LaKhqgMwpy7oWntnpO0/Xes7bonAoDYKPz7O3O3zl57fy1sVhGXZZNoGUfwyFz1PPecONavRpDQYCMEOq8BcENT86mf0xbAvtmTvBgos8NknmZ35ckUkyrye8t058CwW0yhEO2Pr36XPKoEP9EAiq2YRvINPYnI1T3jTPUUwnc3IAv4zQvPUKWqs2/hEVy8FTCz/0hBgDv2cs4pRcofTzfXSczGMfyuNS3i4n3CHc4FEOYP9MuEWGDC7KF4MVNsBWbh5pkISwhIwNbW1UDept2k+Dmb9XrSoCt5aSvEPJVT3YTA4qTGSUQvhzj1SvXi3s2lh+1WbibEJqNfpdobGg=
distributions: sdist bdist_wheel
python: 3.6
......@@ -2,14 +2,9 @@ from __future__ import print_function, division, absolute_import
import weakref
from copy import deepcopy
try:
from robofab.pens.pointPen import AbstractPointPen
from robofab.pens.adapterPens import PointToSegmentPen, SegmentToPointPen
from robofab.pens.boundsPen import BoundsPen
except:
from ufoLib.pointPen import (
AbstractPointPen, PointToSegmentPen, SegmentToPointPen)
from fontTools.pens.boundsPen import BoundsPen
from fontTools.pens.pointPen import (
AbstractPointPen, PointToSegmentPen, SegmentToPointPen)
from fontTools.pens.boundsPen import BoundsPen
from fontTools.pens.areaPen import AreaPen
from .booleanOperationManager import BooleanOperationManager
......
......@@ -79,15 +79,6 @@ def _performOperation(operation, subjectContours, clipContours, outPen):
# the input is expired if a match was made,
# so stop passing it to the outputs
break
# re-curve segments
for inputContour in inputContours:
# skip contours that were comppletely used in the previous step
if inputContour.used:
continue
# XXX this could be expensive if an input becomes completely used
# it doesn't stop from being passed to the output
for outputContour in outputContours:
outputContour.reCurveFromInputContourSegments(inputContour)
# curve fit
for outputContour in outputContours:
outputContour.reCurveSubSegments(inputContours)
......
......@@ -558,86 +558,6 @@ class OutputContour(object):
return True
return False
def reCurveFromInputContourSegments(self, inputContour):
return
# match individual segments
if self.clockwise:
inputSegments = inputContour.clockwiseSegments
else:
inputSegments = inputContour.counterClockwiseSegments
for inputSegment in inputSegments:
# skip used
if inputSegment.used:
continue
# skip if the input contains more points than the entire output contour
if len(inputSegment.flat) > len(self.segments):
continue
# skip if the input end is not in the contour
inputSegmentLastPoint = inputSegment.flat[-1]
outputFlat = [segment.points[-1] for segment in self.segments]
if inputSegmentLastPoint not in outputFlat:
continue
# work through all output segments
for outputSegmentIndex, outputSegment in enumerate(self.segments):
# skip finalized
if outputSegment.final:
continue
# skip if the output point doesn't match the input end
if outputSegment.points[-1] != inputSegmentLastPoint:
continue
# make a set of ranges for slicing the output into a testable list of points
inputLength = len(inputSegment.flat)
outputRanges = []
outputSegmentIndex += 1
if outputSegmentIndex - inputLength < 0:
r1 = (len(self.segments) + outputSegmentIndex - inputLength, len(self.segments))
outputRanges.append(r1)
r2 = (0, outputSegmentIndex)
outputRanges.append(r2)
else:
outputRanges.append((outputSegmentIndex - inputLength, outputSegmentIndex))
# gather the output segments
testableOutputSegments = []
for start, end in outputRanges:
testableOutputSegments += self.segments[start:end]
# create a list of points
test = []
for s in testableOutputSegments:
# stop if a segment is final
if s.final:
test = None
break
test.append(s.points[-1])
if test == inputSegment.flat and inputSegment.segmentType != "line":
# insert new segment
newSegment = OutputSegment(
segmentType=inputSegment.segmentType,
points=[
OutputPoint(
coordinates=point.coordinates,
segmentType=point.segmentType,
smooth=point.smooth,
name=point.name,
kwargs=point.kwargs
)
for point in inputSegment.points
],
final=True
)
self.segments.insert(outputSegmentIndex, newSegment)
# remove old segments
# XXX this is sloppy
for start, end in outputRanges:
if start > outputSegmentIndex:
start += 1
end += 1
del self.segments[start:end]
# flag the original as used
inputSegment.used = True
break
# ? match line start points (to prevent curve fit in shortened line)
return False
def reCurveSubSegmentsCheckInputContoursOnHasCurve(self, inputContours):
# test is the remaining input contours contains only lineTo points
# XXX could be cached
......
......@@ -3,7 +3,7 @@
BooleanOperations
=================
Boolean operations on paths based on a super fast `polygon clipper
Boolean operations on paths which uses a super fast `polygon clipper
library by Angus Johnson <http://www.angusj.com/delphi/clipper.php>`__.
You can download the latest version from PyPI:
......@@ -27,7 +27,6 @@ BooleanOperations depends on the following packages:
- `pyclipper <https://pypi.org/project/pyclipper/>`__: Cython wrapper for
the C++ Clipper library
- `fonttools <github.com/behdad/fonttools>`__
- `ufoLib <https://github.com/unified-font-object/ufoLib>`__
All dependencies are available on PyPI, so they will be resolved
automatically upon installing booleanOperations.
......
......@@ -6,35 +6,17 @@ environment:
TOXENV: "py27"
TOXPYTHON: "C:\\Python27\\python.exe"
- PYTHON: "C:\\Python34"
PYTHON_VERSION: "3.4.x"
PYTHON_ARCH: "32"
TOXENV: "py34"
TOXPYTHON: "C:\\Python34\\python.exe"
- PYTHON: "C:\\Python35"
PYTHON_VERSION: "3.5.0"
PYTHON_ARCH: "32"
TOXENV: "py35"
TOXPYTHON: "C:\\Python35\\python.exe"
- PYTHON: "C:\\Python27-x64"
PYTHON_VERSION: "2.7.x"
PYTHON_ARCH: "64"
TOXENV: "py27"
TOXPYTHON: "C:\\Python27-x64\\python.exe"
- PYTHON: "C:\\Python34-x64"
PYTHON_VERSION: "3.4.x"
- PYTHON: "C:\\Python36-x64"
PYTHON_VERSION: "3.6.x"
PYTHON_ARCH: "64"
TOXENV: "py34"
TOXPYTHON: "C:\\Python34-x64\\python.exe"
TOXENV: "py36"
TOXPYTHON: "C:\\Python36-x64\\python.exe"
- PYTHON: "C:\\Python35-x64"
PYTHON_VERSION: "3.5.0"
- PYTHON: "C:\\Python37-x64"
PYTHON_VERSION: "3.7.0"
PYTHON_ARCH: "64"
TOXENV: "py35"
TOXPYTHON: "C:\\Python35-x64\\python.exe"
TOXENV: "py37"
TOXPYTHON: "C:\\Python37-x64\\python.exe"
init:
- "ECHO %PYTHON% %PYTHON_VERSION% %PYTHON_ARCH%"
......@@ -48,7 +30,7 @@ install:
- "python -c \"import struct; print(struct.calcsize('P') * 8)\""
# upgrade pip to avoid out-of-date warnings
- "pip install --disable-pip-version-check --user --upgrade pip"
- "python -m pip install --disable-pip-version-check --upgrade pip"
# install/upgrade setuptools and wheel to build packages
- "pip install --upgrade setuptools wheel"
......
pyclipper==1.0.5
fonttools==3.1.2
ufoLib==2.0.0
# fontTools.ufoLib is not imported directly by booleanOperations, but
# the test suite needs defcon, which in turns requires fonttools installed
# with [ufo] support
fonttools[ufo]==3.32.0
......@@ -28,8 +28,7 @@ setup_params = dict(
],
install_requires=[
"pyclipper>=1.0.5",
"fonttools>=3.1.2",
"ufoLib>=2.0.0",
"fonttools>=3.32.0",
],
classifiers=[
'Development Status :: 4 - Beta',
......
import booleanOperations
try:
from mojo.UI import getDefault, setDefault
hasMojo = True
except ImportError:
hasMojo = False
try:
CurrentFont
except NameError:
class CurrentFont(dict):
def save(self, path=None):
pass
f = CurrentFont()
if hasMojo:
glyphViewRoundValues = getDefault("glyphViewRoundValues")
setDefault("glyphViewRoundValues", 0)
for g in f:
g.leftMargin = 0
g.rightMargin = 0
n = g.naked()
d = g.getLayer("union")
d.clear()
d.appendGlyph(g)
d.removeOverlap(round=0)
if len(g) > 1:
for method in "xor", "difference", "intersection":
d = g.getLayer(method)
d.clear()
func = getattr(booleanOperations, method)
func([n[0]], n[1:], d.getPointPen())
f.save()
if hasMojo:
setDefault("glyphViewRoundValues", glyphViewRoundValues)
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ascender</key>
<integer>750</integer>
<key>capHeight</key>
<integer>750</integer>
<key>descender</key>
<integer>-250</integer>
<key>guidelines</key>
<array/>
<key>postscriptBlueValues</key>
<array/>
<key>postscriptFamilyBlues</key>
<array/>
<key>postscriptFamilyOtherBlues</key>
<array/>
<key>postscriptOtherBlues</key>
<array/>
<key>postscriptStemSnapH</key>
<array/>
<key>postscriptStemSnapV</key>
<array/>
<key>unitsPerEm</key>
<integer>1000</integer>
<key>xHeight</key>
<integer>500</integer>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<glyph name="Q" format="2">
<advance width="500"/>
<outline>
<contour>
<point x="250.0" y="0.0" type="curve" smooth="yes"/>
<point x="301.627456" y="0.0"/>
<point x="349.615957497856" y="15.675496316928003"/>
<point x="389.46260833740234" y="42.537391662597656" type="curve"/>
<point x="316.25401306152344" y="115.74598693847656" type="line"/>
<point x="344.2203556976905" y="129.7344319670665"/>
<point x="367.38113907915584" y="152.25630157020586"/>
<point x="382.20357513427734" y="179.79642486572266" type="curve"/>
<point x="306" y="256" type="line"/>
<point x="241" y="191" type="line"/>
<point x="316.25401306152344" y="115.74598693847656" type="line"/>
<point x="296.205190429384" y="105.674005342992"/>
<point x="273.686684" y="100.0"/>
<point x="250.00000000000003" y="100.0" type="curve" smooth="yes"/>
<point x="168.0" y="100.0"/>
<point x="100.0" y="168.0"/>
<point x="100.0" y="250.0" type="curve" smooth="yes"/>
<point x="100.0" y="332.0"/>
<point x="168.0" y="400.0"/>
<point x="250.0" y="400.0" type="curve" smooth="yes"/>
<point x="332.0" y="400.0"/>
<point x="400.0" y="332.0"/>
<point x="400.0" y="250.0" type="curve" smooth="yes"/>
<point x="400.0" y="224.72768200000002"/>
<point x="393.540909595132" y="200.785176730414"/>
<point x="382.20357513427734" y="179.79642486572266" type="curve"/>
<point x="455.01900482177734" y="106.98099517822266" type="line"/>
<point x="483.36549467244805" y="147.495045593896"/>
<point x="500.00000000000006" y="196.816732"/>
<point x="500.0" y="249.99999999999997" type="curve" smooth="yes"/>
<point x="500.0" y="388.0"/>
<point x="388.0" y="500.0"/>
<point x="250.0" y="500.0" type="curve" smooth="yes"/>
<point x="112.0" y="500.0"/>
<point x="0.0" y="388.0"/>
<point x="0.0" y="250.0" type="curve" smooth="yes"/>
<point x="0.0" y="112.0"/>
<point x="112.0" y="0.0"/>
</contour>
</outline>
</glyph>
<?xml version="1.0" encoding="UTF-8"?>
<glyph name="QTail_reversed" format="2">
<advance width="500"/>
<outline>
<contour>
<point x="250.0" y="0.0" type="curve" smooth="yes"/>
<point x="301.627456" y="0.0"/>
<point x="349.615957497856" y="15.675496316928003"/>
<point x="389.46260833740234" y="42.537391662597656" type="curve"/>
<point x="316.26061248779297" y="115.73938751220703" type="line"/>
<point x="344.2244507660731" y="129.73821791053714"/>
<point x="367.3830059590542" y="152.25915602858421"/>
<point x="382.20421600341797" y="179.79578399658203" type="curve"/>
<point x="306" y="256" type="line"/>
<point x="241" y="191" type="line"/>
<point x="316.26061248779297" y="115.73938751220703" type="line"/>
<point x="296.210179594696" y="105.675262540048"/>
<point x="273.689308" y="100.0"/>
<point x="249.99999999999997" y="100.0" type="curve" smooth="yes"/>
<point x="168.0" y="100.0"/>
<point x="100.0" y="168.0"/>
<point x="100.0" y="250.0" type="curve" smooth="yes"/>
<point x="100.0" y="332.0"/>
<point x="168.0" y="400.0"/>
<point x="250.0" y="400.0" type="curve" smooth="yes"/>
<point x="332.0" y="400.0"/>
<point x="400.0" y="332.0"/>
<point x="400.0" y="250.0" type="curve" smooth="yes"/>
<point x="400.0" y="224.728174"/>
<point x="393.541161083068" y="200.786108953486"/>
<point x="382.20421600341797" y="179.79578399658203" type="curve"/>
<point x="455.01900482177734" y="106.98099517822266" type="line"/>
<point x="483.36549467244805" y="147.495045593896"/>
<point x="500.00000000000006" y="196.816732"/>
<point x="500.0" y="249.99999999999997" type="curve" smooth="yes"/>
<point x="500.0" y="388.0"/>
<point x="388.0" y="500.0"/>
<point x="250.0" y="500.0" type="curve" smooth="yes"/>
<point x="112.0" y="500.0"/>
<point x="0.0" y="388.0"/>
<point x="0.0" y="250.0" type="curve" smooth="yes"/>
<point x="0.0" y="112.0"/>
<point x="112.0" y="0.0"/>
</contour>
</outline>
</glyph>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Q</key>
<string>Q_.glif</string>
<key>QTail_reversed</key>
<string>Q_T_ail_reversed.glif</string>
<key>ovalOval</key>
<string>ovalO_val.glif</string>
<key>ovalOval_reversed</key>
<string>ovalO_val_reversed.glif</string>
<key>ovalRect</key>
<string>ovalR_ect.glif</string>
<key>ovalRect_reversed</key>
<string>ovalR_ect_reversed.glif</string>
<key>rectOval</key>
<string>rectO_val.glif</string>
<key>rectOval_reversed</key>
<string>rectO_val_reversed.glif</string>
<key>rectRect</key>
<string>rectR_ect.glif</string>
<key>rectRect_reversed</key>
<string>rectR_ect_reversed.glif</string>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>color</key>
<string>0,1,1,0.7</string>
<key>lib</key>
<dict>
<key>com.typemytype.robofont.segmentType</key>
<string>curve</string>
</dict>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<glyph name="ovalOval" format="2">
<advance width="100"/>
<outline>
<contour>
<point x="50.0" y="0.0" type="curve" smooth="yes"/>
<point x="78.0" y="0.0"/>
<point x="100.0" y="22.0"/>
<point x="100.0" y="50.0" type="curve" smooth="yes"/>
<point x="72.0" y="50.0"/>
<point x="50.0" y="72.0"/>
<point x="50.0" y="100.0" type="curve" smooth="yes"/>
<point x="22.0" y="100.0"/>
<point x="0.0" y="78.0"/>
<point x="0.0" y="50.0" type="curve" smooth="yes"/>
<point x="0.0" y="22.0"/>
<point x="22.0" y="0.0"/>
</contour>
</outline>
</glyph>
<?xml version="1.0" encoding="UTF-8"?>
<glyph name="ovalOval_reversed" format="2">
<advance width="100"/>
<outline>
<contour>
<point x="50.0" y="0.0" type="curve" smooth="yes"/>
<point x="78.0" y="0.0"/>
<point x="100.0" y="22.0"/>
<point x="100.0" y="50.0" type="curve" smooth="yes"/>
<point x="72.0" y="50.0"/>
<point x="50.0" y="72.0"/>
<point x="50.0" y="100.0" type="curve" smooth="yes"/>
<point x="22.0" y="100.0"/>
<point x="0.0" y="78.0"/>
<point x="0.0" y="50.0" type="curve" smooth="yes"/>
<point x="0.0" y="22.0"/>
<point x="22.0" y="0.0"/>
</contour>
</outline>
</glyph>
<?xml version="1.0" encoding="UTF-8"?>
<glyph name="ovalRect" format="2">
<advance width="100"/>
<outline>
<contour>
<point x="50.0" y="0.0" type="curve" smooth="yes"/>
<point x="78.0" y="0.0"/>
<point x="100.0" y="22.0"/>
<point x="100.0" y="50.0" type="curve" smooth="yes"/>
<point x="50" y="50" type="line"/>
<point x="50" y="100" type="line" smooth="yes"/>
<point x="22.0" y="100.0"/>
<point x="0.0" y="78.0"/>
<point x="0.0" y="50.0" type="curve" smooth="yes"/>
<point x="0.0" y="22.0"/>
<point x="22.0" y="0.0"/>
</contour>
</outline>
</glyph>
<?xml version="1.0" encoding="UTF-8"?>
<glyph name="ovalRect_reversed" format="2">
<advance width="100"/>
<outline>
<contour>
<point x="50.0" y="0.0" type="curve" smooth="yes"/>
<point x="78.0" y="0.0"/>
<point x="100.0" y="22.0"/>
<point x="100.0" y="50.0" type="curve" smooth="yes"/>
<point x="50" y="50" type="line"/>
<point x="50" y="100" type="line" smooth="yes"/>
<point x="22.0" y="100.0"/>
<point x="0.0" y="78.0"/>
<point x="0.0" y="50.0" type="curve" smooth="yes"/>
<point x="0.0" y="22.0"/>
<point x="22.0" y="0.0"/>
</contour>
</outline>
</glyph>
<?xml version="1.0" encoding="UTF-8"?>
<glyph name="rectOval" format="2">
<advance width="100"/>
<outline>
<contour>
<point x="100" y="50" type="line" smooth="yes"/>
<point x="128.0" y="50.0"/>
<point x="150.0" y="72.0"/>
<point x="150.0" y="100.0" type="curve" smooth="yes"/>
<point x="150.0" y="128.0"/>
<point x="128.0" y="150.0"/>
<point x="100.0" y="150.0" type="curve" smooth="yes"/>
<point x="72.0" y="150.0"/>
<point x="50.0" y="128.0"/>
<point x="50.0" y="100.0" type="curve" smooth="yes"/>
<point x="100" y="100" type="line"/>
</contour>
</outline>
</glyph>
<?xml version="1.0" encoding="UTF-8"?>
<glyph name="rectOval_reversed" format="2">
<advance width="100"/>
<outline>
<contour>
<point x="100" y="50" type="line" smooth="yes"/>
<point x="128.0" y="50.0"/>
<point x="150.0" y="72.0"/>
<point x="150.0" y="100.0" type="curve" smooth="yes"/>
<point x="150.0" y="128.0"/>
<point x="128.0" y="150.0"/>
<point x="100.0" y="150.0" type="curve" smooth="yes"/>
<point x="72.0" y="150.0"/>
<point x="50.0" y="128.0"/>
<point x="50.0" y="100.0" type="curve" smooth="yes"/>
<point x="100" y="100" type="line"/>
</contour>
</outline>
</glyph>
<?xml version="1.0" encoding="UTF-8"?>
<glyph name="rectRect" format="2">
<advance width="100"/>
<outline>
<contour>
<point x="0" y="0" type="line"/>
<point x="100" y="0" type="line"/>
<point x="100" y="50" type="line"/>
<point x="50" y="50" type="line"/>
<point x="50" y="100" type="line"/>
<point x="0" y="100" type="line"/>
</contour>
</outline>
</glyph>
<?xml version="1.0" encoding="UTF-8"?>
<glyph name="rectRect_reversed" format="2">
<advance width="100"/>
<outline>
<contour>
<point x="0" y="0" type="line"/>
<point x="100" y="0" type="line"/>
<point x="100" y="50" type="line"/>
<point x="50" y="50" type="line"/>
<point x="50" y="100" type="line"/>
<point x="0" y="100" type="line"/>
</contour>
</outline>
</glyph>
<?xml version="1.0" encoding="UTF-8"?>
<glyph name="Q" format="2">
<advance width="355.01900482177734"/>
<outline>
<contour>
<point x="250.0" y="100.0" type="curve" smooth="yes"/>
<point x="273.686684" y="100.0"/>
<point x="296.205190429384" y="105.674005342992"/>
<point x="316.25401306152344" y="115.74598693847656" type="curve"/>
<point x="241" y="191" type="line"/>
<point x="306" y="256" type="line"/>