GithubHelp home page GithubHelp logo

twardoch / fonttools-opentype-feature-freezer Goto Github PK

View Code? Open in Web Editor NEW
373.0 15.0 32.0 296.37 MB

OTFeatureFreezer GUI app and pyftfeatfreeze commandline tool in Python to permanently "apply" OpenType features to fonts, by remapping their Unicode assignments

Home Page: https://twardoch.github.io/fonttools-opentype-feature-freezer

License: Apache License 2.0

Python 85.37% Inno Setup 3.05% Shell 11.58%
opentype-features font smallcaps opentype opentype-fonts fonttools

fonttools-opentype-feature-freezer's Introduction

OpenType Feature Freezer

With OpenType Feature Freezer, you can “freeze” some OpenType features into a font.

These features are then “on by default”, so characters previously accessible through OpenType features only (such as smallcaps, oldstyle numerals or localized forms) will now be accessible even in apps that don’t support OpenType features, such as LibreOffice, OpenOffice, or in apps that don’t support a particular feature, such as Microsoft Office in case of smallcaps.

Note: This tool actually remaps the cmap table of the font by applying the specified GSUB features. It will not work for substitutions where neither glyph has any cmap entries. Only single and alternate substitutions are supported.

This tool comes in two versions: OTFeatureFreezer: a simple GUI (graphical) app for macOS and Windows that you can download and run without any special perparations, and pyftfeatfreeze: a CLI (command-line) app that required Python 3.6 or newer to be installed on your computer.

Current version: 1.32

Installation

Install the OTFeatureFreezer GUI app for macOS

  1. On macOS, click the Download link above.
  2. Ctrl+click the downloaded DMG, choose Open, then Open again.
  3. Drag the OTFeatureFreezer.app icon to your /Applications folder.
  4. When you run the app for the first time, Ctrl+click the OTFeatureFreezer.app, choose Open, then click Open.
  5. Later, you can just double-click the icon to run the app. If the app does not run, double-click again.
  6. See the Documentation for info about how to use the GUI app. The GUI corresponds to the command-line options.

Install the OTFeatureFreezer GUI app for Windows (64-bit)

  1. You need a 64-bit version of Windows, 7 or newer. 32-bit Windows is not supported.
  2. Click the Download link above.
  3. Unzip the downloaded ZIP.
  4. Double-click the setup_featfreeze.exe icon to install the app.
  5. Run OTFeatureFreezer from your Start menu.
  6. See the Documentation for info about how to use the GUI app. The GUI corresponds to the command-line options.

Install the pyftfeatfreeze CLI app

This tool requires Python 3.6 or above to be installed first. Get it from https://www.python.org or your package manager.

Recommended

We recommend using pipx to install Python command line tools. Pipx tucks them away neatly on your computer and gives you an easy way to add, update and remove Python tools on all platforms, without leaving a mess in your Python installation.

pipx install opentype-feature-freezer

Other methods

Install it with pip, as any other Python package.

# This is best done inside a virtual environment, so you don't pollute
# your Python installation and need no special privileges to install anything.

pip install --upgrade opentype-feature-freezer

If this does not work, try:

python3 -m pip install --user --upgrade opentype-feature-freezer

Development version

pip install --upgrade git+https://github.com/twardoch/fonttools-opentype-feature-freezer

If this does not work, use:

python3 -m pip install --user --upgrade git+https://github.com/twardoch/fonttools-opentype-feature-freezer
  • You may need to do pip install --upgrade configparser before installing

Documentation

Examples

Let’s say you have the font CharisSIL-R.ttf (with the menu name “Charis SIL”), and this font includes true smallcaps accessible via the OpenType Layout features c2sc (for uppercase) and smcp (for lowercase). Let’s say that you’d like to make a second font where the true smallcaps are available by default. Just run:

pyftfeatfreeze -f 'c2sc,smcp' -S -U SC -R 'Charis SIL/Charix,CharisSIL/Charix' CharisSIL-R.ttf CharixSC-R.ttf

You’ll get a new font CharisSIL-R.ttf (with the menu name “Charix SC”). This font will have smallcaps instead of the lowercase and uppercase letters, available in all apps.

Since the “Charis SIL” font is licensed under the OFL, and uses the Reserved Font Names “Charis” and “SIL”, I’ve specified the -R option to replace the name strings Charis SIL and CharisSIL with Charix. This way, the modified font is compliant with the OFL and I can distribute it.

The following example remaps the font so that the Bulgarian localized forms are available by default in all apps (the suffix “BG” will be added to the menu name):

pyftfeatfreeze -f 'locl' -s 'cyrl' -l 'BGR ' -S -U BG SomeFont.ttf SomeFontBG.ttf

Note: To remap features from multiple scripts or languagesystems, run the tool multiple times (taking the previous run’s output as input). Use the -S option only on the final run.

The following replaces the string Lato by Otal in all internal font names (in the name and CFF tables), without doing any “feature freezing”. This can be used to quickly change some internal font names:

pyftfeatfreeze -R 'Lato/Otal' Lato-Regular.ttf Otal-Regular.ttf

Command-line syntax

usage: pyftfeatfreeze [-h] [-f FEATURES] [-s SCRIPT] [-l LANG] [-z] [-S]
                      [-U USESUFFIX] [-R REPLACENAMES] [-i] [-r] [-n] [-v]
                      [-V]
                      inpath [outpath]

With pyftfeatfreeze you can "freeze" some OpenType features into a font. These
features are then "on by default", even in apps that don't support OpenType
features. Internally, the tool remaps the "cmap" table of the font by applying
the specified GSUB features. Only single and alternate substitutions are
supported.

positional arguments:
  inpath                input .otf or .ttf font file
  outpath               output .otf or .ttf font file (optional)

optional arguments:
  -h, --help            show this help message and exit

options to control feature freezing:
  -f FEATURES, --features FEATURES
                        comma-separated list of OpenType feature tags, e.g.
                        'smcp,c2sc,onum'
  -s SCRIPT, --script SCRIPT
                        OpenType script tag, e.g. 'cyrl' (default: 'latn')
  -l LANG, --lang LANG  OpenType language tag, e.g. 'SRB ' (optional)
  -z, --zapnames        zap glyphnames from the font ('post' table version 3,
                        .ttf only)

options to control font renaming:
  -S, --suffix          add a suffix to the font family name (by default, the
                        suffix will be constructed from the OpenType feature
                        tags)
  -U USESUFFIX, --usesuffix USESUFFIX
                        use a custom suffix when --suffix is provided
  -R REPLACENAMES, --replacenames REPLACENAMES
                        search for strings in the font naming tables and
                        replace them, format is
                        'search1/replace1,search2/replace2,...'
  -i, --info            update font version string

reporting options:
  -r, --report          report languages, scripts and features in font
  -n, --names           output names of remapped glyphs during processing
  -v, --verbose         print additional information during processing
  -V, --version         show program's version number and exit

Examples: pyftfeatfreeze -f 'c2sc,smcp' -S -U SC OpenSans.ttf OpenSansSC.ttf
pyftfeatfreeze -R 'Lato/Otal' Lato-Regular.ttf Otal-Regular.ttf

Tip: the -n option outputs a space-separated list of “frozen” glyphs. If you redirect it to a file, you can use this list as input for pyftsubset to create a small font that only includes the “frozen” glyphs.

Other

Problem reporting

To report a problem, open an issue. You need a Github account.

Software license and disclaimer

This tool is licensed “as is” under the Apache License, Version 2.0. By using the tool, you accept all conditions of the license, including Disclaimer of Warranty and Limitation of Liability. If you use this tool, please consult if your font’s EULA allows modifications. If the font is licensed under the OFL and uses the Reserved Font Name, please use the -R option to change the Reserved Font Name to something else.

Requirements

This tool is written for Python 3.6+, and uses fontTools/TTX.

Changelog

  • 1.32: Changes the -s (script) option so that if it’s not provided, the remapping is in all scripts.
  • 1.31: Changes the -S (suffix) option so that if it’s not provided, no sufix is added, and added the GUI apps.
  • Previously, this tool was published as a sub-tool in a fonttools-utils repo
  • The other tools of the fonttools-utils repo are now at fonttools-ttxjson and mac-os-x-system-font-replacer

Building

Python

To build the Python package, install Poetry:

pip install poetry

or

python3 -m install --user --upgrade poetry

then in the main folder of the project run:

poetry build

DMG & EXE

To build the DMG & EXE, you need macOS. In the app subfolder, run ./macdeploy all

Credits

<script async defer src="https://buttons.github.io/buttons.js"></script>

fonttools-opentype-feature-freezer's People

Contributors

davelab6 avatar madig avatar twardoch avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

fonttools-opentype-feature-freezer's Issues

When tried to install with pipx, got ERROR: Could not find...

When tried to install with pipx, got ERROR: Could not find...

% pipx install opentype-feature-freezer

ERROR: Could not find a version that satisfies the requirement opentype-feature-freezer (from versions: none)
ERROR: No matching distribution found for opentype-feature-freezer

JuliaMono freezing ss10 not working when other variant glyphs work

Using this command line:

pyftfeatfreeze -n -f cv01,cv03,cv04,ss10,ss03 JuliaMono-Regular.ttf freeze\JuliaMono-Regular.ttf

I get this output:

J.alt j.alt l.cv04 three.cv01 asciitilde.cv03

Note that

  • cv01 activates the variant glyph for 3
  • cv03 activates the variant glyph for ~
  • cv04 activates the variant glyph for l
  • ss03 activates the variant glyphs for j and J
  • However, ss10, which should activate the variant glyph for r, is being ignored.

This is not a problem with the font file because the same operation works on FontFreeze where it freezes the variant r glyph correctly.

The version of JuliaMono used is 0.055. The same problem occurs across all the weights and styles (regular/italics).

Here’s the generated output file. The Windows font previewer shows the correct variant glyph for l, j and 3, but not r.

Error during execution

Hello.

I'm getting this error when running:

Traceback (most recent call last):
File "./MacOSXSystemFontReplacer.py", line 133, in
(opened, patched) = patchFont(ttcPath = args.system_ttc, fontNumber = fontNumber, inFolder = args.input_folder, outFolder = args.output_folder, help = args.help_more, fontScale = float(args.font_size)/100, uninstall = args.uninstall)
File "./MacOSXSystemFontReplacer.py", line 104, in patchFont
cffd["FontMatrix"][0] = cffd["FontMatrix"][0] * fontScale
KeyError: 'FontMatrix'

What am I doing wrong?

Thanks in advance

Traceback when using suffix feature

Traceback (most recent call last):
  File "pyftfeatfreeze.py", line 420, in <module>
    finish = main()
  File "pyftfeatfreeze.py", line 409, in main
    p.run()
  File "pyftfeatfreeze.py", line 397, in run
    self.renameFont()
  File "pyftfeatfreeze.py", line 290, in renameFont
    newname = newname.replace(repl[0],repl[1])
IndexError: list index out of range

renameFont: Limit to specific IDs?

Currently, the code will try to rename all IDs. I recently had a font where the family name also occurred in the style name, which lead to unwanted renames. I was wondering if the IDs to rename should be limited to 0, 1, 3, 4, 6, 16, 18, 20 and 21?

freeze features not working on macOSX

in vscode

disable features
截屏2023-05-06 21 37 46

and enable features
截屏2023-05-06 21 39 10

then use command line tools

$ pyftfeatfreeze -n -v -f 'ss01,ss02,ss04' MapleMono-SC-NF-Regular.ttf 1.ttf
INFO: [RemapByOTL] Running with options: Namespace(inpath='MapleMono-SC-NF-Regular.ttf', outpath='1.ttf', features='ss01,ss02,ss04', script=None, lang=None, zapnames=False, suffix=False, usesuffix='', replacenames='', info=False, report=False, names=True, verbose=True)
INFO: [openFont] Opened font: MapleMono-SC-NF-Regular.ttf
INFO: [filterFeatureIndex] FeatureIndex: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
INFO: [filterLookupList] Features to apply: ['ss01', 'ss02', 'ss04']
INFO: [filterLookupList] Lookups: [145, 148, 151, 154, 158, 165, 173, 181, 188, 194, 201, 214, 217]

INFO: [saveFont] Saved font: 1.ttf
INFO: Finished processing.

and the cli version

$ pip3 list  |grep opentype-feature-freezer
opentype-feature-freezer 1.32.2

reinstall font, but all three features not to be frozen

Freezing doesn't seem to have any effect (lnum in Addington CF)

Hello,
I try to make the lining numerals in the font Addington CF the default. It creates the new font, but oldstyle numerals seem to keep being the default. Any idea what I could be doing wrong here?
Thanks for helping out.

pyftfeatfreeze -f 'lnum' -S -U LN -v addingtoncf-regular.otf addingtoncf-regular_LN.otf
INFO: [RemapByOTL] Running with options: Namespace(inpath='addingtoncf-regular.otf', outpath='addingtoncf-regular_LN.otf', features="'lnum'", script=None, lang=None, zapnames=False, suffix=True, usesuffix='LN', replacenames='', info=False, report=False, names=False, verbose=True)
INFO: [openFont] Opened font: addingtoncf-regular.otf
INFO: [filterFeatureIndex] FeatureIndex: [0, 1, 11, 12, 22, 23, 33, 34, 44, 45, 55, 56, 66, 67, 77, 78, 88, 89, 99, 100, 119, 120, 130, 131, 141, 142, 152, 153, 163, 164, 174, 175, 185, 186, 196, 197]
INFO: [filterLookupList] Features to apply: ["'lnum'"]
INFO: [filterLookupList] Lookups: []
INFO: [renameFont] New family name: 'Addington CF LN'
INFO: [renameFont] New full name: 'Addington CF LN Regular'
INFO: [renameFont] New PostScript name: 'AddingtonCFLN-Regular'
INFO: [saveFont] Saved font: addingtoncf-regular_LN.otf
INFO: Finished processing.

Apply freeze to an entire family?

I don't know if I missed something in the documentation, but is it possible to apply the freezing of a particular feature to the whole family in one pass?

Enhancement: Add a swap or delete function

It would be helpful to have a functionality to:

  • swap a feature with the default and capture the default in that previous feature (that's for stylistic sets)
  • capture that original default in a new feature
  • remove that old alternative feature, at the moment it's being kept in the font

Windows Download Link is 404

I see the Windows download has been removed.
Is there a problem with the file?
Does it not work correctly?
Or?

one feature in a set does not seem to be frozen

According to the wiki page of Fira Code pyftfeatfreeze can be used to create a font that uses style sets permanently:

This works great for all style sets (features) but one (ss02). Since it works with all but ss02 I do not think it is an issue with the pyftfeatfreeze script, but maybe I'm wrong.

As you can see from the output, the script remapped also ss02:

$ pyftfeatfreeze.py -n -v -f 'ss02,ss03,ss04,ss05' FiraCode-Regular.otf out/FiraCode-Regular.otf
[featfreeze][info] [RemapByOTL] Running with options: Namespace(features='ss02,ss03,ss04,ss05', info=False, inpath='FiraCode-Regular.otf', lang=None, names=True, outpath='out/FiraCode-Regular.otf', rename=False, replacenames=u'', report=False, script='latn', usesuffix=u'', verbose=True, zapnames=False)
/Users/tessus/bin/pyftfeatfreeze.py:140: UserWarning: 'verbose' is deprecated; configure logging instead
  self.inpath, 0, verbose=False, recalcBBoxes=False)
[featfreeze][info] [openFont] Opened font: FiraCode-Regular.otf
[featfreeze][info] [filterFeatureIndex] FeatureIndex: [3, 19, 35, 51, 67, 93, 109, 125, 141, 157, 173, 189, 205, 221, 237, 253, 269, 285, 301, 317, 333]
[featfreeze][info] [filterLookupList] Features to apply: [u'ss02', u'ss03', u'ss04', u'ss05']
[featfreeze][info] [filterLookupList] Lookups: [174, 175, 176, 177, 178, 179]
[featfreeze][info] [applySubstitutions] Remap: 'dollar' -> 'dollar.ss05'
[featfreeze][info] [applySubstitutions] Remap: 'at' -> 'at.ss06'
[featfreeze][info] [applySubstitutions] Remap: 'ampersand' -> 'ampersand.ss03'
[featfreeze][info] [applySubstitutions] Remap: 'ampersand_ampersand.liga' -> 'ampersand.ss03'
[featfreeze][info] [applySubstitutions] Remap: 'greater_equal.liga' -> 'greater_equal.ss02'
[featfreeze][info] [applySubstitutions] Remap: 'less_equal.liga' -> 'less_equal.ss02'
dollar.ss05 at.ss06 ampersand.ss03 ampersand.ss03 greater_equal.ss02 less_equal.ss02
[featfreeze][info] [saveFont] Saved font: out/FiraCode-Regular.otf
[featfreeze][good] Finished processing.

However, the ligatures still look like image instead of image.

I'm sorry to open an issue, but I just want to make sure that this is not a bug with the script.

Cannot enable the "ss07" feature in FiraCode font

Greetings,
I'm trying to enable the ss07 feature in FiraCode font, but it doesn't working.

Command:

pyftfeatfreeze -n -v -f "ss07" FiraCode-Regular.ttf FiraCode-Regular-ss07.ttf

Output:

INFO: [RemapByOTL] Running with options: Namespace(features='ss07', info=False, inpath='FiraCode-Regular.ttf', lang=None, names=True, outpath='FiraCode-Regular-ss07.ttf', rename=False, replacenames='', report=False, script='latn', usesuffix='', verbose=True, zapnames=False)
INFO: [openFont] Opened font: FiraCode-Regular.ttf
INFO: [filterFeatureIndex] FeatureIndex: [3, 19, 35, 51, 67, 93, 109, 125, 141, 157, 173, 189, 205, 221, 237, 253, 269, 285, 301, 317, 333, 349]
INFO: [filterLookupList] Features to apply: ['ss07']
INFO: [filterLookupList] Lookups: [138, 139]

INFO: [saveFont] Saved font: FiraCode-Regular-ss07.ttf
INFO: Finished processing.

This command with these feature works fine:

pyftfeatfreeze -n -v -f "ss01,ss03,ss05" FiraCode-Regular.ttf FiraCode-Regular-ss01-03-05.ttf

Got an error.

usage: OTFeatureFreezer.exe [-h] [-o [OUTPATH]] [-f FEATURES] [-s SCRIPT]
[-l LANG] [-z] [-S] [-U USESUFFIX]
[-R REPLACENAMES] [-i] [-r] [-n] [-v]
inpath
OTFeatureFreezer.exe: error: unrecognized arguments: -- C:\Users\parent\Downloads\Inter-Regular.otf

Anyone knows what might have caused this?

Only able to freeze a single character

$ pyftfeatfreeze  -f 'smcp' "D:\Desktop\LibertinusSerif-Bold.otf" "D:\Desktop\LibertinusSerif-SmallCaps.ttf" -n
i.sc

image

-v output:

INFO: [RemapByOTL] Running with options: Namespace(inpath='D:\\Desktop\\LibertinusSerif-Bold.otf', outpath='D:\\Desktop\\LibertinusSerif-SmallCaps.ttf', features='smcp', script=None, lang=None, zapnames=False, suffix=False, usesuffix='', replacenames='', info=False, report=False, names=False, verbose=True)
INFO: [openFont] Opened font: D:\Desktop\LibertinusSerif-Bold.otf
INFO: [filterFeatureIndex] FeatureIndex: [0, 1, 2, 3, 4, 5, 6, 7, 8, 13, 14, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
INFO: [filterLookupList] Features to apply: ['smcp']
INFO: [filterLookupList] Lookups: [8, 9]
INFO: [applySubstitutions] Remap: 'i' -> 'i.sc'
INFO: [saveFont] Saved font: D:\Desktop\LibertinusSerif-SmallCaps.ttf
INFO: Finished processing.

Libertinus Serif 7.020 (which does support smcp)
opentype-feature-freezer 1.32.2

Freezing a stylistic set can cause other stylistic sets that replace overlapping glyphs to malfunction

I have a font where certain glyphs are replaced in multiple stylistic sets. Out of the box, if I set both ss01 and ss02, the ss01 glyph “wins”. But when I freeze ss02 and enable ss01, the ss02 glyph wins, and based on the file size, I suspect (but haven’t confirmed) that it actually removed the conflicting ss01 glyphs.

I don’t what logic can be encoded in substitution tables, but it’d be good for this project to match it if at all possible. For example, if it’s a matter of sequential rules in a substitution table, I suppose you’d want freezing a feature to remove conflicting mappings from later in the table, while retaining those earlier in the table.

(The font in question is Triplicate; ss01 is the Poly variant, which makes the monospaced font not quite monospace, widening glyphs like m and narrowing glyphs like l; ss02 is the Code variant, which tweaks some of the glyphs for greater distinctness and clarity, like l which gets a tail. Unfortunately there are no glyphs for when both Code and Poly are enabled, but out of the box Poly wins on glyphs that both replace. On my website I always want Code enabled, and mostly want Poly, so I wanted to freeze Code on, but this had the effect of making Code trump Poly on conflicting glyphs, which made spacing look weird in a few places, most significantly around l.)

Need to modify name ID 25

Adobe apps need a unique name ID 25 per font variant or they mix up everything if they are installed together.

WARNING: No 'GSUB' table found in ..., nothing to do!

Some of the files in JetBrains Mono v2.200 fail with pyftfeatfreeze.

Specifically, I use the command:

pyftfeatfreeze -f zero -i -S -U Slashed "$src" "$dst"

to turn on the font's (undocumented) slashed zero.

With that font's NL (non-ligature) variants, pyftfreeze fails with, for example:

WARNING: No 'GSUB' table found in JetBrainsMonoNL-Bold.ttf

I'm not super knowledgeable about OTF/TTF internals. Is it possible to turn on the zero feature without a GSUB table present in the font?

opentype-feature-freezer not found on pypi

I tried to install opentype-feature-freezer with:
pip install opentype-feature-freezer

and got:

Collecting opentype-feature-freezer
Could not install packages due to an EnvironmentError: 404 Client Error: Not Found for url: https://pypi.org/simple/opentype-feature-freezer/

Replacing string in name tables incomplete

Hi,

the names don’t get replaced in the Unique font identifier field, nameID 3. In other fields they do get replaced, such as nameID 6.
The complete entry of nameID 3 reads 1.001;YN ;NonameSans-Regular in my case before the replacement.

The complete call:
python '/Users/yanone/Webseiten/wsgi/tools/pyftfeatfreeze.py' --replacenames 'NonameSans-Regular,NonameSansOffice-Regular' --features 'lnum,tnum' --suffix --usesuffix 'Office' --info '/Users/yanone/Schriften/Font Produktion/Fonts/NonameSans-Regular.otf' '/Users/yanone/Schriften/Font Produktion/Fonts/NonameSansOffice-Regular.temp.otf'

"script" option

Hi Adam,

I'm using your tool on a ttFont object like below.
The FreezeOptions is just a naked class that I'm filling with attributes.

options = FreezeOptions()
options.inpath = ''
options.outpath = ''
options.features = ','.join(freezeFeatures) # comma-separated list of OpenType feature tags, e.g. 'smcp,c2sc,onum'
options.script = '%(default)s' # OpenType script tag, e.g. 'cyrl' (default: '%(default)s')
options.lang = None # OpenType language tag, e.g. 'SRB ' (optional)
options.zapnames = False # zap glyphnames from the font ('post' table version 3, .ttf only)
options.rename = True if suffix else False # add a suffix to the font menu names (by default, the suffix will be constructed from the OpenType feature tags)
options.usesuffix = suffix # use a custom suffix when -S is provided
options.replacenames = replaceNames # search for strings in the font naming tables and replace them, format is 'search1/replace1,search2/replace2,...'
options.info = True # update font version string
options.report = False # report languages, scripts and features in font
options.names = False # output names of remapped glyphs during processing
options.verbose = True
remapByOTL = RemapByOTL(options)
remapByOTL.ttx = self.TTFont
remapByOTL.remapByOTL()
remapByOTL.renameFont()

I'm having difficulties with the script option.
Leaving it blank (=None) means that the features are not being frozen.
Setting it to latn will do the job, but then what about other scripts that are in the font? Will I then need to perform the action once for each script?
Also, the description %(default)s is confusing.

How do I go about adjusting a font with several scripts?
Thank you.

Glyphnames are not swapped

When freezing a stylistic set into the font, glyph a.alt is assigned the codepoint of LATIN SMALL LETTER A but isn't renamed to a.
This causes problems in certain apps, e.g. Adobe Premiere on Windows I'm told.

Workaround for installing OT Feature Freezer on Mac?

I'm on Mac OS Ventura 13.2.1, and the OS will not allow me to install the Feature Freezer because the developer isn't identified. I've tried everything that I can find documented, but it seems those workarounds were for a previous OS. Can anyone help? Thank you

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.