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

Enable round edges in OTVar by removing all components and overlaps then rounding the font #10

Open
jpt opened this issue Jul 13, 2017 · 10 comments

Comments

@jpt
Copy link
Owner

jpt commented Jul 13, 2017

Similar to #9, it also (incidentally) fixes the rendering error in webkit with overlapping shapes in the variable TTF file

I imagine I will write a Glyphs script to do this using its own rounding function, because I would like to maintain a separate source file with a "lossless" (i.e. non-rounded, still has components) version of Barlow. This will be a separate source file step for variable font compilation only I suppose

@davelab6
Copy link

davelab6 commented Jul 14, 2017 via email

@jpt jpt mentioned this issue Jul 16, 2017
@jpt
Copy link
Owner Author

jpt commented Jul 16, 2017

I am thinking of a build step something like this, although it will be hard/impossible to script it all now that I think about it -- letters like Ø are going to become incompatible across masters once overlap is removed. This also assumes italic and roman masters will be compatible but I think that should be easy for Barlow

image

@davelab6
Copy link

davelab6 commented Jul 16, 2017 via email

@jpt
Copy link
Owner Author

jpt commented Jul 17, 2017

@davelab6 I would prefer not to remove the overlap, but I think the interior/negative rounding makes it difficult to avoid --
for example, this is the desired output for /H

screen shot 2017-07-16 at 6 14 21 pm

but this is what happens to the outlines if I were to apply my rounding settings without removing the overlap

screen shot 2017-07-16 at 6 15 21 pm

is there an advantage/loss from doing it? do GX binaries have components like Glyphs for reducing repetition/file size?

@davelab6
Copy link

davelab6 commented Jul 17, 2017 via email

@jpt
Copy link
Owner Author

jpt commented Jul 18, 2017

@davelab6 what am I looking at in Decovar exactly? there's so much going on in every file! it's also possible there's something you can see that I can't --- /sources/2-build/ implies there is maybe a /sources/1-something/ folder somewhere :)

Looking in RoboFont I see it's easy enough to handle some interior curves, but doesn't help any with things like crossbars-

screen shot 2017-07-17 at 9 50 12 pm

@jpt
Copy link
Owner Author

jpt commented Jul 18, 2017

or are you suggesting this? (upper right)

image

in which case: are the crazy half-outlines done manually? or is there some step to get there? I admittedly don't know much about the difference between TT and PS curves

@jpt
Copy link
Owner Author

jpt commented Aug 6, 2017

Alright so I've scripted the first part of this as a Glyphs script. It decomposes letters in a way that transfers brace layers from components to the parent glyph first, cause otherwise you lose them when decomposing. And it only does it to [a-zA-Z] letters, not to diacritic marks etc. This is the first step in flattening the file for VF -- or for anything.

If I remove overlaps, then the layers become incompatible, so I think I still need to learn about the TrueType feature mentioned above -- still not sure what I'm looking for exactly.

#MenuTitle: Brace Layer Decompose
# -*- coding: utf-8 -*-

__doc__="""
Brace Layer Decompose
"""

import GlyphsApp, re, string

font = Glyphs.font
brace = re.compile("^{\s*\d+\s*,\s*\d+\s*}$")

letters = string.ascii_uppercase + string.ascii_lowercase
letter_clones = []

for glyph in font.glyphs:
  if glyph.name in letters and len(glyph.name) == 1:
    for i, layer in enumerate(glyph.layers):
      for component in layer.components:
        if glyph.layers[i].name == font.masters[0].name:
          if component.componentName not in letters:
            for component_layer in font.glyphs[component.componentName].layers:
              if brace.match(component_layer.name):
                newBraceLayer = GSLayer()
                newBraceLayer.name = component_layer.name
                font.glyphs[glyph.name].layers.append(newBraceLayer)
                newBraceLayer.reinterpolate() 
          elif component.componentName in letters:
            letter_clones.append([glyph,component.componentName])
         
for glyph, letter in letter_clones:
  for layer in font.glyphs[letter].layers:
    if brace.match(layer.name):
      newBraceLayer = GSLayer()
      newBraceLayer.name = layer.name
      glyph.layers.append(newBraceLayer)
      newBraceLayer.reinterpolate()
      
for glyph in font.glyphs:
  for layer in glyph.layers:
    layer.decomposeComponents()

@jpt jpt added the bug label Nov 19, 2017
@jpt jpt mentioned this issue Jan 20, 2018
@jpt
Copy link
Owner Author

jpt commented Feb 1, 2018

@davelab6 Still wondering what you meant about TT curves above if you don't mind! To clarify, the problem is the "negative"/"interior" rounding in the counters... just not sure if it's possible to do it with VF while maintaining components. Could definitely flatten it entirely and take care of problem glyphs like Ø manually, but then the masters become lossy. The Glyphs suggestion is not making rounded variable fonts 😅! Maybe this is the kind of wizardry that exists in FontLab IV?

@jpt
Copy link
Owner Author

jpt commented Apr 17, 2024

7 years laters and Glyphs 3.2 supports this 😃

From https://glyphsapp.com/news/glyphs-3-2-released:

Some filters now work as custom parameters in variable font settings, provided they treat each layer equally in order to maintain compatibility. For instance, Offset Curve, Round Corner and Transformations should work now. (Please don’t ask for Roughen, ahem.) Special trick: if you use the Round Corner filter as custom parameter, you can sneak in the keyword compatible and Glyphs will attempt to round all masters in the same way:

(cc @davelab6 - Barlow VF may yet see the light of day as a result of this, though there is a lot of point placement to work out before a VF can render without kinks everywhere - and a few glyphs that will need alternates due to incompatible paths once the rounding filter gets applied by Glyphs. I have some questions for you RE what GF can tolerate on changes to outlines and metrics)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants