~raph/interp-toy

a65bfef037a81b970952114483569d4805196dc3 — Raph Levien 2 years ago 78f1a85
Add test font and script

I made a screencast, and these are the resources used during the demo.
The screencast is up at https://youtu.be/MUx9Rh-loqU
2 files changed, 1244 insertions(+), 0 deletions(-)

A script1.txt
A testfont-2masters.glyphs
A script1.txt => script1.txt +21 -0
@@ 0,0 1,21 @@
Hi. This is Raph Levien, and today I'd like to show you some ideas I've been working on, about how to make smoother interpolation for variable fonts.

The current variable font format is based on linear interpolation, and that works well for things like adjusting the width and weight of a font, because the motion of the control points is close to linear as the parameters are adjusted. But for things like rotations, it starts falling apart.

Today I'll show two examples of rotation in variable fonts. One is rotating the dot on the /i by 90 degrees, and the other is morphing between a normal and italic shape of an /n, with a nice tail on the italic form.

Here I've got the font file open in Glyphs, which is the tool I used to draw the masters. The dot of the /i is rotating, but it's also getting smaller as it's interpolating. What's going wrong?

To show you, I'll open up the glyph in my "interpolation toy". This is basically my testbed for ideas about interpolation. There are a few interesting things about it. It's written in Rust and it uses the new druid UI toolkit. The way I have it set up right now, it opens a Glyphs font file, and lets you play with the interpolation parameters.

So here I'm sliding the axis back and forth, and you can see what's going on. The motion of each point is a straight line, and that makes the dot smaller in the middle of the range. We have to specify more than just the two endpoints, to have better control over the motion.

The basic way to do that is to add another master, right in the middle. Here I have a version of the font with three masters. It's better, but there are still problems with the dot getting smaller. Let's look at that in the interpolation toy. I'll start with linear interpolation, which is how variable fonts work now. And you can see the problem - the error is not as much, but the motion is still linear between the masters. It would be cooler, wouldn't it, if we could get nice, smooth motion instead.

Now I'll select Gaussian interpolation, and let's see what happens. Nice. In the description is a link to a document I wrote about radial basis functions for interpolation, but the basic idea is simple; it's smoothing it out, using similar underlying math as Gaussian blur for images.

Just rotating a square shows what's going on pretty clearly, but maybe isn't something you'd do in a real font. So here's another example. We want to go from an upright /n to an italic. With just two masters, it's pretty horrible - it gets distorted. So we'll pull up a version with a third master, also drawn in Glyphs, and take a look. Here are the three masters.

With linear interpolation, it's ok, but not great. The terminal is getting smaller when it interpolates between the masters, for the same reason the dot on the /i got smaller - it's a rotational movement. So let's try it with Gaussian interpolation. Very smooth movement, and in particular, a nice smooth rotation of that terminal, blended with the rest of the glyph.

I'm going to continue working on these ideas, but wanted to show you what I had now, as I'm pretty excited. The goal of this work is to produce better quality results, with less effort, because you'll need fewer masters. I hope what I've shown you today gets you interested in the potential for these techniques, and the tools we're building. Thanks for watching!
\ No newline at end of file

A testfont-2masters.glyphs => testfont-2masters.glyphs +1223 -0
@@ 0,0 1,1223 @@
{
.appVersion = "1230";
DisplayStrings = (
i,
in
);
copyright = "Apache 2 / MIT";
customParameters = (
{
name = Axes;
value = (
{
Name = Weight;
Tag = wght;
}
);
}
);
date = "2019-09-26 19:47:24 +0000";
designer = "Raph Levien";
designerURL = "https://levien.com/";
familyName = "Interp Toy";
fontMaster = (
{
ascender = 800;
capHeight = 700;
custom = Extra;
descender = -200;
id = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
name = ExtraLight;
weight = Light;
weightValue = 200;
xHeight = 500;
},
{
ascender = 800;
capHeight = 700;
custom = Black;
descender = -200;
iconName = Bold;
id = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
weightValue = 900;
xHeight = 500;
}
);
glyphs = (
{
glyphname = A;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0041;
},
{
glyphname = B;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0042;
},
{
glyphname = C;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0043;
},
{
glyphname = D;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0044;
},
{
glyphname = E;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0045;
},
{
glyphname = F;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0046;
},
{
glyphname = G;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0047;
},
{
glyphname = H;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0048;
},
{
glyphname = I;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0049;
},
{
glyphname = J;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 004A;
},
{
glyphname = K;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 004B;
},
{
glyphname = L;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 004C;
},
{
glyphname = M;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 004D;
},
{
glyphname = N;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 004E;
},
{
glyphname = O;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 004F;
},
{
glyphname = P;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0050;
},
{
glyphname = Q;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0051;
},
{
glyphname = R;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0052;
},
{
glyphname = S;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0053;
},
{
glyphname = T;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0054;
},
{
glyphname = U;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0055;
},
{
glyphname = V;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0056;
},
{
glyphname = W;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0057;
},
{
glyphname = X;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0058;
},
{
glyphname = Y;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0059;
},
{
glyphname = Z;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 005A;
},
{
glyphname = a;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0061;
},
{
glyphname = b;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0062;
},
{
glyphname = c;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0063;
},
{
glyphname = d;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0064;
},
{
glyphname = e;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0065;
},
{
glyphname = f;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0066;
},
{
glyphname = g;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0067;
},
{
glyphname = h;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0068;
},
{
glyphname = i;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
paths = (
{
closed = 1;
nodes = (
"375 500 LINE",
"242 500 LINE",
"242 0 LINE",
"375 0 LINE"
);
},
{
closed = 1;
nodes = (
"375 587 LINE",
"375 720 LINE",
"242 720 LINE",
"242 587 LINE"
);
}
);
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
paths = (
{
closed = 1;
nodes = (
"375 500 LINE",
"242 500 LINE",
"242 0 LINE",
"375 0 LINE"
);
},
{
closed = 1;
nodes = (
"375 720 LINE",
"242 720 LINE",
"242 587 LINE",
"375 587 LINE"
);
}
);
width = 600;
}
);
unicode = 0069;
},
{
glyphname = j;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 006A;
},
{
glyphname = k;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 006B;
},
{
glyphname = l;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 006C;
},
{
glyphname = m;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 006D;
},
{
glyphname = n;
lastChange = "2019-09-26 21:11:36 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
paths = (
{
closed = 1;
nodes = (
"209 266 LINE SMOOTH",
"212 379 OFFCURVE",
"265 420 OFFCURVE",
"299 420 CURVE SMOOTH",
"331 420 OFFCURVE",
"348 386 OFFCURVE",
"348 331 CURVE SMOOTH",
"348 177 LINE SMOOTH",
"348 124 OFFCURVE",
"348 75 OFFCURVE",
"348 46 CURVE SMOOTH",
"348 33 OFFCURVE",
"348 16 OFFCURVE",
"348 0 CURVE",
"468 0 LINE",
"468 36 OFFCURVE",
"468 67 OFFCURVE",
"468 99 CURVE SMOOTH",
"468 122 OFFCURVE",
"468 122 OFFCURVE",
"468 226 CURVE SMOOTH",
"468 368 LINE SMOOTH",
"468 455 OFFCURVE",
"408 508 OFFCURVE",
"346 508 CURVE SMOOTH",
"295 508 OFFCURVE",
"230 486 OFFCURVE",
"206 434 CURVE",
"205 500 LINE",
"86 500 LINE",
"86 0 LINE",
"204 0 LINE"
);
}
);
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
paths = (
{
closed = 1;
nodes = (
"211 266 LINE SMOOTH",
"225 379 OFFCURVE",
"282 420 OFFCURVE",
"316 420 CURVE SMOOTH",
"348 420 OFFCURVE",
"368 386 OFFCURVE",
"359 331 CURVE SMOOTH",
"327 137 LINE SMOOTH",
"308 20 OFFCURVE",
"351 -10 OFFCURVE",
"415 -10 CURVE SMOOTH",
"459 -10 OFFCURVE",
"510 4 OFFCURVE",
"554 34 CURVE",
"527 102 LINE",
"518 94 OFFCURVE",
"502 85 OFFCURVE",
"488 85 CURVE SMOOTH",
"457 85 OFFCURVE",
"437 87 OFFCURVE",
"452 186 CURVE SMOOTH",
"480 368 LINE SMOOTH",
"493 455 OFFCURVE",
"434 508 OFFCURVE",
"372 508 CURVE SMOOTH",
"321 508 OFFCURVE",
"254 486 OFFCURVE",
"224 434 CURVE",
"230 500 LINE",
"111 500 LINE",
"61 0 LINE",
"179 0 LINE"
);
}
);
width = 600;
}
);
unicode = 006E;
},
{
glyphname = o;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 006F;
},
{
glyphname = p;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0070;
},
{
glyphname = q;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0071;
},
{
glyphname = r;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0072;
},
{
glyphname = s;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0073;
},
{
glyphname = t;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0074;
},
{
glyphname = u;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0075;
},
{
glyphname = v;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0076;
},
{
glyphname = w;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0077;
},
{
glyphname = x;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0078;
},
{
glyphname = y;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0079;
},
{
glyphname = z;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 007A;
},
{
glyphname = zero;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0030;
},
{
glyphname = one;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0031;
},
{
glyphname = two;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0032;
},
{
glyphname = three;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0033;
},
{
glyphname = four;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0034;
},
{
glyphname = five;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0035;
},
{
glyphname = six;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0036;
},
{
glyphname = seven;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0037;
},
{
glyphname = eight;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0038;
},
{
glyphname = nine;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0039;
},
{
glyphname = period;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 002E;
},
{
glyphname = comma;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 002C;
},
{
glyphname = hyphen;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 002D;
},
{
glyphname = space;
lastChange = "2019-09-26 21:00:15 +0000";
layers = (
{
layerId = "2B5583F8-BA01-45E3-8009-D5BB549E4404";
width = 600;
},
{
layerId = "8040C1C7-4779-49C6-BEA8-626BAFDC9D32";
width = 600;
}
);
unicode = 0020;
}
);
instances = (
{
interpolationWeight = 200;
instanceInterpolations = {
"2B5583F8-BA01-45E3-8009-D5BB549E4404" = 1;
};
name = ExtraLight;
},
{
interpolationWeight = 300;
instanceInterpolations = {
"2B5583F8-BA01-45E3-8009-D5BB549E4404" = 0.85714;
"8040C1C7-4779-49C6-BEA8-626BAFDC9D32" = 0.14286;
};
name = Light;
},
{
interpolationWeight = 400;
instanceInterpolations = {
"2B5583F8-BA01-45E3-8009-D5BB549E4404" = 0.71429;
"8040C1C7-4779-49C6-BEA8-626BAFDC9D32" = 0.28571;
};
name = Regular;
},
{
interpolationWeight = 500;
instanceInterpolations = {
"2B5583F8-BA01-45E3-8009-D5BB549E4404" = 0.57143;
"8040C1C7-4779-49C6-BEA8-626BAFDC9D32" = 0.42857;
};
name = Medium;
},
{
interpolationWeight = 600;
instanceInterpolations = {
"2B5583F8-BA01-45E3-8009-D5BB549E4404" = 0.42857;
"8040C1C7-4779-49C6-BEA8-626BAFDC9D32" = 0.57143;
};
name = Seimbold;
},
{
interpolationWeight = 700;
instanceInterpolations = {
"2B5583F8-BA01-45E3-8009-D5BB549E4404" = 0.28571;
"8040C1C7-4779-49C6-BEA8-626BAFDC9D32" = 0.71429;
};
name = Bold;
},
{
interpolationWeight = 800;
instanceInterpolations = {
"2B5583F8-BA01-45E3-8009-D5BB549E4404" = 0.14286;
"8040C1C7-4779-49C6-BEA8-626BAFDC9D32" = 0.85714;
};
name = ExtraBold;
},
{
interpolationWeight = 900;
instanceInterpolations = {
"8040C1C7-4779-49C6-BEA8-626BAFDC9D32" = 1;
};
name = Black;
}
);
unitsPerEm = 1000;
versionMajor = 1;
versionMinor = 0;
}