Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Traceback with AlignmentZones custom parameter #969

Open
frankrolf opened this issue Dec 20, 2023 · 0 comments
Open

Traceback with AlignmentZones custom parameter #969

frankrolf opened this issue Dec 20, 2023 · 0 comments

Comments

@frankrolf
Copy link

frankrolf commented Dec 20, 2023

I have a .glyphs file where each master has an alignmentZones custom parameter, like this:

alignmentZones = (
"{671, 12}",
"{612, 18}",
"{574, 12}",
"{495, 16}",
"{465, 14}",
"{436, 14}",
"{416, 18}",
"{0, -18}",
"{-211, -18}"
);

This results in the following traceback:

Traceback (most recent call last):
  File "glyphs2ufo", line 8, in <module>
    sys.exit(_glyphs2ufo_entry_point())
  File "python3.10/site-packages/glyphsLib/cli.py", line 276, in _glyphs2ufo_entry_point
    return main(args)
  File "python3.10/site-packages/glyphsLib/cli.py", line 234, in main
    return options.func(options)
  File "python3.10/site-packages/glyphsLib/cli.py", line 253, in glyphs2ufo
    glyphsLib.build_masters(
  File "python3.10/site-packages/glyphsLib/__init__.py", line 155, in build_masters
    source.font.save(ufo_path)
  File "python3.10/site-packages/ufoLib2/objects/font.py", line 593, in save
    self.write(writer, saveAs=saveAs)
  File "python3.10/site-packages/ufoLib2/objects/font.py", line 520, in write
    writer.writeInfo(self.info)
  File "python3.10/site-packages/fontTools/ufoLib/__init__.py", line 1301, in writeInfo
    infoData = validateInfoVersion3Data(infoData)
  File "python3.10/site-packages/fontTools/ufoLib/__init__.py", line 1867, in validateInfoVersion3Data
    raise UFOLibError(f"Invalid value for attribute {attr} ({value!r}).")
fontTools.ufoLib.errors.UFOLibError: Invalid value for attribute postscriptBlueValues ([-18, 0, 416, 434, 436, 450, 465, 479, 495, 511, 574, 586, 612, 630, 671, 683]).

The problem here is that that’s just too many zones. ufoLib’s fontInfoPostscriptBluesValidator rejects the list of values because more than 7 pairs are supplied, which is not allowed per the CFF spec: https://github.com/fonttools/fonttools/blob/main/Lib/fontTools/ufoLib/validators.py#L305-L306

This problem could be fixed by editing to_ufo_blue_values in blue_values.py:

def to_ufo_blue_values(self, ufo, master):
    """Set postscript blue values from Glyphs alignment zones."""

    alignment_zones = master.alignmentZones
    blue_values = []
    other_blues = []
    for zone_index, zone in enumerate(sorted(alignment_zones)):
        pos = zone.position
        size = zone.size
        val_list = blue_values if pos == 0 or size >= 0 else other_blues
        if zone_index <= 7:
            val_list.extend(sorted((pos, pos + size)))
        else:
            logger.warning(f'Surplus alignment zone {pos}, {pos + size} omitted')

    if blue_values:
        ufo.info.postscriptBlueValues = blue_values
    if other_blues:
        ufo.info.postscriptOtherBlues = other_blues
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant