pax_global_header00006660000000000000000000000064147057277760014540gustar00rootroot0000000000000052 comment=4d8b0dc1bf17238e2287218160e5643693cad9b4 googlefonts-fontmake-7ed5123/000077500000000000000000000000001470572777600162245ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/.codecov.yml000066400000000000000000000001151470572777600204440ustar00rootroot00000000000000comment: false coverage: status: project: off patch: off googlefonts-fontmake-7ed5123/.coveragerc000066400000000000000000000014301470572777600203430ustar00rootroot00000000000000[run] # measure 'branch' coverage in addition to 'statement' coverage # See: http://coverage.readthedocs.org/en/coverage-4.0.3/branch.html#branch branch = True omit = tests/* # list of directories or packages to measure source = fontmake # these are treated as equivalent when combining data [paths] source = Lib/fontmake */site-packages/fontmake [report] # Regexes for lines to exclude from consideration exclude_lines = # keywords to use in inline comments to skip coverage pragma: no cover # don't complain if tests don't hit defensive assertion code raise AssertionError raise NotImplementedError # don't complain if non-runnable code isn't run if 0: if __name__ == .__main__.: # ignore source code that can’t be found ignore_errors = True googlefonts-fontmake-7ed5123/.editorconfig000066400000000000000000000003431470572777600207010ustar00rootroot00000000000000# http://editorconfig.org root = true [*] indent_style = space indent_size = 4 trim_trailing_whitespace = true insert_final_newline = true charset = utf-8 end_of_line = lf [*.{yaml,yml}] indent_style = space indent_size = 2 googlefonts-fontmake-7ed5123/.gitattributes000066400000000000000000000005021470572777600211140ustar00rootroot00000000000000# Set the default behavior, in case people don't have core.autocrlf set. * text=auto # Explicitly declare text files you want to always be normalized and converted # to native line endings on checkout. *.cfg text *.in text *.ini text *.md text *.py text *.rst text *.sh text *.toml text *.txt text *.yaml text *.yml text googlefonts-fontmake-7ed5123/.github/000077500000000000000000000000001470572777600175645ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/.github/workflows/000077500000000000000000000000001470572777600216215ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/.github/workflows/ci.yml000066400000000000000000000103021470572777600227330ustar00rootroot00000000000000name: Test + Deploy on: push: branches: [main] tags: ["v*.*.*"] pull_request: branches: [main] jobs: lint: runs-on: ubuntu-latest # https://github.community/t/github-actions-does-not-respect-skip-ci/17325/8 if: "! contains(toJSON(github.event.commits.*.message), '[skip ci]')" steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.x" - name: Install dependencies run: pip install tox - name: Run style and static checks run: tox -e lint test: runs-on: ${{ matrix.platform }} if: "! contains(toJSON(github.event.commits.*.message), '[skip ci]')" strategy: matrix: python-version: [3.8, "3.10", "3.11", "3.13", "pypy-3.9"] platform: [ubuntu-latest, windows-latest] exclude: - platform: windows-latest python-version: "pypy-3.9" steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: pip install tox - name: Test with tox run: tox -e py - name: Produce coverage files run: tox -e coverage-report - name: Upload coverage to Codecov uses: codecov/codecov-action@v1 with: file: coverage.xml flags: unittests name: codecov-umbrella fail_ci_if_error: true # see https://github.com/codecov/codecov-action/issues/557 token: ${{ secrets.CODECOV_TOKEN }} deploy: # only run if the commit is tagged... if: startsWith(github.ref, 'refs/tags/v') # ... and both the lint and test jobs completed successfully needs: - lint - test runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: # setuptools_scm requires the git clone to not be 'shallow' fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.x" - name: Install dependencies run: | python -m pip install --upgrade pip pip install setuptools wheel twine shiv - name: Extract release notes from annotated tag message id: release_notes env: # e.g. v0.1.0a1, v1.2.0b2 or v2.3.0rc3, but not v1.0.0 PRERELEASE_TAG_PATTERN: "v[[:digit:]]+\\.[[:digit:]]+\\.[[:digit:]]+([ab]|rc)[[:digit:]]+" run: | # GH checkout action doesn't preserve tag annotations, we must fetch them # https://github.com/actions/checkout/issues/290 git fetch --tags --force # strip leading 'refs/tags/' to get the tag name TAG_NAME="${GITHUB_REF##*/}" # Dump tag message to temporary .md file (excluding the PGP signature at the bottom) TAG_MESSAGE=$(git tag -l --format='%(contents)' $TAG_NAME | sed -n '/-----BEGIN PGP SIGNATURE-----/q;p') echo "$TAG_MESSAGE" > "${{ runner.temp }}/release_notes.md" # if the tag has a pre-release suffix mark the Github Release accordingly if egrep -q "$PRERELEASE_TAG_PATTERN" <<< "$TAG_NAME"; then echo "Tag contains a pre-release suffix" echo "IS_PRERELEASE=true" >> "$GITHUB_ENV" else echo "Tag does not contain pre-release suffix" echo "IS_PRERELEASE=false" >> "$GITHUB_ENV" fi - name: Build and publish env: TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} run: | if [ "$IS_PRERELEASE" == true ]; then echo "DEBUG: This is a pre-release" else echo "DEBUG: This is a final release" fi python setup.py sdist bdist_wheel twine upload dist/* - name: Create .pyz # currently this only builds a self-contained zip app for macOS python 3.11 # to be used for fontmake export plugin for Glyphs.app run: ./build_pyz.sh - name: Create GitHub release id: create_release uses: ncipollo/release-action@v1 with: bodyFile: "${{ runner.temp }}/release_notes.md" draft: false prerelease: ${{ env.IS_PRERELEASE }} artifacts: "shivs/*.zip" googlefonts-fontmake-7ed5123/.gitignore000066400000000000000000000026551470572777600202240ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover .hypothesis/ .pytest_cache/ tests/data/test.fea # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # celery beat schedule file celerybeat-schedule # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ # Visual Studio Code .vscode # auto-generated version file Lib/fontmake/_version.py googlefonts-fontmake-7ed5123/.pyup.yml000066400000000000000000000002501470572777600200170ustar00rootroot00000000000000# controls the frequency of updates (undocumented beta feature) schedule: every week # do not pin dependencies unless they have explicit version specifiers pin: False googlefonts-fontmake-7ed5123/CONTRIBUTING.md000066400000000000000000000026521470572777600204620ustar00rootroot00000000000000Want to contribute? Great! First, read this page (including the small print at the end). ### Before you contribute Before we can use your code, you must sign the [Google Individual Contributor License Agreement](https://cla.developers.google.com/about/google-individual) (CLA), which you can do online. The CLA is necessary mainly because you own the copyright to your changes, even after your contribution becomes part of our codebase, so we need your permission to use and distribute your code. We also need to be sure of various other things—for instance that you'll tell us if you know that your code infringes on other people's patents. You don't have to sign the CLA until after you've submitted your code for review and a member has approved it, but you must do it before we can put your code into our codebase. Before you start working on a larger contribution, you should get in touch with us first through the issue tracker with your idea so that we can help out and possibly guide you. Coordinating up front makes it much easier to avoid frustration later on. ### Code reviews All submissions, including submissions by project members, require review. We use Github pull requests for this purpose. ### The small print Contributions made by corporations are covered by a different agreement than the one above, the [Software Grant and Corporate Contributor License Agreement](https://cla.developers.google.com/about/google-corporate). googlefonts-fontmake-7ed5123/LICENSE000066400000000000000000000261351470572777600172400ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. googlefonts-fontmake-7ed5123/Lib/000077500000000000000000000000001470572777600167325ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/Lib/fontmake/000077500000000000000000000000001470572777600205365ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/Lib/fontmake/__init__.py000066400000000000000000000001541470572777600226470ustar00rootroot00000000000000try: from ._version import version as __version__ except ImportError: __version__ = "0.0.0+unknown" googlefonts-fontmake-7ed5123/Lib/fontmake/__main__.py000066400000000000000000000657211470572777600226430ustar00rootroot00000000000000# Copyright 2015 Google Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import logging import os import sys from argparse import SUPPRESS, ArgumentParser, FileType from collections import namedtuple from contextlib import contextmanager from textwrap import dedent from fontTools.misc.loggingTools import configLogger from ufo2ft import CFFOptimization from ufo2ft.featureWriters import loadFeatureWriterFromString from ufo2ft.filters import loadFilterFromString from fontmake import __version__ from fontmake.errors import FontmakeError from fontmake.font_project import INTERPOLATABLE_OUTPUTS, CurveConversion, FontProject def _loadPlugins(parser, specs, from_string_func, parser_error_message): plugins = [] seen_ellipsis = False for s in specs: if s == "None": # magic value that means "don't write any features or don't apply # any filters!" return [] elif s == "...": if seen_ellipsis: parser.error( parser_error_message.format( "ValueError", "'...' can only be provided once" ) ) seen_ellipsis = True plugins.append(...) continue try: plugins.append(from_string_func(s)) except Exception as e: parser.error(parser_error_message.format(type(e).__name__, e)) return plugins def _loadFeatureWriters(parser, specs): return _loadPlugins( parser, specs, loadFeatureWriterFromString, "Failed to load --feature-writer:\n {}: {}", ) def _loadFilters(parser, specs): return _loadPlugins( parser, specs, loadFilterFromString, "Failed to load --filter:\n {}: {}" ) def exclude_args(parser, args, excluded_args, target, positive=True): """Delete options that are not appropriate for a following code path; exit with an error if excluded options were passed in by the user. argparse generates a namespace with all options it knows, but not every attribute should be passed to all code paths (i.e. options about interpolation should not reach `run_from_ufos()`). This function can be run before entering a particular code path to clean up the kwargs passed to it. Exit with an error message if the user actually passed the options in. """ msg = '"%s" option invalid for %s' for argname in excluded_args: if argname not in args: continue if bool(args[argname]) is positive: optname = "--{}{}".format( "" if positive else "no-", argname.replace("_", "-") ) parser.error(msg % (optname, target)) del args[argname] _ParsedInputs = namedtuple( "_ParsedInputs", [ "glyphs_path", "ufo_paths", "designspace_path", "format_name", ], ) def parse_mutually_exclusive_inputs(parser, args): glyphs_path = args.pop("glyphs_path") ufo_paths = args.pop("ufo_paths") or [] designspace_path = args.pop("mm_designspace") posargs = args.pop("posargs") # assert input -flags are already mutually exclusive via argparse assert sum(bool(p) for p in (glyphs_path, ufo_paths, designspace_path)) <= 1 input_flag = ( "g" if glyphs_path else "m" if designspace_path else "u" if ufo_paths else None ) if input_flag and posargs: parser.error( f"argument -{input_flag} not allowed with positional input args: " f"{' '.join(posargs)}" ) for filename in posargs: if filename.endswith(".glyphs") or filename.endswith(".glyphspackage"): if glyphs_path: parser.error("Only one *.glyphs source file is allowed") glyphs_path = filename elif filename.endswith(".designspace"): if designspace_path: parser.error("Only one *.designspace source file is allowed") designspace_path = filename elif filename.endswith((".ufo", ".ufoz", ".ufo.json")): ufo_paths.append(filename) else: parser.error(f"Unknown input file extension: {filename!r}") count = sum(bool(p) for p in (glyphs_path, ufo_paths, designspace_path)) if count == 0: parser.error("No input files specified") elif count > 1: parser.error(f"Expected 1, got {count} different types of inputs files") for filename in [glyphs_path] + [designspace_path] + ufo_paths: if filename is not None and not os.path.exists(filename): parser.error(f"{filename} not found") format_name = ( "Glyphs" if glyphs_path else "designspace" if designspace_path else "UFO" ) + " source" return _ParsedInputs( glyphs_path, ufo_paths, designspace_path, format_name, ) @contextmanager def _make_tempdirs(parser, args): output = args["output"] tempdirs = [] for dirname in ("master_dir", "instance_dir"): if args.get(dirname) == "{tmp}": if "ufo" in output: parser.error( "Can't use temporary %s directory with 'ufo' output" % dirname.replace("_dir", "") ) import tempfile td = args[dirname] = tempfile.mkdtemp(prefix=dirname + "_") tempdirs.append(td) yield tempdirs if tempdirs: import shutil for td in tempdirs: shutil.rmtree(td) def _configure_logging(level=None, timing=False): fmt = "%(levelname)s:%(name)s:%(message)s" if level is not None: # NOTE: configuring the root logger with basicConfig should be done only once, # preferably from inside main(); calling subsequent times has no effect. logging.basicConfig(level=level, format=fmt) # fontTools.subset's logger is too chatty, we set it to WARNING logging.getLogger("fontTools.subset").setLevel(logging.WARNING) if timing: # timing-related DEBUG messages get a separate configuration so we # can enable them without needing to lower the global verbosity level configLogger(logger="fontmake.timer", level=logging.DEBUG, format=fmt) configLogger(logger="ufo2ft.timer", level=logging.DEBUG, format=fmt) def main(args=None): parser = ArgumentParser() parser.add_argument("--version", action="version", version=__version__) inputGroup = parser.add_argument_group( title="Input arguments (flags)", description="The following arguments are mutually exclusive (pick only one):", ) xInputGroup = inputGroup.add_mutually_exclusive_group() xInputGroup.add_argument( "-g", "--glyphs-path", metavar="GLYPHS", help="Path to .glyphs source file" ) xInputGroup.add_argument( "-u", "--ufo-paths", nargs="+", metavar="UFO", help="One or more paths to UFO files", ) xInputGroup.add_argument( "-m", "--mm-designspace", metavar="DESIGNSPACE", help="Path to .designspace file", ) positionalInputs = parser.add_argument_group( title="Input arguments (positonal)", description="Alternatively, guess source format from filename extension", ) positionalInputs.add_argument( "posargs", nargs="*", metavar="INPUTS", help="Either one *.designspace or *.glyphs file, or one or more *.ufo", ) otherInputGroup = parser.add_argument_group(title="Other input arguments") otherInputGroup.add_argument( "--glyph-data", action="append", default=None, metavar="GLYPHDATA", help="Custom GlyphData XML file with glyph info (production name, " "script, category, subCategory, etc.). Can be used more than once " "(for Glyphs sources only).", ) outputGroup = parser.add_argument_group(title="Output arguments") outputGroup.add_argument( "-o", "--output", nargs="+", default=("otf", "ttf"), metavar="FORMAT", help="Output font formats. Choose 1 or more from: %(choices)s. Default: otf, ttf. " "(No file paths).", choices=( "ufo", "otf", "otf-cff2", "ttf", "ttf-interpolatable", "otf-interpolatable", "variable", "variable-cff2", ), ) outputSubGroup = outputGroup.add_mutually_exclusive_group() outputSubGroup.add_argument( "--output-path", default=None, help="Output font file path. Only valid when the output is a single " "file (e.g. input is a single UFO or output is a single variable font)", ) outputSubGroup.add_argument( "--output-dir", default=None, help="Output folder. By default, output folders are created in the " "current working directory, grouping output fonts by format.", ) outputGroup.add_argument( "-i", "--interpolate", nargs="?", default=False, const=True, metavar="INSTANCE_NAME", help="Interpolate masters and generate all the instances defined. " "To only interpolate a specific instance (or instances) that " 'match a given "name" attribute, you can pass as argument ' "the full instance name or a regular expression. " 'E.g.: -i "Noto Sans Bold"; or -i ".* UI Condensed". ' "(for Glyphs or DesignSpace sources only). ", ) outputGroup.add_argument( "--variable-fonts", nargs="?", default=".*", const=True, metavar="VARIABLE_FONT_FILENAME", help=dedent( """\ Filter the list of variable fonts produced from the input Designspace file. By default all listed variable fonts are generated. To generate a specific variable font (or variable fonts) that match a given "filename" attribute, you can pass as argument the full filename or a regular expression. E.g.: --variable-fonts "MyFontVF_WeightOnly.ttf"; or --variable-fonts "MyFontVFItalic_.*.ttf". """ ), ) # no longer show option in --help but keep to produce nice error message outputGroup.add_argument("--use-mutatormath", action="store_true", help=SUPPRESS) outputGroup.add_argument( "-M", "--masters-as-instances", action="store_true", help="Output masters as instances", ) outputGroup.add_argument( "--family-name", help="Family name to use for masters, and to filter output instances", ) outputGroup.add_argument( "--round-instances", dest="round_instances", action="store_true", help="Apply integer rounding to all geometry when interpolating", ) outputGroup.add_argument( "--designspace-path", default=None, help="Path to output designspace file (for Glyphs sources only).", ) outputGroup.add_argument( "--master-dir", default=None, help='Directory where to write master UFO. Default: "./master_ufo". ' 'If value is "{tmp}", a temporary directory is created and ' "removed at the end (for Glyphs sources only).", ) outputGroup.add_argument( "--instance-dir", default=None, help="Directory where to write instance UFOs. Default: " '"./instance_ufo". If value is "{tmp}", a temporary directory ' "is created and removed at the end (for Glyphs sources only).", ) outputGroup.add_argument( "--no-write-skipexportglyphs", action="store_false", dest="write_skipexportglyphs", help="Do not store the glyph export flags in the 'public.skipExportGlyphs' " "key of designspace/UFO lib, but use the old private glyph lib key " "'com.schriftgestaltung.Glyphs.Export' (for Glyphs sources only).", ) outputGroup.add_argument( "--validate-ufo", action="store_true", help="Enable ufoLib validation on reading/writing UFO files. It is " "disabled by default", ) compatibilityGroup = outputGroup.add_mutually_exclusive_group() compatibilityGroup.add_argument( "--check-compatibility", action="store_true", default=None, help="Check if the source files are interpolatable. It is " "disabled by default, but enabled when building variable fonts " "or what the 'Enforce Compatibility Check' custom parameter is " "set on a Glyphs file", ) compatibilityGroup.add_argument( "--no-check-compatibility", action="store_false", default=None, dest="check_compatibility", help="Turns off the compatibility checker even when building variable fonts", ) outputGroup.add_argument( "--expand-features-to-instances", action="store_true", help="Resolves all include()s in the master feature file and writes " "the full feature file to all instance UFOs. Only valid when " "interpolating. Use if you share feature files of masters in " "external files, as instances can end up elsewhere.", ) outputGroup.add_argument( "--fea-include-dir", default=None, help="Overrides the default directory where to search for included " "feature files with relative paths. This only works when the input is a " "Designspace or UFOs, not from Glyphs at the moment.", ) outputGroup.add_argument( "--no-generate-GDEF", dest="generate_GDEF", action="store_false", help="Do not auto-generate a GDEF table, but keep an existing one intact.", ) ufoStructureGroup = outputGroup.add_mutually_exclusive_group(required=False) # kept for backward compat ufoStructureGroup.add_argument( "--save-ufo-as-zip", dest="save_ufo_as_zip", action="store_true", help="Deprecated. Use --ufo-structure=zip instead.", ) ufoStructureGroup.add_argument( "--ufo-structure", default="package", choices=("package", "zip", "json"), help="Select UFO format structure. Choose between: %(choices)s " "(default: %(default)s). NOTE: json export is unofficial/experimental.", ) outputGroup.add_argument( "--indent-json", action="store_true", help="Whether to format the JSON files created with --ufo-structure=json " "as multiple lines with 2-space indentation. Default: single line, no indent.", ) contourGroup = parser.add_argument_group(title="Handling of contours") contourGroup.add_argument( "--keep-overlaps", dest="remove_overlaps", action="store_false", help="Do not remove any overlap.", ) contourGroup.add_argument( "--overlaps-backend", dest="overlaps_backend", metavar="BACKEND", choices=("booleanOperations", "pathops"), default="booleanOperations", help="Select library to remove overlaps. Choose between: %(choices)s " "(default: %(default)s)", ) contourGroup.add_argument( "--keep-direction", dest="reverse_direction", action="store_false", help="Do not reverse contour direction when output is ttf or " "ttf-interpolatable", ) contourGroup.add_argument( "--ttf-curves", dest="ttf_curves", default=CurveConversion.default().value, choices=[e.value for e in CurveConversion], help="Controls conversion of cubic Bézier curves to TrueType quadratic splines." " By default ('cu2qu'), all cubics are converted to quadratic (glyf v0). With" " 'mixed', cubics are converted to quadratic only when more economical." " If 'keep-quad' or 'keep-cubic', cu2qu is skipped altogether and curves are" " compiled unchanged. NOTE: cubics in TTF use glyf v1 which is still draft!", ) contourGroup.add_argument( "-e", "--conversion-error", type=float, default=None, metavar="ERROR", help="Maximum approximation error for cubic to quadratic conversion " "measured in EM", ) contourGroup.add_argument( "-f", "--flatten-components", dest="flatten_components", action="store_true", help="Flatten nested components to single level.", ) contourGroup.add_argument( "-a", "--autohint", nargs="?", const=True, # without args means run ttfautohint with default options help="Run ttfautohint. Can provide arguments, quoted. By default, ttfautohint " "is run if the (.glyphs) source contains a 'TTFAutohint options' instance " "custom parameter. This option overrides that. See --no-autohint to disable.", ) contourGroup.add_argument( "-A", "--no-autohint", dest="autohint", action="store_false", help="Do not run ttfautohint, even if source contains a 'TTFAutohint options' " "custom parameter", ) contourGroup.add_argument( "--cff-round-tolerance", type=float, default=None, metavar="FLOAT", help="Restrict rounding of point coordinates in CFF table to only " "those floats whose absolute difference from their integral part " "is less than or equal to the tolerance. By default, all floats " "are rounded to integer (tolerance 0.5); 0 disables rounding.", ) contourGroup.add_argument( "--optimize-cff", type=lambda s: CFFOptimization(int(s)), default=CFFOptimization.SUBROUTINIZE, help="0 disables all optimizations; 1 specializes the CFF charstring " "operators; 2 (default) also enables subroutinization", ) contourGroup.add_argument( "--subroutinizer", default=None, choices=["compreffor", "cffsubr"], help="name of the library to use for compressing CFF charstrings. " "Choose between: %(choices)s. By default compreffor is used for CFF 1, " "and cffsubr for CFF2. NOTE: compreffor doesn't support CFF2.", ) contourGroup.add_argument( "--no-optimize-gvar", dest="optimize_gvar", action="store_false", help="Do not perform IUP optimization on variable font's 'gvar' table. " "(only works with 'variable' TrueType-flavored output)", ) contourGroup.add_argument( "--filter", metavar="CLASS", action="append", dest="filter_specs", help="string specifying a filter class to load, either " "built-in or from an external module, optionally initialized with " "the given keyword arguments. The class and module names are " "separated by '::'. The option can be repeated multiple times " "for each filter class. The option overrides the filters specified " "in the UFO lib. You can use an ellipsis --filter='...' to keep the " "latter and insert additional --filter(s), either before or after it.", ) contourGroup.add_argument( "--no-auto-use-my-metrics", dest="auto_use_my_metrics", action="store_false", help="Don't automatically set USE_MY_METRICS glyf component flags (0x0200).", ) contourGroup.add_argument( "--drop-implied-oncurves", action="store_true", help="drop on-curve points that can be implied when exactly in the middle of " "two off-curve points (TrueType only; default: %(default)s).", ) layoutGroup = parser.add_argument_group(title="Handling of OpenType Layout") layoutGroup.add_argument( "--interpolate-binary-layout", nargs="?", default=False, const=True, metavar="MASTER_DIR", help="Interpolate layout tables from compiled master binaries. " "Requires Glyphs or DesignSpace source.", ) layoutGroup.add_argument( "--feature-writer", metavar="CLASS", action="append", dest="feature_writer_specs", help="string specifying a feature writer class to load, either " "built-in or from an external module, optionally initialized with " "the given keyword arguments. The class and module names are " "separated by '::'. The option can be repeated multiple times " "for each writer class. A special value of 'None' will disable " "all automatic feature generation. The option overrides both the " "default ufo2ft writers and those specified in the UFO lib. " "You can use ellipsis --feature-writer='...' to keep the latter and " "insert additional --feature-writer(s) either before or after those.", ) layoutGroup.add_argument( "--debug-feature-file", metavar="FILE", type=FileType("w", encoding="utf-8"), default=None, help=( "Path were to dump OpenType features text to debug auto-generated " "features (kern, mark, mkmk, etc.)." ), ) layoutGroup.add_argument( "--no-variable-features", action="store_false", dest="variable_features", help=( "Disable generation of variable FEA in ufo2ft when compiling VFs; " "instead build separate OT layout tables for each master and merge " "them with varLib." ), ) feaCompilerGroup = layoutGroup.add_mutually_exclusive_group(required=False) feaCompilerGroup.add_argument( "--mti-source", help="mtiLib feature definition .plist file path (use instead of FEA)", ) glyphnamesGroup = parser.add_mutually_exclusive_group(required=False) glyphnamesGroup.add_argument( "--production-names", dest="use_production_names", action="store_true", help="Rename glyphs with production names if available otherwise use " "uninames.", ) glyphnamesGroup.add_argument( "--no-production-names", dest="use_production_names", action="store_false" ) subsetGroup = parser.add_mutually_exclusive_group(required=False) subsetGroup.add_argument( "--subset", dest="subset", action="store_true", help="Subset font using export flags set by glyphsLib", ) subsetGroup.add_argument("--no-subset", dest="subset", action="store_false") subroutinizeGroup = parser.add_mutually_exclusive_group(required=False) subroutinizeGroup.add_argument( "-s", "--subroutinize", action="store_true", help="Optimize CFF table using compreffor (default) [DEPRECATED: use " "--optimize-cff option instead]", ) subroutinizeGroup.add_argument( "-S", "--no-subroutinize", dest="subroutinize", action="store_false" ) parser.set_defaults(use_production_names=None, subset=None, subroutinize=None) logGroup = parser.add_argument_group(title="Logging arguments") logGroup.add_argument( "--timing", action="store_true", help="Print the elapsed time for each steps" ) logGroup.add_argument( "--verbose", default="INFO", metavar="LEVEL", choices=("DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"), help="Configure the logger verbosity level. Choose between: " "%(choices)s. Default: INFO", ) args = vars(parser.parse_args(args)) use_mutatormath = args.pop("use_mutatormath") if use_mutatormath: parser.error( "MutatorMath is no longer supported by fontmake. " "Try to use ufoProcessor: https://github.com/LettError/ufoProcessor" ) level = args.pop("verbose") _configure_logging(level, timing=args.pop("timing")) specs = args.pop("feature_writer_specs") if specs is not None: args["feature_writers"] = _loadFeatureWriters(parser, specs) specs = args.pop("filter_specs") if specs is not None: args["filters"] = _loadFilters(parser, specs) if args.pop("save_ufo_as_zip"): args["ufo_structure"] = "zip" inputs = parse_mutually_exclusive_inputs(parser, args) if INTERPOLATABLE_OUTPUTS.intersection(args["output"]): if not (inputs.glyphs_path or inputs.designspace_path): parser.error("Glyphs or designspace source required for variable font") exclude_args( parser, args, [ "interpolate", "masters_as_instances", "interpolate_binary_layout", ], "variable output", ) else: exclude_args( parser, args, ["variable_fonts", "optimize_gvar", "variable_features"], "static output", positive=False, ) PRINT_TRACEBACK = level == "DEBUG" try: project = FontProject(validate_ufo=args.pop("validate_ufo")) if inputs.glyphs_path: # we don't support customizing include directory for .glyphs input # for Glyphs.app does not either. exclude_args(parser, args, ["fea_include_dir"], inputs.format_name) with _make_tempdirs(parser, args): project.run_from_glyphs(inputs.glyphs_path, **args) return exclude_args( parser, args, [ "family_name", "mti_source", "designspace_path", "master_dir", "instance_dir", "glyph_data", ], inputs.format_name, ) exclude_args( parser, args, ["write_skipexportglyphs"], inputs.format_name, positive=False ) if inputs.designspace_path: project.run_from_designspace(inputs.designspace_path, **args) return exclude_args( parser, args, [ "interpolate", "variable_fonts", "interpolate_binary_layout", "round_instances", "expand_features_to_instances", "check_compatibility", ], inputs.format_name, ) args.pop("ufo_structure", None) # unused for UFO output args.pop("indent_json", None) project.run_from_ufos( inputs.ufo_paths, is_instance=args.pop("masters_as_instances"), **args ) except FontmakeError as e: if PRINT_TRACEBACK: logging.exception(e) sys.exit(1) sys.exit(f"fontmake: Error: {str(e)}") finally: debug_feature_file = args.get("debug_feature_file") if debug_feature_file is not None: debug_feature_file.close() if __name__ == "__main__": sys.exit(main()) googlefonts-fontmake-7ed5123/Lib/fontmake/compatibility.py000066400000000000000000000074301470572777600237650ustar00rootroot00000000000000import logging logger = logging.getLogger(__name__) class Context: def __init__(self, checker, newcontext): self.checker = checker self.newcontext = newcontext def __enter__(self): self.checker.context.append(self.newcontext) def __exit__(self, type, value, traceback): self.checker.context.pop() class CompatibilityChecker: def __init__(self, fonts): self.errors = [] self.context = [] self.okay = True self.fonts = fonts def check(self): first = self.fonts[0] skip_export_glyphs = set(first.lib.get("public.skipExportGlyphs", ())) for glyph in first.keys(): if glyph in skip_export_glyphs: continue self.current_fonts = [font for font in self.fonts if glyph in font] glyphs = [font[glyph] for font in self.current_fonts] with Context(self, f"glyph {glyph}"): self.check_glyph(glyphs) return self.okay def check_glyph(self, glyphs): if self.ensure_all_same(len, glyphs, "number of contours"): for ix, contours in enumerate(zip(*glyphs)): with Context(self, f"contour {ix}"): self.check_contours(contours) anchors = [g.anchors for g in glyphs] self.ensure_all_same( lambda anchors: '"' + (", ".join(sorted(a.name for a in anchors))) + '"', anchors, "anchors", ) # Context for contextual anchors libs = [g.lib for g in glyphs] for each_anchors in zip(*anchors): if each_anchors[0].name[0] == "*": objectlibs = [ libs[font_ix] .get("public.objectLibs", {}) .get(anchor.identifier, {}) for font_ix, anchor in enumerate(each_anchors) ] with Context(self, f"anchor {each_anchors[0].name}"): self.ensure_all_same( lambda lib: lib.get("GPOS_Context", "None").strip(), objectlibs, "GPOS context", ) components = [g.components for g in glyphs] if self.ensure_all_same(len, components, "number of components"): for ix, component in enumerate(zip(*components)): with Context(self, f"component {ix}"): self.ensure_all_same(lambda c: c.baseGlyph, component, "base glyph") def check_contours(self, contours): if not self.ensure_all_same(len, contours, "number of points"): return for ix, point in enumerate(zip(*contours)): with Context(self, f"point {ix}"): self.ensure_all_same(lambda x: x.type, point, "point type") def ensure_all_same(self, func, objs, what): values = {} context = ", ".join(self.context) for obj, font in zip(objs, self.current_fonts): values.setdefault(func(obj), []).append(self._name_for(font)) if len(values) < 2: logger.debug(f"All fonts had same {what} in {context}") return True report = f"\nFonts had differing {what} in {context}:\n" debug_enabled = logger.isEnabledFor(logging.DEBUG) for value, fonts in values.items(): if debug_enabled or len(fonts) <= 6: key = ", ".join(fonts) else: key = f"{len(fonts)} fonts" if len(str(value)) > 20: value = "\n " + str(value) report += f" * {key} had: {value}\n" logger.error(report) self.okay = False return False def _name_for(self, font): names = list(filter(None, [font.info.familyName, font.info.styleName])) return " ".join(names) googlefonts-fontmake-7ed5123/Lib/fontmake/errors.py000066400000000000000000000026371470572777600224340ustar00rootroot00000000000000import os def _try_relative_path(path): # Try to return 'path' relative to the current working directory, or # return input 'path' if we can't make a relative path. # E.g. on Windows, os.path.relpath fails when path and "." are on # different mount points, C: or D: etc. try: return os.path.relpath(path) except ValueError: return path class FontmakeError(Exception): """Base class for all fontmake exceptions. This exception is intended to be chained to the original exception. The main purpose is to provide a source file trail that points to where the explosion came from. """ def __init__(self, msg, source_file): self.msg = msg self.source_trail = [source_file] def __str__(self): trail = " -> ".join( f"{str(_try_relative_path(s))!r}" for s in reversed(self.source_trail) if s is not None ) cause = str(self.__cause__) if self.__cause__ is not None else None message = "" if trail: message = f"In {trail}: " message += f"{self.msg}" if cause: message += f": {cause}" return message class TTFAError(FontmakeError): def __init__(self, exitcode, source_file): self.exitcode = exitcode self.msg = f"ttfautohint failed with error code {str(self.exitcode)}" self.source_trail = [source_file] googlefonts-fontmake-7ed5123/Lib/fontmake/font_project.py000066400000000000000000001702201470572777600236060ustar00rootroot00000000000000# Copyright 2015 Google Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from __future__ import annotations import dataclasses import enum import glob import logging import math import os import shutil import tempfile from collections import OrderedDict from functools import partial from pathlib import Path from re import fullmatch import ufo2ft import ufo2ft.errors import ufoLib2 from fontTools import designspaceLib from fontTools.designspaceLib.split import splitInterpolable from fontTools.misc.cliTools import makeOutputFileName from fontTools.misc.loggingTools import Timer from fontTools.misc.plistlib import load as readPlist from fontTools.ttLib import TTFont from fontTools.varLib.interpolate_layout import interpolate_layout from ufo2ft import CFFOptimization, instantiator from ufo2ft.featureCompiler import parseLayoutFeatures from ufo2ft.featureWriters import FEATURE_WRITERS_KEY, loadFeatureWriters from ufo2ft.filters import FILTERS_KEY, loadFilters from ufo2ft.util import makeOfficialGlyphOrder from fontmake.compatibility import CompatibilityChecker from fontmake.errors import FontmakeError, TTFAError from fontmake.ttfautohint import ttfautohint logger = logging.getLogger(__name__) timer = Timer(logging.getLogger("fontmake.timer"), level=logging.DEBUG) PUBLIC_PREFIX = "public." GLYPHS_PREFIX = "com.schriftgestaltung." # for glyphsLib < 2.3.0 KEEP_GLYPHS_OLD_KEY = GLYPHS_PREFIX + "Keep Glyphs" REMOVE_GLYPHS_OLD_KEY = GLYPHS_PREFIX + "Remove Glyphs" # for glyphsLib >= 2.3.0 KEEP_GLYPHS_NEW_KEY = ( GLYPHS_PREFIX + "customParameter.InstanceDescriptorAsGSInstance.Keep Glyphs" ) REMOVE_GLYPHS_NEW_KEY = ( GLYPHS_PREFIX + "customParameter.InstanceDescriptorAsGSInstance.Remove Glyphs" ) GLYPH_EXPORT_KEY = GLYPHS_PREFIX + "Glyphs.Export" COMPAT_CHECK_KEY = GLYPHS_PREFIX + "customParameter.GSFont.Enforce Compatibility Check" INTERPOLATABLE_OUTPUTS = frozenset( ["ttf-interpolatable", "otf-interpolatable", "variable", "variable-cff2"] ) AUTOHINTING_PARAMETERS = ( GLYPHS_PREFIX + "customParameter.InstanceDescriptorAsGSInstance.TTFAutohint options" ) # tempLib keys for fontmake's internal use only, won't be saved to disk INSTANCE_LOCATION_KEY = "com.github.googlefonts.fontmake.instance_location" INSTANCE_FILENAME_KEY = "com.github.googlefonts.fontmake.instance_filename" UFO_STRUCTURE_EXTENSIONS = { "package": ".ufo", "zip": ".ufoz", "json": ".ufo.json", } class CurveConversion(enum.Enum): # convert all cubic Bezier curves to quadratic splines: glyf format 0 ALL_CUBIC_TO_QUAD = "cu2qu" # convert cubic curves to quadratic when more economical: glyf format 1 MIXED_CUBIC_TO_QUAD = "mixed" # skip conversion, treat original curves as quadratic: glyf format 0 KEEP_QUAD = "keep-quad" # skip conversion, treat original curves as cubic or mixed: glyf format 1 KEEP_CUBIC = "keep-cubic" @classmethod def default(cls): return cls.ALL_CUBIC_TO_QUAD @property def convertCubics(self): return self in ( CurveConversion.ALL_CUBIC_TO_QUAD, CurveConversion.MIXED_CUBIC_TO_QUAD, ) @property def allQuadratic(self): return self in ( CurveConversion.ALL_CUBIC_TO_QUAD, CurveConversion.KEEP_QUAD, ) def needs_subsetting(ufo): if KEEP_GLYPHS_OLD_KEY in ufo.lib or KEEP_GLYPHS_NEW_KEY in ufo.lib: return True if REMOVE_GLYPHS_OLD_KEY in ufo.lib or REMOVE_GLYPHS_NEW_KEY in ufo.lib: return True if any(glyph.lib.get(GLYPH_EXPORT_KEY, True) is False for glyph in ufo): return True return False class FontProject: """Provides methods for building fonts.""" def __init__( self, timing=None, # deprecated verbose=None, # deprecated validate_ufo=False, ): if verbose is not None or timing is not None: from warnings import warn from fontmake.__main__ import _configure_logging warn( "The 'verbose'/'timing' arguments are deprecated. " "Logging configuration is global and should not be " "specified in the FontProject constructor. " "Use the logging API to configure fontmake's loggers " "for your application. E.g. fontmake main() function " "uses logging.basicConfig().", UserWarning, stacklevel=2, ) _configure_logging(verbose, timing) logger.debug( "ufoLib UFO validation is %s", "enabled" if validate_ufo else "disabled" ) self.validate_ufo = validate_ufo def open_ufo(self, path): try: path = Path(path) if path.suffix == ".json": with open(path, "rb") as f: # pylint: disable=no-member return ufoLib2.Font.json_load(f) # type: ignore return ufoLib2.Font.open(path, validate=self.validate_ufo) except Exception as e: raise FontmakeError("Reading UFO source failed", path) from e @staticmethod def _fix_ufo_path(path, ufo_structure): """Normalizes UFO path and updates extension suffix to match its structure""" return os.path.normpath( Path(path).with_suffix(UFO_STRUCTURE_EXTENSIONS[ufo_structure]) ) def save_ufo_as(self, font, path, ufo_structure="package", indent_json=False): try: path = _ensure_parent_dir(path) if ufo_structure == "json": with open(path, "wb") as f: # pylint: disable=no-member font.json_dump( f, # orjson only supports either 2 or none indent=2 if indent_json else None, # makes output deterministic sort_keys=True, ) # type: ignore else: font.save( path, overwrite=True, validate=self.validate_ufo, structure=ufo_structure, ) except Exception as e: raise FontmakeError("Writing UFO source failed", path) from e @timer() def build_master_ufos( self, glyphs_path, designspace_path=None, master_dir=None, instance_dir=None, family_name=None, mti_source=None, write_skipexportglyphs=True, generate_GDEF=True, ufo_structure="package", indent_json=False, glyph_data=None, save_ufos=True, ): """Build UFOs and designspace from Glyphs source.""" import glyphsLib if master_dir is None: master_dir = self._output_dir("ufo") if instance_dir is None: instance_dir = self._output_dir("ufo", is_instance=True) if designspace_path is not None: designspace_dir = os.path.dirname(designspace_path) else: designspace_dir = master_dir # glyphsLib.to_designspace expects instance_dir to be relative to the # designspace's own directory try: instance_dir = os.path.relpath(instance_dir, designspace_dir) except ValueError as e: raise FontmakeError( "Can't make instance_dir path relative to designspace. " "If on Windows, please make sure that --instance-dir, " "--master-dir and --designspace-path are on the same mount drive " "(e.g. C: or D:)", glyphs_path, ) from e try: font = glyphsLib.load(glyphs_path) except Exception as e: raise FontmakeError("Loading Glyphs file failed", glyphs_path) from e designspace = glyphsLib.to_designspace( font, family_name=family_name, instance_dir=instance_dir, write_skipexportglyphs=write_skipexportglyphs, ufo_module=ufoLib2, generate_GDEF=generate_GDEF, store_editor_state=False, minimal=True, glyph_data=glyph_data, ) masters = {} # multiple sources can have the same font/filename (but different layer), # we want to save a font only once for source in designspace.sources: ufo_path = self._fix_ufo_path( os.path.join(master_dir, source.filename), ufo_structure ) source.path = ufo_path # relative 'filename' would be auto-updated upon writing the designspace # but we may not always write one out, thus we keep it up-to-date source.filename = os.path.relpath(ufo_path, designspace_dir) if ufo_path in masters: assert source.font is masters[ufo_path] continue masters[ufo_path] = source.font if mti_source: self.add_mti_features_to_master_ufos(mti_source, masters) save_ds = designspace_path is not None or save_ufos if designspace_path is None: designspace_path = os.path.join(master_dir, designspace.filename) if save_ds: logger.info("Saving %s", designspace_path) designspace.write(_ensure_parent_dir(designspace_path)) else: designspace.path = designspace_path if save_ufos: for ufo_path, ufo in masters.items(): logger.info("Saving %s", ufo_path) self.save_ufo_as(ufo, ufo_path, ufo_structure, indent_json) return designspace @timer() def add_mti_features_to_master_ufos(self, mti_source, masters): mti_dir = os.path.dirname(mti_source) with open(mti_source, "rb") as mti_file: mti_paths = readPlist(mti_file) for master_path, master in masters.items(): key = os.path.basename(master_path).rstrip(".ufo") for table, path in mti_paths[key].items(): with open(os.path.join(mti_dir, path), "rb") as mti_source: ufo_path = ( "com.github.googlei18n.ufo2ft.mtiFeatures/%s.mti" % table.strip() ) master.data[ufo_path] = mti_source.read() # If we have MTI sources, any Adobe feature files derived from # the Glyphs file should be ignored. We clear it here because # it only contains junk information anyway. master.features.text = "" def build_otfs(self, ufos, **kwargs): """Build OpenType binaries with CFF outlines.""" self.save_otfs(ufos, **kwargs) def build_ttfs(self, ufos, **kwargs): """Build OpenType binaries with TrueType outlines.""" self.save_otfs(ufos, ttf=True, **kwargs) def _build_interpolatable_masters( self, designspace, ttf, use_production_names=None, reverse_direction=True, ttf_curves=CurveConversion.ALL_CUBIC_TO_QUAD, conversion_error=None, feature_writers=None, cff_round_tolerance=None, debug_feature_file=None, fea_include_dir=None, flatten_components=False, filters=None, auto_use_my_metrics=True, **kwargs, ): if ttf: ttf_curves = CurveConversion(ttf_curves) return ufo2ft.compileInterpolatableTTFsFromDS( designspace, useProductionNames=use_production_names, reverseDirection=reverse_direction, convertCubics=ttf_curves.convertCubics, allQuadratic=ttf_curves.allQuadratic, cubicConversionError=conversion_error, featureWriters=feature_writers, debugFeatureFile=debug_feature_file, feaIncludeDir=fea_include_dir, filters=filters, flattenComponents=flatten_components, autoUseMyMetrics=auto_use_my_metrics, inplace=True, ) else: return ufo2ft.compileInterpolatableOTFsFromDS( designspace, useProductionNames=use_production_names, roundTolerance=cff_round_tolerance, featureWriters=feature_writers, debugFeatureFile=debug_feature_file, feaIncludeDir=fea_include_dir, filters=filters, inplace=True, ) def build_interpolatable_ttfs(self, designspace, **kwargs): """Build OpenType binaries with interpolatable TrueType outlines from DesignSpaceDocument object. """ return self._build_interpolatable_masters(designspace, ttf=True, **kwargs) def build_interpolatable_otfs(self, designspace, **kwargs): """Build OpenType binaries with interpolatable TrueType outlines from DesignSpaceDocument object. """ return self._build_interpolatable_masters(designspace, ttf=False, **kwargs) def build_variable_fonts( self, designspace: designspaceLib.DesignSpaceDocument, variable_fonts: str = ".*", output_path=None, output_dir=None, ttf=True, optimize_gvar=True, optimize_cff=CFFOptimization.SPECIALIZE, use_production_names=None, reverse_direction=True, ttf_curves=CurveConversion.ALL_CUBIC_TO_QUAD, conversion_error=None, feature_writers=None, cff_round_tolerance=None, debug_feature_file=None, fea_include_dir=None, flatten_components=False, filters=None, auto_use_my_metrics=True, drop_implied_oncurves=False, variable_features=True, **kwargs, ): """Build OpenType variable fonts from masters in a designspace.""" assert not (output_path and output_dir), "mutually exclusive args" vfs_in_document = designspace.getVariableFonts() if not vfs_in_document: logger.warning( "No variable fonts in given designspace %s", designspace.path ) return {} vfs_to_build = [] for vf in vfs_in_document: # Skip variable fonts that do not match the user's inclusion regex if given. if not fullmatch(variable_fonts, vf.name): continue vfs_to_build.append(vf) if not vfs_to_build: logger.warning("No variable fonts matching %s", variable_fonts) return {} if len(vfs_to_build) > 1 and output_path: raise FontmakeError( "can't specify output path because there are several VFs to build", designspace.path, ) vf_name_to_output_path = {} if len(vfs_to_build) == 1 and output_path is not None: vf_name_to_output_path[vfs_to_build[0].name] = output_path else: for vf in vfs_to_build: ext = "ttf" if ttf else "otf" font_name = vf.name if vf.filename is not None: font_name = Path(vf.filename).stem output_path = self._output_path( font_name, ext, is_variable=True, output_dir=output_dir ) vf_name_to_output_path[vf.name] = output_path logger.info( "Building variable fonts " + ", ".join(vf_name_to_output_path.values()) ) if ttf: ttf_curves = CurveConversion(ttf_curves) fonts = ufo2ft.compileVariableTTFs( designspace, featureWriters=feature_writers, useProductionNames=use_production_names, convertCubics=ttf_curves.convertCubics, allQuadratic=ttf_curves.allQuadratic, cubicConversionError=conversion_error, reverseDirection=reverse_direction, optimizeGvar=optimize_gvar, flattenComponents=flatten_components, debugFeatureFile=debug_feature_file, feaIncludeDir=fea_include_dir, filters=filters, inplace=True, variableFontNames=list(vf_name_to_output_path), autoUseMyMetrics=auto_use_my_metrics, dropImpliedOnCurves=drop_implied_oncurves, variableFeatures=variable_features, ) else: fonts = ufo2ft.compileVariableCFF2s( designspace, featureWriters=feature_writers, useProductionNames=use_production_names, roundTolerance=cff_round_tolerance, debugFeatureFile=debug_feature_file, feaIncludeDir=fea_include_dir, optimizeCFF=optimize_cff, filters=filters, inplace=True, variableFontNames=list(vf_name_to_output_path), variableFeatures=variable_features, ) for name, font in fonts.items(): output_path = vf_name_to_output_path[name] logger.info("Saving %s", output_path) font.save(_ensure_parent_dir(output_path)) def _iter_compile(self, ufos, ttf=False, debugFeatureFile=None, **kwargs): # generator function that calls ufo2ft compiler for each ufo and # yields ttFont instances options = dict(kwargs) if ttf: for key in ("optimizeCFF", "roundTolerance", "subroutinizer", "cffVersion"): options.pop(key, None) compile_func, fmt = ufo2ft.compileTTF, "TTF" else: for key in ( "convertCubics", "cubicConversionError", "allQuadratic", "reverseDirection", "flattenComponents", "autoUseMyMetrics", "dropImpliedOnCurves", ): options.pop(key, None) compile_func, fmt = ufo2ft.compileOTF, "OTF" writeFontName = len(ufos) > 1 for ufo in ufos: name = self._font_name(ufo) logger.info(f"Building {fmt} for {name}") if debugFeatureFile and writeFontName: debugFeatureFile.write(f"\n### {name} ###\n") try: yield compile_func(ufo, debugFeatureFile=debugFeatureFile, **options) except Exception as e: raise FontmakeError("Compiling UFO failed", ufo.path) from e @timer() def save_otfs( self, ufos, ttf=False, is_instance=False, autohint=None, subset=None, use_production_names=None, subroutinize=None, # deprecated optimize_cff=CFFOptimization.NONE, cff_round_tolerance=None, remove_overlaps=True, overlaps_backend=None, reverse_direction=True, ttf_curves=CurveConversion.ALL_CUBIC_TO_QUAD, conversion_error=None, feature_writers=None, interpolate_layout_from=None, interpolate_layout_dir=None, output_path=None, output_dir=None, debug_feature_file=None, inplace=True, cff_version=1, subroutinizer=None, flatten_components=False, filters=None, generate_GDEF=True, fea_include_dir=None, auto_use_my_metrics=True, drop_implied_oncurves=False, ): """Build OpenType binaries from UFOs. Args: ufos: Font objects to compile. ttf: If True, build fonts with TrueType outlines and .ttf extension. is_instance: If output fonts are instances, for generating paths. autohint (Union[bool, None, str]): Parameters to provide to ttfautohint. If set to None (default), the UFO lib is scanned for autohinting parameters. If nothing is found, the autohinting step is skipped. The lib key is "com.schriftgestaltung.customParameter.InstanceDescriptorAsGSInstance.TTFAutohint options". If set to False, then no autohinting takes place whether or not the source specifies 'TTFAutohint options'. If True, it runs ttfautohint with no additional options. subset: Whether to subset the output according to data in the UFOs. If not provided, also determined by flags in the UFOs. use_production_names: Whether to use production glyph names in the output. If not provided, determined by flags in the UFOs. subroutinize: If True, subroutinize CFF outlines in output. cff_round_tolerance (float): controls the rounding of point coordinates in CFF table. It is defined as the maximum absolute difference between the original float and the rounded integer value. By default, all floats are rounded to integer (tolerance 0.5); a value of 0 completely disables rounding; values in between only round floats which are close to their integral part within the tolerated range. Ignored if ttf=True. remove_overlaps: If True, remove overlaps in glyph shapes. overlaps_backend: name of the library to remove overlaps. Can be either "booleanOperations" (default) or "pathops". reverse_direction: If True, reverse contour directions when compiling TrueType outlines. ttf_curves: Choose between "cu2qu" (default), "mixed", "keep-quad" or "keep-cubic". NOTE: cubics in TTF use glyf v1 which is still draft! conversion_error: Error to allow when converting cubic CFF contours to quadratic TrueType contours. feature_writers: list of ufo2ft-compatible feature writer classes or pre-initialized objects that are passed on to ufo2ft feature compiler to generate automatic feature code. The default value (None) means that ufo2ft will use its built-in default feature writers (for kern, mark, mkmk, etc.). An empty list ([]) will skip any automatic feature generation. interpolate_layout_from: A DesignSpaceDocument object to give varLib for interpolating layout tables to use in output. interpolate_layout_dir: Directory containing the compiled master fonts to use for interpolating binary layout tables. output_path: output font file path. Only works when the input 'ufos' list contains a single font. output_dir: directory where to save output files. Mutually exclusive with 'output_path' argument. flatten_components: If True, flatten nested components to a single level. filters: list of ufo2ft-compatible filter classes or pre-initialized objects that are passed on to ufo2ft pre-processor to modify the glyph set. The filters are either pre-filters or post-filters, called before or after the default filters. The default filters are format specific and some can be disabled with other arguments. auto_use_my_metrics: whether to automatically set USE_MY_METRICS glyf component flags (0x0200). Not needed unless the font has hinted metrics. drop_implied_oncurves: drop on-curve points that can be implied when exactly in the middle of two off-curve points (TrueType only; default: False). """ # noqa: B950 assert not (output_path and output_dir), "mutually exclusive args" if output_path is not None and len(ufos) > 1: raise ValueError("output_path requires a single input") ttf_curves = CurveConversion(ttf_curves) if subroutinize is not None: import warnings warnings.warn( "the 'subroutinize' argument is deprecated, use 'optimize_cff'", UserWarning, stacklevel=2, ) if subroutinize: optimize_cff = CFFOptimization.SUBROUTINIZE else: # for b/w compatibility, we still run the charstring specializer # even when --no-subroutinize is used. Use the new --optimize-cff # option to disable both specilization and subroutinization optimize_cff = CFFOptimization.SPECIALIZE ext = "ttf" if ttf else "otf" if interpolate_layout_from is not None: if interpolate_layout_dir is None: interpolate_layout_dir = self._output_dir(ext, is_instance=False) finder = partial(_varLib_finder, directory=interpolate_layout_dir, ext=ext) # no need to generate automatic features in ufo2ft, since here we # are interpolating precompiled GPOS table with fontTools.varLib. # An empty 'featureWriters' list tells ufo2ft to not generate any # automatic features. # TODO: Add an argument to ufo2ft.compileOTF/compileTTF to # completely skip compiling features into OTL tables feature_writers = [] fonts = self._iter_compile( ufos, ttf, removeOverlaps=remove_overlaps, overlapsBackend=overlaps_backend, optimizeCFF=optimize_cff, roundTolerance=cff_round_tolerance, useProductionNames=use_production_names, reverseDirection=reverse_direction, convertCubics=ttf_curves.convertCubics, allQuadratic=ttf_curves.allQuadratic, cubicConversionError=conversion_error, featureWriters=feature_writers, debugFeatureFile=debug_feature_file, feaIncludeDir=fea_include_dir, cffVersion=cff_version, subroutinizer=subroutinizer, flattenComponents=flatten_components, filters=filters, autoUseMyMetrics=auto_use_my_metrics, dropImpliedOnCurves=drop_implied_oncurves, inplace=True, # avoid extra copy ) if interpolate_layout_from is not None: master_locations = self._designspace_full_source_locations( interpolate_layout_from ) for font, ufo in zip(fonts, ufos): if ( interpolate_layout_from is not None and INSTANCE_LOCATION_KEY in ufo.tempLib ): loc = ufo.tempLib[INSTANCE_LOCATION_KEY] gpos_src = interpolate_layout( interpolate_layout_from, loc, finder, mapped=True ) font["GPOS"] = gpos_src["GPOS"] gsub_src = TTFont(finder(self._closest_location(master_locations, loc))) if "GDEF" in gsub_src: font["GDEF"] = gsub_src["GDEF"] if "GSUB" in gsub_src: font["GSUB"] = gsub_src["GSUB"] # Decide on autohinting and its parameters autohint_thisfont = ( ( None if autohint is False else ( "" # use default options if autohint=True if autohint is True else ( autohint if autohint is not None else ufo.lib.get(AUTOHINTING_PARAMETERS) ) ) ) if ttf else None ) if autohint_thisfont is not None: # if we are autohinting, we save the unhinted font to a # temporary path, and the hinted one to the final destination fd, otf_path = tempfile.mkstemp("." + ext) os.close(fd) elif output_path is None: otf_path = self._output_path( ufo, ext, is_instance, output_dir=output_dir ) else: otf_path = output_path logger.info("Saving %s", otf_path) font.save(_ensure_parent_dir(otf_path)) # 'subset' is an Optional[bool], can be None, True or False. # When False, we never subset; when True, we always do; when # None (default), we check the presence of custom parameters if subset is False: pass elif subset is True or needs_subsetting(ufo): self.subset_otf_from_ufo(otf_path, ufo) if autohint_thisfont is None: continue if output_path is not None: hinted_otf_path = output_path else: hinted_otf_path = self._output_path( ufo, ext, is_instance, autohinted=True, output_dir=output_dir ) try: logger.info("Autohinting %s", hinted_otf_path) ttfautohint( otf_path, _ensure_parent_dir(hinted_otf_path), args=autohint_thisfont, ) except TTFAError: # copy unhinted font to destination before re-raising error shutil.copyfile(otf_path, hinted_otf_path) raise finally: # must clean up temp file os.remove(otf_path) def _save_interpolatable_fonts(self, designspace, output_dir, ttf): ext = "ttf" if ttf else "otf" for source in designspace.sources: assert isinstance(source.font, TTFont) otf_path = self._output_path( source, ext, is_instance=False, interpolatable=True, output_dir=output_dir, suffix=source.layerName, ) logger.info("Saving %s", otf_path) source.font.save(_ensure_parent_dir(otf_path)) source.path = otf_path source.layerName = None for instance in designspace.instances: instance.path = instance.filename = None if output_dir is None: output_dir = self._output_dir(ext, interpolatable=True) designspace_path = os.path.join(output_dir, os.path.basename(designspace.path)) logger.info("Saving %s", designspace_path) designspace.write(designspace_path) def subset_otf_from_ufo(self, otf_path, ufo): """Subset a font using "Keep Glyphs"/"Remove Glyphs" custom parameters, and export flags as set by glyphsLib. "Export Glyphs" is currently not supported: https://github.com/googlei18n/glyphsLib/issues/295. """ from fontTools import subset # we must exclude from the final UFO glyphOrder all the glyphs that were not # exported to OTF because included in 'public.skipExportGlyphs' skip_export_glyphs = set(ufo.lib.get("public.skipExportGlyphs", ())) exported_glyphs = dict.fromkeys( g for g in ufo.keys() if g not in skip_export_glyphs ) ufo_order = makeOfficialGlyphOrder(exported_glyphs, glyphOrder=ufo.glyphOrder) # ufo2ft always inserts a ".notdef" glyph as the first glyph if ".notdef" not in exported_glyphs: ufo_order.insert(0, ".notdef") ot_order = TTFont(otf_path).getGlyphOrder() assert ot_order[0] == ".notdef" assert len(ufo_order) == len(ot_order) for key in (KEEP_GLYPHS_NEW_KEY, KEEP_GLYPHS_OLD_KEY): keep_glyphs_list = ufo.lib.get(key) if keep_glyphs_list is not None: keep_glyphs = set(keep_glyphs_list) break else: keep_glyphs = None for key in (REMOVE_GLYPHS_NEW_KEY, REMOVE_GLYPHS_OLD_KEY): remove_glyphs_list = ufo.lib.get(key) if remove_glyphs_list is not None: remove_glyphs = set(remove_glyphs_list) break else: remove_glyphs = None include = [] for source_name, binary_name in zip(ufo_order, ot_order): if keep_glyphs and source_name not in keep_glyphs: continue if remove_glyphs and source_name in remove_glyphs: continue if source_name in ufo: exported = ufo[source_name].lib.get(GLYPH_EXPORT_KEY, True) if not exported: continue include.append(binary_name) # copied from nototools.subset opt = subset.Options() opt.name_IDs = ["*"] opt.name_legacy = True opt.name_languages = ["*"] opt.layout_features = ["*"] opt.notdef_outline = True opt.recalc_bounds = True opt.recalc_timestamp = True opt.canonical_order = True opt.glyph_names = True font = subset.load_font(otf_path, opt, lazy=False) subsetter = subset.Subsetter(options=opt) subsetter.populate(glyphs=include) subsetter.subset(font) subset.save_font(font, otf_path, opt) def run_from_glyphs( self, glyphs_path, designspace_path=None, master_dir=None, instance_dir=None, family_name=None, mti_source=None, write_skipexportglyphs=True, generate_GDEF=True, glyph_data=None, output=(), output_dir=None, interpolate=False, **kwargs, ): """Run toolchain from Glyphs source. Args: glyphs_path: Path to source file. designspace_path: Output path of generated designspace document. By default it's "[-].designspace". master_dir: Directory where to save UFO masters (default: "master_ufo"). instance_dir: Directory where to save UFO instances (default: "instance_ufo"). family_name: If provided, uses this family name in the output. mti_source: Path to property list file containing a dictionary mapping UFO masters to dictionaries mapping layout table tags to MTI source paths which should be compiled into those tables. glyph_data: A list of GlyphData XML file paths. kwargs: Arguments passed along to run_from_designspace. """ # only save *master* UFOs when explicitly requested: i.e. outputs contain # 'ufo' and the -i/--interpolate option was not passed (that's for *instances*) # or a --master-dir was set save_ufos = "ufo" in output and (not interpolate or master_dir is not None) # take --output-dir to mean same as --master-dir when -o ufo and not -i if ( set(output) == {"ufo"} and not interpolate and master_dir is None and output_dir is not None ): master_dir = output_dir logger.info("Building master UFOs and designspace from Glyphs source") designspace = self.build_master_ufos( glyphs_path, designspace_path=designspace_path, master_dir=master_dir, instance_dir=instance_dir, family_name=family_name, mti_source=mti_source, write_skipexportglyphs=write_skipexportglyphs, generate_GDEF=generate_GDEF, ufo_structure=kwargs.get("ufo_structure", "package"), indent_json=kwargs.get("indent_json"), glyph_data=glyph_data, save_ufos=save_ufos, ) # 'include' statements in features.fea should be resolved relative to # the input .glyphs path, like Glyphs.app would do, and not relative # to the UFOs that are generated by glyphsLib. fea_include_dir = os.path.dirname(glyphs_path) try: self.run_from_designspace( designspace, output=output, fea_include_dir=fea_include_dir, output_dir=output_dir, interpolate=interpolate, **kwargs, ) except FontmakeError as e: e.source_trail.append(glyphs_path) raise def _instance_ufo_path( self, instance, designspace_path, output_dir=None, ufo_structure="package" ): """Return an instance path, optionally overriding output dir or extension""" # prefer absolute instance.path over relative instance.filename instance_path = instance.path if instance_path is not None: instance_dir = Path(instance_path).parent elif instance.filename is not None: instance_path = Path(designspace_path).parent / instance.filename instance_dir = instance_path.parent else: # if neither is set, make one up from UFO family/style names instance_path = self._font_name(instance.font) instance_dir = None # let --output-dir override the instance UFO directory if output_dir is not None: instance_dir = output_dir # fall back to 'instance_ufo/' if we can't find a suitable directory if instance_dir is None: instance_dir = self._output_dir("ufo", is_instance=True) instance_path = Path(instance_dir) / Path(instance_path).name return self._fix_ufo_path(instance_path, ufo_structure) def interpolate_instance_ufos( self, designspace, include=None, round_instances=False, expand_features_to_instances=False, fea_include_dir=None, ufo_structure="package", indent_json=False, save_ufos=True, output_path=None, output_dir=None, ): """Interpolate master UFOs with Instantiator and return instance UFOs. Args: designspace: a DesignSpaceDocument object containing sources and instances. include (str): optional regular expression pattern to match the DS instance 'name' attribute and only interpolate the matching instances. round_instances (bool): round instances' coordinates to integer. expand_features_to_instances: parses the master feature file, expands all include()s and writes the resulting full feature file to all instance UFOs. Use this if you share feature files among masters in external files. Otherwise, the relative include paths can break as instances may end up elsewhere. Only done on interpolation. Returns: generator of ufoLib2.Font objects corresponding to the UFO instances. Raises: FontmakeError: instances could not be prepared for interpolation or interpolation failed. ValueError: an instance descriptor did not have a filename attribute set. """ from glyphsLib.interpolation import apply_instance_data_to_ufo assert not (output_path and output_dir), "mutually exclusive args" logger.info("Interpolating master UFOs from designspace") for _location, subDoc in splitInterpolable(designspace): try: generator = instantiator.Instantiator.from_designspace( subDoc, round_geometry=round_instances ) except instantiator.InstantiatorError as e: raise FontmakeError( "Preparing the Designspace for interpolation failed", designspace.path, ) from e if expand_features_to_instances: logger.debug("Expanding features to instance UFOs") fea_txt = parseLayoutFeatures( subDoc.default.font, includeDir=fea_include_dir ).asFea() generator = dataclasses.replace(generator, copy_feature_text=fea_txt) for instance in subDoc.instances: # Skip instances that have been set to non-export in Glyphs, stored as the # instance's `com.schriftgestaltung.export` lib key. if not instance.lib.get("com.schriftgestaltung.export", True): continue # Skip instances that do not match the user's inclusion regex if given. if include is not None and not fullmatch(include, instance.name): continue logger.info("Generating instance UFO for {!r}".format(instance.name)) try: instance.font = generator.generate_instance(instance) except instantiator.InstantiatorError as e: raise FontmakeError( "Interpolating instance {!r} failed.".format( instance.styleName ), designspace.path, ) from e apply_instance_data_to_ufo(instance.font, instance, subDoc) if save_ufos: if output_path is not None: # we don't know in advance how many instances we will generate # (depends on splitInterpolable and include filter); if we # overwrite or stop in the middle of the build it'd be worse, # so we make the output_path unique using #1, #2, etc. suffix instance_path = makeOutputFileName( output_path, extension=UFO_STRUCTURE_EXTENSIONS[ufo_structure], ) else: instance_path = self._instance_ufo_path( instance, designspace.path, output_dir, ufo_structure ) logger.info("Saving %s", instance_path) self.save_ufo_as( instance.font, instance_path, ufo_structure, indent_json ) elif instance.filename is not None: # saving a UFO sets its path attribute; when saving the binary font # compiled from this UFO, self._output_path() uses the ufo.path to # make up the output path. Since we aren't saving the UFO in this # case, the ufo.path is not set (it's a read-only attribute). # Therefore we resort to this temporary lib key to pass down the DS # instance filename to self._output_path() method and make sure the # font is named correctly whether or not the UFO is saved to disk. instance.font.tempLib[INSTANCE_FILENAME_KEY] = instance.filename # --interpolate-binary-layout needs to know the location of each # instance UFO; the previous code relied on matching instance.path and # ufo.path, but we no longer necessarily save the UFO thus the ufo.path # may not be set. Instead store the location directly in the ufo.tempLib instance.font.tempLib[INSTANCE_LOCATION_KEY] = instance.location yield instance.font def run_from_designspace( self, designspace, output=(), interpolate=False, variable_fonts: str = ".*", masters_as_instances=False, interpolate_binary_layout=False, round_instances=False, feature_writers=None, variable_features=True, filters=None, expand_features_to_instances=False, check_compatibility=None, **kwargs, ): """Run toolchain from a DesignSpace document to produce either static instance fonts (ttf or otf), interpolatable or variable fonts. Args: designspace: Path to designspace or DesignSpaceDocument object. interpolate: If True output all instance fonts, otherwise just masters. If the value is a string, only build instance(s) that match given name. The string is compiled into a regular expression and matched against the "name" attribute of designspace instances using `re.fullmatch`. variable_fonts: if True output all variable fonts, otherwise if the value is a string, only build variable fonts that match the given filename. As above, the string is compiled into a regular expression and matched against the "filename" attribute of designspace variable fonts using `re.fullmatch`. masters_as_instances: If True, output master fonts as instances. interpolate_binary_layout: Interpolate layout tables from compiled master binaries. round_instances: apply integer rounding when interpolating static instance UFOs. kwargs: Arguments passed along to run_from_ufos. Raises: TypeError: "variable" or "interpolatable" outputs are incompatible with arguments "interpolate", "masters_as_instances", and "interpolate_binary_layout". """ interp_outputs = INTERPOLATABLE_OUTPUTS.intersection(output) static_outputs = set(output).difference(interp_outputs) if interp_outputs: for argname in ( "interpolate", "masters_as_instances", "interpolate_binary_layout", ): if locals()[argname]: raise TypeError( '"%s" argument incompatible with output %r' % (argname, ", ".join(sorted(interp_outputs))) ) if isinstance(designspace, (str, os.PathLike)): designspace_path = os.fspath(designspace) try: designspace = designspaceLib.DesignSpaceDocument.fromfile( designspace_path ) except Exception as e: raise FontmakeError( "Reading Designspace failed", designspace_path ) from e elif isinstance(designspace, designspaceLib.DesignSpaceDocument): # get our own DS copy so we can modify in-place designspace = designspace.deepcopyExceptFonts() else: raise TypeError( f"expected path or DesignSpaceDocument, found {type(designspace.__name__)}" ) logger.info("Loading %s DesignSpace source UFOs", len(designspace.sources)) designspace.loadSourceFonts(opener=self.open_ufo) # if no --feature-writers option was passed, check in the designspace's # element if user supplied a custom featureWriters configuration; # if so, use that for all the UFOs built from this designspace if feature_writers is None and FEATURE_WRITERS_KEY in designspace.lib: feature_writers = loadFeatureWriters(designspace) if filters is None and FILTERS_KEY in designspace.lib: preFilters, postFilters = loadFilters(designspace) filters = preFilters + postFilters # Since Designspace version 5, one designspace file can have discrete # axes (that do not interpolate) and thus only some sub-spaces are # actually compatible for interpolation. for discrete_location, subDoc in splitInterpolable(designspace): # glyphsLib currently stores this custom parameter on the fonts, # not the designspace, so we check if it exists in any font's lib. source_fonts = [source.font for source in subDoc.sources] explicit_check = any( font.lib.get(COMPAT_CHECK_KEY, False) for font in source_fonts ) if check_compatibility is not False and ( interp_outputs or check_compatibility or explicit_check ): if not CompatibilityChecker(source_fonts).check(): message = "Compatibility check failed" if discrete_location: message += f" in interpolable sub-space at {discrete_location}" raise FontmakeError(message, designspace.path) try: if static_outputs: self._run_from_designspace_static( designspace, outputs=static_outputs, interpolate=interpolate, masters_as_instances=masters_as_instances, interpolate_binary_layout=interpolate_binary_layout, round_instances=round_instances, feature_writers=feature_writers, expand_features_to_instances=expand_features_to_instances, filters=filters, **kwargs, ) if interp_outputs: self._run_from_designspace_interpolatable( designspace, outputs=interp_outputs, variable_fonts=variable_fonts, feature_writers=feature_writers, filters=filters, variable_features=variable_features, **kwargs, ) except FontmakeError as e: # Some called functions already added the Designspace file to the source # trail. if e.source_trail[-1] != designspace.path: e.source_trail.append(designspace.path) raise except Exception as e: raise FontmakeError( "Generating fonts from Designspace failed", designspace.path ) from e def _run_from_designspace_static( self, designspace, outputs, interpolate=False, masters_as_instances=False, interpolate_binary_layout=False, round_instances=False, feature_writers=None, expand_features_to_instances=False, fea_include_dir=None, ufo_structure="package", indent_json=False, output_path=None, output_dir=None, **kwargs, ): save_ufos = "ufo" in outputs ufos = [] if not interpolate or masters_as_instances: unique_srcs = {id(s.font): s.font for s in designspace.sources} ufos.extend(unique_srcs.values()) if interpolate: pattern = interpolate if isinstance(interpolate, str) else None # use --output-{path,dir} options for instance UFOs if 'ufo' is the only -o ufo_output_path = ufo_output_dir = None if set(outputs) == {"ufo"}: if output_path is not None: ufo_output_path = output_path if output_dir is not None: ufo_output_dir = output_dir ufos.extend( self.interpolate_instance_ufos( designspace, include=pattern, round_instances=round_instances, expand_features_to_instances=expand_features_to_instances, fea_include_dir=fea_include_dir, ufo_structure=ufo_structure, indent_json=indent_json, save_ufos=save_ufos, output_path=ufo_output_path, output_dir=ufo_output_dir, ) ) if interpolate_binary_layout is False: interpolate_layout_from = interpolate_layout_dir = None else: interpolate_layout_from = designspace # Unload UFO fonts, we will reload them as binary for s in interpolate_layout_from.sources: s.font = None if isinstance(interpolate_binary_layout, str): interpolate_layout_dir = interpolate_binary_layout else: interpolate_layout_dir = None self.run_from_ufos( ufos, output=outputs, is_instance=(interpolate or masters_as_instances), interpolate_layout_from=interpolate_layout_from, interpolate_layout_dir=interpolate_layout_dir, feature_writers=feature_writers, fea_include_dir=fea_include_dir, output_path=output_path, output_dir=output_dir, **kwargs, ) def _run_from_designspace_interpolatable( self, designspace, outputs, variable_fonts: str = ".*", variable_features=True, output_path=None, output_dir=None, **kwargs, ): ttf_designspace = otf_designspace = None if "variable" in outputs: self.build_variable_fonts( designspace, variable_fonts=variable_fonts, variable_features=variable_features, output_path=output_path, output_dir=output_dir, **kwargs, ) if "ttf-interpolatable" in outputs: ttf_designspace = self.build_interpolatable_ttfs(designspace, **kwargs) self._save_interpolatable_fonts(ttf_designspace, output_dir, ttf=True) if "variable-cff2" in outputs: self.build_variable_fonts( designspace, variable_fonts=variable_fonts, variable_features=variable_features, output_path=output_path, output_dir=output_dir, ttf=False, **kwargs, ) if "otf-interpolatable" in outputs: otf_designspace = self.build_interpolatable_otfs(designspace, **kwargs) self._save_interpolatable_fonts(otf_designspace, output_dir, ttf=False) def run_from_ufos(self, ufos, output=(), **kwargs): """Run toolchain from UFO sources. Args: ufos: List of UFO sources, as either paths or opened objects. output: List of output formats to generate. kwargs: Arguments passed along to save_otfs. """ if set(output) == {"ufo"}: return if "otf" in output and "otf-cff2" in output: raise ValueError("'otf' and 'otf-cff2' outputs are mutually exclusive") # the `ufos` parameter can be a list of UFO objects # or it can be a path (string) with a glob syntax if isinstance(ufos, str): ufos = [self.open_ufo(x) for x in glob.glob(ufos)] elif isinstance(ufos, list): # ufos can be either paths or open Font objects, so normalize them ufos = [self.open_ufo(x) if isinstance(x, str) else x for x in ufos] else: raise TypeError( "UFOs parameter is neither a ufoLib2.Font object, a path or a glob, " f"nor a list of any of these: {ufos:r}." ) cff_version = 1 if "otf" in output else 2 if "otf-cff2" in output else None # if building both OTF & TTF we must tell ufo2ft to compile with inplace=False inplace = not (cff_version is not None and "ttf" in output) if cff_version is not None: self.build_otfs(ufos, cff_version=cff_version, inplace=inplace, **kwargs) if "ttf" in output: self.build_ttfs(ufos, inplace=inplace, **kwargs) @staticmethod def _search_instances(designspace, pattern): instances = OrderedDict() for instance in designspace.instances: # is 'name' optional? 'filename' certainly must not be if fullmatch(pattern, instance.name): instances[instance.name] = instance.filename if not instances: raise FontmakeError("No instance found with %r" % pattern) return instances def _font_name(self, ufo): """Generate a postscript-style font name.""" family_name = ( ufo.info.familyName.replace(" ", "") if ufo.info.familyName is not None else "None" ) style_name = ( ufo.info.styleName.replace(" ", "") if ufo.info.styleName is not None else "None" ) return f"{family_name}-{style_name}" def _output_dir( self, ext, is_instance=False, interpolatable=False, autohinted=False, is_variable=False, ): """Generate an output directory. Args: ext: extension string. is_instance: The output is instance font or not. interpolatable: The output is interpolatable or not. autohinted: The output is autohinted or not. is_variable: The output is variable font or not. Return: output directory string. """ assert not (is_variable and any([is_instance, interpolatable])) # FIXME? Use user configurable destination folders. if is_variable: dir_prefix = "variable_" elif is_instance: dir_prefix = "instance_" else: dir_prefix = "master_" dir_suffix = "_interpolatable" if interpolatable else "" output_dir = dir_prefix + ext + dir_suffix if autohinted: output_dir = os.path.join("autohinted", output_dir) return output_dir def _output_path( self, ufo_or_font_name, ext, is_instance=False, interpolatable=False, autohinted=False, is_variable=False, output_dir=None, suffix=None, ): """Generate output path for a font file with given extension.""" if isinstance(ufo_or_font_name, str): font_name = ufo_or_font_name else: ufo = ufo_or_font_name if ufo.path: font_name = os.path.splitext( os.path.basename(os.path.normpath(ufo.path)) )[0] elif INSTANCE_FILENAME_KEY in ufo.tempLib: font_name = Path(ufo.tempLib[INSTANCE_FILENAME_KEY]).stem else: font_name = self._font_name(ufo) if output_dir is None: output_dir = self._output_dir( ext, is_instance, interpolatable, autohinted, is_variable ) if suffix: return os.path.join(output_dir, f"{font_name}-{suffix}.{ext}") else: return os.path.join(output_dir, f"{font_name}.{ext}") def _designspace_full_source_locations(self, designspace): """Map "full" sources' paths to their locations in a designspace. 'Sparse layer' sources only contributing glyph outlines but no info/kerning/features are ignored. """ location_map = {} default_source = designspace.findDefault() for source in designspace.sources: if source is default_source or source.layerName is not None: location_map[_normpath(source.path)] = source.location return location_map def _closest_location(self, location_map, target): """Return path of font whose location is closest to target.""" def dist(a, b): return math.sqrt(sum((a[k] - b[k]) ** 2 for k in a.keys())) paths = iter(location_map.keys()) closest = next(paths) closest_dist = dist(target, location_map[closest]) for path in paths: cur_dist = dist(target, location_map[path]) if cur_dist < closest_dist: closest = path closest_dist = cur_dist return closest def _varLib_finder(source, directory="", ext="ttf"): """Finder function to be used with varLib.build to find master TTFs given the filename of the source UFO master as specified in the designspace. It replaces the UFO directory with the one specified in 'directory' argument, and replaces the file extension with 'ext'. """ fname = os.path.splitext(os.path.basename(source))[0] + "." + ext return os.path.join(directory, fname) def _normpath(fname): return os.path.normcase(os.path.normpath(fname)) def _ensure_parent_dir(path): Path(path).parent.mkdir(parents=True, exist_ok=True) return path googlefonts-fontmake-7ed5123/Lib/fontmake/instantiator.py000066400000000000000000000002601470572777600236250ustar00rootroot00000000000000"""fontmake.instantiator has been moved to ufo2ft.instantiator. This alias is only kept for backward compatibility. """ from ufo2ft.instantiator import * # noqa: F403, F401 googlefonts-fontmake-7ed5123/Lib/fontmake/ttfautohint.py000066400000000000000000000063301470572777600234630ustar00rootroot00000000000000# Copyright 2016 Google Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import shutil import subprocess import sys from typing import List, Optional from fontmake.errors import FontmakeError, TTFAError def _which_ttfautohint() -> Optional[List[str]]: # First check if ttfautohint-py is installed, else try to find the standalone # ttfautohint command-line tool, or None if neither is found. try: import ttfautohint # noqa: F401 except ImportError: ttfautohint_path = shutil.which("ttfautohint") return [ttfautohint_path] if ttfautohint_path else None else: return [sys.executable, "-m", "ttfautohint"] def ttfautohint(in_file, out_file, args=None, **kwargs): """Thin wrapper around the ttfautohint command line tool. Can take in command line arguments directly as a string, or spelled out as Python keyword arguments. """ file_args = [in_file, out_file] ttfautohint = _which_ttfautohint() if ttfautohint is None: raise FontmakeError( "ttfautohint not found; try `pip install ttfautohint-py`", in_file ) if args is not None: if kwargs: raise TypeError("Should not provide both cmd args and kwargs.") try: rv = subprocess.call(ttfautohint + args.split() + file_args) except OSError as e: raise FontmakeError( "Could not launch ttfautohint (is it installed?)", in_file ) from e if rv != 0: raise TTFAError(rv, in_file) return boolean_options = ( "debug", "composites", "dehint", "help", "ignore_restrictions", "detailed_info", "no_info", "adjust_subglyphs", "symbol", "ttfa_table", "verbose", "version", "windows_compatibility", ) other_options = ( "default_script", "fallback_script", "family_suffix", "hinting_limit", "fallback_stem_width", "hinting_range_min", "control_file", "hinting_range_max", "strong_stem_width", "increase_x_height", "x_height_snapping_exceptions", ) arg_list = [] for option in boolean_options: if kwargs.pop(option, False): arg_list.append("--" + option.replace("_", "-")) for option in other_options: arg = kwargs.pop(option, None) if arg is not None: arg_list.append("--{}={}".format(option.replace("_", "-"), arg)) if kwargs: raise TypeError("Unexpected argument(s): " + ", ".join(kwargs.keys())) rv = subprocess.call(ttfautohint + arg_list + file_args) if rv != 0: raise TTFAError(rv, in_file) googlefonts-fontmake-7ed5123/MANIFEST.in000066400000000000000000000002161470572777600177610ustar00rootroot00000000000000include README.rst include CONTRIBUTING.md include LICENSE include *requirements.txt recursive-include tests *.glyphs *.designspace *.plist googlefonts-fontmake-7ed5123/README.md000066400000000000000000000142151470572777600175060ustar00rootroot00000000000000![GitHub Actions Build Status][] ![Python Versions][] [![PyPI Version][]][1] # fontmake `fontmake` compiles fonts from various sources (`.glyphs`, `.ufo`, `designspace`) into binaries (`.otf`, `.ttf`). You can use it to create static instances and variable fonts. ## Installation Fontmake requires Python 3.8 or later. Releases are available on [PyPI][] and can be installed with [pip][]. ``` bash pip3 install fontmake ``` Use the `-U`, `--upgrade` option to update fontmake and its dependencies to the newest available release: ``` bash pip3 install -U fontmake ``` ## Basic Usage After installation, you will be able to use the `fontmake` executable. For example, to compile a variable font from a Glyphs source file, use: ``` bash fontmake MyFont.glyphs -o variable ``` The most important command line arguments to the `fontmake` executable are the required input, specified either as positional argument or using one of `-g`/`-u`/`-m` flags, and the optional `-o` flag, which chooses the output file format. ### Source file format options There are two ways to specify the source file or files: One can either use the following, mutually exclusive, flags: * `-g filename.glyphs`: Converts a Glyphs source file to binary. * `-u filename.ufo ...`: Converts one or more UFO(Z) files to binary. * `-m filename.designspace`: Converts a Designspace file to binary. (The `-m` is for `mutatormath`, an old Python library for handling designspaces.) Alternatively, one can specify the input(s) as positional arguments without the flag, letting fontmake infer the source format from the file extension: e.g. ``fontmake MyFont.designspace``, etc. Note: if the positional arguments are preceded by an option that takes one or more arguments, you need to use the special `--` separator to mark all following arguments as positional (non-options), otherwise the parser gets confused. E.g., the `-i` option takes zero or one arguments (see futher below for details); without `--`, argparse thinks you didn't provide any inputs: ```bash fontmake -i -- MyFont.designspace ``` Exactly one type of input can/must be specified, using either approaches. ### Output file format options You may provide one or more output file formats after the `-o` option. For example, `-o otf ttf` creates OTF and TTF binary font files for each master in your input file. The following output file formats are available: * `otf`: Per-master OTF (CFF-outline) binaries. Placed in the `master_otf/` directory. * `ttf`: Per-master TTF (TrueType-outline) binaries. Placed in the `master_ttf/` directory. * `otf-cff2`: Per-master OTF binaries with CFF2 outlines. Placed in the `master_otf/` directory. * `variable`: A TrueType variable font. Placed in the `variable_ttf/` directory. * `variable-cff2`: A variable font with CFF2 outlines. Placed in the `variable_otf/` directory. The following output file formats are also available, but are generally used internally by fontmake as an intermediate step to one of the above outputs: * `otf-interpolatable`: OTF binaries suitable for merging into a variable font. Placed in the `master_otf_interpolatable/` directory. (These differ from `otf` in that the outlines are unoptimized.) * `ttf-interpolatable`: TTF binaries suitable for merging into a variable font. Placed in the `master_ttf_interpolatable/` directory. (The outlines are converted to quadratic curves in an interpolation-compatible way.) * `ufo`: Glyphs sources can be converted to UFO, or to UFO zip (`.ufoz`) format with the flag `--save-ufo-as-zip`. Placed in the `master_ufo/` directory. If no format option is specified, the default is `-o otf ttf`. ### Other important command line options * `-i` (Interpolate instances): Having per-master binaries is not always what you expect; if you have defined instances ("exports") in your Glyphs file, they will *not* be generated by default. To generate them, pass the `-i` flag, which interpolates static instances, and places them in the `instance_ttf/` or `instance_otf/` directory as appropriate. * `--output-dir `: Places all output in the given directory, instead of the per-format directories mentioned above. * `--output-path `: This is only valid if the output is a single binary file, and writes the output to the given filename. * `-f` (Flatten components): Ensures that any glyphs which contain components which *themselves* contain components are decomposed to a single level. This is recommended as certain rendering environments do not correctly handle nested components - see [this link](https://github.com/googlefonts/fontbakery/issues/2961) for more details. ## Advanced Usage See [`USAGE.md`](USAGE.md). ## Troubleshooting See [`TROUBLESHOOTING.md`](TROUBLESHOOTING.md). ## Developers Developers can get the latest version of `fontmake` by cloning the git repository: ``` bash git clone https://github.com/googlefonts/fontmake cd fontmake pip install . ``` Developers who want to quickly test changes to the source code without re-installing can use the "--editable" option when installing from a local source checkout: ``` bash pip install -e . ``` It is recommended to install fontmake inside a virtual environment to prevent conflicts between its dependencies and other modules installed globally. You could also use the [pipx][] tool to automate the installation/upgrade of python apps like fontmake in isolated environments. ### Releasing a New Version 0. Commit and push your final changes for the new version. 1. Create an annotated Git tag of the version number, with a prepended "v", like so: `git tag -a v3.1.1` 2. Write the release notes into the tag message. They will show up as release notes on the release page in GitHub. 3. Push the tag like so: `git push origin v3.1.1`, where `origin` is the name of the usual remote you want to push the version to. [GitHub Actions Build Status]: https://github.com/googlefonts/fontmake/workflows/Test%20+%20Deploy/badge.svg [Python Versions]: https://img.shields.io/badge/python-3.8-blue.svg [PyPI Version]: https://img.shields.io/pypi/v/fontmake.svg [1]: https://pypi.org/project/fontmake/ [PyPI]: https://pypi.org/project/fontmake [pip]: https://pip.pypa.io [pipx]: https://github.com/pipxproject/pipx googlefonts-fontmake-7ed5123/TROUBLESHOOTING.md000066400000000000000000000061711470572777600210420ustar00rootroot00000000000000# Troubleshooting Sometimes things go wrong with `fontmake`, and you will need to track down what happened. In such circumstances, it is best to remember that `fontmake` itself does not actually do very much; its job is merely to orchestrate calls to different Python libraries which perform the compilation steps. So: * If something goes wrong with converting Glyphs files to `.designspace` and `.ufo` files, that's probably a problem with [`glyphsLib`](https://github.com/googlefonts/glyphsLib). * Run pre-processing filters: * If something goes wrong converting cubics to quadratics, that's probably a problem with [`cu2qu`](https://github.com/googlefonts/cu2qu). * If something goes wrong when decomposing mixed glyphs, that's probably a problem with [`ufo2ft.filters.decomposeComponents`](https://github.com/googlefonts/ufo2ft/blob/main/Lib/ufo2ft/filters/decomposeComponents.py). * If something goes wrong when removing overlaps, that's probably a problem with [`booleanOperations`](https://github.com/typemytype/booleanOperations) * Anything else that goes wrong is probably a problem with [`ufo2ft`](https://github.com/googlefonts/ufo2ft), except... * ...if something goes wrong when compiling multiple files into a variable font, that's probably a problem with [`fontTools.varLib`](https://github.com/fonttools/fonttools/tree/main/Lib/fontTools/varLib). In other words, any problems you experience are generally *not* problems with `fontmake`. But it's important to know at which point things went wrong, and which Python library was handling your font at the time. To do this, you can follow the following troubleshooting steps: ## Troubleshooting steps * If your design source is a Glyphs file, the first step that `fontmake` will peform is to using `glyphsLib` to convert the file to masters + designspace and place them in the `master_ufo` directory. So a good start is to inspect the files in this directory and make sure that they look the way you would expect them to look. Pay particular attention to the axis ranges of multiple-axis fonts and the positions of masters and instances on these axes in the `.designspace` file. If this is correct, you can use `fontmake -m` on the `.designspace` file to skip the Glyphs conversion step on subsequent runs. * Once you have UFO files (or if you started with them in the first place), it can be helpful to pass the `--validate-ufo` flag to `fontmake` to check that the UFO files are valid and correct. * Next, if you receive an error from `fontmake`, you can get the full traceback by changing the log level by passing the `--verbose DEBUG` flag. Please pass this flag before filing any issues - although often the full traceback will point you to the source of the problem! * Finally, you can debug the operation of the feature writers by passing the `--debug-feature-file ` flag. This will cause `fontmake` to write out the generated feature file to a known filename, allowing you to inspect the file afterwards and check that it is as expected. If none of these steps are helpful, please file an issue in the `fontmake` repository, or in the repository of the Python library responsible for the problem. googlefonts-fontmake-7ed5123/USAGE.md000066400000000000000000000462211470572777600174170ustar00rootroot00000000000000# Advanced Usage This guide assumes that you have read the basic instructions in `README.md`. ## Functional overview `fontmake` has many more options than the basic ones outlined in `README.md`. These options customize various elements of the font compilation process, and so to understand the options, it helps to understand the general outline of the process by which `fontmake` creates binary fonts. Here are the basic operations: * Convert Glyphs file to `.designspace` and `.ufo` files. * Run pre-processing filters. (Convert cubics to quadratics for TTF outlines, decompose mixed glyphs, remove overlaps, etc.) * Generate explicit feature files. (Turn anchor and kerning information in source file into Adobe feature file syntax, so that it can be compiled into OpenType layout.) * Create outlines. * Build OpenType tables. * Run post-processing filters. (Rename glyphs to production names.) For most people, the default settings will produce optimal results, but in some situations you may wish to alter the default operation. ## General options * `--no-production-names`: By default, `fontmake` renames the glyphs in the output binary font file during post-processing based on the value of the `public.postscriptNames` lib key in the UFO file. (In the case of Glyphs source files, conversion to UFO populates this lib key with the production names from the Glyphs file.) Any encoded glyphs without production names are renamed to `uniXXXX` based on their Unicode code point, unencoded ligature glyphs are renamed based on the production names of their components, and other unencoded glyphs are not renamed. The `--no-production-names` flag suppresses all glyph renaming. * `-a`/`-a ""`: Run ttfautohint on TrueType output binary font files. If any arguments are provided in a quoted string, these are passed to the `ttfautohint` binary. * `--mti-source `: Instead of generating feature files from the design sources, this takes an external plist file which links masters to Monotype FontDame feature definition files. You may safely ignore this option unless you are compiling Monotype-supplied font sources for the Noto project. ## Options for Glyphs sources * `--no-write-skipexportglyphs`: When converting the Glyphs sources to UFO, all glyphs, even glyphs not set to be exported into the font, are converted to UFO format. Glyphs which are set as unexported are listed in the `public.skipExportGlyphs` lib key of the UFO and designspace files. Before this key was standardized by UFO, older versions of `fontmake` would use a private lib key, `com.schriftgestaltung.Glyphs.Export` instead. If you are managing a workflow which tracks files created by an older version of `fontmake`, you may wish to use this flag to use the older lib key and maintain compatibility with those files. * `--instance-dir `: When generating static instances from Glyphs sources with the `-i` flag, `fontmake` writes UFO files representing the instances to the `instance_ufo` directory by default before compiling them to binary. This flag directs `fontmake` to write these temporary UFO files to another directory. If you pass the special value `{tmp}`, `fontmake` uses a temporary directory which it removes after processing. * `--master-dir `: Similarly, this specifies the directory to be used when writing UFO files representing the font masters. * `--designspace-path `: When converting the masters to UFO, `fontmake` also creates a Designspace file in the `master_ufo` directory. This option specifies the path where the Designspace file should be written. * `--family-name `: When this flag is provided, the masters are given the family name supplied, and only instances containing that family name are exported. For example, you can use this to create multiple optical-size-specific subfamilies from a single Glyphs file; `--family-name "MyFont 12pt"` will set the family name to `MyFont 12pt` and only export the instances which contain `MyFont 12pt` in the `familyName` custom parameter of the instance definition. * `--subset` / `--no-subset`: By default, `fontmake` determines whether or not to subset an instance based on the presence or absence of "Keep Glyphs" custom parameter on the instance. To turn off subsetting despite the presence of a "Keep Glyphs" custom parameter, use the `--no-subset` flag. ## Options for TrueType outlines * `--keep-overlaps`: By default, `fontmake` performs overlap removal on TrueType outlines, except when producing interpolatable or variable fonts. This flag directs `fontmake` to skip the overlap removal preprocessing step. * `--overlaps-backend booleanOperations|pathops`: Chooses the library for overlap removal. Skia's pathops library is faster but requires an additional library to be installed, and also appears to [fail on some glyphs](https://github.com/google/fonts/issues/3365), hence the default is the `booleanOperations` library. * `--no-optimize-gvar`: When compiling a variable font, the variation information is stored in a table called the `gvar` table inside the binary. OpenType allows fonts to omit some variations in the outlines if the variation information can be inferred from the surrounding points - for example, points along a line will often change at a rate determined by the average of the variations of their neighbours. Omitting variations for such points makes the font size smaller, so `fontmake` performs this optimization by default: this is called "Interpolation of Untouched Points", or IUP. This flag turns off the IUP optimization. * `--keep-direction`: Generally speaking, filled outlines in a TrueType font should have their points arranged in clockwise order and counter outlines should have their points in anti-clockwise order; design tools tend to order contours the other way around, so `fontmake` reverses the outlines when generating TrueType fonts. This flag keeps the outline direction as specified in the font source. * `--conversion-error ERROR`: When TrueType outlines are converted to binary, the curves are converted from cubic Béziers in the design sources to quadratic Bézier splines. However, as this conversion involves a degree reduction, it is not completely accurate, and hence the quadratic curves approximate the cubic originals. This flag controls the maximum permissible error, measured in ems. the default is 0.001, or one unit at 1000upm. Larger values will result in smaller font sizes, particularly for CJK fonts, but at the cost of fidelity to the original curves. * `--no-generate-GDEF`: As part of generating explicit feature files, `fontmake` uses the glyph categories in the source file to create a `table GDEF { ... } GDEF;` statement in the generated feature file; this is then compiled into the `GDEF` table of the font binaries. However, if the feature file in your source *also* contains a `table GDEF` statement, the font will fail to compile. In this case, you can add the `--no-generate-GDEF` flag to turn off writing an additional `table GDEF` statement in the generated feature file. ## Options for CFF outlines * `--cff-round-tolerance FLOAT`: Controls the way that point coordinates are rounded in the CFF table. The default value of 0.5 rounds points to the nearest integer. Setting this value to 0 disables all coordinate rouding. * `--optimize-cff VALUE`: By default, the CFF table is compressed in two ways: in *specialization*, drawing operations are chosen which most efficiently express the contour. For example, where there is a horizontal line, it is more efficient to use the specialized `hlineto` drawing operator instead of the more general `lineto` operator, as the `lineto` operator takes two parameters (`dx dy`) and `dy` will always be zero in the case of horizontal lines, whereas `hlineto` only takes a `dx` parameter. Additionally, there is *subroutinization*, which places common sequences of operations into subroutines; this is somewhat similar to components, but at a lower level - for example, a stem with a serif which occurs in multiple glyphs might be subroutinized. This flag controls the degree of compression: 0 disables all optimizations; 1 applies specialization but disables subroutinization; and 2, the default, applies both specialization and subroutinization. You may want this flag if you are debugging CFF tables and want to compare the drawing operators more directly against the source outlines. * `--subroutinizer compreffor|cffsubr`: The work of CFF subroutinization, as described above, is one of the many things in `fontmake` that are outsourced to a separate Python library. The two libraries used are `compreffor` (the default for CFF1 - indeed, it only supports CFF1) and `cffsubr` (the default for CFF2). If you want to see whether `cffsubr` compresses the font better, you can use this flag to change the library used for subroutinization. ## Options for instance generation * `-i `: `-i` was introduced in the Basic Usage section for interpolating masters and generating instances. The flag may also be followed by an argument which is a string or regular expression; if this is provided, then only those instances which match the string will be generated. For example,`-i "Noto Sans Bold"`; `-i ".* UI Condensed"`. * `--use-mutatormath`: When generating instances from a designspace file, there are (again) two possible Python libraries which perform the interpolation: fontmake's internal `instantiator` module, and `mutatormath`. `instantiator` is a deliberately minimal implementation which works in most cases, but it does not support extrapolation (instances whose coordinates are placed outside of the range of the masters) or anisotropic locations (axes which have different degrees of variation on the X axis to the Y axis; these are not possible in OpenType variable fonts, but can be used to generate static instances in Fontlab VI and some Robofont extensions). * `-M`, `--masters-as-instances`: This flag causes `fontmake` to also create instance binaries for each master defined in the font, even if they are not explicitly exported as instances by default. * `--round-instances`: This option rounds glyph outlines when generating instances. (XXX Surely they're rounded to ints when they're written to the `glyf` table anyway. What does this actually do?) * `--expand-features-to-instances`: If any feature files within the design sources contain `include()` statements, and these statements contain a relative path, instances may fail to build because they are being compiled in a different directory to the original where the included feature files cannot be found. In that case, you should use this flag to expand all the `include()` statements before the instance is compiled. We know that you shouldn't have to do this by hand, and we will make it the default one day. * `--interpolate-binary-layout `: When `fontmake` generates instances, it creates a feature file for each master using feature writers, but it also creates an *interpolated* feature file using feature writers for static instances. But while feature writers can interpolate kerning and anchor positions, they do *not* interpolate explicit `pos` statements given in the source feature files - nor do they interpolate layout rules expressed in MonoType FontDame format. (See the `--mti-source` option.) In order to perform this interpolation, `fontmake` needs to build the binary master files and interpolate the GPOS tables directly, rather than the textual representation of layout rules. Hence, if you have explicit `pos` statements in the feature files of your masters and you need these to interpolate in instances, use this flag. ## Outline Filtering As mentioned in the functional overview, `fontmake` has two "filtering" passes, a "preprocessing" pass on the UFO files which converts cubics to quadratics for TTF glyphs, removes overlaps, and so on, and a "postprocessing" pass on the output binary files. It is possible to add your own filters into this pipeline to further customize the font building process, and to achieve custom effects similar to Glyphs export filters. This can be done in two ways: either by writing, manually or automatically, entries into a `lib` key (`com.github.googlei18n.ufo2ft.filters`) in the `.designspace` or UFO file, or on the command line. For example, when converting from Glyphs to UFO, `fontmake` (via the `glyphsLib` library) adds the following entry to the UFO `lib.plist`: ```xml com.github.googlei18n.ufo2ft.filters name eraseOpenCorners namespace glyphsLib.filters pre ``` This calls the `EraseOpenCornersFilter` class from the Python module `glyphsLib.filters.eraseOpenCorners` as part of the `pre`-processing step, which converts any external open corners in the glyph outlines into plain corners. Any Python class inheriting from [`ufo2ft.filters.BaseFilter`](https://github.com/googlefonts/ufo2ft/blob/main/Lib/ufo2ft/filters/base.py) can be used as a filter, although the `namespace` must be provided, as in this case. Filters available through the `ufo2ft` library do not require a `namespace` key, as this library is the default source of filters. Filters can be further customized through optional arguments, as described below. To apply filters via a command-line, use the `--filter` argument with the following syntax: `--filter "python.package::ClassName(argument,argument)`; add the pseudo-argument `pre=True` to run the filter as a preprocessing step. For example, to use the `ufostroker` library to apply "noodling" effects to open paths in a source font, use `--filter 'ufostroker::StrokeFilter(Width=50,pre=True)`. ### Included filters The `ufo2ft` library provides some default filters described below. Most of the filters are called automatically as part of `fontmake`'s ordinary pipeline, but some can be added manually. The filters are run in the following order: * (Any manually added pre-filters are called first.) * `ExplodeColorLayerGlyphs`: Called automatically to create glyphs out of color layers when constructing a `COLR` font with `colorPalettes` and `colorLayerMapping` lib keys. * `DecomposeComponents`: Called automatically when producing OTF outlines, and called on glyphs which have components *and* outlines when producing TTF binaries. * `FlattenComponents`: Called automatically to flatten nested components when the `-f` flag is passed to `fontmake`. * `RemoveOverlaps`: Called automatically to remove overlaps. * `CubicToQuadratic`: Called automatically when producing TTF binaries. * (Any manually added post-filters are called last.) Other filters available as part of `ufo2ft` are: * `DecomposeTransformedComponents`: Decomposes any components which have a non-identity transformation matrix (i.e. which are translated or scaled). For example, a `u` glyph from an `n` component flipped horizontally. Fonts constructed in this way can have rasterizing and hinting errors (see [here](https://github.com/googlefonts/fontmake/issues/253) and [here](https://github.com/googlefonts/fontbakery/issues/2011)). To fix fonts with these errors, add `--filter DecomposeTransformedComponentsFilter` to the `fontmake` command line. * `PropagateAnchors`: Creates additional anchors for composite glyphs based on the anchors of their components. * `SortContours`: Sorts the contours based on their bounding box size. Can be added manually to alleviate overlap removal bugs, but must be manually placed in the UFO lib so that it is executed between `DecomposeComponents` and `RemoveOverlaps`. * `Transformations`: Similar to the Glyphs "Transformations" filter, this allows for outlines to be scaled, translated or transformed on export. For example, to scale down and raise up the glyphs "A" and "B" of a font, add this to the lib file: ```xml com.github.googlei18n.ufo2ft.filters name transformations kwargs OffsetX 0 OffsetY 150 ScaleX 75 ScaleY 75 include A B ``` ## Feature writing In a similar vein to the filter classes, `fontmake` allows you to customize the way that kerning and anchor rules in the font sources are turned into explicit rules in the autogenerated feature file. These generated rules are written by classes called feature writers. The feature writers can also be customized with a lib key, `com.github.googlei18n.ufo2ft.featureWriters`. For example, all feature writers take the `mode` option, which takes either the value `append` or `skip`. The default is `skip`, which will skip writing the feature if the feature is already explicitly present in the design sources' features file. > However, note that even in `skip` mode, if the existing feature code contains the magic string `# Automatic Code`, the feature code generated by fontmake will be inserted into the feature file at the location of the comment. To change this to `append` for the kern feature writer (i.e. to add generated kerning rules from the kerning table onto the end of the manually supplied `kern` feature), you would add the following lib key: ```xml com.github.googlei18n.ufo2ft.featureWriters class KernFeatureWriter options mode append ``` There is also a `--feature-writer` option, analogous to `--filters`, allowing you to load custom feature writers on the command line. The special value `--feature-writer "None"` disables all automatic feature generation. `ufo2ft` provides three feature writer classes: * `GdefFeatureWriter` generates the `table GDEF { } GDEF;` statement, based on the categories of the glyphs (stored in the `public.openTypeCategories` lib key of the source font) and ligature caret anchors (anchors starting with `caret_` or `vcaret_`). It has no customizable parameters. It can be disabled with the `--no-generate-GDEF` flag. * `KernFeatureWriter` generates kerning features (or, for certain complex scripts, `dist` features) based on the kerning information in the design sources. It has two optional parameters in addition to `mode`: `ignoreMarks`, which defaults to `True`, will emit an `LookupFlag IgnoreMarks` in the generated `kern` feature; setting this to `False` will generate kern rules which do not ignore mark glyphs. Additionally, `quantization` can be set to an integer value to round the kern rules to the nearest multiple of its value, which can help with compressing the tables. * `MarkFeatureWriter` generates `mark` and `mkmk` features based on the anchor information in the design sources. It has one optional parameter, `quantization`, which rounds the anchor positions to the nearest multiple of its value, which makes anchors more likely to be shared in the `GPOS` table, potentially reducing its size at the expense of some fidelity. googlefonts-fontmake-7ed5123/build_pyz.sh000077500000000000000000000024261470572777600205700ustar00rootroot00000000000000#!/bin/bash set -e set -x HERE="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" PLATFORMS=(macosx_11_0_universal2) # win_amd64) PYTHON_VERSIONS=(3.11) FONTMAKE_VERSION="$(python setup.py --version)" FONTMAKE_WHEEL="${HERE}/dist/fontmake-${FONTMAKE_VERSION}-py3-none-any.whl" REQUIREMENTS="${HERE}/requirements.txt" LICENSE_FILE="${HERE}/LICENSE" OUTPUT_DIR="${HERE}/shivs" mkdir -p "${OUTPUT_DIR}" pushd "${OUTPUT_DIR}" for platform in ${PLATFORMS[*]}; do for version in ${PYTHON_VERSIONS[*]}; do v=${version//.} abi="cp${v}" outdir="fontmake-${FONTMAKE_VERSION}-cp${v}-${abi}-${platform}" mkdir -p "${outdir}" if [[ $platform == win32 || $platform == win_amd64 ]]; then ext=".pyz" else ext="" fi shiv -c fontmake \ -o "${outdir}/fontmake${ext}" \ -p "/usr/bin/env python${version}" \ --python-version ${v} \ --platform ${platform} \ --abi ${abi} \ --implementation cp \ --only-binary=:all: \ -r "${REQUIREMENTS}" \ "${FONTMAKE_WHEEL}" cp "${HERE}/LICENSE" "${outdir}" zip -r "${outdir}.zip" "${outdir}" rm -rf "${outdir}" done done popd googlefonts-fontmake-7ed5123/pyproject.toml000066400000000000000000000002431470572777600211370ustar00rootroot00000000000000[build-system] requires = [ "setuptools", "wheel", "setuptools_scm", ] build-backend = "setuptools.build_meta" [tool.black] target-version = ["py36"] googlefonts-fontmake-7ed5123/requirements.txt000066400000000000000000000007151470572777600215130ustar00rootroot00000000000000fonttools[ufo,repacker,lxml,unicode]==4.54.1; platform_python_implementation == 'CPython' fonttools[ufo,repacker,unicode]==4.54.1; platform_python_implementation != 'CPython' glyphsLib==6.9.2 ufo2ft==3.3.1 fontMath==0.9.4 booleanOperations==0.9.0 ufoLib2==0.16.0 cffsubr==0.3.0 compreffor==0.5.6 ttfautohint-py==0.5.1 # optional, for experimental reading/writing ufoLib2's UFO as json cattrs==24.1.2 orjson==3.10.9; platform_python_implementation == 'CPython' googlefonts-fontmake-7ed5123/setup.cfg000066400000000000000000000003001470572777600200360ustar00rootroot00000000000000[wheel] universal = 0 [sdist] formats = zip [metadata] license_file = LICENSE [tool:pytest] filterwarnings = ignore:fromstring:DeprecationWarning ignore:tostring:DeprecationWarning googlefonts-fontmake-7ed5123/setup.py000066400000000000000000000076461470572777600177530ustar00rootroot00000000000000# Copyright 2015 Google Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import site import sys from io import open from setuptools import find_packages, setup # See https://github.com/pypa/pip/issues/7953 site.ENABLE_USER_SITE = "--user" in sys.argv[1:] needs_wheel = {"bdist_wheel"}.intersection(sys.argv) wheel = ["wheel"] if needs_wheel else [] with open("README.md", "r", encoding="utf-8") as f: long_description = f.read() dep_versions = { "fontMath": ">=0.9.4", "fonttools": ">=4.54.1", "glyphsLib": ">=6.9.2", "ufo2ft": ">=3.3.1", "ufoLib2": ">=0.16.0", } dep_extras = { "fonttools": { "implementation_name == 'cpython'": "ufo,lxml,unicode", "implementation_name != 'cpython'": "ufo,unicode", }, "ufo2ft": "compreffor", } extras_require = { "pathops": ["skia-pathops>=0.3.0"], # this is now default; kept here for backward compatibility "lxml": [], # MutatorMath is no longer supported but a dummy extras is kept below # to avoid fontmake installation failing if requested "mutatormath": [], "autohint": ["ttfautohint-py>=0.5.0"], # For reading/writing ufoLib2's .ufo.json files (cattrs + orjson) "json": [f"ufoLib2[json]{dep_versions['ufoLib2']}"], # For compiling GPOS/GSUB using the harfbuzz repacker "repacker": [ f"fonttools[{extras},repacker]{dep_versions['fonttools']}; {marker}" for marker, extras in dep_extras["fonttools"].items() ], } # use a special 'all' key as shorthand to includes all the extra dependencies extras_require["all"] = sum(extras_require.values(), []) install_requires = [ f"{name}{version}" for name, version in dep_versions.items() if name not in dep_extras ] for name, extras in dep_extras.items(): if isinstance(extras, dict): for marker, ext in extras.items(): install_requires.append(f"{name}[{ext}]{dep_versions[name]}; {marker}") elif isinstance(extras, str): install_requires.append(f"{name}[{extras}]{dep_versions[name]}") else: raise TypeError(type(extras)) setup( name="fontmake", use_scm_version={"write_to": "Lib/fontmake/_version.py"}, description=( "Compile fonts from sources (UFO, Glyphs) to binary (OpenType, TrueType)." ), long_description=long_description, author="James Godfrey-kittle", maintainer="Cosimo Lupo", maintainer_email="cosimo@anthrotype.com", long_description_content_type="text/markdown", url="https://github.com/googlei18n/fontmake", license="Apache Software License 2.0", packages=find_packages("Lib"), package_dir={"": "Lib"}, entry_points={"console_scripts": ["fontmake = fontmake.__main__:main"]}, setup_requires=wheel + ["setuptools_scm"], python_requires=">=3.8", install_requires=install_requires, extras_require=extras_require, classifiers=[ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Natural Language :: English", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Topic :: Multimedia :: Graphics", "Topic :: Multimedia :: Graphics :: Graphics Conversion", "Topic :: Multimedia :: Graphics :: Editors :: Vector-Based", "Topic :: Text Processing :: Fonts", ], ) googlefonts-fontmake-7ed5123/test_requirements.txt000066400000000000000000000002771470572777600225550ustar00rootroot00000000000000pytest>=4.5.0 coverage>=5 black ; platform_python_implementation == 'CPython' isort ; platform_python_implementation == 'CPython' flake8-bugbear ; platform_python_implementation == 'CPython' googlefonts-fontmake-7ed5123/tests/000077500000000000000000000000001470572777600173665ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/conftest.py000066400000000000000000000002051470572777600215620ustar00rootroot00000000000000from pathlib import Path import pytest @pytest.fixture(scope="session") def data_dir(): return Path(__file__).parent / "data" googlefonts-fontmake-7ed5123/tests/data/000077500000000000000000000000001470572777600202775ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/AutohintingTest/000077500000000000000000000000001470572777600234305ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/AutohintingTest/Padyakke.glyphs000066400000000000000000003646601470572777600264300ustar00rootroot00000000000000{ .appVersion = "3091"; copyright = "Copyright 2015 The Padyakke Project Authors (https://github.com/DunwichType/Padyakke_Libre)"; customParameters = ( { name = DisableAllAutomaticBehaviour; value = 1; }, { name = fsType; value = ( ); }, { name = "Use Typo Metrics"; value = 1; }, { name = license; value = "This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFL"; }, { name = licenseURL; value = "http://scripts.sil.org/OFL"; }, { name = trademark; value = "Padyakke is a trademark of Dunwich Type Founders."; }, { name = note; value = "Conjunct Size: scale width to 98.3%"; } ); date = "2015-09-17 23:00:20 +0000"; designer = "James Puckett"; designerURL = "http://www.dunwichtype.com"; disablesNiceNames = 1; familyName = "Padyakke Expanded One"; fontMaster = ( { alignmentZones = ( "{520, 25}", "{405, 20}", "{357, 25}", "{0, -25}", "{-165, -5}" ); ascender = 907; capHeight = 520; customParameters = ( { name = TTFStems; value = ( { horizontal = 0; name = Horizontals; width = 22; } ); }, { name = typoAscender; value = 813; }, { name = typoDescender; value = 628; }, { name = typoLineGap; value = 0; }, { name = hheaAscender; value = 813; }, { name = hheaDescender; value = 628; }, { name = hheaLineGap; value = 0; }, { name = winAscent; value = 843; }, { name = winDescent; value = 628; } ); descender = -368; guideLines = ( { position = "{10, 555}"; }, { position = "{10, 405}"; }, { position = "{10, 383}"; }, { position = "{10, -368}"; }, { angle = 180; position = "{13, 70}"; }, { position = "{10, 4}"; }, { position = "{10, 417}"; }, { position = "{20, -90}"; }, { position = "{10, -21}"; }, { position = "{10, -288}"; }, { position = "{805, 672}"; }, { position = "{10, 383}"; }, { position = "{-50, -504}"; }, { position = "{-192, -523}"; }, { position = "{10, 318}"; }, { position = "{10, 318}"; }, { position = "{10, 383}"; }, { position = "{10, 383}"; } ); horizontalStems = ( 23 ); id = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; userData = { GSOffsetHorizontal = -1; GSOffsetProportional = 1; GSOffsetVertical = -12; }; verticalStems = ( 23 ); weight = Light; xHeight = 357; } ); glyphs = ( { color = 0; glyphname = A; lastChange = "2016-05-06 20:28:43 +0000"; layers = ( { anchors = ( { name = bottom; position = "{514, 0}"; }, { name = hook; position = "{603, 585}"; }, { name = ogonek; position = "{878, 0}"; }, { name = top; position = "{512, 520}"; } ); hints = ( { horizontal = 1; origin = "{1, 3}"; target = "{1, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{2, 3}"; target = "{2, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{4, 2}"; target = "{4, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 2}"; target = "{1, 1}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{3, 2}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{3, 1}"; type = Align; }, { horizontal = 1; origin = "{1, 3}"; target = "{3, 3}"; type = Align; }, { horizontal = 1; origin = "{4, 3}"; target = "{4, 0}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "180 14 LINE", "515 502 LINE", "511 502 LINE", "847 14 LINE", "875 14 LINE", "531 510 LINE", "493 510 LINE", "150 14 LINE" ); }, { closed = 1; nodes = ( "334 0 LINE", "334 23 LINE", "-5 23 LINE", "-5 0 LINE" ); }, { closed = 1; nodes = ( "731 199 LINE", "715 222 LINE", "309 222 LINE", "290 199 LINE" ); }, { closed = 1; nodes = ( "1030 0 LINE", "1030 23 LINE", "691 23 LINE", "691 0 LINE" ); }, { closed = 1; nodes = ( "700 497 LINE", "700 520 LINE", "324 520 LINE", "324 497 LINE" ); } ); width = 1025; } ); leftKerningGroup = A; rightKerningGroup = A; unicode = 0041; }, { color = 0; glyphname = B; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{462, 0}"; }, { name = top; position = "{462, 520}"; } ); hints = ( { horizontal = 1; origin = "{0, 33}"; target = "{0, 32}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 14}"; target = "{0, 15}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 15}"; target = "{1, 1}"; type = Align; }, { horizontal = 1; origin = "{0, 32}"; target = "{1, 0}"; type = Align; }, { horizontal = 1; origin = "{0, 24}"; target = "{0, 23}"; type = TTStem; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "674 0 LINE SMOOTH", "791 0 OFFCURVE", "862 45 OFFCURVE", "862 136 CURVE SMOOTH", "862 231 OFFCURVE", "781 270 OFFCURVE", "665 270 CURVE", "665 262 LINE", "775 262 OFFCURVE", "828 315 OFFCURVE", "828 391 CURVE SMOOTH", "828 469 OFFCURVE", "769 520 OFFCURVE", "667 520 CURVE SMOOTH", "56 520 LINE", "56 496 LINE", "665 496 LINE SMOOTH", "744 496 OFFCURVE", "803 465 OFFCURVE", "803 391 CURVE SMOOTH", "803 316 OFFCURVE", "745 279 OFFCURVE", "661 279 CURVE SMOOTH", "255 279 LINE", "255 255 LINE", "656 254 LINE SMOOTH", "756 254 OFFCURVE", "837 222 OFFCURVE", "837 136 CURVE SMOOTH", "837 55 OFFCURVE", "769 23 OFFCURVE", "667 23 CURVE SMOOTH", "56 23 LINE", "56 0 LINE" ); }, { closed = 1; nodes = ( "264 14 LINE", "264 509 LINE", "239 509 LINE", "239 14 LINE" ); } ); width = 962; } ); leftKerningGroup = H; leftMetricsKey = "=H"; rightKerningGroup = B; unicode = 0042; }, { color = 0; glyphname = C; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{431, -11}"; }, { name = top; position = "{440, 531}"; } ); hints = ( { horizontal = 1; origin = "{0, 29}"; target = "{0, 6}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 23}"; target = "{0, 12}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 18}"; type = Anchor; }, { horizontal = 1; origin = "{0, 15}"; type = Anchor; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "645 -11 OFFCURVE", "752 85 OFFCURVE", "800 168 CURVE", "779 181 LINE", "739 107 OFFCURVE", "630 13 OFFCURVE", "431 13 CURVE SMOOTH", "249 13 OFFCURVE", "100 106 OFFCURVE", "100 260 CURVE SMOOTH", "100 415 OFFCURVE", "255 507 OFFCURVE", "440 507 CURVE SMOOTH", "577 507 OFFCURVE", "694 461 OFFCURVE", "785 330 CURVE", "797 332 LINE", "797 520 LINE", "773 520 LINE", "773 361 LINE", "785 361 LINE", "716 461 OFFCURVE", "600 531 OFFCURVE", "440 531 CURVE SMOOTH", "246 531 OFFCURVE", "75 432 OFFCURVE", "75 260 CURVE SMOOTH", "75 89 OFFCURVE", "240 -11 OFFCURVE", "431 -11 CURVE SMOOTH" ); } ); width = 890; } ); leftKerningGroup = O; leftMetricsKey = "=O"; rightKerningGroup = C; unicode = 0043; }, { color = 0; glyphname = D; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{481, 0}"; }, { name = center; position = "{481, 245}"; }, { name = top; position = "{481, 520}"; } ); hints = ( { horizontal = 1; origin = "{0, 17}"; target = "{0, 16}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 7}"; target = "{0, 8}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 8}"; target = "{1, 1}"; type = Align; }, { horizontal = 1; origin = "{0, 16}"; target = "{1, 0}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "545 0 LINE SMOOTH", "750 0 OFFCURVE", "890 85 OFFCURVE", "890 260 CURVE SMOOTH", "890 435 OFFCURVE", "750 520 OFFCURVE", "545 520 CURVE SMOOTH", "56 520 LINE", "56 496 LINE", "545 496 LINE SMOOTH", "740 496 OFFCURVE", "865 418 OFFCURVE", "865 260 CURVE SMOOTH", "865 102 OFFCURVE", "740 23 OFFCURVE", "545 23 CURVE SMOOTH", "56 23 LINE", "56 0 LINE" ); }, { closed = 1; nodes = ( "264 14 LINE", "264 507 LINE", "239 507 LINE", "239 14 LINE" ); } ); width = 965; } ); leftKerningGroup = H; leftMetricsKey = "=H"; rightKerningGroup = O; rightMetricsKey = "=O"; unicode = 0044; }, { color = 0; glyphname = E; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{501, 0}"; }, { name = ogonek; position = "{862, 0}"; }, { name = top; position = "{530, 520}"; } ); guideLines = ( { angle = 90; position = "{862, 183}"; } ); hints = ( { horizontal = 1; origin = "{0, 5}"; target = "{0, 4}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{4, 2}"; target = "{4, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{4, 3}"; target = "{1, 1}"; type = Align; }, { horizontal = 1; origin = "{0, 4}"; target = "{1, 0}"; type = Align; }, { horizontal = 1; origin = "{0, 4}"; target = "{4, 2}"; other1 = "{2, 2}"; type = Interpolate; }, { horizontal = 1; origin = "{2, 2}"; target = "{2, 3}"; type = TTStem; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "862 0 LINE", "862 183 LINE", "838 183 LINE", "838 23 LINE", "56 23 LINE", "56 0 LINE" ); }, { closed = 1; nodes = ( "264 14 LINE", "264 507 LINE", "239 507 LINE", "239 14 LINE" ); }, { closed = 1; nodes = ( "584 261 LINE", "584 284 LINE", "260 284 LINE", "260 261 LINE" ); }, { closed = 1; nodes = ( "597 153 LINE", "597 392 LINE", "572 392 LINE", "572 153 LINE" ); }, { closed = 1; nodes = ( "862 337 LINE", "862 520 LINE", "56 520 LINE", "56 496 LINE", "837 496 LINE", "837 337 LINE" ); } ); width = 972; } ); leftKerningGroup = H; leftMetricsKey = "=H"; rightKerningGroup = E; unicode = 0045; }, { color = 0; glyphname = F; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{449, 0}"; }, { name = top; position = "{449, 520}"; } ); hints = ( { horizontal = 1; origin = "{1, 3}"; target = "{1, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 2}"; target = "{0, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 3}"; target = "{2, 1}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{2, 0}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{0, 2}"; other1 = "{3, 2}"; type = Interpolate; }, { horizontal = 1; origin = "{3, 2}"; target = "{3, 3}"; type = TTStem; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "812 337 LINE", "812 520 LINE", "56 520 LINE", "56 496 LINE", "788 496 LINE", "788 337 LINE" ); }, { closed = 1; nodes = ( "456 0 LINE", "456 23 LINE", "56 23 LINE", "56 0 LINE" ); }, { closed = 1; nodes = ( "264 14 LINE", "264 507 LINE", "239 507 LINE", "239 14 LINE" ); }, { closed = 1; nodes = ( "553 240 LINE", "553 264 LINE", "260 264 LINE", "260 240 LINE" ); }, { closed = 1; nodes = ( "566 132 LINE", "566 371 LINE", "541 371 LINE", "541 132 LINE" ); } ); width = 887; } ); leftKerningGroup = H; leftMetricsKey = "=H"; rightKerningGroup = F; unicode = 0046; }, { color = 0; glyphname = G; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{440, -11}"; }, { name = top; position = "{440, 531}"; } ); hints = ( { horizontal = 1; origin = "{0, 33}"; target = "{0, 10}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 5}"; target = "{0, 4}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 27}"; target = "{0, 16}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 22}"; type = Anchor; }, { horizontal = 1; origin = "{0, 19}"; type = Anchor; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "578 -10 OFFCURVE", "707 33 OFFCURVE", "801 104 CURVE", "801 255 LINE", "436 255 LINE", "436 231 LINE", "776 231 LINE", "776 116 LINE", "685 53 OFFCURVE", "567 14 OFFCURVE", "436 14 CURVE SMOOTH", "255 14 OFFCURVE", "105 107 OFFCURVE", "105 259 CURVE SMOOTH", "105 414 OFFCURVE", "259 507 OFFCURVE", "444 507 CURVE SMOOTH", "582 507 OFFCURVE", "700 461 OFFCURVE", "790 330 CURVE", "801 331 LINE", "801 520 LINE", "778 520 LINE", "778 361 LINE", "790 361 LINE", "720 461 OFFCURVE", "606 531 OFFCURVE", "444 531 CURVE SMOOTH", "251 531 OFFCURVE", "80 431 OFFCURVE", "80 259 CURVE SMOOTH", "80 89 OFFCURVE", "244 -10 OFFCURVE", "436 -10 CURVE SMOOTH" ); } ); width = 904; } ); leftKerningGroup = O; rightKerningGroup = G; unicode = 0047; }, { color = 0; glyphname = H; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{565, 0}"; }, { name = center; position = "{565, 265}"; }, { name = top; position = "{565, 520}"; } ); hints = ( { horizontal = 1; origin = "{1, 3}"; target = "{1, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 3}"; target = "{0, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{3, 2}"; target = "{3, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{3, 3}"; target = "{6, 3}"; type = Align; }, { horizontal = 1; origin = "{6, 2}"; target = "{3, 2}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{4, 2}"; type = Align; }, { horizontal = 1; origin = "{3, 3}"; target = "{3, 0}"; type = Align; }, { horizontal = 1; origin = "{3, 3}"; target = "{6, 0}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{4, 1}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{1, 1}"; type = Align; }, { horizontal = 1; origin = "{1, 3}"; target = "{4, 3}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "875 252 LINE", "875 276 LINE", "258 276 LINE", "258 252 LINE" ); }, { closed = 1; nodes = ( "444 0 LINE", "444 23 LINE", "56 23 LINE", "56 0 LINE" ); }, { closed = 1; nodes = ( "263 11 LINE", "263 507 LINE", "238 507 LINE", "238 11 LINE" ); }, { closed = 1; nodes = ( "444 496 LINE", "444 520 LINE", "56 520 LINE", "56 496 LINE" ); }, { closed = 1; nodes = ( "1076 0 LINE", "1076 23 LINE", "686 23 LINE", "686 0 LINE" ); }, { closed = 1; nodes = ( "894 14 LINE", "894 509 LINE", "869 509 LINE", "869 14 LINE" ); }, { closed = 1; nodes = ( "1076 496 LINE", "1076 520 LINE", "686 520 LINE", "686 496 LINE" ); } ); width = 1132; } ); leftKerningGroup = H; rightKerningGroup = H; unicode = 0048; }, { color = 0; glyphname = I; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{251, 0}"; }, { name = ogonek; position = "{259, 0}"; }, { name = top; position = "{251, 520}"; } ); hints = ( { horizontal = 1; origin = "{1, 3}"; target = "{1, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{2, 2}"; target = "{2, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{2, 3}"; target = "{2, 0}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{1, 1}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "264 14 LINE", "264 507 LINE", "239 507 LINE", "239 14 LINE" ); }, { closed = 1; nodes = ( "445 0 LINE", "445 23 LINE", "56 23 LINE", "56 0 LINE" ); }, { closed = 1; nodes = ( "445 496 LINE", "445 520 LINE", "56 520 LINE", "56 496 LINE" ); } ); width = 501; } ); leftKerningGroup = H; leftMetricsKey = "=H"; rightKerningGroup = H; rightMetricsKey = "=H"; unicode = 0049; }, { color = 0; glyphname = J; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{248, -11}"; }, { name = top; position = "{434, 520}"; } ); hints = ( { horizontal = 1; origin = "{0, 15}"; target = "{0, 8}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 2}"; target = "{1, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 3}"; target = "{0, 3}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "381 -10 OFFCURVE", "471 65 OFFCURVE", "471 186 CURVE SMOOTH", "471 507 LINE", "446 507 LINE", "446 186 LINE SMOOTH", "446 68 OFFCURVE", "356 14 OFFCURVE", "249 14 CURVE SMOOTH", "149 14 OFFCURVE", "77 72 OFFCURVE", "36 127 CURVE", "20 111 LINE", "59 55 OFFCURVE", "131 -10 OFFCURVE", "249 -10 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "653 496 LINE", "653 520 LINE", "206 520 LINE", "206 496 LINE" ); } ); width = 653; } ); leftKerningGroup = J; rightKerningGroup = U; rightMetricsKey = "=U"; unicode = 004A; }, { color = 0; glyphname = K; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{525, 0}"; }, { name = top; position = "{525, 520}"; } ); hints = ( { horizontal = 1; origin = "{1, 3}"; target = "{1, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{5, 2}"; target = "{5, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{5, 3}"; target = "{2, 1}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{2, 0}"; type = Align; }, { horizontal = 1; origin = "{0, 3}"; target = "{0, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{6, 2}"; target = "{6, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{6, 3}"; target = "{6, 0}"; type = Align; options = 4; }, { horizontal = 1; origin = "{3, 3}"; target = "{3, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{3, 2}"; target = "{3, 1}"; type = Align; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "825 507 LINE", "785 507 LINE", "250 156 LINE", "250 130 LINE" ); }, { closed = 1; nodes = ( "445 0 LINE", "445 23 LINE", "56 23 LINE", "56 0 LINE" ); }, { closed = 1; nodes = ( "264 14 LINE", "264 507 LINE", "239 507 LINE", "239 14 LINE" ); }, { closed = 1; nodes = ( "962 0 LINE", "962 23 LINE", "610 23 LINE", "610 0 LINE" ); }, { closed = 1; nodes = ( "831 10 LINE", "481 294 LINE", "465 278 LINE", "795 10 LINE" ); }, { closed = 1; nodes = ( "445 496 LINE", "445 520 LINE", "56 520 LINE", "56 496 LINE" ); }, { closed = 1; nodes = ( "952 496 LINE", "952 520 LINE", "600 520 LINE", "600 496 LINE" ); } ); width = 998; } ); leftKerningGroup = H; leftMetricsKey = "=H"; rightKerningGroup = X; unicode = 004B; }, { color = 0; glyphname = L; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{449, 0}"; }, { name = center; position = "{442, 245}"; }, { name = top; position = "{250, 520}"; }, { name = topright; position = "{449, 339}"; } ); hints = ( { horizontal = 1; origin = "{2, 2}"; target = "{2, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 5}"; target = "{0, 4}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{2, 3}"; target = "{1, 1}"; type = Align; }, { horizontal = 1; origin = "{0, 4}"; target = "{1, 0}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "790 0 LINE", "790 183 LINE", "765 183 LINE", "765 23 LINE", "56 23 LINE", "56 0 LINE" ); }, { closed = 1; nodes = ( "264 14 LINE", "264 507 LINE", "239 507 LINE", "239 14 LINE" ); }, { closed = 1; nodes = ( "445 496 LINE", "445 520 LINE", "56 520 LINE", "56 496 LINE" ); } ); width = 840; } ); leftKerningGroup = H; leftMetricsKey = "=H"; rightKerningGroup = L; unicode = 004C; }, { color = 0; glyphname = M; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{634, 0}"; }, { name = top; position = "{619, 485}"; } ); background = { paths = ( { closed = 1; nodes = ( "622 -11 LINE", "630 14 LINE", "264 520 LINE", "232 520 LINE", "616 -11 LINE" ); }, { closed = 1; nodes = ( "414 0 LINE", "414 23 LINE", "56 23 LINE", "56 0 LINE" ); }, { closed = 1; nodes = ( "264 11 LINE", "264 453 LINE", "264 520 LINE", "239 520 LINE", "239 11 LINE" ); }, { closed = 1; nodes = ( "264 496 LINE", "264 520 LINE", "56 520 LINE", "56 496 LINE" ); }, { closed = 1; nodes = ( "1182 0 LINE", "1182 23 LINE", "825 23 LINE", "825 0 LINE" ); }, { closed = 1; nodes = ( "622 -11 LINE", "1007 520 LINE", "975 520 LINE", "611 14 LINE", "617 -11 LINE" ); }, { closed = 1; nodes = ( "1000 11 LINE", "1000 520 LINE", "975 520 LINE", "975 453 LINE", "975 11 LINE" ); }, { closed = 1; nodes = ( "1182 496 LINE", "1182 520 LINE", "975 520 LINE", "975 496 LINE" ); } ); }; hints = ( { horizontal = 1; origin = "{0, 9}"; target = "{0, 8}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 4}"; target = "{0, 5}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 14}"; type = Anchor; }, { horizontal = 1; origin = "{0, 5}"; target = "{0, 6}"; type = Align; }, { horizontal = 1; origin = "{0, 1}"; target = "{0, 4}"; type = Align; }, { horizontal = 1; origin = "{0, 5}"; target = "{0, 23}"; type = Align; }, { horizontal = 1; origin = "{0, 8}"; target = "{0, 12}"; type = Align; }, { horizontal = 1; origin = "{0, 8}"; target = "{0, 18}"; type = Align; }, { horizontal = 1; origin = "{0, 8}"; target = "{0, 22}"; type = Align; }, { horizontal = 1; origin = "{0, 9}"; target = "{0, 19}"; type = Align; }, { horizontal = 1; origin = "{0, 5}"; target = "{0, 13}"; type = Align; }, { horizontal = 1; origin = "{0, 5}"; target = "{0, 16}"; type = Align; }, { horizontal = 1; origin = "{0, 14}"; target = "{0, 2}"; type = Align; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "1182 520 LINE", "975 520 LINE", "620 27 LINE", "264 520 LINE", "56 520 LINE", "56 496 LINE", "239 496 LINE", "239 23 LINE", "56 23 LINE", "56 0 LINE", "414 0 LINE", "414 23 LINE", "264 23 LINE", "264 476 LINE", "616 -11 LINE", "622 -11 LINE", "975 476 LINE", "975 23 LINE", "825 23 LINE", "825 0 LINE", "1182 0 LINE", "1182 23 LINE", "1000 23 LINE", "1000 496 LINE", "1182 496 LINE" ); } ); width = 1238; } ); leftKerningGroup = H; leftMetricsKey = "=H"; rightKerningGroup = H; rightMetricsKey = "=H"; unicode = 004D; }, { color = 0; glyphname = N; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{622, 11}"; }, { name = top; position = "{522, 509}"; } ); hints = ( { horizontal = 1; origin = "{0, 10}"; target = "{0, 9}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 5}"; target = "{0, 6}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 15}"; type = Anchor; }, { horizontal = 1; origin = "{0, 6}"; target = "{0, 1}"; type = Align; }, { horizontal = 1; origin = "{0, 5}"; target = "{0, 0}"; type = Align; }, { horizontal = 1; origin = "{0, 9}"; target = "{0, 13}"; type = Align; }, { horizontal = 1; origin = "{0, 6}"; target = "{0, 14}"; type = Align; }, { horizontal = 1; origin = "{0, 15}"; target = "{0, 3}"; type = Align; options = 4; }, { horizontal = 1; origin = "{0, 6}"; target = "{0, 17}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "703 520 LINE", "703 496 LINE", "885 496 LINE", "885 43 LINE", "264 520 LINE", "56 520 LINE", "56 496 LINE", "239 496 LINE", "239 23 LINE", "56 23 LINE", "56 0 LINE", "445 0 LINE", "445 23 LINE", "264 23 LINE", "264 486 LINE", "906 -5 LINE", "910 -5 LINE", "910 496 LINE", "1092 496 LINE", "1092 520 LINE" ); } ); width = 1107; } ); leftKerningGroup = H; leftMetricsKey = "=H"; rightKerningGroup = N; unicode = 004E; }, { color = 0; glyphname = O; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{459, -11}"; }, { name = center; position = "{459, 252}"; }, { name = ogonek; position = "{460, 0}"; }, { name = top; position = "{459, 531}"; }, { name = topright; position = "{891, 490}"; } ); hints = ( { horizontal = 1; origin = "{0, 11}"; target = "{1, 11}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 5}"; target = "{1, 5}"; type = TTStem; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "675 -10 OFFCURVE", "841 89 OFFCURVE", "841 260 CURVE SMOOTH", "841 431 OFFCURVE", "675 531 OFFCURVE", "459 531 CURVE SMOOTH", "242 531 OFFCURVE", "75 431 OFFCURVE", "75 260 CURVE SMOOTH", "75 89 OFFCURVE", "242 -10 OFFCURVE", "459 -10 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "252 14 OFFCURVE", "100 106 OFFCURVE", "100 260 CURVE SMOOTH", "100 415 OFFCURVE", "252 507 OFFCURVE", "459 507 CURVE SMOOTH", "664 507 OFFCURVE", "816 415 OFFCURVE", "816 260 CURVE SMOOTH", "816 106 OFFCURVE", "664 14 OFFCURVE", "459 14 CURVE SMOOTH" ); } ); width = 916; } ); leftKerningGroup = O; rightKerningGroup = O; unicode = 004F; }, { color = 0; glyphname = P; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{251, 0}"; }, { name = top; position = "{462, 520}"; } ); hints = ( { horizontal = 1; origin = "{1, 3}"; target = "{1, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 17}"; target = "{0, 16}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 7}"; target = "{0, 8}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 8}"; target = "{2, 1}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{2, 0}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "694 214 LINE SMOOTH", "807 214 OFFCURVE", "875 278 OFFCURVE", "875 365 CURVE SMOOTH", "875 461 OFFCURVE", "805 520 OFFCURVE", "694 520 CURVE SMOOTH", "56 520 LINE", "56 496 LINE", "701 496 LINE SMOOTH", "791 496 OFFCURVE", "850 445 OFFCURVE", "850 365 CURVE SMOOTH", "850 287 OFFCURVE", "787 237 OFFCURVE", "701 237 CURVE SMOOTH", "251 237 LINE", "251 214 LINE" ); }, { closed = 1; nodes = ( "456 0 LINE", "456 23 LINE", "56 23 LINE", "56 0 LINE" ); }, { closed = 1; nodes = ( "264 14 LINE", "264 507 LINE", "239 507 LINE", "239 14 LINE" ); } ); width = 935; } ); leftKerningGroup = H; leftMetricsKey = "=H"; rightKerningGroup = P; unicode = 0050; }, { color = 0; glyphname = Q; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{459, -11}"; }, { name = top; position = "{459, 531}"; } ); background = { paths = ( { closed = 1; nodes = ( "675 -10 OFFCURVE", "841 89 OFFCURVE", "841 260 CURVE SMOOTH", "841 431 OFFCURVE", "675 531 OFFCURVE", "459 531 CURVE SMOOTH", "242 531 OFFCURVE", "75 431 OFFCURVE", "75 260 CURVE SMOOTH", "75 89 OFFCURVE", "242 -10 OFFCURVE", "459 -10 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "828 -158 OFFCURVE", "891 -99 OFFCURVE", "902 -14 CURVE", "880 -9 LINE", "869 -86 OFFCURVE", "814 -135 OFFCURVE", "736 -135 CURVE SMOOTH", "659 -135 OFFCURVE", "602 -80 OFFCURVE", "534 2 CURVE SMOOTH", "515 23 LINE SMOOTH", "422 134 OFFCURVE", "356 224 OFFCURVE", "180 224 CURVE SMOOTH", "99 224 LINE", "99 200 LINE", "180 200 LINE SMOOTH", "341 200 OFFCURVE", "409 114 OFFCURVE", "490 17 CURVE SMOOTH", "503 1 LINE SMOOTH", "586 -99 OFFCURVE", "644 -158 OFFCURVE", "736 -158 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "252 14 OFFCURVE", "100 106 OFFCURVE", "100 260 CURVE SMOOTH", "100 415 OFFCURVE", "252 507 OFFCURVE", "459 507 CURVE SMOOTH", "664 507 OFFCURVE", "816 415 OFFCURVE", "816 260 CURVE SMOOTH", "816 106 OFFCURVE", "664 14 OFFCURVE", "459 14 CURVE SMOOTH" ); } ); }; hints = ( { horizontal = 1; origin = "{0, 21}"; target = "{0, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 17}"; target = "{2, 4}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{2, 7}"; target = "{1, 9}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 11}"; target = "{1, 15}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 24}"; type = Anchor; }, { horizontal = 1; origin = "{2, 4}"; target = "{2, 3}"; type = Align; }, { horizontal = 1; origin = "{2, 3}"; target = "{1, 5}"; type = Align; options = 4; }, { horizontal = 1; origin = "{0, 17}"; target = "{0, 5}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "869 -86 OFFCURVE", "814 -135 OFFCURVE", "736 -135 CURVE SMOOTH", "661 -135 OFFCURVE", "605 -83 OFFCURVE", "540 -5 CURVE", "715 17 OFFCURVE", "841 111 OFFCURVE", "841 260 CURVE SMOOTH", "841 431 OFFCURVE", "675 531 OFFCURVE", "459 531 CURVE SMOOTH", "242 531 OFFCURVE", "75 431 OFFCURVE", "75 260 CURVE SMOOTH", "75 89 OFFCURVE", "242 -10 OFFCURVE", "459 -10 CURVE", "511 -8 LINE", "590 -103 OFFCURVE", "647 -158 OFFCURVE", "736 -158 CURVE SMOOTH", "828 -158 OFFCURVE", "891 -99 OFFCURVE", "902 -14 CURVE", "880 -9 LINE" ); }, { closed = 1; nodes = ( "664 507 OFFCURVE", "816 415 OFFCURVE", "816 260 CURVE SMOOTH", "816 122 OFFCURVE", "694 34 OFFCURVE", "521 17 CURVE", "421 135 OFFCURVE", "355 224 OFFCURVE", "180 224 CURVE SMOOTH", "103 224 LINE", "101 236 OFFCURVE", "100 248 OFFCURVE", "100 260 CURVE SMOOTH", "100 415 OFFCURVE", "252 507 OFFCURVE", "459 507 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "180 200 LINE SMOOTH", "340 200 OFFCURVE", "408 116 OFFCURVE", "492 15 CURVE", "459 14 LINE", "280 14 OFFCURVE", "143 82 OFFCURVE", "108 200 CURVE" ); } ); width = 917; } ); leftKerningGroup = O; leftMetricsKey = "=O"; rightKerningGroup = O; unicode = 0051; }, { color = 0; glyphname = R; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{565, 0}"; }, { name = top; position = "{525, 520}"; } ); background = { paths = ( { closed = 1; nodes = ( "717 241 LINE SMOOTH", "841 241 OFFCURVE", "900 309 OFFCURVE", "900 378 CURVE SMOOTH", "900 457 OFFCURVE", "841 520 OFFCURVE", "717 520 CURVE SMOOTH", "56 520 LINE", "56 496 LINE", "717 496 LINE SMOOTH", "826 496 OFFCURVE", "875 441 OFFCURVE", "875 378 CURVE SMOOTH", "875 317 OFFCURVE", "824 264 OFFCURVE", "717 264 CURVE SMOOTH", "258 264 LINE", "258 241 LINE" ); }, { closed = 1; nodes = ( "445 0 LINE", "445 24 LINE", "56 23 LINE", "56 -1 LINE" ); }, { closed = 1; nodes = ( "264 13 LINE", "264 507 LINE", "239 507 LINE", "239 13 LINE" ); }, { closed = 1; nodes = ( "950 -10 OFFCURVE", "1012 64 OFFCURVE", "1012 155 CURVE SMOOTH", "1012 176 LINE", "987 176 LINE", "987 155 LINE SMOOTH", "987 75 OFFCURVE", "931 13 OFFCURVE", "855 13 CURVE SMOOTH", "775 13 OFFCURVE", "734 67 OFFCURVE", "675 139 CURVE SMOOTH", "603 227 OFFCURVE", "568 253 OFFCURVE", "460 253 CURVE SMOOTH", "258 253 LINE", "258 239 LINE", "472 239 LINE SMOOTH", "556 239 OFFCURVE", "595 201 OFFCURVE", "655 125 CURVE SMOOTH", "715 49 OFFCURVE", "765 -10 OFFCURVE", "855 -10 CURVE SMOOTH" ); } ); }; hints = ( { horizontal = 1; origin = "{0, 23}"; target = "{0, 24}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 3}"; target = "{1, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 32}"; target = "{0, 33}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 24}"; target = "{2, 1}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{1, 1}"; type = Align; }, { horizontal = 1; origin = "{0, 40}"; target = "{0, 8}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 33}"; target = "{0, 15}"; type = Align; }, { horizontal = 1; origin = "{0, 37}"; target = "{0, 11}"; type = Align; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "950 -10 OFFCURVE", "1012 64 OFFCURVE", "1012 155 CURVE SMOOTH", "1012 176 LINE", "987 176 LINE", "987 155 LINE SMOOTH", "987 75 OFFCURVE", "932 14 OFFCURVE", "855 14 CURVE SMOOTH", "775 14 OFFCURVE", "735 67 OFFCURVE", "675 139 CURVE SMOOTH", "622 203 OFFCURVE", "590 234 OFFCURVE", "535 246 CURVE", "535 241 LINE", "717 241 LINE SMOOTH", "841 241 OFFCURVE", "901 309 OFFCURVE", "901 378 CURVE SMOOTH", "901 457 OFFCURVE", "841 520 OFFCURVE", "717 520 CURVE SMOOTH", "56 520 LINE", "56 496 LINE", "717 496 LINE SMOOTH", "826 496 OFFCURVE", "875 441 OFFCURVE", "875 378 CURVE SMOOTH", "875 317 OFFCURVE", "824 264 OFFCURVE", "717 264 CURVE SMOOTH", "258 264 LINE", "258 240 LINE", "472 240 LINE SMOOTH", "556 240 OFFCURVE", "595 201 OFFCURVE", "655 125 CURVE SMOOTH", "714 49 OFFCURVE", "766 -10 OFFCURVE", "855 -10 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "445 0 LINE", "445 24 LINE", "56 23 LINE", "56 -1 LINE" ); }, { closed = 1; nodes = ( "264 14 LINE", "264 507 LINE", "239 507 LINE", "239 14 LINE" ); } ); width = 1046; } ); leftKerningGroup = H; leftMetricsKey = "=H"; rightKerningGroup = R; unicode = 0052; }, { color = 0; glyphname = S; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{470, -11}"; }, { name = top; position = "{450, 531}"; } ); hints = ( { horizontal = 1; origin = "{0, 45}"; target = "{0, 34}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 22}"; target = "{0, 11}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 17}"; type = Anchor; }, { horizontal = 1; origin = "{0, 39}"; type = Anchor; }, { horizontal = 1; origin = "{0, 34}"; target = "{0, 22}"; other1 = "{0, 5}"; type = Interpolate; }, { horizontal = 1; origin = "{0, 5}"; target = "{0, 28}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 14}"; type = Anchor; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "674 -10 OFFCURVE", "777 34 OFFCURVE", "777 124 CURVE SMOOTH", "777 218 OFFCURVE", "680 249 OFFCURVE", "440 268 CURVE SMOOTH", "217 286 OFFCURVE", "142 316 OFFCURVE", "142 386 CURVE SMOOTH", "142 468 OFFCURVE", "233 507 OFFCURVE", "372 507 CURVE SMOOTH", "540 507 OFFCURVE", "650 444 OFFCURVE", "736 344 CURVE", "742 346 LINE", "742 520 LINE", "719 520 LINE", "719 378 LINE", "734 378 LINE", "666 453 OFFCURVE", "559 531 OFFCURVE", "374 531 CURVE SMOOTH", "211 531 OFFCURVE", "117 480 OFFCURVE", "117 386 CURVE SMOOTH", "117 305 OFFCURVE", "194 261 OFFCURVE", "440 244 CURVE SMOOTH", "666 228 OFFCURVE", "753 201 OFFCURVE", "753 124 CURVE SMOOTH", "753 47 OFFCURVE", "657 14 OFFCURVE", "534 14 CURVE SMOOTH", "384 14 OFFCURVE", "211 74 OFFCURVE", "121 177 CURVE", "115 175 LINE", "115 0 LINE", "139 0 LINE", "139 140 LINE", "124 140 LINE", "196 65 OFFCURVE", "360 -10 OFFCURVE", "532 -10 CURVE SMOOTH" ); } ); width = 867; } ); leftKerningGroup = S; rightKerningGroup = S; unicode = 0053; }, { color = 0; glyphname = T; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{450, 0}"; }, { name = center; position = "{450, 252}"; }, { name = top; position = "{450, 520}"; } ); hints = ( { horizontal = 1; origin = "{1, 3}"; target = "{1, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 6}"; target = "{0, 1}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 1}"; target = "{2, 1}"; type = Align; }, { horizontal = 1; origin = "{0, 7}"; target = "{0, 3}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{2, 0}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "89 337 LINE", "89 497 LINE", "811 497 LINE", "811 337 LINE", "836 337 LINE", "836 520 LINE", "64 520 LINE", "64 337 LINE" ); }, { closed = 1; nodes = ( "655 0 LINE", "655 23 LINE", "246 23 LINE", "246 0 LINE" ); }, { closed = 1; nodes = ( "463 14 LINE", "463 507 LINE", "438 507 LINE", "438 14 LINE" ); } ); width = 900; } ); leftKerningGroup = T; rightKerningGroup = T; unicode = 0054; }, { color = 0; glyphname = U; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{501, -11}"; }, { name = ogonek; position = "{501, -11}"; }, { name = top; position = "{501, 509}"; }, { name = topright; position = "{1001, 520}"; } ); hints = ( { horizontal = 1; origin = "{0, 17}"; target = "{0, 8}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 2}"; target = "{1, 3}"; type = TTStem; options = 4; }, { place = "{182, 24}"; type = Stem; }, { place = "{795.5, 23.5}"; type = Stem; }, { horizontal = 1; origin = "{1, 2}"; target = "{2, 2}"; type = Align; }, { horizontal = 1; origin = "{1, 3}"; target = "{0, 12}"; type = Align; }, { horizontal = 1; origin = "{1, 3}"; target = "{2, 3}"; type = Align; }, { horizontal = 1; origin = "{1, 3}"; target = "{0, 3}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "694 -11 OFFCURVE", "819 79 OFFCURVE", "819 254 CURVE SMOOTH", "819 507 LINE", "797 507 LINE", "794 241 LINE SMOOTH", "793 89 OFFCURVE", "675 13 OFFCURVE", "501 13 CURVE SMOOTH", "326 13 OFFCURVE", "208 89 OFFCURVE", "207 243 CURVE SMOOTH", "205 507 LINE", "182 507 LINE", "182 254 LINE SMOOTH", "182 79 OFFCURVE", "309 -11 OFFCURVE", "501 -11 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "386 496 LINE", "386 520 LINE", "0 520 LINE", "0 496 LINE" ); }, { closed = 1; nodes = ( "1001 496 LINE", "1001 520 LINE", "615 520 LINE", "615 496 LINE" ); } ); width = 1001; } ); leftKerningGroup = U; rightKerningGroup = U; unicode = 0055; }, { color = 0; glyphname = V; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{469, -11}"; }, { name = top; position = "{469, 485}"; } ); hints = ( { horizontal = 1; origin = "{2, 6}"; type = Anchor; }, { horizontal = 1; origin = "{0, 0}"; target = "{0, 1}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 1}"; target = "{0, 2}"; type = Align; }, { horizontal = 1; origin = "{0, 1}"; target = "{1, 1}"; type = Align; }, { horizontal = 1; origin = "{0, 1}"; target = "{2, 1}"; type = Align; }, { horizontal = 1; origin = "{0, 0}"; target = "{1, 0}"; type = Align; }, { horizontal = 1; origin = "{2, 6}"; target = "{2, 3}"; type = Align; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "-5 520 LINE", "-5 496 LINE", "332 496 LINE", "332 520 LINE" ); }, { closed = 1; nodes = ( "605 520 LINE", "605 496 LINE", "941 496 LINE", "941 520 LINE" ); }, { closed = 1; nodes = ( "471 -11 LINE", "787 507 LINE", "759 507 LINE", "469 30 LINE", "181 507 LINE", "150 507 LINE", "465 -11 LINE" ); } ); width = 936; } ); leftKerningGroup = V; rightKerningGroup = V; unicode = 0056; }, { color = 0; glyphname = W; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{606, 11}"; }, { name = top; position = "{606, 520}"; } ); hints = ( { horizontal = 1; origin = "{0, 13}"; type = Anchor; }, { horizontal = 1; origin = "{0, 10}"; target = "{0, 11}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 11}"; target = "{0, 7}"; type = Align; }, { horizontal = 1; origin = "{0, 16}"; type = Anchor; }, { horizontal = 1; origin = "{0, 13}"; target = "{0, 6}"; type = Align; options = 4; }, { horizontal = 1; origin = "{0, 16}"; target = "{0, 3}"; type = Align; }, { horizontal = 1; origin = "{0, 5}"; type = Anchor; }, { horizontal = 1; origin = "{0, 5}"; target = "{0, 15}"; type = Align; options = 4; }, { horizontal = 1; origin = "{0, 0}"; target = "{0, 1}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 1}"; target = "{0, 18}"; type = Align; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "881 520 LINE", "881 496 LINE", "1028 496 LINE", "841 39 LINE", "611 507 LINE", "603 507 LINE", "372 40 LINE", "185 496 LINE", "332 496 LINE", "332 520 LINE", "-5 520 LINE", "-5 496 LINE", "156 496 LINE", "365 -10 LINE", "374 -10 LINE", "607 457 LINE", "837 -10 LINE", "844 -10 LINE", "1055 496 LINE", "1217 496 LINE", "1217 520 LINE" ); } ); width = 1212; } ); leftKerningGroup = V; rightKerningGroup = V; unicode = 0057; }, { color = 0; glyphname = X; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{475, 11}"; }, { name = top; position = "{475, 509}"; } ); hints = ( { horizontal = 1; origin = "{0, 15}"; target = "{0, 14}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 9}"; target = "{0, 10}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 10}"; target = "{0, 6}"; type = Align; }, { horizontal = 1; origin = "{0, 14}"; target = "{0, 18}"; type = Align; }, { horizontal = 1; origin = "{0, 19}"; target = "{0, 5}"; type = Align; options = 4; }, { horizontal = 1; origin = "{0, 2}"; target = "{0, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 3}"; target = "{0, 0}"; type = Align; options = 4; }, { horizontal = 1; origin = "{0, 22}"; target = "{0, 21}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 21}"; target = "{0, 24}"; type = Align; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "906 496 LINE", "906 520 LINE", "569 520 LINE", "569 496 LINE", "727 496 LINE", "477 268 LINE", "227 496 LINE", "382 496 LINE", "382 520 LINE", "45 520 LINE", "45 496 LINE", "189 496 LINE", "457 253 LINE", "206 23 LINE", "45 23 LINE", "45 0 LINE", "381 0 LINE", "381 23 LINE", "241 23 LINE", "475 238 LINE", "709 23 LINE", "569 23 LINE", "569 0 LINE", "906 0 LINE", "906 23 LINE", "747 23 LINE", "494 253 LINE", "762 496 LINE" ); } ); width = 951; } ); leftKerningGroup = X; rightKerningGroup = X; unicode = 0058; }, { color = 0; glyphname = Y; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{460, 0}"; }, { name = top; position = "{460, 509}"; } ); hints = ( { horizontal = 1; origin = "{0, 15}"; target = "{0, 14}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 9}"; target = "{0, 10}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 10}"; target = "{0, 6}"; type = Align; }, { horizontal = 1; origin = "{0, 10}"; target = "{0, 3}"; type = Align; }, { horizontal = 1; origin = "{0, 10}"; target = "{0, 20}"; type = Align; }, { horizontal = 1; origin = "{0, 12}"; target = "{0, 19}"; type = Align; }, { horizontal = 1; origin = "{0, 12}"; target = "{0, 5}"; type = Align; options = 4; }, { horizontal = 1; origin = "{0, 14}"; target = "{0, 18}"; type = Align; }, { horizontal = 1; origin = "{0, 9}"; target = "{0, 2}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "916 496 LINE", "916 520 LINE", "580 520 LINE", "580 496 LINE", "719 496 LINE", "461 206 LINE", "203 496 LINE", "342 496 LINE", "342 520 LINE", "5 520 LINE", "5 496 LINE", "167 496 LINE", "449 180 LINE", "449 23 LINE", "266 23 LINE", "266 0 LINE", "656 0 LINE", "656 23 LINE", "474 23 LINE", "474 184 LINE", "753 496 LINE" ); } ); width = 920; } ); leftKerningGroup = V; rightKerningGroup = V; unicode = 0059; }, { color = 0; glyphname = Z; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{434, 0}"; }, { name = top; position = "{434, 520}"; } ); background = { paths = ( { closed = 1; nodes = ( "764 0 LINE", "764 183 LINE", "739 183 LINE", "739 23 LINE", "178 23 LINE SMOOTH", "165 23 OFFCURVE", "155 20 OFFCURVE", "149 19 CURVE", "149 20 LINE", "155 22 OFFCURVE", "164 26 OFFCURVE", "174 33 CURVE SMOOTH", "760 507 LINE", "760 520 LINE", "105 520 LINE", "105 337 LINE", "130 337 LINE", "130 497 LINE", "687 497 LINE SMOOTH", "703 497 OFFCURVE", "716 500 OFFCURVE", "720 501 CURVE", "720 500 LINE", "716 500 OFFCURVE", "705 493 OFFCURVE", "694 484 CURVE SMOOTH", "108 14 LINE", "108 0 LINE" ); } ); }; hints = ( { horizontal = 1; origin = "{0, 13}"; target = "{0, 4}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 7}"; target = "{0, 10}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 8}"; type = Anchor; }, { horizontal = 1; origin = "{0, 1}"; type = Anchor; }, { horizontal = 1; origin = "{0, 11}"; target = "{0, 5}"; type = Align; options = 4; }, { horizontal = 1; origin = "{0, 10}"; target = "{0, 11}"; type = Align; }, { horizontal = 1; origin = "{0, 4}"; target = "{0, 12}"; type = Align; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "764 0 LINE", "764 183 LINE", "739 183 LINE", "739 23 LINE", "162 23 LINE", "760 507 LINE", "760 520 LINE", "105 520 LINE", "105 337 LINE", "130 337 LINE", "130 497 LINE", "710 497 LINE", "108 14 LINE", "108 0 LINE" ); } ); width = 864; } ); leftKerningGroup = Z; rightKerningGroup = Z; unicode = 005A; }, { color = 0; glyphname = a; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{287, -10}"; }, { name = ogonek; position = "{769, 7}"; }, { name = top; position = "{384, 367}"; } ); hints = ( { horizontal = 1; origin = "{1, 25}"; target = "{1, 6}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 12}"; target = "{1, 19}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 13}"; target = "{0, 20}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 27}"; target = "{0, 6}"; type = TTStem; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "741 -10 OFFCURVE", "769 2 OFFCURVE", "792 19 CURVE", "779 38 LINE", "760 22 OFFCURVE", "739 14 OFFCURVE", "711 14 CURVE SMOOTH", "678 14 OFFCURVE", "647 39 OFFCURVE", "647 93 CURVE SMOOTH", "647 197 LINE SMOOTH", "647 297 OFFCURVE", "572 367 OFFCURVE", "415 367 CURVE SMOOTH", "315 367 OFFCURVE", "214 346 OFFCURVE", "105 310 CURVE", "111 286 LINE", "215 318 OFFCURVE", "311 343 OFFCURVE", "415 343 CURVE SMOOTH", "559 343 OFFCURVE", "622 281 OFFCURVE", "622 197 CURVE SMOOTH", "622 93 LINE SMOOTH", "622 28 OFFCURVE", "659 -10 OFFCURVE", "710 -10 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "397 -10 OFFCURVE", "525 20 OFFCURVE", "634 76 CURVE", "634 99 LINE", "519 44 OFFCURVE", "395 14 OFFCURVE", "287 14 CURVE SMOOTH", "177 14 OFFCURVE", "115 43 OFFCURVE", "115 96 CURVE SMOOTH", "115 152 OFFCURVE", "196 186 OFFCURVE", "328 186 CURVE SMOOTH", "442 186 OFFCURVE", "549 171 OFFCURVE", "634 153 CURVE", "634 174 LINE", "549 192 OFFCURVE", "449 209 OFFCURVE", "328 209 CURVE SMOOTH", "180 209 OFFCURVE", "90 168 OFFCURVE", "90 94 CURVE SMOOTH", "90 28 OFFCURVE", "161 -10 OFFCURVE", "287 -10 CURVE SMOOTH" ); } ); width = 805; } ); leftKerningGroup = a; rightKerningGroup = n; unicode = 0061; }, { color = 0; glyphname = b; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{442, -11}"; }, { name = top; position = "{442, 366}"; } ); hints = ( { horizontal = 1; origin = "{0, 25}"; target = "{0, 18}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 5}"; target = "{0, 12}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{2, 2}"; target = "{2, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 4}"; type = Anchor; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "640 -11 OFFCURVE", "780 67 OFFCURVE", "780 195 CURVE SMOOTH", "780 303 OFFCURVE", "684 366 OFFCURVE", "541 366 CURVE SMOOTH", "411 366 OFFCURVE", "290 303 OFFCURVE", "174 219 CURVE", "174 196 LINE", "299 283 OFFCURVE", "427 343 OFFCURVE", "541 343 CURVE SMOOTH", "675 343 OFFCURVE", "755 283 OFFCURVE", "755 195 CURVE SMOOTH", "755 85 OFFCURVE", "628 11 OFFCURVE", "476 13 CURVE SMOOTH", "357 11 OFFCURVE", "244 55 OFFCURVE", "170 95 CURVE", "170 74 LINE", "242 32 OFFCURVE", "347 -11 OFFCURVE", "476 -11 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "180 0 LINE", "186 74 LINE", "186 520 LINE", "161 520 LINE", "161 0 LINE" ); }, { closed = 1; nodes = ( "178 496 LINE", "178 520 LINE", "-20 520 LINE", "-20 496 LINE" ); } ); width = 860; } ); leftKerningGroup = b; rightKerningGroup = o; rightMetricsKey = "=o"; unicode = 0062; }, { color = 0; glyphname = c; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{366, -11}"; }, { name = top; position = "{377, 366}"; } ); hints = ( { horizontal = 1; origin = "{0, 29}"; target = "{0, 6}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 23}"; target = "{0, 12}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 18}"; type = Anchor; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "500 -11 OFFCURVE", "600 33 OFFCURVE", "678 96 CURVE", "664 114 LINE", "590 56 OFFCURVE", "490 12 OFFCURVE", "365 13 CURVE SMOOTH", "218 14 OFFCURVE", "105 78 OFFCURVE", "105 172 CURVE SMOOTH", "105 286 OFFCURVE", "242 343 OFFCURVE", "375 343 CURVE SMOOTH", "484 343 OFFCURVE", "600 306 OFFCURVE", "666 220 CURVE", "672 221 LINE", "672 357 LINE", "649 357 LINE", "649 257 LINE", "661 252 LINE", "610 315 OFFCURVE", "501 366 OFFCURVE", "377 366 CURVE SMOOTH", "232 368 OFFCURVE", "80 303 OFFCURVE", "80 172 CURVE SMOOTH", "80 58 OFFCURVE", "208 -11 OFFCURVE", "365 -11 CURVE SMOOTH" ); } ); width = 774; } ); leftKerningGroup = o; leftMetricsKey = "=o"; rightKerningGroup = c; unicode = 0063; }, { color = 0; glyphname = d; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{425, -11}"; }, { name = center; position = "{425, 180}"; }, { name = top; position = "{425, 366}"; }, { name = topright; position = "{741, 339}"; } ); hints = ( { horizontal = 1; origin = "{1, 15}"; target = "{1, 6}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 19}"; target = "{0, 12}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{2, 2}"; target = "{2, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 25}"; target = "{0, 6}"; type = TTStem; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "449 -11 OFFCURVE", "570 53 OFFCURVE", "686 136 CURVE", "686 161 LINE", "561 74 OFFCURVE", "432 13 OFFCURVE", "318 13 CURVE SMOOTH", "185 13 OFFCURVE", "105 74 OFFCURVE", "105 161 CURVE SMOOTH", "105 271 OFFCURVE", "231 343 OFFCURVE", "384 343 CURVE SMOOTH", "502 343 OFFCURVE", "615 300 OFFCURVE", "690 260 CURVE", "690 283 LINE", "617 324 OFFCURVE", "512 366 OFFCURVE", "384 366 CURVE SMOOTH", "220 366 OFFCURVE", "80 290 OFFCURVE", "80 161 CURVE SMOOTH", "80 53 OFFCURVE", "175 -11 OFFCURVE", "318 -11 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "792 -10 OFFCURVE", "819 2 OFFCURVE", "844 19 CURVE", "834 39 LINE", "810 22 OFFCURVE", "790 14 OFFCURVE", "762 14 CURVE SMOOTH", "730 14 OFFCURVE", "699 39 OFFCURVE", "699 94 CURVE SMOOTH", "699 520 LINE", "674 520 LINE", "674 94 LINE SMOOTH", "674 28 OFFCURVE", "710 -10 OFFCURVE", "761 -10 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "690 497 LINE", "690 520 LINE", "491 520 LINE", "491 497 LINE" ); } ); width = 904; } ); leftKerningGroup = o; leftMetricsKey = "=o"; rightKerningGroup = l; unicode = 0064; }, { color = 0; glyphname = e; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{370, -11}"; }, { name = ogonek; position = "{666, 69}"; }, { name = top; position = "{376, 366}"; } ); hints = ( { horizontal = 1; origin = "{0, 37}"; target = "{0, 6}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 25}"; target = "{0, 18}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 31}"; target = "{0, 12}"; type = TTStem; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "506 -11 OFFCURVE", "590 22 OFFCURVE", "666 69 CURVE", "655 89 LINE", "581 43 OFFCURVE", "494 11 OFFCURVE", "370 13 CURVE SMOOTH", "218 14 OFFCURVE", "105 77 OFFCURVE", "105 171 CURVE SMOOTH", "105 280 OFFCURVE", "252 343 OFFCURVE", "400 343 CURVE SMOOTH", "540 343 OFFCURVE", "627 309 OFFCURVE", "627 250 CURVE SMOOTH", "627 186 OFFCURVE", "534 164 OFFCURVE", "414 164 CURVE SMOOTH", "305 164 OFFCURVE", "205 181 OFFCURVE", "99 217 CURVE", "100 196 LINE", "205 160 OFFCURVE", "305 140 OFFCURVE", "414 140 CURVE SMOOTH", "549 140 OFFCURVE", "652 172 OFFCURVE", "652 250 CURVE SMOOTH", "652 324 OFFCURVE", "551 366 OFFCURVE", "400 366 CURVE SMOOTH", "240 366 OFFCURVE", "80 297 OFFCURVE", "80 171 CURVE SMOOTH", "80 57 OFFCURVE", "208 -11 OFFCURVE", "370 -11 CURVE SMOOTH" ); } ); width = 751; } ); leftKerningGroup = o; leftMetricsKey = "=o"; rightKerningGroup = e; unicode = 0065; }, { color = 0; glyphname = f; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { hints = ( { horizontal = 1; origin = "{1, 3}"; target = "{1, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{2, 2}"; target = "{2, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 4}"; target = "{0, 11}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{2, 2}"; target = "{2, 1}"; type = Align; }, { horizontal = 1; origin = "{2, 3}"; target = "{2, 0}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{1, 1}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "235 10 LINE", "235 389 LINE SMOOTH", "235 485 OFFCURVE", "277 532 OFFCURVE", "374 532 CURVE SMOOTH", "431 532 OFFCURVE", "496 517 OFFCURVE", "547 497 CURVE", "555 520 LINE", "505 536 OFFCURVE", "440 556 OFFCURVE", "375 556 CURVE SMOOTH", "260 556 OFFCURVE", "210 494 OFFCURVE", "210 386 CURVE SMOOTH", "210 10 LINE" ); }, { closed = 1; nodes = ( "442 0 LINE", "442 23 LINE", "50 23 LINE", "50 0 LINE" ); }, { closed = 1; nodes = ( "459 334 LINE", "459 357 LINE", "50 357 LINE", "50 334 LINE" ); } ); width = 555; } ); leftKerningGroup = n; leftMetricsKey = "=n"; rightKerningGroup = f; unicode = 0066; }, { color = 0; glyphname = g; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{367, -175}"; }, { name = top; position = "{376, 377}"; } ); hints = ( { horizontal = 1; origin = "{0, 43}"; target = "{0, 30}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 21}"; target = "{0, 8}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 24}"; target = "{0, 5}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 11}"; target = "{2, 11}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 5}"; target = "{2, 5}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{3, 2}"; target = "{3, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 36}"; target = "{0, 37}"; type = Align; options = 4; }, { horizontal = 1; origin = "{0, 14}"; target = "{0, 15}"; type = Align; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "543 -165 OFFCURVE", "691 -121 OFFCURVE", "691 -30 CURVE SMOOTH", "691 31 OFFCURVE", "631 59 OFFCURVE", "555 59 CURVE SMOOTH", "480 59 OFFCURVE", "315 26 OFFCURVE", "239 26 CURVE SMOOTH", "134 26 OFFCURVE", "101 64 OFFCURVE", "101 94 CURVE SMOOTH", "101 136 OFFCURVE", "149 159 OFFCURVE", "183 171 CURVE", "164 180 LINE", "130 170 OFFCURVE", "78 141 OFFCURVE", "78 91 CURVE SMOOTH", "78 56 OFFCURVE", "108 5 OFFCURVE", "236 5 CURVE SMOOTH", "316 5 OFFCURVE", "475 36 OFFCURVE", "555 36 CURVE SMOOTH", "620 36 OFFCURVE", "666 17 OFFCURVE", "666 -30 CURVE SMOOTH", "666 -107 OFFCURVE", "528 -142 OFFCURVE", "349 -142 CURVE SMOOTH", "166 -142 OFFCURVE", "95 -100 OFFCURVE", "95 -46 CURVE SMOOTH", "95 -14 OFFCURVE", "121 14 OFFCURVE", "155 25 CURVE", "136 34 LINE", "109 24 OFFCURVE", "70 -7 OFFCURVE", "70 -49 CURVE SMOOTH", "70 -115 OFFCURVE", "152 -165 OFFCURVE", "350 -165 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "512 108 OFFCURVE", "630 149 OFFCURVE", "630 239 CURVE SMOOTH", "630 327 OFFCURVE", "512 367 OFFCURVE", "376 367 CURVE SMOOTH", "241 367 OFFCURVE", "124 327 OFFCURVE", "124 239 CURVE SMOOTH", "124 149 OFFCURVE", "241 106 OFFCURVE", "376 108 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "253 132 OFFCURVE", "149 168 OFFCURVE", "149 239 CURVE SMOOTH", "149 310 OFFCURVE", "253 343 OFFCURVE", "376 343 CURVE SMOOTH", "501 343 OFFCURVE", "605 310 OFFCURVE", "605 239 CURVE SMOOTH", "605 168 OFFCURVE", "501 132 OFFCURVE", "376 132 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "585 390 OFFCURVE", "631 418 OFFCURVE", "689 421 CURVE", "689 446 LINE", "624 443 OFFCURVE", "570 401 OFFCURVE", "556 325 CURVE", "567 309 LINE" ); } ); width = 756; } ); leftKerningGroup = o; rightKerningGroup = o; unicode = 0067; }, { color = 0; glyphname = h; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{485, 0}"; }, { name = center; position = "{519, 180}"; }, { name = top; position = "{519, 366}"; } ); hints = ( { horizontal = 1; origin = "{1, 3}"; target = "{1, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 4}"; target = "{0, 11}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{2, 2}"; target = "{2, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 2}"; target = "{2, 0}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{3, 2}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{0, 0}"; type = Align; }, { horizontal = 1; origin = "{1, 3}"; target = "{3, 3}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "752 15 LINE", "752 135 LINE SMOOTH", "752 257 OFFCURVE", "703 366 OFFCURVE", "547 366 CURVE SMOOTH", "411 366 OFFCURVE", "289 264 OFFCURVE", "224 211 CURVE", "224 188 LINE", "289 239 OFFCURVE", "411 343 OFFCURVE", "547 343 CURVE SMOOTH", "694 343 OFFCURVE", "727 236 OFFCURVE", "727 135 CURVE SMOOTH", "727 15 LINE" ); }, { closed = 1; nodes = ( "397 0 LINE", "397 23 LINE", "30 23 LINE", "30 0 LINE" ); }, { closed = 1; nodes = ( "239 15 LINE", "239 520 LINE", "31 520 LINE", "31 496 LINE", "214 496 LINE", "214 15 LINE" ); }, { closed = 1; nodes = ( "925 0 LINE", "925 23 LINE", "567 23 LINE", "567 0 LINE" ); } ); width = 938; } ); leftKerningGroup = h; rightKerningGroup = n; rightMetricsKey = "=n"; unicode = 0068; }, { color = 0; glyphname = i; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { background = { paths = ( { closed = 1; nodes = ( "265 470 OFFCURVE", "281 483 OFFCURVE", "281 500 CURVE SMOOTH", "281 518 OFFCURVE", "265 531 OFFCURVE", "234 531 CURVE SMOOTH", "205 531 OFFCURVE", "186 518 OFFCURVE", "186 500 CURVE SMOOTH", "186 483 OFFCURVE", "205 470 OFFCURVE", "234 470 CURVE SMOOTH" ); } ); }; components = ( { name = idotless; }, { name = dotaccentcomb; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; width = 0; } ); leftKerningGroup = n; leftMetricsKey = "=n"; rightKerningGroup = u; unicode = 0069; }, { color = 0; glyphname = j; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { background = { components = ( { name = jdotless; } ); paths = ( { closed = 1; nodes = ( "278 469 OFFCURVE", "294 482 OFFCURVE", "294 500 CURVE SMOOTH", "294 517 OFFCURVE", "278 531 OFFCURVE", "247 531 CURVE SMOOTH", "217 531 OFFCURVE", "199 517 OFFCURVE", "199 500 CURVE SMOOTH", "199 482 OFFCURVE", "217 469 OFFCURVE", "247 469 CURVE SMOOTH" ); } ); }; components = ( { alignment = -1; name = jdotless; }, { alignment = -1; name = dotaccentcomb; transform = "{1, 0, 0, 1, 120, -163}"; } ); hints = ( { horizontal = 1; place = "{-180, 23}"; type = TTStem; options = 4; }, { horizontal = 1; place = "{357, -23}"; type = TTStem; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; width = 419; } ); leftKerningGroup = p; rightKerningGroup = j; unicode = 006A; }, { color = 0; glyphname = k; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{474, 0}"; }, { name = top; position = "{474, 366}"; } ); hints = ( { horizontal = 1; origin = "{4, 13}"; target = "{4, 6}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 25}"; target = "{0, 18}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 5}"; target = "{0, 12}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{3, 2}"; target = "{3, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 3}"; target = "{1, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 2}"; target = "{1, 1}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "645 134 OFFCURVE", "756 177 OFFCURVE", "756 264 CURVE SMOOTH", "756 328 OFFCURVE", "690 366 OFFCURVE", "582 366 CURVE SMOOTH", "465 366 OFFCURVE", "340 311 OFFCURVE", "224 232 CURVE", "224 211 LINE", "340 288 OFFCURVE", "462 343 OFFCURVE", "577 343 CURVE SMOOTH", "672 343 OFFCURVE", "731 317 OFFCURVE", "731 262 CURVE SMOOTH", "731 194 OFFCURVE", "624 158 OFFCURVE", "472 158 CURVE SMOOTH", "381 158 OFFCURVE", "266 171 OFFCURVE", "222 177 CURVE", "220 160 LINE", "266 151 OFFCURVE", "366 134 OFFCURVE", "469 134 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "419 0 LINE", "419 23 LINE", "30 23 LINE", "30 0 LINE" ); }, { closed = 1; nodes = ( "236 0 LINE", "236 520 LINE", "211 520 LINE", "211 0 LINE" ); }, { closed = 1; nodes = ( "236 496 LINE", "236 520 LINE", "30 520 LINE", "30 496 LINE" ); }, { closed = 1; nodes = ( "764 -20 OFFCURVE", "816 31 OFFCURVE", "830 99 CURVE", "809 104 LINE", "795 38 OFFCURVE", "744 4 OFFCURVE", "685 4 CURVE SMOOTH", "603 4 OFFCURVE", "553 59 OFFCURVE", "481 151 CURVE", "456 151 LINE", "520 57 OFFCURVE", "592 -20 OFFCURVE", "684 -20 CURVE SMOOTH" ); } ); width = 890; } ); leftKerningGroup = h; leftMetricsKey = "=h"; rightKerningGroup = k; unicode = 006B; }, { color = 0; glyphname = l; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{225, 0}"; }, { name = center; position = "{225, 283}"; }, { name = top; position = "{225, 520}"; }, { name = topright; position = "{280, 337}"; } ); hints = ( { horizontal = 1; origin = "{1, 3}"; target = "{1, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{2, 2}"; target = "{2, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 2}"; target = "{0, 0}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "236 20 LINE", "236 520 LINE", "211 520 LINE", "211 20 LINE" ); }, { closed = 1; nodes = ( "419 0 LINE", "419 23 LINE", "30 23 LINE", "30 0 LINE" ); }, { closed = 1; nodes = ( "236 496 LINE", "236 520 LINE", "30 520 LINE", "30 496 LINE" ); } ); width = 448; } ); leftKerningGroup = h; leftMetricsKey = "=h"; rightKerningGroup = l; rightMetricsKey = "=i"; unicode = 006C; }, { color = 0; glyphname = m; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{653, 0}"; }, { name = top; position = "{668, 351}"; } ); hints = ( { horizontal = 1; origin = "{2, 3}"; target = "{2, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 2}"; target = "{0, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{3, 4}"; target = "{3, 11}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{3, 4}"; target = "{5, 4}"; type = Align; }, { horizontal = 1; origin = "{3, 11}"; target = "{5, 11}"; type = Align; }, { horizontal = 1; origin = "{3, 7}"; target = "{5, 7}"; type = Align; }, { horizontal = 1; origin = "{5, 8}"; target = "{3, 8}"; type = Align; }, { horizontal = 1; origin = "{2, 2}"; target = "{1, 0}"; type = Align; }, { horizontal = 1; origin = "{2, 2}"; target = "{4, 2}"; type = Align; }, { horizontal = 1; origin = "{2, 2}"; target = "{3, 0}"; type = Align; }, { horizontal = 1; origin = "{2, 2}"; target = "{6, 2}"; type = Align; }, { horizontal = 1; origin = "{2, 2}"; target = "{5, 0}"; type = Align; }, { horizontal = 1; origin = "{6, 3}"; target = "{2, 3}"; type = Align; }, { horizontal = 1; origin = "{2, 3}"; target = "{4, 3}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "257 334 LINE", "257 357 LINE", "50 357 LINE", "50 334 LINE" ); }, { closed = 1; nodes = ( "257 16 LINE", "257 357 LINE", "232 357 LINE", "232 16 LINE" ); }, { closed = 1; nodes = ( "392 0 LINE", "392 23 LINE", "50 23 LINE", "50 0 LINE" ); }, { closed = 1; nodes = ( "660 16 LINE", "660 156 LINE SMOOTH", "660 278 OFFCURVE", "622 367 OFFCURVE", "493 367 CURVE SMOOTH", "385 367 OFFCURVE", "299 290 OFFCURVE", "244 211 CURVE", "244 188 LINE", "314 268 OFFCURVE", "385 343 OFFCURVE", "493 343 CURVE SMOOTH", "611 343 OFFCURVE", "636 258 OFFCURVE", "636 156 CURVE SMOOTH", "636 16 LINE" ); }, { closed = 1; nodes = ( "795 0 LINE", "795 23 LINE", "501 23 LINE", "501 0 LINE" ); }, { closed = 1; nodes = ( "1065 16 LINE", "1065 156 LINE SMOOTH", "1065 278 OFFCURVE", "1025 367 OFFCURVE", "897 367 CURVE SMOOTH", "789 367 OFFCURVE", "702 290 OFFCURVE", "647 211 CURVE", "647 188 LINE", "716 268 OFFCURVE", "789 343 OFFCURVE", "897 343 CURVE SMOOTH", "1016 343 OFFCURVE", "1040 258 OFFCURVE", "1040 156 CURVE SMOOTH", "1040 16 LINE" ); }, { closed = 1; nodes = ( "1247 0 LINE", "1247 23 LINE", "905 23 LINE", "905 0 LINE" ); } ); width = 1260; } ); leftKerningGroup = n; leftMetricsKey = "=n"; rightKerningGroup = n; rightMetricsKey = "=n"; unicode = 006D; }, { color = 0; glyphname = n; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{506, 0}"; }, { name = top; position = "{519, 366}"; } ); hints = ( { horizontal = 1; origin = "{1, 3}"; target = "{1, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{3, 2}"; target = "{3, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 4}"; target = "{0, 11}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 2}"; target = "{2, 0}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{4, 2}"; type = Align; }, { horizontal = 1; origin = "{1, 2}"; target = "{0, 0}"; type = Align; }, { horizontal = 1; origin = "{4, 3}"; target = "{1, 3}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "772 20 LINE", "772 135 LINE SMOOTH", "772 257 OFFCURVE", "724 366 OFFCURVE", "567 366 CURVE SMOOTH", "431 366 OFFCURVE", "309 264 OFFCURVE", "244 211 CURVE", "244 188 LINE", "309 239 OFFCURVE", "431 343 OFFCURVE", "567 343 CURVE SMOOTH", "714 343 OFFCURVE", "747 236 OFFCURVE", "747 135 CURVE SMOOTH", "747 20 LINE" ); }, { closed = 1; nodes = ( "417 0 LINE", "417 23 LINE", "50 23 LINE", "50 0 LINE" ); }, { closed = 1; nodes = ( "257 20 LINE", "257 357 LINE", "232 357 LINE", "232 20 LINE" ); }, { closed = 1; nodes = ( "257 334 LINE", "257 357 LINE", "50 357 LINE", "50 334 LINE" ); }, { closed = 1; nodes = ( "944 0 LINE", "944 23 LINE", "587 23 LINE", "587 0 LINE" ); } ); width = 957; } ); leftKerningGroup = n; rightKerningGroup = n; unicode = 006E; }, { color = 0; glyphname = o; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{399, -11}"; }, { name = center; position = "{400, 180}"; }, { name = ogonek; position = "{399, -10}"; }, { name = top; position = "{400, 366}"; }, { name = topright; position = "{769, 357}"; } ); guideLines = ( { position = "{221, 365}"; }, { position = "{221, -11}"; } ); hints = ( { horizontal = 1; origin = "{0, 11}"; target = "{1, 11}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 5}"; target = "{1, 5}"; type = TTStem; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "578 -11 OFFCURVE", "719 59 OFFCURVE", "719 179 CURVE SMOOTH", "719 301 OFFCURVE", "578 366 OFFCURVE", "399 366 CURVE SMOOTH", "221 365 OFFCURVE", "80 301 OFFCURVE", "80 179 CURVE SMOOTH", "80 59 OFFCURVE", "221 -11 OFFCURVE", "399 -11 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "232 13 OFFCURVE", "105 75 OFFCURVE", "105 179 CURVE SMOOTH", "105 284 OFFCURVE", "232 341 OFFCURVE", "399 342 CURVE SMOOTH", "567 342 OFFCURVE", "694 284 OFFCURVE", "694 179 CURVE SMOOTH", "694 75 OFFCURVE", "567 13 OFFCURVE", "399 13 CURVE SMOOTH" ); } ); width = 799; } ); leftKerningGroup = o; rightKerningGroup = o; unicode = 006F; }, { color = 0; glyphname = p; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{459, -11}"; }, { name = top; position = "{459, 366}"; } ); hints = ( { horizontal = 1; origin = "{1, 3}"; target = "{1, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 25}"; target = "{0, 18}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 5}"; target = "{0, 12}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{3, 2}"; target = "{3, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 2}"; target = "{2, 0}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "690 -11 OFFCURVE", "830 67 OFFCURVE", "830 195 CURVE SMOOTH", "830 303 OFFCURVE", "735 366 OFFCURVE", "591 366 CURVE SMOOTH", "461 366 OFFCURVE", "340 303 OFFCURVE", "224 219 CURVE", "224 196 LINE", "349 283 OFFCURVE", "477 343 OFFCURVE", "591 343 CURVE SMOOTH", "725 343 OFFCURVE", "805 283 OFFCURVE", "805 195 CURVE SMOOTH", "805 85 OFFCURVE", "678 11 OFFCURVE", "526 13 CURVE SMOOTH", "407 11 OFFCURVE", "294 55 OFFCURVE", "220 95 CURVE", "220 74 LINE", "292 32 OFFCURVE", "397 -11 OFFCURVE", "526 -11 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "428 -165 LINE", "428 -142 LINE", "30 -142 LINE", "30 -165 LINE" ); }, { closed = 1; nodes = ( "236 -147 LINE", "236 357 LINE", "211 357 LINE", "211 -147 LINE" ); }, { closed = 1; nodes = ( "236 334 LINE", "236 357 LINE", "30 357 LINE", "30 334 LINE" ); } ); width = 910; } ); leftKerningGroup = p; rightKerningGroup = o; rightMetricsKey = "=o"; unicode = 0070; }, { color = 0; glyphname = q; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{382, -11}"; }, { name = center; position = "{382, 180}"; }, { name = top; position = "{382, 366}"; } ); background = { paths = ( { closed = 1; nodes = ( "449 -11 OFFCURVE", "570 53 OFFCURVE", "686 136 CURVE", "686 161 LINE", "561 74 OFFCURVE", "432 13 OFFCURVE", "318 13 CURVE SMOOTH", "185 13 OFFCURVE", "105 74 OFFCURVE", "105 161 CURVE SMOOTH", "105 271 OFFCURVE", "231 343 OFFCURVE", "384 343 CURVE SMOOTH", "526 343 OFFCURVE", "701 284 OFFCURVE", "831 224 CURVE", "831 249 LINE", "702 310 OFFCURVE", "537 367 OFFCURVE", "384 366 CURVE SMOOTH", "220 366 OFFCURVE", "80 290 OFFCURVE", "80 161 CURVE SMOOTH", "80 53 OFFCURVE", "175 -11 OFFCURVE", "318 -11 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "881 -165 LINE", "881 -142 LINE", "481 -142 LINE", "481 -165 LINE" ); }, { closed = 1; nodes = ( "699 -150 LINE", "699 368 LINE", "686 368 LINE", "674 301 LINE", "674 -150 LINE" ); } ); }; hints = ( { horizontal = 1; origin = "{0, 25}"; target = "{0, 24}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 19}"; target = "{1, 12}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 13}"; target = "{1, 5}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 24}"; target = "{0, 28}"; type = Align; }, { horizontal = 1; origin = "{0, 8}"; type = Anchor; }, { horizontal = 1; origin = "{0, 3}"; target = "{0, 4}"; type = TTStem; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "699 278 LINE", "746 261 OFFCURVE", "791 243 OFFCURVE", "831 224 CURVE", "831 249 LINE", "790 268 OFFCURVE", "746 287 OFFCURVE", "699 304 CURVE", "699 368 LINE", "686 368 LINE", "676 312 LINE", "582 344 OFFCURVE", "481 367 OFFCURVE", "384 366 CURVE SMOOTH", "220 366 OFFCURVE", "80 290 OFFCURVE", "80 161 CURVE SMOOTH", "80 53 OFFCURVE", "175 -11 OFFCURVE", "318 -11 CURVE SMOOTH", "444 -11 OFFCURVE", "562 49 OFFCURVE", "674 127 CURVE", "674 -142 LINE", "481 -142 LINE", "481 -165 LINE", "881 -165 LINE", "881 -142 LINE", "699 -142 LINE" ); }, { closed = 1; nodes = ( "185 13 OFFCURVE", "105 74 OFFCURVE", "105 161 CURVE SMOOTH", "105 271 OFFCURVE", "231 343 OFFCURVE", "384 343 CURVE SMOOTH", "474 343 OFFCURVE", "577 319 OFFCURVE", "674 287 CURVE", "674 153 LINE", "553 70 OFFCURVE", "428 13 OFFCURVE", "318 13 CURVE SMOOTH" ); } ); width = 906; } ); leftKerningGroup = o; leftMetricsKey = "=o"; rightKerningGroup = q; unicode = 0071; }, { color = 0; glyphname = r; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{243, 0}"; }, { name = top; position = "{356, 357}"; } ); hints = ( { horizontal = 1; origin = "{1, 3}"; target = "{1, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 6}"; target = "{0, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{3, 2}"; target = "{3, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 2}"; target = "{1, 1}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "376 286 OFFCURVE", "498 343 OFFCURVE", "625 343 CURVE", "625 219 LINE", "650 219 LINE", "650 366 LINE", "625 367 LINE", "482 367 OFFCURVE", "366 305 OFFCURVE", "244 211 CURVE", "244 188 LINE" ); }, { closed = 1; nodes = ( "440 0 LINE", "440 23 LINE", "50 23 LINE", "50 0 LINE" ); }, { closed = 1; nodes = ( "257 10 LINE", "257 357 LINE", "232 357 LINE", "232 10 LINE" ); }, { closed = 1; nodes = ( "257 334 LINE", "257 357 LINE", "50 357 LINE", "50 334 LINE" ); } ); width = 725; } ); leftKerningGroup = n; leftMetricsKey = "=n"; rightKerningGroup = r; unicode = 0072; }, { color = 0; glyphname = s; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{410, -10}"; }, { name = top; position = "{370, 367}"; } ); hints = ( { horizontal = 1; origin = "{0, 43}"; target = "{0, 33}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 21}"; target = "{0, 11}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 16}"; type = Anchor; }, { horizontal = 1; origin = "{0, 37}"; type = Anchor; }, { horizontal = 1; origin = "{0, 33}"; target = "{0, 21}"; other1 = "{0, 5}"; type = Interpolate; }, { horizontal = 1; origin = "{0, 5}"; target = "{0, 27}"; type = TTStem; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "552 -10 OFFCURVE", "639 19 OFFCURVE", "639 86 CURVE SMOOTH", "639 158 OFFCURVE", "553 177 OFFCURVE", "364 189 CURVE SMOOTH", "190 199 OFFCURVE", "126 222 OFFCURVE", "126 268 CURVE SMOOTH", "126 318 OFFCURVE", "197 345 OFFCURVE", "315 345 CURVE SMOOTH", "440 345 OFFCURVE", "550 306 OFFCURVE", "622 220 CURVE", "622 357 LINE", "599 357 LINE", "599 257 LINE", "615 250 LINE", "566 314 OFFCURVE", "457 367 OFFCURVE", "319 367 CURVE SMOOTH", "168 367 OFFCURVE", "102 327 OFFCURVE", "102 267 CURVE SMOOTH", "102 205 OFFCURVE", "180 174 OFFCURVE", "364 164 CURVE SMOOTH", "547 153 OFFCURVE", "615 136 OFFCURVE", "615 85 CURVE SMOOTH", "615 27 OFFCURVE", "518 12 OFFCURVE", "414 12 CURVE SMOOTH", "292 12 OFFCURVE", "164 50 OFFCURVE", "95 136 CURVE", "95 0 LINE", "118 0 LINE", "118 99 LINE", "101 106 LINE", "149 43 OFFCURVE", "270 -10 OFFCURVE", "409 -10 CURVE SMOOTH" ); } ); width = 744; } ); leftKerningGroup = s; rightKerningGroup = s; unicode = 0073; }, { color = 0; glyphname = t; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{261, -11}"; }, { name = center; position = "{180, 124}"; }, { name = top; position = "{180, 456}"; }, { name = topright; position = "{228, 452}"; } ); background = { paths = ( { closed = 1; nodes = ( "356 -11 OFFCURVE", "420 13 OFFCURVE", "464 34 CURVE", "453 55 LINE", "412 34 OFFCURVE", "353 12 OFFCURVE", "284 12 CURVE SMOOTH", "222 12 OFFCURVE", "180 41 OFFCURVE", "180 123 CURVE", "180 456 LINE", "155 456 LINE", "155 123 LINE", "155 26 OFFCURVE", "205 -11 OFFCURVE", "286 -11 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "418 333 LINE", "418 357 LINE", "25 357 LINE", "25 333 LINE" ); } ); }; hints = ( { horizontal = 1; origin = "{0, 15}"; target = "{0, 6}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 2}"; target = "{1, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 2}"; target = "{1, 1}"; type = Align; }, { horizontal = 1; origin = "{1, 3}"; target = "{1, 0}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "356 -11 OFFCURVE", "420 14 OFFCURVE", "464 34 CURVE", "453 55 LINE", "412 34 OFFCURVE", "353 13 OFFCURVE", "284 13 CURVE SMOOTH", "222 13 OFFCURVE", "180 41 OFFCURVE", "180 124 CURVE SMOOTH", "180 456 LINE", "155 456 LINE", "155 124 LINE SMOOTH", "155 27 OFFCURVE", "205 -11 OFFCURVE", "286 -11 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "418 333 LINE", "418 357 LINE", "25 357 LINE", "25 333 LINE" ); } ); width = 524; } ); leftKerningGroup = t; rightKerningGroup = t; unicode = 0074; }, { color = 0; glyphname = u; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{381, -11}"; }, { name = ogonek; position = "{850, 19}"; }, { name = top; position = "{424, 357}"; }, { name = topright; position = "{825, 357}"; } ); hints = ( { horizontal = 1; origin = "{2, 15}"; target = "{2, 6}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 2}"; target = "{1, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 15}"; target = "{0, 6}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{3, 2}"; target = "{1, 2}"; type = Align; }, { horizontal = 1; origin = "{1, 3}"; target = "{3, 3}"; type = Align; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "495 -11 OFFCURVE", "590 40 OFFCURVE", "691 89 CURVE", "691 111 LINE", "590 61 OFFCURVE", "481 13 OFFCURVE", "381 13 CURVE SMOOTH", "271 14 OFFCURVE", "210 60 OFFCURVE", "210 165 CURVE SMOOTH", "210 357 LINE", "185 357 LINE", "185 165 LINE SMOOTH", "185 39 OFFCURVE", "261 -11 OFFCURVE", "381 -11 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "197 334 LINE", "197 357 LINE", "14 357 LINE", "14 334 LINE" ); }, { closed = 1; nodes = ( "800 -10 OFFCURVE", "825 2 OFFCURVE", "850 19 CURVE", "841 39 LINE", "817 22 OFFCURVE", "795 14 OFFCURVE", "769 14 CURVE SMOOTH", "736 14 OFFCURVE", "705 39 OFFCURVE", "705 94 CURVE SMOOTH", "705 357 LINE", "680 357 LINE", "680 94 LINE SMOOTH", "680 28 OFFCURVE", "717 -10 OFFCURVE", "767 -10 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "697 334 LINE", "697 357 LINE", "519 357 LINE", "519 334 LINE" ); } ); width = 910; } ); leftKerningGroup = u; rightKerningGroup = u; rightMetricsKey = "=d"; unicode = 0075; }, { color = 0; glyphname = v; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{375, -11}"; }, { name = top; position = "{375, 357}"; } ); hints = ( { horizontal = 1; origin = "{1, 2}"; target = "{1, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{1, 2}"; target = "{2, 2}"; type = Align; }, { horizontal = 1; origin = "{1, 3}"; target = "{2, 3}"; type = Align; }, { horizontal = 1; origin = "{1, 3}"; target = "{1, 0}"; type = Align; }, { horizontal = 1; origin = "{1, 3}"; target = "{2, 0}"; type = Align; }, { horizontal = 1; origin = "{0, 6}"; type = Anchor; }, { horizontal = 1; origin = "{0, 6}"; target = "{0, 3}"; type = Align; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "377 -11 LINE", "635 349 LINE", "609 349 LINE", "375 23 LINE", "142 349 LINE", "111 349 LINE", "371 -11 LINE" ); }, { closed = 1; nodes = ( "274 334 LINE", "274 357 LINE", "0 357 LINE", "0 334 LINE" ); }, { closed = 1; nodes = ( "753 334 LINE", "753 357 LINE", "480 357 LINE", "480 334 LINE" ); } ); width = 753; } ); leftKerningGroup = v; rightKerningGroup = v; unicode = 0076; }, { color = 0; glyphname = w; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{486, 0}"; }, { name = top; position = "{486, 357}"; } ); hints = ( { horizontal = 1; origin = "{0, 13}"; type = Anchor; }, { horizontal = 1; origin = "{0, 10}"; target = "{0, 11}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 14}"; target = "{0, 16}"; type = Align; }, { horizontal = 1; origin = "{0, 14}"; target = "{0, 6}"; type = Align; options = 4; }, { horizontal = 1; origin = "{0, 16}"; target = "{0, 3}"; type = Align; options = 4; }, { horizontal = 1; origin = "{0, 11}"; target = "{0, 1}"; type = Align; }, { horizontal = 1; origin = "{0, 11}"; target = "{0, 18}"; type = Align; }, { horizontal = 1; origin = "{0, 11}"; target = "{0, 7}"; type = Align; }, { horizontal = 1; origin = "{0, 10}"; target = "{0, 0}"; type = Align; }, { horizontal = 1; origin = "{0, 5}"; type = Anchor; }, { horizontal = 1; origin = "{0, 5}"; target = "{0, 15}"; type = Align; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "697 357 LINE", "697 334 LINE", "818 334 LINE", "674 27 LINE", "490 349 LINE", "484 349 LINE", "301 29 LINE", "156 334 LINE", "278 334 LINE", "278 357 LINE", "5 357 LINE", "5 334 LINE", "129 334 LINE", "295 -10 LINE", "301 -10 LINE", "485 311 LINE", "670 -10 LINE", "676 -10 LINE", "843 334 LINE", "972 334 LINE", "972 357 LINE" ); } ); width = 976; } ); leftKerningGroup = v; rightKerningGroup = v; unicode = 0077; }, { color = 0; glyphname = x; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{421, 0}"; }, { name = top; position = "{424, 357}"; } ); hints = ( { horizontal = 1; origin = "{0, 15}"; target = "{0, 14}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 9}"; target = "{0, 10}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 10}"; target = "{0, 6}"; type = Align; }, { horizontal = 1; origin = "{0, 14}"; target = "{0, 18}"; type = Align; }, { horizontal = 1; origin = "{0, 19}"; target = "{0, 5}"; type = Align; options = 4; }, { horizontal = 1; origin = "{0, 2}"; target = "{0, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 3}"; target = "{0, 27}"; type = Align; options = 4; }, { horizontal = 1; origin = "{0, 22}"; target = "{0, 21}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 21}"; target = "{0, 25}"; type = Align; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "785 334 LINE", "785 357 LINE", "476 357 LINE", "476 334 LINE", "637 334 LINE", "422 191 LINE", "206 334 LINE", "364 334 LINE", "364 357 LINE", "55 357 LINE", "55 334 LINE", "165 334 LINE", "401 179 LINE", "165 23 LINE", "55 23 LINE", "55 0 LINE", "364 0 LINE", "364 23 LINE", "201 23 LINE", "418 168 LINE", "635 23 LINE", "476 23 LINE", "476 0 LINE", "785 0 LINE", "785 23 LINE", "676 23 LINE", "439 180 LINE", "672 334 LINE" ); } ); width = 840; } ); leftKerningGroup = x; rightKerningGroup = x; unicode = 0078; }, { color = 0; glyphname = y; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{381, 0}"; }, { name = top; position = "{381, 357}"; } ); hints = ( { horizontal = 1; origin = "{0, 15}"; target = "{0, 8}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{2, 2}"; target = "{2, 3}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{2, 2}"; target = "{3, 2}"; type = Align; }, { horizontal = 1; origin = "{2, 3}"; target = "{2, 0}"; type = Align; }, { horizontal = 1; origin = "{2, 3}"; target = "{3, 3}"; type = Align; }, { horizontal = 1; origin = "{2, 3}"; target = "{3, 0}"; type = Align; }, { horizontal = 1; origin = "{1, 0}"; target = "{1, 3}"; type = Align; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "277 -180 OFFCURVE", "334 -124 OFFCURVE", "381 -49 CURVE SMOOTH", "631 343 LINE", "603 343 LINE", "353 -49 LINE SMOOTH", "309 -117 OFFCURVE", "261 -157 OFFCURVE", "191 -157 CURVE SMOOTH", "135 -157 OFFCURVE", "93 -140 OFFCURVE", "43 -116 CURVE", "35 -139 LINE", "86 -160 OFFCURVE", "126 -180 OFFCURVE", "190 -180 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "387 -10 LINE", "146 349 LINE", "118 349 LINE", "372 -34 LINE" ); }, { closed = 1; nodes = ( "278 334 LINE", "278 357 LINE", "5 357 LINE", "5 334 LINE" ); }, { closed = 1; nodes = ( "752 334 LINE", "752 357 LINE", "480 357 LINE", "480 334 LINE" ); } ); width = 762; } ); leftKerningGroup = v; rightKerningGroup = v; unicode = 0079; }, { color = 0; glyphname = z; lastChange = "2022-01-28 13:38:36 +0000"; layers = ( { anchors = ( { name = bottom; position = "{386, -11}"; }, { name = top; position = "{426, 366}"; } ); background = { paths = ( { closed = 1; nodes = ( "611 258 OFFCURVE", "499 227 OFFCURVE", "381 190 CURVE SMOOTH", "269 155 OFFCURVE", "155 116 OFFCURVE", "100 1 CURVE", "121 -10 LINE", "174 96 OFFCURVE", "280 136 OFFCURVE", "385 170 CURVE SMOOTH", "509 209 OFFCURVE", "632 240 OFFCURVE", "669 358 CURVE", "647 366 LINE" ); }, { closed = 1; nodes = ( "635 -11 OFFCURVE", "692 41 OFFCURVE", "706 121 CURVE", "682 125 LINE", "669 47 OFFCURVE", "605 13 OFFCURVE", "522 13 CURVE SMOOTH", "435 13 OFFCURVE", "328 52 OFFCURVE", "200 105 CURVE", "184 90 LINE", "315 35 OFFCURVE", "424 -11 OFFCURVE", "522 -11 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "136 218 LINE", "136 344 LINE", "352 344 OFFCURVE", "470 290 OFFCURVE", "585 250 CURVE", "594 269 LINE", "478 310 OFFCURVE", "368 366 OFFCURVE", "136 366 CURVE SMOOTH", "111 366 LINE", "111 218 LINE" ); } ); }; hints = ( { horizontal = 1; origin = "{0, 18}"; target = "{0, 22}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 38}"; target = "{0, 2}"; type = TTStem; options = 4; }, { horizontal = 1; origin = "{0, 31}"; type = Anchor; }, { horizontal = 1; origin = "{0, 18}"; target = "{0, 2}"; other1 = "{0, 28}"; type = Interpolate; }, { horizontal = 1; origin = "{0, 28}"; target = "{0, 8}"; type = Align; options = 4; } ); layerId = "034236B8-3FA8-43DA-9EDA-EFF269A687EC"; paths = ( { closed = 1; nodes = ( "669 47 OFFCURVE", "605 13 OFFCURVE", "522 13 CURVE SMOOTH", "439 13 OFFCURVE", "338 48 OFFCURVE", "218 97 CURVE", "268 130 OFFCURVE", "327 151 OFFCURVE", "385 170 CURVE SMOOTH", "509 209 OFFCURVE", "632 240 OFFCURVE", "669 358 CURVE", "647 366 LINE", "634 326 OFFCURVE", "610 297 OFFCURVE", "580 274 CURVE", "469 314 OFFCURVE", "359 366 OFFCURVE", "136 366 CURVE SMOOTH", "111 366 LINE", "111 218 LINE", "136 218 LINE", "136 344 LINE", "336 344 OFFCURVE", "451 298 OFFCURVE", "559 259 CURVE", "509 229 OFFCURVE", "446 210 OFFCURVE", "381 190 CURVE SMOOTH", "269 155 OFFCURVE", "155 116 OFFCURVE", "100 1 CURVE", "121 -10 LINE", "141 29 OFFCURVE", "168 59 OFFCURVE", "199 84 CURVE", "323 32 OFFCURVE", "428 -11 OFFCURVE", "522 -11 CURVE SMOOTH", "635 -11 OFFCURVE", "692 41 OFFCURVE", "706 121 CURVE", "682 125 LINE" ); } ); width = 766; } ); leftKerningGroup = z; rightKerningGroup = z; unicode = 007A; } ); instances = ( { customParameters = ( { name = "TTFAutohint options"; value = "--hinting-range-min=14 --hinting-range-max=48 --fallback-stem-width=24 --stem-width-mode=qss"; } ); instanceInterpolations = { "034236B8-3FA8-43DA-9EDA-EFF269A687EC" = 1; }; name = Regular; } ); kerning = { "034236B8-3FA8-43DA-9EDA-EFF269A687EC" = { "@MMK_L_A" = { "@MMK_R_A" = -45; "@MMK_R_AE" = -75; "@MMK_R_H" = -20; "@MMK_R_J" = -10; "@MMK_R_O" = -25; "@MMK_R_S" = -10; "@MMK_R_T" = -45; "@MMK_R_U" = -60; "@MMK_R_V" = -85; "@MMK_R_X" = -35; "@MMK_R_Z" = -25; "@MMK_R_a" = -15; "@MMK_R_asterisk" = -70; "@MMK_R_at" = -10; "@MMK_R_b" = -15; "@MMK_R_backslash" = -70; "@MMK_R_colon" = -20; "@MMK_R_f" = -40; "@MMK_R_guillemotleft" = -20; "@MMK_R_hyphen" = -20; "@MMK_R_n" = -15; "@MMK_R_o" = -15; "@MMK_R_p" = -15; "@MMK_R_paragraph" = -50; "@MMK_R_period" = 40; "@MMK_R_question" = -20; "@MMK_R_questiondown" = 10; "@MMK_R_quotedblleft" = -135; "@MMK_R_s" = -15; "@MMK_R_section" = -20; "@MMK_R_slash" = 30; "@MMK_R_t" = -35; "@MMK_R_u" = -15; "@MMK_R_v" = -55; "@MMK_R_x" = -35; "@MMK_R_z" = -20; }; "@MMK_L_B" = { "@MMK_R_AE" = -35; "@MMK_R_T" = -20; "@MMK_R_U" = -10; "@MMK_R_V" = -30; "@MMK_R_Z" = -10; "@MMK_R_ampersand" = 10; "@MMK_R_asterisk" = -15; "@MMK_R_backslash" = -15; "@MMK_R_hyphen" = 15; "@MMK_R_z" = -10; }; "@MMK_L_C" = { "@MMK_R_A" = -30; "@MMK_R_AE" = -55; "@MMK_R_T" = -15; "@MMK_R_U" = -10; "@MMK_R_V" = -20; "@MMK_R_Z" = -15; "@MMK_R_a" = -15; "@MMK_R_backslash" = 20; "@MMK_R_colon" = -10; "@MMK_R_hyphen" = 15; "@MMK_R_period" = -30; "@MMK_R_question" = -10; "@MMK_R_v" = 10; "@MMK_R_x" = -10; "@MMK_R_z" = -25; }; "@MMK_L_E" = { "@MMK_R_A" = -15; "@MMK_R_AE" = -30; "@MMK_R_S" = -10; "@MMK_R_T" = -10; "@MMK_R_V" = -10; "@MMK_R_Z" = -15; "@MMK_R_hyphen" = 10; "@MMK_R_paragraph" = -15; "@MMK_R_v" = -10; "@MMK_R_z" = -10; }; "@MMK_L_F" = { "@MMK_R_A" = -55; "@MMK_R_AE" = -75; "@MMK_R_a" = -20; "@MMK_R_ampersand" = -35; "@MMK_R_asterisk" = 20; "@MMK_R_at" = -15; "@MMK_R_backslash" = 30; "@MMK_R_colon" = -10; "@MMK_R_exclam" = 10; "@MMK_R_guillemotleft" = -10; "@MMK_R_hyphen" = -30; "@MMK_R_n" = -10; "@MMK_R_o" = -30; "@MMK_R_p" = -10; "@MMK_R_period" = -70; "@MMK_R_questiondown" = -20; "@MMK_R_quotedblleft" = 35; "@MMK_R_s" = -20; "@MMK_R_section" = -10; "@MMK_R_t" = -10; "@MMK_R_v" = -10; "@MMK_R_x" = -25; "@MMK_R_z" = -35; }; "@MMK_L_G" = { "@MMK_R_a" = 10; "@MMK_R_ampersand" = -10; "@MMK_R_b" = 10; "@MMK_R_backslash" = 30; "@MMK_R_braceleft" = 20; "@MMK_R_colon" = 10; "@MMK_R_exclam" = 10; "@MMK_R_f" = 20; "@MMK_R_guillemetright" = 15; "@MMK_R_guillemotleft" = 30; "@MMK_R_hyphen" = 25; "@MMK_R_period" = -15; "@MMK_R_questiondown" = 10; "@MMK_R_quotedblleft" = 10; "@MMK_R_t" = 30; "@MMK_R_u" = 30; "@MMK_R_v" = 40; "@MMK_R_x" = -10; "@MMK_R_z" = -10; }; "@MMK_L_H" = { "@MMK_R_A" = -20; "@MMK_R_AE" = -40; "@MMK_R_V" = -10; "@MMK_R_backslash" = 10; "@MMK_R_colon" = -20; "@MMK_R_o" = -20; "@MMK_R_parenright" = 20; "@MMK_R_question" = 10; "@MMK_R_z" = -15; }; "@MMK_L_L" = { "@MMK_R_AE" = -10; "@MMK_R_S" = -20; "@MMK_R_T" = -45; "@MMK_R_U" = -25; "@MMK_R_V" = -75; "@MMK_R_X" = -10; "@MMK_R_Z" = -25; "@MMK_R_a" = -10; "@MMK_R_asterisk" = -50; "@MMK_R_b" = -20; "@MMK_R_backslash" = -45; "@MMK_R_hyphen" = 15; "@MMK_R_p" = -25; "@MMK_R_paragraph" = -40; "@MMK_R_parenright" = -10; "@MMK_R_question" = -20; "@MMK_R_questiondown" = 10; "@MMK_R_quotedblleft" = -70; "@MMK_R_section" = -10; "@MMK_R_t" = -10; "@MMK_R_u" = -10; "@MMK_R_v" = -30; "@MMK_R_x" = -25; "@MMK_R_z" = -30; }; "@MMK_L_N" = { "@MMK_R_A" = -40; "@MMK_R_AE" = -55; "@MMK_R_J" = -15; "@MMK_R_U" = -20; "@MMK_R_V" = -30; "@MMK_R_X" = -15; "@MMK_R_Z" = -10; "@MMK_R_a" = -20; "@MMK_R_ampersand" = -15; "@MMK_R_asterisk" = 20; "@MMK_R_at" = -15; "@MMK_R_b" = -15; "@MMK_R_backslash" = 40; "@MMK_R_colon" = -35; "@MMK_R_n" = -10; "@MMK_R_o" = -35; "@MMK_R_p" = -15; "@MMK_R_period" = -50; "@MMK_R_quotedblleft" = 35; "@MMK_R_s" = -15; "@MMK_R_t" = -15; "@MMK_R_u" = -15; "@MMK_R_underscore" = -60; "@MMK_R_v" = -20; "@MMK_R_x" = -15; "@MMK_R_z" = -35; }; "@MMK_L_O" = { "@MMK_R_A" = -25; "@MMK_R_AE" = -40; "@MMK_R_J" = -10; "@MMK_R_U" = -10; "@MMK_R_V" = -15; "@MMK_R_X" = -10; "@MMK_R_Z" = -10; "@MMK_R_a" = 10; "@MMK_R_ampersand" = 25; "@MMK_R_asterisk" = -10; "@MMK_R_b" = 10; "@MMK_R_guillemotleft" = 10; "@MMK_R_hyphen" = 20; "@MMK_R_o" = 10; "@MMK_R_paragraph" = 15; "@MMK_R_parenright" = -10; "@MMK_R_period" = -30; "@MMK_R_question" = -10; "@MMK_R_quotedblleft" = -30; "@MMK_R_section" = 15; "@MMK_R_three.numr" = -10; "@MMK_R_u" = 20; "@MMK_R_v" = 15; }; "@MMK_L_P" = { "@MMK_R_A" = -30; "@MMK_R_AE" = -70; "@MMK_R_J" = -10; "@MMK_R_O" = 20; "@MMK_R_S" = 10; "@MMK_R_T" = 10; "@MMK_R_V" = 10; "@MMK_R_ampersand" = -20; "@MMK_R_b" = 20; "@MMK_R_backslash" = 10; "@MMK_R_exclam" = 20; "@MMK_R_paragraph" = 15; "@MMK_R_period" = -30; "@MMK_R_t" = 20; "@MMK_R_u" = 25; "@MMK_R_underscore" = -40; "@MMK_R_v" = 30; }; "@MMK_L_R" = { "@MMK_R_AE" = -25; "@MMK_R_J" = -10; "@MMK_R_S" = -10; "@MMK_R_T" = -35; "@MMK_R_U" = -10; "@MMK_R_V" = -40; "@MMK_R_X" = -10; "@MMK_R_a" = 10; "@MMK_R_ampersand" = 30; "@MMK_R_asterisk" = -30; "@MMK_R_at" = 25; "@MMK_R_b" = 15; "@MMK_R_colon" = 10; "@MMK_R_exclam" = 20; "@MMK_R_guillemotleft" = 40; "@MMK_R_guillemotright" = 20; "@MMK_R_hyphen" = 30; "@MMK_R_n" = 20; "@MMK_R_o" = 10; "@MMK_R_period" = 10; "@MMK_R_questiondown" = 25; "@MMK_R_quotedblleft" = -30; "@MMK_R_section" = -10; "@MMK_R_slash" = 25; "@MMK_R_t" = 15; "@MMK_R_u" = 20; "@MMK_R_underscore" = 20; }; "@MMK_L_S" = { "@MMK_R_A" = -10; "@MMK_R_AE" = -15; "@MMK_R_J" = 10; "@MMK_R_S" = -10; "@MMK_R_T" = -10; "@MMK_R_U" = -10; "@MMK_R_V" = -25; "@MMK_R_ampersand" = 15; "@MMK_R_at" = 15; "@MMK_R_backslash" = 10; "@MMK_R_hyphen" = 30; "@MMK_R_paragraph" = -10; "@MMK_R_period" = -10; "@MMK_R_quotedblleft" = -15; "@MMK_R_slash" = 10; "@MMK_R_v" = 10; "@MMK_R_z" = -15; }; "@MMK_L_T" = { "@MMK_R_A" = -45; "@MMK_R_AE" = -65; "@MMK_R_S" = -10; "@MMK_R_T" = -10; "@MMK_R_a" = -25; "@MMK_R_ampersand" = -20; "@MMK_R_at" = -20; "@MMK_R_colon" = -30; "@MMK_R_f" = -15; "@MMK_R_guillemotleft" = -20; "@MMK_R_hyphen" = -15; "@MMK_R_o" = -40; "@MMK_R_p" = -10; "@MMK_R_period" = -65; "@MMK_R_question" = -10; "@MMK_R_questiondown" = -20; "@MMK_R_s" = -20; "@MMK_R_section" = -20; "@MMK_R_slash" = -35; "@MMK_R_u" = -10; "@MMK_R_x" = -15; "@MMK_R_z" = -15; }; "@MMK_L_Thorn" = { "@MMK_R_O" = 35; "@MMK_R_V" = -35; "@MMK_R_X" = -30; "@MMK_R_b" = 10; "@MMK_R_hyphen" = 35; "@MMK_R_n" = 10; "@MMK_R_o" = 20; "@MMK_R_p" = 10; "@MMK_R_u" = 40; "@MMK_R_v" = 15; }; "@MMK_L_U" = { "@MMK_R_A" = -60; "@MMK_R_AE" = -85; "@MMK_R_J" = -20; "@MMK_R_O" = -10; "@MMK_R_S" = -10; "@MMK_R_U" = -20; "@MMK_R_V" = -20; "@MMK_R_Z" = -10; "@MMK_R_a" = -15; "@MMK_R_ampersand" = -15; "@MMK_R_asterisk" = 30; "@MMK_R_at" = -10; "@MMK_R_b" = -15; "@MMK_R_backslash" = 50; "@MMK_R_colon" = -30; "@MMK_R_f" = -10; "@MMK_R_hyphen" = -20; "@MMK_R_o" = -40; "@MMK_R_parenright" = 20; "@MMK_R_period" = -30; "@MMK_R_s" = -15; "@MMK_R_section" = -25; "@MMK_R_slash" = -50; "@MMK_R_underscore" = -75; "@MMK_R_v" = -10; "@MMK_R_x" = -25; "@MMK_R_z" = -30; }; "@MMK_L_V" = { "@MMK_R_A" = -85; "@MMK_R_AE" = -105; "@MMK_R_H" = -10; "@MMK_R_J" = -20; "@MMK_R_O" = -15; "@MMK_R_S" = -15; "@MMK_R_U" = -20; "@MMK_R_V" = -50; "@MMK_R_X" = -10; "@MMK_R_a" = -50; "@MMK_R_ampersand" = -60; "@MMK_R_asterisk" = 30; "@MMK_R_at" = -35; "@MMK_R_b" = -25; "@MMK_R_backslash" = 60; "@MMK_R_braceleft" = -20; "@MMK_R_colon" = -50; "@MMK_R_exclam" = 20; "@MMK_R_f" = -15; "@MMK_R_guillemotleft" = -60; "@MMK_R_hyphen" = -40; "@MMK_R_n" = -35; "@MMK_R_o" = -55; "@MMK_R_p" = -10; "@MMK_R_parenright" = -10; "@MMK_R_period" = -75; "@MMK_R_question" = 20; "@MMK_R_questiondown" = -30; "@MMK_R_quotedblleft" = 20; "@MMK_R_s" = -55; "@MMK_R_section" = -20; "@MMK_R_slash" = -65; "@MMK_R_u" = -10; "@MMK_R_underscore" = -80; "@MMK_R_v" = -20; "@MMK_R_x" = -35; "@MMK_R_z" = -35; }; "@MMK_L_X" = { "@MMK_R_A" = -35; "@MMK_R_AE" = -75; "@MMK_R_U" = -10; "@MMK_R_V" = -10; "@MMK_R_asterisk" = 10; "@MMK_R_backslash" = 10; "@MMK_R_guillemotleft" = -10; "@MMK_R_hyphen" = -15; "@MMK_R_o" = -10; "@MMK_R_parenright" = 20; "@MMK_R_question" = 20; "@MMK_R_questiondown" = 10; "@MMK_R_quotedblleft" = 10; "@MMK_R_slash" = 10; "@MMK_R_u" = -10; "@MMK_R_x" = -10; "@MMK_R_z" = -15; }; "@MMK_L_Z" = { "@MMK_R_A" = -20; "@MMK_R_AE" = -40; "@MMK_R_H" = -10; "@MMK_R_J" = 10; "@MMK_R_S" = -10; "@MMK_R_T" = -20; "@MMK_R_U" = -10; "@MMK_R_V" = -15; "@MMK_R_Z" = -10; "@MMK_R_a" = -10; "@MMK_R_b" = -10; "@MMK_R_guillemotleft" = 10; "@MMK_R_o" = -10; "@MMK_R_paragraph" = -40; "@MMK_R_question" = -10; "@MMK_R_questiondown" = 10; "@MMK_R_s" = -10; "@MMK_R_section" = -20; "@MMK_R_u" = 10; "@MMK_R_v" = -10; "@MMK_R_z" = -25; }; "@MMK_L_ampersand" = { "@MMK_R_A" = -35; "@MMK_R_AE" = -55; "@MMK_R_J" = -20; "@MMK_R_S" = -10; "@MMK_R_T" = -30; "@MMK_R_U" = -25; "@MMK_R_V" = -80; "@MMK_R_X" = 10; "@MMK_R_Z" = -10; "@MMK_R_a" = -15; "@MMK_R_b" = -10; "@MMK_R_four" = 10; "@MMK_R_nine" = -10; "@MMK_R_p" = 15; "@MMK_R_s" = -10; "@MMK_R_seven" = -30; "@MMK_R_three" = -10; "@MMK_R_two" = -10; "@MMK_R_v" = -10; "@MMK_R_x" = -10; "@MMK_R_z" = -15; }; "@MMK_L_asterisk" = { "@MMK_R_A" = -70; "@MMK_R_AE" = -120; "@MMK_R_J" = -50; "@MMK_R_O" = -10; "@MMK_R_U" = 30; "@MMK_R_V" = 30; "@MMK_R_X" = 10; "@MMK_R_a" = -10; "@MMK_R_b" = 80; "@MMK_R_four" = -30; "@MMK_R_o" = -20; "@MMK_R_s" = -10; "@MMK_R_seven" = 20; "@MMK_R_u" = 35; "@MMK_R_v" = 30; "@MMK_R_z" = 10; }; "@MMK_L_at" = { "@MMK_R_A" = -40; "@MMK_R_AE" = -60; "@MMK_R_J" = -10; "@MMK_R_S" = -10; "@MMK_R_T" = -20; "@MMK_R_U" = -20; "@MMK_R_V" = -40; "@MMK_R_b" = -10; "@MMK_R_four" = 10; "@MMK_R_seven" = -10; "@MMK_R_v" = 20; }; "@MMK_L_backslash" = { "@MMK_R_A" = 30; "@MMK_R_AE" = 30; "@MMK_R_T" = -35; "@MMK_R_U" = -20; "@MMK_R_V" = -65; "@MMK_R_X" = 10; "@MMK_R_b" = 20; "@MMK_R_four" = 15; "@MMK_R_seven" = -20; "@MMK_R_two" = 50; "@MMK_R_v" = -10; "@MMK_R_x" = 10; "@MMK_R_z" = 15; }; "@MMK_L_braceleft" = { }; "@MMK_L_braceright" = { "@MMK_R_V" = -20; "@MMK_R_Z" = -10; "@MMK_R_v" = -10; }; "@MMK_L_bracketleft" = { }; "@MMK_L_c" = { "@MMK_R_A" = -30; "@MMK_R_AE" = -45; "@MMK_R_H" = -30; "@MMK_R_J" = -15; "@MMK_R_S" = -20; "@MMK_R_T" = -45; "@MMK_R_U" = -35; "@MMK_R_V" = -55; "@MMK_R_X" = -40; "@MMK_R_Z" = -20; "@MMK_R_ampersand" = -10; "@MMK_R_at" = -10; "@MMK_R_backslash" = -20; "@MMK_R_braceleft" = -10; "@MMK_R_guillemotright" = -10; "@MMK_R_period" = -20; "@MMK_R_questiondown" = 15; "@MMK_R_section" = -10; "@MMK_R_two" = -10; "@MMK_R_x" = -15; "@MMK_R_z" = -20; }; "@MMK_L_colon" = { "@MMK_R_A" = -20; "@MMK_R_AE" = -20; "@MMK_R_O" = -15; "@MMK_R_T" = -30; "@MMK_R_V" = -50; "@MMK_R_Z" = -15; "@MMK_R_o" = -10; "@MMK_R_two" = 10; "@MMK_R_u" = 10; "@MMK_R_x" = 10; }; "@MMK_L_e" = { "@MMK_R_a" = -10; "@MMK_R_asterisk" = -20; "@MMK_R_b" = -15; "@MMK_R_backslash" = -30; "@MMK_R_braceleft" = -10; "@MMK_R_h" = -10; "@MMK_R_n" = -10; "@MMK_R_paragraph" = -10; "@MMK_R_parenright" = -15; "@MMK_R_period" = -10; "@MMK_R_quotedblleft" = -10; "@MMK_R_v" = -10; "@MMK_R_x" = -15; "@MMK_R_z" = -15; }; "@MMK_L_eight" = { "@MMK_R_ampersand" = 20; "@MMK_R_eight" = -15; "@MMK_R_hyphen" = 25; "@MMK_R_nine" = -20; "@MMK_R_period" = -20; "@MMK_R_questiondown" = 10; "@MMK_R_quotedblleft" = -15; "@MMK_R_three" = -15; "@MMK_R_three.numr" = -10; "@MMK_R_two" = -15; "@MMK_R_zero" = -10; }; "@MMK_L_exclam" = { "@MMK_R_J" = 20; "@MMK_R_V" = 20; "@MMK_R_b" = 30; "@MMK_R_nine" = 20; "@MMK_R_two" = 20; "@MMK_R_u" = 15; }; "@MMK_L_f" = { "@MMK_R_A" = -30; "@MMK_R_AE" = -55; "@MMK_R_J" = -20; "@MMK_R_O" = 30; "@MMK_R_S" = 10; "@MMK_R_T" = 30; "@MMK_R_V" = 10; "@MMK_R_X" = 20; "@MMK_R_Z" = 20; "@MMK_R_ampersand" = -10; "@MMK_R_asterisk" = 60; "@MMK_R_b" = 20; "@MMK_R_backslash" = 70; "@MMK_R_braceleft" = 30; "@MMK_R_guillemotleft" = -10; "@MMK_R_hyphen" = -10; "@MMK_R_paragraph" = 40; "@MMK_R_parenleft" = 10; "@MMK_R_parenright" = 70; "@MMK_R_period" = -20; "@MMK_R_question" = 40; "@MMK_R_quotedblleft" = 50; }; "@MMK_L_five" = { "@MMK_R_ampersand" = 20; "@MMK_R_asterisk" = 10; "@MMK_R_at" = 10; "@MMK_R_eight" = -15; "@MMK_R_hyphen" = 25; "@MMK_R_nine" = -15; "@MMK_R_o" = -10; "@MMK_R_period" = -20; "@MMK_R_quotedblleft" = -10; "@MMK_R_two" = -15; "@MMK_R_zero" = -10; }; "@MMK_L_four" = { "@MMK_R_ampersand" = 20; "@MMK_R_asterisk" = -10; "@MMK_R_at" = 15; "@MMK_R_exclam" = 20; "@MMK_R_guillemotleft" = 30; "@MMK_R_hyphen" = 30; "@MMK_R_nine" = -10; "@MMK_R_numbersign" = 35; "@MMK_R_questiondown" = 30; "@MMK_R_quotedblleft" = -10; "@MMK_R_three" = -10; "@MMK_R_two" = -10; }; "@MMK_L_fraction" = { "@MMK_R_four.dnom" = -70; "@MMK_R_two.dnom" = -20; }; "@MMK_L_guillemetright" = { "@MMK_R_A" = -20; "@MMK_R_AE" = -30; "@MMK_R_O" = 10; "@MMK_R_V" = -60; "@MMK_R_X" = -10; }; "@MMK_L_guillemotleft" = { "@MMK_R_V" = -40; "@MMK_R_X" = -10; "@MMK_R_a" = -10; "@MMK_R_b" = -10; "@MMK_R_four" = 10; "@MMK_R_three" = -10; "@MMK_R_two" = -10; "@MMK_R_v" = -20; "@MMK_R_z" = -10; }; "@MMK_L_guillemotright" = { "@MMK_R_J" = -30; "@MMK_R_O" = 10; "@MMK_R_T" = -20; "@MMK_R_V" = -20; "@MMK_R_X" = -10; "@MMK_R_b" = -15; "@MMK_R_four" = 30; "@MMK_R_o" = 20; "@MMK_R_seven" = -15; "@MMK_R_v" = -10; "@MMK_R_x" = 20; "@MMK_R_z" = 10; }; "@MMK_L_hyphen" = { "@MMK_R_A" = -20; "@MMK_R_AE" = -40; "@MMK_R_O" = 20; "@MMK_R_S" = 30; "@MMK_R_T" = -15; "@MMK_R_U" = -20; "@MMK_R_V" = -40; "@MMK_R_X" = -15; "@MMK_R_a" = 30; "@MMK_R_eight" = 25; "@MMK_R_four" = 50; "@MMK_R_knBA" = 15; "@MMK_R_knKA" = -20; "@MMK_R_knLA" = 10; "@MMK_R_knLLA" = 5; "@MMK_R_knPA" = 15; "@MMK_R_knSHA" = 10; "@MMK_R_knTA" = -20; "@MMK_R_knvE" = 10; "@MMK_R_knvL" = 20; "@MMK_R_knvR" = -10; "@MMK_R_nine" = 25; "@MMK_R_o" = 25; "@MMK_R_s" = 15; "@MMK_R_two" = -10; "@MMK_R_u" = 10; "@MMK_R_x" = 10; "@MMK_R_z" = 10; "@MMK_R_zero" = 40; }; "@MMK_L_j" = { "@MMK_R_A" = -40; "@MMK_R_AE" = -55; "@MMK_R_J" = -20; "@MMK_R_O" = -15; "@MMK_R_S" = -30; "@MMK_R_T" = -30; "@MMK_R_V" = -55; "@MMK_R_X" = -10; "@MMK_R_Z" = -15; "@MMK_R_a" = -10; "@MMK_R_ampersand" = -20; "@MMK_R_asterisk" = -10; "@MMK_R_at" = -15; "@MMK_R_colon" = -15; "@MMK_R_guillemotleft" = -25; "@MMK_R_guillemotright" = -10; "@MMK_R_o" = -15; "@MMK_R_p" = -15; "@MMK_R_paragraph" = -20; "@MMK_R_period" = -25; "@MMK_R_question" = -20; "@MMK_R_questiondown" = -50; "@MMK_R_quotedblleft" = -40; "@MMK_R_s" = -10; "@MMK_R_section" = -15; "@MMK_R_u" = -15; "@MMK_R_v" = -20; "@MMK_R_x" = -20; "@MMK_R_z" = -20; }; "@MMK_L_k" = { "@MMK_R_A" = -30; "@MMK_R_AE" = -45; "@MMK_R_H" = -30; "@MMK_R_J" = -30; "@MMK_R_S" = -25; "@MMK_R_T" = -40; "@MMK_R_U" = -35; "@MMK_R_V" = -95; "@MMK_R_X" = -30; "@MMK_R_Z" = -20; "@MMK_R_asterisk" = -30; "@MMK_R_backslash" = -30; "@MMK_R_braceleft" = -10; "@MMK_R_colon" = -20; "@MMK_R_guillemotright" = -10; "@MMK_R_hyphen" = 20; "@MMK_R_paragraph" = -40; "@MMK_R_question" = -10; "@MMK_R_questiondown" = 20; "@MMK_R_quotedblleft" = -20; "@MMK_R_slash" = 20; "@MMK_R_v" = -10; "@MMK_R_x" = -10; "@MMK_R_z" = -20; }; "@MMK_L_knBA" = { "@MMK_R_asterisk" = -55; "@MMK_R_knKA" = -5; "@MMK_R_period" = -20; "@MMK_R_question" = -30; "@MMK_R_quotedbl" = -70; "@MMK_R_quotedblleft" = -65; "@MMK_R_slash" = -45; }; "@MMK_L_knBI" = { "@MMK_R_period" = -25; "@MMK_R_quotedbl" = -50; "@MMK_R_quotedblleft" = -35; "@MMK_R_slash" = -35; }; "@MMK_L_knCA" = { "@MMK_R_exclam" = 5; "@MMK_R_hyphen" = -40; "@MMK_R_knGA" = -10; "@MMK_R_knKHA" = -25; "@MMK_R_knLA" = 10; "@MMK_R_knLLLA" = -10; "@MMK_R_knNNA" = -10; "@MMK_R_knvE" = -25; "@MMK_R_period" = -95; "@MMK_R_quotedblleft" = 5; "@MMK_R_slash" = -50; }; "@MMK_L_knDA" = { "@MMK_R_asterisk" = 5; "@MMK_R_colon" = -5; "@MMK_R_knRA" = -10; "@MMK_R_parenright" = 15; "@MMK_R_period" = -20; "@MMK_R_slash" = -45; }; "@MMK_L_knDAc2" = { "@MMK_R_braceright" = 180; "@MMK_R_bracketright" = 150; "@MMK_R_knBAc2.following" = 260; "@MMK_R_knDAc2.following" = 240; "@MMK_R_knKAc2.following" = 220; "@MMK_R_knLAc2.following" = 260; "@MMK_R_knLLLAc2.following" = 260; "@MMK_R_knPAc2.following" = 205; "@MMK_R_knTTHAc2.following" = 225; "@MMK_R_knmvR.following" = 260; "@MMK_R_parenright" = 170; "@MMK_R_slash" = 110; "@MMK_R_underscore" = 185; }; "@MMK_L_knDAc2.following" = { "@MMK_R_asterisk" = -284; "@MMK_R_colon" = -197; "@MMK_R_exclam" = -205; "@MMK_R_hyphen" = -115; "@MMK_R_knBA" = -260; "@MMK_R_knDA" = -260; "@MMK_R_knGA" = -260; "@MMK_R_knH" = -260; "@MMK_R_knI" = -260; "@MMK_R_knKA" = -310; "@MMK_R_knKHA" = -260; "@MMK_R_knLA" = -260; "@MMK_R_knLLA" = -260; "@MMK_R_knLLLA" = -260; "@MMK_R_knNA" = -260; "@MMK_R_knNNA" = -260; "@MMK_R_knPA" = -260; "@MMK_R_knPA.alt" = -260; "@MMK_R_knRA" = -260; "@MMK_R_knSHA" = -260; "@MMK_R_knTA" = -260; "@MMK_R_knYA" = -260; "@MMK_R_knvE" = -260; "@MMK_R_knvL" = -260; "@MMK_R_knvR" = -260; "@MMK_R_parenright" = -87; "@MMK_R_period" = -195; "@MMK_R_question" = -195; "@MMK_R_quotedbl" = -250; "@MMK_R_quotedblleft" = -185; "@MMK_R_slash" = -130; "@MMK_R_underscore" = -5; }; "@MMK_L_knDI" = { "@MMK_R_knDA" = 0; }; "@MMK_L_knGA" = { "@MMK_R_exclam" = 5; "@MMK_R_knH" = 5; "@MMK_R_knKA" = -10; "@MMK_R_knNA" = 5; "@MMK_R_knSHA" = 25; "@MMK_R_knTA" = 15; "@MMK_R_parenright" = 15; "@MMK_R_slash" = -15; }; "@MMK_L_knGHA" = { "@MMK_R_asterisk" = -30; "@MMK_R_colon" = 10; "@MMK_R_hyphen" = 20; "@MMK_R_knLA" = 35; "@MMK_R_knPA" = 5; "@MMK_R_knTA" = 15; "@MMK_R_knvE" = -15; "@MMK_R_parenright" = -30; "@MMK_R_period" = -150; "@MMK_R_question" = -20; "@MMK_R_quotedbl" = -30; "@MMK_R_quotedblleft" = -30; "@MMK_R_slash" = -70; "@MMK_R_underscore" = -180; }; "@MMK_L_knH" = { "@MMK_R_asterisk" = 10; "@MMK_R_knLA" = -5; "@MMK_R_knRA" = -5; "@MMK_R_knvL" = -5; "@MMK_R_parenright" = 15; "@MMK_R_period" = -30; "@MMK_R_question" = -10; "@MMK_R_slash" = -35; }; "@MMK_L_knJAc2" = { "@MMK_R_braceright" = 90; "@MMK_R_knBAc2.following" = 163; "@MMK_R_knDAc2.following" = 163; "@MMK_R_knKAc2.following" = 163; "@MMK_R_knLAc2.following" = 163; "@MMK_R_knLLLAc2.following" = 163; "@MMK_R_knPAc2.following" = 150; "@MMK_R_knTTHAc2.following" = 155; "@MMK_R_knmvR.following" = 163; "@MMK_R_period" = 100; "@MMK_R_slash" = 60; }; "@MMK_L_knJAc2.following" = { "@MMK_R_bracketright" = -30; "@MMK_R_exclam" = -120; "@MMK_R_hyphen" = -115; "@MMK_R_knBA" = -163; "@MMK_R_knDA" = -163; "@MMK_R_knGA" = -163; "@MMK_R_knH" = -163; "@MMK_R_knI" = -163; "@MMK_R_knKA" = -340; "@MMK_R_knKHA" = -163; "@MMK_R_knLA" = -163; "@MMK_R_knLLA" = -163; "@MMK_R_knLLLA" = -163; "@MMK_R_knNA" = -163; "@MMK_R_knNNA" = -163; "@MMK_R_knPA" = -163; "@MMK_R_knPA.alt" = -163; "@MMK_R_knRA" = -163; "@MMK_R_knSHA" = -163; "@MMK_R_knTA" = -163; "@MMK_R_knYA" = -163; "@MMK_R_knvE" = -163; "@MMK_R_knvL" = -163; "@MMK_R_knvR" = -163; "@MMK_R_question" = -195; "@MMK_R_quotedbl" = -240; "@MMK_R_quotedblleft" = -280; "@MMK_R_slash" = -85; }; "@MMK_L_knKA" = { "@MMK_R_asterisk" = 15; "@MMK_R_braceright" = 5; "@MMK_R_bracketright" = 5; "@MMK_R_exclam" = 15; "@MMK_R_hyphen" = -20; "@MMK_R_knKHA" = -10; "@MMK_R_knLA" = 25; "@MMK_R_knTA" = 15; "@MMK_R_knvE" = -15; "@MMK_R_parenright" = 15; "@MMK_R_period" = -105; "@MMK_R_question" = 10; "@MMK_R_quotedbl" = 25; "@MMK_R_quotedblleft" = 25; "@MMK_R_slash" = -35; "@MMK_R_underscore" = -50; }; "@MMK_L_knKAc2" = { "@MMK_R_braceright" = 300; "@MMK_R_bracketright" = 150; "@MMK_R_exclam" = 30; "@MMK_R_knBAc2.following" = 306; "@MMK_R_knDAc2.following" = 306; "@MMK_R_knKAc2.following" = 306; "@MMK_R_knKHA" = 50; "@MMK_R_knLAc2.following" = 306; "@MMK_R_knLLLAc2.following" = 306; "@MMK_R_knPAc2.following" = 306; "@MMK_R_knSHA" = 25; "@MMK_R_knTTHAc2.following" = 306; "@MMK_R_knmvR.following" = 306; "@MMK_R_knvR" = 15; "@MMK_R_parenright" = 125; "@MMK_R_period" = 95; "@MMK_R_slash" = 100; "@MMK_R_underscore" = 216; }; "@MMK_L_knKAc2.following" = { "@MMK_R_asterisk" = -348; "@MMK_R_bracketright" = -50; "@MMK_R_colon" = -215; "@MMK_R_exclam" = -245; "@MMK_R_hyphen" = -120; "@MMK_R_knBA" = -305; "@MMK_R_knDA" = -305; "@MMK_R_knGA" = -305; "@MMK_R_knH" = -305; "@MMK_R_knI" = -305; "@MMK_R_knKA" = -385; "@MMK_R_knKHA" = -250; "@MMK_R_knLA" = -305; "@MMK_R_knLLA" = -305; "@MMK_R_knLLLA" = -305; "@MMK_R_knNNA" = -305; "@MMK_R_knPA" = -305; "@MMK_R_knPA.alt" = -305; "@MMK_R_knRA" = -305; "@MMK_R_knSHA" = -305; "@MMK_R_knTA" = -305; "@MMK_R_knYA" = -305; "@MMK_R_knvE" = -305; "@MMK_R_knvL" = -305; "@MMK_R_knvR" = -305; "@MMK_R_parenright" = -182; "@MMK_R_period" = -170; "@MMK_R_question" = -260; "@MMK_R_quotedbl" = -250; "@MMK_R_quotedblleft" = -215; "@MMK_R_slash" = -210; }; "@MMK_L_knLA" = { "@MMK_R_knBA" = -5; "@MMK_R_knKHA" = -25; "@MMK_R_knTA" = 10; "@MMK_R_knvE" = -40; "@MMK_R_period" = -30; "@MMK_R_quotedbl" = -55; "@MMK_R_quotedblleft" = -55; "@MMK_R_slash" = -30; }; "@MMK_L_knLAc2" = { "@MMK_R_braceright" = 150; "@MMK_R_bracketright" = 175; "@MMK_R_exclam" = -15; "@MMK_R_knBAc2.following" = 173; "@MMK_R_knDAc2.following" = 173; "@MMK_R_knKAc2.following" = 173; "@MMK_R_knLAc2.following" = 173; "@MMK_R_knLLLAc2.following" = 173; "@MMK_R_knPAc2.following" = 125; "@MMK_R_knTTHAc2.following" = 173; "@MMK_R_knmvR.following" = 173; "@MMK_R_parenright" = 120; "@MMK_R_slash" = 130; "@MMK_R_underscore" = 155; }; "@MMK_L_knLAc2.following" = { "@MMK_R_asterisk" = -267; "@MMK_R_colon" = -148; "@MMK_R_exclam" = -175; "@MMK_R_hyphen" = -100; "@MMK_R_knBA" = -327; "@MMK_R_knDA" = -327; "@MMK_R_knGA" = -327; "@MMK_R_knH" = -327; "@MMK_R_knI" = -327; "@MMK_R_knKA" = -330; "@MMK_R_knKHA" = -327; "@MMK_R_knLA" = -327; "@MMK_R_knLLA" = -327; "@MMK_R_knLLLA" = -327; "@MMK_R_knNA" = -327; "@MMK_R_knNNA" = -327; "@MMK_R_knPA" = -327; "@MMK_R_knPA.alt" = -327; "@MMK_R_knRA" = -327; "@MMK_R_knSHA" = -327; "@MMK_R_knTA" = -327; "@MMK_R_knYA" = -327; "@MMK_R_knvE" = -327; "@MMK_R_knvL" = -327; "@MMK_R_knvR" = -327; "@MMK_R_parenright" = -55; "@MMK_R_period" = -145; "@MMK_R_question" = -200; "@MMK_R_quotedbl" = -270; "@MMK_R_quotedblleft" = -155; "@MMK_R_slash" = -70; "@MMK_R_underscore" = 15; }; "@MMK_L_knLLA" = { "@MMK_R_asterisk" = 10; "@MMK_R_hyphen" = -50; "@MMK_R_knKA" = -25; "@MMK_R_knPA.alt" = -65; "@MMK_R_knSHA" = -17; "@MMK_R_period" = -160; "@MMK_R_quotedbl" = 10; "@MMK_R_quotedblleft" = 5; "@MMK_R_slash" = -60; "@MMK_R_underscore" = -95; }; "@MMK_L_knLLLA" = { "@MMK_R_asterisk" = -25; "@MMK_R_knNA" = 10; "@MMK_R_knSHA" = 25; "@MMK_R_period" = -30; "@MMK_R_quotedbl" = -55; "@MMK_R_quotedblleft" = -35; "@MMK_R_slash" = -40; }; "@MMK_L_knLLLAc2" = { "@MMK_R_braceright" = 150; "@MMK_R_bracketright" = 170; "@MMK_R_colon" = 50; "@MMK_R_exclam" = 70; "@MMK_R_hyphen" = -22; "@MMK_R_knBA" = 40; "@MMK_R_knBAc2.following" = 195; "@MMK_R_knDAc2.following" = 195; "@MMK_R_knGA" = 55; "@MMK_R_knKAc2.following" = 195; "@MMK_R_knKHA" = 100; "@MMK_R_knLAc2.following" = 195; "@MMK_R_knLLLAc2.following" = 195; "@MMK_R_knNA" = 25; "@MMK_R_knNNA" = 35; "@MMK_R_knPA" = 45; "@MMK_R_knPA.alt" = 30; "@MMK_R_knPAc2.following" = 195; "@MMK_R_knSHA" = 50; "@MMK_R_knTA" = 35; "@MMK_R_knTTHAc2.following" = 195; "@MMK_R_knmvR.following" = 195; "@MMK_R_knvR" = 35; "@MMK_R_parenright" = 140; "@MMK_R_period" = 150; "@MMK_R_quotedbl" = -22; "@MMK_R_quotedblleft" = -22; "@MMK_R_slash" = 135; "@MMK_R_underscore" = 170; }; "@MMK_L_knLLLAc2.following" = { "@MMK_R_asterisk" = -271; "@MMK_R_colon" = -153; "@MMK_R_exclam" = -155; "@MMK_R_hyphen" = -105; "@MMK_R_knBA" = -207; "@MMK_R_knDA" = -207; "@MMK_R_knGA" = -207; "@MMK_R_knH" = -207; "@MMK_R_knI" = -207; "@MMK_R_knKA" = -250; "@MMK_R_knKHA" = -207; "@MMK_R_knLA" = -207; "@MMK_R_knLLA" = -207; "@MMK_R_knLLLA" = -207; "@MMK_R_knNA" = -207; "@MMK_R_knNNA" = -207; "@MMK_R_knPA" = -207; "@MMK_R_knPA.alt" = -207; "@MMK_R_knRA" = -207; "@MMK_R_knSHA" = -207; "@MMK_R_knTA" = -207; "@MMK_R_knYA" = -207; "@MMK_R_knvE" = -207; "@MMK_R_knvL" = -207; "@MMK_R_knvR" = -207; "@MMK_R_parenright" = -65; "@MMK_R_period" = -145; "@MMK_R_question" = -185; "@MMK_R_quotedbl" = -275; "@MMK_R_quotedblleft" = -175; "@MMK_R_slash" = -70; }; "@MMK_L_knLengthmark" = { "@MMK_R_hyphen" = -20; "@MMK_R_knKA" = -10; "@MMK_R_knLA" = 25; "@MMK_R_knPA.alt" = -20; "@MMK_R_knSHA" = -5; "@MMK_R_knTA" = -10; "@MMK_R_knvE" = -15; "@MMK_R_period" = -10; "@MMK_R_quotedbl" = 10; "@MMK_R_slash" = -30; }; "@MMK_L_knPA" = { "@MMK_R_asterisk" = 5; "@MMK_R_knJHAc2" = 10; "@MMK_R_knLA" = -10; "@MMK_R_knLLLAc2" = 10; "@MMK_R_parenright" = 10; "@MMK_R_period" = -25; "@MMK_R_slash" = -50; }; "@MMK_L_knPA.alt" = { "@MMK_R_knI" = -10; "@MMK_R_period" = -20; "@MMK_R_question" = -20; "@MMK_R_quotedbl" = -80; "@MMK_R_quotedblleft" = -100; "@MMK_R_slash" = -35; }; "@MMK_L_knPAc2" = { "@MMK_R_braceright" = 130; "@MMK_R_bracketright" = 140; "@MMK_R_exclam" = 35; "@MMK_R_knBA" = 20; "@MMK_R_knBAc2.following" = 135; "@MMK_R_knDAc2.following" = 135; "@MMK_R_knGA" = 25; "@MMK_R_knKAc2.following" = 115; "@MMK_R_knKHA" = 75; "@MMK_R_knLAc2.following" = 140; "@MMK_R_knLLLAc2.following" = 140; "@MMK_R_knNNA" = 20; "@MMK_R_knPA" = 30; "@MMK_R_knPA.alt" = 25; "@MMK_R_knPAc2.following" = 105; "@MMK_R_knSHA" = 50; "@MMK_R_knTTHAc2.following" = 135; "@MMK_R_knmvR.following" = 162; "@MMK_R_knvR" = 20; "@MMK_R_parenright" = 100; "@MMK_R_period" = 100; "@MMK_R_slash" = 100; "@MMK_R_underscore" = 165; }; "@MMK_L_knPAc2.following" = { "@MMK_R_asterisk" = -285; "@MMK_R_colon" = -120; "@MMK_R_exclam" = -75; "@MMK_R_hyphen" = -120; "@MMK_R_knBA" = -125; "@MMK_R_knDA" = -157; "@MMK_R_knGA" = -130; "@MMK_R_knH" = -135; "@MMK_R_knI" = -215; "@MMK_R_knKA" = -237; "@MMK_R_knKHA" = -100; "@MMK_R_knLA" = -157; "@MMK_R_knLLA" = -135; "@MMK_R_knLLLA" = -157; "@MMK_R_knNA" = -135; "@MMK_R_knNNA" = -135; "@MMK_R_knPA" = -135; "@MMK_R_knPA.alt" = -135; "@MMK_R_knRA" = -157; "@MMK_R_knSHA" = -125; "@MMK_R_knTA" = -135; "@MMK_R_knYA" = -150; "@MMK_R_knvE" = -135; "@MMK_R_knvL" = -220; "@MMK_R_knvR" = -115; "@MMK_R_parenright" = -50; "@MMK_R_period" = -30; "@MMK_R_question" = -160; "@MMK_R_quotedbl" = -290; "@MMK_R_quotedblleft" = -190; "@MMK_R_slash" = -50; "@MMK_R_underscore" = 25; }; "@MMK_L_knRA" = { "@MMK_R_parenright" = 15; "@MMK_R_period" = -35; "@MMK_R_slash" = -30; }; "@MMK_L_knRRE" = { "@MMK_R_hyphen" = -50; "@MMK_R_knGA" = -15; "@MMK_R_knKA" = -60; "@MMK_R_knLLA" = 25; "@MMK_R_knPA.alt" = -100; "@MMK_R_knSHA" = -10; "@MMK_R_knvE" = -55; "@MMK_R_knvL" = -10; "@MMK_R_period" = -121; "@MMK_R_quotedblleft" = 25; }; "@MMK_L_knSHA" = { "@MMK_R_asterisk" = 5; "@MMK_R_parenright" = 15; "@MMK_R_period" = -45; "@MMK_R_quotedbl" = -90; "@MMK_R_quotedblleft" = 10; "@MMK_R_slash" = -50; }; "@MMK_L_knTA" = { "@MMK_R_knKA" = -20; "@MMK_R_knLA" = -5; "@MMK_R_knNNA" = -5; "@MMK_R_knTA" = 15; "@MMK_R_parenright" = 15; "@MMK_R_period" = -20; "@MMK_R_slash" = -45; "@MMK_R_underscore" = -15; }; "@MMK_L_knVU" = { "@MMK_R_knBAc2" = 320; "@MMK_R_knDAc2" = 200; "@MMK_R_knJHAc2" = 320; "@MMK_R_knKAc2" = 100; "@MMK_R_knLAc2" = 350; "@MMK_R_knLLLAc2" = 325; "@MMK_R_knPAc2" = 125; "@MMK_R_question" = -20; }; "@MMK_L_knVirama" = { "@MMK_R_exclam" = 50; "@MMK_R_knBA" = -20; "@MMK_R_knH" = -5; "@MMK_R_knI" = 5; "@MMK_R_knKHA" = -30; "@MMK_R_knLA" = 7; "@MMK_R_knLLA" = 25; "@MMK_R_knLLLA" = -15; "@MMK_R_knNNA" = -15; "@MMK_R_knPA" = 10; "@MMK_R_knTA" = 20; "@MMK_R_knYA" = -10; "@MMK_R_knvE" = -55; "@MMK_R_parenright" = 25; "@MMK_R_period" = -130; "@MMK_R_question" = 35; "@MMK_R_quotedbl" = 40; "@MMK_R_quotedblleft" = 50; "@MMK_R_slash" = -30; }; "@MMK_L_knZero" = { "@MMK_R_numbersign" = -20; "@MMK_R_parenright" = -5; "@MMK_R_period" = -20; "@MMK_R_quotedbl" = -40; "@MMK_R_quotedblleft" = -20; "@MMK_R_slash" = -30; }; "@MMK_L_knmAA" = { "@MMK_R_period" = -30; "@MMK_R_quotedbl" = -55; "@MMK_R_quotedblleft" = -40; "@MMK_R_slash" = -60; }; "@MMK_L_knmAU" = { "@MMK_R_hyphen" = -10; "@MMK_R_knLA" = 15; "@MMK_R_knLLA" = 20; "@MMK_R_knPA.alt" = -50; "@MMK_R_knSHA" = -15; "@MMK_R_knTA" = 10; "@MMK_R_knvE" = -40; "@MMK_R_period" = -155; "@MMK_R_slash" = -55; }; "@MMK_L_knmU" = { "@MMK_R_asterisk" = -45; "@MMK_R_exclam" = -10; "@MMK_R_knKA" = -5; "@MMK_R_knvL" = -15; "@MMK_R_period" = -25; "@MMK_R_question" = -30; "@MMK_R_quotedbl" = -55; "@MMK_R_quotedblleft" = -55; "@MMK_R_slash" = -40; "@MMK_R_underscore" = -40; }; "@MMK_L_knmUU" = { "@MMK_R_asterisk" = -55; "@MMK_R_period" = -20; "@MMK_R_question" = -45; "@MMK_R_quotedbl" = -65; "@MMK_R_quotedblleft" = -60; "@MMK_R_slash" = -55; }; "@MMK_L_knvE" = { "@MMK_R_period" = -30; "@MMK_R_question" = -25; "@MMK_R_quotedbl" = -70; "@MMK_R_quotedblleft" = -70; "@MMK_R_slash" = -40; }; "@MMK_L_knvO" = { "@MMK_R_asterisk" = -55; "@MMK_R_colon" = -5; "@MMK_R_knvL" = -15; "@MMK_R_period" = -20; "@MMK_R_question" = -20; "@MMK_R_quotedbl" = -50; "@MMK_R_quotedblleft" = -80; "@MMK_R_slash" = -50; }; "@MMK_L_l" = { "@MMK_R_A" = -40; "@MMK_R_AE" = -55; "@MMK_R_J" = -20; "@MMK_R_O" = -10; "@MMK_R_S" = -25; "@MMK_R_T" = -35; "@MMK_R_U" = -15; "@MMK_R_V" = -60; "@MMK_R_X" = -25; "@MMK_R_Z" = -15; "@MMK_R_asterisk" = -15; "@MMK_R_backslash" = -30; "@MMK_R_n" = -10; "@MMK_R_o" = -15; "@MMK_R_p" = -15; "@MMK_R_paragraph" = -25; "@MMK_R_period" = -10; "@MMK_R_question" = -40; "@MMK_R_quotedblleft" = -20; "@MMK_R_s" = -15; "@MMK_R_section" = -10; "@MMK_R_t" = -10; "@MMK_R_v" = -20; "@MMK_R_x" = -25; "@MMK_R_z" = -30; }; "@MMK_L_n" = { "@MMK_R_A" = -20; "@MMK_R_AE" = -40; "@MMK_R_H" = -35; "@MMK_R_J" = -15; "@MMK_R_S" = -15; "@MMK_R_T" = -55; "@MMK_R_U" = -50; "@MMK_R_V" = -100; "@MMK_R_X" = -65; "@MMK_R_Z" = -15; "@MMK_R_asterisk" = -55; "@MMK_R_b" = -10; "@MMK_R_backslash" = -60; "@MMK_R_guillemotright" = 20; "@MMK_R_h" = -15; "@MMK_R_o" = -10; "@MMK_R_p" = -10; "@MMK_R_paragraph" = -20; "@MMK_R_period" = 25; "@MMK_R_question" = -20; "@MMK_R_quotedblleft" = -70; "@MMK_R_slash" = 40; "@MMK_R_v" = -50; "@MMK_R_x" = -50; "@MMK_R_z" = -15; }; "@MMK_L_numbersign" = { "@MMK_R_knBA" = -5; "@MMK_R_knLLA" = 25; "@MMK_R_knvE" = -35; "@MMK_R_seven" = 20; }; "@MMK_L_o" = { "@MMK_R_A" = -15; "@MMK_R_AE" = -25; "@MMK_R_H" = -20; "@MMK_R_S" = -15; "@MMK_R_T" = -40; "@MMK_R_U" = -30; "@MMK_R_V" = -55; "@MMK_R_X" = -10; "@MMK_R_Z" = -20; "@MMK_R_asterisk" = -20; "@MMK_R_b" = -10; "@MMK_R_backslash" = -30; "@MMK_R_colon" = -10; "@MMK_R_guillemotleft" = 20; "@MMK_R_guillemotright" = 15; "@MMK_R_hyphen" = 25; "@MMK_R_parenright" = -10; "@MMK_R_period" = -15; "@MMK_R_question" = -10; "@MMK_R_quotedblleft" = -30; "@MMK_R_underscore" = -40; "@MMK_R_x" = -10; "@MMK_R_z" = -15; }; "@MMK_L_one" = { "@MMK_R_colon" = -10; "@MMK_R_currency" = -10; "@MMK_R_percent" = -10; "@MMK_R_quotedblleft" = -35; "@MMK_R_seven" = -10; "@MMK_R_yen" = -10; }; "@MMK_L_one.numr" = { "@MMK_R_five" = 10; "@MMK_R_four" = 40; "@MMK_R_fraction" = 30; "@MMK_R_three" = 25; "@MMK_R_two" = 25; "@MMK_R_zero" = 10; }; "@MMK_L_paragraph" = { "@MMK_R_two" = 10; "@MMK_R_z" = -15; }; "@MMK_L_parenleft" = { "@MMK_R_J" = -20; "@MMK_R_O" = -10; "@MMK_R_U" = 20; "@MMK_R_V" = -10; "@MMK_R_X" = 20; "@MMK_R_b" = 30; "@MMK_R_four" = -10; "@MMK_R_knLA" = -15; "@MMK_R_knLLA" = -10; "@MMK_R_knPA.alt" = -20; "@MMK_R_knTA" = -10; "@MMK_R_knZero" = -5; "@MMK_R_knvE" = -7; "@MMK_R_n" = 10; "@MMK_R_o" = -10; "@MMK_R_v" = -10; "@MMK_R_zero" = -15; }; "@MMK_L_percent" = { "@MMK_R_seven" = -10; }; "@MMK_L_period" = { "@MMK_R_A" = 40; "@MMK_R_AE" = 40; "@MMK_R_J" = 20; "@MMK_R_O" = -30; "@MMK_R_S" = -10; "@MMK_R_T" = -65; "@MMK_R_U" = -30; "@MMK_R_V" = -75; "@MMK_R_X" = 10; "@MMK_R_Z" = -10; "@MMK_R_a" = -35; "@MMK_R_b" = -50; "@MMK_R_eight" = -20; "@MMK_R_knDA" = -20; "@MMK_R_knH" = -30; "@MMK_R_knKA" = -105; "@MMK_R_knKHA" = 15; "@MMK_R_knLA" = -35; "@MMK_R_knLLA" = -115; "@MMK_R_knLLLA" = -30; "@MMK_R_knNA" = -15; "@MMK_R_knPA" = -10; "@MMK_R_knRA" = -35; "@MMK_R_knSHA" = 10; "@MMK_R_knYA" = -30; "@MMK_R_knZero" = -20; "@MMK_R_knvL" = -50; "@MMK_R_nine" = -15; "@MMK_R_o" = -15; "@MMK_R_quotedblleft" = -40; "@MMK_R_seven" = -40; "@MMK_R_two" = 20; "@MMK_R_u" = -45; "@MMK_R_v" = -65; "@MMK_R_z" = -30; "@MMK_R_zero" = -35; }; "@MMK_L_q" = { "@MMK_R_A" = -45; "@MMK_R_AE" = -55; "@MMK_R_J" = -25; "@MMK_R_O" = -15; "@MMK_R_S" = -20; "@MMK_R_T" = -40; "@MMK_R_V" = -85; "@MMK_R_X" = -40; "@MMK_R_Z" = -25; "@MMK_R_asterisk" = -10; "@MMK_R_b" = -10; "@MMK_R_braceleft" = 20; "@MMK_R_guillemotright" = 10; "@MMK_R_h" = -10; "@MMK_R_paragraph" = -10; "@MMK_R_parenright" = 20; "@MMK_R_period" = -10; "@MMK_R_question" = 10; "@MMK_R_quotedblleft" = -30; "@MMK_R_s" = -10; "@MMK_R_slash" = 20; "@MMK_R_u" = -10; "@MMK_R_underscore" = 50; "@MMK_R_v" = -15; "@MMK_R_z" = -15; }; "@MMK_L_question" = { "@MMK_R_A" = -40; "@MMK_R_AE" = -60; "@MMK_R_J" = -20; "@MMK_R_a" = -10; "@MMK_R_b" = 10; "@MMK_R_o" = -10; "@MMK_R_seven" = 20; "@MMK_R_three" = 10; "@MMK_R_u" = 30; "@MMK_R_v" = 20; }; "@MMK_L_questiondown" = { "@MMK_R_A" = 30; "@MMK_R_AE" = 20; "@MMK_R_J" = -10; "@MMK_R_O" = -10; "@MMK_R_S" = -10; "@MMK_R_T" = -30; "@MMK_R_V" = -40; "@MMK_R_X" = 15; "@MMK_R_Z" = -10; "@MMK_R_a" = -15; "@MMK_R_o" = -15; "@MMK_R_s" = -10; "@MMK_R_z" = -15; }; "@MMK_L_quotedbl" = { "@MMK_R_knBA" = -70; "@MMK_R_knDA" = -25; "@MMK_R_knGA" = -15; "@MMK_R_knH" = -5; "@MMK_R_knKA" = -15; "@MMK_R_knKHA" = -110; "@MMK_R_knLA" = -45; "@MMK_R_knLLLA" = -60; "@MMK_R_knNNA" = -40; "@MMK_R_knPA.alt" = -170; "@MMK_R_knRA" = -25; "@MMK_R_knSHA" = -20; "@MMK_R_knYA" = -60; "@MMK_R_knZero" = -40; "@MMK_R_knvE" = -105; "@MMK_R_knvL" = -35; "@MMK_R_knvR" = -25; }; "@MMK_L_quotedblleft" = { "@MMK_R_A" = -135; "@MMK_R_AE" = -150; "@MMK_R_J" = -60; "@MMK_R_O" = -30; "@MMK_R_S" = -20; "@MMK_R_U" = 35; "@MMK_R_V" = 10; "@MMK_R_X" = 10; "@MMK_R_Z" = -20; "@MMK_R_a" = -15; "@MMK_R_b" = 110; "@MMK_R_eight" = -15; "@MMK_R_four" = -25; "@MMK_R_knBA" = -50; "@MMK_R_knGA" = -10; "@MMK_R_knKHA" = -80; "@MMK_R_knLA" = -45; "@MMK_R_knLLA" = -10; "@MMK_R_knLLLA" = -20; "@MMK_R_knNNA" = -35; "@MMK_R_knPA.alt" = -80; "@MMK_R_knRA" = -7; "@MMK_R_knTA" = 10; "@MMK_R_knYA" = -55; "@MMK_R_knZero" = -20; "@MMK_R_knvE" = -80; "@MMK_R_knvL" = -35; "@MMK_R_knvR" = -15; "@MMK_R_o" = -30; "@MMK_R_period" = -40; "@MMK_R_s" = -20; "@MMK_R_seven" = 15; "@MMK_R_three" = -10; "@MMK_R_u" = 40; "@MMK_R_v" = 50; "@MMK_R_x" = 10; "@MMK_R_zero" = -30; }; "@MMK_L_r" = { "@MMK_R_A" = -45; "@MMK_R_AE" = -60; "@MMK_R_H" = -10; "@MMK_R_J" = -35; "@MMK_R_S" = -15; "@MMK_R_T" = -15; "@MMK_R_U" = -15; "@MMK_R_V" = -35; "@MMK_R_X" = -25; "@MMK_R_Z" = -10; "@MMK_R_ampersand" = -15; "@MMK_R_backslash" = -10; "@MMK_R_guillemotright" = -10; "@MMK_R_o" = -30; "@MMK_R_parenright" = -20; "@MMK_R_period" = -35; "@MMK_R_x" = -10; "@MMK_R_z" = -15; }; "@MMK_L_s" = { "@MMK_R_A" = -25; "@MMK_R_AE" = -40; "@MMK_R_H" = -25; "@MMK_R_J" = -15; "@MMK_R_S" = -10; "@MMK_R_T" = -35; "@MMK_R_U" = -45; "@MMK_R_V" = -65; "@MMK_R_X" = -30; "@MMK_R_Z" = -35; "@MMK_R_ampersand" = -10; "@MMK_R_b" = -10; "@MMK_R_backslash" = -20; "@MMK_R_hyphen" = 10; "@MMK_R_parenright" = -10; "@MMK_R_questiondown" = 10; "@MMK_R_v" = -10; "@MMK_R_x" = -15; "@MMK_R_z" = -15; }; "@MMK_L_section" = { "@MMK_R_A" = -10; "@MMK_R_AE" = -15; "@MMK_R_T" = -30; "@MMK_R_U" = -30; "@MMK_R_V" = -40; "@MMK_R_a" = -10; "@MMK_R_v" = -15; "@MMK_R_z" = -10; }; "@MMK_L_seven" = { "@MMK_R_ampersand" = -30; "@MMK_R_asterisk" = 40; "@MMK_R_at" = -20; "@MMK_R_backslash" = 25; "@MMK_R_colon" = -15; "@MMK_R_dollar" = -20; "@MMK_R_eight" = -20; "@MMK_R_four" = -25; "@MMK_R_guillemotleft" = -10; "@MMK_R_hyphen" = -15; "@MMK_R_o" = -20; "@MMK_R_one" = -10; "@MMK_R_one.numr" = 10; "@MMK_R_paragraph" = 15; "@MMK_R_parenright" = -15; "@MMK_R_period" = -75; "@MMK_R_questiondown" = -30; "@MMK_R_quotedblleft" = 40; "@MMK_R_section" = -10; "@MMK_R_slash" = -20; "@MMK_R_sterling" = -20; "@MMK_R_three.numr" = 10; "@MMK_R_two" = -15; "@MMK_R_underscore" = -40; "@MMK_R_yen" = 40; "@MMK_R_zero" = -10; }; "@MMK_L_six" = { "@MMK_R_ampersand" = 20; "@MMK_R_eight" = -10; "@MMK_R_exclam" = 20; "@MMK_R_hyphen" = 25; "@MMK_R_nine" = -15; "@MMK_R_period" = -15; "@MMK_R_questiondown" = 20; "@MMK_R_quotedblleft" = -10; "@MMK_R_three" = -10; "@MMK_R_two" = -10; }; "@MMK_L_slash" = { "@MMK_R_A" = -70; "@MMK_R_AE" = -85; "@MMK_R_U" = 50; "@MMK_R_V" = 60; "@MMK_R_a" = -40; "@MMK_R_four" = -20; "@MMK_R_knBA" = -60; "@MMK_R_knDA" = -55; "@MMK_R_knGA" = -30; "@MMK_R_knH" = -70; "@MMK_R_knKA" = -30; "@MMK_R_knKHA" = -85; "@MMK_R_knLA" = -60; "@MMK_R_knLLA" = -10; "@MMK_R_knLLLA" = -70; "@MMK_R_knNA" = -55; "@MMK_R_knNNA" = -80; "@MMK_R_knPA" = -50; "@MMK_R_knPA.alt" = -100; "@MMK_R_knRA" = -50; "@MMK_R_knSHA" = -35; "@MMK_R_knTA" = -50; "@MMK_R_knYA" = -100; "@MMK_R_knZero" = -65; "@MMK_R_knvE" = -110; "@MMK_R_knvL" = -60; "@MMK_R_knvR" = -75; "@MMK_R_seven" = 10; "@MMK_R_slash" = -150; "@MMK_R_v" = 15; }; "@MMK_L_sterling" = { "@MMK_R_eight" = -10; "@MMK_R_seven" = 10; "@MMK_R_zero" = -10; }; "@MMK_L_t" = { "@MMK_R_A" = -30; "@MMK_R_AE" = -40; "@MMK_R_H" = -20; "@MMK_R_O" = -15; "@MMK_R_S" = -10; "@MMK_R_T" = -45; "@MMK_R_U" = -20; "@MMK_R_V" = -40; "@MMK_R_X" = -20; "@MMK_R_Z" = -20; "@MMK_R_a" = -10; "@MMK_R_asterisk" = -20; "@MMK_R_backslash" = -20; "@MMK_R_braceleft" = -10; "@MMK_R_guillemotleft" = -15; "@MMK_R_hyphen" = -10; "@MMK_R_o" = -10; "@MMK_R_p" = -10; "@MMK_R_paragraph" = -20; "@MMK_R_parenright" = -10; "@MMK_R_period" = -20; "@MMK_R_quotedblleft" = -30; "@MMK_R_section" = -20; "@MMK_R_v" = -20; "@MMK_R_x" = -15; "@MMK_R_z" = -10; }; "@MMK_L_two" = { "@MMK_R_ampersand" = -10; "@MMK_R_asterisk" = -10; "@MMK_R_dollar" = -20; "@MMK_R_eight" = -20; "@MMK_R_guillemotleft" = 20; "@MMK_R_hyphen" = 20; "@MMK_R_nine" = -25; "@MMK_R_o" = -10; "@MMK_R_parenright" = -10; "@MMK_R_question" = -15; "@MMK_R_quotedblleft" = -10; "@MMK_R_sterling" = -20; "@MMK_R_three" = -15; "@MMK_R_two" = -10; "@MMK_R_zero" = -10; }; "@MMK_L_u" = { "@MMK_R_A" = -40; "@MMK_R_AE" = -55; "@MMK_R_J" = -20; "@MMK_R_O" = -10; "@MMK_R_S" = -25; "@MMK_R_T" = -55; "@MMK_R_U" = -15; "@MMK_R_V" = -90; "@MMK_R_X" = -25; "@MMK_R_Z" = -25; "@MMK_R_asterisk" = -25; "@MMK_R_b" = -15; "@MMK_R_backslash" = -50; "@MMK_R_n" = -10; "@MMK_R_o" = -15; "@MMK_R_p" = -15; "@MMK_R_paragraph" = -25; "@MMK_R_period" = -25; "@MMK_R_quotedblleft" = -40; "@MMK_R_s" = -15; "@MMK_R_section" = -10; "@MMK_R_t" = -10; "@MMK_R_v" = -20; "@MMK_R_x" = -25; "@MMK_R_z" = -30; }; "@MMK_L_underscore" = { "@MMK_R_U" = -75; "@MMK_R_V" = -80; "@MMK_R_a" = -20; "@MMK_R_four" = -40; "@MMK_R_knKA" = -50; "@MMK_R_knLLA" = -40; "@MMK_R_knvL" = -75; "@MMK_R_o" = -40; "@MMK_R_seven" = -40; "@MMK_R_two" = 20; "@MMK_R_u" = -60; }; "@MMK_L_v" = { "@MMK_R_A" = -55; "@MMK_R_AE" = -70; "@MMK_R_J" = -15; "@MMK_R_O" = 15; "@MMK_R_U" = -10; "@MMK_R_V" = -20; "@MMK_R_X" = -25; "@MMK_R_ampersand" = -10; "@MMK_R_asterisk" = 30; "@MMK_R_backslash" = 15; "@MMK_R_guillemotright" = 20; "@MMK_R_h" = -10; "@MMK_R_p" = -15; "@MMK_R_paragraph" = 50; "@MMK_R_parenright" = -10; "@MMK_R_period" = -55; "@MMK_R_questiondown" = -10; "@MMK_R_quotedblleft" = 50; "@MMK_R_v" = -10; "@MMK_R_z" = 10; }; "@MMK_L_x" = { "@MMK_R_A" = -35; "@MMK_R_AE" = -50; "@MMK_R_H" = -10; "@MMK_R_J" = -15; "@MMK_R_T" = -15; "@MMK_R_U" = -25; "@MMK_R_V" = -35; "@MMK_R_asterisk" = 50; "@MMK_R_at" = 10; "@MMK_R_hyphen" = 10; "@MMK_R_p" = 10; "@MMK_R_paragraph" = 10; "@MMK_R_questiondown" = 15; "@MMK_R_quotedblleft" = 30; "@MMK_R_t" = -10; "@MMK_R_v" = -20; "@MMK_R_x" = -10; }; "@MMK_L_yen" = { "@MMK_R_seven" = 20; }; "@MMK_L_z" = { "@MMK_R_A" = -30; "@MMK_R_AE" = -40; "@MMK_R_H" = -20; "@MMK_R_J" = -10; "@MMK_R_S" = -10; "@MMK_R_T" = -35; "@MMK_R_U" = -25; "@MMK_R_V" = -80; "@MMK_R_X" = -30; "@MMK_R_Z" = -40; "@MMK_R_ampersand" = 10; "@MMK_R_b" = -10; "@MMK_R_backslash" = -30; "@MMK_R_braceleft" = -15; "@MMK_R_guillemotleft" = 10; "@MMK_R_hyphen" = 25; "@MMK_R_paragraph" = -10; "@MMK_R_s" = -15; "@MMK_R_v" = -15; "@MMK_R_x" = -10; "@MMK_R_z" = -10; }; "@MMK_L_zero" = { "@MMK_R_ampersand" = 15; "@MMK_R_eight" = -10; "@MMK_R_hyphen" = 40; "@MMK_R_parenright" = -15; "@MMK_R_period" = -35; "@MMK_R_quotedblleft" = -30; "@MMK_R_seven" = -10; "@MMK_R_three.numr" = -10; "@MMK_R_two" = -10; }; }; }; manufacturer = "Dunwich Type Founders"; manufacturerURL = "http://www.dunwichtype.com"; unitsPerEm = 1000; userData = { GSDimensionPlugin.Dimensions = { "034236B8-3FA8-43DA-9EDA-EFF269A687EC" = { HV = " "; }; }; }; versionMajor = 1; versionMinor = 402; } googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/000077500000000000000000000000001470572777600245255ustar00rootroot00000000000000Designspace-MastersAsInstances.designspace000066400000000000000000000021571470572777600346570ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/DesignspaceTest.designspace000066400000000000000000000017271470572777600320300ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Bold.ufo/000077500000000000000000000000001470572777600274075ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Bold.ufo/fontinfo.plist000066400000000000000000000015661470572777600323160ustar00rootroot00000000000000 ascender 0 capHeight 0 descender 0 familyName MyFont guidelines postscriptBlueValues postscriptFamilyBlues postscriptFamilyOtherBlues postscriptOtherBlues postscriptStemSnapH postscriptStemSnapV styleName Bold unitsPerEm 1000 xHeight 0 googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Bold.ufo/glyphs/000077500000000000000000000000001470572777600307155ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Bold.ufo/glyphs/asas.glif000066400000000000000000000006511470572777600325110ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Bold.ufo/glyphs/contents.plist000066400000000000000000000004401470572777600336250ustar00rootroot00000000000000 asas asas.glif l l.glif googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Bold.ufo/glyphs/l.glif000066400000000000000000000005311470572777600320120ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Bold.ufo/layercontents.plist000066400000000000000000000004371470572777600333620ustar00rootroot00000000000000 public.default glyphs googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Bold.ufo/lib.plist000066400000000000000000000004571470572777600312400ustar00rootroot00000000000000 public.glyphOrder l asas googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Bold.ufo/metainfo.plist000066400000000000000000000004761470572777600322750ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Light.ufo/000077500000000000000000000000001470572777600275765ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Light.ufo/fontinfo.plist000066400000000000000000000015671470572777600325060ustar00rootroot00000000000000 ascender 0 capHeight 0 descender 0 familyName MyFont guidelines postscriptBlueValues postscriptFamilyBlues postscriptFamilyOtherBlues postscriptOtherBlues postscriptStemSnapH postscriptStemSnapV styleName Light unitsPerEm 1000 xHeight 0 googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Light.ufo/glyphs/000077500000000000000000000000001470572777600311045ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Light.ufo/glyphs/asas.glif000066400000000000000000000007371470572777600327050ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Light.ufo/glyphs/contents.plist000066400000000000000000000004401470572777600340140ustar00rootroot00000000000000 asas asas.glif l l.glif googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Light.ufo/glyphs/l.glif000066400000000000000000000005271470572777600322060ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Light.ufo/layercontents.plist000066400000000000000000000004371470572777600335510ustar00rootroot00000000000000 public.default glyphs googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Light.ufo/lib.plist000066400000000000000000000004571470572777600314270ustar00rootroot00000000000000 public.glyphOrder l asas googlefonts-fontmake-7ed5123/tests/data/DesignspaceBrokenTest/MyFont-Light.ufo/metainfo.plist000066400000000000000000000004761470572777600324640ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/000077500000000000000000000000001470572777600243505ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont.designspace000066400000000000000000000037631470572777600300040ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Black.ufo/000077500000000000000000000000001470572777600274505ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Black.ufo/fontinfo.plist000066400000000000000000000015671470572777600323600ustar00rootroot00000000000000 ascender 0 capHeight 0 descender 0 familyName MyFont guidelines postscriptBlueValues postscriptFamilyBlues postscriptFamilyOtherBlues postscriptOtherBlues postscriptStemSnapH postscriptStemSnapV styleName Black unitsPerEm 1000 xHeight 0 googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Black.ufo/glyphs/000077500000000000000000000000001470572777600307565ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Black.ufo/glyphs/Q_.alt.glif000066400000000000000000000026571470572777600327510ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Black.ufo/glyphs/Q_.glif000066400000000000000000000031731470572777600321640ustar00rootroot00000000000000 Q_.ss01.alt.glif000066400000000000000000000023611470572777600334470ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Black.ufo/glyphs googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Black.ufo/glyphs/Q_.ss01.glif000066400000000000000000000023551470572777600327520ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Black.ufo/glyphs/contents.plist000066400000000000000000000006341470572777600336730ustar00rootroot00000000000000 Q Q_.glif Q.alt Q_.alt.glif Q.ss01 Q_.ss01.glif Q.ss01.alt Q_.ss01.alt.glif googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Black.ufo/layercontents.plist000066400000000000000000000004231470572777600334160ustar00rootroot00000000000000 public.default glyphs googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Black.ufo/lib.plist000066400000000000000000000005501470572777600312730ustar00rootroot00000000000000 public.glyphOrder Q Q.alt Q.ss01 Q.ss01.alt googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Black.ufo/metainfo.plist000066400000000000000000000004641470572777600323330ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Hair.ufo/000077500000000000000000000000001470572777600273175ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Hair.ufo/fontinfo.plist000066400000000000000000000015721470572777600322230ustar00rootroot00000000000000 ascender 0 capHeight 0 descender 0 familyName MyFont guidelines postscriptBlueValues postscriptFamilyBlues postscriptFamilyOtherBlues postscriptOtherBlues postscriptStemSnapH postscriptStemSnapV styleName Hairline unitsPerEm 1000 xHeight 0 googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Hair.ufo/glyphs/000077500000000000000000000000001470572777600306255ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Hair.ufo/glyphs/Q_.alt.glif000066400000000000000000000026371470572777600326160ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Hair.ufo/glyphs/Q_.glif000066400000000000000000000031521470572777600320300ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Hair.ufo/glyphs/Q_.ss01.alt.glif000066400000000000000000000023571470572777600334020ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Hair.ufo/glyphs/Q_.ss01.glif000066400000000000000000000023571470572777600326230ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Hair.ufo/glyphs/contents.plist000066400000000000000000000006341470572777600335420ustar00rootroot00000000000000 Q Q_.glif Q.alt Q_.alt.glif Q.ss01 Q_.ss01.glif Q.ss01.alt Q_.ss01.alt.glif googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Hair.ufo/layercontents.plist000066400000000000000000000004231470572777600332650ustar00rootroot00000000000000 public.default glyphs googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Hair.ufo/lib.plist000066400000000000000000000005501470572777600311420ustar00rootroot00000000000000 public.glyphOrder Q Q.alt Q.ss01 Q.ss01.alt googlefonts-fontmake-7ed5123/tests/data/DesignspaceRuleOrder/MyFont_Hair.ufo/metainfo.plist000066400000000000000000000004641470572777600322020ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/000077500000000000000000000000001470572777600233645ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/DesignspaceTest-bare.designspace000066400000000000000000000013511470572777600315670ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/DesignspaceTest-instance-attrs.designspace000066400000000000000000000015241470572777600336170ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/DesignspaceTest-lib.designspace000066400000000000000000000024741470572777600314330ustar00rootroot00000000000000 blorb hurx public.skipExportGlyphs x y z public.skipExportGlyphs a b c googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/DesignspaceTest-opsz.designspace000066400000000000000000000011551470572777600316530ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/DesignspaceTest-slnt.designspace000066400000000000000000000011461470572777600316400ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/DesignspaceTest-wght-wdth.designspace000066400000000000000000000016241470572777600325760ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/DesignspaceTest.designspace000066400000000000000000000017271470572777600306670ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/MyFont-Bold.ufo/000077500000000000000000000000001470572777600262465ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/MyFont-Bold.ufo/fontinfo.plist000066400000000000000000000010441470572777600311440ustar00rootroot00000000000000 ascender 0 capHeight 0 descender 0 familyName MyFont styleName Bold unitsPerEm 1000 xHeight 0 googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/MyFont-Bold.ufo/glyphs/000077500000000000000000000000001470572777600275545ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/MyFont-Bold.ufo/glyphs/contents.plist000066400000000000000000000003551470572777600324710ustar00rootroot00000000000000 l l.glif googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/MyFont-Bold.ufo/glyphs/l.glif000066400000000000000000000005311470572777600306510ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/MyFont-Bold.ufo/layercontents.plist000066400000000000000000000004371470572777600322210ustar00rootroot00000000000000 public.default glyphs googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/MyFont-Bold.ufo/metainfo.plist000066400000000000000000000004761470572777600311340ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/MyFont-Bold.ufoz000066400000000000000000000043151470572777600263660ustar00rootroot00000000000000PKTMyFont-Bold.ufo/PKTU8MyFont-Bold.ufo/fontinfo.plist1O0w$ɒ)tCMETT %GjؖmHKAE {zCߑԆK1gqd\pWp^_ћiU9Q7eY WCHYl+ۀ{k0 qF~@Bm-3PZxc74(j npaE&Nij y{ލۺ_ڥ>k)3v/l);6 nM:'ΒdQP8OWPKTMyFont-Bold.ufo/glyphs/PKTr0%MyFont-Bold.ufo/glyphs/contents.plist=NA0NtfL(`BBD8x4P@mA=ݻm'z^M!rd];;o>c$%E!qqJI$qtI '䡵 }OoVEQCl\c.3 s4+DGddhƏtk{RNdįͶPKT$חײfMyFont-Bold.ufo/glyphs/l.glifPK0ݛxI7AY0z*4)S5Ƹ̛GdCm8f#И`)J\ҎMj-epsmd[F$PE00r i ӛpusum8ipd\+oog'4%4ʞPKT # )#MyFont-Bold.ufo/layercontents.plisteNM @i/ܩ[VTRBvh겻fVy xp;:vqd}Ý;uဍ&["o+)GB nHj!uM6E2oUJL2$k2~jޅ"ioQ% ÷FfwaǢPKTB2MHMyFont-Bold.ufo/metainfo.plistUN0DH%xA\rSASJD"E&Njx-{Kc7mvwv8OFHnu”iզ_$)K兼_V{fvОX},6+SkW9+kB3'4:Dc4z(ZX4 ascender 0 capHeight 0 descender 0 familyName MyFont styleName Light unitsPerEm 1000 xHeight 0 openTypeOS2Panose 2 11 5 4 2 2 2 2 2 4 googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/MyFont-Light.ufo/glyphs/000077500000000000000000000000001470572777600277435ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/MyFont-Light.ufo/glyphs/contents.plist000066400000000000000000000003551470572777600326600ustar00rootroot00000000000000 l l.glif googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/MyFont-Light.ufo/glyphs/l.glif000066400000000000000000000005271470572777600310450ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/MyFont-Light.ufo/groups.plist000066400000000000000000000005451470572777600310350ustar00rootroot00000000000000 nonkerning_group A public.kern2.asdf A googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/MyFont-Light.ufo/layercontents.plist000066400000000000000000000004371470572777600324100ustar00rootroot00000000000000 public.default glyphs googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/MyFont-Light.ufo/lib.plist000066400000000000000000000003601470572777600302570ustar00rootroot00000000000000 blorb asasa googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/MyFont-Light.ufo/metainfo.plist000066400000000000000000000004761470572777600313230ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/DesignspaceTest/MyFont-Light.ufoz000066400000000000000000000057611470572777600265630ustar00rootroot00000000000000PKTMyFont-Light.ufo/PKTp/4MyFont-Light.ufo/fontinfo.plistRj0/>JQc$%E!qqJI$qtI '䡵 }OoVEQCl\c.3 s4+DGddhƏtk{RNdįͶPKT#jqTdMyFont-Light.ufo/glyphs/l.glifPK0ݛxlX)DФ'4PI,6f2oޛ7 ^wmID5@Qn Mje傗fl* Y+fZ:[$E/)WЅnH{;2ބѤ0l 7(G76~M oiqxϞPKTu4ZGsMyFont-Light.ufo/groups.plistn0ESoL%TBH P X۲ `wg|||͆m {ajj4j5Hfw 'rC9*c )ȘV Ue1 H'?{u#Ej#?A {N;V`\6O!o1SZmU|e0 +P[[~t.1<+n5E+v|7NPKT # )$MyFont-Light.ufo/layercontents.plisteNM @i/ܩ[VTRBvh겻fVy xp;:vqd}Ý;uဍ&["o+)GB nHj!uM6E2oUJL2$k2~jޅ"ioQ% ÷FfwaǢPKTwʺMyFont-Light.ufo/lib.plist=N0k/`fLŨ`BBD8x(h6"o j2;;3;tnx1jmtu%u䮝?Ep9$JCE 0 k &1< {/**L$L!6a1x3 s4R'ᲠhUZ~Pɋ_3EoPKTB2MHMyFont-Light.ufo/metainfo.plistUN0DH%xA\rSASJD"E&Njx-{Kc7mvwv8OFHnu”iզ_$)K兼_V{fvОX},6+SkW9+kB3'4:Dc4z(ZX4 ascender 0 capHeight 0 descender 0 familyName Designspace Test guidelines postscriptBlueValues postscriptFamilyBlues postscriptFamilyOtherBlues postscriptOtherBlues postscriptStemSnapH postscriptStemSnapV styleName Light unitsPerEm 1000 xHeight 0 glyphs/000077500000000000000000000000001470572777600343635ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceTestSharedFeatures/DesignspaceTest-Light.ufocontents.plist000066400000000000000000000002671470572777600373020ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceTestSharedFeatures/DesignspaceTest-Light.ufo/glyphs layercontents.plist000066400000000000000000000004371470572777600370300ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceTestSharedFeatures/DesignspaceTest-Light.ufo public.default glyphs metainfo.plist000066400000000000000000000004761470572777600357430ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceTestSharedFeatures/DesignspaceTest-Light.ufo creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/DesignspaceTestSharedFeatures/DesignspaceTest-Regular.ufo/000077500000000000000000000000001470572777600334665ustar00rootroot00000000000000features.fea000066400000000000000000000000241470572777600356760ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceTestSharedFeatures/DesignspaceTest-Regular.ufoinclude(family.fea) fontinfo.plist000066400000000000000000000016031470572777600363060ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceTestSharedFeatures/DesignspaceTest-Regular.ufo ascender 0 capHeight 0 descender 0 familyName Designspace Test guidelines postscriptBlueValues postscriptFamilyBlues postscriptFamilyOtherBlues postscriptOtherBlues postscriptStemSnapH postscriptStemSnapV styleName Regular unitsPerEm 1000 xHeight 0 glyphs/000077500000000000000000000000001470572777600347155ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceTestSharedFeatures/DesignspaceTest-Regular.ufocontents.plist000066400000000000000000000002671470572777600376340ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceTestSharedFeatures/DesignspaceTest-Regular.ufo/glyphs layercontents.plist000066400000000000000000000004371470572777600373620ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceTestSharedFeatures/DesignspaceTest-Regular.ufo public.default glyphs metainfo.plist000066400000000000000000000004761470572777600362750ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceTestSharedFeatures/DesignspaceTest-Regular.ufo creator com.github.fonttools.ufoLib formatVersion 3 DesignspaceTestSharedFeatures.designspace000066400000000000000000000020431470572777600362540ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/DesignspaceTestSharedFeatures googlefonts-fontmake-7ed5123/tests/data/DesignspaceTestSharedFeatures/family.fea000066400000000000000000000000071470572777600301450ustar00rootroot00000000000000# test googlefonts-fontmake-7ed5123/tests/data/GlyphData.xml000066400000000000000000000002261470572777600226760ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/GlyphsUnitTestSans.glyphs000066400000000000000000000747361470572777600253430ustar00rootroot00000000000000{ .appVersion = "1230"; DisplayStrings = ( A ); classes = ( { code = A; name = c2sc_source; }, { code = a.sc; name = c2sc_target; }, { code = ""; name = numbers; }, { code = a; name = smcp_source; }, { code = a.sc; name = smcp_target; } ); customParameters = ( { name = note; value = "Bla bla"; } ); date = "2015-06-08 08:53:00 +0000"; familyName = "Glyphs Unit Test Sans"; featurePrefixes = ( { code = "# Dancing Shoes 0.1.4 OpenType feature code generator by Yanone, Copyright 2009\012# Code generated for AFDKO version 2.5\012\012\012languagesystem DFLT dflt; # Default, Default\012languagesystem latn dflt; # Latin, Default\012\012\012\012\012"; name = Languagesystems; } ); features = ( { automatic = 1; code = "feature c2sc;\012feature smcp;\012"; name = aalt; }, { code = "# Small Capitals From Capitals\012\012 sub @c2sc_source by @c2sc_target; "; name = c2sc; }, { code = "# Small Capitals\012\012 sub @smcp_source by @smcp_target; "; name = smcp; } ); fontMaster = ( { alignmentZones = ( "{800, 10}", "{700, 10}", "{470, 10}", "{0, -10}", "{-200, -10}" ); ascender = 800; capHeight = 700; customParameters = ( { name = TTFStems; value = ( { horizontal = 1; name = Thin; width = 16; }, { horizontal = 1; name = Lowercase; width = 16; }, { horizontal = 1; name = Uppercase; width = 18; } ); } ); descender = -200; guideLines = ( { position = "{-113, 574}"; }, { position = "{524, 141}"; }, { position = "{-113, 765}"; }, { position = "{524, -122}"; } ); horizontalStems = ( 16, 16, 18 ); id = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; userData = { GSOffsetHorizontal = 9; GSOffsetMakeStroke = 1; GSOffsetVertical = 9; GSRoughenHorizontal = 15; GSRoughenSegmentLength = 15; GSRoughenVertical = 10; com.schriftgestaltung.Glyphs.ufoData = { customBinaryData = <746865206279746573>; }; noodleExtremesAndInflections = 1; noodleRemoveOverlap = 0; noodleThickness = "106.0"; }; verticalStems = ( 17, 19 ); weight = Light; weightValue = 17; xHeight = 470; }, { alignmentZones = ( "{800, 12}", "{700, 12}", "{480, 12}", "{0, -12}", "{-200, -12}" ); ascender = 800; capHeight = 700; customParameters = ( { name = TTFStems; value = ( { horizontal = 1; name = Thin; width = 80; }, { horizontal = 1; name = Lowercase; width = 88; }, { horizontal = 1; name = Uppercase; width = 91; } ); } ); descender = -200; guideLines = ( { position = "{-126, 593}"; }, { locked = 1; position = "{-126, 90}"; }, { position = "{-113, 773}"; }, { position = "{524, -133}"; }, { position = "{-126, 321}"; }, { position = "{-113, 959}"; } ); horizontalStems = ( 80, 88, 91 ); id = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; userData = { GSOffsetHorizontal = 45; GSOffsetMakeStroke = 1; GSOffsetVertical = 44; GSRoughenHorizontal = 15; GSRoughenSegmentLength = 15; GSRoughenVertical = 10; }; verticalStems = ( 90, 93 ); weightValue = 90; xHeight = 480; }, { alignmentZones = ( "{800, 15}", "{700, 15}", "{490, 15}", "{0, -15}", "{-200, -15}" ); ascender = 800; capHeight = 700; customParameters = ( { name = TTFStems; value = ( { horizontal = 1; name = Thin; width = 108; }, { horizontal = 1; name = Lowercase; width = 210; }, { horizontal = 1; name = Uppercase; width = 215; } ); } ); descender = -200; guideLines = ( { position = "{10, 660}"; }, { position = "{524, 44}"; }, { position = "{-113, 800}"; }, { position = "{524, -200}"; }, { position = "{998, -212}"; } ); horizontalStems = ( 108, 210, 215 ); id = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; userData = { GSOffsetHorizontal = 115; GSOffsetMakeStroke = 1; GSOffsetProportional = 1; GSOffsetVertical = 10; }; verticalStems = ( 220, 225 ); weight = Bold; weightValue = 220; xHeight = 490; } ); glyphs = ( { glyphname = A; lastChange = "2017-07-17 13:57:06 +0000"; layers = ( { anchors = ( { name = bottom; position = "{377, 0}"; }, { name = ogonek; position = "{678, 10}"; }, { name = top; position = "{377, 700}"; } ); background = { paths = ( { closed = 1; nodes = ( "566.99 700 LINE", "191 700 LINE", "24 0 LINE", "270 0 LINE", "364 470 LINE", "379 470 LINE", "477 0 LINE", "733 0 LINE" ); } ); }; layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; paths = ( { closed = 1; nodes = ( "555 700 LINE", "205 700 LINE", "20 0 LINE", "253 0 LINE", "356 470 LINE", "385 470 LINE", "491 0 LINE", "733 0 LINE" ); }, { closed = 1; nodes = ( "162 268 LINE", "154 103 LINE", "596 103 LINE", "600 268 LINE" ); } ); width = 753; }, { anchors = ( { name = bottom; position = "{329, 0}"; }, { name = ogonek; position = "{591, 10}"; }, { name = top; position = "{329, 700}"; } ); hints = ( { horizontal = 1; origin = "{1, 1}"; target = "{1, 0}"; type = Stem; }, { horizontal = 1; origin = "{0, 1}"; target = "{0, 4}"; type = Stem; } ); layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; paths = ( { closed = 1; nodes = ( "412 700 LINE", "248 700 LINE", "40 0 LINE", "134 0 LINE", "313 610 LINE", "342 610 LINE", "521 0 LINE", "617 0 LINE" ); }, { closed = 1; nodes = ( "150 269 LINE", "148 178 LINE", "510 178 LINE", "514 269 LINE" ); } ); width = 657; }, { anchors = ( { name = bottom; position = "{297, 0}"; }, { name = ogonek; position = "{548, 0}"; }, { name = top; position = "{297, 700}"; } ); background = { paths = ( { closed = 1; nodes = ( "133 253 LINE", "134 215 LINE", "451 215 LINE", "455 253 LINE" ); } ); }; backgroundImage = { crop = "{{0, 0}, {489, 637}}"; imagePath = A.jpg; }; guideLines = ( { angle = 71.7587; position = "{45, 0}"; } ); layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; paths = ( { closed = 1; nodes = ( "321 700 LINE {name = \"Hello World\";}", "275 700 LINE", "45 0 LINE", "65 0 LINE", "289 679 LINE", "307 679 LINE", "527 0 LINE", "548 0 LINE" ); }, { closed = 1; nodes = ( "128 225 LINE", "123 207 LINE", "472 207 LINE", "467 225 LINE" ); } ); width = 593; } ); leftKerningGroup = A; rightKerningGroup = A; unicode = 0041; script = ""; category = ""; subCategory = ""; }, { glyphname = Adieresis; layers = ( { components = ( { name = A; }, { name = dieresis; transform = "{1, 0, 0, 1, 110, 230}"; } ); layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; width = 593; }, { components = ( { name = A; }, { name = dieresis; transform = "{1, 0, 0, 1, 128, 220}"; } ); layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; width = 657; }, { components = ( { name = A; }, { name = dieresis; transform = "{1, 0, 0, 1, 110, 210}"; } ); layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; width = 753; } ); unicode = 00C4; }, { glyphname = a; lastChange = "2019-05-09 10:17:28 +0000"; layers = ( { anchors = ( { name = bottom; position = "{184, 0}"; }, { name = ogonek; position = "{488, 0}"; }, { name = top; position = "{258, 490}"; } ); background = { paths = ( { closed = 1; nodes = ( "268 153 LINE SMOOTH", "268 123 OFFCURVE", "254 113 OFFCURVE", "236 113 CURVE SMOOTH", "214 113 OFFCURVE", "205 127 OFFCURVE", "205 143 CURVE SMOOTH", "205 155 OFFCURVE", "210 164 OFFCURVE", "218 170 CURVE SMOOTH", "233 181 OFFCURVE", "254 182 OFFCURVE", "275 182 CURVE", "295 289 LINE", "203 289 OFFCURVE", "123 277 OFFCURVE", "72 240 CURVE SMOOTH", "40 216 OFFCURVE", "21 182 OFFCURVE", "21 133 CURVE SMOOTH", "21 49 OFFCURVE", "75 -8 OFFCURVE", "184 -8 CURVE SMOOTH", "260 -8 OFFCURVE", "301 16 OFFCURVE", "322 49 CURVE", "309 57 LINE", "336 0 LINE", "488 0 LINE", "488 454 LINE", "437 484 OFFCURVE", "354 505 OFFCURVE", "255 505 CURVE SMOOTH", "167 505 OFFCURVE", "86 489 OFFCURVE", "25 461 CURVE", "56 298 LINE", "90 311 OFFCURVE", "134 322 OFFCURVE", "194 322 CURVE SMOOTH", "225 322 OFFCURVE", "270 319 OFFCURVE", "308 305 CURVE", "268 392 LINE" ); } ); }; layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; paths = ( { closed = 1; nodes = ( "268 153 LINE SMOOTH", "268 123 OFFCURVE", "254 113 OFFCURVE", "236 113 CURVE SMOOTH", "214 113 OFFCURVE", "205 127 OFFCURVE", "205 143 CURVE SMOOTH", "205 155 OFFCURVE", "210 164 OFFCURVE", "218 170 CURVE SMOOTH", "233 181 OFFCURVE", "254 182 OFFCURVE", "275 182 CURVE", "295 289 LINE", "203 289 OFFCURVE", "123 277 OFFCURVE", "72 240 CURVE SMOOTH", "40 216 OFFCURVE", "21 182 OFFCURVE", "21 133 CURVE SMOOTH", "21 49 OFFCURVE", "75 -8 OFFCURVE", "184 -8 CURVE SMOOTH", "250 -8 OFFCURVE", "288 12 OFFCURVE", "310 44 CURVE", "320 44 LINE", "336 0 LINE", "488 0 LINE", "488 454 LINE", "437 484 OFFCURVE", "354 505 OFFCURVE", "255 505 CURVE SMOOTH", "167 505 OFFCURVE", "86 489 OFFCURVE", "25 461 CURVE", "56 298 LINE", "90 311 OFFCURVE", "134 322 OFFCURVE", "194 322 CURVE SMOOTH", "225 322 OFFCURVE", "270 319 OFFCURVE", "308 305 CURVE", "268 392 LINE" ); } ); width = 518; }, { anchors = ( { name = bottom; position = "{218, 0}"; }, { name = ogonek; position = "{423, 0}"; }, { name = top; position = "{248, 480}"; } ); annotations = ( { position = "{427, 535}"; text = "This is a text annotation"; type = Text; }, { angle = 41.22902; position = "{436, 446}"; type = Arrow; }, { position = "{334.937, 407.08}"; type = Circle; width = 65.05341; }, { position = "{301, 49}"; type = Plus; }, { position = "{372, 172}"; type = Minus; } ); background = { paths = ( { closed = 1; nodes = ( "333 176 LINE SMOOTH", "333 119 OFFCURVE", "309 69 OFFCURVE", "231 69 CURVE SMOOTH", "170 69 OFFCURVE", "153 99 OFFCURVE", "153 127 CURVE SMOOTH", "153 152 OFFCURVE", "166 169 OFFCURVE", "183 179 CURVE SMOOTH", "219 201 OFFCURVE", "284 204 OFFCURVE", "338 204 CURVE", "338 282 LINE", "249 282 OFFCURVE", "193 276 OFFCURVE", "142 251 CURVE SMOOTH", "94 227 OFFCURVE", "65 184 OFFCURVE", "65 124 CURVE SMOOTH", "65 41 OFFCURVE", "119 -11 OFFCURVE", "215 -11 CURVE SMOOTH", "283 -11 OFFCURVE", "325 14 OFFCURVE", "352 56 CURVE", "330 67 LINE", "346 0 LINE", "423 0 LINE", "423 435 LINE", "383 468 OFFCURVE", "317 492 OFFCURVE", "237 492 CURVE SMOOTH", "172 492 OFFCURVE", "117 476 OFFCURVE", "72 460 CURVE", "86 371 LINE", "122 387 OFFCURVE", "167 400 OFFCURVE", "226 400 CURVE SMOOTH", "263 400 OFFCURVE", "312 395 OFFCURVE", "353 361 CURVE", "333 454 LINE" ); } ); }; layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; paths = ( { closed = 1; nodes = ( "333 176 LINE SMOOTH", "333 119 OFFCURVE", "309 69 OFFCURVE", "231 69 CURVE SMOOTH", "170 69 OFFCURVE", "153 99 OFFCURVE", "153 127 CURVE SMOOTH", "153 152 OFFCURVE", "166 169 OFFCURVE", "183 179 CURVE SMOOTH", "219 200 OFFCURVE", "284 204 OFFCURVE", "338 204 CURVE", "338 282 LINE", "249 282 OFFCURVE", "193 276 OFFCURVE", "142 251 CURVE SMOOTH", "94 227 OFFCURVE", "65 185 OFFCURVE", "65 125 CURVE SMOOTH", "65 42 OFFCURVE", "119 -11 OFFCURVE", "215 -11 CURVE SMOOTH", "277 -11 OFFCURVE", "310 11 OFFCURVE", "330 41 CURVE", "338 41 LINE", "346 0 LINE", "423 0 LINE", "423 435 LINE", "383 468 OFFCURVE", "316 492 OFFCURVE", "232 492 CURVE SMOOTH", "171 492 OFFCURVE", "116 479 OFFCURVE", "72 460 CURVE", "86 371 LINE", "122 388 OFFCURVE", "166 400 OFFCURVE", "225 400 CURVE SMOOTH", "262 400 OFFCURVE", "312 395 OFFCURVE", "353 361 CURVE", "333 454 LINE" ); } ); width = 496; }, { anchors = ( { name = bottom; position = "{218, 0}"; }, { name = ogonek; position = "{369, 0}"; }, { name = top; position = "{226, 471}"; } ); background = { paths = ( { closed = 1; nodes = ( "352 147 LINE SMOOTH", "352 68 OFFCURVE", "314 7 OFFCURVE", "212 7 CURVE SMOOTH", "132 7 OFFCURVE", "97 47 OFFCURVE", "97 105 CURVE SMOOTH", "97 136 OFFCURVE", "107 160 OFFCURVE", "125 178 CURVE SMOOTH", "166 219 OFFCURVE", "249 224 OFFCURVE", "355 224 CURVE", "355 241 LINE", "245 241 OFFCURVE", "158 233 OFFCURVE", "113 190 CURVE SMOOTH", "92 169 OFFCURVE", "80 141 OFFCURVE", "80 105 CURVE SMOOTH", "80 39 OFFCURVE", "119 -10 OFFCURVE", "212 -10 CURVE SMOOTH", "281 -10 OFFCURVE", "336 15 OFFCURVE", "357 83 CURVE", "351 91 LINE", "354 0 LINE", "369 0 LINE", "369 428 LINE", "333 460 OFFCURVE", "291 480 OFFCURVE", "224 480 CURVE SMOOTH", "163 480 OFFCURVE", "116 462 OFFCURVE", "82 438 CURVE", "87 423 LINE", "123 448 OFFCURVE", "167 463 OFFCURVE", "224 463 CURVE SMOOTH", "284 463 OFFCURVE", "323 445 OFFCURVE", "355 417 CURVE", "352 429 LINE" ); } ); }; layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; paths = ( { closed = 1; nodes = ( "352 147 LINE SMOOTH {name = Hello;\nrememberToMakeCoffee = \"1\";}", "352 68 OFFCURVE", "314 7 OFFCURVE", "212 7 CURVE SMOOTH", "132 7 OFFCURVE", "97 47 OFFCURVE", "97 105 CURVE SMOOTH", "97 136 OFFCURVE", "107 160 OFFCURVE", "125 178 CURVE SMOOTH", "166 219 OFFCURVE", "249 224 OFFCURVE", "355 224 CURVE", "355 241 LINE", "245 241 OFFCURVE", "158 233 OFFCURVE", "113 190 CURVE SMOOTH", "92 169 OFFCURVE", "80 141 OFFCURVE", "80 105 CURVE SMOOTH", "80 39 OFFCURVE", "119 -10 OFFCURVE", "212 -10 CURVE SMOOTH", "283 -10 OFFCURVE", "334 18 OFFCURVE", "349 68 CURVE", "352 68 LINE", "354 0 LINE", "369 0 LINE", "369 428 LINE", "333 460 OFFCURVE", "291 480 OFFCURVE", "224 480 CURVE SMOOTH", "163 480 OFFCURVE", "116 462 OFFCURVE", "82 438 CURVE", "87 423 LINE", "123 448 OFFCURVE", "167 463 OFFCURVE", "224 463 CURVE SMOOTH", "284 463 OFFCURVE", "323 445 OFFCURVE", "355 417 CURVE", "352 429 LINE" ); } ); width = 456; } ); leftKerningGroup = a; rightKerningGroup = a; rightMetricsKey = m; unicode = 0061; }, { glyphname = adieresis; lastChange = "2016-03-18 09:51:27 +0000"; layers = ( { components = ( { name = a; }, { name = dieresis; transform = "{1, 0, 0, 1, 39, 1}"; } ); layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; width = 456; }, { components = ( { name = a; }, { name = dieresis; transform = "{1, 0, 0, 1, 47, 0}"; } ); layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; width = 496; }, { components = ( { name = a; }, { name = dieresis; transform = "{1, 0, 0, 1, -9, 0}"; } ); layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; width = 518; } ); unicode = 00E4; }, { glyphname = h; lastChange = "2017-10-09 14:18:19 +0000"; layers = ( { components = ( { name = _part.stem; piece = { height = 100; }; }, { name = _part.shoulder; piece = { crotchDepth = -80.20097; }; } ); layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; width = 511; }, { components = ( { name = _part.stem; piece = { height = 100; }; }, { name = _part.shoulder; piece = { crotchDepth = -80.20097; }; } ); layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; width = 532; }, { components = ( { name = _part.stem; piece = { height = 100; }; }, { name = _part.shoulder; piece = { crotchDepth = -80.20097; }; } ); layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; width = 560; } ); leftMetricsKey = m; rightMetricsKey = m; unicode = 0068; }, { glyphname = m; lastChange = "2017-10-09 14:03:19 +0000"; layers = ( { components = ( { name = _part.stem; }, { name = _part.shoulder; piece = { shoulderWidth = 0; }; }, { name = _part.shoulder; piece = { shoulderWidth = 0; }; transform = "{1, 0, 0, 1, 264, 0}"; } ); layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; width = 745; }, { components = ( { name = _part.stem; }, { name = _part.shoulder; piece = { shoulderWidth = 0; }; }, { name = _part.shoulder; piece = { shoulderWidth = 0; }; transform = "{1, 0, 0, 1, 270, 0}"; } ); layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; width = 820; }, { components = ( { name = _part.stem; }, { name = _part.shoulder; piece = { shoulderWidth = 0; }; }, { name = _part.shoulder; piece = { shoulderWidth = 0; }; transform = "{1, 0, 0, 1, 258, 0}"; } ); layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; width = 760; } ); unicode = 006D; }, { glyphname = n; lastChange = "2017-10-09 14:04:04 +0000"; layers = ( { background = { paths = ( { closed = 1; nodes = ( "250 0 LINE", "250 240 LINE SMOOTH", "250 272 OFFCURVE", "264 283 OFFCURVE", "284 283 CURVE SMOOTH", "295 283 OFFCURVE", "304 280 OFFCURVE", "310 276 CURVE", "310 0 LINE", "530 0 LINE", "530 448 LINE", "490 478 OFFCURVE", "430 501 OFFCURVE", "357 501 CURVE SMOOTH", "256 501 OFFCURVE", "199 459 OFFCURVE", "173 386 CURVE", "197 366 LINE", "162 490 LINE", "30 490 LINE", "30 0 LINE" ); } ); }; components = ( { name = _part.shoulder; }, { name = _part.stem; } ); layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; width = 560; }, { background = { paths = ( { closed = 1; nodes = ( "167 0 LINE", "167 270 LINE SMOOTH", "167 362 OFFCURVE", "209 402 OFFCURVE", "277 402 CURVE SMOOTH", "315 402 OFFCURVE", "345 390 OFFCURVE", "365 370 CURVE", "365 0 LINE", "455 0 LINE", "455 423 LINE", "423 454 OFFCURVE", "374 490 OFFCURVE", "288 490 CURVE SMOOTH", "199 490 OFFCURVE", "150 452 OFFCURVE", "139 382 CURVE", "159 356 LINE", "139 480 LINE", "77 480 LINE", "77 0 LINE" ); } ); }; components = ( { name = _part.shoulder; }, { name = _part.stem; } ); layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; width = 528; }, { background = { paths = ( { closed = 1; nodes = ( "117 0 LINE", "117 322 LINE SMOOTH", "117 435 OFFCURVE", "175 491 OFFCURVE", "270 491 CURVE SMOOTH", "324 491 OFFCURVE", "366 474 OFFCURVE", "394 445 CURVE", "394 -1 LINE", "411 -1 LINE", "411 435 LINE", "378 475 OFFCURVE", "340 509 OFFCURVE", "263 509 CURVE SMOOTH", "180 509 OFFCURVE", "133 468 OFFCURVE", "117 406 CURVE", "134 376 LINE", "123 500 LINE", "100 500 LINE", "100 0 LINE" ); } ); }; components = ( { name = _part.shoulder; }, { name = _part.stem; } ); layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; width = 501; } ); leftKerningGroup = n; leftMetricsKey = m; rightKerningGroup = n; rightMetricsKey = m; unicode = 006E; }, { color = 10; glyphname = a.sc; lastChange = "2016-12-19 17:35:01 +0000"; layers = ( { anchors = ( { name = bottom; position = "{307, 0}"; }, { name = ogonek; position = "{608, 0}"; }, { name = top; position = "{307, 552}"; } ); layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; paths = ( { closed = 1; nodes = ( "461 552 LINE", "158 552 LINE", "5 0 LINE", "208 0 LINE", "289 351 LINE", "312 351 LINE", "395 0 LINE", "608 0 LINE" ); }, { closed = 1; nodes = ( "122 234 LINE", "115 65 LINE", "495 65 LINE", "498 234 LINE" ); } ); width = 613; }, { anchors = ( { name = bottom; position = "{268, 0}"; }, { name = ogonek; position = "{511, 0}"; }, { name = top; position = "{268, 540}"; } ); layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; paths = ( { closed = 1; nodes = ( "357 540 LINE", "191 540 LINE", "24 0 LINE", "119 0 LINE", "255 448 LINE", "277 448 LINE", "414 0 LINE", "511 0 LINE" ); }, { closed = 1; nodes = ( "114 208 LINE", "111 125 LINE", "424 125 LINE", "427 208 LINE" ); } ); width = 535; }, { anchors = ( { name = bottom; position = "{240, 0}"; }, { name = ogonek; position = "{445, 0}"; }, { name = top; position = "{240, 528}"; } ); layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; paths = ( { closed = 1; nodes = ( "252 528 LINE", "228 528 LINE", "33 0 LINE", "41 0 LINE", "234 519 LINE", "247 519 LINE", "437 0 LINE", "445 0 LINE" ); }, { closed = 1; nodes = ( "99 167 LINE", "95 159 LINE", "384 159 LINE", "380 167 LINE" ); } ); width = 478; } ); leftKerningGroup = A.sc; rightKerningGroup = A.sc; rightMetricsKey = "=|"; }, { glyphname = "fatha-ar"; lastChange = "2023-07-18 21:25:18 +0000"; layers = ( { layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; paths = ( { closed = 1; nodes = ( "363 466 LINE", "363 486 LINE", "100 417 LINE", "100 397 LINE" ); } ); width = 463; }, { layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; paths = ( { closed = 1; nodes = ( "363 446 LINE", "363 486 LINE", "100 417 LINE", "100 377 LINE" ); } ); width = 463; }, { layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; paths = ( { closed = 1; nodes = ( "363 426 LINE", "363 486 LINE", "100 417 LINE", "100 357 LINE" ); } ); width = 463; } ); unicode = 064E; }, { glyphname = dieresis; lastChange = "2015-12-31 14:44:23 +0000"; layers = ( { anchors = ( { name = _top; position = "{187, 470}"; }, { name = top; position = "{188, 650}"; } ); layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; paths = ( { closed = 1; nodes = ( "261 650 LINE", "261 621 LINE", "289 621 LINE", "289 650 LINE" ); }, { closed = 1; nodes = ( "88 650 LINE", "88 621 LINE", "116 621 LINE", "116 650 LINE" ); } ); width = 600; }, { anchors = ( { name = _top; position = "{201, 480}"; }, { name = top; position = "{201, 700}"; } ); layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; paths = ( { closed = 1; nodes = ( "252 700 LINE", "252 601 LINE", "349 601 LINE", "349 700 LINE" ); }, { closed = 1; nodes = ( "52 700 LINE", "52 601 LINE", "149 601 LINE", "149 700 LINE" ); } ); width = 600; }, { anchors = ( { name = _top; position = "{267, 490}"; }, { name = top; position = "{267, 740}"; } ); layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; paths = ( { closed = 1; nodes = ( "298 735 LINE", "298 547 LINE", "482 547 LINE", "482 735 LINE" ); }, { closed = 1; nodes = ( "48 735 LINE", "48 547 LINE", "232 547 LINE", "232 735 LINE" ); } ); width = 600; } ); unicode = 00A8; }, { export = 0; glyphname = _part.shoulder; lastChange = "2017-10-09 13:47:55 +0000"; layers = ( { anchors = ( { name = _connect; position = "{117, 0}"; }, { name = connect; position = "{411, 0}"; } ); layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; paths = ( { closed = 1; nodes = ( "117 266 LINE", "117 410 OFFCURVE", "173 463 OFFCURVE", "262 463 CURVE SMOOTH", "322 463 OFFCURVE", "365 437 OFFCURVE", "394 408 CURVE", "394 0 LINE", "411 0 LINE", "411 414 LINE", "377 450 OFFCURVE", "333 479 OFFCURVE", "262 479 CURVE SMOOTH", "169 479 OFFCURVE", "132 429 OFFCURVE", "121 384 CURVE", "102 384 LINE" ); } ); userData = { PartSelection = { crotchDepth = 2; shoulderWidth = 2; }; }; width = 501; }, { anchors = ( { name = _connect; position = "{167, 0}"; }, { name = connect; position = "{455, 0}"; } ); layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; paths = ( { closed = 1; nodes = ( "167 246 LINE", "167 355 OFFCURVE", "203 402 OFFCURVE", "277 402 CURVE SMOOTH", "315 402 OFFCURVE", "345 390 OFFCURVE", "365 370 CURVE", "365 0 LINE", "455 0 LINE", "455 423 LINE", "425 452 OFFCURVE", "380 490 OFFCURVE", "294 490 CURVE SMOOTH", "205 490 OFFCURVE", "170 452 OFFCURVE", "155 409 CURVE", "131 409 LINE" ); } ); userData = { PartSelection = { crotchDepth = 2; shoulderWidth = 2; }; }; width = 528; }, { anchors = ( { name = _connect; position = "{250, 0}"; }, { name = connect; position = "{530, 0}"; } ); layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; paths = ( { closed = 1; nodes = ( "250 229 LINE", "250 268 OFFCURVE", "259 283 OFFCURVE", "284 283 CURVE SMOOTH", "295 283 OFFCURVE", "304 280 OFFCURVE", "310 276 CURVE", "310 0 LINE", "530 0 LINE", "530 448 LINE", "490 478 OFFCURVE", "430 501 OFFCURVE", "357 501 CURVE SMOOTH", "259 501 OFFCURVE", "209 461 OFFCURVE", "188 401 CURVE", "162 401 LINE" ); } ); userData = { PartSelection = { crotchDepth = 2; shoulderWidth = 2; }; }; width = 560; }, { anchors = ( { name = _connect; position = "{117, 0}"; }, { name = connect; position = "{381, 0}"; } ); associatedMasterId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; layerId = "50EFFDD5-7E17-4ADC-BBC9-E16AAD6631DE"; name = NarrowShoulder; paths = ( { closed = 1; nodes = ( "117 266 LINE", "117 410 OFFCURVE", "173 463 OFFCURVE", "252 463 CURVE SMOOTH", "292 463 OFFCURVE", "335 437 OFFCURVE", "364 408 CURVE", "364 0 LINE", "381 0 LINE", "381 414 LINE", "347 450 OFFCURVE", "303 479 OFFCURVE", "252 479 CURVE SMOOTH", "169 479 OFFCURVE", "132 429 OFFCURVE", "121 384 CURVE", "102 384 LINE" ); } ); userData = { PartSelection = { crotchDepth = 2; shoulderWidth = 1; }; }; width = 501; }, { anchors = ( { name = _connect; position = "{117, 0}"; }, { name = connect; position = "{411, 0}"; } ); associatedMasterId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; layerId = "7C8F98EE-D140-44D5-86AE-E00A730464C0"; name = LowCrotch; paths = ( { closed = 1; nodes = ( "117 236 LINE", "117 410 OFFCURVE", "173 463 OFFCURVE", "262 463 CURVE SMOOTH", "322 463 OFFCURVE", "365 437 OFFCURVE", "394 408 CURVE", "394 0 LINE", "411 0 LINE", "411 414 LINE", "377 450 OFFCURVE", "333 479 OFFCURVE", "262 479 CURVE SMOOTH", "169 479 OFFCURVE", "132 429 OFFCURVE", "121 354 CURVE", "102 354 LINE" ); } ); userData = { PartSelection = { crotchDepth = 1; shoulderWidth = 2; }; }; width = 501; }, { anchors = ( { name = _connect; position = "{167, 0}"; }, { name = connect; position = "{425, 0}"; } ); associatedMasterId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; layerId = "595FDB8C-ED41-486A-B76A-0FEFEF8BCDD1"; name = NarrowShoulder; paths = ( { closed = 1; nodes = ( "167 246 LINE", "167 355 OFFCURVE", "203 402 OFFCURVE", "257 402 CURVE SMOOTH", "285 402 OFFCURVE", "315 390 OFFCURVE", "335 370 CURVE", "335 0 LINE", "425 0 LINE", "425 423 LINE", "395 452 OFFCURVE", "350 490 OFFCURVE", "274 490 CURVE SMOOTH", "205 490 OFFCURVE", "170 452 OFFCURVE", "155 409 CURVE", "131 409 LINE" ); } ); userData = { PartSelection = { crotchDepth = 2; shoulderWidth = 1; }; }; width = 528; }, { anchors = ( { name = _connect; position = "{167, 0}"; }, { name = connect; position = "{455, 0}"; } ); associatedMasterId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; layerId = "65575EEB-523C-4A39-985D-FB9ACFE951AF"; name = LowCrotch; paths = ( { closed = 1; nodes = ( "167 216 LINE", "167 325 OFFCURVE", "203 402 OFFCURVE", "277 402 CURVE SMOOTH", "315 402 OFFCURVE", "345 390 OFFCURVE", "365 370 CURVE", "365 0 LINE", "455 0 LINE", "455 423 LINE", "425 452 OFFCURVE", "380 490 OFFCURVE", "294 490 CURVE SMOOTH", "205 490 OFFCURVE", "170 452 OFFCURVE", "155 379 CURVE", "131 379 LINE" ); } ); userData = { PartSelection = { crotchDepth = 1; shoulderWidth = 2; }; }; width = 528; }, { anchors = ( { name = _connect; position = "{250, 0}"; }, { name = connect; position = "{520, 0}"; } ); associatedMasterId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; layerId = "D607B100-382C-478B-A297-2EF174C3A363"; name = NarrowShoulder; paths = ( { closed = 1; nodes = ( "250 229 LINE", "250 268 OFFCURVE", "259 283 OFFCURVE", "274 283 CURVE SMOOTH", "285 283 OFFCURVE", "294 280 OFFCURVE", "300 276 CURVE", "300 0 LINE", "520 0 LINE", "520 448 LINE", "480 478 OFFCURVE", "420 501 OFFCURVE", "347 501 CURVE SMOOTH", "259 501 OFFCURVE", "209 461 OFFCURVE", "188 401 CURVE", "162 401 LINE" ); } ); userData = { PartSelection = { crotchDepth = 2; shoulderWidth = 1; }; }; width = 560; }, { anchors = ( { name = _connect; position = "{250, 0}"; }, { name = connect; position = "{530, 0}"; } ); associatedMasterId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; layerId = "BA4F7DF9-9552-48BB-A5B8-E2D21D8D086E"; name = LowCrotch; paths = ( { closed = 1; nodes = ( "250 199 LINE", "250 251 OFFCURVE", "259 283 OFFCURVE", "284 283 CURVE SMOOTH", "295 283 OFFCURVE", "304 280 OFFCURVE", "310 276 CURVE", "310 0 LINE", "530 0 LINE", "530 448 LINE", "490 478 OFFCURVE", "430 501 OFFCURVE", "357 501 CURVE SMOOTH", "259 501 OFFCURVE", "209 461 OFFCURVE", "188 371 CURVE", "162 371 LINE" ); } ); userData = { PartSelection = { crotchDepth = 1; shoulderWidth = 2; }; }; width = 560; } ); partsSettings = ( { name = crotchDepth; bottomName = Low; bottomValue = -100; topName = High; topValue = 0; }, { name = shoulderWidth; bottomName = Low; bottomValue = 0; topName = High; topValue = 100; } ); }, { export = 0; glyphname = _part.stem; lastChange = "2017-10-09 14:18:06 +0000"; layers = ( { anchors = ( { name = connect; position = "{117, 0}"; } ); layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; paths = ( { closed = 1; nodes = ( "119 368 LINE", "115 470 LINE", "100 470 LINE", "100 0 LINE", "117 0 LINE", "117 306 LINE" ); } ); userData = { PartSelection = { height = 1; }; }; width = 600; }, { anchors = ( { name = connect; position = "{167, 0}"; } ); layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; paths = ( { closed = 1; nodes = ( "149 393 LINE", "139 480 LINE", "77 480 LINE", "77 0 LINE", "167 0 LINE", "167 286 LINE" ); } ); userData = { PartSelection = { height = 1; }; }; width = 600; }, { anchors = ( { name = connect; position = "{250, 0}"; } ); layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; paths = ( { closed = 1; nodes = ( "181 385 LINE", "162 490 LINE", "30 490 LINE", "30 0 LINE", "250 0 LINE", "250 256 LINE" ); } ); userData = { PartSelection = { height = 1; }; }; width = 600; }, { anchors = ( { name = connect; position = "{117, 0}"; } ); associatedMasterId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; layerId = "0D68D3E9-A0B2-4D78-A161-EB65D8511F0A"; name = TallStem; paths = ( { closed = 1; nodes = ( "117 368 LINE", "117 800 LINE", "100 800 LINE", "100 0 LINE", "117 0 LINE", "117 306 LINE" ); } ); userData = { PartSelection = { height = 2; }; }; width = 600; }, { anchors = ( { name = connect; position = "{167, 0}"; } ); associatedMasterId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; layerId = "3E1733D9-3B83-4E6A-B1E9-6381BBE1BD3A"; name = TallStem; paths = ( { closed = 1; nodes = ( "167 393 LINE", "167 800 LINE", "77 800 LINE", "77 0 LINE", "167 0 LINE", "167 286 LINE" ); } ); userData = { PartSelection = { height = 2; }; }; width = 600; }, { anchors = ( { name = connect; position = "{250, 0}"; } ); associatedMasterId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; layerId = "FD65D427-9013-43E2-9F74-398D99AA4763"; name = TallStem; paths = ( { closed = 1; nodes = ( "250 385 LINE", "250 800 LINE", "30 800 LINE", "30 0 LINE", "250 0 LINE", "250 256 LINE" ); } ); userData = { PartSelection = { height = 2; }; com.typemytype.robofont.layerData = { "Regular Nov 6 15, 18:44" = { anchors = ( ); components = ( { baseGlyph = tmA; transformation = ( 1, 0, 0, 1, 0, 0 ); } ); contours = ( { points = ( { smooth = 0; x = 2570; y = -907; } ); } ); lib = { }; name = tmAA; unicodes = ( ); width = 3047; }; }; }; width = 600; } ); partsSettings = ( { name = height; bottomName = Low; bottomValue = 0; topName = High; topValue = 100; } ); } ); instances = ( { interpolationWeight = 17; instanceInterpolations = { "C4872ECA-A3A9-40AB-960A-1DB2202F16DE" = 1; }; manualInterpolation = 1; name = Thin; weightClass = Thin; }, { interpolationWeight = 30; instanceInterpolations = { "3E7589AA-8194-470F-8E2F-13C1C581BE24" = 0.17808; "C4872ECA-A3A9-40AB-960A-1DB2202F16DE" = 0.82192; }; name = "Extra Light"; weightClass = ExtraLight; }, { interpolationWeight = 55; instanceInterpolations = { "3E7589AA-8194-470F-8E2F-13C1C581BE24" = 0.52055; "C4872ECA-A3A9-40AB-960A-1DB2202F16DE" = 0.47945; }; name = Light; weightClass = Light; }, { interpolationWeight = 90; instanceInterpolations = { "3E7589AA-8194-470F-8E2F-13C1C581BE24" = 1; }; name = Regular; }, { interpolationWeight = 133; instanceInterpolations = { "3E7589AA-8194-470F-8E2F-13C1C581BE24" = 0.66923; "BFFFD157-90D3-4B85-B99D-9A2F366F03CA" = 0.33077; }; name = Medium; weightClass = Medium; }, { interpolationWeight = 179; instanceInterpolations = { "3E7589AA-8194-470F-8E2F-13C1C581BE24" = 0.31538; "BFFFD157-90D3-4B85-B99D-9A2F366F03CA" = 0.68462; }; name = Bold; weightClass = Bold; }, { interpolationWeight = 220; instanceInterpolations = { "BFFFD157-90D3-4B85-B99D-9A2F366F03CA" = 1; }; name = Black; weightClass = Black; }, { customParameters = ( { name = weightClass; value = 357; } ); interpolationWeight = 75; instanceInterpolations = { "3E7589AA-8194-470F-8E2F-13C1C581BE24" = 0.79452; "C4872ECA-A3A9-40AB-960A-1DB2202F16DE" = 0.20548; }; name = Web; } ); unitsPerEm = 1000; userData = { AsteriskParameters = { "253E7231-480D-4F8E-8754-50FC8575C08E" = ( "754", "30", 7, 51, "80", "50" ); }; GSDimensionPlugin.Dimensions = { "3E7589AA-8194-470F-8E2F-13C1C581BE24" = { HH = 91; HV = 93; OH = 91; OV = 93; arAlef = 86; arBar = 92; nV = 90; oH = 88; }; "BFFFD157-90D3-4B85-B99D-9A2F366F03CA" = { HH = 215; HV = 225; nV = 220; oH = 210; }; "C4872ECA-A3A9-40AB-960A-1DB2202F16DE" = { HH = 18; HV = 19; nV = 17; oH = 16; }; }; uniTestValue = def; }; versionMajor = 1; versionMinor = 0; } googlefonts-fontmake-7ed5123/tests/data/GlyphsUnitTestSans3.glyphspackage/000077500000000000000000000000001470572777600267765ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/GlyphsUnitTestSans3.glyphspackage/fontinfo.plist000066400000000000000000000543641470572777600317110ustar00rootroot00000000000000{ .appVersion = "3039"; .formatVersion = 3; axes = ( { name = Weight; tag = wght; } ); classes = ( { code = A; name = c2sc_source; }, { code = a.sc; name = c2sc_target; }, { code = ""; name = numbers; }, { code = a; name = smcp_source; }, { code = a.sc; name = smcp_target; } ); date = "2015-06-08 08:53:00 +0000"; familyName = "Glyphs Unit Test Sans"; featurePrefixes = ( { code = "# Dancing Shoes 0.1.4 OpenType feature code generator by Yanone, Copyright 2009 # Code generated for AFDKO version 2.5 languagesystem DFLT dflt; # Default, Default languagesystem latn dflt; # Latin, Default "; name = Languagesystems; } ); features = ( { automatic = 1; code = "feature c2sc; feature smcp; "; tag = aalt; }, { code = "# Small Capitals From Capitals sub @c2sc_source by @c2sc_target; "; tag = c2sc; }, { code = "# Small Capitals sub @smcp_source by @smcp_target; "; tag = smcp; } ); fontMaster = ( { axesValues = ( 17 ); customParameters = ( { name = TTFStems; value = ( { horizontal = 1; name = Thin; width = 16; }, { horizontal = 1; name = Lowercase; width = 16; }, { horizontal = 1; name = Uppercase; width = 18; } ); } ); guides = ( { pos = (-113,574); }, { pos = (524,141); }, { pos = (-113,765); }, { pos = (524,-122); } ); iconName = Light; id = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; metricValues = ( { over = 10; pos = 800; }, { over = 10; pos = 700; }, { over = 10; pos = 470; }, { over = -10; }, { over = -10; pos = -200; } ); name = Light; stemValues = ( 16, 16, 18, 17, 19 ); userData = { GSOffsetHorizontal = 9; GSOffsetMakeStroke = 1; GSOffsetVertical = 9; GSRoughenHorizontal = 15; GSRoughenSegmentLength = 15; GSRoughenVertical = 10; com.schriftgestaltung.Glyphs.ufoData = { customBinaryData = <746865206279746573>; }; noodleExtremesAndInflections = 1; noodleRemoveOverlap = 0; noodleThickness = "106.0"; }; }, { axesValues = ( 90 ); customParameters = ( { name = TTFStems; value = ( { horizontal = 1; name = Thin; width = 80; }, { horizontal = 1; name = Lowercase; width = 88; }, { horizontal = 1; name = Uppercase; width = 91; } ); } ); guides = ( { pos = (-126,593); }, { locked = 1; pos = (-126,90); }, { pos = (-113,773); }, { pos = (524,-133); }, { pos = (-126,321); }, { pos = (-113,959); } ); id = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; metricValues = ( { over = 12; pos = 800; }, { over = 12; pos = 700; }, { over = 12; pos = 480; }, { over = -12; }, { over = -12; pos = -200; } ); name = Regular; stemValues = ( 80, 88, 91, 90, 93 ); userData = { GSOffsetHorizontal = 45; GSOffsetMakeStroke = 1; GSOffsetVertical = 44; GSRoughenHorizontal = 15; GSRoughenSegmentLength = 15; GSRoughenVertical = 10; }; }, { axesValues = ( 220 ); customParameters = ( { name = TTFStems; value = ( { horizontal = 1; name = Thin; width = 108; }, { horizontal = 1; name = Lowercase; width = 210; }, { horizontal = 1; name = Uppercase; width = 215; } ); } ); guides = ( { pos = (10,660); }, { pos = (524,44); }, { pos = (-113,800); }, { pos = (524,-200); }, { pos = (998,-212); } ); iconName = Bold; id = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; metricValues = ( { over = 15; pos = 800; }, { over = 15; pos = 700; }, { over = 15; pos = 490; }, { over = -15; }, { over = -15; pos = -200; } ); name = Bold; stemValues = ( 108, 210, 215, 220, 225 ); userData = { GSOffsetHorizontal = 115; GSOffsetMakeStroke = 1; GSOffsetProportional = 1; GSOffsetVertical = 10; }; } ); instances = ( { axesValues = ( 17 ); instanceInterpolations = { "C4872ECA-A3A9-40AB-960A-1DB2202F16DE" = 1; }; manualInterpolation = 1; name = Thin; weightClass = 100; }, { axesValues = ( 30 ); instanceInterpolations = { "3E7589AA-8194-470F-8E2F-13C1C581BE24" = 0.17808; "C4872ECA-A3A9-40AB-960A-1DB2202F16DE" = 0.82192; }; name = "Extra Light"; weightClass = 200; }, { axesValues = ( 55 ); instanceInterpolations = { "3E7589AA-8194-470F-8E2F-13C1C581BE24" = 0.52055; "C4872ECA-A3A9-40AB-960A-1DB2202F16DE" = 0.47945; }; name = Light; weightClass = 300; }, { axesValues = ( 90 ); instanceInterpolations = { "3E7589AA-8194-470F-8E2F-13C1C581BE24" = 1; }; name = Regular; }, { axesValues = ( 133 ); instanceInterpolations = { "3E7589AA-8194-470F-8E2F-13C1C581BE24" = 0.66923; "BFFFD157-90D3-4B85-B99D-9A2F366F03CA" = 0.33077; }; name = Medium; weightClass = 500; }, { axesValues = ( 179 ); instanceInterpolations = { "3E7589AA-8194-470F-8E2F-13C1C581BE24" = 0.31538; "BFFFD157-90D3-4B85-B99D-9A2F366F03CA" = 0.68462; }; name = Bold; weightClass = 700; }, { axesValues = ( 220 ); instanceInterpolations = { "BFFFD157-90D3-4B85-B99D-9A2F366F03CA" = 1; }; name = Black; weightClass = 900; }, { axesValues = ( 75 ); instanceInterpolations = { "3E7589AA-8194-470F-8E2F-13C1C581BE24" = 0.79452; "C4872ECA-A3A9-40AB-960A-1DB2202F16DE" = 0.20548; }; name = Web; weightClass = 357; } ); kerningLTR = { "C4872ECA-A3A9-40AB-960A-1DB2202F16DE" = { "@MMK_L_A" = { "@MMK_R_J" = -30; "@MMK_R_O" = -20; "@MMK_R_T" = -100; "@MMK_R_U" = -20; "@MMK_R_V" = -10; "@MMK_R_Y" = -40; "@MMK_R_o" = -10; "@MMK_R_quote" = -60; "@MMK_R_quoteright" = -60; "@MMK_R_t" = -30; "@MMK_R_u" = -20; "@MMK_R_v" = -20; "@MMK_R_w" = -20; "@MMK_R_y" = -20; }; "@MMK_L_B" = { "@MMK_R_T" = -50; "@MMK_R_V" = -30; "@MMK_R_Y" = -40; "@MMK_R_v" = -10; }; "@MMK_L_C" = { "@MMK_R_O" = -20; "@MMK_R_o" = -10; }; "@MMK_L_E" = { "@MMK_R_O" = -20; "@MMK_R_V" = -20; "@MMK_R_Y" = -20; }; "@MMK_L_F" = { "@MMK_R_A" = -60; "@MMK_R_O" = -30; "@MMK_R_a" = -50; "@MMK_R_o" = -50; }; "@MMK_L_K" = { "@MMK_R_O" = -30; "@MMK_R_a" = -30; "@MMK_R_o" = -30; "@MMK_R_v" = -30; "@MMK_R_y" = -20; }; "@MMK_L_L" = { "@MMK_R_O" = -70; "@MMK_R_T" = -110; "@MMK_R_U" = -20; "@MMK_R_V" = -90; "@MMK_R_Y" = -110; "@MMK_R_a" = -20; "@MMK_R_o" = -20; "@MMK_R_quote" = -80; "@MMK_R_quoteright" = -80; "@MMK_R_t" = -40; "@MMK_R_u" = -20; "@MMK_R_v" = -70; }; "@MMK_L_M" = { "@MMK_R_O" = -20; "@MMK_R_T" = -40; "@MMK_R_V" = -20; "@MMK_R_Y" = -30; "@MMK_R_o" = -10; "@MMK_R_v" = -20; }; "@MMK_L_O" = { "@MMK_R_A" = -20; "@MMK_R_J" = -30; "@MMK_R_M" = -20; "@MMK_R_T" = -60; "@MMK_R_V" = -10; "@MMK_R_X" = -30; "@MMK_R_Y" = -20; "@MMK_R_Z" = -40; "@MMK_R_quoteright" = -20; }; "@MMK_L_P" = { "@MMK_R_A" = -40; "@MMK_R_V" = -10; "@MMK_R_Y" = -20; "@MMK_R_a" = -20; "@MMK_R_o" = -20; "@MMK_R_s" = -10; }; "@MMK_L_R" = { "@MMK_R_O" = -20; "@MMK_R_T" = -30; "@MMK_R_V" = -20; "@MMK_R_Y" = -30; "@MMK_R_a" = -30; "@MMK_R_o" = -30; "@MMK_R_u" = -10; "@MMK_R_v" = -20; "@MMK_R_y" = -20; }; "@MMK_L_S" = { "@MMK_R_T" = -20; "@MMK_R_V" = -20; }; "@MMK_L_T" = { "@MMK_R_A" = -100; "@MMK_R_M" = -50; "@MMK_R_O" = -60; "@MMK_R_S" = -40; "@MMK_R_a" = -130; "@MMK_R_h" = -70; "@MMK_R_n" = -80; "@MMK_R_o" = -140; "@MMK_R_s" = -120; "@MMK_R_v" = -100; "@MMK_R_w" = -100; "@MMK_R_y" = -90; }; "@MMK_L_U" = { "@MMK_R_A" = -20; }; "@MMK_L_V" = { "@MMK_R_A" = -10; "@MMK_R_M" = -20; "@MMK_R_O" = -10; "@MMK_R_S" = -20; "@MMK_R_a" = -60; "@MMK_R_o" = -60; }; "@MMK_L_W" = { "@MMK_R_o" = -50; }; "@MMK_L_X" = { "@MMK_R_O" = -30; "@MMK_R_o" = -30; }; "@MMK_L_Y" = { "@MMK_R_A" = -40; "@MMK_R_M" = -30; "@MMK_R_O" = -20; "@MMK_R_a" = -90; "@MMK_R_o" = -80; }; "@MMK_L_Z" = { "@MMK_R_O" = -30; "@MMK_R_a" = -50; "@MMK_R_o" = -50; "@MMK_R_u" = -30; }; "@MMK_L_a" = { "@MMK_R_T" = -120; "@MMK_R_V" = -50; "@MMK_R_Y" = -70; "@MMK_R_Z" = -20; }; "@MMK_L_c" = { "@MMK_R_o" = -10; }; "@MMK_L_comma" = { "@MMK_R_four" = -70; "@MMK_R_seven" = -100; "@MMK_R_six" = -30; "@MMK_R_space" = -50; "@MMK_R_y" = 30; "@MMK_R_zero" = -70; }; "@MMK_L_e" = { "@MMK_R_T" = -140; "@MMK_R_V" = -60; "@MMK_R_W" = -50; "@MMK_R_X" = -10; "@MMK_R_Y" = -80; "@MMK_R_Z" = -20; "@MMK_R_a" = -15; "@MMK_R_f" = -10; "@MMK_R_quoteright" = -20; "@MMK_R_t" = -10; "@MMK_R_v" = -10; "@MMK_R_y" = -10; "@MMK_R_z" = 0; }; "@MMK_L_eight" = { "@MMK_R_quote" = -10; }; "@MMK_L_f" = { "@MMK_R_a" = -30; "@MMK_R_g" = -40; "@MMK_R_o" = -30; "@MMK_R_quote" = 110; "@MMK_R_quoteright" = 80; }; "@MMK_L_five" = { "@MMK_R_quote" = -20; "@MMK_R_seven" = -30; }; "@MMK_L_four" = { "@MMK_R_comma" = -60; "@MMK_R_five" = -20; "@MMK_R_nine" = -20; "@MMK_R_one" = -20; "@MMK_R_quote" = -60; "@MMK_R_seven" = -50; "@MMK_R_two" = -20; }; "@MMK_L_g" = { "@MMK_R_quote" = 30; "@MMK_R_quoteright" = 40; }; "@MMK_L_i" = { "@MMK_R_quoteright" = 30; }; "@MMK_L_j" = { "@MMK_R_quoteright" = 30; }; "@MMK_L_k" = { "@MMK_R_a" = -10; "@MMK_R_quoteright" = 10; }; "@MMK_L_n" = { "@MMK_R_T" = -90; "@MMK_R_quote" = -30; "@MMK_R_v" = -10; }; "@MMK_L_nine" = { "@MMK_R_comma" = -70; "@MMK_R_two" = -30; }; "@MMK_L_o" = { "@MMK_R_A" = -10; "@MMK_R_J" = -20; "@MMK_R_T" = -140; "@MMK_R_V" = -60; "@MMK_R_W" = -50; "@MMK_R_X" = -30; "@MMK_R_Y" = -80; "@MMK_R_Z" = -40; "@MMK_R_f" = -10; "@MMK_R_j" = -15; "@MMK_R_quote" = -20; "@MMK_R_quoteright" = -20; "@MMK_R_t" = -10; "@MMK_R_v" = -20; "@MMK_R_x" = -20; "@MMK_R_y" = -10; "@MMK_R_z" = -10; }; "@MMK_L_one" = { "@MMK_R_quote" = -40; "@MMK_R_seven" = -30; "@MMK_R_six" = -20; "@MMK_R_zero" = -20; }; "@MMK_L_quote" = { "@MMK_R_A" = -60; "@MMK_R_eight" = -20; "@MMK_R_f" = 60; "@MMK_R_four" = -80; "@MMK_R_g" = -60; "@MMK_R_o" = -20; "@MMK_R_s" = -40; "@MMK_R_seven" = 20; "@MMK_R_six" = -20; "@MMK_R_t" = 60; "@MMK_R_zero" = -20; }; "@MMK_L_quoteright" = { "@MMK_R_A" = -60; "@MMK_R_O" = -30; "@MMK_R_f" = 20; "@MMK_R_g" = -60; "@MMK_R_i" = 30; "@MMK_R_j" = 30; "@MMK_R_o" = -40; "@MMK_R_s" = -70; "@MMK_R_t" = 40; }; "@MMK_L_r" = { "@MMK_R_a" = -20; "@MMK_R_g" = -30; "@MMK_R_o" = -20; "@MMK_R_quote" = 50; "@MMK_R_quoteright" = 30; "@MMK_R_s" = -10; }; "@MMK_L_s" = { "@MMK_R_T" = -120; "@MMK_R_quoteright" = 0; "@MMK_R_v" = -10; }; "@MMK_L_seven" = { "@MMK_R_comma" = -90; "@MMK_R_four" = -30; "@MMK_R_one" = 30; "@MMK_R_quote" = 20; "@MMK_R_six" = -20; "@MMK_R_zero" = -20; }; "@MMK_L_six" = { "@MMK_R_nine" = -20; "@MMK_R_quote" = -20; "@MMK_R_seven" = -20; }; "@MMK_L_t" = { "@MMK_R_a" = -20; "@MMK_R_o" = -20; "@MMK_R_quote" = 20; "@MMK_R_quoteright" = 30; }; "@MMK_L_three" = { "@MMK_R_seven" = -20; }; "@MMK_L_two" = { "@MMK_R_four" = -20; "@MMK_R_seven" = -10; }; "@MMK_L_v" = { "@MMK_R_A" = -20; "@MMK_R_T" = -100; "@MMK_R_a" = -20; "@MMK_R_g" = -30; "@MMK_R_o" = -20; "@MMK_R_s" = -25; }; "@MMK_L_w" = { "@MMK_R_A" = -20; "@MMK_R_T" = -100; }; "@MMK_L_x" = { "@MMK_R_o" = -20; }; "@MMK_L_y" = { "@MMK_R_A" = -10; "@MMK_R_T" = -90; "@MMK_R_a" = -15; "@MMK_R_comma" = -50; "@MMK_R_g" = -20; "@MMK_R_o" = -10; }; "@MMK_L_z" = { "@MMK_R_o" = -10; }; "@MMK_L_zero" = { "@MMK_R_comma" = -60; "@MMK_R_quote" = -20; }; }; "3E7589AA-8194-470F-8E2F-13C1C581BE24" = { "@MMK_L_A" = { "@MMK_R_J" = -20; "@MMK_R_O" = -30; "@MMK_R_T" = -80; "@MMK_R_U" = -20; "@MMK_R_V" = -50; "@MMK_R_Y" = -70; "@MMK_R_o" = -20; "@MMK_R_quote" = -60; "@MMK_R_quoteright" = -60; "@MMK_R_t" = -30; "@MMK_R_u" = -20; "@MMK_R_v" = -40; "@MMK_R_w" = -30; "@MMK_R_y" = -30; }; "@MMK_L_B" = { "@MMK_R_T" = -30; "@MMK_R_V" = -20; "@MMK_R_Y" = -50; "@MMK_R_v" = -10; }; "@MMK_L_C" = { "@MMK_R_O" = -30; "@MMK_R_o" = -10; "@MMK_R_quoteright" = 20; }; "@MMK_L_E" = { "@MMK_R_O" = -10; "@MMK_R_V" = -20; "@MMK_R_Y" = -20; }; "@MMK_L_F" = { "@MMK_R_A" = -40; "@MMK_R_O" = -20; "@MMK_R_a" = -50; "@MMK_R_o" = -40; }; "@MMK_L_K" = { "@MMK_R_O" = -40; "@MMK_R_a" = -40; "@MMK_R_o" = -45; "@MMK_R_v" = -40; "@MMK_R_y" = -30; }; "@MMK_L_L" = { "@MMK_R_O" = -40; "@MMK_R_T" = -130; "@MMK_R_U" = -30; "@MMK_R_V" = -80; "@MMK_R_Y" = -120; "@MMK_R_a" = -20; "@MMK_R_o" = -20; "@MMK_R_quote" = -100; "@MMK_R_quoteright" = -120; "@MMK_R_t" = -30; "@MMK_R_u" = -20; "@MMK_R_v" = -60; }; "@MMK_L_M" = { "@MMK_R_O" = -20; "@MMK_R_T" = -30; "@MMK_R_V" = -20; "@MMK_R_Y" = -30; "@MMK_R_o" = -20; "@MMK_R_t" = -20; "@MMK_R_v" = -20; }; "@MMK_L_O" = { "@MMK_R_A" = -40; "@MMK_R_J" = -20; "@MMK_R_M" = -20; "@MMK_R_T" = -50; "@MMK_R_V" = -20; "@MMK_R_X" = -40; "@MMK_R_Y" = -40; "@MMK_R_Z" = -30; "@MMK_R_quoteright" = -20; }; "@MMK_L_P" = { "@MMK_R_A" = -50; "@MMK_R_V" = -10; "@MMK_R_Y" = -20; "@MMK_R_a" = -20; "@MMK_R_o" = -30; }; "@MMK_L_R" = { "@MMK_R_O" = -20; "@MMK_R_T" = -30; "@MMK_R_U" = -10; "@MMK_R_V" = -30; "@MMK_R_Y" = -40; "@MMK_R_a" = -30; "@MMK_R_o" = -30; "@MMK_R_u" = -10; "@MMK_R_v" = -20; "@MMK_R_y" = -20; }; "@MMK_L_S" = { "@MMK_R_V" = -20; }; "@MMK_L_T" = { "@MMK_R_A" = -80; "@MMK_R_M" = -30; "@MMK_R_O" = -50; "@MMK_R_S" = -30; "@MMK_R_a" = -120; "@MMK_R_h" = -40; "@MMK_R_n" = -90; "@MMK_R_o" = -130; "@MMK_R_quote" = 40; "@MMK_R_quoteright" = 40; "@MMK_R_s" = -130; "@MMK_R_v" = -70; "@MMK_R_w" = -70; "@MMK_R_y" = -70; }; "@MMK_L_U" = { "@MMK_R_A" = -20; }; "@MMK_L_V" = { "@MMK_R_A" = -50; "@MMK_R_M" = -20; "@MMK_R_O" = -20; "@MMK_R_S" = -30; "@MMK_R_a" = -80; "@MMK_R_o" = -70; }; "@MMK_L_W" = { "@MMK_R_a" = -30; "@MMK_R_o" = -50; }; "@MMK_L_X" = { "@MMK_R_O" = -40; "@MMK_R_a" = -40; "@MMK_R_o" = -50; }; "@MMK_L_Y" = { "@MMK_R_A" = -70; "@MMK_R_M" = -30; "@MMK_R_O" = -40; "@MMK_R_a" = -100; "@MMK_R_o" = -110; }; "@MMK_L_Z" = { "@MMK_R_O" = -30; "@MMK_R_a" = -50; "@MMK_R_o" = -50; "@MMK_R_u" = -30; }; "@MMK_L_a" = { "@MMK_R_T" = -120; "@MMK_R_V" = -70; "@MMK_R_W" = -30; "@MMK_R_X" = -20; "@MMK_R_Y" = -110; "@MMK_R_Z" = -20; "@MMK_R_quote" = -30; }; "@MMK_L_c" = { "@MMK_R_o" = -20; }; "@MMK_L_comma" = { "@MMK_R_four" = -20; "@MMK_R_seven" = -100; "@MMK_R_space" = -40; "@MMK_R_y" = 30; "@MMK_R_zero" = -50; }; "@MMK_L_e" = { "@MMK_R_T" = -130; "@MMK_R_V" = -70; "@MMK_R_W" = -40; "@MMK_R_X" = -50; "@MMK_R_Y" = -110; "@MMK_R_Z" = -30; "@MMK_R_a" = -10; "@MMK_R_f" = -10; "@MMK_R_quote" = -30; "@MMK_R_quoteright" = -30; "@MMK_R_v" = -10; "@MMK_R_x" = -20; "@MMK_R_z" = -6; }; "@MMK_L_eight" = { "@MMK_R_quote" = -20; "@MMK_R_seven" = -10; }; "@MMK_L_f" = { "@MMK_R_a" = -20; "@MMK_R_g" = -30; "@MMK_R_o" = -25; "@MMK_R_quote" = 70; "@MMK_R_quoteright" = 70; }; "@MMK_L_five" = { "@MMK_R_quote" = 10; }; "@MMK_L_four" = { "@MMK_R_one" = -10; "@MMK_R_quote" = -50; "@MMK_R_seven" = -50; "@MMK_R_three" = -10; "@MMK_R_two" = -10; }; "@MMK_L_g" = { "@MMK_R_a" = -20; "@MMK_R_quoteright" = 30; "@MMK_R_y" = 20; }; "@MMK_L_i" = { "@MMK_R_quoteright" = 30; }; "@MMK_L_j" = { "@MMK_R_quoteright" = 30; }; "@MMK_L_k" = { "@MMK_R_a" = -20; "@MMK_R_o" = -10; "@MMK_R_quote" = 20; "@MMK_R_quoteright" = 20; "@MMK_R_v" = -10; }; "@MMK_L_l" = { "@MMK_R_quoteright" = -40; }; "@MMK_L_n" = { "@MMK_R_T" = -80; "@MMK_R_quote" = -20; "@MMK_R_v" = -15; }; "@MMK_L_nine" = { "@MMK_R_comma" = -50; "@MMK_R_two" = -20; }; "@MMK_L_o" = { "@MMK_R_A" = -20; "@MMK_R_J" = -20; "@MMK_R_M" = -20; "@MMK_R_T" = -130; "@MMK_R_V" = -70; "@MMK_R_W" = -40; "@MMK_R_X" = -50; "@MMK_R_Y" = -110; "@MMK_R_Z" = -20; "@MMK_R_f" = -10; "@MMK_R_j" = -15; "@MMK_R_quote" = -40; "@MMK_R_quoteright" = -20; "@MMK_R_v" = -20; "@MMK_R_x" = -30; "@MMK_R_y" = -25; "@MMK_R_z" = -10; }; "@MMK_L_one" = { "@MMK_R_four" = -20; "@MMK_R_quote" = -60; "@MMK_R_seven" = -20; "@MMK_R_six" = -20; "@MMK_R_zero" = -20; }; "@MMK_L_quote" = { "@MMK_R_A" = -60; "@MMK_R_J" = -20; "@MMK_R_T" = 40; "@MMK_R_a" = -20; "@MMK_R_eight" = -20; "@MMK_R_f" = 30; "@MMK_R_five" = 20; "@MMK_R_four" = -80; "@MMK_R_g" = -60; "@MMK_R_h" = 20; "@MMK_R_o" = -40; "@MMK_R_s" = -40; "@MMK_R_seven" = 20; "@MMK_R_t" = 40; "@MMK_R_v" = 20; "@MMK_R_w" = 20; "@MMK_R_y" = 20; "@MMK_R_zero" = -20; }; "@MMK_L_quoteright" = { "@MMK_R_A" = -60; "@MMK_R_O" = -20; "@MMK_R_T" = 40; "@MMK_R_a" = -10; "@MMK_R_f" = 20; "@MMK_R_g" = -50; "@MMK_R_i" = 30; "@MMK_R_j" = 30; "@MMK_R_o" = -40; "@MMK_R_s" = -40; "@MMK_R_t" = 50; }; "@MMK_L_r" = { "@MMK_R_a" = -30; "@MMK_R_g" = -25; "@MMK_R_o" = -20; "@MMK_R_quote" = 20; "@MMK_R_quoteright" = 20; "@MMK_R_s" = -10; }; "@MMK_L_s" = { "@MMK_R_T" = -110; "@MMK_R_quoteright" = 0; "@MMK_R_v" = -10; }; "@MMK_L_seven" = { "@MMK_R_comma" = -80; "@MMK_R_four" = -40; "@MMK_R_one" = 20; "@MMK_R_quote" = 20; "@MMK_R_three" = 10; "@MMK_R_zero" = -20; }; "@MMK_L_six" = { "@MMK_R_quote" = -20; }; "@MMK_L_t" = { "@MMK_R_a" = -10; "@MMK_R_quote" = 40; "@MMK_R_quoteright" = 30; }; "@MMK_L_three" = { "@MMK_R_seven" = -20; }; "@MMK_L_two" = { "@MMK_R_seven" = -20; }; "@MMK_L_v" = { "@MMK_R_A" = -30; "@MMK_R_M" = -20; "@MMK_R_T" = -70; "@MMK_R_a" = -20; "@MMK_R_g" = -40; "@MMK_R_o" = -20; "@MMK_R_quote" = 20; "@MMK_R_s" = -20; }; "@MMK_L_w" = { "@MMK_R_A" = -30; "@MMK_R_T" = -70; "@MMK_R_quote" = 20; }; "@MMK_L_x" = { "@MMK_R_o" = -30; }; "@MMK_L_y" = { "@MMK_R_A" = -40; "@MMK_R_T" = -60; "@MMK_R_a" = -20; "@MMK_R_comma" = -60; "@MMK_R_g" = -30; "@MMK_R_o" = -10; "@MMK_R_quote" = 20; }; "@MMK_L_z" = { "@MMK_R_o" = -10; }; "@MMK_L_zero" = { "@MMK_R_comma" = -30; "@MMK_R_quote" = -20; }; }; "BFFFD157-90D3-4B85-B99D-9A2F366F03CA" = { "@MMK_L_A" = { "@MMK_R_J" = -10; "@MMK_R_O" = -40; "@MMK_R_T" = -80; "@MMK_R_U" = -40; "@MMK_R_V" = -70; "@MMK_R_Y" = -100; "@MMK_R_o" = -30; "@MMK_R_quote" = -60; "@MMK_R_quoteright" = -50; "@MMK_R_t" = -60; "@MMK_R_u" = -30; "@MMK_R_v" = -50; "@MMK_R_w" = -40; "@MMK_R_y" = -40; }; "@MMK_L_B" = { "@MMK_R_T" = -20; "@MMK_R_V" = -30; "@MMK_R_Y" = -50; "@MMK_R_v" = -10; "@MMK_R_y" = -10; }; "@MMK_L_C" = { "@MMK_R_O" = -30; "@MMK_R_o" = -10; "@MMK_R_quoteright" = 10; }; "@MMK_L_E" = { "@MMK_R_O" = -10; "@MMK_R_V" = -10; "@MMK_R_Y" = -20; }; "@MMK_L_F" = { "@MMK_R_A" = -50; "@MMK_R_O" = -10; "@MMK_R_a" = -20; "@MMK_R_o" = -15; }; "@MMK_L_K" = { "@MMK_R_O" = -40; "@MMK_R_a" = -20; "@MMK_R_o" = -50; "@MMK_R_v" = -60; "@MMK_R_y" = -50; }; "@MMK_L_L" = { "@MMK_R_O" = -20; "@MMK_R_T" = -110; "@MMK_R_U" = -20; "@MMK_R_V" = -80; "@MMK_R_Y" = -140; "@MMK_R_quote" = -70; "@MMK_R_quoteright" = -70; "@MMK_R_t" = -20; "@MMK_R_v" = -40; }; "@MMK_L_M" = { "@MMK_R_O" = -30; "@MMK_R_T" = -50; "@MMK_R_V" = -50; "@MMK_R_Y" = -70; "@MMK_R_o" = -30; "@MMK_R_t" = -40; "@MMK_R_v" = -40; "@MMK_R_y" = -40; }; "@MMK_L_O" = { "@MMK_R_A" = -40; "@MMK_R_J" = -20; "@MMK_R_M" = -30; "@MMK_R_T" = -40; "@MMK_R_V" = -50; "@MMK_R_X" = -50; "@MMK_R_Y" = -70; "@MMK_R_Z" = -20; }; "@MMK_L_P" = { "@MMK_R_A" = -50; "@MMK_R_V" = -20; "@MMK_R_Y" = -50; "@MMK_R_a" = -20; "@MMK_R_o" = -20; }; "@MMK_L_R" = { "@MMK_R_O" = -20; "@MMK_R_T" = -20; "@MMK_R_U" = -10; "@MMK_R_V" = -30; "@MMK_R_Y" = -50; "@MMK_R_a" = -20; "@MMK_R_o" = -20; "@MMK_R_v" = -20; "@MMK_R_y" = -20; }; "@MMK_L_T" = { "@MMK_R_A" = -80; "@MMK_R_M" = -50; "@MMK_R_O" = -40; "@MMK_R_S" = -20; "@MMK_R_a" = -60; "@MMK_R_h" = -10; "@MMK_R_n" = -20; "@MMK_R_o" = -100; "@MMK_R_quote" = 30; "@MMK_R_s" = -60; "@MMK_R_v" = -20; "@MMK_R_w" = -20; }; "@MMK_L_U" = { "@MMK_R_A" = -40; }; "@MMK_L_V" = { "@MMK_R_A" = -70; "@MMK_R_M" = -50; "@MMK_R_O" = -40; "@MMK_R_S" = -20; "@MMK_R_a" = -60; "@MMK_R_o" = -70; "@MMK_R_quote" = 20; }; "@MMK_L_W" = { "@MMK_R_o" = -40; "@MMK_R_quote" = 20; }; "@MMK_L_X" = { "@MMK_R_O" = -50; "@MMK_R_a" = -30; "@MMK_R_o" = -50; }; "@MMK_L_Y" = { "@MMK_R_A" = -100; "@MMK_R_M" = -70; "@MMK_R_O" = -70; "@MMK_R_a" = -100; "@MMK_R_o" = -120; }; "@MMK_L_Z" = { "@MMK_R_O" = -20; "@MMK_R_a" = -10; "@MMK_R_o" = -20; "@MMK_R_u" = -20; }; "@MMK_L_a" = { "@MMK_R_T" = -40; "@MMK_R_V" = -60; "@MMK_R_X" = -20; "@MMK_R_Y" = -120; "@MMK_R_t" = -10; "@MMK_R_v" = -10; "@MMK_R_y" = -10; }; "@MMK_L_c" = { "@MMK_R_o" = -15; }; "@MMK_L_comma" = { "@MMK_R_seven" = -110; "@MMK_R_space" = -30; "@MMK_R_zero" = -20; }; "@MMK_L_e" = { "@MMK_R_T" = -100; "@MMK_R_V" = -70; "@MMK_R_W" = -40; "@MMK_R_X" = -30; "@MMK_R_Y" = -120; "@MMK_R_a" = -15; "@MMK_R_f" = -10; "@MMK_R_quote" = 0; "@MMK_R_v" = -20; "@MMK_R_x" = -20; "@MMK_R_y" = -20; }; "@MMK_L_eight" = { "@MMK_R_quote" = -10; "@MMK_R_seven" = -20; }; "@MMK_L_f" = { "@MMK_R_a" = -10; "@MMK_R_g" = -20; "@MMK_R_o" = -10; "@MMK_R_quote" = 40; "@MMK_R_quoteright" = 70; }; "@MMK_L_five" = { "@MMK_R_nine" = -10; "@MMK_R_seven" = -10; }; "@MMK_L_four" = { "@MMK_R_quote" = -20; "@MMK_R_seven" = -30; }; "@MMK_L_g" = { "@MMK_R_a" = -10; "@MMK_R_o" = -10; "@MMK_R_quote" = 20; "@MMK_R_quoteright" = 30; "@MMK_R_y" = 10; }; "@MMK_L_i" = { "@MMK_R_quoteright" = 60; }; "@MMK_L_j" = { "@MMK_R_quoteright" = 40; }; "@MMK_L_k" = { "@MMK_R_a" = -15; "@MMK_R_o" = -25; "@MMK_R_quoteright" = 20; }; "@MMK_L_l" = { "@MMK_R_quoteright" = 20; }; "@MMK_L_n" = { "@MMK_R_T" = -30; "@MMK_R_quote" = -20; "@MMK_R_v" = -10; }; "@MMK_L_nine" = { "@MMK_R_comma" = -20; "@MMK_R_seven" = -10; }; "@MMK_L_o" = { "@MMK_R_A" = -30; "@MMK_R_J" = -20; "@MMK_R_M" = -30; "@MMK_R_T" = -100; "@MMK_R_V" = -70; "@MMK_R_W" = -40; "@MMK_R_X" = -50; "@MMK_R_Y" = -120; "@MMK_R_Z" = -10; "@MMK_R_f" = -10; "@MMK_R_j" = -20; "@MMK_R_quote" = -20; "@MMK_R_quoteright" = 0; "@MMK_R_t" = -10; "@MMK_R_v" = -30; "@MMK_R_x" = -35; "@MMK_R_y" = -20; "@MMK_R_z" = -10; }; "@MMK_L_one" = { "@MMK_R_quote" = -50; "@MMK_R_seven" = -40; "@MMK_R_zero" = -20; }; "@MMK_L_quote" = { "@MMK_R_A" = -70; "@MMK_R_T" = 30; "@MMK_R_V" = 20; "@MMK_R_W" = 20; "@MMK_R_eight" = -10; "@MMK_R_f" = 20; "@MMK_R_four" = -20; "@MMK_R_g" = -20; "@MMK_R_h" = 10; "@MMK_R_o" = -20; "@MMK_R_seven" = 20; "@MMK_R_six" = -20; "@MMK_R_t" = 20; "@MMK_R_zero" = -20; }; "@MMK_L_quoteright" = { "@MMK_R_A" = -70; "@MMK_R_O" = -30; "@MMK_R_a" = -20; "@MMK_R_g" = -40; "@MMK_R_h" = 20; "@MMK_R_i" = 30; "@MMK_R_j" = 20; "@MMK_R_o" = -50; "@MMK_R_s" = -30; "@MMK_R_t" = 10; }; "@MMK_L_r" = { "@MMK_R_a" = -10; "@MMK_R_g" = -10; "@MMK_R_o" = -5; "@MMK_R_quoteright" = 20; "@MMK_R_s" = -10; }; "@MMK_L_seven" = { "@MMK_R_comma" = -60; "@MMK_R_four" = -30; "@MMK_R_one" = 20; "@MMK_R_quote" = 20; "@MMK_R_six" = -20; }; "@MMK_L_six" = { "@MMK_R_nine" = -20; "@MMK_R_quote" = -20; "@MMK_R_seven" = -20; }; "@MMK_L_t" = { "@MMK_R_a" = -10; "@MMK_R_o" = -5; "@MMK_R_quote" = 20; "@MMK_R_quoteright" = 30; }; "@MMK_L_three" = { "@MMK_R_seven" = -30; }; "@MMK_L_two" = { "@MMK_R_seven" = -20; }; "@MMK_L_v" = { "@MMK_R_A" = -50; "@MMK_R_M" = -40; "@MMK_R_T" = -20; "@MMK_R_g" = -35; "@MMK_R_o" = -30; "@MMK_R_s" = -25; }; "@MMK_L_w" = { "@MMK_R_A" = -40; "@MMK_R_T" = -20; }; "@MMK_L_x" = { "@MMK_R_o" = -35; }; "@MMK_L_y" = { "@MMK_R_A" = -60; "@MMK_R_M" = -40; "@MMK_R_comma" = -40; "@MMK_R_g" = -30; "@MMK_R_o" = 0; }; "@MMK_L_z" = { "@MMK_R_o" = -10; }; "@MMK_L_zero" = { "@MMK_R_comma" = -20; "@MMK_R_quote" = -20; "@MMK_R_two" = -10; }; }; }; metrics = ( { type = ascender; }, { type = "cap height"; }, { filter = "category == \"letter\""; type = "x-height"; }, { type = baseline; }, { type = descender; } ); note = "Bla bla"; stems = ( { horizontal = 1; name = hStem0; }, { horizontal = 1; name = hStem1; }, { horizontal = 1; name = hStem2; }, { name = vStem0; }, { name = vStem1; } ); unitsPerEm = 1000; userData = { AsteriskParameters = { "253E7231-480D-4F8E-8754-50FC8575C08E" = ( "754", "30", 7, 51, "80", "50" ); }; GSDimensionPlugin.Dimensions = { "3E7589AA-8194-470F-8E2F-13C1C581BE24" = { HH = 91; HV = 93; OH = 91; OV = 93; arAlef = 86; arBar = 92; nV = 90; oH = 88; }; "BFFFD157-90D3-4B85-B99D-9A2F366F03CA" = { HH = 215; HV = 225; nV = 220; oH = 210; }; "C4872ECA-A3A9-40AB-960A-1DB2202F16DE" = { HH = 18; HV = 19; nV = 17; oH = 16; }; }; uniTestValue = def; }; versionMajor = 1; versionMinor = 0; } googlefonts-fontmake-7ed5123/tests/data/GlyphsUnitTestSans3.glyphspackage/glyphs/000077500000000000000000000000001470572777600303045ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/GlyphsUnitTestSans3.glyphspackage/glyphs/A_.glyph000066400000000000000000000035411470572777600316730ustar00rootroot00000000000000{ category = ""; color = (120,220,20,4); glyphname = A; kernLeft = A; kernRight = A; layers = ( { anchors = ( { name = bottom; pos = (377,0); }, { name = ogonek; pos = (678,10); }, { name = top; pos = (377,700); } ); background = { shapes = ( { closed = 1; nodes = ( (566.99,700,l), (191,700,l), (24,0,l), (270,0,l), (364,470,l), (379,470,l), (477,0,l), (733,0,l) ); } ); }; layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; shapes = ( { closed = 1; nodes = ( (555,700,l), (205,700,l), (20,0,l), (253,0,l), (356,470,l), (385,470,l), (491,0,l), (733,0,l) ); }, { closed = 1; nodes = ( (162,268,l), (154,103,l), (596,103,l), (600,268,l) ); } ); width = 753; }, { anchors = ( { name = bottom; pos = (329,0); }, { name = ogonek; pos = (591,10); }, { name = top; pos = (329,700); } ); hints = ( { horizontal = 1; origin = (1,1); target = (1,0); type = Stem; }, { horizontal = 1; origin = (0,1); target = (0,4); type = Stem; } ); layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; shapes = ( { closed = 1; nodes = ( (412,700,l), (248,700,l), (40,0,l), (134,0,l), (313,610,l), (342,610,l), (521,0,l), (617,0,l) ); }, { closed = 1; nodes = ( (150,269,l), (148,178,l), (510,178,l), (514,269,l) ); } ); width = 657; }, { anchors = ( { name = bottom; pos = (297,0); }, { name = ogonek; pos = (548,0); }, { name = top; pos = (297,700); } ); background = { shapes = ( { closed = 1; nodes = ( (133,253,l), (134,215,l), (451,215,l), (455,253,l) ); } ); }; backgroundImage = { imagePath = A.jpg; }; guides = ( { angle = 71.7587; pos = (45,0); } ); layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; shapes = ( { closed = 1; nodes = ( (321,700,l,{ name = "Hello World"; }), (275,700,l), (45,0,l), (65,0,l), (289,679,l), (307,679,l), (527,0,l), (548,0,l) ); }, { closed = 1; nodes = ( (128,225,l), (123,207,l), (472,207,l), (467,225,l) ); } ); width = 593; } ); script = ""; subCategory = ""; unicode = 65; } googlefonts-fontmake-7ed5123/tests/data/GlyphsUnitTestSans3.glyphspackage/glyphs/A_dieresis.glyph000066400000000000000000000007061470572777600334230ustar00rootroot00000000000000{ glyphname = Adieresis; layers = ( { layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; shapes = ( { ref = A; }, { pos = (110,230); ref = dieresis; } ); width = 593; }, { layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; shapes = ( { ref = A; }, { pos = (128,220); ref = dieresis; } ); width = 657; }, { layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; shapes = ( { ref = A; }, { pos = (110,210); ref = dieresis; } ); width = 753; } ); unicode = 196; } _part.shoulder.glyph000066400000000000000000000116221470572777600342250ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/GlyphsUnitTestSans3.glyphspackage/glyphs{ export = 0; glyphname = _part.shoulder; layers = ( { anchors = ( { name = _connect; pos = (117,0); }, { name = connect; pos = (411,0); } ); layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; partSelection = { crotchDepth = 2; shoulderWidth = 2; }; shapes = ( { closed = 1; nodes = ( (117,266,l), (117,410,o), (173,463,o), (262,463,cs), (322,463,o), (365,437,o), (394,408,c), (394,0,l), (411,0,l), (411,414,l), (377,450,o), (333,479,o), (262,479,cs), (169,479,o), (132,429,o), (121,384,c), (102,384,l) ); } ); width = 501; }, { anchors = ( { name = _connect; pos = (167,0); }, { name = connect; pos = (455,0); } ); layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; partSelection = { crotchDepth = 2; shoulderWidth = 2; }; shapes = ( { closed = 1; nodes = ( (167,246,l), (167,355,o), (203,402,o), (277,402,cs), (315,402,o), (345,390,o), (365,370,c), (365,0,l), (455,0,l), (455,423,l), (425,452,o), (380,490,o), (294,490,cs), (205,490,o), (170,452,o), (155,409,c), (131,409,l) ); } ); width = 528; }, { anchors = ( { name = _connect; pos = (250,0); }, { name = connect; pos = (530,0); } ); layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; partSelection = { crotchDepth = 2; shoulderWidth = 2; }; shapes = ( { closed = 1; nodes = ( (250,229,l), (250,268,o), (259,283,o), (284,283,cs), (295,283,o), (304,280,o), (310,276,c), (310,0,l), (530,0,l), (530,448,l), (490,478,o), (430,501,o), (357,501,cs), (259,501,o), (209,461,o), (188,401,c), (162,401,l) ); } ); width = 560; }, { anchors = ( { name = _connect; pos = (117,0); }, { name = connect; pos = (381,0); } ); associatedMasterId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; layerId = "50EFFDD5-7E17-4ADC-BBC9-E16AAD6631DE"; name = NarrowShoulder; partSelection = { crotchDepth = 2; shoulderWidth = 1; }; shapes = ( { closed = 1; nodes = ( (117,266,l), (117,410,o), (173,463,o), (252,463,cs), (292,463,o), (335,437,o), (364,408,c), (364,0,l), (381,0,l), (381,414,l), (347,450,o), (303,479,o), (252,479,cs), (169,479,o), (132,429,o), (121,384,c), (102,384,l) ); } ); width = 501; }, { anchors = ( { name = _connect; pos = (117,0); }, { name = connect; pos = (411,0); } ); associatedMasterId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; layerId = "7C8F98EE-D140-44D5-86AE-E00A730464C0"; name = LowCrotch; partSelection = { crotchDepth = 1; shoulderWidth = 2; }; shapes = ( { closed = 1; nodes = ( (117,236,l), (117,410,o), (173,463,o), (262,463,cs), (322,463,o), (365,437,o), (394,408,c), (394,0,l), (411,0,l), (411,414,l), (377,450,o), (333,479,o), (262,479,cs), (169,479,o), (132,429,o), (121,354,c), (102,354,l) ); } ); width = 501; }, { anchors = ( { name = _connect; pos = (167,0); }, { name = connect; pos = (425,0); } ); associatedMasterId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; layerId = "595FDB8C-ED41-486A-B76A-0FEFEF8BCDD1"; name = NarrowShoulder; partSelection = { crotchDepth = 2; shoulderWidth = 1; }; shapes = ( { closed = 1; nodes = ( (167,246,l), (167,355,o), (203,402,o), (257,402,cs), (285,402,o), (315,390,o), (335,370,c), (335,0,l), (425,0,l), (425,423,l), (395,452,o), (350,490,o), (274,490,cs), (205,490,o), (170,452,o), (155,409,c), (131,409,l) ); } ); width = 528; }, { anchors = ( { name = _connect; pos = (167,0); }, { name = connect; pos = (455,0); } ); associatedMasterId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; layerId = "65575EEB-523C-4A39-985D-FB9ACFE951AF"; name = LowCrotch; partSelection = { crotchDepth = 1; shoulderWidth = 2; }; shapes = ( { closed = 1; nodes = ( (167,216,l), (167,325,o), (203,402,o), (277,402,cs), (315,402,o), (345,390,o), (365,370,c), (365,0,l), (455,0,l), (455,423,l), (425,452,o), (380,490,o), (294,490,cs), (205,490,o), (170,452,o), (155,379,c), (131,379,l) ); } ); width = 528; }, { anchors = ( { name = _connect; pos = (250,0); }, { name = connect; pos = (520,0); } ); associatedMasterId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; layerId = "D607B100-382C-478B-A297-2EF174C3A363"; name = NarrowShoulder; partSelection = { crotchDepth = 2; shoulderWidth = 1; }; shapes = ( { closed = 1; nodes = ( (250,229,l), (250,268,o), (259,283,o), (274,283,cs), (285,283,o), (294,280,o), (300,276,c), (300,0,l), (520,0,l), (520,448,l), (480,478,o), (420,501,o), (347,501,cs), (259,501,o), (209,461,o), (188,401,c), (162,401,l) ); } ); width = 560; }, { anchors = ( { name = _connect; pos = (250,0); }, { name = connect; pos = (530,0); } ); associatedMasterId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; layerId = "BA4F7DF9-9552-48BB-A5B8-E2D21D8D086E"; name = LowCrotch; partSelection = { crotchDepth = 1; shoulderWidth = 2; }; shapes = ( { closed = 1; nodes = ( (250,199,l), (250,251,o), (259,283,o), (284,283,cs), (295,283,o), (304,280,o), (310,276,c), (310,0,l), (530,0,l), (530,448,l), (490,478,o), (430,501,o), (357,501,cs), (259,501,o), (209,461,o), (188,371,c), (162,371,l) ); } ); width = 560; } ); partsSettings = ( { bottomName = Low; bottomValue = -100; name = crotchDepth; topName = High; topValue = 0; }, { bottomName = Low; bottomValue = 0; name = shoulderWidth; topName = High; topValue = 100; } ); } googlefonts-fontmake-7ed5123/tests/data/GlyphsUnitTestSans3.glyphspackage/glyphs/_part.stem.glyph000066400000000000000000000043671470572777600334370ustar00rootroot00000000000000{ export = 0; glyphname = _part.stem; layers = ( { anchors = ( { name = connect; pos = (117,0); } ); layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; partSelection = { height = 1; }; shapes = ( { closed = 1; nodes = ( (119,368,l), (115,470,l), (100,470,l), (100,0,l), (117,0,l), (117,306,l) ); } ); width = 600; }, { anchors = ( { name = connect; pos = (167,0); } ); layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; partSelection = { height = 1; }; shapes = ( { closed = 1; nodes = ( (149,393,l), (139,480,l), (77,480,l), (77,0,l), (167,0,l), (167,286,l) ); } ); width = 600; }, { anchors = ( { name = connect; pos = (250,0); } ); layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; partSelection = { height = 1; }; shapes = ( { closed = 1; nodes = ( (181,385,l), (162,490,l), (30,490,l), (30,0,l), (250,0,l), (250,256,l) ); } ); width = 600; }, { anchors = ( { name = connect; pos = (117,0); } ); associatedMasterId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; layerId = "0D68D3E9-A0B2-4D78-A161-EB65D8511F0A"; name = TallStem; partSelection = { height = 2; }; shapes = ( { closed = 1; nodes = ( (117,368,l), (117,800,l), (100,800,l), (100,0,l), (117,0,l), (117,306,l) ); } ); width = 600; }, { anchors = ( { name = connect; pos = (167,0); } ); associatedMasterId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; layerId = "3E1733D9-3B83-4E6A-B1E9-6381BBE1BD3A"; name = TallStem; partSelection = { height = 2; }; shapes = ( { closed = 1; nodes = ( (167,393,l), (167,800,l), (77,800,l), (77,0,l), (167,0,l), (167,286,l) ); } ); width = 600; }, { anchors = ( { name = connect; pos = (250,0); } ); associatedMasterId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; layerId = "FD65D427-9013-43E2-9F74-398D99AA4763"; name = TallStem; partSelection = { height = 2; }; shapes = ( { closed = 1; nodes = ( (250,385,l), (250,800,l), (30,800,l), (30,0,l), (250,0,l), (250,256,l) ); } ); userData = { com.typemytype.robofont.layerData = { "Regular Nov 6 15, 18:44" = { anchors = ( ); components = ( { baseGlyph = tmA; transformation = ( 1, 0, 0, 1, 0, 0 ); } ); contours = ( { points = ( { smooth = 0; x = 2570; y = -907; } ); } ); lib = { }; name = tmAA; unicodes = ( ); width = 3047; }; }; }; width = 600; } ); partsSettings = ( { bottomName = Low; bottomValue = 0; name = height; topName = High; topValue = 100; } ); } googlefonts-fontmake-7ed5123/tests/data/GlyphsUnitTestSans3.glyphspackage/glyphs/a.glyph000066400000000000000000000140251470572777600315730ustar00rootroot00000000000000{ glyphname = a; kernLeft = a; kernRight = a; layers = ( { anchors = ( { name = bottom; pos = (184,0); }, { name = ogonek; pos = (488,0); }, { name = top; pos = (258,490); } ); background = { shapes = ( { closed = 1; nodes = ( (268,153,ls), (268,123,o), (254,113,o), (236,113,cs), (214,113,o), (205,127,o), (205,143,cs), (205,155,o), (210,164,o), (218,170,cs), (233,181,o), (254,182,o), (275,182,c), (295,289,l), (203,289,o), (123,277,o), (72,240,cs), (40,216,o), (21,182,o), (21,133,cs), (21,49,o), (75,-8,o), (184,-8,cs), (260,-8,o), (301,16,o), (322,49,c), (309,57,l), (336,0,l), (488,0,l), (488,454,l), (437,484,o), (354,505,o), (255,505,cs), (167,505,o), (86,489,o), (25,461,c), (56,298,l), (90,311,o), (134,322,o), (194,322,cs), (225,322,o), (270,319,o), (308,305,c), (268,392,l) ); } ); }; layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; shapes = ( { closed = 1; nodes = ( (268,153,ls), (268,123,o), (254,113,o), (236,113,cs), (214,113,o), (205,127,o), (205,143,cs), (205,155,o), (210,164,o), (218,170,cs), (233,181,o), (254,182,o), (275,182,c), (295,289,l), (203,289,o), (123,277,o), (72,240,cs), (40,216,o), (21,182,o), (21,133,cs), (21,49,o), (75,-8,o), (184,-8,cs), (250,-8,o), (288,12,o), (310,44,c), (320,44,l), (336,0,l), (488,0,l), (488,454,l), (437,484,o), (354,505,o), (255,505,cs), (167,505,o), (86,489,o), (25,461,c), (56,298,l), (90,311,o), (134,322,o), (194,322,cs), (225,322,o), (270,319,o), (308,305,c), (268,392,l) ); } ); width = 518; }, { anchors = ( { name = bottom; pos = (218,0); }, { name = ogonek; pos = (423,0); }, { name = top; pos = (248,480); } ); annotations = ( { pos = (427,535); text = "This is a text annotation"; type = Text; }, { angle = 41.22902; pos = (436,446); type = Arrow; }, { pos = (334.937,407.08); type = Circle; width = 65.05341; }, { pos = (301,49); type = Plus; }, { pos = (372,172); type = Minus; } ); background = { shapes = ( { closed = 1; nodes = ( (333,176,ls), (333,119,o), (309,69,o), (231,69,cs), (170,69,o), (153,99,o), (153,127,cs), (153,152,o), (166,169,o), (183,179,cs), (219,201,o), (284,204,o), (338,204,c), (338,282,l), (249,282,o), (193,276,o), (142,251,cs), (94,227,o), (65,184,o), (65,124,cs), (65,41,o), (119,-11,o), (215,-11,cs), (283,-11,o), (325,14,o), (352,56,c), (330,67,l), (346,0,l), (423,0,l), (423,435,l), (383,468,o), (317,492,o), (237,492,cs), (172,492,o), (117,476,o), (72,460,c), (86,371,l), (122,387,o), (167,400,o), (226,400,cs), (263,400,o), (312,395,o), (353,361,c), (333,454,l) ); } ); }; layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; shapes = ( { closed = 1; nodes = ( (333,176,ls), (333,119,o), (309,69,o), (231,69,cs), (170,69,o), (153,99,o), (153,127,cs), (153,152,o), (166,169,o), (183,179,cs), (219,200,o), (284,204,o), (338,204,c), (338,282,l), (249,282,o), (193,276,o), (142,251,cs), (94,227,o), (65,185,o), (65,125,cs), (65,42,o), (119,-11,o), (215,-11,cs), (277,-11,o), (310,11,o), (330,41,c), (338,41,l), (346,0,l), (423,0,l), (423,435,l), (383,468,o), (316,492,o), (232,492,cs), (171,492,o), (116,479,o), (72,460,c), (86,371,l), (122,388,o), (166,400,o), (225,400,cs), (262,400,o), (312,395,o), (353,361,c), (333,454,l) ); } ); width = 496; }, { anchors = ( { name = bottom; pos = (218,0); }, { name = ogonek; pos = (369,0); }, { name = top; pos = (226,471); } ); background = { shapes = ( { closed = 1; nodes = ( (352,147,ls), (352,68,o), (314,7,o), (212,7,cs), (132,7,o), (97,47,o), (97,105,cs), (97,136,o), (107,160,o), (125,178,cs), (166,219,o), (249,224,o), (355,224,c), (355,241,l), (245,241,o), (158,233,o), (113,190,cs), (92,169,o), (80,141,o), (80,105,cs), (80,39,o), (119,-10,o), (212,-10,cs), (281,-10,o), (336,15,o), (357,83,c), (351,91,l), (354,0,l), (369,0,l), (369,428,l), (333,460,o), (291,480,o), (224,480,cs), (163,480,o), (116,462,o), (82,438,c), (87,423,l), (123,448,o), (167,463,o), (224,463,cs), (284,463,o), (323,445,o), (355,417,c), (352,429,l) ); } ); }; layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; shapes = ( { closed = 1; nodes = ( (352,147,ls,{ name = Hello; rememberToMakeCoffee = "1"; }), (352,68,o), (314,7,o), (212,7,cs), (132,7,o), (97,47,o), (97,105,cs), (97,136,o), (107,160,o), (125,178,cs), (166,219,o), (249,224,o), (355,224,c), (355,241,l), (245,241,o), (158,233,o), (113,190,cs), (92,169,o), (80,141,o), (80,105,cs), (80,39,o), (119,-10,o), (212,-10,cs), (283,-10,o), (334,18,o), (349,68,c), (352,68,l), (354,0,l), (369,0,l), (369,428,l), (333,460,o), (291,480,o), (224,480,cs), (163,480,o), (116,462,o), (82,438,c), (87,423,l), (123,448,o), (167,463,o), (224,463,cs), (284,463,o), (323,445,o), (355,417,c), (352,429,l) ); } ); width = 456; }, { anchors = ( { name = bottom; pos = (189,0); }, { name = ogonek; pos = (446,0); }, { name = top; pos = (237,485); } ); associatedMasterId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; attr = { coordinates = ( 155 ); }; background = { shapes = ( { closed = 1; nodes = ( (291,164,ls), (291,129,o), (272,107,o), (224,107,cs), (182,107,o), (169,123,o), (169,140,cs), (169,155,o), (178,165,o), (191,172,cs), (216,185,o), (259,186,o), (297,186,c), (306,298,l), (216,294,o), (148,288,o), (97,255,cs), (58,230,o), (34,187,o), (34,130,cs), (34,40,o), (87,-10,o), (190,-10,cs), (262,-10,o), (303,15,o), (327,53,c), (310,62,l), (331,0,l), (446,0,l), (446,445,l), (400,476,o), (326,499,o), (236,499,cs), (160,499,o), (92,483,o), (39,461,c), (61,329,l), (96,343,o), (141,355,o), (200,355,cs), (234,355,o), (281,351,o), (321,327,c), (291,423,l) ); } ); }; layerId = "1FA54028-AD2E-4209-AA7B-72DF2DF16264"; name = "{155, 100}"; shapes = ( { closed = 1; nodes = ( (301,174,ls), (301,129,o), (272,107,o), (224,107,cs), (182,107,o), (169,123,o), (169,140,cs), (169,155,o), (178,165,o), (191,172,cs), (216,185,o), (259,186,o), (307,186,c), (306,298,l), (216,294,o), (148,288,o), (97,255,cs), (58,230,o), (34,190,o), (34,132,cs), (34,47,o), (81,-10,o), (190,-10,cs), (252,-10,o), (297,8,o), (320,42,c), (329,42,l), (341,0,l), (446,0,l), (446,445,l), (400,476,o), (326,499,o), (236,499,cs), (160,499,o), (92,483,o), (39,461,c), (61,329,l), (96,343,o), (141,355,o), (200,355,cs), (234,355,o), (281,351,o), (321,327,c), (301,423,l) ); } ); width = 496; } ); metricRight = m; unicode = 97; } googlefonts-fontmake-7ed5123/tests/data/GlyphsUnitTestSans3.glyphspackage/glyphs/a.sc.glyph000066400000000000000000000024341470572777600322000ustar00rootroot00000000000000{ color = 10; glyphname = a.sc; kernLeft = A.sc; kernRight = A.sc; layers = ( { anchors = ( { name = bottom; pos = (307,0); }, { name = ogonek; pos = (608,0); }, { name = top; pos = (307,552); } ); layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; shapes = ( { closed = 1; nodes = ( (461,552,l), (158,552,l), (5,0,l), (208,0,l), (289,351,l), (312,351,l), (395,0,l), (608,0,l) ); }, { closed = 1; nodes = ( (122,234,l), (115,65,l), (495,65,l), (498,234,l) ); } ); width = 613; }, { anchors = ( { name = bottom; pos = (268,0); }, { name = ogonek; pos = (511,0); }, { name = top; pos = (268,540); } ); layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; shapes = ( { closed = 1; nodes = ( (357,540,l), (191,540,l), (24,0,l), (119,0,l), (255,448,l), (277,448,l), (414,0,l), (511,0,l) ); }, { closed = 1; nodes = ( (114,208,l), (111,125,l), (424,125,l), (427,208,l) ); } ); width = 535; }, { anchors = ( { name = bottom; pos = (240,0); }, { name = ogonek; pos = (445,0); }, { name = top; pos = (240,528); } ); layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; shapes = ( { closed = 1; nodes = ( (252,528,l), (228,528,l), (33,0,l), (41,0,l), (234,519,l), (247,519,l), (437,0,l), (445,0,l) ); }, { closed = 1; nodes = ( (99,167,l), (95,159,l), (384,159,l), (380,167,l) ); } ); width = 478; } ); metricRight = "=|"; } googlefonts-fontmake-7ed5123/tests/data/GlyphsUnitTestSans3.glyphspackage/glyphs/adieresis.glyph000066400000000000000000000006751470572777600333310ustar00rootroot00000000000000{ glyphname = adieresis; layers = ( { layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; shapes = ( { ref = a; }, { pos = (39,1); ref = dieresis; } ); width = 456; }, { layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; shapes = ( { ref = a; }, { pos = (47,0); ref = dieresis; } ); width = 496; }, { layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; shapes = ( { ref = a; }, { pos = (-9,0); ref = dieresis; } ); width = 518; } ); unicode = 228; } googlefonts-fontmake-7ed5123/tests/data/GlyphsUnitTestSans3.glyphspackage/glyphs/dieresis.glyph000066400000000000000000000020021470572777600331520ustar00rootroot00000000000000{ glyphname = dieresis; layers = ( { anchors = ( { name = _top; pos = (187,470); }, { name = top; pos = (188,650); } ); layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; shapes = ( { closed = 1; nodes = ( (261,650,l), (261,621,l), (289,621,l), (289,650,l) ); }, { closed = 1; nodes = ( (88,650,l), (88,621,l), (116,621,l), (116,650,l) ); } ); width = 600; }, { anchors = ( { name = _top; pos = (201,480); }, { name = top; pos = (201,700); } ); layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; shapes = ( { closed = 1; nodes = ( (252,700,l), (252,601,l), (349,601,l), (349,700,l) ); }, { closed = 1; nodes = ( (52,700,l), (52,601,l), (149,601,l), (149,700,l) ); } ); width = 600; }, { anchors = ( { name = _top; pos = (267,490); }, { name = top; pos = (267,740); } ); layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; shapes = ( { closed = 1; nodes = ( (298,735,l), (298,547,l), (482,547,l), (482,735,l) ); }, { closed = 1; nodes = ( (48,735,l), (48,547,l), (232,547,l), (232,735,l) ); } ); width = 600; } ); unicode = 168; } googlefonts-fontmake-7ed5123/tests/data/GlyphsUnitTestSans3.glyphspackage/glyphs/h.glyph000066400000000000000000000013741470572777600316050ustar00rootroot00000000000000{ glyphname = h; layers = ( { layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; shapes = ( { alignment = -1; piece = { height = 100; }; ref = _part.stem; }, { alignment = -1; piece = { crotchDepth = -80.20097; }; ref = _part.shoulder; } ); width = 511; }, { layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; shapes = ( { alignment = -1; piece = { height = 100; }; ref = _part.stem; }, { alignment = -1; piece = { crotchDepth = -80.20097; }; ref = _part.shoulder; } ); width = 532; }, { layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; shapes = ( { alignment = -1; piece = { height = 100; }; ref = _part.stem; }, { alignment = -1; piece = { crotchDepth = -80.20097; }; ref = _part.shoulder; } ); width = 560; } ); metricLeft = m; metricRight = m; unicode = 104; } googlefonts-fontmake-7ed5123/tests/data/GlyphsUnitTestSans3.glyphspackage/glyphs/m.glyph000066400000000000000000000016061470572777600316100ustar00rootroot00000000000000{ glyphname = m; layers = ( { layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; shapes = ( { alignment = -1; ref = _part.stem; }, { alignment = -1; piece = { shoulderWidth = 0; }; ref = _part.shoulder; }, { alignment = -1; piece = { shoulderWidth = 0; }; pos = (264,0); ref = _part.shoulder; } ); width = 745; }, { layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; shapes = ( { alignment = -1; ref = _part.stem; }, { alignment = -1; piece = { shoulderWidth = 0; }; ref = _part.shoulder; }, { alignment = -1; piece = { shoulderWidth = 0; }; pos = (270,0); ref = _part.shoulder; } ); width = 820; }, { layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; shapes = ( { alignment = -1; ref = _part.stem; }, { alignment = -1; piece = { shoulderWidth = 0; }; ref = _part.shoulder; }, { alignment = -1; piece = { shoulderWidth = 0; }; pos = (258,0); ref = _part.shoulder; } ); width = 760; } ); unicode = 109; } googlefonts-fontmake-7ed5123/tests/data/GlyphsUnitTestSans3.glyphspackage/glyphs/n.glyph000066400000000000000000000030541470572777600316100ustar00rootroot00000000000000{ glyphname = n; kernLeft = n; kernRight = n; layers = ( { background = { shapes = ( { closed = 1; nodes = ( (250,0,l), (250,240,ls), (250,272,o), (264,283,o), (284,283,cs), (295,283,o), (304,280,o), (310,276,c), (310,0,l), (530,0,l), (530,448,l), (490,478,o), (430,501,o), (357,501,cs), (256,501,o), (199,459,o), (173,386,c), (197,366,l), (162,490,l), (30,490,l), (30,0,l) ); } ); }; layerId = "BFFFD157-90D3-4B85-B99D-9A2F366F03CA"; shapes = ( { alignment = -1; ref = _part.shoulder; }, { alignment = -1; ref = _part.stem; } ); width = 560; }, { background = { shapes = ( { closed = 1; nodes = ( (167,0,l), (167,270,ls), (167,362,o), (209,402,o), (277,402,cs), (315,402,o), (345,390,o), (365,370,c), (365,0,l), (455,0,l), (455,423,l), (423,454,o), (374,490,o), (288,490,cs), (199,490,o), (150,452,o), (139,382,c), (159,356,l), (139,480,l), (77,480,l), (77,0,l) ); } ); }; layerId = "3E7589AA-8194-470F-8E2F-13C1C581BE24"; shapes = ( { alignment = -1; ref = _part.shoulder; }, { alignment = -1; ref = _part.stem; } ); width = 528; }, { background = { shapes = ( { closed = 1; nodes = ( (117,0,l), (117,322,ls), (117,435,o), (175,491,o), (270,491,cs), (324,491,o), (366,474,o), (394,445,c), (394,-1,l), (411,-1,l), (411,435,l), (378,475,o), (340,509,o), (263,509,cs), (180,509,o), (133,468,o), (117,406,c), (134,376,l), (123,500,l), (100,500,l), (100,0,l) ); } ); }; layerId = "C4872ECA-A3A9-40AB-960A-1DB2202F16DE"; shapes = ( { alignment = -1; ref = _part.shoulder; }, { alignment = -1; ref = _part.stem; } ); width = 501; } ); metricLeft = m; metricRight = m; unicode = 110; } googlefonts-fontmake-7ed5123/tests/data/GlyphsUnitTestSans3.glyphspackage/order.plist000066400000000000000000000001231470572777600311620ustar00rootroot00000000000000( A, Adieresis, a, adieresis, h, m, n, a.sc, dieresis, _part.shoulder, _part.stem )googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/000077500000000000000000000000001470572777600235325ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Bold.ufo/000077500000000000000000000000001470572777600304335ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Bold.ufo/features.fea000066400000000000000000000001451470572777600327260ustar00rootroot00000000000000table GDEF { # automatic GlyphClassDef [A C], # Base , # Liga , # Mark ; } GDEF; googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Bold.ufo/fontinfo.plist000066400000000000000000000022061470572777600333320ustar00rootroot00000000000000 ascender 800 capHeight 700 descender -200 familyName Incompatible Sans italicAngle 0 openTypeHeadCreated 2021/12/09 10:23:05 openTypeOS2Type 3 postscriptUnderlinePosition -100 postscriptUnderlineThickness 50 styleMapFamilyName Incompatible Sans styleMapStyleName bold styleName Bold unitsPerEm 1000 versionMajor 1 versionMinor 0 xHeight 500 googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Bold.ufo/glyphs/000077500000000000000000000000001470572777600317415ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Bold.ufo/glyphs/A_.glif000066400000000000000000000022541470572777600331260ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Bold.ufo/glyphs/B_.glif000066400000000000000000000010601470572777600331210ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Bold.ufo/glyphs/C_.glif000066400000000000000000000003271470572777600331270ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Bold.ufo/glyphs/D_.glif000066400000000000000000000012661470572777600331330ustar00rootroot00000000000000 contents.plist000066400000000000000000000006551470572777600346020ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Bold.ufo/glyphs A A_.glif B B_.glif C C_.glif D D_.glif space space.glif googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Bold.ufo/glyphs/space.glif000066400000000000000000000002321470572777600336740ustar00rootroot00000000000000 layercontents.plist000066400000000000000000000004371470572777600343270ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Bold.ufo public.default glyphs googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Bold.ufo/lib.plist000066400000000000000000000041011470572777600322520ustar00rootroot00000000000000 com.github.googlei18n.ufo2ft.filters name eraseOpenCorners namespace glyphsLib.filters pre com.schriftgestaltung.appVersion 3091 com.schriftgestaltung.customParameter.GSFont.disablesAutomaticAlignment com.schriftgestaltung.customParameter.GSFont.useNiceNames 1 com.schriftgestaltung.customParameter.GSFontMaster.customValue 0 com.schriftgestaltung.customParameter.GSFontMaster.customValue1 0 com.schriftgestaltung.customParameter.GSFontMaster.customValue2 0 com.schriftgestaltung.customParameter.GSFontMaster.customValue3 0 com.schriftgestaltung.customParameter.GSFontMaster.iconName Bold com.schriftgestaltung.customParameter.GSFontMaster.weightValue 1000 com.schriftgestaltung.customParameter.GSFontMaster.widthValue 100 com.schriftgestaltung.fontMasterOrder 1 com.schriftgestaltung.keyboardIncrement 1 com.schriftgestaltung.weight Regular com.schriftgestaltung.weightValue 1000 com.schriftgestaltung.width Regular com.schriftgestaltung.widthValue 100 public.glyphOrder A B C D space googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Bold.ufo/metainfo.plist000066400000000000000000000004761470572777600333210ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Regular.ufo/000077500000000000000000000000001470572777600311545ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Regular.ufo/fontinfo.plist000066400000000000000000000022101470572777600340460ustar00rootroot00000000000000 ascender 800 capHeight 0 descender -200 familyName Incompatible Sans italicAngle 0 openTypeHeadCreated 2021/12/09 10:23:05 openTypeOS2Type 3 postscriptUnderlinePosition -100 postscriptUnderlineThickness 50 styleMapFamilyName Incompatible Sans styleMapStyleName regular styleName Regular unitsPerEm 1000 versionMajor 1 versionMinor 0 xHeight 0 googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Regular.ufo/glyphs/000077500000000000000000000000001470572777600324625ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Regular.ufo/glyphs/A_.glif000066400000000000000000000015751470572777600336540ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Regular.ufo/glyphs/B_.glif000066400000000000000000000012141470572777600336430ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Regular.ufo/glyphs/C_.glif000066400000000000000000000003311470572777600336430ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Regular.ufo/glyphs/D_.glif000066400000000000000000000012141470572777600336450ustar00rootroot00000000000000 contents.plist000066400000000000000000000006551470572777600353230ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Regular.ufo/glyphs A A_.glif B B_.glif C C_.glif D D_.glif space space.glif space.glif000066400000000000000000000002321470572777600343360ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Regular.ufo/glyphs layercontents.plist000066400000000000000000000004371470572777600350500ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Regular.ufo public.default glyphs googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Regular.ufo/lib.plist000066400000000000000000000040731470572777600330030ustar00rootroot00000000000000 com.github.googlei18n.ufo2ft.filters name eraseOpenCorners namespace glyphsLib.filters pre com.schriftgestaltung.appVersion 3091 com.schriftgestaltung.customParameter.GSFont.disablesAutomaticAlignment com.schriftgestaltung.customParameter.GSFont.useNiceNames 1 com.schriftgestaltung.customParameter.GSFontMaster.customValue 0 com.schriftgestaltung.customParameter.GSFontMaster.customValue1 0 com.schriftgestaltung.customParameter.GSFontMaster.customValue2 0 com.schriftgestaltung.customParameter.GSFontMaster.customValue3 0 com.schriftgestaltung.customParameter.GSFontMaster.iconName com.schriftgestaltung.customParameter.GSFontMaster.weightValue 200 com.schriftgestaltung.customParameter.GSFontMaster.widthValue 100 com.schriftgestaltung.fontMasterOrder 0 com.schriftgestaltung.keyboardIncrement 1 com.schriftgestaltung.weight Regular com.schriftgestaltung.weightValue 200 com.schriftgestaltung.width Regular com.schriftgestaltung.widthValue 100 public.glyphOrder A B C D space googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans-Regular.ufo/metainfo.plist000066400000000000000000000004761470572777600340420ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/IncompatibleSans/IncompatibleSans.designspace000066400000000000000000000013721470572777600311770ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/000077500000000000000000000000001470572777600257655ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareOne.ufo/000077500000000000000000000000001470572777600304575ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareOne.ufo/fontinfo.plist000066400000000000000000000016011470572777600333540ustar00rootroot00000000000000 ascender 750 capHeight 750 descender -250 familyName Test Ufo guidelines postscriptBlueValues postscriptFamilyBlues postscriptFamilyOtherBlues postscriptOtherBlues postscriptStemSnapH postscriptStemSnapV styleName Bold unitsPerEm 1000 xHeight 500 googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareOne.ufo/glyphs/000077500000000000000000000000001470572777600317655ustar00rootroot00000000000000contents.plist000066400000000000000000000003631470572777600346220ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareOne.ufo/glyphs test test.glif layerinfo.plist000066400000000000000000000003671470572777600347610ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareOne.ufo/glyphs color 1,0.75,0,0.7 googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareOne.ufo/glyphs/test.glif000066400000000000000000000014021470572777600336040ustar00rootroot00000000000000 layercontents.plist000066400000000000000000000004331470572777600343470ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareOne.ufo foreground glyphs googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareOne.ufo/lib.plist000066400000000000000000000020061470572777600323000ustar00rootroot00000000000000 com.typemytype.robofont.compileSettings.autohint com.typemytype.robofont.compileSettings.checkOutlines com.typemytype.robofont.compileSettings.createDummyDSIG com.typemytype.robofont.compileSettings.decompose com.typemytype.robofont.compileSettings.generateFormat 0 com.typemytype.robofont.compileSettings.releaseMode com.typemytype.robofont.italicSlantOffset 0 com.typemytype.robofont.segmentType curve com.typemytype.robofont.shouldAddPointsInSplineConversion 1 public.glyphOrder test googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareOne.ufo/metainfo.plist000066400000000000000000000004761470572777600333450ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareTwo.ufo/000077500000000000000000000000001470572777600305075ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareTwo.ufo/fontinfo.plist000066400000000000000000000016041470572777600334070ustar00rootroot00000000000000 ascender 750 capHeight 750 descender -250 familyName Test Ufo guidelines postscriptBlueValues postscriptFamilyBlues postscriptFamilyOtherBlues postscriptOtherBlues postscriptStemSnapH postscriptStemSnapV styleName Regular unitsPerEm 1000 xHeight 500 googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareTwo.ufo/glyphs/000077500000000000000000000000001470572777600320155ustar00rootroot00000000000000contents.plist000066400000000000000000000003631470572777600346520ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareTwo.ufo/glyphs test test.glif layerinfo.plist000066400000000000000000000003671470572777600350110ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareTwo.ufo/glyphs color 1,0.75,0,0.7 googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareTwo.ufo/glyphs/test.glif000066400000000000000000000014221470572777600336360ustar00rootroot00000000000000 layercontents.plist000066400000000000000000000004331470572777600343770ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareTwo.ufo foreground glyphs googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareTwo.ufo/lib.plist000066400000000000000000000020061470572777600323300ustar00rootroot00000000000000 com.typemytype.robofont.compileSettings.autohint com.typemytype.robofont.compileSettings.checkOutlines com.typemytype.robofont.compileSettings.createDummyDSIG com.typemytype.robofont.compileSettings.decompose com.typemytype.robofont.compileSettings.generateFormat 0 com.typemytype.robofont.compileSettings.releaseMode com.typemytype.robofont.italicSlantOffset 0 com.typemytype.robofont.segmentType curve com.typemytype.robofont.shouldAddPointsInSplineConversion 1 public.glyphOrder test googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/SquareTwo.ufo/metainfo.plist000066400000000000000000000004761470572777600333750ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/InstantiatorStrictMathGlyph/StrictMathGlyph.designspace000066400000000000000000000014761470572777600332720ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/IntermediateComponents.glyphs000066400000000000000000000340311470572777600262100ustar00rootroot00000000000000{ .appVersion = "3248"; .formatVersion = 3; axes = ( { name = Weight; tag = wght; } ); customParameters = ( { name = "Write DisplayStrings"; value = 0; }, { name = "Write lastChange"; value = 0; } ); date = "2024-02-20 10:47:07 +0000"; familyName = "Intermediate Components Test"; fontMaster = ( { axesValues = ( 400 ); id = m01; metricValues = ( { over = 16; pos = 800; }, { over = 16; pos = 700; }, { over = 16; pos = 500; }, { over = -16; }, { over = -16; pos = -200; }, { } ); name = Regular; }, { axesValues = ( 900 ); iconName = Bold; id = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; metricValues = ( { over = 16; pos = 800; }, { over = 16; pos = 700; }, { over = 16; pos = 500; }, { over = -16; }, { over = -16; pos = -200; }, { } ); name = Black; } ); glyphs = ( { color = 0; glyphname = a; layers = ( { anchors = ( { name = bottom; pos = (194,-14); }, { name = cedilla; pos = (352,0); }, { name = top; pos = (221,534); } ); layerId = m01; shapes = ( { closed = 1; nodes = ( (380,-16,l), (382,377,l), (219,503,l), (30,369,l), (92,362,l), (206,454,l), (320,367,l), (316,-16,l) ); }, { closed = 1; nodes = ( (352,58,l), (341,100,l), (127,24,l), (76,50,l), (65,130,l), (117,179,l), (339,194,l), (339,231,l), (110,215,l), (19,142,l), (30,13,l), (118,-35,l) ); } ); width = 400; }, { anchors = ( { name = bottom; pos = (208,-14); }, { name = cedilla; pos = (363,0); }, { name = top; pos = (234,552); } ); layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { closed = 1; nodes = ( (439,-16,l), (437,441,l), (241,511,l), (19,404,l), (75,279,l), (229,362,l), (285,342,l), (285,-26,l) ); }, { closed = 1; nodes = ( (376,32,l), (362,106,l), (213,69,l), (182,93,l), (172,135,l), (194,168,l), (356,172,l), (356,260,l), (121,260,l), (19,179,l), (19,13,l), (135,-35,l) ); } ); width = 450; } ); unicode = 97; }, { color = 4; glyphname = aacute; layers = ( { layerId = m01; shapes = ( { ref = a; }, { pos = (67,-30); ref = acutecomb; } ); width = 400; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = a; }, { pos = (93,-12); ref = acutecomb; } ); width = 450; }, { associatedMasterId = m01; attr = { coordinates = ( 500 ); }; layerId = "28A9017D-3591-4F21-A420-4F561DE5E624"; name = "20 Feb 24 at 12:22"; shapes = ( { ref = a; }, { alignment = -1; pos = (21,-206); ref = acutecomb; } ); width = 410; } ); unicode = 225; }, { color = 9; glyphname = i; layers = ( { anchors = ( { name = bottom; pos = (150,0); }, { name = top; pos = (158,658); } ); layerId = m01; shapes = ( { ref = idotless; }, { closed = 1; nodes = ( (179,555,o), (198,574,o), (198,598,cs), (198,621,o), (179,640,o), (156,640,cs), (132,640,o), (113,621,o), (113,598,cs), (113,574,o), (132,555,o), (156,555,cs) ); } ); width = 300; }, { anchors = ( { name = bottom; pos = (175,0); }, { name = top; pos = (188,736); } ); layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = idotless; }, { closed = 1; nodes = ( (229,555,o), (261,587,o), (261,629,cs), (261,668,o), (229,701,o), (189,701,cs), (148,701,o), (115,668,o), (115,629,cs), (115,587,o), (148,555,o), (189,555,cs) ); } ); width = 350; } ); unicode = 105; }, { color = 0; glyphname = idotless; layers = ( { anchors = ( { name = bottom; pos = (154,-30); }, { name = top; pos = (149,557); } ); layerId = m01; shapes = ( { closed = 1; nodes = ( (181,-12,l), (185,516,l), (118,515,l), (117,-12,l) ); } ); width = 300; }, { anchors = ( { name = bottom; pos = (172,-45); }, { name = top; pos = (192,549); } ); layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { closed = 1; nodes = ( (251,-12,l), (255,516,l), (108,515,l), (107,-12,l) ); } ); width = 350; }, { anchors = ( { name = bottom; pos = (172,-40); }, { name = top; pos = (175,552); } ); associatedMasterId = m01; attr = { coordinates = ( 700 ); }; layerId = "84803E96-8331-4B52-8DF0-C5C0A276FC0E"; name = "20 Feb 24 at 11:59"; shapes = ( { closed = 1; nodes = ( (223,-12,l), (167,515,l), (167,515,l), (111,-12,l) ); } ); width = 330; } ); unicode = 305; }, { color = 4; glyphname = iacute; layers = ( { layerId = m01; shapes = ( { ref = idotless; }, { pos = (-5,-7); ref = acutecomb; } ); width = 300; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = idotless; }, { pos = (51,-15); ref = acutecomb; } ); width = 350; } ); unicode = 237; }, { color = 4; glyphname = imacron; layers = ( { layerId = m01; shapes = ( { ref = idotless; }, { pos = (-28,-39); ref = macroncomb; } ); width = 300; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = idotless; }, { pos = (15,-37); ref = macroncomb; } ); width = 350; } ); unicode = 299; }, { color = 0; glyphname = n; layers = ( { anchors = ( { name = bottom; pos = (245,3); }, { name = top; pos = (278,585); } ); layerId = m01; shapes = ( { closed = 1; nodes = ( (91,514,l), (91,1,l), (17,0,l), (20,518,l) ); }, { closed = 1; nodes = ( (197,536,l), (293,553,l), (397,541,l), (482,442,l), (478,3,l), (400,0,l), (408,435,l), (350,485,l), (306,490,l), (235,479,l), (61,379,l), (44,415,l) ); } ); width = 500; }, { anchors = ( { name = bottom; pos = (272,1); }, { name = top; pos = (287,610); } ); layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { closed = 1; nodes = ( (160,514,l), (160,1,l), (29,-2,l), (32,516,l) ); }, { closed = 1; nodes = ( (243,536,l), (332,553,l), (436,541,l), (521,442,l), (517,3,l), (379,0,l), (387,405,l), (339,455,l), (315,460,l), (244,449,l), (100,379,l), (83,415,l) ); } ); width = 550; } ); unicode = 110; }, { color = 4; glyphname = nacute; layers = ( { layerId = m01; shapes = ( { ref = n; }, { pos = (124,21); ref = acutecomb; } ); width = 500; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = n; }, { pos = (146,46); ref = acutecomb; } ); width = 550; } ); unicode = 324; }, { color = 4; glyphname = ncommaaccent; layers = ( { layerId = m01; shapes = ( { ref = n; }, { pos = (56,3); ref = commaaccentcomb; } ); width = 500; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = n; }, { pos = (79,1); ref = commaaccentcomb; } ); width = 550; } ); unicode = 326; }, { color = 4; glyphname = nmacronbelow; layers = ( { layerId = m01; shapes = ( { ref = n; }, { pos = (52,34); ref = macronbelowcomb; } ); width = 500; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = n; }, { pos = (79,25); ref = macronbelowcomb; } ); width = 550; }, { associatedMasterId = m01; attr = { coordinates = ( 600 ); }; layerId = "4228318B-F98E-4B70-9AB2-553F56895EBF"; name = "11 Mar 24 at 18:33"; shapes = ( { ref = n; }, { alignment = -1; pos = (63,111); ref = macronbelowcomb; } ); width = 520; } ); unicode = 7753; }, { category = Letter; color = 9; glyphname = aacutemacronbelowcedilla; layers = ( { layerId = m01; shapes = ( { ref = aacutecedilla; }, { alignment = -1; pos = (-76,3); ref = macronbelowcomb; } ); width = 400; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = aacutecedilla; }, { alignment = -1; pos = (3,-61); ref = macronbelowcomb; scale = (0.7124,0.4629); } ); width = 450; } ); script = latin; unicode = 57360; }, { category = Letter; color = 4; glyphname = acedilla; layers = ( { layerId = m01; shapes = ( { ref = a; }, { pos = (175,0); ref = cedillacomb; } ); width = 400; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = a; }, { pos = (195,0); ref = cedillacomb; } ); width = 450; } ); script = latin; unicode = 57344; }, { category = Letter; color = 4; glyphname = iacutecedilla; layers = ( { layerId = m01; shapes = ( { ref = iacute; }, { pos = (-28,0); ref = cedillacomb; } ); width = 300; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = iacute; }, { pos = (20,0); ref = cedillacomb; } ); width = 350; } ); script = latin; unicode = 57346; }, { category = Letter; color = 4; glyphname = icedilla; layers = ( { layerId = m01; shapes = ( { ref = i; }, { pos = (-24,0); ref = cedillacomb; } ); width = 300; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = i; }, { pos = (11,0); ref = cedillacomb; } ); width = 350; } ); script = latin; unicode = 57347; }, { category = Letter; color = 4; glyphname = acommaaccent; layers = ( { layerId = m01; shapes = ( { ref = a; }, { pos = (5,-14); ref = commaaccentcomb; } ); width = 400; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = a; }, { pos = (15,-14); ref = commaaccentcomb; } ); width = 450; } ); script = latin; unicode = 57348; }, { category = Letter; color = 4; glyphname = icommaaccent; layers = ( { layerId = m01; shapes = ( { ref = i; }, { pos = (-39,0); ref = commaaccentcomb; } ); width = 300; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = i; }, { pos = (-18,0); ref = commaaccentcomb; } ); width = 350; } ); script = latin; unicode = 57349; }, { category = Letter; color = 4; glyphname = aacutecommaaccent; layers = ( { layerId = m01; shapes = ( { ref = aacute; }, { pos = (5,-14); ref = commaaccentcomb; } ); width = 400; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = aacute; }, { pos = (15,-14); ref = commaaccentcomb; } ); width = 450; } ); script = latin; unicode = 57350; }, { category = Letter; color = 4; glyphname = imacroncommaaccent; layers = ( { layerId = m01; shapes = ( { ref = imacron; }, { pos = (-35,-30); ref = commaaccentcomb; } ); width = 300; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = imacron; }, { pos = (-21,-45); ref = commaaccentcomb; } ); width = 350; } ); script = latin; unicode = 57351; }, { category = Letter; color = 4; glyphname = nacutemacronbelow; layers = ( { layerId = m01; shapes = ( { ref = nmacronbelow; }, { pos = (124,21); ref = acutecomb; } ); width = 500; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = nmacronbelow; }, { pos = (146,46); ref = acutecomb; } ); width = 550; } ); script = latin; unicode = 57352; }, { category = Letter; color = 4; glyphname = aacutecommaaccentcedilla; layers = ( { layerId = m01; shapes = ( { ref = aacutecommaaccent; }, { pos = (175,0); ref = cedillacomb; } ); width = 400; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = aacutecommaaccent; }, { pos = (195,0); ref = cedillacomb; } ); width = 450; } ); script = latin; unicode = 57353; }, { category = Letter; color = 9; glyphname = aacutecedilla; layers = ( { layerId = m01; shapes = ( { ref = aacute; }, { pos = (175,0); ref = cedillacomb; } ); width = 400; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { ref = aacute; }, { pos = (195,0); ref = cedillacomb; } ); width = 450; }, { associatedMasterId = m01; attr = { coordinates = ( 600 ); }; layerId = "45B59D28-86B9-4171-9329-C3E9A74583BB"; name = "20 Feb 24 at 12:09"; shapes = ( { alignment = -1; ref = aacute; }, { pos = (283,0); ref = cedillacomb; scale = (0.4241,0.4241); } ); width = 420; } ); script = Latin; unicode = 57345; }, { glyphname = space; layers = ( { layerId = m01; width = 200; }, { layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; width = 600; } ); unicode = 32; }, { color = 0; glyphname = acutecomb; layers = ( { anchors = ( { name = _top; pos = (154,564); }, { name = top; pos = (161,763); } ); layerId = m01; shapes = ( { closed = 1; nodes = ( (181,596,l), (275,726,l), (198,730,l), (136,595,l) ); } ); width = 300; }, { anchors = ( { name = _top; pos = (141,564); }, { name = top; pos = (161,763); } ); layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { closed = 1; nodes = ( (191,595,l), (282,730,l), (158,730,l), (96,595,l) ); } ); width = 300; } ); unicode = 769; }, { color = 0; glyphname = macroncomb; layers = ( { anchors = ( { name = _top; pos = (177,596); }, { name = top; pos = (184,713); } ); layerId = m01; shapes = ( { closed = 1; nodes = ( (331,693,l), (332,647,l), (73,647,l), (73,692,l) ); } ); width = 300; }, { anchors = ( { name = _top; pos = (177,586); }, { name = top; pos = (184,713); } ); layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { closed = 1; nodes = ( (331,693,l), (332,617,l), (73,617,l), (73,692,l) ); } ); width = 300; }, { anchors = ( { name = _top; pos = (155,589); }, { name = top; pos = (195,700); } ); associatedMasterId = m01; attr = { coordinates = ( 800 ); }; layerId = "10263F3F-EF44-4FC8-A0AE-228E855659CC"; name = "20 Feb 24 at 12:47"; shapes = ( { closed = 1; nodes = ( (295,631,l), (278,583,l), (70,655,l), (90,700,l) ); } ); width = 300; } ); unicode = 772; }, { color = 0; glyphname = commaaccentcomb; layers = ( { anchors = ( { name = _bottom; pos = (189,0); }, { name = bottom; pos = (159,-250); } ); layerId = m01; shapes = ( { closed = 1; nodes = ( (223,-49,l), (165,-218,l), (116,-216,l), (155,-49,l) ); } ); width = 300; }, { anchors = ( { name = _bottom; pos = (193,0); }, { name = bottom; pos = (150,-250); } ); layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { closed = 1; nodes = ( (251,-49,l), (165,-218,l), (86,-218,l), (123,-49,l) ); } ); width = 300; } ); unicode = 806; }, { color = 0; glyphname = cedillacomb; layers = ( { anchors = ( { name = _cedilla; pos = (177,0); } ); layerId = m01; shapes = ( { closed = 1; nodes = ( (222,-225,l), (279,-177,l), (279,-112,l), (222,-72,l), (167,-72,l), (198,10,l), (162,7,l), (118,-112,l), (204,-111,l), (229,-131,l), (229,-166,l), (193,-194,l), (134,-211,l), (153,-255,l) ); } ); width = 300; }, { anchors = ( { name = _cedilla; pos = (168,0); } ); layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { closed = 1; nodes = ( (230,-242,l), (297,-191,l), (297,-103,l), (246,-57,l), (189,-57,l), (216,7,l), (126,8,l), (119,-129,l), (184,-122,l), (209,-139,l), (209,-155,l), (181,-175,l), (119,-166,l), (141,-259,l) ); } ); width = 300; } ); unicode = 807; }, { color = 4; glyphname = macronbelowcomb; layers = ( { anchors = ( { name = _bottom; pos = (193,-31); }, { name = bottom; pos = (199,-148); } ); layerId = m01; shapes = ( { pos = (9,-761); ref = macroncomb; } ); width = 300; }, { anchors = ( { name = _bottom; pos = (193,-24); }, { name = bottom; pos = (199,-148); } ); layerId = "5F8E3757-2AF7-4D82-9CFF-6C7BC2EAC67D"; shapes = ( { pos = (0,-741); ref = macroncomb; } ); width = 300; } ); unicode = 817; } ); metrics = ( { type = ascender; }, { type = "cap height"; }, { type = "x-height"; }, { type = baseline; }, { type = descender; }, { type = "italic angle"; } ); unitsPerEm = 1000; versionMajor = 1; versionMinor = 0; } googlefonts-fontmake-7ed5123/tests/data/InterpolateLayoutTest/000077500000000000000000000000001470572777600246235ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/InterpolateLayoutTest/InterpolateLayoutTest 0 GPOS.txt000066400000000000000000000003661470572777600325660ustar00rootroot00000000000000FontDame GPOS table % InterpolateLayoutTest - weight:0 EM 1000 script table begin DFLT default 0 latn default 0 script table end feature table begin 0 kern kern-latn feature table end lookup kern-latn pair left x advance V a -12 lookup end googlefonts-fontmake-7ed5123/tests/data/InterpolateLayoutTest/InterpolateLayoutTest 1000 GPOS.txt000066400000000000000000000003711470572777600330030ustar00rootroot00000000000000FontDame GPOS table % InterpolateLayoutTest - weight:1000 EM 1000 script table begin DFLT default 0 latn default 0 script table end feature table begin 0 kern kern-latn feature table end lookup kern-latn pair left x advance V a -40 lookup end googlefonts-fontmake-7ed5123/tests/data/InterpolateLayoutTest/InterpolateLayoutTest GDEF.txt000066400000000000000000000001111470572777600323670ustar00rootroot00000000000000FontDame GDEF table class definition begin V 1 a 1 class definition end googlefonts-fontmake-7ed5123/tests/data/InterpolateLayoutTest/InterpolateLayoutTest GSUB.txt000066400000000000000000000001341470572777600324270ustar00rootroot00000000000000FontDame GSUB table EM 1000 script table begin DFLT default latn default script table end googlefonts-fontmake-7ed5123/tests/data/InterpolateLayoutTest/InterpolateLayoutTest.glyphs000066400000000000000000000153701470572777600324050ustar00rootroot00000000000000{ .appVersion = "1008"; customParameters = ( { name = vendorID; value = ADBO; } ); date = "2017-04-11 12:06:06 +0000"; designer = "Paul D. Hunt"; disablesAutomaticAlignment = 1; disablesNiceNames = 1; familyName = InterpolateLayoutTest; featurePrefixes = ( { code = ""; name = Prefix; } ); fontMaster = ( { ascender = 722; capHeight = 660; customParameters = ( { name = typoAscender; value = 750; }, { name = typoDescender; value = -250; }, { name = typoLineGap; value = 0; }, { name = hheaAscender; value = 984; }, { name = hheaDescender; value = -273; }, { name = hheaLineGap; value = 0; }, { name = winAscent; value = 984; }, { name = winDescent; value = 273; }, { name = underlineThickness; value = 50; }, { name = underlinePosition; value = -75; } ); descender = -222; horizontalStems = ( 28, 40 ); id = "F391A38D-09EE-4697-93B1-BD76E14F8F30"; verticalStems = ( 32, 48 ); weight = Light; weightValue = 0; xHeight = 478; }, { ascender = 696; capHeight = 650; customParameters = ( { name = typoAscender; value = 750; }, { name = typoDescender; value = -250; }, { name = typoLineGap; value = 0; }, { name = hheaAscender; value = 984; }, { name = hheaDescender; value = -273; }, { name = hheaLineGap; value = 0; }, { name = winAscent; value = 984; }, { name = winDescent; value = 273; }, { name = underlineThickness; value = 50; }, { name = underlinePosition; value = -75; } ); descender = -176; horizontalStems = ( 134, 144 ); id = "AF818D18-A4CE-4FD4-8AD5-FA156C77929B"; verticalStems = ( 172, 176 ); weight = Bold; weightValue = 1000; xHeight = 500; } ); glyphs = ( { glyphname = V; lastChange = "2017-04-11 12:29:38 +0000"; layers = ( { anchors = ( { name = aboveUC; position = "{240, 682}"; }, { name = belowLC; position = "{244, -22}"; } ); layerId = "F391A38D-09EE-4697-93B1-BD76E14F8F30"; paths = ( { closed = 1; nodes = ( "226 0 LINE", "258 0 LINE", "476 660 LINE", "444 660 LINE", "316 264 LINE SMOOTH", "290 182 OFFCURVE", "272 122 OFFCURVE", "244 41 CURVE", "240 41 LINE", "212 122 OFFCURVE", "194 182 OFFCURVE", "168 264 CURVE SMOOTH", "40 660 LINE", "6 660 LINE" ); } ); width = 482; }, { anchors = ( { name = aboveUC; position = "{286, 672}"; }, { name = belowLC; position = "{282, -22}"; } ); layerId = "AF818D18-A4CE-4FD4-8AD5-FA156C77929B"; paths = ( { closed = 1; nodes = ( "182 0 LINE", "390 0 LINE", "582 650 LINE", "406 650 LINE", "340 366 LINE SMOOTH", "323 297 OFFCURVE", "310 230 OFFCURVE", "292 160 CURVE", "288 160 LINE", "270 230 OFFCURVE", "258 297 OFFCURVE", "240 366 CURVE SMOOTH", "172 650 LINE", "-10 650 LINE" ); } ); width = 572; } ); unicode = 0056; }, { glyphname = a; lastChange = "2017-04-11 12:07:34 +0000"; layers = ( { layerId = "F391A38D-09EE-4697-93B1-BD76E14F8F30"; paths = ( { closed = 1; nodes = ( "262 -12 OFFCURVE", "322 24 OFFCURVE", "372 64 CURVE", "374 64 LINE", "378 0 LINE", "404 0 LINE", "404 310 LINE SMOOTH", "404 406 OFFCURVE", "370 490 OFFCURVE", "258 490 CURVE SMOOTH", "180 490 OFFCURVE", "114 450 OFFCURVE", "84 428 CURVE", "100 404 LINE", "130 428 OFFCURVE", "188 462 OFFCURVE", "256 462 CURVE SMOOTH", "356 462 OFFCURVE", "376 376 OFFCURVE", "374 298 CURVE", "158 274 OFFCURVE", "60 224 OFFCURVE", "60 117 CURVE SMOOTH", "60 26 OFFCURVE", "124 -12 OFFCURVE", "198 -12 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "142 16 OFFCURVE", "92 44 OFFCURVE", "92 118 CURVE SMOOTH", "92 200 OFFCURVE", "164 248 OFFCURVE", "374 272 CURVE", "374 98 LINE", "310 44 OFFCURVE", "258 16 OFFCURVE", "200 16 CURVE SMOOTH" ); } ); width = 486; }, { layerId = "AF818D18-A4CE-4FD4-8AD5-FA156C77929B"; paths = ( { closed = 1; nodes = ( "242 -12 OFFCURVE", "286 12 OFFCURVE", "326 48 CURVE", "330 48 LINE", "342 0 LINE", "482 0 LINE", "482 278 LINE SMOOTH", "482 442 OFFCURVE", "404 512 OFFCURVE", "274 512 CURVE SMOOTH", "196 512 OFFCURVE", "124 488 OFFCURVE", "54 446 CURVE", "114 334 LINE", "166 362 OFFCURVE", "204 376 OFFCURVE", "240 376 CURVE SMOOTH", "284 376 OFFCURVE", "306 360 OFFCURVE", "310 324 CURVE", "118 304 OFFCURVE", "38 246 OFFCURVE", "38 142 CURVE SMOOTH", "38 60 OFFCURVE", "94 -12 OFFCURVE", "188 -12 CURVE SMOOTH" ); }, { closed = 1; nodes = ( "218 120 OFFCURVE", "202 133 OFFCURVE", "202 156 CURVE SMOOTH", "202 184 OFFCURVE", "228 210 OFFCURVE", "310 222 CURVE", "310 154 LINE", "292 134 OFFCURVE", "276 120 OFFCURVE", "248 120 CURVE SMOOTH" ); } ); width = 536; } ); unicode = 0061; }, { glyphname = space; lastChange = "2017-04-11 12:07:34 +0000"; layers = ( { layerId = "F391A38D-09EE-4697-93B1-BD76E14F8F30"; width = 200; }, { layerId = "AF818D18-A4CE-4FD4-8AD5-FA156C77929B"; width = 200; } ); unicode = 0020; }, { glyphname = .notdef; lastChange = "2017-04-11 12:07:34 +0000"; layers = ( { layerId = "F391A38D-09EE-4697-93B1-BD76E14F8F30"; paths = ( { closed = 1; nodes = ( "96 0 LINE", "528 0 LINE", "528 660 LINE", "96 660 LINE" ); }, { closed = 1; nodes = ( "144 32 LINE", "246 208 LINE", "310 314 LINE", "314 314 LINE", "376 208 LINE", "476 32 LINE" ); }, { closed = 1; nodes = ( "310 366 LINE", "254 458 LINE", "160 626 LINE", "462 626 LINE", "368 458 LINE", "314 366 LINE" ); }, { closed = 1; nodes = ( "134 74 LINE", "134 610 LINE", "288 340 LINE" ); }, { closed = 1; nodes = ( "488 74 LINE", "336 340 LINE", "488 610 LINE" ); } ); width = 624; }, { layerId = "AF818D18-A4CE-4FD4-8AD5-FA156C77929B"; paths = ( { closed = 1; nodes = ( "76 0 LINE", "628 0 LINE", "628 660 LINE", "76 660 LINE" ); }, { closed = 1; nodes = ( "288 104 LINE", "314 160 LINE", "350 256 LINE", "354 256 LINE", "390 160 LINE", "416 104 LINE" ); }, { closed = 1; nodes = ( "350 424 LINE", "310 520 LINE", "292 556 LINE", "412 556 LINE", "394 520 LINE", "354 424 LINE" ); }, { closed = 1; nodes = ( "188 172 LINE", "188 508 LINE", "270 340 LINE" ); }, { closed = 1; nodes = ( "516 172 LINE", "434 340 LINE", "516 508 LINE" ); } ); width = 704; } ); } ); instances = ( { interpolationWeight = 0; instanceInterpolations = { "F391A38D-09EE-4697-93B1-BD76E14F8F30" = 1; }; name = ExtraLight; weightClass = ExtraLight; }, { instanceInterpolations = { "F391A38D-09EE-4697-93B1-BD76E14F8F30" = 0.9; "AF818D18-A4CE-4FD4-8AD5-FA156C77929B" = 0.1; }; name = Light; weightClass = Light; }, { interpolationWeight = 368; instanceInterpolations = { "F391A38D-09EE-4697-93B1-BD76E14F8F30" = 0.632; "AF818D18-A4CE-4FD4-8AD5-FA156C77929B" = 0.368; }; name = Regular; }, { interpolationWeight = 600; instanceInterpolations = { "F391A38D-09EE-4697-93B1-BD76E14F8F30" = 0.4; "AF818D18-A4CE-4FD4-8AD5-FA156C77929B" = 0.6; }; name = SemiBold; weightClass = SemiBold; }, { interpolationWeight = 824; instanceInterpolations = { "F391A38D-09EE-4697-93B1-BD76E14F8F30" = 0.176; "AF818D18-A4CE-4FD4-8AD5-FA156C77929B" = 0.824; }; isBold = 1; name = Bold; weightClass = Bold; }, { interpolationWeight = 1000; instanceInterpolations = { "AF818D18-A4CE-4FD4-8AD5-FA156C77929B" = 1; }; name = Black; weightClass = Black; } ); unitsPerEm = 1000; versionMajor = 2; versionMinor = 20; } googlefonts-fontmake-7ed5123/tests/data/InterpolateLayoutTest/InterpolateLayoutTest.plist000066400000000000000000000013141470572777600322230ustar00rootroot00000000000000 InterpolateLayoutTest-Light GDEF InterpolateLayoutTest GDEF.txt GPOS InterpolateLayoutTest 0 GPOS.txt GSUB InterpolateLayoutTest GSUB.txt InterpolateLayoutTest-Bold GDEF InterpolateLayoutTest GDEF.txt GPOS InterpolateLayoutTest 1000 GPOS.txt GSUB InterpolateLayoutTest GSUB.txt googlefonts-fontmake-7ed5123/tests/data/MutatorSans/000077500000000000000000000000001470572777600225575ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/LICENSE000066400000000000000000000020621470572777600235640ustar00rootroot00000000000000MIT License Copyright (c) 2017 Erik van Blokland Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSans-non-default-layer.designspace000066400000000000000000000020531470572777600325720ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSans-weight-only.designspace000066400000000000000000000026041470572777600315140ustar00rootroot00000000000000 com.letterror.skateboard.previewLocation weight 0.0 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSans-width-only.designspace000066400000000000000000000025621470572777600313470ustar00rootroot00000000000000 com.letterror.skateboard.previewLocation width 0.0 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSans-with-openNodes.designspace000066400000000000000000000050631470572777600321530ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSans.designspace000066400000000000000000000157071470572777600272600ustar00rootroot00000000000000 com.letterror.skateboard.interestingLocation weight 775.609 width 794.522 S1 weight 855.549 width 795.978 S2 com.letterror.skateboard.previewLocation weight 700.0 width 569.078 com.superpolator.data axiscolors weight 0.5 0.5 0.5 1.0 width 0.5 0.5 0.5 1.0 instancefolder instances lineInverted lineStacked sequence lineViewFilled previewtext Aaa snippets googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/000077500000000000000000000000001470572777600302535ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/features.fea000066400000000000000000000000521470572777600325430ustar00rootroot00000000000000# this is the feature from boldcondensed. googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/fontinfo.plist000066400000000000000000000035351470572777600331600ustar00rootroot00000000000000 ascender 800 capHeight 800 copyright License same as MutatorMath. BSD 3-clause. [test-token: A] descender -200 familyName MutatorMathTest guidelines italicAngle 0 openTypeNameLicense License same as MutatorMath. BSD 3-clause. [test-token: A] openTypeOS2VendorID LTTR postscriptBlueValues postscriptDefaultWidthX 500 postscriptFamilyBlues postscriptFamilyOtherBlues postscriptFontName MutatorMathTest-BoldCondensed postscriptFullName MutatorMathTest BoldCondensed postscriptOtherBlues postscriptSlantAngle 0 postscriptStemSnapH postscriptStemSnapV postscriptWindowsCharacterSet 1 styleMapFamilyName styleMapStyleName regular styleName BoldCondensed unitsPerEm 1000 versionMajor 1 versionMinor 2 xHeight 500 year 2004 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs.background/000077500000000000000000000000001470572777600336775ustar00rootroot00000000000000S_.closed.glif000066400000000000000000000037041470572777600363000ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs.background contents.plist000066400000000000000000000003741470572777600365360ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs.background S.closed S_.closed.glif layerinfo.plist000066400000000000000000000003661470572777600366720ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs.background color 0.5,1,0,0.7 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/000077500000000000000000000000001470572777600315615ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/A_.glif000066400000000000000000000024471470572777600327520ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/A_acute.glif000066400000000000000000000005241470572777600337660ustar00rootroot00000000000000 public.markColor 0.6567,0.6903,1,1 A_dieresis.glif000066400000000000000000000005321470572777600344140ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs public.markColor 0.6567,0.6903,1,1 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/B_.glif000066400000000000000000000034071470572777600327500ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/C_.glif000066400000000000000000000033711470572777600327510ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/D_.glif000066400000000000000000000021501470572777600327440ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/E_.glif000066400000000000000000000025461470572777600327560ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/F_.glif000066400000000000000000000013531470572777600327520ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/G_.glif000066400000000000000000000033561470572777600327600ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/H_.glif000066400000000000000000000013471470572777600327570ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/I_.glif000066400000000000000000000013451470572777600327560ustar00rootroot00000000000000 I_.narrow.glif000066400000000000000000000012751470572777600342100ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/I_J_.glif000066400000000000000000000021611470572777600332240ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/J_.glif000066400000000000000000000016501470572777600327560ustar00rootroot00000000000000 J_.narrow.glif000066400000000000000000000014711470572777600342070ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/K_.glif000066400000000000000000000015501470572777600327560ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/L_.glif000066400000000000000000000010361470572777600327560ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/M_.glif000066400000000000000000000016231470572777600327610ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/N_.glif000066400000000000000000000013451470572777600327630ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/O_.glif000066400000000000000000000025171470572777600327660ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/P_.glif000066400000000000000000000022641470572777600327660ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/Q_.glif000066400000000000000000000005731470572777600327700ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/R_.glif000066400000000000000000000034451470572777600327720ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 S_.closed.glif000066400000000000000000000043551470572777600341650ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs com.letterror.skateboard.navigator location weight 1000.0 width 108.00694056919657 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/S_.glif000066400000000000000000000044771470572777600330010ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/T_.glif000066400000000000000000000010421470572777600327630ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/U_.glif000066400000000000000000000016501470572777600327710ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/V_.glif000066400000000000000000000013441470572777600327720ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/W_.glif000066400000000000000000000015321470572777600327720ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/X_.glif000066400000000000000000000014401470572777600327710ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/Y_.glif000066400000000000000000000013541470572777600327760ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/Z_.glif000066400000000000000000000013501470572777600327730ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/acute.glif000066400000000000000000000005411470572777600335250ustar00rootroot00000000000000 arrowdown.glif000066400000000000000000000007531470572777600343740ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs arrowleft.glif000066400000000000000000000007521470572777600343560ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs arrowright.glif000066400000000000000000000007531470572777600345420ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/arrowup.glif000066400000000000000000000007521470572777600341270ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/colon.glif000066400000000000000000000003621470572777600335370ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/comma.glif000066400000000000000000000010111470572777600335110ustar00rootroot00000000000000 contents.plist000066400000000000000000000051771470572777600344260ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs A A_.glif Aacute A_acute.glif Adieresis A_dieresis.glif B B_.glif C C_.glif D D_.glif E E_.glif F F_.glif G G_.glif H H_.glif I I_.glif I.narrow I_.narrow.glif IJ I_J_.glif J J_.glif J.narrow J_.narrow.glif K K_.glif L L_.glif M M_.glif N N_.glif O O_.glif P P_.glif Q Q_.glif R R_.glif S S_.glif S.closed S_.closed.glif T T_.glif U U_.glif V V_.glif W W_.glif X X_.glif Y Y_.glif Z Z_.glif acute acute.glif arrowdown arrowdown.glif arrowleft arrowleft.glif arrowright arrowright.glif arrowup arrowup.glif colon colon.glif comma comma.glif dieresis dieresis.glif dot dot.glif period period.glif quotedblbase quotedblbase.glif quotedblleft quotedblleft.glif quotedblright quotedblright.glif quotesinglbase quotesinglbase.glif semicolon semicolon.glif space space.glif dieresis.glif000066400000000000000000000006001470572777600341500ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs public.markColor 0.6567,0.6903,1,1 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/dot.glif000066400000000000000000000005371470572777600332170ustar00rootroot00000000000000 layerinfo.plist000066400000000000000000000005631470572777600345530ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs color 1,0.75,0,0.7 lib com.typemytype.robofont.segmentType curve googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/period.glif000066400000000000000000000005361470572777600337120ustar00rootroot00000000000000 quotedblbase.glif000066400000000000000000000011401470572777600350130ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 quotedblleft.glif000066400000000000000000000005051470572777600350370ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs quotedblright.glif000066400000000000000000000004101470572777600352150ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs quotesinglbase.glif000066400000000000000000000010661470572777600353750ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 semicolon.glif000066400000000000000000000003651470572777600343410ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/glyphs/space.glif000066400000000000000000000002321470572777600335140ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/groups.plist000066400000000000000000000005561470572777600326550ustar00rootroot00000000000000 public.kern1.@MMK_L_A A public.kern2.@MMK_R_A A googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/kerning.plist000066400000000000000000000107441470572777600327730ustar00rootroot00000000000000 A J -20 O -30 T -70 U -30 V -50 B A -20 J -50 O -20 S -10 T -10 U -20 V -30 C A -20 J -50 T -20 V -20 E J -20 T -10 V -10 F A -40 J -80 O -10 S -20 U -10 V -10 G J -20 S -10 T -40 U -10 V -30 H J -30 S -10 T -10 J J -70 L J -20 O -20 T -110 U -20 V -60 O A -30 J -60 S -10 T -30 V -30 P A -50 J -100 S -10 T -10 U -10 V -20 R H -10 J -20 O -30 S -20 T -30 U -30 V -40 S A -20 H -20 J -40 O -10 S -10 T -30 U -10 V -30 W -10 T A -65 H -10 J -130 O -20 U A -30 J -60 S -10 V -10 V J -100 O -30 S -20 U -10 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/layercontents.plist000066400000000000000000000005771470572777600342330ustar00rootroot00000000000000 foreground glyphs background glyphs.background googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/lib.plist000066400000000000000000000172401470572777600321020ustar00rootroot00000000000000 com.defcon.sortDescriptor allowPseudoUnicode ascending type alphabetical allowPseudoUnicode ascending type category allowPseudoUnicode ascending type unicode allowPseudoUnicode ascending type script allowPseudoUnicode ascending type suffix allowPseudoUnicode ascending type decompositionBase com.letterror.lightMeter.prefs chunkSize 5 diameter 200 drawTail invert toolDiameter 30 toolStyle fluid com.typemytype.robofont.background.layerStrokeColor 0.0 0.8 0.2 0.7 com.typemytype.robofont.compileSettings.autohint com.typemytype.robofont.compileSettings.checkOutlines com.typemytype.robofont.compileSettings.createDummyDSIG com.typemytype.robofont.compileSettings.decompose com.typemytype.robofont.compileSettings.generateFormat 0 com.typemytype.robofont.compileSettings.releaseMode com.typemytype.robofont.foreground.layerStrokeColor 0.5 0.0 0.5 0.7 com.typemytype.robofont.italicSlantOffset 0 com.typemytype.robofont.segmentType curve com.typemytype.robofont.shouldAddPointsInSplineConversion 1 com.typesupply.defcon.sortDescriptor ascending space A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n ntilde o p q r s t u v w x y z zcaron zero one two three four five six seven eight nine underscore hyphen endash emdash parenleft parenright bracketleft bracketright braceleft braceright numbersign percent period comma colon semicolon exclam question slash backslash bar at ampersand paragraph bullet dollar trademark fi fl .notdef a_b_c Atilde Adieresis Acircumflex Aring Ccedilla Agrave Aacute quotedblright quotedblleft type glyphList public.glyphOrder A Aacute Adieresis B C D E F G H I J K L M N O P Q R S T U V W X Y Z IJ S.closed I.narrow J.narrow quotesinglbase quotedblbase quotedblleft quotedblright comma period colon semicolon dot dieresis acute space arrowdown arrowleft arrowright arrowup googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldCondensed.ufo/metainfo.plist000066400000000000000000000004761470572777600331410ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/000077500000000000000000000000001470572777600272415ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/features.fea000066400000000000000000000000441470572777600315320ustar00rootroot00000000000000# this is the feature from BoldWide googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/fontinfo.plist000066400000000000000000000035161470572777600321450ustar00rootroot00000000000000 ascender 800 capHeight 800 copyright License same as MutatorMath. BSD 3-clause. [test-token: B] descender -200 familyName MutatorMathTest guidelines italicAngle 0 openTypeNameLicense License same as MutatorMath. BSD 3-clause. [test-token: B] openTypeOS2VendorID LTTR postscriptBlueValues postscriptDefaultWidthX 500 postscriptFamilyBlues postscriptFamilyOtherBlues postscriptFontName MutatorMathTest-BoldWide postscriptFullName MutatorMathTest BoldWide postscriptOtherBlues postscriptSlantAngle 0 postscriptStemSnapH postscriptStemSnapV postscriptWindowsCharacterSet 1 styleMapFamilyName styleMapStyleName regular styleName BoldWide unitsPerEm 1000 versionMajor 1 versionMinor 2 xHeight 500 year 2004 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs.background/000077500000000000000000000000001470572777600326655ustar00rootroot00000000000000S_.closed.glif000066400000000000000000000037021470572777600352640ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs.background S_.glif000066400000000000000000000037251470572777600340210ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs.background contents.plist000066400000000000000000000004521470572777600355210ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs.background S S_.glif S.closed S_.closed.glif layerinfo.plist000066400000000000000000000003661470572777600356600ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs.background color 0.5,1,0,0.7 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/000077500000000000000000000000001470572777600305475ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/A_.glif000066400000000000000000000016631470572777600317370ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/A_acute.glif000066400000000000000000000005421470572777600327540ustar00rootroot00000000000000 public.markColor 0.6567,0.6903,1,1 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/A_dieresis.glif000066400000000000000000000005501470572777600334610ustar00rootroot00000000000000 public.markColor 0.6567,0.6903,1,1 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/B_.glif000066400000000000000000000042331470572777600317340ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/C_.glif000066400000000000000000000026121470572777600317340ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/D_.glif000066400000000000000000000021761470572777600317420ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/E_.glif000066400000000000000000000017341470572777600317420ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/F_.glif000066400000000000000000000013561470572777600317430ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/G_.glif000066400000000000000000000033231470572777600317400ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/H_.glif000066400000000000000000000013541470572777600317430ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/I_.glif000066400000000000000000000013461470572777600317450ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/I_.narrow.glif000066400000000000000000000012751470572777600332550ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/I_J_.glif000066400000000000000000000022021470572777600322060ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/J_.glif000066400000000000000000000016541470572777600317500ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/J_.narrow.glif000066400000000000000000000014461470572777600332560ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/K_.glif000066400000000000000000000015531470572777600317470ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/L_.glif000066400000000000000000000010411470572777600317400ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/M_.glif000066400000000000000000000016271470572777600317530ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/N_.glif000066400000000000000000000013511470572777600317460ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/O_.glif000066400000000000000000000025531470572777600317540ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/P_.glif000066400000000000000000000021641470572777600317530ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/Q_.glif000066400000000000000000000005741470572777600317570ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/R_.glif000066400000000000000000000027271470572777600317620ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/S_.closed.glif000066400000000000000000000045011470572777600332230ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/S_.glif000066400000000000000000000045101470572777600317530ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/T_.glif000066400000000000000000000010451470572777600317540ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/U_.glif000066400000000000000000000020151470572777600317530ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/V_.glif000066400000000000000000000013461470572777600317620ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/W_.glif000066400000000000000000000015351470572777600317630ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/X_.glif000066400000000000000000000014431470572777600317620ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/Y_.glif000066400000000000000000000013561470572777600317660ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/Z_.glif000066400000000000000000000013561470572777600317670ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/acute.glif000066400000000000000000000005411470572777600325130ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/arrowdown.glif000066400000000000000000000007531470572777600334410ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/arrowleft.glif000066400000000000000000000007551470572777600334260ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/arrowright.glif000066400000000000000000000007571470572777600336130ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/arrowup.glif000066400000000000000000000007541470572777600331170ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/colon.glif000066400000000000000000000003621470572777600325250ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/comma.glif000066400000000000000000000010121470572777600325000ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/contents.plist000066400000000000000000000051771470572777600334730ustar00rootroot00000000000000 A A_.glif Aacute A_acute.glif Adieresis A_dieresis.glif B B_.glif C C_.glif D D_.glif E E_.glif F F_.glif G G_.glif H H_.glif I I_.glif I.narrow I_.narrow.glif IJ I_J_.glif J J_.glif J.narrow J_.narrow.glif K K_.glif L L_.glif M M_.glif N N_.glif O O_.glif P P_.glif Q Q_.glif R R_.glif S S_.glif S.closed S_.closed.glif T T_.glif U U_.glif V V_.glif W W_.glif X X_.glif Y Y_.glif Z Z_.glif acute acute.glif arrowdown arrowdown.glif arrowleft arrowleft.glif arrowright arrowright.glif arrowup arrowup.glif colon colon.glif comma comma.glif dieresis dieresis.glif dot dot.glif period period.glif quotedblbase quotedblbase.glif quotedblleft quotedblleft.glif quotedblright quotedblright.glif quotesinglbase quotesinglbase.glif semicolon semicolon.glif space space.glif googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/dieresis.glif000066400000000000000000000005621470572777600332240ustar00rootroot00000000000000 public.markColor 0.6567,0.6903,1,1 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/dot.glif000066400000000000000000000005371470572777600322050ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/layerinfo.plist000066400000000000000000000005631470572777600336200ustar00rootroot00000000000000 color 1,0.75,0,0.7 lib com.typemytype.robofont.segmentType curve googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/period.glif000066400000000000000000000005361470572777600327000ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/quotedblbase.glif000066400000000000000000000004031470572777600340610ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/quotedblleft.glif000066400000000000000000000005051470572777600341040ustar00rootroot00000000000000 quotedblright.glif000066400000000000000000000004101470572777600342030ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs quotesinglbase.glif000066400000000000000000000003151470572777600343570ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/semicolon.glif000066400000000000000000000003651470572777600334060ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/glyphs/space.glif000066400000000000000000000002321470572777600325020ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/groups.plist000066400000000000000000000005561470572777600316430ustar00rootroot00000000000000 public.kern1.@MMK_L_A A public.kern2.@MMK_R_A A googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/kerning.plist000066400000000000000000000004551470572777600317570ustar00rootroot00000000000000 T public.kern2.@MMK_R_A -150 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/layercontents.plist000066400000000000000000000005771470572777600332210ustar00rootroot00000000000000 foreground glyphs background glyphs.background googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/lib.plist000066400000000000000000000300651470572777600310700ustar00rootroot00000000000000 com.defcon.sortDescriptor allowPseudoUnicode ascending type alphabetical allowPseudoUnicode ascending type category allowPseudoUnicode ascending type unicode allowPseudoUnicode ascending type script allowPseudoUnicode ascending type suffix allowPseudoUnicode ascending type decompositionBase com.letterror.lightMeter.prefs chunkSize 5 diameter 200 drawTail invert toolDiameter 30 toolStyle fluid com.typemytype.robofont.background.layerStrokeColor 0.0 0.8 0.2 0.7 com.typemytype.robofont.compileSettings.autohint com.typemytype.robofont.compileSettings.checkOutlines com.typemytype.robofont.compileSettings.createDummyDSIG com.typemytype.robofont.compileSettings.decompose com.typemytype.robofont.compileSettings.generateFormat 0 com.typemytype.robofont.compileSettings.releaseMode com.typemytype.robofont.foreground.layerStrokeColor 0.5 0.0 0.5 0.7 com.typemytype.robofont.italicSlantOffset 0 com.typemytype.robofont.segmentType curve com.typemytype.robofont.shouldAddPointsInSplineConversion 1 com.typesupply.defcon.sortDescriptor ascending space A Agrave Aacute Acircumflex Atilde Adieresis Aring B C Ccedilla D E Egrave Eacute Ecircumflex Edieresis F G H I Igrave Iacute Icircumflex Idieresis J K L M N Ntilde O Ograve Oacute Ocircumflex Otilde Odieresis P Q R S Scaron T U Ugrave Uacute Ucircumflex Udieresis V W X Y Yacute Ydieresis Z Zcaron AE Eth Oslash Thorn Lslash OE a agrave aacute acircumflex atilde adieresis aring b c ccedilla d e egrave eacute ecircumflex edieresis f g h i igrave iacute icircumflex idieresis j k l m n ntilde o ograve oacute ocircumflex otilde odieresis p q r s scaron t u ugrave uacute ucircumflex udieresis v w x y yacute ydieresis z zcaron ordfeminine ordmasculine germandbls ae eth oslash thorn dotlessi lslash oe zero one two three four five six seven eight nine onesuperior twosuperior threesuperior onequarter onehalf threequarters underscore hyphen endash emdash parenleft parenright bracketleft bracketright braceleft braceright numbersign percent perthousand quotesingle quotedbl quoteleft quoteright quotedblleft quotedblright quotesinglbase quotedblbase guilsinglleft guilsinglright guillemotleft guillemotright asterisk dagger daggerdbl period comma colon semicolon ellipsis exclam exclamdown question questiondown slash backslash fraction bar brokenbar at ampersand section paragraph periodcentered bullet plus minus plusminus divide multiply equal less greater logicalnot mu dollar cent sterling currency yen Euro florin asciicircum asciitilde acute grave hungarumlaut circumflex caron breve tilde macron dieresis dotaccent ring cedilla ogonek copyright registered trademark degree fi fl .notdef a_b_c type glyphList public.glyphOrder A Aacute Adieresis B C D E F G H I J K L M N O P Q R S T U V W X Y Z S.closed I.narrow J.narrow quotesinglbase quotedblbase quotedblleft quotedblright comma period colon semicolon dot dieresis acute space IJ arrowdown arrowleft arrowright arrowup googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansBoldWide.ufo/metainfo.plist000066400000000000000000000004761470572777600321270ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/000077500000000000000000000000001470572777600320055ustar00rootroot00000000000000features.fea000066400000000000000000000001041470572777600342140ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo# this is the feature from lightCondensed # Hi_this_is_the_feature. fontinfo.plist000066400000000000000000000025521470572777600346310ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo ascender 763.459275 capHeight 763.459275 copyright Copyright-token-string descender -200 familyName Intermediate guidelines italicAngle 0 openTypeOS2VendorID ADBE postscriptBlueValues postscriptDefaultWidthX 500 postscriptFamilyBlues postscriptFamilyOtherBlues postscriptOtherBlues postscriptSlantAngle 0 postscriptStemSnapH postscriptStemSnapV postscriptWindowsCharacterSet 1 styleName Narrow unitsPerEm 1000.0 versionMajor 1 versionMinor 2 xHeight 500 glyphs.background/000077500000000000000000000000001470572777600353525ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufoS_.glif000066400000000000000000000044611470572777600365630ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs.background contents.plist000066400000000000000000000003441470572777600402650ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs.background S S_.glif layerinfo.plist000066400000000000000000000005271470572777600404230ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs.background color 0.5,1,0,0.7 lib com.typemytype.robofont.segmentType curve glyphs.interpolation/000077500000000000000000000000001470572777600361225ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufoE_.glif000066400000000000000000000036221470572777600373130ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs.interpolation contents.plist000066400000000000000000000003441470572777600410350ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs.interpolation E E_.glif layerinfo.plist000066400000000000000000000005301470572777600411650ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs.interpolation color 0,1,0.25,0.7 lib com.typemytype.robofont.segmentType curve glyphs.reference.interpolation/000077500000000000000000000000001470572777600400575ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufoE_.glif000066400000000000000000000016661470572777600412560ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs.reference.interpolation S_.glif000066400000000000000000000061551470572777600412720ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs.reference.interpolation contents.plist000066400000000000000000000004141470572777600427700ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs.reference.interpolation E E_.glif S S_.glif layerinfo.plist000066400000000000000000000005251470572777600431260ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs.reference.interpolation color 0,1,1,0.7 lib com.typemytype.robofont.segmentType curve googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs/000077500000000000000000000000001470572777600333135ustar00rootroot00000000000000B_.glif000066400000000000000000000034161470572777600344230ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs E_.glif000066400000000000000000000017271470572777600344310ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs F_.glif000066400000000000000000000016331470572777600344260ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs G_.glif000066400000000000000000000044031470572777600344250ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs S_.glif000066400000000000000000000051261470572777600344440ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs contents.plist000066400000000000000000000006461470572777600361540ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs B B_.glif E E_.glif F F_.glif G G_.glif S S_.glif layerinfo.plist000066400000000000000000000005631470572777600363050ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/glyphs color 1,0.75,0,0.7 lib com.typemytype.robofont.segmentType curve layercontents.plist000066400000000000000000000011471470572777600357000ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo foreground glyphs background glyphs.background interpolation glyphs.interpolation reference.interpolation glyphs.reference.interpolation googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo/lib.plist000066400000000000000000000403511470572777600336330ustar00rootroot00000000000000 com.letterror.lightMeter.prefs chunkSize 5 diameter 200 drawTail invert toolDiameter 30 toolStyle fluid com.typemytype.robofont.background.layerStrokeColor 0.0 0.8 0.2 0.7 com.typemytype.robofont.compileSettings.autohint com.typemytype.robofont.compileSettings.checkOutlines com.typemytype.robofont.compileSettings.createDummyDSIG com.typemytype.robofont.compileSettings.decompose com.typemytype.robofont.compileSettings.generateFormat 0 com.typemytype.robofont.compileSettings.releaseMode com.typemytype.robofont.foreground.layerStrokeColor 0.5 0.0 0.5 0.7 com.typemytype.robofont.italicSlantOffset 0 com.typemytype.robofont.segmentType curve com.typemytype.robofont.shouldAddPointsInSplineConversion 1 com.typesupply.MetricsMachine4.groupColors @MMK_L_A 1.0 0.0 0.0 0.25 @MMK_L_C 1.0 0.5 0.0 0.25 @MMK_L_E 1.0 1.0 0.0 0.25 @MMK_L_I 0.0 1.0 0.0 0.25 @MMK_L_N 0.0 1.0 1.0 0.25 @MMK_L_O 0.0 0.5 1.0 0.25 @MMK_L_S 0.0 0.0 1.0 0.25 @MMK_L_U 0.5 0.0 1.0 0.25 @MMK_L_Y 1.0 0.0 1.0 0.25 @MMK_L_Z 1.0 0.0 0.5 0.25 @MMK_L_a 1.0 0.0 0.0 0.25 @MMK_L_c 1.0 0.5 0.0 0.25 @MMK_L_e 1.0 1.0 0.0 0.25 @MMK_L_i 0.0 1.0 0.0 0.25 @MMK_L_n 0.0 1.0 1.0 0.25 @MMK_L_o 0.0 0.5 1.0 0.25 @MMK_L_s 0.0 0.0 1.0 0.25 @MMK_L_u 0.5 0.0 1.0 0.25 @MMK_L_y 1.0 0.0 1.0 0.25 @MMK_L_z 1.0 0.0 0.5 0.25 @MMK_R_A 1.0 0.0 0.0 0.25 @MMK_R_C 1.0 0.5 0.0 0.25 @MMK_R_E 1.0 1.0 0.0 0.25 @MMK_R_I 0.0 1.0 0.0 0.25 @MMK_R_N 0.0 1.0 1.0 0.25 @MMK_R_O 0.0 0.5 1.0 0.25 @MMK_R_S 0.0 0.0 1.0 0.25 @MMK_R_U 0.5 0.0 1.0 0.25 @MMK_R_Y 1.0 0.0 1.0 0.25 @MMK_R_Z 1.0 0.0 0.5 0.25 @MMK_R_a 1.0 0.0 0.0 0.25 @MMK_R_c 1.0 0.5 0.0 0.25 @MMK_R_e 1.0 1.0 0.0 0.25 @MMK_R_i 0.0 1.0 0.0 0.25 @MMK_R_n 0.0 1.0 1.0 0.25 @MMK_R_o 0.0 0.5 1.0 0.25 @MMK_R_s 0.0 0.0 1.0 0.25 @MMK_R_u 0.5 0.0 1.0 0.25 @MMK_R_y 1.0 0.0 1.0 0.25 @MMK_R_z 1.0 0.0 0.5 0.25 com.typesupply.defcon.sortDescriptor ascending space A Agrave Aacute Acircumflex Atilde Adieresis Aring B C Ccedilla D E Egrave Eacute Ecircumflex Edieresis F G H I Igrave Iacute Icircumflex Idieresis J K L M N Ntilde O Ograve Oacute Ocircumflex Otilde Odieresis P Q R S Scaron T U Ugrave Uacute Ucircumflex Udieresis V W X Y Yacute Ydieresis Z Zcaron AE Eth Oslash Thorn Lslash OE a agrave aacute acircumflex atilde adieresis aring b c ccedilla d e egrave eacute ecircumflex edieresis f g h i igrave iacute icircumflex idieresis j k l m n ntilde o ograve oacute ocircumflex otilde odieresis p q r s scaron t u ugrave uacute ucircumflex udieresis v w x y yacute ydieresis z zcaron ordfeminine ordmasculine germandbls ae eth oslash thorn dotlessi lslash oe mu zero one two three four five six seven eight nine onesuperior twosuperior threesuperior onequarter onehalf threequarters underscore hyphen endash emdash parenleft parenright bracketleft bracketright braceleft braceright numbersign percent perthousand quotesingle quotedbl quoteleft quoteright quotedblleft quotedblright quotesinglbase quotedblbase guilsinglleft guilsinglright asterisk dagger daggerdbl period comma colon semicolon ellipsis exclam exclamdown question questiondown slash backslash fraction bar brokenbar at ampersand section paragraph periodcentered bullet plus minus plusminus divide multiply equal less greater logicalnot dollar cent sterling currency yen Euro asciicircum asciitilde acute grave hungarumlaut circumflex caron breve tilde macron dieresis dotaccent ring cedilla ogonek copyright registered trademark degree florin guillemotleft guillemotright fi fl a_b_c .notdef type glyphList designspace width 0.0 weight 634.59275 public.glyphOrder B E F G S testLibItemKey a b c metainfo.plist000066400000000000000000000004761470572777600346140ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateCondensed.ufo creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo/000077500000000000000000000000001470572777600307735ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo/features.fea000066400000000000000000000001041470572777600332610ustar00rootroot00000000000000# this is the feature from lightCondensed # Hi_this_is_the_feature. googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo/fontinfo.plist000066400000000000000000000025501470572777600336740ustar00rootroot00000000000000 ascender 763.459275 capHeight 763.459275 copyright Copyright-token-string descender -200 familyName Intermediate guidelines italicAngle 0 openTypeOS2VendorID ADBE postscriptBlueValues postscriptDefaultWidthX 500 postscriptFamilyBlues postscriptFamilyOtherBlues postscriptOtherBlues postscriptSlantAngle 0 postscriptStemSnapH postscriptStemSnapV postscriptWindowsCharacterSet 1 styleName Wide unitsPerEm 1000.0 versionMajor 1 versionMinor 2 xHeight 500 glyphs.background/000077500000000000000000000000001470572777600343405ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufoS_.glif000066400000000000000000000045341470572777600355520ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo/glyphs.background com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 contents.plist000066400000000000000000000003441470572777600372530ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo/glyphs.background S S_.glif layerinfo.plist000066400000000000000000000005271470572777600374110ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo/glyphs.background color 0.5,1,0,0.7 lib com.typemytype.robofont.segmentType curve googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo/glyphs/000077500000000000000000000000001470572777600323015ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo/glyphs/B_.glif000066400000000000000000000034401470572777600334650ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo/glyphs/E_.glif000066400000000000000000000022121470572777600334640ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo/glyphs/F_.glif000066400000000000000000000016171470572777600334750ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo/glyphs/G_.glif000066400000000000000000000041441470572777600334740ustar00rootroot00000000000000 contents.plist000066400000000000000000000005701470572777600351360ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo/glyphs B B_.glif E E_.glif F F_.glif G G_.glif layerinfo.plist000066400000000000000000000005631470572777600352730ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo/glyphs color 1,0.75,0,0.7 lib com.typemytype.robofont.segmentType curve googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo/kerning.plist000066400000000000000000000125261470572777600335130ustar00rootroot00000000000000 @MMK_L_A V -1.4210854715202004e-14 B H -14.61629 J -31.05961624999999 O -3.654072499999998 S -9.135181250000002 T -31.059616249999998 U -12.78925375 V -31.059616250000005 public.kern2.@MMK_R_A -9.135181249999999 C J -27.405543749999993 T -14.61629 V -23.75147125 public.kern2.@MMK_R_A -14.61629 E J -29.23258 T -3.6540725000000016 F H -12.78925375 J -89.52477625 O -18.270362499999997 S -25.5785075 U -3.6540725000000016 public.kern2.@MMK_R_A -45.67590625 G J -21.924435000000003 O -5.481108749999999 S -5.481108750000001 T -38.36776125 U -7.308145 V -25.5785075 public.kern2.@MMK_R_A -14.61629 H J -14.616290000000006 S -10.962217500000001 J J -49.32997874999998 O -3.6540725 public.kern2.@MMK_R_A -25.5785075 L J -9.135181250000002 O -34.71368875 T -111.44921125000002 U -31.059616250000005 V -67.60034125000001 O J -43.848870000000005 S -16.44332625 T -32.8866525 V -29.23258 public.kern2.@MMK_R_A -10.962217499999998 P J -73.08144999999999 T -7.308145 public.kern2.@MMK_R_A -34.713688749999996 R H -16.44332625 J -56.63812374999999 O -20.097398750000004 S -25.5785075 T -29.23258 U -21.924435000000003 V -34.71368875 public.kern2.@MMK_R_A -29.23258 S H -1.827036249999999 J -42.02183375 O -14.61629 S -16.44332625 T -18.270362500000005 U -3.6540725000000016 V -7.308145000000003 public.kern2.@MMK_R_A -16.44332625 T H -5.481108750000001 J -115.10328374999995 O -32.8866525 S -9.135181249999999 public.kern2.@MMK_R_A -78.56255875 U J -51.157015 public.kern2.@MMK_R_A -27.40554375 V @MMK_R_A -1.4210854715202004e-14 H -7.308145 J -96.83292124999997 O -20.097398750000004 S -18.270362500000005 public.kern2.@MMK_R_A -76.7355225 public.kern1.@MMK_L_A J -12.78925375 O -20.097398749999996 T -69.42737749999999 U -34.713688749999996 V -65.773305 layercontents.plist000066400000000000000000000005771470572777600346740ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo foreground glyphs background glyphs.background googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo/lib.plist000066400000000000000000000375371470572777600326350ustar00rootroot00000000000000 com.typemytype.robofont.background.layerStrokeColor 0.0 0.8 0.2 0.7 com.typemytype.robofont.compileSettings.autohint com.typemytype.robofont.compileSettings.checkOutlines com.typemytype.robofont.compileSettings.createDummyDSIG com.typemytype.robofont.compileSettings.decompose com.typemytype.robofont.compileSettings.generateFormat 0 com.typemytype.robofont.compileSettings.releaseMode com.typemytype.robofont.foreground.layerStrokeColor 0.5 0.0 0.5 0.7 com.typemytype.robofont.italicSlantOffset 0 com.typemytype.robofont.segmentType curve com.typemytype.robofont.shouldAddPointsInSplineConversion 1 com.typesupply.MetricsMachine4.groupColors @MMK_L_A 1.0 0.0 0.0 0.25 @MMK_L_C 1.0 0.5 0.0 0.25 @MMK_L_E 1.0 1.0 0.0 0.25 @MMK_L_I 0.0 1.0 0.0 0.25 @MMK_L_N 0.0 1.0 1.0 0.25 @MMK_L_O 0.0 0.5 1.0 0.25 @MMK_L_S 0.0 0.0 1.0 0.25 @MMK_L_U 0.5 0.0 1.0 0.25 @MMK_L_Y 1.0 0.0 1.0 0.25 @MMK_L_Z 1.0 0.0 0.5 0.25 @MMK_L_a 1.0 0.0 0.0 0.25 @MMK_L_c 1.0 0.5 0.0 0.25 @MMK_L_e 1.0 1.0 0.0 0.25 @MMK_L_i 0.0 1.0 0.0 0.25 @MMK_L_n 0.0 1.0 1.0 0.25 @MMK_L_o 0.0 0.5 1.0 0.25 @MMK_L_s 0.0 0.0 1.0 0.25 @MMK_L_u 0.5 0.0 1.0 0.25 @MMK_L_y 1.0 0.0 1.0 0.25 @MMK_L_z 1.0 0.0 0.5 0.25 @MMK_R_A 1.0 0.0 0.0 0.25 @MMK_R_C 1.0 0.5 0.0 0.25 @MMK_R_E 1.0 1.0 0.0 0.25 @MMK_R_I 0.0 1.0 0.0 0.25 @MMK_R_N 0.0 1.0 1.0 0.25 @MMK_R_O 0.0 0.5 1.0 0.25 @MMK_R_S 0.0 0.0 1.0 0.25 @MMK_R_U 0.5 0.0 1.0 0.25 @MMK_R_Y 1.0 0.0 1.0 0.25 @MMK_R_Z 1.0 0.0 0.5 0.25 @MMK_R_a 1.0 0.0 0.0 0.25 @MMK_R_c 1.0 0.5 0.0 0.25 @MMK_R_e 1.0 1.0 0.0 0.25 @MMK_R_i 0.0 1.0 0.0 0.25 @MMK_R_n 0.0 1.0 1.0 0.25 @MMK_R_o 0.0 0.5 1.0 0.25 @MMK_R_s 0.0 0.0 1.0 0.25 @MMK_R_u 0.5 0.0 1.0 0.25 @MMK_R_y 1.0 0.0 1.0 0.25 @MMK_R_z 1.0 0.0 0.5 0.25 com.typesupply.defcon.sortDescriptor ascending space A Agrave Aacute Acircumflex Atilde Adieresis Aring B C Ccedilla D E Egrave Eacute Ecircumflex Edieresis F G H I Igrave Iacute Icircumflex Idieresis J K L M N Ntilde O Ograve Oacute Ocircumflex Otilde Odieresis P Q R S Scaron T U Ugrave Uacute Ucircumflex Udieresis V W X Y Yacute Ydieresis Z Zcaron AE Eth Oslash Thorn Lslash OE a agrave aacute acircumflex atilde adieresis aring b c ccedilla d e egrave eacute ecircumflex edieresis f g h i igrave iacute icircumflex idieresis j k l m n ntilde o ograve oacute ocircumflex otilde odieresis p q r s scaron t u ugrave uacute ucircumflex udieresis v w x y yacute ydieresis z zcaron ordfeminine ordmasculine germandbls ae eth oslash thorn dotlessi lslash oe mu zero one two three four five six seven eight nine onesuperior twosuperior threesuperior onequarter onehalf threequarters underscore hyphen endash emdash parenleft parenright bracketleft bracketright braceleft braceright numbersign percent perthousand quotesingle quotedbl quoteleft quoteright quotedblleft quotedblright quotesinglbase quotedblbase guilsinglleft guilsinglright asterisk dagger daggerdbl period comma colon semicolon ellipsis exclam exclamdown question questiondown slash backslash fraction bar brokenbar at ampersand section paragraph periodcentered bullet plus minus plusminus divide multiply equal less greater logicalnot dollar cent sterling currency yen Euro asciicircum asciitilde acute grave hungarumlaut circumflex caron breve tilde macron dieresis dotaccent ring cedilla ogonek copyright registered trademark degree florin guillemotleft guillemotright fi fl a_b_c .notdef type glyphList designspace width 1000.0 weight 634.59275 public.glyphOrder B E F G testLibItemKey a b c googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansIntermediateWide.ufo/metainfo.plist000066400000000000000000000004761470572777600336610ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/000077500000000000000000000000001470572777600304425ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/features.fea000066400000000000000000000001041470572777600327300ustar00rootroot00000000000000# this is the feature from lightCondensed # Hi_this_is_the_feature. googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/fontinfo.plist000066400000000000000000000035401470572777600333430ustar00rootroot00000000000000 ascender 700 capHeight 700 copyright License same as MutatorMath. BSD 3-clause. [test-token: C] descender -200 familyName MutatorMathTest guidelines italicAngle 0 openTypeNameLicense License same as MutatorMath. BSD 3-clause. [test-token: C] openTypeOS2VendorID LTTR postscriptBlueValues postscriptDefaultWidthX 500 postscriptFamilyBlues postscriptFamilyOtherBlues postscriptFontName MutatorMathTest-LightCondensed postscriptFullName MutatorMathTest LightCondensed postscriptOtherBlues postscriptSlantAngle 0 postscriptStemSnapH postscriptStemSnapV postscriptWindowsCharacterSet 1 styleMapFamilyName styleMapStyleName regular styleName LightCondensed unitsPerEm 1000 versionMajor 1 versionMinor 2 xHeight 500 year 2004 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.background/000077500000000000000000000000001470572777600340665ustar00rootroot00000000000000S_.closed.glif000066400000000000000000000076361470572777600364770ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.background S_.glif000066400000000000000000000064361470572777600352240ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.background com.letterror.skateboard.navigator location weight 820.0 width 1000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 contents.plist000066400000000000000000000004521470572777600367220ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.background S S_.glif S.closed S_.closed.glif layerinfo.plist000066400000000000000000000003641470572777600370570ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.background color 0,1,1,0.7 glyphs.support.S_.middle/000077500000000000000000000000001470572777600352015ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufoS_.closed.glif000066400000000000000000000054111470572777600376560ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.S_.middle com.letterror.skateboard.navigator location weight 700.0 width 569.078 contents.plist000066400000000000000000000003741470572777600401170ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.S_.middle S.closed S_.closed.glif layerinfo.plist000066400000000000000000000003661470572777600402530ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.S_.middle color 0.5,0,1,0.7 glyphs.support.S_.wide/000077500000000000000000000000001470572777600346735ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufoS_.closed.glif000066400000000000000000000067271470572777600373630ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide com.letterror.skateboard.navigator location weight 673.7998527960526 width 1000.0 S_.glif000066400000000000000000000067161470572777600361110ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide com.letterror.skateboard.navigator location weight 759.5997715404774 width 1000.0 contents.plist000066400000000000000000000004521470572777600376060ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide S S_.glif S.closed S_.closed.glif layerinfo.plist000066400000000000000000000003671470572777600377460ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide color 0,0.25,1,0.7 glyphs.support.crossbar/000077500000000000000000000000001470572777600352215ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufoB_.glif000066400000000000000000000040771470572777600364140ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.crossbar com.letterror.skateboard.navigator location weight 715.728 width -138.956 E_.glif000066400000000000000000000026771470572777600364230ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.crossbar com.letterror.skateboard.navigator location weight 715.728 width -138.956 F_.glif000066400000000000000000000013571470572777600364160ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.crossbar G_.glif000066400000000000000000000046241470572777600364170ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.crossbar com.letterror.skateboard.navigator location weight 715.728 width -138.956 S_.closed.glif000066400000000000000000000006461470572777600377030ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.crossbar com.letterror.skateboard.navigator location weight 800.0 width 0.0 S_.glif000066400000000000000000000066521470572777600364360ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.crossbar com.letterror.skateboard.navigator location weight 889.1982375724028 width 0.0 contents.plist000066400000000000000000000007421470572777600401360ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.crossbar B B_.glif E E_.glif F F_.glif G G_.glif S S_.glif S.closed S_.closed.glif layerinfo.plist000066400000000000000000000003671470572777600402740ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.crossbar color 0,1,0.25,0.7 glyphs.support.crossbars/000077500000000000000000000000001470572777600354045ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufoE_.glif000066400000000000000000000022301470572777600365670ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.crossbars contents.plist000066400000000000000000000003561470572777600403220ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.crossbars E E_.glif layerinfo.plist000066400000000000000000000002671470572777600404560ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support.crossbars googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support/000077500000000000000000000000001470572777600334635ustar00rootroot00000000000000A_.glif000066400000000000000000000014741470572777600345740ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support com.letterror.skateboard.navigator location space 0.0 weight 600.0 width 500.0 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 S_.glif000066400000000000000000000052221470572777600346110ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support com.letterror.skateboard.navigator location space 25.0 weight 707.6485770089287 width 181.31051199776795 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 W_.glif000066400000000000000000000015251470572777600346170ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support contents.plist000066400000000000000000000005121470572777600363140ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support A A_.glif S S_.glif W W_.glif layerinfo.plist000066400000000000000000000005631470572777600364550ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs.support color 0,1,0.25,0.7 lib com.typemytype.robofont.segmentType curve googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/000077500000000000000000000000001470572777600317505ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/A_.glif000066400000000000000000000016561470572777600331420ustar00rootroot00000000000000 A_acute.glif000066400000000000000000000005401470572777600340740ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs public.markColor 0.6567,0.6903,1,1 A_dieresis.glif000066400000000000000000000005461470572777600346100ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs public.markColor 0.6567,0.6903,1,1 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/B_.glif000066400000000000000000000034071470572777600331370ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/C_.glif000066400000000000000000000025721470572777600331420ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/D_.glif000066400000000000000000000021601470572777600331340ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/E_.glif000066400000000000000000000017171470572777600331440ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/F_.glif000066400000000000000000000013471470572777600331440ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/G_.glif000066400000000000000000000033001470572777600331340ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/H_.glif000066400000000000000000000013451470572777600331440ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/I_.glif000066400000000000000000000013431470572777600331430ustar00rootroot00000000000000 I_.narrow.glif000066400000000000000000000012751470572777600343770ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/I_J_.glif000066400000000000000000000021211470572777600334070ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/J_.glif000066400000000000000000000016411470572777600331450ustar00rootroot00000000000000 J_.narrow.glif000066400000000000000000000014351470572777600343760ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/K_.glif000066400000000000000000000015461470572777600331520ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/L_.glif000066400000000000000000000010321470572777600331410ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/M_.glif000066400000000000000000000016221470572777600331470ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/N_.glif000066400000000000000000000013401470572777600331450ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/O_.glif000066400000000000000000000025341470572777600331540ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/P_.glif000066400000000000000000000021721470572777600331530ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/Q_.glif000066400000000000000000000005711470572777600331550ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/R_.glif000066400000000000000000000026661470572777600331650ustar00rootroot00000000000000 S_.closed.glif000066400000000000000000000036561470572777600343570ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/S_.glif000066400000000000000000000046251470572777600331630ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/T_.glif000066400000000000000000000010421470572777600331520ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/U_.glif000066400000000000000000000016411470572777600331600ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/V_.glif000066400000000000000000000013411470572777600331560ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/W_.glif000066400000000000000000000015251470572777600331630ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/X_.glif000066400000000000000000000014361470572777600331650ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/Y_.glif000066400000000000000000000021401470572777600331570ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/Z_.glif000066400000000000000000000013431470572777600331640ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/acute.glif000066400000000000000000000005411470572777600337140ustar00rootroot00000000000000 arrowdown.glif000066400000000000000000000011641470572777600345600ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs public.markColor 0,0.95,0.95,1 arrowleft.glif000066400000000000000000000012621470572777600345420ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs public.markColor 0,0.95,0.95,1 arrowright.glif000066400000000000000000000011631470572777600347250ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs public.markColor 0,0.95,0.95,1 arrowup.glif000066400000000000000000000011621470572777600342330ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs public.markColor 0,0.95,0.95,1 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/colon.glif000066400000000000000000000003461470572777600337300ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/comma.glif000066400000000000000000000010031470572777600337010ustar00rootroot00000000000000 contents.plist000066400000000000000000000051771470572777600346150ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs A A_.glif Aacute A_acute.glif Adieresis A_dieresis.glif B B_.glif C C_.glif D D_.glif E E_.glif F F_.glif G G_.glif H H_.glif I I_.glif I.narrow I_.narrow.glif IJ I_J_.glif J J_.glif J.narrow J_.narrow.glif K K_.glif L L_.glif M M_.glif N N_.glif O O_.glif P P_.glif Q Q_.glif R R_.glif S S_.glif S.closed S_.closed.glif T T_.glif U U_.glif V V_.glif W W_.glif X X_.glif Y Y_.glif Z Z_.glif acute acute.glif arrowdown arrowdown.glif arrowleft arrowleft.glif arrowright arrowright.glif arrowup arrowup.glif colon colon.glif comma comma.glif dieresis dieresis.glif dot dot.glif period period.glif quotedblbase quotedblbase.glif quotedblleft quotedblleft.glif quotedblright quotedblright.glif quotesinglbase quotesinglbase.glif semicolon semicolon.glif space space.glif dieresis.glif000066400000000000000000000005611470572777600343450ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs public.markColor 0.6567,0.6903,1,1 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/dot.glif000066400000000000000000000005351470572777600334040ustar00rootroot00000000000000 layerinfo.plist000066400000000000000000000005631470572777600347420ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs color 1,0.75,0,0.7 lib com.typemytype.robofont.segmentType curve googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/period.glif000066400000000000000000000005361470572777600341010ustar00rootroot00000000000000 quotedblbase.glif000066400000000000000000000003531470572777600352070ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs quotedblleft.glif000066400000000000000000000005051470572777600352260ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs quotedblright.glif000066400000000000000000000004101470572777600354040ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs quotesinglbase.glif000066400000000000000000000003011470572777600355530ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs semicolon.glif000066400000000000000000000003511470572777600345230ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/glyphs/space.glif000066400000000000000000000002321470572777600337030ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/groups.plist000066400000000000000000000007531470572777600330430ustar00rootroot00000000000000 public.kern1.@MMK_L_A A public.kern2.@MMK_R_A A testGroup E F H googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/kerning.plist000066400000000000000000000010051470572777600331500ustar00rootroot00000000000000 T public.kern2.@MMK_R_A -75 V public.kern2.@MMK_R_A -100 public.kern1.@MMK_L_A V -15 layercontents.plist000066400000000000000000000014531470572777600343350ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo foreground glyphs support glyphs.support support.crossbar glyphs.support.crossbar background glyphs.background support.S.wide glyphs.support.S_.wide support.S.middle glyphs.support.S_.middle googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/lib.plist000066400000000000000000000445501470572777600322750ustar00rootroot00000000000000 com.defcon.sortDescriptor allowPseudoUnicode ascending type alphabetical allowPseudoUnicode ascending type category allowPseudoUnicode ascending type unicode allowPseudoUnicode ascending type script allowPseudoUnicode ascending type suffix allowPseudoUnicode ascending type decompositionBase com.letterror.lightMeter.prefs chunkSize 5 diameter 200 drawTail invert toolDiameter 30 toolStyle fluid com.typemytype.robofont.background.layerStrokeColor 0.0 0.8 0.2 0.7 com.typemytype.robofont.compileSettings.autohint com.typemytype.robofont.compileSettings.checkOutlines com.typemytype.robofont.compileSettings.createDummyDSIG com.typemytype.robofont.compileSettings.decompose com.typemytype.robofont.compileSettings.generateFormat 0 com.typemytype.robofont.compileSettings.releaseMode com.typemytype.robofont.foreground.layerStrokeColor 0.5 0.0 0.5 0.7 com.typemytype.robofont.italicSlantOffset 0 com.typemytype.robofont.segmentType curve com.typemytype.robofont.shouldAddPointsInSplineConversion 1 com.typesupply.MetricsMachine4.groupColors @MMK_L_A 1.0 0.0 0.0 0.25 @MMK_L_C 1.0 0.5 0.0 0.25 @MMK_L_E 1.0 1.0 0.0 0.25 @MMK_L_I 0.0 1.0 0.0 0.25 @MMK_L_N 0.0 1.0 1.0 0.25 @MMK_L_O 0.0 0.5 1.0 0.25 @MMK_L_S 0.0 0.0 1.0 0.25 @MMK_L_U 0.5 0.0 1.0 0.25 @MMK_L_Y 1.0 0.0 1.0 0.25 @MMK_L_Z 1.0 0.0 0.5 0.25 @MMK_L_a 1.0 0.0 0.0 0.25 @MMK_L_c 1.0 0.5 0.0 0.25 @MMK_L_e 1.0 1.0 0.0 0.25 @MMK_L_i 0.0 1.0 0.0 0.25 @MMK_L_n 0.0 1.0 1.0 0.25 @MMK_L_o 0.0 0.5 1.0 0.25 @MMK_L_s 0.0 0.0 1.0 0.25 @MMK_L_u 0.5 0.0 1.0 0.25 @MMK_L_y 1.0 0.0 1.0 0.25 @MMK_L_z 1.0 0.0 0.5 0.25 @MMK_R_A 1.0 0.0 0.0 0.25 @MMK_R_C 1.0 0.5 0.0 0.25 @MMK_R_E 1.0 1.0 0.0 0.25 @MMK_R_I 0.0 1.0 0.0 0.25 @MMK_R_N 0.0 1.0 1.0 0.25 @MMK_R_O 0.0 0.5 1.0 0.25 @MMK_R_S 0.0 0.0 1.0 0.25 @MMK_R_U 0.5 0.0 1.0 0.25 @MMK_R_Y 1.0 0.0 1.0 0.25 @MMK_R_Z 1.0 0.0 0.5 0.25 @MMK_R_a 1.0 0.0 0.0 0.25 @MMK_R_c 1.0 0.5 0.0 0.25 @MMK_R_e 1.0 1.0 0.0 0.25 @MMK_R_i 0.0 1.0 0.0 0.25 @MMK_R_n 0.0 1.0 1.0 0.25 @MMK_R_o 0.0 0.5 1.0 0.25 @MMK_R_s 0.0 0.0 1.0 0.25 @MMK_R_u 0.5 0.0 1.0 0.25 @MMK_R_y 1.0 0.0 1.0 0.25 @MMK_R_z 1.0 0.0 0.5 0.25 com.typesupply.defcon.sortDescriptor ascending space A Agrave Aacute Acircumflex Atilde Adieresis Aring B C Ccedilla D E Egrave Eacute Ecircumflex Edieresis F G H I Igrave Iacute Icircumflex Idieresis J K L M N Ntilde O Ograve Oacute Ocircumflex Otilde Odieresis P Q R S Scaron T U Ugrave Uacute Ucircumflex Udieresis V W X Y Yacute Ydieresis Z Zcaron AE Eth Oslash Thorn Lslash OE a agrave aacute acircumflex atilde adieresis aring b c ccedilla d e egrave eacute ecircumflex edieresis f g h i igrave iacute icircumflex idieresis j k l m n ntilde o ograve oacute ocircumflex otilde odieresis p q r s scaron t u ugrave uacute ucircumflex udieresis v w x y yacute ydieresis z zcaron ordfeminine ordmasculine germandbls ae eth oslash thorn dotlessi lslash oe mu zero one two three four five six seven eight nine onesuperior twosuperior threesuperior onequarter onehalf threequarters underscore hyphen endash emdash parenleft parenright bracketleft bracketright braceleft braceright numbersign percent perthousand quotesingle quotedbl quoteleft quoteright quotedblleft quotedblright quotesinglbase quotedblbase guilsinglleft guilsinglright asterisk dagger daggerdbl period comma colon semicolon ellipsis exclam exclamdown question questiondown slash backslash fraction bar brokenbar at ampersand section paragraph periodcentered bullet plus minus plusminus divide multiply equal less greater logicalnot dollar cent sterling currency yen Euro asciicircum asciitilde acute grave hungarumlaut circumflex caron breve tilde macron dieresis dotaccent ring cedilla ogonek copyright registered trademark degree florin guillemotleft guillemotright fi fl a_b_c .notdef type glyphList public.glyphOrder A Aacute Adieresis B C D E F G H I J K L M N O P Q R S T U V W X Y Z S.closed I.narrow J.narrow quotesinglbase quotedblbase quotedblleft quotedblright comma period colon semicolon arrowleft arrowup arrowright arrowdown dot dieresis acute space IJ testLibItemKey a b c googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightCondensed.ufo/metainfo.plist000066400000000000000000000004761470572777600333300ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/000077500000000000000000000000001470572777600274305ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/features.fea000066400000000000000000000000451470572777600317220ustar00rootroot00000000000000# this is the feature from lightWide googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/fontinfo.plist000066400000000000000000000035211470572777600323300ustar00rootroot00000000000000 ascender 700 capHeight 700 copyright License same as MutatorMath. BSD 3-clause. [test-token: D] descender -200 familyName MutatorMathTest guidelines italicAngle 0 openTypeNameLicense License same as MutatorMath. BSD 3-clause. [test-token: D] openTypeOS2VendorID LTTR postscriptBlueValues postscriptDefaultWidthX 500 postscriptFamilyBlues postscriptFamilyOtherBlues postscriptFontName MutatorMathTest-LightWide postscriptFullName MutatorMathTest LightWide postscriptOtherBlues postscriptSlantAngle 0 postscriptStemSnapH postscriptStemSnapV postscriptWindowsCharacterSet 1 styleMapFamilyName styleMapStyleName regular styleName LightWide unitsPerEm 1000 versionMajor 1 versionMinor 2 xHeight 500 year 2004 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs.background/000077500000000000000000000000001470572777600330545ustar00rootroot00000000000000S_.closed.glif000066400000000000000000000036551470572777600354620ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs.background contents.plist000066400000000000000000000003741470572777600357130ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs.background S.closed S_.closed.glif layerinfo.plist000066400000000000000000000003661470572777600360470ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs.background color 0.5,1,0,0.7 glyphs.master_width_0.00_weight_0.00/000077500000000000000000000000001470572777600360115ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufocontents.plist000066400000000000000000000002651470572777600407260ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs.master_width_0.00_weight_0.00 layerinfo.plist000066400000000000000000000003551470572777600410610ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs.master_width_0.00_weight_0.00 color 0,0.25,1,0.7 glyphs.master_width_500.00_weight_500.00/000077500000000000000000000000001470572777600363235ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufoS_.glif000066400000000000000000000046331470572777600375350ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs.master_width_500.00_weight_500.00 contents.plist000066400000000000000000000003441470572777600412360ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs.master_width_500.00_weight_500.00 S S_.glif layerinfo.plist000066400000000000000000000005301470572777600413660ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs.master_width_500.00_weight_500.00 color 0,1,0.25,0.7 lib com.typemytype.robofont.segmentType curve glyphs.master_width_695.65_weight_166.38/000077500000000000000000000000001470572777600364005ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufocontents.plist000066400000000000000000000002651470572777600413150ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs.master_width_695.65_weight_166.38 layerinfo.plist000066400000000000000000000003541470572777600414470ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs.master_width_695.65_weight_166.38 color 0.5,0,1,0.7 glyphs.master_width_720.00_weight_645.00/000077500000000000000000000000001470572777600363415ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufoS_.glif000066400000000000000000000047511470572777600375540ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs.master_width_720.00_weight_645.00 contents.plist000066400000000000000000000003441470572777600412540ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs.master_width_720.00_weight_645.00 S S_.glif layerinfo.plist000066400000000000000000000005251470572777600414100ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs.master_width_720.00_weight_645.00 color 0,1,1,0.7 lib com.typemytype.robofont.segmentType curve googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/000077500000000000000000000000001470572777600307365ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/A_.glif000066400000000000000000000024501470572777600321210ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/A_acute.glif000066400000000000000000000005421470572777600331430ustar00rootroot00000000000000 public.markColor 0.6567,0.6903,1,1 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/A_dieresis.glif000066400000000000000000000005501470572777600336500ustar00rootroot00000000000000 public.markColor 0.6567,0.6903,1,1 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/B_.glif000066400000000000000000000033711470572777600321250ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/C_.glif000066400000000000000000000026101470572777600321210ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/D_.glif000066400000000000000000000021561470572777600321270ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/E_.glif000066400000000000000000000025151470572777600321270ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/F_.glif000066400000000000000000000016721470572777600321330ustar00rootroot00000000000000 com.typemytype.robofont.guideline.magnetic.tCW6w1QdWl 5 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/G_.glif000066400000000000000000000033271470572777600321330ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/H_.glif000066400000000000000000000013561470572777600321340ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/I_.glif000066400000000000000000000013471470572777600321350ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/I_.narrow.glif000066400000000000000000000012771470572777600334460ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/I_J_.glif000066400000000000000000000022061470572777600324010ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/J_.glif000066400000000000000000000020401470572777600321250ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/J_.narrow.glif000066400000000000000000000014421470572777600334410ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/K_.glif000066400000000000000000000015531470572777600321360ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/L_.glif000066400000000000000000000010361470572777600321330ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/M_.glif000066400000000000000000000016341470572777600321400ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/N_.glif000066400000000000000000000013551470572777600321410ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/O_.glif000066400000000000000000000025541470572777600321440ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/P_.glif000066400000000000000000000021521470572777600321370ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/Q_.glif000066400000000000000000000005721470572777600321440ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/R_.glif000066400000000000000000000026631470572777600321500ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/S_.closed.glif000066400000000000000000000036621470572777600334210ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/S_.glif000066400000000000000000000044661470572777600321540ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/T_.glif000066400000000000000000000010451470572777600321430ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/U_.glif000066400000000000000000000016571470572777600321550ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/V_.glif000066400000000000000000000013441470572777600321470ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/W_.glif000066400000000000000000000015311470572777600321460ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/X_.glif000066400000000000000000000014411470572777600321470ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/Y_.glif000066400000000000000000000013531470572777600321520ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/Z_.glif000066400000000000000000000013601470572777600321510ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/acute.glif000066400000000000000000000005411470572777600327020ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/arrowdown.glif000066400000000000000000000010021470572777600336140ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/arrowleft.glif000066400000000000000000000010061470572777600336030ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/arrowright.glif000066400000000000000000000010061470572777600337660ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/arrowup.glif000066400000000000000000000010051470572777600332740ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/colon.glif000066400000000000000000000003461470572777600327160ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/comma.glif000066400000000000000000000010111470572777600326660ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/contents.plist000066400000000000000000000051771470572777600336620ustar00rootroot00000000000000 A A_.glif Aacute A_acute.glif Adieresis A_dieresis.glif B B_.glif C C_.glif D D_.glif E E_.glif F F_.glif G G_.glif H H_.glif I I_.glif I.narrow I_.narrow.glif IJ I_J_.glif J J_.glif J.narrow J_.narrow.glif K K_.glif L L_.glif M M_.glif N N_.glif O O_.glif P P_.glif Q Q_.glif R R_.glif S S_.glif S.closed S_.closed.glif T T_.glif U U_.glif V V_.glif W W_.glif X X_.glif Y Y_.glif Z Z_.glif acute acute.glif arrowdown arrowdown.glif arrowleft arrowleft.glif arrowright arrowright.glif arrowup arrowup.glif colon colon.glif comma comma.glif dieresis dieresis.glif dot dot.glif period period.glif quotedblbase quotedblbase.glif quotedblleft quotedblleft.glif quotedblright quotedblright.glif quotesinglbase quotesinglbase.glif semicolon semicolon.glif space space.glif googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/dieresis.glif000066400000000000000000000005621470572777600334130ustar00rootroot00000000000000 public.markColor 0.6567,0.6903,1,1 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/dot.glif000066400000000000000000000005351470572777600323720ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/layerinfo.plist000066400000000000000000000005631470572777600340070ustar00rootroot00000000000000 color 1,0.75,0,0.7 lib com.typemytype.robofont.segmentType curve googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/period.glif000066400000000000000000000005401470572777600330620ustar00rootroot00000000000000 quotedblbase.glif000066400000000000000000000003531470572777600341750ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs quotedblleft.glif000066400000000000000000000005051470572777600342140ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs quotedblright.glif000066400000000000000000000004101470572777600343720ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs quotesinglbase.glif000066400000000000000000000003011470572777600345410ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/semicolon.glif000066400000000000000000000003511470572777600335700ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/glyphs/space.glif000066400000000000000000000002321470572777600326710ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/groups.plist000066400000000000000000000005561470572777600320320ustar00rootroot00000000000000 public.kern1.@MMK_L_A A public.kern2.@MMK_R_A A googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/kerning.plist000066400000000000000000000113641470572777600321470ustar00rootroot00000000000000 B H -40 J -85 O -10 S -25 T -85 U -35 V -85 public.kern2.@MMK_R_A -25 C J -75 T -40 V -65 public.kern2.@MMK_R_A -40 E J -80 T -10 F H -35 J -245 O -50 S -70 U -10 public.kern2.@MMK_R_A -125 G J -60 O -15 S -15 T -105 U -20 V -70 public.kern2.@MMK_R_A -40 H J -40 S -30 J J -135 O -10 public.kern2.@MMK_R_A -70 L J -25 O -95 T -305 U -85 V -185 O J -120 S -45 T -90 V -80 public.kern2.@MMK_R_A -30 P J -200 T -20 public.kern2.@MMK_R_A -95 R H -45 J -155 O -55 S -70 T -80 U -60 V -95 public.kern2.@MMK_R_A -80 S H -5 J -115 O -40 S -45 T -50 U -10 V -20 public.kern2.@MMK_R_A -45 T H -15 J -315 O -90 S -25 public.kern2.@MMK_R_A -215 U J -140 public.kern2.@MMK_R_A -75 V H -20 J -265 O -55 S -50 public.kern2.@MMK_R_A -210 public.kern1.@MMK_L_A J -35 O -55 T -190 U -95 V -180 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/layercontents.plist000066400000000000000000000005771470572777600334100ustar00rootroot00000000000000 foreground glyphs background glyphs.background googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/lib.plist000066400000000000000000000435631470572777600312660ustar00rootroot00000000000000 com.defcon.sortDescriptor allowPseudoUnicode ascending type alphabetical allowPseudoUnicode ascending type category allowPseudoUnicode ascending type unicode allowPseudoUnicode ascending type script allowPseudoUnicode ascending type suffix allowPseudoUnicode ascending type decompositionBase com.typemytype.robofont.background.layerStrokeColor 1.0 0.75 0.0 0.7 com.typemytype.robofont.compileSettings.autohint com.typemytype.robofont.compileSettings.checkOutlines com.typemytype.robofont.compileSettings.createDummyDSIG com.typemytype.robofont.compileSettings.decompose com.typemytype.robofont.compileSettings.generateFormat 0 com.typemytype.robofont.compileSettings.releaseMode com.typemytype.robofont.foreground.layerStrokeColor 0.5 0.0 0.5 0.7 com.typemytype.robofont.italicSlantOffset 0 com.typemytype.robofont.segmentType curve com.typemytype.robofont.shouldAddPointsInSplineConversion 1 com.typesupply.MetricsMachine4.groupColors @MMK_L_A 1.0 0.0 0.0 0.25 @MMK_L_C 1.0 0.5 0.0 0.25 @MMK_L_E 1.0 1.0 0.0 0.25 @MMK_L_I 0.0 1.0 0.0 0.25 @MMK_L_N 0.0 1.0 1.0 0.25 @MMK_L_O 0.0 0.5 1.0 0.25 @MMK_L_S 0.0 0.0 1.0 0.25 @MMK_L_U 0.5 0.0 1.0 0.25 @MMK_L_Y 1.0 0.0 1.0 0.25 @MMK_L_Z 1.0 0.0 0.5 0.25 @MMK_L_a 1.0 0.0 0.0 0.25 @MMK_L_c 1.0 0.5 0.0 0.25 @MMK_L_e 1.0 1.0 0.0 0.25 @MMK_L_i 0.0 1.0 0.0 0.25 @MMK_L_n 0.0 1.0 1.0 0.25 @MMK_L_o 0.0 0.5 1.0 0.25 @MMK_L_s 0.0 0.0 1.0 0.25 @MMK_L_u 0.5 0.0 1.0 0.25 @MMK_L_y 1.0 0.0 1.0 0.25 @MMK_L_z 1.0 0.0 0.5 0.25 @MMK_R_A 1.0 0.0 0.0 0.25 @MMK_R_C 1.0 0.5 0.0 0.25 @MMK_R_E 1.0 1.0 0.0 0.25 @MMK_R_I 0.0 1.0 0.0 0.25 @MMK_R_N 0.0 1.0 1.0 0.25 @MMK_R_O 0.0 0.5 1.0 0.25 @MMK_R_S 0.0 0.0 1.0 0.25 @MMK_R_U 0.5 0.0 1.0 0.25 @MMK_R_Y 1.0 0.0 1.0 0.25 @MMK_R_Z 1.0 0.0 0.5 0.25 @MMK_R_a 1.0 0.0 0.0 0.25 @MMK_R_c 1.0 0.5 0.0 0.25 @MMK_R_e 1.0 1.0 0.0 0.25 @MMK_R_i 0.0 1.0 0.0 0.25 @MMK_R_n 0.0 1.0 1.0 0.25 @MMK_R_o 0.0 0.5 1.0 0.25 @MMK_R_s 0.0 0.0 1.0 0.25 @MMK_R_u 0.5 0.0 1.0 0.25 @MMK_R_y 1.0 0.0 1.0 0.25 @MMK_R_z 1.0 0.0 0.5 0.25 com.typesupply.defcon.sortDescriptor ascending space A Agrave Aacute Acircumflex Atilde Adieresis Aring B C Ccedilla D E Egrave Eacute Ecircumflex Edieresis F G H I Igrave Iacute Icircumflex Idieresis J K L M N Ntilde O Ograve Oacute Ocircumflex Otilde Odieresis P Q R S Scaron T U Ugrave Uacute Ucircumflex Udieresis V W X Y Yacute Ydieresis Z Zcaron AE Eth Oslash Thorn Lslash OE a agrave aacute acircumflex atilde adieresis aring b c ccedilla d e egrave eacute ecircumflex edieresis f g h i igrave iacute icircumflex idieresis j k l m n ntilde o ograve oacute ocircumflex otilde odieresis p q r s scaron t u ugrave uacute ucircumflex udieresis v w x y yacute ydieresis z zcaron ordfeminine ordmasculine germandbls ae eth oslash thorn dotlessi lslash oe zero one two three four five six seven eight nine onesuperior twosuperior threesuperior onequarter onehalf threequarters underscore hyphen endash emdash parenleft parenright bracketleft bracketright braceleft braceright numbersign percent perthousand quotesingle quotedbl quoteleft quoteright quotedblleft quotedblright quotesinglbase quotedblbase guilsinglleft guilsinglright guillemotleft guillemotright asterisk dagger daggerdbl period comma colon semicolon ellipsis exclam exclamdown question questiondown slash backslash fraction bar brokenbar at ampersand section paragraph periodcentered bullet plus minus plusminus divide multiply equal less greater logicalnot mu dollar cent sterling currency yen Euro florin asciicircum asciitilde acute grave hungarumlaut circumflex caron breve tilde macron dieresis dotaccent ring cedilla ogonek copyright registered trademark degree fi fl .notdef a_b_c type glyphList public.glyphOrder A Aacute Adieresis B C D E F G H I J K L M N O P Q R S T U V W X Y Z S.closed I.narrow J.narrow quotesinglbase quotedblbase quotedblleft quotedblright comma period colon semicolon arrowleft arrowup arrowright arrowdown dot dieresis acute space IJ googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSansLightWide.ufo/metainfo.plist000066400000000000000000000004761470572777600323160ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSans_missing.designspace000066400000000000000000000204161470572777600310020ustar00rootroot00000000000000 com.superpolator.data expandRules horizontalPreviewAxis width includeLegacyRules keepWorkFiles outputFormatUFO 3 previewtext HOPA roundGeometry verticalPreviewAxis weight googlefonts-fontmake-7ed5123/tests/data/MutatorSans/MutatorSans_no_default.designspace000066400000000000000000000172321470572777600314530ustar00rootroot00000000000000 com.superpolator.data expandRules horizontalPreviewAxis width includeLegacyRules keepWorkFiles outputFormatUFO 3 previewtext HOPA roundGeometry verticalPreviewAxis weight googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/000077500000000000000000000000001470572777600233755ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/LICENSE000066400000000000000000000020621470572777600244020ustar00rootroot00000000000000MIT License Copyright (c) 2017 Erik van Blokland Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorFamily_v5_discrete_axis.designspace000066400000000000000000000157661470572777600337400ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/000077500000000000000000000000001470572777600310715ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/features.fea000066400000000000000000000000521470572777600333610ustar00rootroot00000000000000# this is the feature from boldcondensed. googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/fontinfo.plist000066400000000000000000000034611470572777600337740ustar00rootroot00000000000000 ascender 800 capHeight 800 copyright License same as MutatorMath. BSD 3-clause. [test-token: A] descender -200 familyName MutatorMathTest guidelines italicAngle 0 openTypeNameLicense License same as MutatorMath. BSD 3-clause. [test-token: A] openTypeOS2VendorID LTTR postscriptBlueValues postscriptDefaultWidthX 500 postscriptFamilyBlues postscriptFamilyOtherBlues postscriptFontName MutatorMathTest-BoldCondensed postscriptFullName MutatorMathTest BoldCondensed postscriptOtherBlues postscriptSlantAngle 0 postscriptStemSnapH postscriptStemSnapV postscriptWindowsCharacterSet 1 styleMapFamilyName styleMapStyleName regular styleName BoldCondensed unitsPerEm 1000 versionMajor 1 versionMinor 2 xHeight 500 year 2004 glyphs.background/000077500000000000000000000000001470572777600344365ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufoS_.closed.glif000066400000000000000000000034711470572777600371170ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs.background contents.plist000066400000000000000000000003661470572777600373550ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs.background S.closed S_.closed.glif layerinfo.plist000066400000000000000000000003601470572777600375020ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs.background color 0.5,1,0,0.7 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/000077500000000000000000000000001470572777600323775ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/A_.glif000066400000000000000000000023051470572777600335610ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/I_.glif000066400000000000000000000012611470572777600335710ustar00rootroot00000000000000 I_.narrow.glif000066400000000000000000000012141470572777600350170ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 I_J_.glif000066400000000000000000000020411470572777600337600ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs S_.closed.glif000066400000000000000000000040631470572777600347770ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs com.letterror.skateboard.navigator location weight 1000 width 108.0069405692 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs/S_.glif000066400000000000000000000042251470572777600336060ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 contents.plist000066400000000000000000000007311470572777600352330ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs A A_.glif I I_.glif I.narrow I_.narrow.glif IJ I_J_.glif S S_.glif S.closed S_.closed.glif layerinfo.plist000066400000000000000000000005411470572777600353650ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/glyphs color 1,0.75,0,0.7 lib com.typemytype.robofont.segmentType curve layercontents.plist000066400000000000000000000005511470572777600347620ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo foreground glyphs background glyphs.background googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/lib.plist000066400000000000000000000152671470572777600327270ustar00rootroot00000000000000 com.defcon.sortDescriptor allowPseudoUnicode ascending type alphabetical allowPseudoUnicode ascending type category allowPseudoUnicode ascending type unicode allowPseudoUnicode ascending type script allowPseudoUnicode ascending type suffix allowPseudoUnicode ascending type decompositionBase com.letterror.lightMeter.prefs chunkSize 5 diameter 200 drawTail invert toolDiameter 30 toolStyle fluid com.typemytype.robofont.background.layerStrokeColor 0 0.8 0.2 0.7 com.typemytype.robofont.compileSettings.autohint com.typemytype.robofont.compileSettings.checkOutlines com.typemytype.robofont.compileSettings.createDummyDSIG com.typemytype.robofont.compileSettings.decompose com.typemytype.robofont.compileSettings.generateFormat 0 com.typemytype.robofont.compileSettings.releaseMode com.typemytype.robofont.foreground.layerStrokeColor 0.5 0 0.5 0.7 com.typemytype.robofont.italicSlantOffset 0 com.typemytype.robofont.segmentType curve com.typemytype.robofont.shouldAddPointsInSplineConversion 1 com.typesupply.defcon.sortDescriptor ascending space A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n ntilde o p q r s t u v w x y z zcaron zero one two three four five six seven eight nine underscore hyphen endash emdash parenleft parenright bracketleft bracketright braceleft braceright numbersign percent period comma colon semicolon exclam question slash backslash bar at ampersand paragraph bullet dollar trademark fi fl .notdef a_b_c Atilde Adieresis Acircumflex Aring Ccedilla Agrave Aacute quotedblright quotedblleft type glyphList public.glyphOrder A Aacute Adieresis B C D E F G H I J K L M N O P Q R S T U V W X Y Z IJ S.closed I.narrow J.narrow quotesinglbase quotedblbase quotedblleft quotedblright comma period colon semicolon dot dieresis acute space arrowdown arrowleft arrowright arrowup googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldCondensed.ufo/metainfo.plist000066400000000000000000000004641470572777600337540ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/000077500000000000000000000000001470572777600300575ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/features.fea000066400000000000000000000000441470572777600323500ustar00rootroot00000000000000# this is the feature from BoldWide googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/fontinfo.plist000066400000000000000000000034421470572777600327610ustar00rootroot00000000000000 ascender 800 capHeight 800 copyright License same as MutatorMath. BSD 3-clause. [test-token: B] descender -200 familyName MutatorMathTest guidelines italicAngle 0 openTypeNameLicense License same as MutatorMath. BSD 3-clause. [test-token: B] openTypeOS2VendorID LTTR postscriptBlueValues postscriptDefaultWidthX 500 postscriptFamilyBlues postscriptFamilyOtherBlues postscriptFontName MutatorMathTest-BoldWide postscriptFullName MutatorMathTest BoldWide postscriptOtherBlues postscriptSlantAngle 0 postscriptStemSnapH postscriptStemSnapV postscriptWindowsCharacterSet 1 styleMapFamilyName styleMapStyleName regular styleName BoldWide unitsPerEm 1000 versionMajor 1 versionMinor 2 xHeight 500 year 2004 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background/000077500000000000000000000000001470572777600335035ustar00rootroot00000000000000S_.closed.glif000066400000000000000000000034671470572777600361120ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background S_.glif000066400000000000000000000035111470572777600346300ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background contents.plist000066400000000000000000000004401470572777600363340ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background S S_.glif S.closed S_.closed.glif layerinfo.plist000066400000000000000000000003601470572777600364700ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs.background color 0.5,1,0,0.7 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/000077500000000000000000000000001470572777600313655ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/A_.glif000066400000000000000000000015571470572777600325570ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/I_.glif000066400000000000000000000012621470572777600325600ustar00rootroot00000000000000 I_.narrow.glif000066400000000000000000000012141470572777600340050ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/I_J_.glif000066400000000000000000000020461470572777600330320ustar00rootroot00000000000000 S_.closed.glif000066400000000000000000000042201470572777600337600ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs/S_.glif000066400000000000000000000042361470572777600325760ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 contents.plist000066400000000000000000000007311470572777600342210ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs A A_.glif I I_.glif I.narrow I_.narrow.glif IJ I_J_.glif S S_.glif S.closed S_.closed.glif layerinfo.plist000066400000000000000000000005411470572777600343530ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/glyphs color 1,0.75,0,0.7 lib com.typemytype.robofont.segmentType curve googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/layercontents.plist000066400000000000000000000005511470572777600340270ustar00rootroot00000000000000 foreground glyphs background glyphs.background googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/lib.plist000066400000000000000000000247261470572777600317150ustar00rootroot00000000000000 com.defcon.sortDescriptor allowPseudoUnicode ascending type alphabetical allowPseudoUnicode ascending type category allowPseudoUnicode ascending type unicode allowPseudoUnicode ascending type script allowPseudoUnicode ascending type suffix allowPseudoUnicode ascending type decompositionBase com.letterror.lightMeter.prefs chunkSize 5 diameter 200 drawTail invert toolDiameter 30 toolStyle fluid com.typemytype.robofont.background.layerStrokeColor 0 0.8 0.2 0.7 com.typemytype.robofont.compileSettings.autohint com.typemytype.robofont.compileSettings.checkOutlines com.typemytype.robofont.compileSettings.createDummyDSIG com.typemytype.robofont.compileSettings.decompose com.typemytype.robofont.compileSettings.generateFormat 0 com.typemytype.robofont.compileSettings.releaseMode com.typemytype.robofont.foreground.layerStrokeColor 0.5 0 0.5 0.7 com.typemytype.robofont.italicSlantOffset 0 com.typemytype.robofont.segmentType curve com.typemytype.robofont.shouldAddPointsInSplineConversion 1 com.typesupply.defcon.sortDescriptor ascending space A Agrave Aacute Acircumflex Atilde Adieresis Aring B C Ccedilla D E Egrave Eacute Ecircumflex Edieresis F G H I Igrave Iacute Icircumflex Idieresis J K L M N Ntilde O Ograve Oacute Ocircumflex Otilde Odieresis P Q R S Scaron T U Ugrave Uacute Ucircumflex Udieresis V W X Y Yacute Ydieresis Z Zcaron AE Eth Oslash Thorn Lslash OE a agrave aacute acircumflex atilde adieresis aring b c ccedilla d e egrave eacute ecircumflex edieresis f g h i igrave iacute icircumflex idieresis j k l m n ntilde o ograve oacute ocircumflex otilde odieresis p q r s scaron t u ugrave uacute ucircumflex udieresis v w x y yacute ydieresis z zcaron ordfeminine ordmasculine germandbls ae eth oslash thorn dotlessi lslash oe zero one two three four five six seven eight nine onesuperior twosuperior threesuperior onequarter onehalf threequarters underscore hyphen endash emdash parenleft parenright bracketleft bracketright braceleft braceright numbersign percent perthousand quotesingle quotedbl quoteleft quoteright quotedblleft quotedblright quotesinglbase quotedblbase guilsinglleft guilsinglright guillemotleft guillemotright asterisk dagger daggerdbl period comma colon semicolon ellipsis exclam exclamdown question questiondown slash backslash fraction bar brokenbar at ampersand section paragraph periodcentered bullet plus minus plusminus divide multiply equal less greater logicalnot mu dollar cent sterling currency yen Euro florin asciicircum asciitilde acute grave hungarumlaut circumflex caron breve tilde macron dieresis dotaccent ring cedilla ogonek copyright registered trademark degree fi fl .notdef a_b_c type glyphList public.glyphOrder A Aacute Adieresis B C D E F G H I J K L M N O P Q R S T U V W X Y Z S.closed I.narrow J.narrow quotesinglbase quotedblbase quotedblleft quotedblright comma period colon semicolon dot dieresis acute space IJ arrowdown arrowleft arrowright arrowup googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansBoldWide.ufo/metainfo.plist000066400000000000000000000004641470572777600327420ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/000077500000000000000000000000001470572777600312605ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/features.fea000066400000000000000000000001041470572777600335460ustar00rootroot00000000000000# this is the feature from lightCondensed # Hi_this_is_the_feature. googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/fontinfo.plist000066400000000000000000000034641470572777600341660ustar00rootroot00000000000000 ascender 700 capHeight 700 copyright License same as MutatorMath. BSD 3-clause. [test-token: C] descender -200 familyName MutatorMathTest guidelines italicAngle 0 openTypeNameLicense License same as MutatorMath. BSD 3-clause. [test-token: C] openTypeOS2VendorID LTTR postscriptBlueValues postscriptDefaultWidthX 500 postscriptFamilyBlues postscriptFamilyOtherBlues postscriptFontName MutatorMathTest-LightCondensed postscriptFullName MutatorMathTest LightCondensed postscriptOtherBlues postscriptSlantAngle 0 postscriptStemSnapH postscriptStemSnapV postscriptWindowsCharacterSet 1 styleMapFamilyName styleMapStyleName regular styleName LightCondensed unitsPerEm 1000 versionMajor 1 versionMinor 2 xHeight 500 year 2004 glyphs.background/000077500000000000000000000000001470572777600346255ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufoS_.closed.glif000066400000000000000000000067231470572777600373110ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.background S_.glif000066400000000000000000000050711470572777600360340ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.background com.letterror.skateboard.navigator location weight 820 width 1000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 contents.plist000066400000000000000000000004401470572777600375350ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.background S S_.glif S.closed S_.closed.glif layerinfo.plist000066400000000000000000000003561470572777600376760ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.background color 0,1,1,0.7 glyphs.support.S_.middle/000077500000000000000000000000001470572777600360175ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufoS_.closed.glif000066400000000000000000000046741470572777600405060ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.middle com.letterror.skateboard.navigator location weight 700 width 569.078 contents.plist000066400000000000000000000003661470572777600407360ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.middle S.closed S_.closed.glif layerinfo.plist000066400000000000000000000003601470572777600410630ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.middle color 0.5,0,1,0.7 glyphs.support.S_.wide/000077500000000000000000000000001470572777600355115ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufoS_.closed.glif000066400000000000000000000057641470572777600402010ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide com.letterror.skateboard.navigator location weight 673.7998527961 width 1000 S_.glif000066400000000000000000000057531470572777600367270ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide com.letterror.skateboard.navigator location weight 759.5997715405 width 1000 contents.plist000066400000000000000000000004401470572777600404210ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide S S_.glif S.closed S_.closed.glif layerinfo.plist000066400000000000000000000003611470572777600405560ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.S_.wide color 0,0.25,1,0.7 glyphs.support.crossbar/000077500000000000000000000000001470572777600360375ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufoS_.glif000066400000000000000000000056771470572777600372620ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbar com.letterror.skateboard.navigator location weight 889.1982375724 width 0 contents.plist000066400000000000000000000003501470572777600407470ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbar S S_.glif layerinfo.plist000066400000000000000000000003611470572777600411040ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbar color 0,1,0.25,0.7 glyphs.support.crossbars/000077500000000000000000000000001470572777600362225ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufoE_.glif000066400000000000000000000022301470572777600374050ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbars contents.plist000066400000000000000000000003561470572777600411400ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbars E E_.glif layerinfo.plist000066400000000000000000000002671470572777600412740ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support.crossbars glyphs.support/000077500000000000000000000000001470572777600342225ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufoA_.glif000066400000000000000000000013341470572777600354050ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support com.letterror.skateboard.navigator location space 0 weight 600 width 500 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 S_.glif000066400000000000000000000046521470572777600354350ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support com.letterror.skateboard.navigator location space 25 weight 707.6485770089 width 181.3105119978 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 contents.plist000066400000000000000000000004221470572777600371320ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support A A_.glif S S_.glif layerinfo.plist000066400000000000000000000005411470572777600372670ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs.support color 0,1,0.25,0.7 lib com.typemytype.robofont.segmentType curve googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/000077500000000000000000000000001470572777600325665ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/A_.glif000066400000000000000000000015521470572777600337530ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/I_.glif000066400000000000000000000012571470572777600337650ustar00rootroot00000000000000 I_.narrow.glif000066400000000000000000000012141470572777600352060ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 I_J_.glif000066400000000000000000000020041470572777600341460ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs S_.closed.glif000066400000000000000000000034431470572777600351670ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs/S_.glif000066400000000000000000000043071470572777600337760ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 contents.plist000066400000000000000000000007311470572777600354220ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs A A_.glif I I_.glif I.narrow I_.narrow.glif IJ I_J_.glif S S_.glif S.closed S_.closed.glif layerinfo.plist000066400000000000000000000005411470572777600355540ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/glyphs color 1,0.75,0,0.7 lib com.typemytype.robofont.segmentType curve layercontents.plist000066400000000000000000000013551470572777600351540ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo foreground glyphs support glyphs.support support.crossbar glyphs.support.crossbar background glyphs.background support.S.wide glyphs.support.S_.wide support.S.middle glyphs.support.S_.middle googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/lib.plist000066400000000000000000000402541470572777600331100ustar00rootroot00000000000000 com.defcon.sortDescriptor allowPseudoUnicode ascending type alphabetical allowPseudoUnicode ascending type category allowPseudoUnicode ascending type unicode allowPseudoUnicode ascending type script allowPseudoUnicode ascending type suffix allowPseudoUnicode ascending type decompositionBase com.letterror.lightMeter.prefs chunkSize 5 diameter 200 drawTail invert toolDiameter 30 toolStyle fluid com.typemytype.robofont.background.layerStrokeColor 0 0.8 0.2 0.7 com.typemytype.robofont.compileSettings.autohint com.typemytype.robofont.compileSettings.checkOutlines com.typemytype.robofont.compileSettings.createDummyDSIG com.typemytype.robofont.compileSettings.decompose com.typemytype.robofont.compileSettings.generateFormat 0 com.typemytype.robofont.compileSettings.releaseMode com.typemytype.robofont.foreground.layerStrokeColor 0.5 0 0.5 0.7 com.typemytype.robofont.italicSlantOffset 0 com.typemytype.robofont.segmentType curve com.typemytype.robofont.shouldAddPointsInSplineConversion 1 com.typesupply.MetricsMachine4.groupColors @MMK_L_A 1 0 0 0.25 @MMK_L_C 1 0.5 0 0.25 @MMK_L_E 1 1 0 0.25 @MMK_L_I 0 1 0 0.25 @MMK_L_N 0 1 1 0.25 @MMK_L_O 0 0.5 1 0.25 @MMK_L_S 0 0 1 0.25 @MMK_L_U 0.5 0 1 0.25 @MMK_L_Y 1 0 1 0.25 @MMK_L_Z 1 0 0.5 0.25 @MMK_L_a 1 0 0 0.25 @MMK_L_c 1 0.5 0 0.25 @MMK_L_e 1 1 0 0.25 @MMK_L_i 0 1 0 0.25 @MMK_L_n 0 1 1 0.25 @MMK_L_o 0 0.5 1 0.25 @MMK_L_s 0 0 1 0.25 @MMK_L_u 0.5 0 1 0.25 @MMK_L_y 1 0 1 0.25 @MMK_L_z 1 0 0.5 0.25 @MMK_R_A 1 0 0 0.25 @MMK_R_C 1 0.5 0 0.25 @MMK_R_E 1 1 0 0.25 @MMK_R_I 0 1 0 0.25 @MMK_R_N 0 1 1 0.25 @MMK_R_O 0 0.5 1 0.25 @MMK_R_S 0 0 1 0.25 @MMK_R_U 0.5 0 1 0.25 @MMK_R_Y 1 0 1 0.25 @MMK_R_Z 1 0 0.5 0.25 @MMK_R_a 1 0 0 0.25 @MMK_R_c 1 0.5 0 0.25 @MMK_R_e 1 1 0 0.25 @MMK_R_i 0 1 0 0.25 @MMK_R_n 0 1 1 0.25 @MMK_R_o 0 0.5 1 0.25 @MMK_R_s 0 0 1 0.25 @MMK_R_u 0.5 0 1 0.25 @MMK_R_y 1 0 1 0.25 @MMK_R_z 1 0 0.5 0.25 com.typesupply.defcon.sortDescriptor ascending space A Agrave Aacute Acircumflex Atilde Adieresis Aring B C Ccedilla D E Egrave Eacute Ecircumflex Edieresis F G H I Igrave Iacute Icircumflex Idieresis J K L M N Ntilde O Ograve Oacute Ocircumflex Otilde Odieresis P Q R S Scaron T U Ugrave Uacute Ucircumflex Udieresis V W X Y Yacute Ydieresis Z Zcaron AE Eth Oslash Thorn Lslash OE a agrave aacute acircumflex atilde adieresis aring b c ccedilla d e egrave eacute ecircumflex edieresis f g h i igrave iacute icircumflex idieresis j k l m n ntilde o ograve oacute ocircumflex otilde odieresis p q r s scaron t u ugrave uacute ucircumflex udieresis v w x y yacute ydieresis z zcaron ordfeminine ordmasculine germandbls ae eth oslash thorn dotlessi lslash oe mu zero one two three four five six seven eight nine onesuperior twosuperior threesuperior onequarter onehalf threequarters underscore hyphen endash emdash parenleft parenright bracketleft bracketright braceleft braceright numbersign percent perthousand quotesingle quotedbl quoteleft quoteright quotedblleft quotedblright quotesinglbase quotedblbase guilsinglleft guilsinglright asterisk dagger daggerdbl period comma colon semicolon ellipsis exclam exclamdown question questiondown slash backslash fraction bar brokenbar at ampersand section paragraph periodcentered bullet plus minus plusminus divide multiply equal less greater logicalnot dollar cent sterling currency yen Euro asciicircum asciitilde acute grave hungarumlaut circumflex caron breve tilde macron dieresis dotaccent ring cedilla ogonek copyright registered trademark degree florin guillemotleft guillemotright fi fl a_b_c .notdef type glyphList public.glyphOrder A Aacute Adieresis B C D E F G H I J K L M N O P Q R S T U V W X Y Z S.closed I.narrow J.narrow quotesinglbase quotedblbase quotedblleft quotedblright comma period colon semicolon arrowleft arrowup arrowright arrowdown dot dieresis acute space IJ testLibItemKey a b c googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightCondensed.ufo/metainfo.plist000066400000000000000000000004641470572777600341430ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/000077500000000000000000000000001470572777600302465ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/features.fea000066400000000000000000000000451470572777600325400ustar00rootroot00000000000000# this is the feature from lightWide googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/fontinfo.plist000066400000000000000000000034451470572777600331530ustar00rootroot00000000000000 ascender 700 capHeight 700 copyright License same as MutatorMath. BSD 3-clause. [test-token: D] descender -200 familyName MutatorMathTest guidelines italicAngle 0 openTypeNameLicense License same as MutatorMath. BSD 3-clause. [test-token: D] openTypeOS2VendorID LTTR postscriptBlueValues postscriptDefaultWidthX 500 postscriptFamilyBlues postscriptFamilyOtherBlues postscriptFontName MutatorMathTest-LightWide postscriptFullName MutatorMathTest LightWide postscriptOtherBlues postscriptSlantAngle 0 postscriptStemSnapH postscriptStemSnapV postscriptWindowsCharacterSet 1 styleMapFamilyName styleMapStyleName regular styleName LightWide unitsPerEm 1000 versionMajor 1 versionMinor 2 xHeight 500 year 2004 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.background/000077500000000000000000000000001470572777600336725ustar00rootroot00000000000000S_.closed.glif000066400000000000000000000034321470572777600362710ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.background contents.plist000066400000000000000000000003661470572777600365320ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.background S.closed S_.closed.glif layerinfo.plist000066400000000000000000000003601470572777600366570ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.background color 0.5,1,0,0.7 glyphs.master_width_0.00_weight_0.00/000077500000000000000000000000001470572777600366275ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufocontents.plist000066400000000000000000000002651470572777600415440ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_0.00_weight_0.00 layerinfo.plist000066400000000000000000000003551470572777600416770ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_0.00_weight_0.00 color 0,0.25,1,0.7 glyphs.master_width_500.00_weight_500.00/000077500000000000000000000000001470572777600371415ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufoS_.glif000066400000000000000000000046331470572777600403530ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_500.00_weight_500.00 contents.plist000066400000000000000000000003441470572777600420540ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_500.00_weight_500.00 S S_.glif layerinfo.plist000066400000000000000000000005301470572777600422040ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_500.00_weight_500.00 color 0,1,0.25,0.7 lib com.typemytype.robofont.segmentType curve glyphs.master_width_695.65_weight_166.38/000077500000000000000000000000001470572777600372165ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufocontents.plist000066400000000000000000000002651470572777600421330ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_695.65_weight_166.38 layerinfo.plist000066400000000000000000000003541470572777600422650ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_695.65_weight_166.38 color 0.5,0,1,0.7 glyphs.master_width_720.00_weight_645.00/000077500000000000000000000000001470572777600371575ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufoS_.glif000066400000000000000000000047511470572777600403720ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_720.00_weight_645.00 contents.plist000066400000000000000000000003441470572777600420720ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_720.00_weight_645.00 S S_.glif layerinfo.plist000066400000000000000000000005251470572777600422260ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs.master_width_720.00_weight_645.00 color 0,1,1,0.7 lib com.typemytype.robofont.segmentType curve googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/000077500000000000000000000000001470572777600315545ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/A_.glif000066400000000000000000000023061470572777600327370ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/I_.glif000066400000000000000000000012631470572777600327500ustar00rootroot00000000000000 I_.narrow.glif000066400000000000000000000012161470572777600341760ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/I_J_.glif000066400000000000000000000020511470572777600332150ustar00rootroot00000000000000 S_.closed.glif000066400000000000000000000034471470572777600341610ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs/S_.glif000066400000000000000000000042141470572777600327610ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 contents.plist000066400000000000000000000007311470572777600344100ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs A A_.glif I I_.glif I.narrow I_.narrow.glif IJ I_J_.glif S S_.glif S.closed S_.closed.glif layerinfo.plist000066400000000000000000000005411470572777600345420ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/glyphs color 1,0.75,0,0.7 lib com.typemytype.robofont.segmentType curve googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/layercontents.plist000066400000000000000000000005511470572777600342160ustar00rootroot00000000000000 foreground glyphs background glyphs.background googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/lib.plist000066400000000000000000000373641470572777600321060ustar00rootroot00000000000000 com.defcon.sortDescriptor allowPseudoUnicode ascending type alphabetical allowPseudoUnicode ascending type category allowPseudoUnicode ascending type unicode allowPseudoUnicode ascending type script allowPseudoUnicode ascending type suffix allowPseudoUnicode ascending type decompositionBase com.typemytype.robofont.background.layerStrokeColor 1 0.75 0 0.7 com.typemytype.robofont.compileSettings.autohint com.typemytype.robofont.compileSettings.checkOutlines com.typemytype.robofont.compileSettings.createDummyDSIG com.typemytype.robofont.compileSettings.decompose com.typemytype.robofont.compileSettings.generateFormat 0 com.typemytype.robofont.compileSettings.releaseMode com.typemytype.robofont.foreground.layerStrokeColor 0.5 0 0.5 0.7 com.typemytype.robofont.italicSlantOffset 0 com.typemytype.robofont.segmentType curve com.typemytype.robofont.shouldAddPointsInSplineConversion 1 com.typesupply.MetricsMachine4.groupColors @MMK_L_A 1 0 0 0.25 @MMK_L_C 1 0.5 0 0.25 @MMK_L_E 1 1 0 0.25 @MMK_L_I 0 1 0 0.25 @MMK_L_N 0 1 1 0.25 @MMK_L_O 0 0.5 1 0.25 @MMK_L_S 0 0 1 0.25 @MMK_L_U 0.5 0 1 0.25 @MMK_L_Y 1 0 1 0.25 @MMK_L_Z 1 0 0.5 0.25 @MMK_L_a 1 0 0 0.25 @MMK_L_c 1 0.5 0 0.25 @MMK_L_e 1 1 0 0.25 @MMK_L_i 0 1 0 0.25 @MMK_L_n 0 1 1 0.25 @MMK_L_o 0 0.5 1 0.25 @MMK_L_s 0 0 1 0.25 @MMK_L_u 0.5 0 1 0.25 @MMK_L_y 1 0 1 0.25 @MMK_L_z 1 0 0.5 0.25 @MMK_R_A 1 0 0 0.25 @MMK_R_C 1 0.5 0 0.25 @MMK_R_E 1 1 0 0.25 @MMK_R_I 0 1 0 0.25 @MMK_R_N 0 1 1 0.25 @MMK_R_O 0 0.5 1 0.25 @MMK_R_S 0 0 1 0.25 @MMK_R_U 0.5 0 1 0.25 @MMK_R_Y 1 0 1 0.25 @MMK_R_Z 1 0 0.5 0.25 @MMK_R_a 1 0 0 0.25 @MMK_R_c 1 0.5 0 0.25 @MMK_R_e 1 1 0 0.25 @MMK_R_i 0 1 0 0.25 @MMK_R_n 0 1 1 0.25 @MMK_R_o 0 0.5 1 0.25 @MMK_R_s 0 0 1 0.25 @MMK_R_u 0.5 0 1 0.25 @MMK_R_y 1 0 1 0.25 @MMK_R_z 1 0 0.5 0.25 com.typesupply.defcon.sortDescriptor ascending space A Agrave Aacute Acircumflex Atilde Adieresis Aring B C Ccedilla D E Egrave Eacute Ecircumflex Edieresis F G H I Igrave Iacute Icircumflex Idieresis J K L M N Ntilde O Ograve Oacute Ocircumflex Otilde Odieresis P Q R S Scaron T U Ugrave Uacute Ucircumflex Udieresis V W X Y Yacute Ydieresis Z Zcaron AE Eth Oslash Thorn Lslash OE a agrave aacute acircumflex atilde adieresis aring b c ccedilla d e egrave eacute ecircumflex edieresis f g h i igrave iacute icircumflex idieresis j k l m n ntilde o ograve oacute ocircumflex otilde odieresis p q r s scaron t u ugrave uacute ucircumflex udieresis v w x y yacute ydieresis z zcaron ordfeminine ordmasculine germandbls ae eth oslash thorn dotlessi lslash oe zero one two three four five six seven eight nine onesuperior twosuperior threesuperior onequarter onehalf threequarters underscore hyphen endash emdash parenleft parenright bracketleft bracketright braceleft braceright numbersign percent perthousand quotesingle quotedbl quoteleft quoteright quotedblleft quotedblright quotesinglbase quotedblbase guilsinglleft guilsinglright guillemotleft guillemotright asterisk dagger daggerdbl period comma colon semicolon ellipsis exclam exclamdown question questiondown slash backslash fraction bar brokenbar at ampersand section paragraph periodcentered bullet plus minus plusminus divide multiply equal less greater logicalnot mu dollar cent sterling currency yen Euro florin asciicircum asciitilde acute grave hungarumlaut circumflex caron breve tilde macron dieresis dotaccent ring cedilla ogonek copyright registered trademark degree fi fl .notdef a_b_c type glyphList public.glyphOrder A Aacute Adieresis B C D E F G H I J K L M N O P Q R S T U V W X Y Z S.closed I.narrow J.narrow quotesinglbase quotedblbase quotedblleft quotedblright comma period colon semicolon arrowleft arrowup arrowright arrowdown dot dieresis acute space IJ googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSansLightWide.ufo/metainfo.plist000066400000000000000000000004641470572777600331310ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSans_v5_implicit_one_vf.designspace000066400000000000000000000121151470572777600337240ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSans_v5_several_vfs.designspace000066400000000000000000000131551470572777600331020ustar00rootroot00000000000000 MutatorSans_v5_several_vfs_discrete_axis.designspace000066400000000000000000000120741470572777600357300ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/000077500000000000000000000000001470572777600314245ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/features.fea000066400000000000000000000001041470572777600337120ustar00rootroot00000000000000# this is the feature from lightCondensed # Hi_this_is_the_feature. fontinfo.plist000066400000000000000000000034711470572777600342510ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo ascender 700 capHeight 700 copyright License same as MutatorMath. BSD 3-clause. [test-token: C] descender -200 familyName MutatorMathTest guidelines italicAngle 0 openTypeNameLicense License same as MutatorMath. BSD 3-clause. [test-token: C] openTypeOS2VendorID LTTR postscriptBlueValues postscriptDefaultWidthX 500 postscriptFamilyBlues postscriptFamilyOtherBlues postscriptFontName MutatorMathTest-LightCondensed postscriptFullName MutatorMathTest LightCondensed postscriptOtherBlues postscriptSlantAngle 0 postscriptStemSnapH postscriptStemSnapV postscriptWindowsCharacterSet 1 styleMapFamilyName styleMapStyleName regular styleName SerifLightCondensed unitsPerEm 1000 versionMajor 1 versionMinor 2 xHeight 500 year 2004 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/glyphs/000077500000000000000000000000001470572777600327325ustar00rootroot00000000000000A_.glif000066400000000000000000000023141470572777600340350ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/glyphs contents.plist000066400000000000000000000003501470572777600355630ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/glyphs A A_.glif layercontents.plist000066400000000000000000000004171470572777600353160ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo foreground glyphs googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo/lib.plist000066400000000000000000000402541470572777600332540ustar00rootroot00000000000000 com.defcon.sortDescriptor allowPseudoUnicode ascending type alphabetical allowPseudoUnicode ascending type category allowPseudoUnicode ascending type unicode allowPseudoUnicode ascending type script allowPseudoUnicode ascending type suffix allowPseudoUnicode ascending type decompositionBase com.letterror.lightMeter.prefs chunkSize 5 diameter 200 drawTail invert toolDiameter 30 toolStyle fluid com.typemytype.robofont.background.layerStrokeColor 0 0.8 0.2 0.7 com.typemytype.robofont.compileSettings.autohint com.typemytype.robofont.compileSettings.checkOutlines com.typemytype.robofont.compileSettings.createDummyDSIG com.typemytype.robofont.compileSettings.decompose com.typemytype.robofont.compileSettings.generateFormat 0 com.typemytype.robofont.compileSettings.releaseMode com.typemytype.robofont.foreground.layerStrokeColor 0.5 0 0.5 0.7 com.typemytype.robofont.italicSlantOffset 0 com.typemytype.robofont.segmentType curve com.typemytype.robofont.shouldAddPointsInSplineConversion 1 com.typesupply.MetricsMachine4.groupColors @MMK_L_A 1 0 0 0.25 @MMK_L_C 1 0.5 0 0.25 @MMK_L_E 1 1 0 0.25 @MMK_L_I 0 1 0 0.25 @MMK_L_N 0 1 1 0.25 @MMK_L_O 0 0.5 1 0.25 @MMK_L_S 0 0 1 0.25 @MMK_L_U 0.5 0 1 0.25 @MMK_L_Y 1 0 1 0.25 @MMK_L_Z 1 0 0.5 0.25 @MMK_L_a 1 0 0 0.25 @MMK_L_c 1 0.5 0 0.25 @MMK_L_e 1 1 0 0.25 @MMK_L_i 0 1 0 0.25 @MMK_L_n 0 1 1 0.25 @MMK_L_o 0 0.5 1 0.25 @MMK_L_s 0 0 1 0.25 @MMK_L_u 0.5 0 1 0.25 @MMK_L_y 1 0 1 0.25 @MMK_L_z 1 0 0.5 0.25 @MMK_R_A 1 0 0 0.25 @MMK_R_C 1 0.5 0 0.25 @MMK_R_E 1 1 0 0.25 @MMK_R_I 0 1 0 0.25 @MMK_R_N 0 1 1 0.25 @MMK_R_O 0 0.5 1 0.25 @MMK_R_S 0 0 1 0.25 @MMK_R_U 0.5 0 1 0.25 @MMK_R_Y 1 0 1 0.25 @MMK_R_Z 1 0 0.5 0.25 @MMK_R_a 1 0 0 0.25 @MMK_R_c 1 0.5 0 0.25 @MMK_R_e 1 1 0 0.25 @MMK_R_i 0 1 0 0.25 @MMK_R_n 0 1 1 0.25 @MMK_R_o 0 0.5 1 0.25 @MMK_R_s 0 0 1 0.25 @MMK_R_u 0.5 0 1 0.25 @MMK_R_y 1 0 1 0.25 @MMK_R_z 1 0 0.5 0.25 com.typesupply.defcon.sortDescriptor ascending space A Agrave Aacute Acircumflex Atilde Adieresis Aring B C Ccedilla D E Egrave Eacute Ecircumflex Edieresis F G H I Igrave Iacute Icircumflex Idieresis J K L M N Ntilde O Ograve Oacute Ocircumflex Otilde Odieresis P Q R S Scaron T U Ugrave Uacute Ucircumflex Udieresis V W X Y Yacute Ydieresis Z Zcaron AE Eth Oslash Thorn Lslash OE a agrave aacute acircumflex atilde adieresis aring b c ccedilla d e egrave eacute ecircumflex edieresis f g h i igrave iacute icircumflex idieresis j k l m n ntilde o ograve oacute ocircumflex otilde odieresis p q r s scaron t u ugrave uacute ucircumflex udieresis v w x y yacute ydieresis z zcaron ordfeminine ordmasculine germandbls ae eth oslash thorn dotlessi lslash oe mu zero one two three four five six seven eight nine onesuperior twosuperior threesuperior onequarter onehalf threequarters underscore hyphen endash emdash parenleft parenright bracketleft bracketright braceleft braceright numbersign percent perthousand quotesingle quotedbl quoteleft quoteright quotedblleft quotedblright quotesinglbase quotedblbase guilsinglleft guilsinglright asterisk dagger daggerdbl period comma colon semicolon ellipsis exclam exclamdown question questiondown slash backslash fraction bar brokenbar at ampersand section paragraph periodcentered bullet plus minus plusminus divide multiply equal less greater logicalnot dollar cent sterling currency yen Euro asciicircum asciitilde acute grave hungarumlaut circumflex caron breve tilde macron dieresis dotaccent ring cedilla ogonek copyright registered trademark degree florin guillemotleft guillemotright fi fl a_b_c .notdef type glyphList public.glyphOrder A Aacute Adieresis B C D E F G H I J K L M N O P Q R S T U V W X Y Z S.closed I.narrow J.narrow quotesinglbase quotedblbase quotedblleft quotedblright comma period colon semicolon arrowleft arrowup arrowright arrowdown dot dieresis acute space IJ testLibItemKey a b c metainfo.plist000066400000000000000000000004641470572777600342300ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightCondensed.ufo creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/000077500000000000000000000000001470572777600304125ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/features.fea000066400000000000000000000000451470572777600327040ustar00rootroot00000000000000# this is the feature from lightWide googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/fontinfo.plist000066400000000000000000000034521470572777600333150ustar00rootroot00000000000000 ascender 700 capHeight 700 copyright License same as MutatorMath. BSD 3-clause. [test-token: D] descender -200 familyName MutatorMathTest guidelines italicAngle 0 openTypeNameLicense License same as MutatorMath. BSD 3-clause. [test-token: D] openTypeOS2VendorID LTTR postscriptBlueValues postscriptDefaultWidthX 500 postscriptFamilyBlues postscriptFamilyOtherBlues postscriptFontName MutatorMathTest-LightWide postscriptFullName MutatorMathTest LightWide postscriptOtherBlues postscriptSlantAngle 0 postscriptStemSnapH postscriptStemSnapV postscriptWindowsCharacterSet 1 styleMapFamilyName styleMapStyleName regular styleName SerifLightWide unitsPerEm 1000 versionMajor 1 versionMinor 2 xHeight 500 year 2004 googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/glyphs/000077500000000000000000000000001470572777600317205ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/glyphs/A_.glif000066400000000000000000000030521470572777600331020ustar00rootroot00000000000000 com.typemytype.robofont.Image.Brightness 0 com.typemytype.robofont.Image.Contrast 1 com.typemytype.robofont.Image.Saturation 1 com.typemytype.robofont.Image.Sharpness 0.4 contents.plist000066400000000000000000000003501470572777600345510ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/glyphs A A_.glif layercontents.plist000066400000000000000000000004171470572777600343040ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo foreground glyphs googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/lib.plist000066400000000000000000000373641470572777600322520ustar00rootroot00000000000000 com.defcon.sortDescriptor allowPseudoUnicode ascending type alphabetical allowPseudoUnicode ascending type category allowPseudoUnicode ascending type unicode allowPseudoUnicode ascending type script allowPseudoUnicode ascending type suffix allowPseudoUnicode ascending type decompositionBase com.typemytype.robofont.background.layerStrokeColor 1 0.75 0 0.7 com.typemytype.robofont.compileSettings.autohint com.typemytype.robofont.compileSettings.checkOutlines com.typemytype.robofont.compileSettings.createDummyDSIG com.typemytype.robofont.compileSettings.decompose com.typemytype.robofont.compileSettings.generateFormat 0 com.typemytype.robofont.compileSettings.releaseMode com.typemytype.robofont.foreground.layerStrokeColor 0.5 0 0.5 0.7 com.typemytype.robofont.italicSlantOffset 0 com.typemytype.robofont.segmentType curve com.typemytype.robofont.shouldAddPointsInSplineConversion 1 com.typesupply.MetricsMachine4.groupColors @MMK_L_A 1 0 0 0.25 @MMK_L_C 1 0.5 0 0.25 @MMK_L_E 1 1 0 0.25 @MMK_L_I 0 1 0 0.25 @MMK_L_N 0 1 1 0.25 @MMK_L_O 0 0.5 1 0.25 @MMK_L_S 0 0 1 0.25 @MMK_L_U 0.5 0 1 0.25 @MMK_L_Y 1 0 1 0.25 @MMK_L_Z 1 0 0.5 0.25 @MMK_L_a 1 0 0 0.25 @MMK_L_c 1 0.5 0 0.25 @MMK_L_e 1 1 0 0.25 @MMK_L_i 0 1 0 0.25 @MMK_L_n 0 1 1 0.25 @MMK_L_o 0 0.5 1 0.25 @MMK_L_s 0 0 1 0.25 @MMK_L_u 0.5 0 1 0.25 @MMK_L_y 1 0 1 0.25 @MMK_L_z 1 0 0.5 0.25 @MMK_R_A 1 0 0 0.25 @MMK_R_C 1 0.5 0 0.25 @MMK_R_E 1 1 0 0.25 @MMK_R_I 0 1 0 0.25 @MMK_R_N 0 1 1 0.25 @MMK_R_O 0 0.5 1 0.25 @MMK_R_S 0 0 1 0.25 @MMK_R_U 0.5 0 1 0.25 @MMK_R_Y 1 0 1 0.25 @MMK_R_Z 1 0 0.5 0.25 @MMK_R_a 1 0 0 0.25 @MMK_R_c 1 0.5 0 0.25 @MMK_R_e 1 1 0 0.25 @MMK_R_i 0 1 0 0.25 @MMK_R_n 0 1 1 0.25 @MMK_R_o 0 0.5 1 0.25 @MMK_R_s 0 0 1 0.25 @MMK_R_u 0.5 0 1 0.25 @MMK_R_y 1 0 1 0.25 @MMK_R_z 1 0 0.5 0.25 com.typesupply.defcon.sortDescriptor ascending space A Agrave Aacute Acircumflex Atilde Adieresis Aring B C Ccedilla D E Egrave Eacute Ecircumflex Edieresis F G H I Igrave Iacute Icircumflex Idieresis J K L M N Ntilde O Ograve Oacute Ocircumflex Otilde Odieresis P Q R S Scaron T U Ugrave Uacute Ucircumflex Udieresis V W X Y Yacute Ydieresis Z Zcaron AE Eth Oslash Thorn Lslash OE a agrave aacute acircumflex atilde adieresis aring b c ccedilla d e egrave eacute ecircumflex edieresis f g h i igrave iacute icircumflex idieresis j k l m n ntilde o ograve oacute ocircumflex otilde odieresis p q r s scaron t u ugrave uacute ucircumflex udieresis v w x y yacute ydieresis z zcaron ordfeminine ordmasculine germandbls ae eth oslash thorn dotlessi lslash oe zero one two three four five six seven eight nine onesuperior twosuperior threesuperior onequarter onehalf threequarters underscore hyphen endash emdash parenleft parenright bracketleft bracketright braceleft braceright numbersign percent perthousand quotesingle quotedbl quoteleft quoteright quotedblleft quotedblright quotesinglbase quotedblbase guilsinglleft guilsinglright guillemotleft guillemotright asterisk dagger daggerdbl period comma colon semicolon ellipsis exclam exclamdown question questiondown slash backslash fraction bar brokenbar at ampersand section paragraph periodcentered bullet plus minus plusminus divide multiply equal less greater logicalnot mu dollar cent sterling currency yen Euro florin asciicircum asciitilde acute grave hungarumlaut circumflex caron breve tilde macron dieresis dotaccent ring cedilla ogonek copyright registered trademark degree fi fl .notdef a_b_c type glyphList public.glyphOrder A Aacute Adieresis B C D E F G H I J K L M N O P Q R S T U V W X Y Z S.closed I.narrow J.narrow quotesinglbase quotedblbase quotedblleft quotedblright comma period colon semicolon arrowleft arrowup arrowright arrowdown dot dieresis acute space IJ googlefonts-fontmake-7ed5123/tests/data/MutatorSansLite/MutatorSerifLightWide.ufo/metainfo.plist000066400000000000000000000004641470572777600332750ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/000077500000000000000000000000001470572777600232015ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/A.ufo/000077500000000000000000000000001470572777600241515ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/A.ufo/fontinfo.plist000066400000000000000000000014261470572777600270530ustar00rootroot00000000000000 ascender 750 capHeight 700 descender -250 guidelines postscriptBlueValues postscriptFamilyBlues postscriptFamilyOtherBlues postscriptOtherBlues postscriptStemSnapH postscriptStemSnapV unitsPerEm 1000 xHeight 500 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/A.ufo/glyphs/000077500000000000000000000000001470572777600254575ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/A.ufo/glyphs/a.glif000066400000000000000000000006641470572777600265500ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/A.ufo/glyphs/a.swap.glif000066400000000000000000000011051470572777600275100ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/A.ufo/glyphs/aaa.glif000066400000000000000000000005761470572777600270540ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/A.ufo/glyphs/aaa.swap.glif000066400000000000000000000006111470572777600300130ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/A.ufo/glyphs/contents.plist000066400000000000000000000010371470572777600303720ustar00rootroot00000000000000 a a.glif a.swap a.swap.glif aaa aaa.glif aaa.swap aaa.swap.glif space space.glif x x.glif y y.glif googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/A.ufo/glyphs/space.glif000066400000000000000000000002341470572777600274140ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/A.ufo/glyphs/x.glif000066400000000000000000000012061470572777600265700ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/A.ufo/glyphs/y.glif000066400000000000000000000010121470572777600265640ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/A.ufo/groups.plist000066400000000000000000000007271470572777600265530ustar00rootroot00000000000000 public.kern1.a a public.kern1.aswap a.swap public.kern2.a a a.swap googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/A.ufo/kerning.plist000066400000000000000000000013121470572777600266600ustar00rootroot00000000000000 a y 30 a.swap y 40 public.kern1.a x 10 public.kern1.aswap x 20 y a 50 a.swap 60 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/A.ufo/layercontents.plist000066400000000000000000000004371470572777600301240ustar00rootroot00000000000000 public.default glyphs googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/A.ufo/lib.plist000066400000000000000000000006731470572777600260020ustar00rootroot00000000000000 public.glyphOrder space a a.swap aaa aaa.swap x y googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/A.ufo/metainfo.plist000066400000000000000000000004761470572777600270370ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/B.ufo/000077500000000000000000000000001470572777600241525ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/B.ufo/fontinfo.plist000066400000000000000000000014261470572777600270540ustar00rootroot00000000000000 ascender 750 capHeight 700 descender -250 guidelines postscriptBlueValues postscriptFamilyBlues postscriptFamilyOtherBlues postscriptOtherBlues postscriptStemSnapH postscriptStemSnapV unitsPerEm 1000 xHeight 500 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/B.ufo/glyphs/000077500000000000000000000000001470572777600254605ustar00rootroot00000000000000googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/B.ufo/glyphs/a.alt.glif000066400000000000000000000014201470572777600273170ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/B.ufo/glyphs/a.glif000066400000000000000000000016021470572777600265420ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/B.ufo/glyphs/adieresis.alt.glif000066400000000000000000000003151470572777600310510ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/B.ufo/glyphs/adieresis.glif000066400000000000000000000003351470572777600302740ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/B.ufo/glyphs/contents.plist000066400000000000000000000007471470572777600304020ustar00rootroot00000000000000 a a.glif a.alt a.alt.glif adieresis adieresis.glif adieresis.alt adieresis.alt.glif dieresiscomb dieresiscomb.glif googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/B.ufo/glyphs/dieresiscomb.glif000066400000000000000000000010331470572777600307700ustar00rootroot00000000000000 googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/B.ufo/layercontents.plist000066400000000000000000000004371470572777600301250ustar00rootroot00000000000000 public.default glyphs googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/B.ufo/lib.plist000066400000000000000000000006321470572777600257760ustar00rootroot00000000000000 public.glyphOrder a a.alt adieresis dieresiscomb adieresis.alt googlefonts-fontmake-7ed5123/tests/data/SwapGlyphNames/B.ufo/metainfo.plist000066400000000000000000000004761470572777600270400ustar00rootroot00000000000000 creator com.github.fonttools.ufoLib formatVersion 3 googlefonts-fontmake-7ed5123/tests/data/TestSubset.glyphs000066400000000000000000000143621470572777600236420ustar00rootroot00000000000000{ .appVersion = "1150"; DisplayStrings = ( A, B, C, D, ABCD ); copyright = "Nobody 2019"; customParameters = ( { name = "Don't use Production Names"; value = 1; }, { name = glyphOrder; value = ( space, A, C, B, D ); } ); date = "2018-06-15 11:22:00 +0000"; designer = Nobody; familyName = Test; fontMaster = ( { ascender = 800; capHeight = 700; descender = -200; id = "6111F4CC-71E1-4957-80C0-165C5F37B12D"; weightValue = 400; xHeight = 500; }, { ascender = 800; capHeight = 700; descender = -200; id = "5C1BB0B4-E06E-4398-8A0A-FC3D2F3AAFA2"; weight = Bold; weightValue = 700; xHeight = 500; } ); glyphs = ( { glyphname = space; lastChange = "2018-06-15 11:32:24 +0000"; layers = ( { layerId = "6111F4CC-71E1-4957-80C0-165C5F37B12D"; width = 600; }, { layerId = "5C1BB0B4-E06E-4398-8A0A-FC3D2F3AAFA2"; width = 600; } ); unicode = 0020; }, { glyphname = A; lastChange = "2018-06-15 11:40:10 +0000"; layers = ( { layerId = "6111F4CC-71E1-4957-80C0-165C5F37B12D"; paths = ( { closed = 1; nodes = ( "-6 3 LINE", "104 -5 LINE", "201 298 LINE", "358 294 LINE", "477 -3 LINE", "574 9 LINE", "313 699 LINE", "250 704 LINE" ); }, { closed = 1; nodes = ( "298 573 LINE", "349 371 LINE", "215 368 LINE", "267 573 LINE" ); } ); width = 600; }, { layerId = "5C1BB0B4-E06E-4398-8A0A-FC3D2F3AAFA2"; paths = ( { closed = 1; nodes = ( "-36 3 LINE", "104 -5 LINE", "201 278 LINE", "358 274 LINE", "477 -3 LINE", "615 9 LINE", "354 699 LINE", "220 704 LINE" ); }, { closed = 1; nodes = ( "298 603 LINE", "349 371 LINE", "215 368 LINE", "267 603 LINE" ); } ); width = 600; } ); unicode = 0041; }, { glyphname = C; lastChange = "2018-06-15 11:33:54 +0000"; layers = ( { layerId = "6111F4CC-71E1-4957-80C0-165C5F37B12D"; paths = ( { closed = 1; nodes = ( "522 45 OFFCURVE", "414 -7 OFFCURVE", "310 -7 CURVE SMOOTH", "124 -7 OFFCURVE", "-26 157 OFFCURVE", "-26 359 CURVE SMOOTH", "-26 560 OFFCURVE", "124 724 OFFCURVE", "310 724 CURVE SMOOTH", "423 724 OFFCURVE", "512 685 OFFCURVE", "583 601 CURVE", "512 544 LINE", "466 612 OFFCURVE", "395 655 OFFCURVE", "315 655 CURVE SMOOTH", "176 655 OFFCURVE", "63 523 OFFCURVE", "63 360 CURVE SMOOTH", "63 197 OFFCURVE", "176 65 OFFCURVE", "315 65 CURVE SMOOTH", "393 65 OFFCURVE", "463 107 OFFCURVE", "509 172 CURVE", "583 127 LINE" ); } ); width = 600; }, { layerId = "5C1BB0B4-E06E-4398-8A0A-FC3D2F3AAFA2"; paths = ( { closed = 1; nodes = ( "522 45 OFFCURVE", "414 -7 OFFCURVE", "310 -7 CURVE SMOOTH", "124 -7 OFFCURVE", "-26 157 OFFCURVE", "-26 359 CURVE SMOOTH", "-26 560 OFFCURVE", "124 724 OFFCURVE", "310 724 CURVE SMOOTH", "423 724 OFFCURVE", "512 685 OFFCURVE", "583 601 CURVE", "479 512 LINE", "433 580 OFFCURVE", "382 618 OFFCURVE", "302 618 CURVE SMOOTH", "185 618 OFFCURVE", "103 523 OFFCURVE", "103 360 CURVE SMOOTH", "103 197 OFFCURVE", "186 113 OFFCURVE", "295 113 CURVE SMOOTH", "373 113 OFFCURVE", "423 147 OFFCURVE", "469 212 CURVE", "583 127 LINE" ); } ); width = 600; } ); unicode = 0043; }, { glyphname = B; export = 0; lastChange = "2018-06-15 11:34:17 +0000"; layers = ( { layerId = "6111F4CC-71E1-4957-80C0-165C5F37B12D"; paths = ( { closed = 1; nodes = ( "347 5 LINE", "456 5 OFFCURVE", "600 0 OFFCURVE", "600 209 CURVE SMOOTH", "600 387 OFFCURVE", "341 369 OFFCURVE", "261 371 CURVE", "261 392 LINE", "434 392 OFFCURVE", "548 377 OFFCURVE", "548 555 CURVE SMOOTH", "548 661 OFFCURVE", "484 702 OFFCURVE", "348 702 CURVE", "65 702 LINE", "62 3 LINE" ); }, { closed = 1; nodes = ( "159 325 LINE", "391 325 LINE SMOOTH", "471 325 OFFCURVE", "512 276 OFFCURVE", "505 185 CURVE SMOOTH", "499 110 OFFCURVE", "457 72 OFFCURVE", "404 74 CURVE SMOOTH", "178 73 LINE" ); }, { closed = 1; nodes = ( "166 653 LINE", "318 648 LINE", "378 643 OFFCURVE", "436 618 OFFCURVE", "436 561 CURVE SMOOTH", "436 500 OFFCURVE", "409 441 OFFCURVE", "319 433 CURVE", "155 426 LINE" ); } ); width = 600; }, { layerId = "5C1BB0B4-E06E-4398-8A0A-FC3D2F3AAFA2"; paths = ( { closed = 1; nodes = ( "347 5 LINE", "456 5 OFFCURVE", "600 0 OFFCURVE", "600 209 CURVE SMOOTH", "600 387 OFFCURVE", "341 369 OFFCURVE", "261 371 CURVE", "261 392 LINE", "434 392 OFFCURVE", "548 377 OFFCURVE", "548 555 CURVE SMOOTH", "548 661 OFFCURVE", "484 702 OFFCURVE", "348 702 CURVE", "65 702 LINE", "62 3 LINE" ); }, { closed = 1; nodes = ( "189 315 LINE", "361 315 LINE SMOOTH", "441 315 OFFCURVE", "468 262 OFFCURVE", "465 209 CURVE SMOOTH", "461 130 OFFCURVE", "417 94 OFFCURVE", "364 94 CURVE SMOOTH", "208 93 LINE" ); }, { closed = 1; nodes = ( "196 633 LINE", "308 628 LINE", "368 623 OFFCURVE", "416 598 OFFCURVE", "416 539 CURVE SMOOTH", "416 500 OFFCURVE", "399 451 OFFCURVE", "319 443 CURVE", "185 436 LINE" ); } ); width = 600; } ); unicode = 0042; }, { glyphname = D; lastChange = "2018-06-15 11:34:58 +0000"; layers = ( { layerId = "6111F4CC-71E1-4957-80C0-165C5F37B12D"; paths = ( { closed = 1; nodes = ( "501 0 OFFCURVE", "591 133 OFFCURVE", "598 356 CURVE SMOOTH", "606 599 OFFCURVE", "481 709 OFFCURVE", "277 709 CURVE", "30 708 LINE", "33 716 OFFCURVE", "27 239 OFFCURVE", "26 4 CURVE", "273 3 LINE" ); }, { closed = 1; nodes = ( "97 72 LINE", "98 248 OFFCURVE", "102 639 OFFCURVE", "100 633 CURVE", "286 634 LINE", "439 634 OFFCURVE", "513 539 OFFCURVE", "507 356 CURVE SMOOTH", "502 188 OFFCURVE", "454 69 OFFCURVE", "283 71 CURVE" ); } ); width = 600; }, { layerId = "5C1BB0B4-E06E-4398-8A0A-FC3D2F3AAFA2"; paths = ( { closed = 1; nodes = ( "501 0 OFFCURVE", "591 133 OFFCURVE", "598 356 CURVE SMOOTH", "606 599 OFFCURVE", "481 709 OFFCURVE", "277 709 CURVE", "30 708 LINE", "33 716 OFFCURVE", "27 239 OFFCURVE", "26 4 CURVE", "273 3 LINE" ); }, { closed = 1; nodes = ( "147 112 LINE", "148 288 OFFCURVE", "152 619 OFFCURVE", "150 613 CURVE", "262 614 LINE", "409 614 OFFCURVE", "473 499 OFFCURVE", "467 356 CURVE SMOOTH", "460 188 OFFCURVE", "400 111 OFFCURVE", "264 111 CURVE" ); } ); width = 600; } ); unicode = 0044; } ); instances = ( { interpolationWeight = 400; instanceInterpolations = { "6111F4CC-71E1-4957-80C0-165C5F37B12D" = 1; }; name = Regular; }, { customParameters = ( { name = "Keep Glyphs"; value = ( space, A, B, C ); } ); interpolationWeight = 400; instanceInterpolations = { "6111F4CC-71E1-4957-80C0-165C5F37B12D" = 1; }; name = "Subset Regular"; }, { interpolationWeight = 700; instanceInterpolations = { "5C1BB0B4-E06E-4398-8A0A-FC3D2F3AAFA2" = 1; }; name = Bold; weightClass = Bold; } ); unitsPerEm = 1000; versionMajor = 1; versionMinor = 0; } googlefonts-fontmake-7ed5123/tests/data/TestSubset2.glyphs000066400000000000000000000143551470572777600237260ustar00rootroot00000000000000{ .appVersion = "1150"; DisplayStrings = ( A, B, C, D, ABCD ); copyright = "Nobody 2019"; customParameters = ( { name = "Don't use Production Names"; value = 1; }, { name = glyphOrder; value = ( space, A, C, B, D ); } ); date = "2018-06-15 11:22:00 +0000"; designer = Nobody; familyName = Test; fontMaster = ( { ascender = 800; capHeight = 700; descender = -200; id = "6111F4CC-71E1-4957-80C0-165C5F37B12D"; weightValue = 400; xHeight = 500; }, { ascender = 800; capHeight = 700; descender = -200; id = "5C1BB0B4-E06E-4398-8A0A-FC3D2F3AAFA2"; weight = Bold; weightValue = 700; xHeight = 500; } ); glyphs = ( { glyphname = space; lastChange = "2018-06-15 11:32:24 +0000"; layers = ( { layerId = "6111F4CC-71E1-4957-80C0-165C5F37B12D"; width = 600; }, { layerId = "5C1BB0B4-E06E-4398-8A0A-FC3D2F3AAFA2"; width = 600; } ); unicode = 0020; }, { glyphname = A; lastChange = "2018-06-15 11:40:10 +0000"; layers = ( { layerId = "6111F4CC-71E1-4957-80C0-165C5F37B12D"; paths = ( { closed = 1; nodes = ( "-6 3 LINE", "104 -5 LINE", "201 298 LINE", "358 294 LINE", "477 -3 LINE", "574 9 LINE", "313 699 LINE", "250 704 LINE" ); }, { closed = 1; nodes = ( "298 573 LINE", "349 371 LINE", "215 368 LINE", "267 573 LINE" ); } ); width = 600; }, { layerId = "5C1BB0B4-E06E-4398-8A0A-FC3D2F3AAFA2"; paths = ( { closed = 1; nodes = ( "-36 3 LINE", "104 -5 LINE", "201 278 LINE", "358 274 LINE", "477 -3 LINE", "615 9 LINE", "354 699 LINE", "220 704 LINE" ); }, { closed = 1; nodes = ( "298 603 LINE", "349 371 LINE", "215 368 LINE", "267 603 LINE" ); } ); width = 600; } ); unicode = 0041; }, { glyphname = C; lastChange = "2018-06-15 11:33:54 +0000"; layers = ( { layerId = "6111F4CC-71E1-4957-80C0-165C5F37B12D"; paths = ( { closed = 1; nodes = ( "522 45 OFFCURVE", "414 -7 OFFCURVE", "310 -7 CURVE SMOOTH", "124 -7 OFFCURVE", "-26 157 OFFCURVE", "-26 359 CURVE SMOOTH", "-26 560 OFFCURVE", "124 724 OFFCURVE", "310 724 CURVE SMOOTH", "423 724 OFFCURVE", "512 685 OFFCURVE", "583 601 CURVE", "512 544 LINE", "466 612 OFFCURVE", "395 655 OFFCURVE", "315 655 CURVE SMOOTH", "176 655 OFFCURVE", "63 523 OFFCURVE", "63 360 CURVE SMOOTH", "63 197 OFFCURVE", "176 65 OFFCURVE", "315 65 CURVE SMOOTH", "393 65 OFFCURVE", "463 107 OFFCURVE", "509 172 CURVE", "583 127 LINE" ); } ); width = 600; }, { layerId = "5C1BB0B4-E06E-4398-8A0A-FC3D2F3AAFA2"; paths = ( { closed = 1; nodes = ( "522 45 OFFCURVE", "414 -7 OFFCURVE", "310 -7 CURVE SMOOTH", "124 -7 OFFCURVE", "-26 157 OFFCURVE", "-26 359 CURVE SMOOTH", "-26 560 OFFCURVE", "124 724 OFFCURVE", "310 724 CURVE SMOOTH", "423 724 OFFCURVE", "512 685 OFFCURVE", "583 601 CURVE", "479 512 LINE", "433 580 OFFCURVE", "382 618 OFFCURVE", "302 618 CURVE SMOOTH", "185 618 OFFCURVE", "103 523 OFFCURVE", "103 360 CURVE SMOOTH", "103 197 OFFCURVE", "186 113 OFFCURVE", "295 113 CURVE SMOOTH", "373 113 OFFCURVE", "423 147 OFFCURVE", "469 212 CURVE", "583 127 LINE" ); } ); width = 600; } ); unicode = 0043; }, { glyphname = B; export = 0; lastChange = "2018-06-15 11:34:17 +0000"; layers = ( { layerId = "6111F4CC-71E1-4957-80C0-165C5F37B12D"; paths = ( { closed = 1; nodes = ( "347 5 LINE", "456 5 OFFCURVE", "600 0 OFFCURVE", "600 209 CURVE SMOOTH", "600 387 OFFCURVE", "341 369 OFFCURVE", "261 371 CURVE", "261 392 LINE", "434 392 OFFCURVE", "548 377 OFFCURVE", "548 555 CURVE SMOOTH", "548 661 OFFCURVE", "484 702 OFFCURVE", "348 702 CURVE", "65 702 LINE", "62 3 LINE" ); }, { closed = 1; nodes = ( "159 325 LINE", "391 325 LINE SMOOTH", "471 325 OFFCURVE", "512 276 OFFCURVE", "505 185 CURVE SMOOTH", "499 110 OFFCURVE", "457 72 OFFCURVE", "404 74 CURVE SMOOTH", "178 73 LINE" ); }, { closed = 1; nodes = ( "166 653 LINE", "318 648 LINE", "378 643 OFFCURVE", "436 618 OFFCURVE", "436 561 CURVE SMOOTH", "436 500 OFFCURVE", "409 441 OFFCURVE", "319 433 CURVE", "155 426 LINE" ); } ); width = 600; }, { layerId = "5C1BB0B4-E06E-4398-8A0A-FC3D2F3AAFA2"; paths = ( { closed = 1; nodes = ( "347 5 LINE", "456 5 OFFCURVE", "600 0 OFFCURVE", "600 209 CURVE SMOOTH", "600 387 OFFCURVE", "341 369 OFFCURVE", "261 371 CURVE", "261 392 LINE", "434 392 OFFCURVE", "548 377 OFFCURVE", "548 555 CURVE SMOOTH", "548 661 OFFCURVE", "484 702 OFFCURVE", "348 702 CURVE", "65 702 LINE", "62 3 LINE" ); }, { closed = 1; nodes = ( "189 315 LINE", "361 315 LINE SMOOTH", "441 315 OFFCURVE", "468 262 OFFCURVE", "465 209 CURVE SMOOTH", "461 130 OFFCURVE", "417 94 OFFCURVE", "364 94 CURVE SMOOTH", "208 93 LINE" ); }, { closed = 1; nodes = ( "196 633 LINE", "308 628 LINE", "368 623 OFFCURVE", "416 598 OFFCURVE", "416 539 CURVE SMOOTH", "416 500 OFFCURVE", "399 451 OFFCURVE", "319 443 CURVE", "185 436 LINE" ); } ); width = 600; } ); unicode = 0042; }, { glyphname = D; lastChange = "2018-06-15 11:34:58 +0000"; layers = ( { layerId = "6111F4CC-71E1-4957-80C0-165C5F37B12D"; paths = ( { closed = 1; nodes = ( "501 0 OFFCURVE", "591 133 OFFCURVE", "598 356 CURVE SMOOTH", "606 599 OFFCURVE", "481 709 OFFCURVE", "277 709 CURVE", "30 708 LINE", "33 716 OFFCURVE", "27 239 OFFCURVE", "26 4 CURVE", "273 3 LINE" ); }, { closed = 1; nodes = ( "97 72 LINE", "98 248 OFFCURVE", "102 639 OFFCURVE", "100 633 CURVE", "286 634 LINE", "439 634 OFFCURVE", "513 539 OFFCURVE", "507 356 CURVE SMOOTH", "502 188 OFFCURVE", "454 69 OFFCURVE", "283 71 CURVE" ); } ); width = 600; }, { layerId = "5C1BB0B4-E06E-4398-8A0A-FC3D2F3AAFA2"; paths = ( { closed = 1; nodes = ( "501 0 OFFCURVE", "591 133 OFFCURVE", "598 356 CURVE SMOOTH", "606 599 OFFCURVE", "481 709 OFFCURVE", "277 709 CURVE", "30 708 LINE", "33 716 OFFCURVE", "27 239 OFFCURVE", "26 4 CURVE", "273 3 LINE" ); }, { closed = 1; nodes = ( "147 112 LINE", "148 288 OFFCURVE", "152 619 OFFCURVE", "150 613 CURVE", "262 614 LINE", "409 614 OFFCURVE", "473 499 OFFCURVE", "467 356 CURVE SMOOTH", "460 188 OFFCURVE", "400 111 OFFCURVE", "264 111 CURVE" ); } ); width = 600; } ); unicode = 0044; } ); instances = ( { interpolationWeight = 400; instanceInterpolations = { "6111F4CC-71E1-4957-80C0-165C5F37B12D" = 1; }; name = Regular; }, { customParameters = ( { name = "Remove Glyphs"; value = ( A, B, C ); } ); interpolationWeight = 400; instanceInterpolations = { "6111F4CC-71E1-4957-80C0-165C5F37B12D" = 1; }; name = "Subset Regular"; }, { interpolationWeight = 700; instanceInterpolations = { "5C1BB0B4-E06E-4398-8A0A-FC3D2F3AAFA2" = 1; }; name = Bold; weightClass = Bold; } ); unitsPerEm = 1000; versionMajor = 1; versionMinor = 0; } googlefonts-fontmake-7ed5123/tests/test_compatibility.py000066400000000000000000000032061470572777600236510ustar00rootroot00000000000000import pytest import ufoLib2 from fontTools import designspaceLib from fontmake.__main__ import main from fontmake.compatibility import CompatibilityChecker def test_compatibility_checker(data_dir, caplog): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "IncompatibleSans" / "IncompatibleSans.designspace" ) designspace.loadSourceFonts(opener=ufoLib2.objects.Font.open) CompatibilityChecker([s.font for s in designspace.sources]).check() assert "differing number of contours in glyph A" in caplog.text assert "Incompatible Sans Regular had: 2" in caplog.text assert "differing number of points in glyph B, contour 0" in caplog.text assert "differing anchors in glyph A" in caplog.text assert 'Incompatible Sans Bold had: "foo"' in caplog.text assert "Fonts had differing number of components in glyph C" in caplog.text assert ( "Fonts had differing point type in glyph D, contour 0, point 10" in caplog.text ) def test_compatibility_cli(data_dir, caplog): ds = str(data_dir / "IncompatibleSans" / "IncompatibleSans.designspace") with pytest.raises(SystemExit): main(["-o", "variable", "-m", ds]) main(["-o", "ttf", "-m", ds]) with pytest.raises(SystemExit): main(["--check-compatibility", "-o", "ttf", "-m", ds]) # We stopped things before they got to the cu2qu level assert "cu2qu.ufo" not in caplog.text with pytest.raises(SystemExit): main(["--no-check-compatibility", "-o", "variable", "-m", ds]) # Things got to the cu2qu level (i.e. compatibility checker did not run) assert "cu2qu.ufo" in caplog.text googlefonts-fontmake-7ed5123/tests/test_instantiator.py000066400000000000000000000621431470572777600235240ustar00rootroot00000000000000import logging import fontTools.designspaceLib as designspaceLib import pytest import ufoLib2 from fontTools.pens.recordingPen import RecordingPen from ufoLib2.objects.anchor import Anchor import fontmake.instantiator def test_interpolation_weight_width_class(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "MutatorSans" / "MutatorSans.designspace" ) generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) for instance in designspace.instances: instance.font = generator.generate_instance(instance) # LightCondensed font = designspace.instances[0].font assert font.info.openTypeOS2WeightClass == 1 assert font.info.openTypeOS2WidthClass == 1 # BoldCondensed font = designspace.instances[1].font assert font.info.openTypeOS2WeightClass == 1000 assert font.info.openTypeOS2WidthClass == 1 # LightWide font = designspace.instances[2].font assert font.info.openTypeOS2WeightClass == 1 assert font.info.openTypeOS2WidthClass == 9 # BoldWide font = designspace.instances[3].font assert font.info.openTypeOS2WeightClass == 1000 assert font.info.openTypeOS2WidthClass == 9 # Medium_Narrow_I font = designspace.instances[4].font assert font.info.openTypeOS2WeightClass == 500 assert font.info.openTypeOS2WidthClass == 9 # Medium_Wide_I font = designspace.instances[5].font assert font.info.openTypeOS2WeightClass == 500 assert font.info.openTypeOS2WidthClass == 9 # Two font = designspace.instances[6].font assert font.info.openTypeOS2WeightClass == 1000 assert font.info.openTypeOS2WidthClass == 9 # One font = designspace.instances[7].font assert font.info.openTypeOS2WeightClass == 500 assert font.info.openTypeOS2WidthClass == 9 def test_default_groups_only(data_dir, caplog): """Test that only the default source's groups end up in instances.""" d = designspaceLib.DesignSpaceDocument() d.addAxisDescriptor( name="Weight", tag="wght", minimum=300, default=300, maximum=900 ) d.addSourceDescriptor(location={"Weight": 300}, font=ufoLib2.Font()) d.addSourceDescriptor(location={"Weight": 900}, font=ufoLib2.Font()) d.addInstanceDescriptor(styleName="2", location={"Weight": 400}) d.findDefault() d.sources[0].font.groups["public.kern1.GRK_alpha_alt_LC_1ST"] = [ "alpha.alt", "alphatonos.alt", ] d.sources[1].font.groups["public.kern1.GRK_alpha_LC_1ST"] = [ "alpha.alt", "alphatonos.alt", ] generator = fontmake.instantiator.Instantiator.from_designspace(d) assert "contains different groups than the default source" in caplog.text instance = generator.generate_instance(d.instances[0]) assert instance.groups == { "public.kern1.GRK_alpha_alt_LC_1ST": ["alpha.alt", "alphatonos.alt"] } def test_default_groups_only2(data_dir, caplog): """Test that the group difference warning is not triggered if non-default source groups are empty.""" d = designspaceLib.DesignSpaceDocument() d.addAxisDescriptor( name="Weight", tag="wght", minimum=300, default=300, maximum=900 ) d.addSourceDescriptor(location={"Weight": 300}, font=ufoLib2.Font()) d.addSourceDescriptor(location={"Weight": 900}, font=ufoLib2.Font()) d.addInstanceDescriptor(styleName="2", location={"Weight": 400}) d.findDefault() d.sources[0].font.groups["public.kern1.GRK_alpha_alt_LC_1ST"] = [ "alpha.alt", "alphatonos.alt", ] generator = fontmake.instantiator.Instantiator.from_designspace(d) assert "contains different groups than the default source" not in caplog.text instance = generator.generate_instance(d.instances[0]) assert instance.groups == { "public.kern1.GRK_alpha_alt_LC_1ST": ["alpha.alt", "alphatonos.alt"] } def test_interpolation_no_rounding(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "MutatorSans" / "MutatorSans.designspace" ) designspace.instances[4].location = {"weight": 123.456, "width": 789.123} generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=False ) instance_font = generator.generate_instance(designspace.instances[4]) assert isinstance(instance_font.info.ascender, float) assert isinstance(instance_font.kerning[("A", "J")], float) assert isinstance(instance_font["A"].contours[0][0].x, float) def test_interpolation_rounding(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "MutatorSans" / "MutatorSans.designspace" ) designspace.instances[4].location = {"weight": 123.456, "width": 789.123} generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) instance_font = generator.generate_instance(designspace.instances[4]) assert isinstance(instance_font.info.ascender, int) assert isinstance(instance_font.kerning[("A", "J")], int) assert isinstance(instance_font["A"].contours[0][0].x, int) def test_weight_class_from_wght_axis(): assert fontmake.instantiator.weight_class_from_wght_value(-500) == 1 assert fontmake.instantiator.weight_class_from_wght_value(1.1) == 1 assert fontmake.instantiator.weight_class_from_wght_value(1) == 1 assert fontmake.instantiator.weight_class_from_wght_value(500.6) == 501 assert fontmake.instantiator.weight_class_from_wght_value(1000) == 1000 assert fontmake.instantiator.weight_class_from_wght_value(1000.0) == 1000 assert fontmake.instantiator.weight_class_from_wght_value(1000.1) == 1000 assert fontmake.instantiator.weight_class_from_wght_value(2000.1) == 1000 def test_width_class_from_wdth_axis(): assert fontmake.instantiator.width_class_from_wdth_value(-500) == 1 assert fontmake.instantiator.width_class_from_wdth_value(50) == 1 assert fontmake.instantiator.width_class_from_wdth_value(62.5) == 2 assert fontmake.instantiator.width_class_from_wdth_value(75) == 3 assert fontmake.instantiator.width_class_from_wdth_value(87.5) == 4 assert fontmake.instantiator.width_class_from_wdth_value(100) == 5 assert fontmake.instantiator.width_class_from_wdth_value(112) == 6 assert fontmake.instantiator.width_class_from_wdth_value(112.5) == 6 assert fontmake.instantiator.width_class_from_wdth_value(125) == 7 assert fontmake.instantiator.width_class_from_wdth_value(130) == 7 assert fontmake.instantiator.width_class_from_wdth_value(150) == 8 assert fontmake.instantiator.width_class_from_wdth_value(190) == 9 assert fontmake.instantiator.width_class_from_wdth_value(200) == 9 assert fontmake.instantiator.width_class_from_wdth_value(1000) == 9 def test_swap_glyph_names(data_dir): ufo = ufoLib2.Font.open(data_dir / "SwapGlyphNames" / "A.ufo") fontmake.instantiator.swap_glyph_names(ufo, "a", "a.swap") # Test swapped outlines. assert ufo["a"].unicode == 0x61 assert len(ufo["a"]) == 1 assert len(ufo["a"].contours[0]) == 8 assert ufo["a"].width == 666 assert ufo["a.swap"].unicode is None assert len(ufo["a.swap"]) == 1 assert len(ufo["a.swap"].contours[0]) == 4 assert ufo["a.swap"].width == 600 # Test swapped components. assert sorted(c.baseGlyph for c in ufo["aaa"].components) == [ "a.swap", "a.swap", "x", ] assert sorted(c.baseGlyph for c in ufo["aaa.swap"].components) == ["a", "a", "y"] # Test swapped anchors. assert ufo["a"].anchors == [ Anchor(x=153, y=0, name="bottom"), Anchor(x=153, y=316, name="top"), ] assert ufo["a.swap"].anchors == [ Anchor(x=351, y=0, name="bottom"), Anchor(x=351, y=613, name="top"), ] # Test swapped glyph kerning. assert ufo.kerning == { ("public.kern1.a", "x"): 10, ("public.kern1.aswap", "x"): 20, ("a", "y"): 40, ("a.swap", "y"): 30, ("y", "a"): 60, ("y", "a.swap"): 50, } # Test swapped group membership. assert ufo.groups == { "public.kern1.a": ["a.swap"], "public.kern1.aswap": ["a"], "public.kern2.a": ["a.swap", "a"], } # Swap a second time. fontmake.instantiator.swap_glyph_names(ufo, "aaa", "aaa.swap") # Test swapped glyphs. assert sorted(c.baseGlyph for c in ufo["aaa"].components) == ["a", "a", "y"] assert sorted(c.baseGlyph for c in ufo["aaa.swap"].components) == [ "a.swap", "a.swap", "x", ] # Test for no leftover temporary glyphs. assert {g.name for g in ufo} == { "space", "a", "a.swap", "aaa", "aaa.swap", "x", "y", } with pytest.raises(fontmake.instantiator.InstantiatorError, match="Cannot swap"): fontmake.instantiator.swap_glyph_names(ufo, "aaa", "aaa.swapa") def test_swap_glyph_names_spec(data_dir): """Test that the rule example in the designspaceLib spec works. `adieresis` should look the same as before the rule application. [1]: fonttools/Doc/source/designspaceLib#ufo-instances """ ufo = ufoLib2.Font.open(data_dir / "SwapGlyphNames" / "B.ufo") fontmake.instantiator.swap_glyph_names(ufo, "a", "a.alt") assert sorted(c.baseGlyph for c in ufo["adieresis"].components) == [ "a.alt", "dieresiscomb", ] assert sorted(c.baseGlyph for c in ufo["adieresis.alt"].components) == [ "a", "dieresiscomb", ] def test_rules_are_applied_deterministically(data_dir): """Test that a combination of designspace rules that end up mapping serveral input glyphs to the same destination glyph result in a correct and deterministic series of glyph swaps. The example is a font with 2 Q designs that depend on a style axis style < 0.5: Q style >= 0.5: Q.ss01 and each Q also has an alternative shape in bolder weights (like Skia) weight < 780: Q weight >= 780: Q.alt weight < 730: Q.ss01 weight >= 730: Q.ss01.alt Then we generate an instance at style = 1, weight = 900. From the rules, the default CMAP entry for Q should have the outlines of Q.ss01.alt from the black UFO. """ doc = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "DesignspaceRuleOrder" / "MyFont.designspace" ) instanciator = fontmake.instantiator.Instantiator.from_designspace(doc) instance = instanciator.generate_instance(doc.instances[0]) pen = RecordingPen() instance["Q"].draw(pen) instance_recording = pen.value black_ufo = ufoLib2.Font.open( data_dir / "DesignspaceRuleOrder" / "MyFont_Black.ufo" ) pen = RecordingPen() black_ufo["Q.ss01.alt"].draw(pen) black_ufo_recording = pen.value assert instance_recording == black_ufo_recording def test_raise_no_default_master(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "MutatorSans" / "MutatorSans_no_default.designspace" ) with pytest.raises(fontmake.instantiator.InstantiatorError, match="no default"): fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) def test_raise_failed_glyph_interpolation(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "DesignspaceBrokenTest" / "DesignspaceTest.designspace" ) generator = fontmake.instantiator.Instantiator.from_designspace(designspace) with pytest.raises( fontmake.instantiator.InstantiatorError, match="Failed to generate instance" ): for instance in designspace.instances: instance.font = generator.generate_instance(instance) def test_ignore_failed_glyph_interpolation(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "DesignspaceBrokenTest" / "DesignspaceTest.designspace" ) generator = fontmake.instantiator.Instantiator.from_designspace(designspace) generator.skip_export_glyphs.append("asas") for instance in designspace.instances: instance.font = generator.generate_instance(instance) assert ( not instance.font["asas"].contours and not instance.font["asas"].components ) def test_raise_anisotropic_location(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "MutatorSans" / "MutatorSans-width-only.designspace" ) designspace.instances[0].location["width"] = (100, 900) with pytest.raises( fontmake.instantiator.InstantiatorError, match="anisotropic instance locations" ): fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) def test_copy_nonkerning_group(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "DesignspaceTest" / "DesignspaceTest.designspace" ) generator = fontmake.instantiator.Instantiator.from_designspace(designspace) instance_font = generator.generate_instance(designspace.instances[0]) assert instance_font.groups == { "nonkerning_group": ["A"], "public.kern2.asdf": ["A"], } def test_interpolation(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "DesignspaceTest" / "DesignspaceTest.designspace" ) generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) instance_font = generator.generate_instance(designspace.instances[0]) assert instance_font["l"].width == 220 def test_interpolation_only_default(data_dir, caplog): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "MutatorSans" / "MutatorSans.designspace" ) designspace.loadSourceFonts(ufoLib2.Font.open) for name in designspace.default.font.glyphOrder: if name != "A": del designspace.default.font[name] with caplog.at_level(logging.WARNING): generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) assert "contains glyphs that are missing from the" in caplog.text instance_font = generator.generate_instance(designspace.instances[0]) assert {g.name for g in instance_font} == {"A"} def test_interpolation_masters_as_instances(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "DesignspaceBrokenTest" / "Designspace-MastersAsInstances.designspace" ) generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) instance_font = generator.generate_instance(designspace.instances[0]) assert instance_font.info.styleName == "Light ASDF" assert instance_font["l"].width == 160 instance_font = generator.generate_instance(designspace.instances[1]) assert instance_font.info.styleName == "Bold ASDF" assert instance_font["l"].width == 280 def test_non_default_layer(data_dir, caplog): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "MutatorSans" / "MutatorSans-non-default-layer.designspace" ) designspace.loadSourceFonts(ufoLib2.Font.open) generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) instance_font = generator.generate_instance(designspace.instances[0]) assert {g.name for g in instance_font} == {"A", "S", "W"} def test_instance_attributes(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "DesignspaceTest" / "DesignspaceTest-instance-attrs.designspace" ) generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) instance_font = generator.generate_instance(designspace.instances[0]) assert instance_font.info.familyName == "aaa" assert instance_font.info.styleName == "sss" assert instance_font.info.postscriptFontName == "ppp" assert instance_font.info.styleMapFamilyName == "yyy" assert instance_font.info.styleMapStyleName == "xxx" def test_instance_no_attributes(data_dir, caplog): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "DesignspaceTest" / "DesignspaceTest-bare.designspace" ) generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) with caplog.at_level(logging.WARNING): instance_font = generator.generate_instance(designspace.instances[0]) assert "missing the stylename attribute" in caplog.text assert instance_font.info.familyName == "MyFont" assert instance_font.info.styleName == "Light" assert instance_font.info.postscriptFontName is None assert instance_font.info.styleMapFamilyName is None assert instance_font.info.styleMapStyleName is None def test_axis_mapping(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "DesignspaceTest" / "DesignspaceTest-wght-wdth.designspace" ) generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) instance_font = generator.generate_instance(designspace.instances[0]) assert instance_font.info.openTypeOS2WeightClass == 400 assert instance_font.info.openTypeOS2WidthClass == 5 assert instance_font.info.italicAngle is None assert instance_font.lib["designspace.location"] == [ ("weight", 100.0), ("width", 100.0), ] def test_axis_mapping_manual_os2_classes(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "DesignspaceTest" / "DesignspaceTest-wght-wdth.designspace" ) designspace.loadSourceFonts(ufoLib2.Font.open) designspace.sources[0].font.info.openTypeOS2WeightClass = 800 designspace.sources[0].font.info.openTypeOS2WidthClass = 7 designspace.sources[1].font.info.openTypeOS2WeightClass = 900 designspace.sources[1].font.info.openTypeOS2WidthClass = 9 generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) instance_font = generator.generate_instance(designspace.instances[0]) assert instance_font.info.openTypeOS2WeightClass == 850 assert instance_font.info.openTypeOS2WidthClass == 8 assert instance_font.info.italicAngle is None assert instance_font.lib["designspace.location"] == [ ("weight", 100.0), ("width", 100.0), ] def test_axis_mapping_no_os2_width_class_inference(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "DesignspaceTest" / "DesignspaceTest-bare.designspace" ) designspace.loadSourceFonts(ufoLib2.Font.open) designspace.sources[0].font.info.openTypeOS2WeightClass = 800 designspace.sources[1].font.info.openTypeOS2WeightClass = 900 generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) instance_font = generator.generate_instance(designspace.instances[0]) assert instance_font.info.openTypeOS2WeightClass == 850 assert instance_font.info.openTypeOS2WidthClass is None assert instance_font.info.italicAngle is None assert instance_font.lib["designspace.location"] == [("weight", 100.0)] def test_axis_mapping_no_os2_class_inference(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "DesignspaceTest" / "DesignspaceTest-opsz.designspace" ) generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) instance_font = generator.generate_instance(designspace.instances[0]) assert instance_font.info.openTypeOS2WeightClass is None assert instance_font.info.openTypeOS2WidthClass is None assert instance_font.info.italicAngle is None assert instance_font.lib["designspace.location"] == [("optical", 15.0)] def test_axis_mapping_italicAngle_inference(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "DesignspaceTest" / "DesignspaceTest-slnt.designspace" ) generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) instance_font = generator.generate_instance(designspace.instances[0]) assert instance_font.info.openTypeOS2WeightClass is None assert instance_font.info.openTypeOS2WidthClass is None assert instance_font.info.italicAngle == 40.123 assert instance_font.lib["designspace.location"] == [("slant", 40.123)] def test_lib_into_instance(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "DesignspaceTest" / "DesignspaceTest-lib.designspace" ) generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) assert designspace.default.font.lib["blorb"] == "asasa" assert "public.skipExportGlyphs" not in designspace.sources[0].font.lib instance_font = generator.generate_instance(designspace.instances[0]) assert instance_font.lib["blorb"] == "asasa" assert instance_font.lib["public.skipExportGlyphs"] == ["a", "b", "c"] instance_font2 = generator.generate_instance(designspace.instances[1]) assert instance_font2.lib["blorb"] == "asasa" assert instance_font2.lib["public.skipExportGlyphs"] == ["a", "b", "c"] def test_data_independence(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "DesignspaceTest" / "DesignspaceTest.designspace" ) generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) instance_font1 = generator.generate_instance(designspace.instances[0]) designspace.instances[0].lib["aaaaaaaa"] = 1 instance_font2 = generator.generate_instance(designspace.instances[0]) instance_font1["l"].unicodes.append(2) assert instance_font1["l"].unicodes == [0x6C, 2] assert instance_font2["l"].unicodes == [0x6C] instance_font1["l"].lib["asdf"] = 1 assert instance_font1["l"].lib == {"asdf": 1} assert not instance_font2["l"].lib generator.copy_lib["sdjkhsjdhjdf"] = 1 instance_font1.lib["asdf"] = 1 assert instance_font1.lib == { "asdf": 1, "blorb": "asasa", "designspace.location": [("weight", 100.0)], "public.skipExportGlyphs": [], } assert instance_font2.lib == { "blorb": "asasa", "designspace.location": [("weight", 100.0)], "public.skipExportGlyphs": [], } assert generator.copy_info.openTypeOS2Panose == [2, 11, 5, 4, 2, 2, 2, 2, 2, 4] generator.copy_info.openTypeOS2Panose.append(1000) assert instance_font1.info.openTypeOS2Panose is None assert instance_font2.info.openTypeOS2Panose is None # copy_feature_text not tested because it is a(n immutable) string assert not generator.skip_export_glyphs generator.skip_export_glyphs.extend(["a", "b"]) assert not instance_font1.lib["public.skipExportGlyphs"] assert not instance_font2.lib["public.skipExportGlyphs"] instance_font1.lib["public.skipExportGlyphs"].append("z") assert not instance_font2.lib["public.skipExportGlyphs"] def test_skipped_fontinfo_attributes(): """Test that we consider all available font info attributes for copying.""" import fontMath.mathInfo import fontTools.ufoLib SKIPPED_ATTRS = { "guidelines", "macintoshFONDFamilyID", "macintoshFONDName", "openTypeNameCompatibleFullName", "openTypeNamePreferredFamilyName", "openTypeNamePreferredSubfamilyName", "openTypeNameUniqueID", "openTypeNameWWSFamilyName", "openTypeNameWWSSubfamilyName", "openTypeOS2Panose", "postscriptFontName", "postscriptFullName", "postscriptUniqueID", "styleMapFamilyName", "styleMapStyleName", "styleName", "woffMetadataUniqueID", "year", } assert ( fontTools.ufoLib.fontInfoAttributesVersion3 - set(fontMath.mathInfo._infoAttrs.keys()) - {"postscriptWeightName"} # Handled in fontMath specially. - fontmake.instantiator.UFO_INFO_ATTRIBUTES_TO_COPY_TO_INSTANCES == SKIPPED_ATTRS ) def test_designspace_v5_discrete_axis_raises_error(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "MutatorSansLite" / "MutatorFamily_v5_discrete_axis.designspace" ) # The error message should advise to use `splitInterpolable()` with pytest.raises( fontmake.instantiator.InstantiatorError, match="splitInterpolable" ): fontmake.instantiator.Instantiator.from_designspace(designspace) def test_strict_math_glyph(data_dir): designspace = designspaceLib.DesignSpaceDocument.fromfile( data_dir / "InstantiatorStrictMathGlyph" / "StrictMathGlyph.designspace" ) generator = fontmake.instantiator.Instantiator.from_designspace( designspace, round_geometry=True ) fonts = [ generator.generate_instance(instance) for instance in designspace.instances ] assert len(fonts) == 1 glyph = fonts[0]["test"] assert len(glyph.contours) == 1 assert len(glyph.contours[0].points) == 16 googlefonts-fontmake-7ed5123/tests/test_main.py000066400000000000000000001322611470572777600217300ustar00rootroot00000000000000import logging import platform import re import shutil import subprocess import sys from textwrap import dedent import fontTools.designspaceLib as designspaceLib import fontTools.ttLib import pytest import ufoLib2 from fontTools.misc.testTools import getXML from ufo2ft.util import zip_strict import fontmake.__main__ def test_interpolation(data_dir, tmp_path): shutil.copytree(data_dir / "DesignspaceTest", tmp_path / "sources") fontmake.__main__.main( [ "-m", str(tmp_path / "sources" / "DesignspaceTest.designspace"), "-i", "--output-dir", str(tmp_path), ] ) assert {p.name for p in tmp_path.glob("*.*")} == { "MyFont-Regular.ttf", "MyFont-Regular.otf", } test_output_ttf = fontTools.ttLib.TTFont(tmp_path / "MyFont-Regular.ttf") assert test_output_ttf["OS/2"].usWeightClass == 400 glyph = test_output_ttf["glyf"]["l"] assert glyph.xMin == 50 assert glyph.xMax == 170 test_output_otf = fontTools.ttLib.TTFont(tmp_path / "MyFont-Regular.otf") assert test_output_otf["OS/2"].usWeightClass == 400 glyph_set = test_output_otf.getGlyphSet() charstrings = list(test_output_otf["CFF "].cff.values())[0].CharStrings glyph = charstrings["l"] x_min, _, x_max, _ = glyph.calcBounds(glyph_set) assert x_min == 50 assert x_max == 170 def test_interpolation_designspace_5(data_dir, tmp_path): shutil.copytree(data_dir / "MutatorSansLite", tmp_path / "sources") fontmake.__main__.main( [ "-m", str(tmp_path / "sources" / "MutatorFamily_v5_discrete_axis.designspace"), "-i", ".*Light Condensed", "--output-dir", str(tmp_path), ] ) assert {p.name for p in tmp_path.glob("*.*")} == { "MutatorMathTest-Sans Light Condensed.ttf", "MutatorMathTest-Serif Light Condensed.otf", "MutatorMathTest-Sans Light Condensed.otf", "MutatorMathTest-Serif Light Condensed.ttf", } def test_interpolation_and_masters_as_instances(data_dir, tmp_path): shutil.copytree(data_dir / "DesignspaceTest", tmp_path / "sources") fontmake.__main__.main( [ "-m", str(tmp_path / "sources" / "DesignspaceTest.designspace"), "-i", "-M", "--output-dir", str(tmp_path), ] ) assert {p.name for p in tmp_path.glob("*.*")} == { "MyFont-Bold.otf", "MyFont-Bold.ttf", "MyFont-Light.otf", "MyFont-Light.ttf", "MyFont-Regular.otf", "MyFont-Regular.ttf", } test_output_ttf = fontTools.ttLib.TTFont(tmp_path / "MyFont-Regular.ttf") assert test_output_ttf["OS/2"].usWeightClass == 400 glyph = test_output_ttf["glyf"]["l"] assert glyph.xMin == 50 assert glyph.xMax == 170 test_output_otf = fontTools.ttLib.TTFont(tmp_path / "MyFont-Regular.otf") assert test_output_otf["OS/2"].usWeightClass == 400 glyph_set = test_output_otf.getGlyphSet() charstrings = list(test_output_otf["CFF "].cff.values())[0].CharStrings glyph = charstrings["l"] x_min, _, x_max, _ = glyph.calcBounds(glyph_set) assert x_min == 50 assert x_max == 170 def test_masters_and_instances_ttf_interpolatable(data_dir, tmp_path): shutil.copytree(data_dir / "DesignspaceTest", tmp_path / "sources") fontmake.__main__.main( [ "-m", str(tmp_path / "sources" / "DesignspaceTest.designspace"), "-o", "ttf-interpolatable", "--output-dir", str(tmp_path), ] ) assert {p.name for p in tmp_path.glob("*.*")} == { "MyFont-Bold.ttf", "MyFont-Light.ttf", "DesignspaceTest.designspace", } designspace = designspaceLib.DesignSpaceDocument.fromfile( tmp_path / "DesignspaceTest.designspace" ) assert {s.filename for s in designspace.sources} == { "MyFont-Bold.ttf", "MyFont-Light.ttf", } def test_masters_and_instances_otf_interpolatable(data_dir, tmp_path): shutil.copytree(data_dir / "DesignspaceTest", tmp_path / "sources") fontmake.__main__.main( [ "-m", str(tmp_path / "sources" / "DesignspaceTest.designspace"), "-o", "otf-interpolatable", "--output-dir", str(tmp_path), ] ) assert {p.name for p in tmp_path.glob("*.*")} == { "MyFont-Bold.otf", "MyFont-Light.otf", "DesignspaceTest.designspace", } designspace = designspaceLib.DesignSpaceDocument.fromfile( tmp_path / "DesignspaceTest.designspace" ) assert {s.filename for s in designspace.sources} == { "MyFont-Bold.otf", "MyFont-Light.otf", } def test_variable_ttf(data_dir, tmp_path): shutil.copytree(data_dir / "DesignspaceTest", tmp_path / "sources") fontmake.__main__.main( [ "-m", str(tmp_path / "sources" / "DesignspaceTest.designspace"), "-o", "variable", "--output-dir", str(tmp_path), ] ) assert {p.name for p in tmp_path.glob("*.*")} == {"DesignspaceTest-VF.ttf"} def test_variable_otf(data_dir, tmp_path): shutil.copytree(data_dir / "DesignspaceTest", tmp_path / "sources") fontmake.__main__.main( [ "-m", str(tmp_path / "sources" / "DesignspaceTest.designspace"), "-o", "variable-cff2", "--output-dir", str(tmp_path), ] ) assert {p.name for p in tmp_path.glob("*.*")} == {"DesignspaceTest-VF.otf"} def test_no_interpolation(data_dir, tmp_path): shutil.copytree(data_dir / "DesignspaceTest", tmp_path / "sources") fontmake.__main__.main( [ "-m", str(tmp_path / "sources" / "DesignspaceTest.designspace"), "--output-dir", str(tmp_path), ] ) assert {p.name for p in tmp_path.glob("*.*")} == { "MyFont-Bold.otf", "MyFont-Bold.ttf", "MyFont-Light.otf", "MyFont-Light.ttf", } def test_ufo_interpolation(data_dir, tmp_path): shutil.copyfile( data_dir / "GlyphsUnitTestSans.glyphs", tmp_path / "GlyphsUnitTestSans.glyphs" ) instance_dir = tmp_path / "instance_ufos" fontmake.__main__.main( [ "-g", str(tmp_path / "GlyphsUnitTestSans.glyphs"), "--master-dir", str(tmp_path / "master_ufos"), "--instance-dir", str(instance_dir), "-i", "-o", "ufo", ] ) assert {p.name for p in instance_dir.glob("*.ufo")} == { "GlyphsUnitTestSans-Black.ufo", "GlyphsUnitTestSans-Bold.ufo", "GlyphsUnitTestSans-ExtraLight.ufo", "GlyphsUnitTestSans-Light.ufo", "GlyphsUnitTestSans-Medium.ufo", "GlyphsUnitTestSans-Regular.ufo", "GlyphsUnitTestSans-Thin.ufo", "GlyphsUnitTestSans-Web.ufo", } def test_ufo_interpolation_specific(data_dir, tmp_path): shutil.copyfile( data_dir / "GlyphsUnitTestSans.glyphs", tmp_path / "GlyphsUnitTestSans.glyphs" ) instance_dir = tmp_path / "instance_ufos" fontmake.__main__.main( [ "-g", str(tmp_path / "GlyphsUnitTestSans.glyphs"), "--master-dir", str(tmp_path / "master_ufos"), "--instance-dir", str(instance_dir), "-i", r".*Light.*", "-o", "ufo", ] ) assert {p.name for p in instance_dir.glob("*.ufo")} == { "GlyphsUnitTestSans-ExtraLight.ufo", "GlyphsUnitTestSans-Light.ufo", } @pytest.mark.parametrize( "write_skipexportglyphs", [ pytest.param(True, id="default"), pytest.param(False, id="no-write-skipexportglyphs"), ], ) def test_subsetting(data_dir, tmp_path, write_skipexportglyphs): shutil.copyfile(data_dir / "TestSubset.glyphs", tmp_path / "TestSubset.glyphs") args = [ "-g", str(tmp_path / "TestSubset.glyphs"), "--master-dir", str(tmp_path / "master_ufos"), "--instance-dir", str(tmp_path / "instance_ufos"), "-i", "Test Subset Regular", "-o", "ttf", "otf", "--output-dir", str(tmp_path), ] if not write_skipexportglyphs: args.append("--no-write-skipexportglyphs") fontmake.__main__.main(args) for output_format in ("ttf", "otf"): for font_path in tmp_path.glob("*." + output_format): font = fontTools.ttLib.TTFont(font_path) assert font.getGlyphOrder() == [".notdef", "space", "A", "C"] @pytest.mark.parametrize( "write_skipexportglyphs", [ pytest.param(True, id="default"), pytest.param(False, id="no-write-skipexportglyphs"), ], ) def test_keep_glyphs(data_dir, tmp_path, write_skipexportglyphs): shutil.copyfile(data_dir / "TestSubset2.glyphs", tmp_path / "TestSubset2.glyphs") args = [ "-g", str(tmp_path / "TestSubset2.glyphs"), "--master-dir", str(tmp_path / "master_ufos"), "--instance-dir", str(tmp_path / "instance_ufos"), "-i", "Test Subset Regular", "-o", "ttf", "otf", "--output-dir", str(tmp_path), ] if not write_skipexportglyphs: args.append("--no-write-skipexportglyphs") fontmake.__main__.main(args) for output_format in ("ttf", "otf"): for font_path in tmp_path.glob("*." + output_format): font = fontTools.ttLib.TTFont(font_path) assert font.getGlyphOrder() == [".notdef", "space", "D"] def test_shared_features_expansion(data_dir, tmp_path): shutil.copytree(data_dir / "DesignspaceTestSharedFeatures", tmp_path / "sources") fontmake.__main__.main( [ "-m", str(tmp_path / "sources" / "DesignspaceTestSharedFeatures.designspace"), "-i", "--expand-features-to-instances", "-o", "ufo", "--output-dir", str(tmp_path), ] ) test_feature_file = tmp_path / "DesignspaceTest-Light.ufo/features.fea" assert test_feature_file.read_text() == "# test" def test_shared_features_ufo(data_dir, tmp_path): shutil.copytree(data_dir / "DesignspaceTestSharedFeatures", tmp_path / "sources") fontmake.__main__.main( [ "-u", str(tmp_path / "sources" / "DesignspaceTest-Light.ufo"), str(tmp_path / "sources" / "DesignspaceTest-Regular.ufo"), "-o", "ttf", "--output-dir", str(tmp_path), ] ) assert {p.name for p in tmp_path.glob("*.*")} == { "DesignspaceTest-Light.ttf", "DesignspaceTest-Regular.ttf", } def test_mti_sources(data_dir, tmp_path): shutil.copytree(data_dir / "InterpolateLayoutTest", tmp_path / "sources") fontmake.__main__.main( [ "-g", str(tmp_path / "sources" / "InterpolateLayoutTest.glyphs"), "--designspace-path", str(tmp_path / "InterpolateLayoutTest.designspace"), "--master-dir", str(tmp_path / "master_ufos"), "--instance-dir", str(tmp_path / "instance_ufos"), "--mti-source", str(tmp_path / "sources" / "InterpolateLayoutTest.plist"), "--no-production-names", "--output-dir", str(tmp_path), ] ) assert {p.name for p in tmp_path.glob("*.*")} == { "InterpolateLayoutTest-Bold.otf", "InterpolateLayoutTest-Bold.ttf", "InterpolateLayoutTest-Light.otf", "InterpolateLayoutTest-Light.ttf", "InterpolateLayoutTest.designspace", } font_bold = fontTools.ttLib.TTFont(tmp_path / "InterpolateLayoutTest-Bold.ttf") assert font_bold["GDEF"].table.GlyphClassDef.classDefs == {"V": 1, "a": 1} assert ( font_bold["GPOS"] .table.LookupList.Lookup[0] .SubTable[0] .PairSet[0] .PairValueRecord[0] .Value1.XAdvance == -40 ) font_light = fontTools.ttLib.TTFont(tmp_path / "InterpolateLayoutTest-Light.ttf") assert font_light["GDEF"].table.GlyphClassDef.classDefs == {"V": 1, "a": 1} assert ( font_light["GPOS"] .table.LookupList.Lookup[0] .SubTable[0] .PairSet[0] .PairValueRecord[0] .Value1.XAdvance == -12 ) def test_interpolate_layout(data_dir, tmp_path): shutil.copytree(data_dir / "InterpolateLayoutTest", tmp_path / "sources") fontmake.__main__.main( [ "-g", str(tmp_path / "sources" / "InterpolateLayoutTest.glyphs"), "--designspace-path", str(tmp_path / "InterpolateLayoutTest.designspace"), "--master-dir", str(tmp_path / "master_ufos"), "--instance-dir", str(tmp_path / "instance_ufos"), "--mti-source", str(tmp_path / "sources" / "InterpolateLayoutTest.plist"), "--no-production-names", "-o", "ttf", "--output-dir", str(tmp_path / "master_ttf"), ] ) fontmake.__main__.main( [ "-g", str(tmp_path / "sources" / "InterpolateLayoutTest.glyphs"), "--designspace-path", str(tmp_path / "InterpolateLayoutTest.designspace"), "--master-dir", str(tmp_path / "master_ufos"), "--instance-dir", str(tmp_path / "instance_ufos"), "-i", "--interpolate-binary-layout", str(tmp_path / "master_ttf"), "--no-production-names", "-o", "ttf", "--output-dir", str(tmp_path), ] ) font = fontTools.ttLib.TTFont(tmp_path / "InterpolateLayoutTest-Black.ttf") assert font["GDEF"].table.GlyphClassDef.classDefs == {"V": 1, "a": 1} assert ( font["GPOS"] .table.LookupList.Lookup[0] .SubTable[0] .PairSet[0] .PairValueRecord[0] .Value1.XAdvance == -40 ) font = fontTools.ttLib.TTFont(tmp_path / "InterpolateLayoutTest-Bold.ttf") assert font["GDEF"].table.GlyphClassDef.classDefs == {"V": 1, "a": 1} assert ( font["GPOS"] .table.LookupList.Lookup[0] .SubTable[0] .PairSet[0] .PairValueRecord[0] .Value1.XAdvance == -35 ) font = fontTools.ttLib.TTFont(tmp_path / "InterpolateLayoutTest-SemiBold.ttf") assert font["GDEF"].table.GlyphClassDef.classDefs == {"V": 1, "a": 1} assert ( font["GPOS"] .table.LookupList.Lookup[0] .SubTable[0] .PairSet[0] .PairValueRecord[0] .Value1.XAdvance == -29 ) font = fontTools.ttLib.TTFont(tmp_path / "InterpolateLayoutTest-Regular.ttf") assert font["GDEF"].table.GlyphClassDef.classDefs == {"V": 1, "a": 1} assert ( font["GPOS"] .table.LookupList.Lookup[0] .SubTable[0] .PairSet[0] .PairValueRecord[0] .Value1.XAdvance == -22 ) font = fontTools.ttLib.TTFont(tmp_path / "InterpolateLayoutTest-Light.ttf") assert font["GDEF"].table.GlyphClassDef.classDefs == {"V": 1, "a": 1} assert ( font["GPOS"] .table.LookupList.Lookup[0] .SubTable[0] .PairSet[0] .PairValueRecord[0] .Value1.XAdvance == -15 ) font = fontTools.ttLib.TTFont(tmp_path / "InterpolateLayoutTest-ExtraLight.ttf") assert font["GDEF"].table.GlyphClassDef.classDefs == {"V": 1, "a": 1} assert ( font["GPOS"] .table.LookupList.Lookup[0] .SubTable[0] .PairSet[0] .PairValueRecord[0] .Value1.XAdvance == -12 ) def test_write_skipexportglyphs(data_dir, tmp_path): shutil.copyfile( data_dir / "GlyphsUnitTestSans.glyphs", tmp_path / "GlyphsUnitTestSans.glyphs" ) args = [ "-g", str(tmp_path / "GlyphsUnitTestSans.glyphs"), "--master-dir", str(tmp_path / "master_ufos"), "--instance-dir", str(tmp_path / "instance_ufos"), "-o", "ufo", ] fontmake.__main__.main(args) designspace = designspaceLib.DesignSpaceDocument.fromfile( tmp_path / "master_ufos" / "GlyphsUnitTestSans.designspace" ) assert "public.skipExportGlyphs" in designspace.lib assert designspace.lib["public.skipExportGlyphs"] == [ "_part.shoulder", "_part.stem", ] for path in (tmp_path / "master_ufos").glob("*.ufo"): with ufoLib2.Font.open(path) as ufo: assert "public.skipExportGlyphs" in ufo.lib shutil.rmtree(tmp_path / "master_ufos") fontmake.__main__.main(args + ["--no-write-skipexportglyphs"]) designspace = designspaceLib.DesignSpaceDocument.fromfile( tmp_path / "master_ufos" / "GlyphsUnitTestSans.designspace" ) assert "public.skipExportGlyphs" not in designspace.lib for path in (tmp_path / "master_ufos").glob("*.ufo"): with ufoLib2.Font.open(path) as ufo: assert "public.skipExportGlyphs" not in ufo.lib assert not ufo["_part.shoulder"].lib["com.schriftgestaltung.Glyphs.Export"] assert not ufo["_part.stem"].lib["com.schriftgestaltung.Glyphs.Export"] def test_debug_feature_file(data_dir, tmp_path): shutil.copyfile( data_dir / "GlyphsUnitTestSans.glyphs", tmp_path / "GlyphsUnitTestSans.glyphs" ) debug_feature_path = data_dir / "test.fea" fontmake.__main__.main( [ "-g", str(tmp_path / "GlyphsUnitTestSans.glyphs"), "--master-dir", "{tmp}", "--instance-dir", "{tmp}", "-i", "-o", "ttf", "--debug-feature-file", str(debug_feature_path), ] ) with open(debug_feature_path, "r") as debug_feature_file: features = debug_feature_file.read() assert "### GlyphsUnitTestSans-Regular" in features assert "### GlyphsUnitTestSans-Black" in features def test_glyph_data(data_dir, tmp_path): shutil.copyfile( data_dir / "GlyphsUnitTestSans.glyphs", tmp_path / "GlyphsUnitTestSans.glyphs" ) shutil.copyfile(data_dir / "GlyphData.xml", tmp_path / "GlyphData.xml") args = [ "-g", str(tmp_path / "GlyphsUnitTestSans.glyphs"), "--master-dir", str(tmp_path / "master_ufos"), "--instance-dir", str(tmp_path / "instance_ufos"), "-o", "ufo", ] fontmake.__main__.main(args) for path in (tmp_path / "master_ufos").glob("*.ufo"): with ufoLib2.Font.open(path) as ufo: assert "public.openTypeCategories" in ufo.lib assert ufo.lib["public.openTypeCategories"].get("fatha-ar") == "mark" fatha = ufo["fatha-ar"] assert fatha.width == 0 assert "com.schriftgestaltung.Glyphs.originalWidth" in fatha.lib shutil.rmtree(tmp_path / "master_ufos") fontmake.__main__.main( args + [ "--glyph-data", str(tmp_path / "GlyphData.xml"), ] ) for path in (tmp_path / "master_ufos").glob("*.ufo"): with ufoLib2.Font.open(path) as ufo: assert "public.openTypeCategories" in ufo.lib assert ufo.lib["public.openTypeCategories"].get("fatha-ar") is None fatha = ufo["fatha-ar"] assert fatha.width != 0 assert "com.schriftgestaltung.Glyphs.originalWidth" not in fatha.lib assert fatha.lib.get("com.schriftgestaltung.Glyphs.category") == "Letter" assert fatha.lib.get("com.schriftgestaltung.Glyphs.subCategory") is None def test_ufo_to_static_otf_cff2(data_dir, tmp_path): fontmake.__main__.main( [ "-u", str(data_dir / "DesignspaceTest" / "MyFont-Light.ufo"), "-o", "otf-cff2", "--output-dir", str(tmp_path), ] ) assert {p.name for p in tmp_path.glob("*.otf")} == {"MyFont-Light.otf"} def test_ufoz_to_static_otf_cff2(data_dir, tmp_path): fontmake.__main__.main( [ "-u", str(data_dir / "DesignspaceTest" / "MyFont-Light.ufoz"), "-o", "otf-cff2", "--output-dir", str(tmp_path), ] ) assert {p.name for p in tmp_path.glob("*.otf")} == {"MyFont-Light.otf"} def test_static_otf_cffsubr_subroutinizer(data_dir, tmp_path): fontmake.__main__.main( [ "-u", str(data_dir / "DesignspaceTest" / "MyFont-Light.ufo"), "-o", "otf", "--subroutinizer", "cffsubr", "--output-dir", str(tmp_path), ] ) assert {p.name for p in tmp_path.glob("*.otf")} == {"MyFont-Light.otf"} def test_static_otf_compreffor_subroutinizer(data_dir, tmp_path): fontmake.__main__.main( [ "-u", str(data_dir / "DesignspaceTest" / "MyFont-Light.ufo"), "-o", "otf", "--subroutinizer", "compreffor", "--output-dir", str(tmp_path), ] ) assert {p.name for p in tmp_path.glob("*.otf")} == {"MyFont-Light.otf"} def test_main_with_feature_writer_none(data_dir, tmp_path): fontmake.__main__.main( [ "-u", str(data_dir / "MutatorSans" / "MutatorSansBoldCondensed.ufo"), "-o", "ttf", "--feature-writer", "None", "--output-dir", str(tmp_path), ] ) test_output_ttf = fontTools.ttLib.TTFont(tmp_path / "MutatorSansBoldCondensed.ttf") assert "GPOS" not in test_output_ttf def test_main_with_filter(data_dir, tmp_path): fontmake.__main__.main( [ "-u", str(data_dir / "DesignspaceTest" / "MyFont-Light.ufo"), "-o", "ttf", "--filter", "TransformationsFilter(OffsetX=100)", "--output-dir", str(tmp_path), ] ) test_output_ttf = fontTools.ttLib.TTFont(tmp_path / "MyFont-Light.ttf") hmtx = test_output_ttf["hmtx"] assert hmtx["l"] == (160, 170) # TODO(anthrotype): Re-enable this test once upstream issue is fixed: # https://github.com/fonttools/ttfautohint-py/issues/11 @pytest.mark.skipif( platform.python_implementation() == "PyPy", reason="ttfautohint-py doesn't work with pypy", ) @pytest.mark.parametrize( "autohint_options", [ (), ("-a",), ("--autohint", "-D latn"), ("-A",), ("--no-autohint",), ], ) def test_autohinting(data_dir, tmp_path, autohint_options): shutil.copytree(data_dir / "AutohintingTest", tmp_path / "sources") fontmake.__main__.main( [ "-g", str(tmp_path / "sources" / "Padyakke.glyphs"), "-o", "ttf", "-i", "--output-dir", str(tmp_path), *autohint_options, ] ) assert {p.name for p in tmp_path.glob("*.*")} == { "PadyakkeExpandedOne-Regular.ttf", } test_output_ttf = fontTools.ttLib.TTFont( tmp_path / "PadyakkeExpandedOne-Regular.ttf" ) if not {"-A", "--no-autohint"}.intersection(autohint_options): assert "fpgm" in test_output_ttf # hinted else: assert "fpgm" not in test_output_ttf # unhinted def test_main_designspace_v5_builds_STAT(data_dir, tmp_path): fontmake.__main__.main( [ "--verbose", "DEBUG", "-m", str( data_dir / "MutatorSansLite" / "MutatorSans_v5_implicit_one_vf.designspace" ), "-o", "variable", "--output-dir", str(tmp_path), ] ) test_output_ttf = fontTools.ttLib.TTFont( tmp_path / "MutatorSans_v5_implicit_one_vf-VF.ttf" ) stat = test_output_ttf["STAT"] assert ( getXML(stat.toXML) == dedent( """\ """ ).splitlines() ) def test_main_designspace_v5_builds_all_vfs(data_dir, tmp_path): fontmake.__main__.main( [ "-m", str( data_dir / "MutatorSansLite" / "MutatorFamily_v5_discrete_axis.designspace" ), "-o", "variable", "--output-dir", str(tmp_path), ] ) assert (tmp_path / "MutatorSansVariable_Weight_Width.ttf").exists() assert (tmp_path / "MutatorSansVariable_Weight.ttf").exists() assert (tmp_path / "MutatorSansVariable_Width.ttf").exists() assert (tmp_path / "MutatorSerifVariable_Width.ttf").exists() def test_main_designspace_v5_select_no_matching_fonts_shows_nice_message( data_dir, tmp_path, caplog ): with caplog.at_level(logging.WARNING): fontmake.__main__.main( [ "-m", str( data_dir / "MutatorSansLite" / "MutatorFamily_v5_discrete_axis.designspace" ), "--variable-fonts", "NothingMatchesThisRegex", "-o", "variable", "--output-dir", str(tmp_path), ] ) assert "No variable fonts matching NothingMatchesThisRegex" in caplog.text # Nothing gets built assert not (tmp_path / "MutatorSansVariable_Weight_Width.ttf").exists() assert not (tmp_path / "MutatorSansVariable_Weight.ttf").exists() assert not (tmp_path / "MutatorSansVariable_Width.ttf").exists() assert not (tmp_path / "MutatorSerifVariable_Width.ttf").exists() def test_main_designspace_v5_select_vfs_to_build(data_dir, tmp_path): fontmake.__main__.main( [ "-m", str( data_dir / "MutatorSansLite" / "MutatorFamily_v5_discrete_axis.designspace" ), "--variable-fonts", "MutatorSansVariable_Weight.*", "-o", "variable", "--output-dir", str(tmp_path), ] ) assert (tmp_path / "MutatorSansVariable_Weight_Width.ttf").exists() assert (tmp_path / "MutatorSansVariable_Weight.ttf").exists() assert not (tmp_path / "MutatorSansVariable_Width.ttf").exists() assert not (tmp_path / "MutatorSerifVariable_Width.ttf").exists() def test_main_designspace_v5_can_use_output_path_with_1_vf(data_dir, tmp_path): fontmake.__main__.main( [ "-m", str( data_dir / "MutatorSansLite" / "MutatorSans_v5_several_vfs.designspace" ), "-o", "variable", "--variable-fonts", "MutatorSansVariable_Width", "--output-path", str(tmp_path / "output" / "MySingleVF.ttf"), ] ) # 'output' subfolder was created automatically assert (tmp_path / "output" / "MySingleVF.ttf").exists() def test_main_designspace_v5_dont_interpolate_discrete_axis(data_dir, tmp_path): fontmake.__main__.main( [ "-m", str( data_dir / "MutatorSansLite" / "MutatorSans_v5_several_vfs_discrete_axis.designspace" ), "-o", "variable", "--output-dir", str(tmp_path), ] ) assert (tmp_path / "MutatorSansCondensedVariable_Weight.ttf").exists() assert (tmp_path / "MutatorSansExtendedVariable_Weight.ttf").exists() def test_main_glyphspackage(data_dir, tmp_path): fontmake.__main__.main( [ "-g", str(data_dir / "GlyphsUnitTestSans3.glyphspackage"), "-o", "ttf", "--output-dir", str(tmp_path), ] ) assert (tmp_path / "GlyphsUnitTestSans-Light.ttf").exists() assert (tmp_path / "GlyphsUnitTestSans-Regular.ttf").exists() assert (tmp_path / "GlyphsUnitTestSans-Bold.ttf").exists() def test_timing_logger(data_dir, tmp_path): # check that --timing flag logs timing-related DEBUG messages even if the # logging level (as set by --verbose flag) is higher result = subprocess.run( [ sys.executable, "-m", "fontmake", "--timing", "--verbose", "CRITICAL", "-m", str(data_dir / "DesignspaceTest" / "DesignspaceTest.designspace"), "-i", "-o", "ttf", "--output-dir", str(tmp_path), ], capture_output=True, check=True, ) assert re.search( r"^DEBUG:fontmake.timer:Took [\.0-9]+s to run 'save_otfs'\r?$", result.stderr.decode(), flags=re.MULTILINE, ) @pytest.fixture(params=["package", "zip", "json"]) def ufo_structure(request): if request.param == "json": # skip if ufoLib2's extra dep is not installed pytest.importorskip("cattrs") return request.param @pytest.mark.parametrize("interpolate", [False, True]) def test_main_export_custom_ufo_structure( data_dir, tmp_path, ufo_structure, interpolate ): args = [ str(data_dir / "GlyphsUnitTestSans.glyphs"), "-o", "ufo", "--output-dir", str(tmp_path), "--ufo-structure", ufo_structure, ] if interpolate: args.append("-i") else: # strictly not needed, added just to make Windows happy about relative # instance.filename when designspace is written to a different mount point args.extend(["--instance-dir", str(tmp_path)]) fontmake.__main__.main(args) ext = {"package": ".ufo", "zip": ".ufoz", "json": ".ufo.json"}[ufo_structure] for style in ["Light", "Regular", "Bold"]: assert (tmp_path / f"GlyphsUnitTestSans-{style}").with_suffix(ext).exists() if interpolate: for style in ["Thin", "ExtraLight", "Medium", "Black", "Web"]: assert (tmp_path / f"GlyphsUnitTestSans-{style}").with_suffix(ext).exists() @pytest.mark.parametrize("ufo_structure", ["zip", "json"]) def test_main_build_from_custom_ufo_structure(data_dir, tmp_path, ufo_structure): pytest.importorskip("cattrs") # export designspace pointing to {json,zip}-flavored source UFOs fontmake.__main__.main( [ str(data_dir / "GlyphsUnitTestSans.glyphs"), "-o", "ufo", "--output-dir", str(tmp_path / "master_ufos"), "--ufo-structure", ufo_structure, # makes Windows happy about relative instance.filename across drives "--instance-dir", str(tmp_path / "instance_ufos"), ] ) # interpolate one static TTF instance from this designspace fontmake.__main__.main( [ str(tmp_path / "master_ufos" / "GlyphsUnitTestSans.designspace"), "-o", "ttf", "-i", "Glyphs Unit Test Sans Extra Light", "--output-path", str(tmp_path / "instance_ttfs" / "GlyphsUnitTestSans-ExtraLight.ttf"), ] ) assert len(list((tmp_path / "instance_ttfs").glob("*.ttf"))) == 1 assert (tmp_path / "instance_ttfs" / "GlyphsUnitTestSans-ExtraLight.ttf").exists() # build one {json,zip} UFO => OTF ext = {"json": ".ufo.json", "zip": ".ufoz"}[ufo_structure] fontmake.__main__.main( [ str(tmp_path / "master_ufos" / f"GlyphsUnitTestSans-Regular{ext}"), "-o", "otf", "--output-path", str(tmp_path / "master_otfs" / "GlyphsUnitTestSans-Regular.otf"), ] ) assert len(list((tmp_path / "master_otfs").glob("*.otf"))) == 1 assert (tmp_path / "master_otfs" / "GlyphsUnitTestSans-Regular.otf").exists() @pytest.mark.parametrize("indent_json", [False, True]) def test_main_export_ufo_json_with_indentation(data_dir, tmp_path, indent_json): pytest.importorskip("cattrs") fontmake.__main__.main( [ str(data_dir / "GlyphsUnitTestSans.glyphs"), "-o", "ufo", "--output-dir", str(tmp_path / "master_ufos"), "--ufo-structure", "json", # makes Windows happy about relative instance.filename across drives "--instance-dir", str(tmp_path / "instance_ufos"), ] + (["--indent-json"] if indent_json else []) ) regular_ufo = tmp_path / "master_ufos" / "GlyphsUnitTestSans-Regular.ufo.json" assert (regular_ufo).exists() if indent_json: assert regular_ufo.read_text().startswith('{\n "features"') else: assert regular_ufo.read_text().startswith('{"features"') def assert_tuple_variation_regions(tvs, expected_regions): for tv, expected_region in zip_strict(tvs, expected_regions): assert set(tv.axes.keys()) == set(expected_region.keys()) for axis in tv.axes: assert tv.axes[axis] == pytest.approx(expected_region[axis], rel=1e-3) def test_main_sparse_composite_glyphs_variable_ttf(data_dir, tmp_path): fontmake.__main__.main( [ "-g", str(data_dir / "IntermediateComponents.glyphs"), "-o", "variable", "--output-path", str(tmp_path / "IntermediateComponents-VF.ttf"), "--no-production-names", ] ) vf = fontTools.ttLib.TTFont(tmp_path / "IntermediateComponents-VF.ttf") assert [a.axisTag for a in vf["fvar"].axes] == ["wght"] glyf = vf["glyf"] gvar = vf["gvar"] # 'aacute' defines more masters than its components; no problem aacute = glyf["aacute"] assert aacute.isComposite() assert [c.glyphName for c in aacute.components] == ["a", "acutecomb"] assert_tuple_variation_regions( gvar.variations["aacute"], [{"wght": (0.0, 0.2, 1.0)}, {"wght": (0.2, 1.0, 1.0)}], ) assert_tuple_variation_regions(gvar.variations["a"], [{"wght": (0.0, 1.0, 1.0)}]) assert_tuple_variation_regions( gvar.variations["acutecomb"], [{"wght": (0.0, 1.0, 1.0)}] ) # other composites that use 'aacute' as component don't need additional masters # as long as they stay composite aacutecommaaccent = glyf["aacutecommaaccent"] assert aacutecommaaccent.isComposite() assert [c.glyphName for c in aacutecommaaccent.components] == [ "aacute", "commaaccentcomb", ] for name in ("aacutecommaaccent", "commaaccentcomb"): assert_tuple_variation_regions( gvar.variations[name], [{"wght": (0.0, 1.0, 1.0)}] ) # 'i' gets decomposed to simple glyph because it originally had a mix of contour # and component ('idotless'); it also inherits an additional master from the latter i = glyf["i"] assert i.numberOfContours == 2 idotless = glyf["idotless"] assert idotless.numberOfContours == 1 for name in ("i", "idotless"): assert_tuple_variation_regions( gvar.variations[name], [ {"wght": (0.0, 0.6, 1.0)}, {"wght": (0.6, 1.0, 1.0)}, ], ) # but 'iacute' and 'imacron' using 'idotless' as a component don't need to be # decomposed, nor do they inherit any additional master for name in ("iacute", "imacron"): glyph = glyf[name] assert "idotless" in {c.glyphName for c in glyph.components} assert glyph.isComposite() assert_tuple_variation_regions( gvar.variations[name], [{"wght": (0.0, 1.0, 1.0)}] ) # nor does 'iacutecedilla' which uses 'iacute' as components iacutecedilla = glyf["iacutecedilla"] assert iacutecedilla.isComposite() assert [c.glyphName for c in iacutecedilla.components] == ["iacute", "cedillacomb"] for name in ("iacutecedilla", "iacute", "cedillacomb"): assert_tuple_variation_regions( gvar.variations[name], [{"wght": (0.0, 1.0, 1.0)}] ) # 'nmacronbelow' is similar to 'aacute', defines more masters than its components nmacronbelow = glyf["nmacronbelow"] assert nmacronbelow.isComposite() assert [c.glyphName for c in nmacronbelow.components] == ["n", "macronbelowcomb"] assert_tuple_variation_regions( gvar.variations["nmacronbelow"], [ {"wght": (0.0, 0.4, 1.0)}, {"wght": (0.4, 1.0, 1.0)}, ], ) assert_tuple_variation_regions(gvar.variations["n"], [{"wght": (0.0, 1.0, 1.0)}]) assert_tuple_variation_regions( gvar.variations["macronbelowcomb"], [{"wght": (0.0, 1.0, 1.0)}] ) # 'aacutecedilla' originally comprised 'aacute' and 'cedillacomb' components, but # since the latter had a 2x2 transform in one intermediate master only (wght=0.4), # it gets decomposed; it also inherits the additional master from 'aacute' (wght=0.2) aacutecedilla = glyf["aacutecedilla"] assert aacutecedilla.numberOfContours == 4 assert_tuple_variation_regions( gvar.variations["aacutecedilla"], [ {"wght": (0.0, 0.2, 1.0)}, {"wght": (0.2, 0.4, 1.0)}, {"wght": (0.4, 1.0, 1.0)}, ], ) def test_main_sparse_composite_glyphs_variable_cff2(data_dir, tmp_path): # CFF/CFF2 have no concept of 'components' in the TrueType sense, so all glyphs # will be decomposed into contours fontmake.__main__.main( [ "-g", str(data_dir / "IntermediateComponents.glyphs"), "-o", "variable-cff2", "--output-path", str(tmp_path / "IntermediateComponents-VF.otf"), "--no-production-names", ] ) vf = fontTools.ttLib.TTFont(tmp_path / "IntermediateComponents-VF.otf") axes = vf["fvar"].axes assert [a.axisTag for a in axes] == ["wght"] font = vf["CFF2"].cff font.desubroutinize() top_dict = font.topDictIndex[0] varstore = top_dict.VarStore.otVarStore vardata = varstore.VarData regions = varstore.VarRegionList.Region charstrings = top_dict.CharStrings def assert_charstring_regions(charstring, expected_regions): vsindex = 0 for i, token in enumerate(charstring.program): if token == "vsindex": vsindex = charstring.program[i - 1] break cs_regions = [ regions[ri].get_support(axes) for ri in vardata[vsindex].VarRegionIndex ] for cs_region, expected_region in zip_strict(cs_regions, expected_regions): assert set(cs_region.keys()) == set(expected_region.keys()) for axis in cs_region: assert cs_region[axis] == pytest.approx(expected_region[axis], rel=1e-3) # 'aacute' defines an extra intermediate master not present in 'a' or 'acutecomb', # these get interpolated on the fly as 'aacute' gets decomposed; all other composite # glyphs in turn using 'aacute' will similarly gain the extra master for name in ("a", "acutecomb"): assert_charstring_regions(charstrings[name], [{"wght": (0.0, 1.0, 1.0)}]) for name in ("aacute", "aacutecommaaccent", "aacutecommaaccentcedilla"): assert_charstring_regions( charstrings[name], [ {"wght": (0.0, 0.2, 1.0)}, {"wght": (0.2, 1.0, 1.0)}, ], ) # 'idotless' "infects" all the composite glyphs using it as a component with its # extra master for name in ( "idotless", "i", "iacute", "iacutecedilla", "icedilla", "icommaaccent", ): assert_charstring_regions( charstrings[name], [ {"wght": (0.0, 0.6, 1.0)}, {"wght": (0.6, 1.0, 1.0)}, ], ) # 'imacron' etc. inherit extra masters from both 'idotless' and 'macroncomb' assert_charstring_regions( charstrings["macroncomb"], [{"wght": (0.0, 0.8, 1.0)}, {"wght": (0.8, 1.0, 1.0)}], ) for name in ("imacron", "imacroncommaaccent"): assert_charstring_regions( charstrings[name], [ {"wght": (0.0, 0.6, 1.0)}, {"wght": (0.6, 0.8, 1.0)}, {"wght": (0.8, 1.0, 1.0)}, ], ) # nothing special here for name in ("n", "nacute", "ncommaaccent", "acedilla"): assert_charstring_regions(charstrings[name], [{"wght": (0.0, 1.0, 1.0)}]) # 'nmacronbelow' defines an extra master (peak wght=0.4) not present in 'n' or # 'macronbelowcomb' so it ends up with 3 regions (one comes from 'macronbelowcomb') for name in ("nmacronbelow", "nacutemacronbelow"): assert_charstring_regions( charstrings[name], [ {"wght": (0.0, 0.4, 1.0)}, {"wght": (0.4, 0.8, 1.0)}, {"wght": (0.8, 1.0, 1.0)}, ], ) # 'aacutecedilla' has one intermediate master of its own, plus inherits an other # from 'aacute' assert_charstring_regions( charstrings["aacutecedilla"], [ {"wght": (0.0, 0.2, 1.0)}, {"wght": (0.2, 0.4, 1.0)}, {"wght": (0.4, 1.0, 1.0)}, ], ) # this monster combines the two additional masters from 'aacutecedilla' and the # one from 'macronbelowcomb' assert_charstring_regions( charstrings["aacutemacronbelowcedilla"], [ {"wght": (0.0, 0.2, 1.0)}, {"wght": (0.2, 0.4, 1.0)}, {"wght": (0.4, 0.8, 1.0)}, {"wght": (0.8, 1.0, 1.0)}, ], ) googlefonts-fontmake-7ed5123/tox.ini000066400000000000000000000014541470572777600175430ustar00rootroot00000000000000[tox] envlist = lint, py3{8,9,10,11,12,13}, pypy3, coverage-report skip_missing_interpreters = true [testenv] deps = -r requirements.txt -r test_requirements.txt ; download the latest pip, setuptools and wheel when creating the venv download = true commands = coverage run --parallel-mode -m pytest {posargs} [testenv:lint] skip_install = true deps = -r test_requirements.txt commands = black --check --diff . isort --check-only --diff . flake8 [testenv:coverage-report] skip_install = true commands = coverage combine coverage xml coverage report coverage html [flake8] select = C, E, F, W, B, B9 ignore = E203, E266, E501, W503, B905 max-line-length = 88 exclude = .git, __pycache__, build, dist, .eggs, .tox, venv, venv*, .venv, .venv* [isort] profile = black