# width: T2CharString glyph width optimizer

T2CharString glyph width optimizer.

CFF glyphs whose width equals the CFF Private dictionary’s `defaultWidthX` value do not need to specify their width in their charstring, saving bytes. This module determines the optimum `defaultWidthX` and `nominalWidthX` values for a font, when provided with a list of glyph widths.

fontTools.cffLib.width.main(args=None)

  Calculate optimum defaultWidthX/nominalWidthX values

class fontTools.cffLib.width.missingdict(missing_func)
  clear() → None. Remove all items from D.
  copy() → a shallow copy of D
  fromkeys(value=None, /)

    Create a new dictionary with keys from iterable and values set to value.

  get(key, default=None, /)

    Return the value for key if key is in the dictionary, else default.

  items() → a set-like object providing a view on D's items
  keys() → a set-like object providing a view on D's keys
  pop(k[, d]) → v, remove specified key and return the corresponding value.

    If the key is not found, return the default if given; otherwise, raise a KeyError.

  popitem()

    Remove and return a (key, value) pair as a 2-tuple.

    Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

  setdefault(key, default=None, /)

    Insert key with a value of default if key is not in the dictionary.

    Return the value for key if key is in the dictionary, else default.

  update([E, ]**F) → None. Update D from dict/iterable E and F.

    If E is present and has a .keys() method, then does: for k in E: D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

  values() → an object providing a view on D's values

fontTools.cffLib.width.optimizeWidths(widths)

  Given a list of glyph widths, or dictionary mapping glyph width to number of glyphs having that, returns a tuple of best CFF default and nominal glyph widths.

  This algorithm is linear in UPEM+numGlyphs.

fontTools.cffLib.width.optimizeWidthsBruteforce(widths)

  Bruteforce version. Veeeeeeeeeeeeeeeeery slow. Only works for smallests of fonts.