1
1
mirror of https://github.com/rsms/inter.git synced 2024-12-25 16:44:27 +03:00

Only decompose glyphs with reflected components (#171)

Instead of decomposing a component if any scaling is happening, only decompose a component if xScale < 0 or yScale < 0 (that is, if it is mirrored on the x or y axis). Removes yAxisIsNonTrivial which was set for all italic instances and would cause all composed glyphs to be decomposed.

Closes #169
This commit is contained in:
Rasmus Andersson 2019-07-18 14:05:31 -07:00
commit 3de54b5680
2 changed files with 88 additions and 93 deletions

View File

@ -58,26 +58,22 @@ def fatal(msg):
def composedGlyphIsNonTrivial(g, yAxisIsNonTrivial=False):
# A non-trivial glyph is one that is composed from either multiple
# components or that uses component transformations.
# If yAxisIsNonTrivial is true, then any transformation over the Y axis
# is be considered non-trivial.
def composedGlyphIsNonTrivial(g):
# A non-trivial glyph is one that uses reflecting component transformations.
if g.components and len(g.components) > 0:
if len(g.components) > 1:
return True
for c in g.components:
# has non-trivial transformation? (i.e. scaled)
# Example of optimally trivial transformation:
# (1, 0, 0, 1, 0, 0) no scale or offset
# Example of scaled transformation matrix:
# (-1.0, 0, 0.3311, 1, 1464.0, 0) flipped x axis, sheered and offset
#
xScale, xyScale, yxScale, yScale, xOffset, yOffset = c.transformation
if xScale != 1 or xyScale != 0 or yxScale != 0 or yScale != 1:
return True
if yAxisIsNonTrivial and yOffset != 0:
#
xScale = c.transformation[0]
yScale = c.transformation[3]
# If glyph is reflected along x or y axes, it won't slant well.
if xScale < 0 or yScale < 0:
return True
return False
@ -157,7 +153,7 @@ class VarFontProject(FontProject):
**kwargs
):
"""Build OpenType binaries with interpolatable outlines."""
# We decompose any glyph with two or more components to make sure
# We decompose any glyph with reflected components to make sure
# that fontTools varLib is able to produce properly-slanting interpolation.
self._load_designspace_sources(designspace)
@ -179,12 +175,11 @@ class VarFontProject(FontProject):
ufo.info.openTypeNamePreferredFamilyName =\
ufo.info.openTypeNamePreferredFamilyName.replace('Inter', self.familyName)
updateFontVersion(ufo)
isItalic = ufo.info.italicAngle != 0
ufoname = basename(ufo.path)
for g in ufo:
directives = findGlyphDirectives(g)
if g.components and composedGlyphIsNonTrivial(g, yAxisIsNonTrivial=isItalic):
if g.components and composedGlyphIsNonTrivial(g):
decomposeGlyphs.add(g.name)
if 'removeoverlap' in directives:
if g.components and len(g.components) > 0:
@ -247,7 +242,7 @@ def updateFontVersion(font, dummy=False):
# setFontInfo patches font.info
#
#
def setFontInfo(font, weight):
#
# For UFO3 names, see
@ -487,7 +482,7 @@ class Main(object):
if outfilename is None or outfilename == '':
outfilename = os.path.splitext(basename(args.srcfile))[0] + '.otf'
log.info('setting --output %r' % outfilename)
# build formats list from filename extension
formats = []
# for outfilename in args.outputs:
@ -550,7 +545,7 @@ class Main(object):
success = False
if len(otssan_res) == 0:
otssan_res = 'error'
if success:
os.unlink(tmpfile)
else:
@ -732,7 +727,7 @@ class Main(object):
else:
# name "Black" => "black"
source.name = source.styleName.lower().replace(' ', '')
source.path = ufo_path
weight = int(source.location['Weight'])
@ -840,11 +835,11 @@ class Main(object):
# clear anchors
for g in font:
g.clearAnchors()
# update font info
weight = instance_weight[basename(font.path)]
setFontInfo(font, weight)
font.save()
@ -875,7 +870,7 @@ class Main(object):
argparser.add_argument('files', metavar='<file>', nargs='+',
help='Font files')
args = argparser.parse_args(argv)
q = Queue()

View File

@ -1,5 +1,5 @@
{
.appVersion = "1240";
.appVersion = "1247";
classes = (
{
automatic = 1;
@ -26013,7 +26013,7 @@ userData = {
},
{
glyphname = Idieresis;
lastChange = "2019-02-04 01:15:21 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -26091,7 +26091,7 @@ transform = "{1, 0, 0, 1, -564, 64}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = Idieresis;
@ -26105,7 +26105,7 @@ userData = {
},
{
glyphname = Idieresisacute;
lastChange = "2019-03-30 20:56:26 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -26239,7 +26239,7 @@ transform = "{1, 0, 0, 1, 866, 0}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = Idieresis;
@ -26251,7 +26251,7 @@ interface.gridadjust.original = "{'width': 1018, 'leftMargin': 28, 'rightMargin'
},
{
glyphname = Istroke;
lastChange = "2018-12-31 21:21:37 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -26329,7 +26329,7 @@ transform = "{1, 0, 0, 1, -220, 64}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
unicode = 0197;
@ -26342,7 +26342,7 @@ interface.gridadjust.original = "{'width': 938, 'leftMargin': 27, 'rightMargin':
},
{
glyphname = Itildebelow;
lastChange = "2018-12-31 21:21:37 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -26420,7 +26420,7 @@ transform = "{1, 0, 0, 1, 1376, 0}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = B;
@ -26435,7 +26435,7 @@ interface.gridadjust.original = "{'width': 1011, 'leftMargin': -13, 'rightMargin
},
{
glyphname = Igrave;
lastChange = "2019-01-01 00:04:58 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -26513,7 +26513,7 @@ transform = "{1, 0, 0, 1, -392, 512}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = B;
@ -26522,7 +26522,7 @@ unicode = 00CC;
},
{
glyphname = Iacute;
lastChange = "2019-02-10 19:23:45 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -26600,7 +26600,7 @@ transform = "{1, 0, 0, 1, -258, 512}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = B;
@ -26609,7 +26609,7 @@ unicode = 00CD;
},
{
glyphname = Icircumflex;
lastChange = "2019-02-04 01:15:21 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -26687,7 +26687,7 @@ transform = "{1, 0, 0, 1, -156, 512}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = Idieresis;
@ -26797,7 +26797,7 @@ unicode = 0128;
},
{
glyphname = Imacron;
lastChange = "2019-02-04 01:15:21 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -26875,7 +26875,7 @@ transform = "{1, 0, 0, 1, 26, 512}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = Idieresis;
@ -26884,7 +26884,7 @@ unicode = 012A;
},
{
glyphname = Ibreve;
lastChange = "2019-02-04 01:15:21 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -26962,7 +26962,7 @@ transform = "{1, 0, 0, 1, -148, 512}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = Idieresis;
@ -27070,7 +27070,7 @@ unicode = 012E;
},
{
glyphname = Idotaccent;
lastChange = "2019-02-04 01:15:21 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -27148,7 +27148,7 @@ transform = "{1, 0, 0, 1, 182, 512}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = B;
@ -27157,7 +27157,7 @@ unicode = 0130;
},
{
glyphname = Icaron;
lastChange = "2019-02-04 01:15:21 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -27235,7 +27235,7 @@ transform = "{1, 0, 0, 1, -152, 512}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = B;
@ -27244,7 +27244,7 @@ unicode = 01CF;
},
{
glyphname = Idblgrave;
lastChange = "2019-02-10 19:12:05 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -27322,7 +27322,7 @@ transform = "{1, 0, 0, 1, 1206, 512}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = Idieresis;
@ -27331,7 +27331,7 @@ unicode = 0208;
},
{
glyphname = Iinvertedbreve;
lastChange = "2018-12-31 21:21:37 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -27409,7 +27409,7 @@ transform = "{1, 0, 0, 1, 1180, 612}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = Idieresis;
@ -27418,7 +27418,7 @@ unicode = 020A;
},
{
glyphname = Ihookabove;
lastChange = "2018-12-31 21:21:37 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -27496,7 +27496,7 @@ transform = "{1, 0, 0, 1, 1144, 572}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = B;
@ -27505,7 +27505,7 @@ unicode = 1EC8;
},
{
glyphname = Idotbelow;
lastChange = "2019-02-02 20:28:22 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -27583,7 +27583,7 @@ transform = "{1, 0, 0, 1, 1120, 0}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = B;
@ -27592,7 +27592,7 @@ unicode = 1ECA;
},
{
glyphname = Iota;
lastChange = "2018-12-31 21:21:37 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -27646,7 +27646,7 @@ name = I;
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = B;
@ -27753,7 +27753,7 @@ unicode = 038A;
},
{
glyphname = Iotadieresis;
lastChange = "2018-12-31 21:21:37 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -27807,7 +27807,7 @@ name = Idieresis;
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = Idieresis;
@ -28614,7 +28614,7 @@ unicode = 1F3F;
},
{
glyphname = uni1FD8;
lastChange = "2019-02-04 01:15:21 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -28692,7 +28692,7 @@ transform = "{1, 0, 0, 1, -148, 512}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = Idieresis;
@ -28701,7 +28701,7 @@ unicode = 1FD8;
},
{
glyphname = uni1FD9;
lastChange = "2019-02-04 01:15:21 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -28779,7 +28779,7 @@ transform = "{1, 0, 0, 1, 26, 512}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = Idieresis;
@ -28988,7 +28988,7 @@ unicode = 1FDB;
},
{
glyphname = afii10055;
lastChange = "2018-12-31 21:21:37 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -29042,7 +29042,7 @@ name = I;
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = B;
@ -29051,7 +29051,7 @@ unicode = 0406;
},
{
glyphname = afii10056;
lastChange = "2019-01-01 00:18:52 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -29129,7 +29129,7 @@ transform = "{1, 0, 0, 1, -488, 512}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = Idieresis;
@ -38019,7 +38019,7 @@ interface.gridadjust.original = "{'width': 2010, 'leftMargin': 241, 'rightMargin
},
{
glyphname = uni040D;
lastChange = "2019-01-23 15:58:06 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -38093,11 +38093,11 @@ name = afii10026;
},
{
name = grave;
transform = "{1, 0, 0, 1, 334, 512}";
transform = "{1, 0, 0, 1, 340, 512}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 2170;
width = 2176;
}
);
leftKerningGroup = B;
@ -38106,7 +38106,7 @@ unicode = 040D;
},
{
glyphname = afii10027;
lastChange = "2019-02-04 01:15:21 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -38180,11 +38180,11 @@ name = afii10026;
},
{
name = breve;
transform = "{1, 0, 0, 1, 578, 512}";
transform = "{1, 0, 0, 1, 584, 512}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 2170;
width = 2176;
}
);
leftKerningGroup = B;
@ -38193,7 +38193,7 @@ unicode = 0419;
},
{
glyphname = Imacroncyrillic;
lastChange = "2019-02-04 01:15:21 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -38267,11 +38267,11 @@ name = afii10026;
},
{
name = macron;
transform = "{1, 0, 0, 1, 752, 512}";
transform = "{1, 0, 0, 1, 758, 512}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 2170;
width = 2176;
}
);
leftKerningGroup = B;
@ -38280,7 +38280,7 @@ unicode = 04E2;
},
{
glyphname = Idieresiscyrillic;
lastChange = "2019-02-04 01:15:21 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -38354,11 +38354,11 @@ name = afii10026;
},
{
name = casedieresis.cn;
transform = "{1, 0, 0, 1, 162, 64}";
transform = "{1, 0, 0, 1, 168, 64}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 2170;
width = 2176;
}
);
leftKerningGroup = B;
@ -38367,7 +38367,7 @@ unicode = 04E4;
},
{
glyphname = uni048A;
lastChange = "2019-02-04 01:15:21 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -38463,15 +38463,15 @@ name = afii10026;
},
{
name = breve;
transform = "{1, 0, 0, 1, 578, 512}";
transform = "{1, 0, 0, 1, 584, 512}";
},
{
name = cyrillictail.cn;
transform = "{1, 0, 0, 1, 1512, -100}";
transform = "{1, 0, 0, 1, 1518, -100}";
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 2170;
width = 2176;
}
);
leftKerningGroup = B;
@ -80416,7 +80416,7 @@ interface.gridadjust.original = "{'width': 989, 'leftMargin': 315, 'rightMargin'
},
{
glyphname = fdotaccent;
lastChange = "2019-02-04 01:15:21 +0000";
lastChange = "2019-07-18 20:42:52 +0000";
layers = (
{
components = (
@ -80438,11 +80438,11 @@ name = f;
},
{
name = dotaccent;
transform = "{1, 0, 0, 1, 240, 512}";
transform = "{1, 0, 0, 1, 216, 512}";
}
);
layerId = "5C20EF92-B63D-42A8-8878-93C2863E0093";
width = 1156;
width = 1132;
},
{
components = (
@ -80464,11 +80464,11 @@ name = f;
},
{
name = dotaccent;
transform = "{1, 0, 0, 1, 326, 512}";
transform = "{1, 0, 0, 1, 302, 512}";
}
);
layerId = "D0EC06BF-13F9-4C88-A6F5-B8203AF6C77E";
width = 1156;
width = 1134;
},
{
components = (
@ -94300,7 +94300,7 @@ unicode = E05C;
},
{
glyphname = uni04CF;
lastChange = "2018-12-31 21:21:38 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -94354,7 +94354,7 @@ name = I;
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = B;
@ -307433,7 +307433,7 @@ unicode = 04BE;
},
{
glyphname = palochkacyrillic;
lastChange = "2018-12-31 21:21:38 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -307487,7 +307487,7 @@ name = I;
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
leftKerningGroup = B;
@ -326060,7 +326060,7 @@ interface.gridadjust.original = "{'width': 1282, 'leftMargin': 138, 'rightMargin
{
color = (227,245,235,1);
glyphname = romanone;
lastChange = "2018-12-31 21:21:38 +0000";
lastChange = "2019-07-18 20:40:07 +0000";
layers = (
{
components = (
@ -326114,7 +326114,7 @@ name = I;
}
);
layerId = "200BE2C5-40F6-4CF4-AF4F-A33C0CC0964F";
width = 700;
width = 704;
}
);
unicode = 2160;