diff -Nru afdko-3.6.0+dfsg1/c/makeotf/makeotf_lib/api/hotconv.h afdko-3.6.2+dfsg1/c/makeotf/makeotf_lib/api/hotconv.h --- afdko-3.6.0+dfsg1/c/makeotf/makeotf_lib/api/hotconv.h 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/c/makeotf/makeotf_lib/api/hotconv.h 2021-03-02 21:09:16.000000000 +0000 @@ -12,7 +12,7 @@ extern "C" { #endif -#define HOT_VERSION 0x010075 /* Library version (1.0.117) */ +#define HOT_VERSION 0x010076 /* Library version (1.0.118) */ /* Major, minor, build = (HOT_VERSION >> 16) & 0xff, (HOT_VERSION >> 8) & 0xff, HOT_VERSION & 0xff) */ /* Warning: this string is now part of heuristic used by CoolType to identify the first round of CoolType fonts which had the backtrack sequence of a chaining diff -Nru afdko-3.6.0+dfsg1/c/makeotf/makeotf_lib/source/hotconv/feat.c afdko-3.6.2+dfsg1/c/makeotf/makeotf_lib/source/hotconv/feat.c --- afdko-3.6.0+dfsg1/c/makeotf/makeotf_lib/source/hotconv/feat.c 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/c/makeotf/makeotf_lib/source/hotconv/feat.c 2021-03-02 21:09:16.000000000 +0000 @@ -3301,7 +3301,7 @@ valid = 0; } - if (!((isSubrule || IS_GLYPH(targ)) && isUnmarkedGlyphSeq(repl))) { + if (!((isSubrule || IS_GLYPH(targ)) && isUnmarkedGlyphSeq(repl)) && (repl != NULL || targ->flags & FEAT_LOOKUP_NODE)) { featMsg(hotERROR, "Invalid multiple substitution rule"); valid = 0; } @@ -3597,7 +3597,7 @@ } } - if ((repl == NULL) || lkpType == GSUBChain || (targ->flags & FEAT_IGNORE_CLAUSE)) { + if (lkpType == GSUBChain || (targ->flags & FEAT_IGNORE_CLAUSE)) { /* Chain sub exceptions (further analyzed below). */ /* "sub f i by fi;" will be here if there was an "except" clause */ diff -Nru afdko-3.6.0+dfsg1/c/makeotf/makeotf_lib/source/hotconv/hot.c afdko-3.6.2+dfsg1/c/makeotf/makeotf_lib/source/hotconv/hot.c --- afdko-3.6.0+dfsg1/c/makeotf/makeotf_lib/source/hotconv/hot.c 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/c/makeotf/makeotf_lib/source/hotconv/hot.c 2021-03-02 21:09:16.000000000 +0000 @@ -715,9 +715,8 @@ } intLeading = font->win.ascent + font->win.descent - font->unitsPerEm; if (intLeading < 0) { - /* Avoid negative internal leading */ - font->win.ascent -= intLeading; - intLeading = 0; + /* Warn about negative internal leading */ + hotMsg(g, hotWARNING, "Negative internal leading: win.ascent + win.descent < unitsPerEm"); } /* Set typo ascender/descender/linegap */ diff -Nru afdko-3.6.0+dfsg1/c/makeotf/source/cb.c afdko-3.6.2+dfsg1/c/makeotf/source/cb.c --- afdko-3.6.0+dfsg1/c/makeotf/source/cb.c 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/c/makeotf/source/cb.c 2021-03-02 21:09:16.000000000 +0000 @@ -48,6 +48,7 @@ #define WINDOWS_DECORATIVE (5 << 4) #define MAX_CHAR_NAME_LEN 63 /* Max charname len (inc '\0') */ #define MAX_FINAL_CHAR_NAME_LEN 63 /* Max charname len (inc '\0') */ +#define MAX_UV_CHAR_NAME_LEN 2047 /* length of entire alias string (column) */ #ifdef _MSC_VER /* defined by Microsoft Compiler */ #include @@ -900,6 +901,11 @@ static char *gnameScan(cbCtx h, char *p, unsigned char *action, unsigned char *next, int nameType) { char *start = p; int state = 0; + int nameLimit = MAX_CHAR_NAME_LEN; + + if (nameType == uvName) { + nameLimit = MAX_UV_CHAR_NAME_LEN; + } for (;;) { int actn; @@ -934,7 +940,7 @@ return NULL; } if (actn & Q_) { - if (p - start > MAX_CHAR_NAME_LEN) { + if (p - start > nameLimit) { return NULL; /* Maximum glyph name length exceeded */ } return p; diff -Nru afdko-3.6.0+dfsg1/c/makeotf/source/main.c afdko-3.6.2+dfsg1/c/makeotf/source/main.c --- afdko-3.6.0+dfsg1/c/makeotf/source/main.c 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/c/makeotf/source/main.c 2021-03-02 21:09:16.000000000 +0000 @@ -30,7 +30,7 @@ jmp_buf mark; -#define MAKEOTF_VERSION "2.5.65602" +#define MAKEOTF_VERSION "2.5.65603" /* Warning: this string is now part of heuristic used by CoolType to identify the first round of CoolType fonts which had the backtrack sequence of a chaining contextual substitution ordered incorrectly. Fonts with the old ordering MUST match diff -Nru afdko-3.6.0+dfsg1/c/public/lib/source/t1cstr/t1cstr.c afdko-3.6.2+dfsg1/c/public/lib/source/t1cstr/t1cstr.c --- afdko-3.6.0+dfsg1/c/public/lib/source/t1cstr/t1cstr.c 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/c/public/lib/source/t1cstr/t1cstr.c 2021-03-02 21:09:16.000000000 +0000 @@ -48,8 +48,8 @@ int cnt; float array[T1_MAX_OP_STACK]; } stack; - float x; /* Path x-coord */ - float y; /* Path y-coord */ + double x; /* Path x-coord */ + double y; /* Path y-coord */ long maxOpStack; int subrDepth; float transformMatrix[6]; @@ -117,19 +117,7 @@ #define PUSH(v) (h->stack.array[h->stack.cnt++] = (float)(v)) #define ARRAY_LEN(a) (sizeof(a) / sizeof(a[0])) -#define RND(v) ((float)floor((v) + 0.50001)) -/* The 0.000005 is added to allow for differences in OS's and other mathlibs -when blending LE's or MM's. The problem is that the differences can lead to -a final value being just a hair above .5 on one platform and a hair below on -another,leading, to off by one differences depending on which system is being - used to build the output font. -The logic 'floor(x + 0.5)' implements std Java rounding, where x.5 rounds - to (x+1), -x.5) rounds to (-x), and everything else rounds to the nearest - whole integer. The addition of 0.00001 captures everything 'close enough' - to +/- x.5 to be treated as it if were on the boundary. This number is derived - empirically, as being the smallest number that is still larger than precision - differences between Flex/Flash in TWB2, and the 64 bit C math lib. - */ +#define RND(v) ((double)floor((v) + 0.5)) /* Transform coordinates by matrix. */ #define TX(x, y) \ @@ -214,8 +202,8 @@ /* Callback path move. */ static void callbackMove(t1cCtx h, float dx, float dy) { - float x; - float y; + double x; + double y; h->flags &= ~PEND_MOVETO; h->flags |= SEEN_MOVETO; @@ -223,8 +211,8 @@ x = h->x + dx; y = h->y + dy; - x = (float)RND_ON_READ(x); - y = (float)RND_ON_READ(y); + x = (double)RND_ON_READ(x); + y = (double)RND_ON_READ(y); if (h->seac.phase == seacAccentPreMove) { x += h->seac.xshift; @@ -261,8 +249,8 @@ /* Callback path line. */ static void callbackLine(t1cCtx h, float dx, float dy) { - float x; - float y; + double x; + double y; if (h->flags & PEND_MOVETO) callbackMove(h, 0, 0); /* Insert missing move */ @@ -270,8 +258,8 @@ x = h->x + dx; y = h->y + dy; - x = (float)RND_ON_READ(x); - y = (float)RND_ON_READ(y); + x = (double)RND_ON_READ(x); + y = (double)RND_ON_READ(y); h->x = x; h->y = y; @@ -289,12 +277,12 @@ float dx1, float dy1, float dx2, float dy2, float dx3, float dy3) { - float x1; - float y1; - float x2; - float y2; - float x3; - float y3; + double x1; + double y1; + double x2; + double y2; + double x3; + double y3; if (h->flags & PEND_MOVETO) callbackMove(h, 0, 0); /* Insert missing move */ @@ -305,8 +293,8 @@ y2 = y1 + dy2; x3 = x2 + dx3; y3 = y2 + dy3; - x3 = (float)RND_ON_READ(x3); - y3 = (float)RND_ON_READ(y3); + x3 = (double)RND_ON_READ(x3); + y3 = (double)RND_ON_READ(y3); h->x = x3; h->y = y3; @@ -408,20 +396,20 @@ dx6, dy6); } else { /* Callback as flex hint; convert to absolute coordinates */ - float x1 = h->x + dx1; - float y1 = h->y + dy1; - float x2 = x1 + dx2; - float y2 = y1 + dy2; - float x3 = x2 + dx3; - float y3 = y2 + dy3; - float x4 = x3 + dx4; - float y4 = y3 + dy4; - float x5 = x4 + dx5; - float y5 = y4 + dy5; - float x6 = x5 + dx6; - float y6 = y5 + dy6; - x6 = (float)RND_ON_READ(x6); - y6 = (float)RND_ON_READ(y6); + double x1 = h->x + dx1; + double y1 = h->y + dy1; + double x2 = x1 + dx2; + double y2 = y1 + dy2; + double x3 = x2 + dx3; + double y3 = y2 + dy3; + double x4 = x3 + dx4; + double y4 = y3 + dy4; + double x5 = x4 + dx5; + double y5 = y4 + dy5; + double x6 = x5 + dx6; + double y6 = y5 + dy6; + x6 = (double)RND_ON_READ(x6); + y6 = (double)RND_ON_READ(y6); h->x = x6; h->y = y6; @@ -476,8 +464,8 @@ a closepoint-terminated subpath to a new subpath in MM fonts. */ if (h->seac.phase <= seacBase) { - h->x = (float)RND_ON_READ(args[15]); - h->y = (float)RND_ON_READ(args[16]); + h->x = (double)RND_ON_READ(args[15]); + h->y = (double)RND_ON_READ(args[16]); } } diff -Nru afdko-3.6.0+dfsg1/c/public/lib/source/t1read/t1read.c afdko-3.6.2+dfsg1/c/public/lib/source/t1read/t1read.c --- afdko-3.6.0+dfsg1/c/public/lib/source/t1read/t1read.c 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/c/public/lib/source/t1read/t1read.c 2021-03-02 21:09:16.000000000 +0000 @@ -1653,8 +1653,8 @@ } /* Parse blend array and blend elements. */ -static float parseBlend(t1rCtx h, int kKey, char **str) { - float value; +static double parseBlend(t1rCtx h, int kKey, char **str) { + double value; int i; char *p = *str; char delim = (*p++ == '[') ? ']' : '}'; @@ -1672,7 +1672,7 @@ char *q; /* Parse and blend number */ - value += h->fd->aux.WV[i] * (float)ctuStrtod(p, &q); + value += h->fd->aux.WV[i] * (double)ctuStrtod(p, &q); if (p == q) badKeyValue(h, kKey); /* Invalid number */ p = q; @@ -1725,7 +1725,7 @@ case pstArray: case pstProcedure: { char *p = copyArrayToken(h, token); - float value = parseBlend(h, kKey, &p); + double value = parseBlend(h, kKey, &p); return round ? RND(value) : value; } default: @@ -1764,10 +1764,10 @@ case '{': if (blend) { if (i < max) { - float value = parseBlend(h, kKey, &p); + double value = parseBlend(h, kKey, &p); if (kKey == kFontBBox) { array[i] = - (float)((i < 2) ? floor(value) : ceil(value)); + (double)((i < 2) ? floor(value) : ceil(value)); i++; } else array[i++] = value; diff -Nru afdko-3.6.0+dfsg1/c/spot/source/main.c afdko-3.6.2+dfsg1/c/spot/source/main.c --- afdko-3.6.0+dfsg1/c/spot/source/main.c 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/c/spot/source/main.c 2021-03-02 21:09:16.000000000 +0000 @@ -184,11 +184,11 @@ "Options:\n" " -u print usage information\n" " -h print usage and help information\n" - " -ht print table-specific usage information\n" + " -ht print table-specific usage information\n" " -r dump Macintosh resource map\n" " -n dump glyph id/name mapping (also see '-m' below)\n" - " -nc dump glyph id/name mapping, one per line (also see '-m' below)\n" - " -ngid Suppress terminal gid on glyph names from TTF fonts.\n" + " -nc dump glyph id/name mapping, one per line (also see '-m' below)\n" + " -ngid Suppress terminal gid on glyph names from TTF fonts.\n" " -T list table-directory in sfnt table\n" " -F list features in GPOS,GSUB tables\n" " -G proof glyph synopsis\n" @@ -196,7 +196,7 @@ " -V proof glyphs in Vertical writing mode (same as -p6 below)\n" " -m map glyph names into Adobe 'friendly' names, not AGL/Unicode names\n" " -d suppress header info from proof\n" - " -br proof glyph synopsis one per page\n" + " -br proof glyph synopsis one per page\n" #if AUTOSPOOL " -l leave proofing output files; do not spool them to printer\n" " -O proof data to 'stdout' (e.g., for sending to printer or saving to some file)\n" @@ -217,9 +217,10 @@ #if AUTOSCRIPT " -X execute a series of complete command-lines from [default: OTFproof.scr ]\n" #endif - "Note: Proof options write a PostScript file to standard output, and must be redirected to a file. \n" - "Example: 'spot -P kern test.otf > kern.ps' This file can then be converted to PDF with Distiller, or\n" - "downloaded to a printer.\n" + "\n" + "Note: Proof options write a PostScript file to standard output, and must be redirected to a file.\n" + "Example: 'spot -P kern test.otf > kern.ps'\n" + "This file can then be converted to PDF with Distiller, or downloaded to a printer.\n" "\n" "Version:\n" " %s\n", @@ -241,49 +242,52 @@ printUsage(); sfntUsage(); fprintf(OUTPUTBUFF, - "Notes:\n" - " This program dumps sfnt data from plain files or Macintosh\n" - "resource files. In the latter case, when there are 2 or more sfnt\n" - "resources, or in the absence of the -i option, the resource map\n" - "is dumped as a list of resource types and ids. The program may\n" - "then be rerun with an argument to the -i option specifying a\n" - "comma-separated sfnt id list of the sfnt resources to be dumped\n" - "or the argument 'all' which dumps all sfnt resources.\n" - " All the multiple sfnts within an OpenType Collection (TTC)\n" - "will be dumped by default but may be selectively dumped via TTC\n" - "directory offsets specified with the -o option, e.g.\n" - "-o0x14,0x170. Use the -tttcf option to view all the TTC\n" - "directory offsets available.\n" - " The argument to the -t option specifies a list of tables to\n" - "be dumped. Tables are selected by a comma-separated list of\n" - "table tags, e.g. cmap,MMVR,fdsc. An optional dump level may be\n" - "specified by appending '=' followed by the level to a tag,\n" - "e.g. cmap=2. Higher levels print successively more information\n" - "up to a maximum of 4 (the default) although all 4 levels are not\n" - "supported by all tables. Level 1 always prints the table tag and\n" - "file offset. When a level is specified its value becomes the\n" - "default for the remaining tables in the list unless a new level\n" - "is specified, e.g. cmap=2,MMVR,HFMX,fdsc=1 dumps the cmap, MMVR,\n" - "and HFMX tables at level 2 and the fdsc table at level 1. If a\n" - "level is given as 'x', e.g. cmap=x the table is dumped in\n" - "hexadecimal format. If an unsupported table tag is specified the\n" - "table is dumped in hexadecimal format regardless of whether a\n" - "level of 'x' is specified.\n"); + "Notes:\n" + "\n" + "This program dumps sfnt data from plain files or Macintosh resource\n" + "files.\n" + "In the latter case, when there are 2 or more sfnt resources, or in\n" + "the absence of the -i option, the resource map is dumped as a list of\n" + "resource types and ids. The program may then be rerun with an argument\n" + "to the -i option specifying a comma-separated sfnt id list of the sfnt\n" + "resources to be dumped or the argument 'all' which dumps all sfnt\n" + "resources.\n" + "\n" + "All the multiple sfnts within an OpenType Collection (TTC) will be\n" + "dumped by default but may be selectively dumped via TTC directory\n" + "offsets specified with the -o option, e.g. -o0x14,0x170. Use the\n" + "-tttcf option to view all the TTC directory offsets available.\n" + "\n" + "The argument to the -t option specifies a list of tables to be dumped.\n" + "Tables are selected by a comma-separated list of table tags, e.g.\n" + "cmap,MMVR,fdsc. An optional dump level may be specified by appending\n" + "'=' followed by the level to a tag, e.g. cmap=2. Higher levels print\n" + "successively more information up to a maximum of 4 (the default)\n" + "although all 4 levels are not supported by all tables. Level 1 always\n" + "prints the table tag and file offset. When a level is specified its\n" + "value becomes the default for the remaining tables in the list unless\n" + "a new level is specified, e.g. cmap=2,MMVR,HFMX,fdsc=1 dumps the cmap,\n" + "MMVR, and HFMX tables at level 2 and the fdsc table at level 1. If a\n" + "level is given as 'x', e.g. cmap=x the table is dumped in hexadecimal\n" + "format. If an unsupported table tag is specified the table is dumped\n" + "in hexadecimal format regardless of whether a level of 'x' is\n" + "specified.\n\n"); fprintf(OUTPUTBUFF, - " The -n option dumps glyph id to glyph name mapping for all\n" - "glyphs in the font. Naming information is extracted from post\n" - "format 1.0, 2.0, or 2.5 tables, or if they are not available,\n" - "the MS UGL cmap. In the event that none of these is available\n" - "the glyph name is simply printed as @ followed by the decimal\n" - "glyph id in decimal.\n" - " The special tag 'sfnt' dumps the sfnt directory which lists\n" - "all the table present in the sfnt. The special tag 'uset' sets\n" - "the dump level on all unset tables in the font allowing tables\n" - "to be dumped without explicitly naming them, e.g. -tuset will\n" - "dump all tables at the default level 4. If this produces too\n" - "much information you can disable dumping of selected tables by\n" - "setting their dump level to 0, e.g. -tuset,glyf=0,hdmx.\n" - " The -ht option provides additional table-specific help.\n"); + "The -n option dumps glyph id to glyph name mapping for all glyphs in\n" + "the font. Naming information is extracted from post format 1.0, 2.0,\n" + "or 2.5 tables, or if they are not available, the MS UGL cmap. In the\n" + "event that none of these is available the glyph name is simply printed\n" + "as @ followed by the decimal glyph id in decimal.\n" + "\n" + "The special tag 'sfnt' dumps the sfnt directory which lists all the\n" + "tables present in the sfnt. The special tag 'uset' sets the dump level\n" + "on all unset tables in the font allowing tables to be dumped without\n" + "explicitly naming them, e.g. -tuset will dump all tables at the\n" + "default level 4. If this produces too much information you can disable\n" + "dumping of selected tables by setting their dump level to 0, e.g.\n" + "-tuset,glyf=0,hdmx.\n" + "\n" + "The -ht option provides additional table-specific help.\n"); quit(0); } diff -Nru afdko-3.6.0+dfsg1/debian/changelog afdko-3.6.2+dfsg1/debian/changelog --- afdko-3.6.0+dfsg1/debian/changelog 2021-02-16 15:09:48.000000000 +0000 +++ afdko-3.6.2+dfsg1/debian/changelog 2021-05-16 14:29:10.000000000 +0000 @@ -1,8 +1,9 @@ -afdko (3.6.0+dfsg1-3build1) hirsute; urgency=medium +afdko (3.6.2+dfsg1-1) unstable; urgency=medium - * No change rebuild with fixed ownership. + * New upstream version 3.6.2+dfsg1 + * d/control: Update dependencies - -- Dimitri John Ledkov Tue, 16 Feb 2021 15:09:48 +0000 + -- Yao Wei (魏銘廷) Sun, 16 May 2021 22:29:10 +0800 afdko (3.6.0+dfsg1-3) unstable; urgency=medium diff -Nru afdko-3.6.0+dfsg1/debian/control afdko-3.6.2+dfsg1/debian/control --- afdko-3.6.0+dfsg1/debian/control 2021-02-16 15:09:48.000000000 +0000 +++ afdko-3.6.2+dfsg1/debian/control 2021-05-16 14:29:10.000000000 +0000 @@ -1,8 +1,7 @@ Source: afdko Section: devel Priority: optional -Maintainer: Ubuntu Developers -XSBC-Original-Maintainer: Debian Fonts Task Force +Maintainer: Debian Fonts Task Force Uploaders: Yao Wei (魏銘廷) Build-Depends: debhelper-compat (= 13), @@ -11,10 +10,10 @@ python3-booleanoperations (>= 0.9.0), python3-defcon (>= 0.7.2), python3-fontmath (>= 0.6.0), - python3-fonttools (>= 4.19.1), - python3-psautohint (>= 2.2.0), - python3-tqdm (>= 4.48.2), - python3-ufonormalizer (>= 0.5.2), + python3-fonttools (>= 4.21.1), + python3-psautohint (>= 2.3.0), + python3-tqdm (>= 4.57.0), + python3-ufonormalizer (>= 0.5.3), python3-ufoprocessor (>= 1.9.0), python3-setuptools, python3-setuptools-scm, diff -Nru afdko-3.6.0+dfsg1/docs/MakeOTFUserGuide.md afdko-3.6.2+dfsg1/docs/MakeOTFUserGuide.md --- afdko-3.6.0+dfsg1/docs/MakeOTFUserGuide.md 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/docs/MakeOTFUserGuide.md 2021-03-02 21:09:16.000000000 +0000 @@ -1,6 +1,7 @@ # MakeOTF OpenType/CFF compiler - User Guide ## **Overview** + MakeOTF is a tool designed to create an OpenType® font from a source font file and from a text file containing high-level descriptions of OpenType layout features. It is designed to run as a command line tool: a command typed into the Terminal window on Mac OS® X, or in the DOS window on Windows®. Note that MakeOTF is only a compiler of font data, not a font editor. MakeOTF requires a number of source files that can all be specified through options for the makeotf command: @@ -19,6 +20,7 @@ Options can be added to the `makeotf` command to set parameters that change how MakeOTF builds an OpenType font. When options conflict, the last one on the command line will override any earlier conflicting options. ## **Using MakeOTF** + MakeOTF comes in two parts which can actually be called independently: * **`makeotfexe`** is a program written in C, and is actually the tool that builds the OpenType font file. It requires, however, that all the source files be explicitly specified with options on the command line. @@ -27,6 +29,7 @@ In general, one should invoke **`makeotf.py`** with the makeotf command. This way, the last set of options used will always be recorded in a project file. The first step in using MakeOTF is to assemble the source files. It is often a good idea to organize the files in a directory tree, like this: + ``` MyFontFamily/ ├── FontMenuNameDB @@ -57,15 +60,15 @@ Usually, positioning rules such as kerning (`features.kern`) are specific to each font, but most (or all) of the substitution rules are likely to be the same for all fonts. A good practice is to have a feature file for each family member, in the same directory as the source font file, and then use an include statement to reference feature files located higher in the directory tree. In the example above, there are two separate `features.family` files, one for Roman and another for Italic. These can, in turn, be shared between all family members under each branch. The need for two different `features.family` files comes from the fact that Roman and Italic styles might not have the same number of substitution (GSUB) rules — Italic tends to have more. Once one has assembled all the necessary files, the next step is to open a command window — the Terminal program on Mac OS X, or the Command program on Windows —, and use the cd command to set the current working directory to the directory which contains the set of source files to compile the OpenType font: -``` +```bash cd ``` and then type the `makeotf` command, with the options needed. For example: -``` +```bash makeotf –f myfont.pfa –ff myfeatures –b –r ``` or -``` +```bash makeotf –fp myproject.fpr ``` @@ -109,13 +112,13 @@ |`-nga`| |Turn off applying the GlyphOrderAndAliasDB file| |`-naddn`| |Turn off adding a standard .notdef. Can be used to override a project file setting, otherwise has no effect.| |`-nadds`| |Turn off adding Apple symbol glyphs. Can be used to override a project file setting, otherwise has no effect.| -| | | | Options are applied in the order in which they are specified: `–r –nS` will not subroutinize a font, but `–nS –r` will subroutinize a font. Option values are read (in order of increasing priority) from first the fontinfo file keyword/value pairs, then the specified project file, if any, and then from the command line, in order from left to right. Subroutinization is a process by which common elements in a set of glyphs are decomposed in separate subroutines. This can reduce the size of the final font but can require extreme amounts of memory and time for a large font, such as CID fonts. MakeOTF may need as much as 64 Mbytes of memory for large Roman fonts, and will do most with only 32 Mbytes, but it may need 768 Mbytes of memory to subroutinize a 5-Mbyte CID font. Subroutinizing is reasonably fast when done all in memory: a few minutes for a Roman font, half an hour to three hours for a CID font. However, if the system must use virtual memory, the time required can increase by a factor of 20 or more. Subroutinizing is likely to be useful for Roman fonts, and for Korean CID fonts. Japanese and Chinese CID fonts usually only yield a few percent size reduction with subroutinizing, due to fewer repeating path elements. ## FontMenuNameDB – Version 2 + Previous versions of MakeOTF used a different version of the `FontMenuNameDB` file, and wrote the Macintosh font menu names differently than the Windows font menu names, and not according to the OpenType spec. This is because of some history of the early efforts to get OpenType fonts working on the Mac OS. However, for some years Apple has been following the OpenType spec when making Apple OpenType fonts, and has fully supported the OpenType font menu names. As a result, this version of MakeOTF has implemented new syntax for the `FontMenuNameDB`, and will create the name table according to the OpenType spec when this new syntax is used. Fonts made with earlier versions of MakeOTF will not be disadvantaged, as all Adobe fonts to date and many third-party fonts were made this way, and all programs look first to the Windows font menu names when they exist, as this is where the style-linking names can most reliably be found. @@ -153,6 +156,7 @@ For complete description of these issues, please read the [OpenType specification section on the name table](https://docs.microsoft.com/en-us/typography/opentype/spec/name). ### **Examples** + |**Regular font of Adobe® Garamond® Pro**| |----------------------------------------| |`[AGaramondPro-Regular]`| @@ -199,11 +203,13 @@ This font is part of the same style-linking subgroup as the font in the previous example. In order to be style-linked, they share the same `l=` key, but the default style will be set to Italic in this case. The Macintosh compatible Full menu name was be built by appending the default style to the compatible family menu name. ### **Note on length restrictions** + Because of limitations in operating systems and common applications, it is recommended that none of these keys contain names longer than 31 characters. This results in menu names for legacy environments being 31 characters or less. The OpenType menu name (used in Adobe InDesign® and future Adobe applications) may be thought of as the combination of the `f=` and `s=` keys. Since each of these can be up to 31 characters, the OpenType menu name can be up to 62 characters. ### **Note on accented/extended characters** + To use accented characters in Latin menu names, one needs two `f=` entries: one for Windows, and one for Mac. The Windows entry specifies the character by Unicode. The Mac entry specifies it by the hex value of the Mac char code from the font’s mac cmap table, when different from the ASCII value. The Unicode/character code value is preceded by a backslash (`\`): |**Arnold Böcklin** || @@ -236,6 +242,7 @@ If the key `c=` is used, then MakeOTF will build the older style name table. If the keys `l=` or `m=` are present, it will build the newer style name table . If none of these are present, then there is no difference in how the name table is built. ## **GlyphOrderAndAliasDB** (GOADB) + The GOADB file is used to rename and to establish an order for the glyphs in a font. It is a simple text file with one line per glyph name. Each line contains at least two fields, and optionally a third field. @@ -279,6 +286,7 @@ Note that MakeOTF no longer assigns glyphs Unicode values from the Private Use Area (PUA) block. If such Unicode values are needed, they must be specified in a `GOADB` file. ## **fontinfo** + The fontinfo file is a simple text file containing key-value pairs. Each line contains two white-space separated fields. The first field is a keyword, and the second field is the value. makeotf will look for a fontinfo file in the same directory as the source font file, and, if found, use it to set some default values. These values will be overridden if they are also set by a project file, and then by any `makeotf` command line options. The keywords and values currently supported are: | Keyword | Values | Effect | @@ -329,6 +337,7 @@ 3) CID Value. A decimal value, prefixed by “CID+”. #### Example UVS file: + ``` # Registered Adobe-Japan1 sequences # Version 07/30/2007 @@ -345,17 +354,20 @@ The format for the UV and UVS sequence is the same. However, the Registry-Order field is omitted, and the glyph is identified by a glyph name from the GOADB file. #### Example UVS file for a nonCID-keyed font: + ``` 3402 E0100; checkbox 3402 E0101; checkedbox ``` ## **New `OS/2.fsSelection` Bits** + In 2006, Microsoft and Adobe began discussions to define three new bit values in the OS/2 table `fsSelection` field: bit 7 `USE_TYPO_METRICS`, bit 8 `WEIGHT_WIDTH_SLOPE_ONLY`, and bit 9, `OBLIQUE`. These bits have meaning only in OS/2 table version 4 and later; in earlier versions, they are reserved, and should be set off. The Adobe Type Department will set the bits in our new fonts. #### `USE_TYPO_METRICS` + When bit 7 is on, programs are supposed to use the OS/2 table sTypoAscent/Descent/LineGap for vertical line spacing. This bit was defined because the Windows layout libraries have been using the OS/2 table winAscent/Descent values instead. The next release of Windows Presentation Foundation, on which new versions of Microsoft programs such as Word will be based, and which is due in late 2006, will use the sTypo values instead – but only if this bit is on. This bit certifies that the OS/2 sTypo values are good, and have the side effect of being present only in new fonts, so that reflow of documents will happen less often than if Microsoft just changed the behavior for all fonts. For example, it is rumored that some TrueType fonts have bad values for the sTypo values, making it undesirable to apply the sTypo values for all existing fonts. The next two bits have to do with the fact that future generations of Microsoft programs, and programs from other vendors that use the Windows Presentation Foundation (WPF) libraries, will use the Cascading Style Sheet (CSS) v.2 specification for specifying fonts. The provisions of this specification can be seen at https://www.w3.org/TR/css-fonts-3/. In brief, a CSS font declaration within a document will describe a font by specifying the family name, and one or more properties; there is no way to refer directly to a specific font. The possible styles are Regular, Italic and Oblique. Weight and width are specified with separate keywords, with a limited and defined set of possible values. An example (in a simplified syntax) is `font-family: TimesStd, style: italic, weight: 700, width: normal`. One requirement of a CSS family is that each font has to have a different set of properties. There cannot be two fonts in a CSS font family which both have the properties `style: italic, weight: 700, width: normal`. For OpenType fonts, the name table Preferred Family Name is used as the CSS family name. Nonetheless, OpenType font families may well contain more than one font with a particular set of properties, but this fact will create a conflict in a CSS-based environment. When WPF encounters one of such families, it will divide the family into groups, so that only one font in each group has a given set of properties. However, that will allow WPF to provide new family names for each group, and these might not correspond to the type designer’s initial intentions. @@ -363,16 +375,19 @@ Similarly, WPF will infer the font’s properties by analyzing its Preferred Family and Style names, and may mistakenly conclude that any two fonts in a family cannot be uniquely assigned different sets of font properties. In this case, WPF will also divide the family into groups, and generate new family names for them. The `WEIGHT_WIDTH_SLOPE_ONLY` bit was added to deal with this latter case. When this bit is set in a font’s OS/2 table fsSelection field, the application is requested to trust that all fonts sharing the same Preferred Family name, will differ from all the remaining with respect to their CSS properties. That given, the application can use the OpenType name table font menu names. #### `WEIGHT_WIDTH_SLOPE_ONLY` + When bit 8 is on, a program can be confident that all the fonts which share the same Preferred Font Family Name will all differ only in weight, width, and slope. The Preferred Font Family Name is defined as name table Windows platform Name ID 16 Preferred Family Name, or, if name ID 16 is not present, then Windows platform Name ID 1 Family Name. If the OS/2 table version is 4 and this bit is not on, the program will use heuristics to divide the faces with the same Preferred Family Name into CSS family groups, and assign family and property names. Yet another issue is that WPF uses heuristics applied to the font menu names to determine if the font has the Oblique style. The Oblique style can be used for either a font that was designed as a slanted form of a typeface – as opposed to a true italic design – or for a font which has been created by a program by algorithmically slanting a base font. There is no information in current OpenType fonts to indicate whether a font is Oblique. The only way to know if a current OpenType font is Oblique is through the use of heuristics based on analyzing the font name. However, no set of heuristics will be perfect. The Oblique bit was proposed in order to solve this problem, thus providing a way to clearly indicate if the font should be assigned the CSS Oblique style. As an example from the CSS specification, a Regular font within a family could be classified as Oblique just because the word “Inclined” is used in its name. #### `OBLIQUE` + When bit 9 is on, programs that support the CSS2 font specification standards will consider the font to have the Oblique style, otherwise not. If the document specifies an Oblique style font, and no Oblique font is present within the CSS font family, then the application may synthetically create an Oblique style by slanting the base font. This will occur even if there is an Italic font within the same CSS font family. However, if a document font specification requires an Italic style, but only an Oblique font is available, then the latter will be used. An additional proposal suggests that if this bit is not set and the OS/2 version is 4 or greater, then the application would look for Windows platform names ID 21 and 22. If present, name ID 21 would supply the CSS compatible family name, and name ID 22 would supply the CSS-compatible property name. As of the writing of this document, the status of this proposal is still uncertain – please check the latest OpenType specification. If this proposal is accepted, the additional names can be specified in the feature file. Note that if any of these three new bits is turned on, with the option `–osbOn `, then `makeotf` will require that all three values be explicitly set to be on or off. This is because, if any of new the bits is set on, `makeotf` will by default set the OS/2 version number to 4. When the version number is 4, then both the on and the off setting has a specific meaning for each bit. ## **Synthetic Glyphs** + MakeOTF includes two Multiple Master fonts built-in, one serif and one sans-serif. With these it can synthesize glyphs that match (more or less) the width and weight of the source font. It requires the glyphs zero and O to be present in the font, in order to determine the required weight and width. If the option `–adds` is used, the list of glyphs to generate will be derived from the concatenation of the following three groups of glyphs: 1) Euro 2) Apple Symbol glyphs. These glyphs were formerly supplied by the Macintosh ATM™ and the Laserwriter® drivers. This is no longer true for OpenType fonts. diff -Nru afdko-3.6.0+dfsg1/docs/OpenTypeFeatureFileSpecification.md afdko-3.6.2+dfsg1/docs/OpenTypeFeatureFileSpecification.md --- afdko-3.6.0+dfsg1/docs/OpenTypeFeatureFileSpecification.md 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/docs/OpenTypeFeatureFileSpecification.md 2021-03-02 21:09:16.000000000 +0000 @@ -195,7 +195,7 @@ [`MarkAttachmentType`](#4.d)
[`markClass`](#4.f)
[`nameid`](#9.e)
-`NULL` (used in [device](#2.e.iii), [value record](#2.e.iv), [anchor](#2.e.vii))
+`NULL` (used in [substitute](#5.a), [device](#2.e.iii), [value record](#2.e.iv), [anchor](#2.e.vii))
[`parameters`](#4.c)
[`pos`](#6)
[`position`](#6)
@@ -1558,6 +1558,13 @@ substitute z by Z.sc; ``` +If the replacement glyph is the reserved word `NULL`, then the substitution +has no replacement, removing the input glyph from the glyph sequence: + +```fea +substitute a by NULL; +``` + ### 5.b. [GSUB LookupType 2] Multiple substitution diff -Nru afdko-3.6.0+dfsg1/.github/workflows/run_cvg.yml afdko-3.6.2+dfsg1/.github/workflows/run_cvg.yml --- afdko-3.6.0+dfsg1/.github/workflows/run_cvg.yml 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/.github/workflows/run_cvg.yml 2021-03-02 21:09:16.000000000 +0000 @@ -4,6 +4,8 @@ push: branches: - '*' + pull_request: + branches: [master, develop] workflow_dispatch: inputs: reason: diff -Nru afdko-3.6.0+dfsg1/.github/workflows/testpythonpackage.yml afdko-3.6.2+dfsg1/.github/workflows/testpythonpackage.yml --- afdko-3.6.0+dfsg1/.github/workflows/testpythonpackage.yml 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/.github/workflows/testpythonpackage.yml 2021-03-02 21:09:16.000000000 +0000 @@ -8,6 +8,8 @@ - LICENSE.md - NEWS.md - README.md + pull_request: + branches: [master, develop] schedule: - cron: '0 11 1 * *' workflow_dispatch: diff -Nru afdko-3.6.0+dfsg1/NEWS.md afdko-3.6.2+dfsg1/NEWS.md --- afdko-3.6.0+dfsg1/NEWS.md 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/NEWS.md 2021-03-02 21:09:16.000000000 +0000 @@ -1,6 +1,54 @@ Changelog ========= +3.6.2 (released 2021-03-02) +--------------------------- +- [spec] Allow deleting glyphs via Multiple substitution (thanks @simoncozens!) + ([#1251](https://github.com/adobe-type-tools/afdko/pull/1251), + [#1234](https://github.com/adobe-type-tools/afdko/issues/1234), + [#1294](https://github.com/adobe-type-tools/afdko/pull/1294)) +- [makeotfexe] Allow negative internal leading + ([#1279](https://github.com/adobe-type-tools/afdko/pull/1279), + [#1227](https://github.com/adobe-type-tools/afdko/issues/1227)) +- [docs] Clean up README.md (thanks @vladdoster!) + ([#1280](https://github.com/adobe-type-tools/afdko/pull/1280)) +- [cff2vf] Do not assume presence of `STAT.AxisValueArray` + ([#1283](https://github.com/adobe-type-tools/afdko/pull/1283), + [#1281](https://github.com/adobe-type-tools/afdko/issues/1281)) +- [repo] Re-sync `master` --> `develop` + ([#1285](https://github.com/adobe-type-tools/afdko/pull/1285)) +- [tests] Skip version number in diff of makeotfexe test + ([#1286](https://github.com/adobe-type-tools/afdko/pull/1286)) +- [spot] re-format documentation + ([#1287](https://github.com/adobe-type-tools/afdko/pull/1287)) +- [checkoutlinesufo] Add `ignore-contour-order` flag + ([#1289](https://github.com/adobe-type-tools/afdko/pull/1289)) +- [makeinstancesufo] Implement multiprocessing + ([#1293](https://github.com/adobe-type-tools/afdko/pull/1293), + [#1161](https://github.com/adobe-type-tools/afdko/issues/1161)) +- [checkoutlinesufo] Fix `restore_contour_order` + ([#1296](https://github.com/adobe-type-tools/afdko/pull/1296), + [#1291](https://github.com/adobe-type-tools/afdko/issues/1291)) +- [makeotf] don't fail when converting `'post'` table format 3 -> 2 + ([#1303](https://github.com/adobe-type-tools/afdko/pull/1303), + [#1301](https://github.com/adobe-type-tools/afdko/issues/1301)) +- [makeotfexe] increase GOADB UV/Alias name string length limit + ([#1311](https://github.com/adobe-type-tools/afdko/pull/1311), + [#1310](https://github.com/adobe-type-tools/afdko/issues/1310)) +- [checkoutlinesufo] Fix logic for reporting duplicated start point + ([#1318](https://github.com/adobe-type-tools/afdko/pull/1318), + [#1315](https://github.com/adobe-type-tools/afdko/issues/1315)) +- [tests, tx] increase precision (`float` --> `double`) to fix i586 failing tests + ([#1321](https://github.com/adobe-type-tools/afdko/issues/1321), + [#1216](https://github.com/adobe-type-tools/afdko/issues/1216), + [#1163](https://github.com/adobe-type-tools/afdko/issues/1163)) + +3.6.1 (released 2021-01-13) +--------------------------- +- [packaging] Fix Windows wheel + ([#1278](https://github.com/adobe-type-tools/afdko/pull/1278), + [#1277](https://github.com/adobe-type-tools/afdko/issues/1277)) + 3.6.0 (released 2020-12-17) --------------------------- - [checkoutlinesufo] Add CID support diff -Nru afdko-3.6.0+dfsg1/python/afdko/buildcff2vf.py afdko-3.6.2+dfsg1/python/afdko/buildcff2vf.py --- afdko-3.6.0+dfsg1/python/afdko/buildcff2vf.py 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/python/afdko/buildcff2vf.py 2021-03-02 21:09:16.000000000 +0000 @@ -406,7 +406,7 @@ errors = [] stat_range_vals = {} - if hasattr(stat.table.AxisValueArray, "AxisValue"): + if hasattr(stat.table, "AxisValueArray.AxisValue"): for av in stat.table.AxisValueArray.AxisValue: axis_tag = stat.table.DesignAxisRecord.Axis[av.AxisIndex].AxisTag if axis_tag not in stat_range_vals: diff -Nru afdko-3.6.0+dfsg1/python/afdko/checkoutlinesufo.py afdko-3.6.2+dfsg1/python/afdko/checkoutlinesufo.py --- afdko-3.6.0+dfsg1/python/afdko/checkoutlinesufo.py 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/python/afdko/checkoutlinesufo.py 2021-03-02 21:09:16.000000000 +0000 @@ -250,6 +250,11 @@ help='run in quiet mode' ) parser.add_argument( + '--ignore-contour-order', + action='store_true', + help='do not attempt to restore contour order' + ) + parser.add_argument( '--no-overlap-checks', action='store_true', help='turn off path overlap checks' @@ -408,6 +413,7 @@ options.check_all = parsed_args.all options.clear_hash_map = parsed_args.clear_hash_map options.write_to_default_layer = parsed_args.write_to_default_layer + options.ignore_contour_order = parsed_args.ignore_contour_order return options @@ -871,9 +877,9 @@ def restore_contour_order(fixed_glyph, original_contours): """ The pyClipper library first sorts all the outlines by x position, then y position. I try to undo that, so that un-touched contours will end - up in the same order as the in the original, and any conbined contours + up in the same order as the in the original, and any combined contours will end up in a similar order. The reason I try to match new contours - to the old is to reduce arbitraryness in the new contour order between + to the old is to reduce arbitrariness in the new contour order between similar fonts. I can't completely avoid this, but I can reduce how often it happens. """ @@ -894,7 +900,7 @@ # Match contours that have not changed. # This will fix the order of the contours that have not been touched. num_contours = len(new_list) - if num_contours > 0: # If the new contours aren't already all matched.. + if num_contours > 0: # If the new contours aren't already all matched. for i in range(num_contours): ci, contour = new_list[i] for j in old_index_list: @@ -937,20 +943,19 @@ if (point.x == old_start_point.x) \ and (point.y == old_start_point.y) \ and point.segmentType is not None: - try: - msg = ("Failed assertion: duplicated " - f"start point on contour {ci} " - f"at {point.x}, {point.y} of " - f"glyph {fixed_glyph.name}.") - assert not ctr_starts[ci], msg - except KeyError: + if ci not in ctr_starts: msg = (f"Contour index {ci} out " "of range on updated glyph " f"{fixed_glyph.name}") raise KeyError(msg) + elif ctr_starts[ci]: + msg = ("Warning: duplicated " + f"start point on contour {ci} " + f"at {point.x}, {point.y} of " + f"glyph {fixed_glyph.name}.") + print(msg) contour.setStartPoint(pi) ctr_starts[ci].append(pi) - break if matched: break @@ -1097,7 +1102,8 @@ # them prior to restore_contour_order. thresholdAttrGlyph(fixed_glyph, 1) - restore_contour_order(fixed_glyph, original_contours) + if not options.ignore_contour_order: + restore_contour_order(fixed_glyph, original_contours) # The following is needed when the script is called from another # script with Popen(): diff -Nru afdko-3.6.0+dfsg1/python/afdko/makeinstancesufo.py afdko-3.6.2+dfsg1/python/afdko/makeinstancesufo.py --- afdko-3.6.0+dfsg1/python/afdko/makeinstancesufo.py 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/python/afdko/makeinstancesufo.py 2021-03-02 21:09:16.000000000 +0000 @@ -11,6 +11,8 @@ import os import shutil import sys +import multiprocessing +from itertools import repeat from fontTools.designspaceLib import ( DesignSpaceDocument, @@ -281,6 +283,15 @@ return fea_dict +def starmap_kwargs(pool, fun, args, kwargs): + starmap_args = zip(repeat(fun), args, kwargs) + return pool.starmap(fun_args_and_kwargs, starmap_args) + + +def fun_args_and_kwargs(fun, args, kwargs): + return fun(*args, **kwargs) + + def run(options): ds_doc = DesignSpaceDocument.fromfile(options.dsPath) @@ -327,35 +338,45 @@ logger.info("Built %s instances." % newInstancesCount) # Remove glyph.lib and font.lib (except for "public.glyphOrder") - for instancePath in newInstancesList: - postProcessInstance(instancePath, options) + pool = multiprocessing.Pool(os.cpu_count() - 1) + pool.starmap(postProcessInstance, [(instancePath, options) + for instancePath in newInstancesList]) if options.doNormalize: logger.info("Applying UFO normalization...") - for instancePath in newInstancesList: - normalizeUFO(instancePath, outputPath=None, onlyModified=True, - writeModTimes=False) + args = zip(newInstancesList) + kwargs = repeat( + {'outputPath': None, + 'onlyModified': True, + 'writeModTimes': False}, + newInstancesCount) + starmap_kwargs(pool, normalizeUFO, args, kwargs) if options.doAutoHint or options.doOverlapRemoval: logger.info("Applying post-processing...") # Apply autohint and checkoutlines, if requested. - for instancePath in newInstancesList: - # make new instance font. - updateInstance(instancePath, options) + # make new instance font. + pool.starmap(updateInstance, [(instancePath, options) + for instancePath in newInstancesList]) # checkoutlinesufo does ufotools.validateLayers() if not options.doOverlapRemoval: - for instancePath in newInstancesList: - # make sure that there are no old glyphs left in the - # processed glyphs folder - validateLayers(instancePath) + # make sure that there are no old glyphs left in the + # processed glyphs folder + pool.map(validateLayers, newInstancesList) # The defcon library renames glyphs. Need to fix them again if options.doOverlapRemoval or options.doAutoHint: - for instancePath in newInstancesList: - if options.doNormalize: - normalizeUFO(instancePath, outputPath=None, onlyModified=False, - writeModTimes=False) + if options.doNormalize: + args = zip(newInstancesList) + kwargs = repeat( + {'outputPath': None, + 'onlyModified': False, + 'writeModTimes': False}, + newInstancesCount) + starmap_kwargs(pool, normalizeUFO, args, kwargs) + pool.close() + pool.join() # Restore the contents of the instances' 'features.fea' files for fea_pth, fea_cntnts in features_store.items(): diff -Nru afdko-3.6.0+dfsg1/python/afdko/makeotf.py afdko-3.6.2+dfsg1/python/afdko/makeotf.py --- afdko-3.6.0+dfsg1/python/afdko/makeotf.py 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/python/afdko/makeotf.py 2021-03-02 21:09:16.000000000 +0000 @@ -26,7 +26,7 @@ """ __version__ = """\ -makeotf.py v2.8.4 November 9 2020 +makeotf.py v2.8.5 February 22 2021 """ __methods__ = """ @@ -2332,6 +2332,7 @@ extraNamesList.append(gname) post_table = font['post'] + post_table.mapping = {} post_table.formatType = 2 post_table.glyphOrder = glyphOrderList post_table.extraNames = extraNamesList diff -Nru afdko-3.6.0+dfsg1/requirements.txt afdko-3.6.2+dfsg1/requirements.txt --- afdko-3.6.0+dfsg1/requirements.txt 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/requirements.txt 2021-03-02 21:09:16.000000000 +0000 @@ -6,8 +6,8 @@ booleanOperations==0.9.0 defcon[pens,lxml]==0.7.2 fontMath==0.6.0 -fontTools[woff,ufo,unicode,lxml]==4.18.2 -psautohint==2.2.0 -tqdm==4.54.1 -ufonormalizer==0.5.2 +fontTools[woff,ufo,lxml,unicode]==4.21.1 +psautohint==2.3.0 +tqdm==4.58.0 +ufonormalizer==0.5.3 ufoProcessor==1.9.0 diff -Nru afdko-3.6.0+dfsg1/setup.py afdko-3.6.2+dfsg1/setup.py --- afdko-3.6.0+dfsg1/setup.py 2020-12-17 19:30:37.000000000 +0000 +++ afdko-3.6.2+dfsg1/setup.py 2021-03-02 21:09:16.000000000 +0000 @@ -213,7 +213,7 @@ keywords='font development tools', platforms=[platform_name], package_dir={'': 'python'}, - packages=['afdko'], + packages=['afdko', 'afdko.pdflib'], include_package_data=True, package_data={ 'afdko': [