Free (libre) font editor for Windows, Mac OS X and GNU+Linux


FontForge CI Build status Coverity Scan Build Status

FontForge Logo

FontForge is a free (libre) font editor for Windows, Mac OS X and GNU+Linux. Use it to create, edit and convert fonts in OpenType, TrueType, UFO, CID-keyed, Multiple Master, and many other formats. — homepage — font creation manual

Getting help

The bug tracker is for reporting bugs, not for asking questions. Please direct questions to one of the following:

Installation & contributing — developer instructions to build from source — a list of installation dependencies — contributing guidelines

  • Handle foreign data in U. F. O..

    Handle foreign data in U. F. O..

    This uses the PyTuple, which has no matching entity in X. M. L., as a special container for unrecognized data in python_persistent, allowing FontForge to round-trip that data in the top-level lib.plist and in the lib data for individual glifs.

    opened by frank-trampe 148
  • Improved mac dmg

    Improved mac dmg

    I've made some improvements to make the dmg look more like other apps with a custom background + link to applications folder + online install instructions. If @monkeyiq could test the pretty-dmg branch

    opened by larsenwork 120
  • Unicode tooltips empty

    Unicode tooltips empty

    Built from today’s git head, fontforge doesn’t show any content in the unicode tooltips. Please revert to LibUnicodeNames, the latest changes seem rather destructive to things that weren’t broken before.

    opened by georgd 118
  • Make comb. chars always superior to spacing chars

    Make comb. chars always superior to spacing chars

    Combining characters are superior in some cases to spacing characters but not others. For example, combining macron (U+304) is superior to macron (U+AF), yet combining dieresis (U+308) is inferior to dieresis (U+A8).

    This situation is untenable. It makes it impossible, while designing a font, to know which character will be used when FontForge builds an accented glyph without digging through the source code. Furthermore, the logical case, to use the combining character first, is rarely done.

    Apparently this is due to some restriction of Type1 fonts according to George in 2001. I fixed his reported restriction in this same commit by just dissolving the reference if the character referred to is between 0x300 and 0x345.

    Some, such as @frank-trampe, might say that dissolving the reference “breaks” something. But nothing is broken. No function of a Type 1 font changes if a reference is used or not. Type 1 fonts never were a first class format for storing font data—and certainly haven't become one— that's what SFD is for. The only discernible difference therefore is a small increase in filesize.

    I confirmed:

    • generated PFA (PostScript type 1) fonts still work; FontForge shows the dissolved references as expected when a problem character is referred to.
    • if you want to use dieresis you can tell FontForge to in “Glyph Info → Components” and it will work.
    • that this closes #3708, the issue is solved.

    I encourage my fellow members to support this change. As an author of five and counting open source fonts made only using FontForge and FontTools, I can unequivocally say that sacrificing the file size of a subset of Type 1 fonts is worth the benefit this change provides.

    • [x] Bug fix (non-breaking change which fixes an issue)
    • [x] Breaking change (fix or feature that would cause existing functionality to change)
    • [x] I have read the CONTRIBUTING guidelines.
    opened by ctrlcctrlv 101
  • Appearance (X resource) unification

    Appearance (X resource) unification


    • Relative font specification
    • A bunch of appearance fixes and tweaks
    • Fixes for #4454 #4391 #4238 #3844 #3835 #3443 (partial) #3051 #1031 #863 #4274

    For historical reasons the UI knobs in FontForge are supplied in X Resource format. There may still be some minimal compatibility with that system but given that its mostly supplied via GDK now that's not very important.

    At some point a handy resource editing dialog was added so that less technical users could customize the UI. There was some effort put into unifying the initialization and the editing at that time but mostly in the form of new APIs (mainly GResEditFind()). For the most part variables were still initialized via individual calls to GResourceFindColor(), GResourceFindString() and so on.

    The bulk of this PR finishes the unification, so that initialization and editing are two uses of the same data structure. It is now easier to add new directives -- usually just a matter of declaring the static variable with an appropriate default value, adding one line to a struct resed initializer, and a corresponding line to the tango/ file (if needed).

    In addition to that it does the following:

    1. Default font families for sans, serif, and mono are now defined in one place in BuildUtils.cmake and can be overridden by CMake flags. They are broken down by OS type (APPLE, WIN32 OR CYGWIN, and "other"). The current values are not final -- part of the reason I'm starting this PR as a draft is that we should discuss the best options.
    2. Font directives can now be specified relative to other font directives as described in the included documentation changes. The supplied resource files now do this. Because most of the UI is sized in relation to fonts you can now adjust the whole UI scale by changing the (new) View.DefaultFont point size. Another result is that families are specified once in each resource file (as long as they are kept consistent with the supplied file) and therefore the UI is much more uniform in presentation.
    3. I went through pretty much the whole UI to eliminate hard-coded colors, either by giving them new appearance directives or mapping them to either the GGadget FG or BG or the GDraw FG or BG. (GDrawGetDefaultForeground() and ...Background() now return a static value and ignore the display argument, as that generality wasn't used and mostly caused updating problems.) This allows a number of issues to be closed and means that true "dark" themes (and the like) are now possible.
    4. Since the GDK backend already switched away from ScreenWidth directives in favor of ScreenResolution I did that on the X side for consistency.
    5. The image cache has been restructured to minimize image path names relative to the ImagePath immediately, rather than having this happen "at the edges". The modified GResImage definition now stores the bucket instead of the file for additional flexibility.
    6. I've changed (or occasionally de-emphasized) the "X Resource" terminology in favor of "Appearance".
    7. The docs have been updated.

    In addition to reviewing the changes this has a todo list:

    1. Decide on font families for each OS appropriate for contemporary use
    2. Decide what to do with the "Keyboard" resource (I think it should become a preference)

    Ideally this work would be paired with a later PR that

    1. Figures out how to pick among images (menu icons, pointers, palette icons) scaled at different sizes.
    2. Come up with a full set of sources (probably in SVG) that can be attractively scaled that way
    3. Modify the editing system so that tracks both a "theme" file and a user file, and only stores what is different in the latter.

    Then FontForge would support proper themes, which I imagine being added through a python API hook and distributed as python packages, given that the plugin interface is already integrated.

    Closes #4454 Closes #4391 Closes #4238 Closes #3844 Closes #3835 Closes #3051 Closes #1031 Closes #863 Closes #4274

    opened by skef 97
  • New problem in fontforge-cygwin_2014_01_04: Generate('a.ttf') takes 2x as much memory as the version of 2012

    New problem in fontforge-cygwin_2014_01_04: Generate('a.ttf') takes 2x as much memory as the version of 2012

    For my files, this does not matter: my workflow separates Generate() into a separate call fontforge -lang ff -c "Load($1); Generate($2)" and for me, the question is about using 500MB of memory vs 1100MB of memory; not a problem with this machine. However, people with larger runs may get into problems on 32bit machines, more complicated fonts, and/or more complicated scripts.

    opened by ilyaza 90
  • MAC: Crash on scrolling on Fontview

    MAC: Crash on scrolling on Fontview

    FF crashes while scrolling on Font View with this( file opened

    18-Oct -14 Version on OSX 10.9.5

    I-crash Homebrew 
    opened by pathumego 76
  • New splash screen and about dialog

    New splash screen and about dialog

    This closes #3055.

    This commit does the following:

    Console mode changes

    The first line when you run FontForge, which was:

    Copyright (c) 2000-2018 by George Williams. See AUTHORS for Contributors.

    Is now:

    Copyright (c) 2000-2019. See AUTHORS for Contributors.

    This will no longer need to be updated randomly whenever we remember to do it. I baked the current year in at compile time by editing and adding a new variable for it. Why did I remove George's name? He is the main contributor but hasn't been around for seven years. It's time for him to become just another contributor in AUTHORS.

    Splash screen changes

    I only made the changes for which there was consensus in #3055. I:

    • Changed the image to a newer one which I (previously @probonopd, but I changed it in made.
    • Made the Git hash use a monospace font so it's small enough to fit in one line.
    • Changed references which made it seem like this is George's software alone. I love the story of this project, you all know that, I love FontForge history, I run, I've been trying to get @davelab6 to talk with me on video to flesh out more of the history for my website, so I was very respectful of George while editing the text, making very conservative edits to the history in the about dialog.

    Old dialog

    Dialog in this commit

    Previously, with the word FontForge more towards the right and different text

    Previously, though cancelled due to consensus

    How I changed it

    In case this needs to be done again, I used gdb to change the image. First, I loaded a BMP image in fontforge_main (startui.c) and set a breakpoint right after loading it. I just made a GImage containing the output of GImageReadBmp("/tmp/ff.bmp") called splashimage.

    The following gdb settings make things a lot easier:

    • set pagination off
    • set max-value-size unlimited
    • set print elements 0
    • set print repeats 0

    Then I issued command:

    p/x *((*splashimage)

    You have to either catch the output by telling gdb it needs to log...or you can just set your console to unlimited scrollback and copy it.

    I got the number 568500 by multiplying two numbers together found in the struct:

    (gdb) p (*(*splashimage).u.image)
    $46 = {image_type = it_true, delay = 0, width = 379, height = 375, bytes_per_line = 1516, 
      data = 0x15554f5b6010 "\336\236O", clut = 0x0, trans = 4294967295}

    568500 = 1516 × 379

    I then pasted all the values into splashimage.c as needed. Done and dusted.

    opened by ctrlcctrlv 75
  • FF compiled with Python 3 extension loads

    FF compiled with Python 3 extension loads "empty" fontforge module.

    I am trying to compile fontforge from source with Python 3. I recently manged to compile it on Ubuntu workstation and now have to install it on a Debian or Ubuntu Server and run into a strange error.

    I am using the Version as imho this one has the import psMat problem solved.

    My compile steps:

    PYTHON="python3" ./configure
    make -j3
    make install

    The relevant configure output:

      Source code location	.
      Build code location	
      Destination prefix	/usr/local
      Compiler		gcc -std=gnu99 -std=gnu99
    Summary of optional features:
      real (floating pt)	double
      programs		yes
      native scripting	yes
      python scripting	yes
      python extension	yes
      freetype debugger	no
      raw points mode	no
      tile path		no
      gb12345 encoding	no
      potrace or autotrace	yes

    But when I do python3 -c "import fontforge; f = fontforge.font()" it results in:

    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    AttributeError: 'module' object has no attribute 'font'

    A python3 -c "import fontforge; print(dir(fontforge))" gives a: ['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__'] Somehow the fontforge module is empty?

    More details make install outputs an

    Libraries have been installed in:

    And indeed:

    ls -la /usr/local/lib/python3.4/site-packages
    total 48
    drwxr-sr-x 2 root staff  4096 Nov 30 21:53 .
    drwxrwsr-x 4 root staff  4096 Nov 30 21:53 ..
    -rwxr-xr-x 1 root staff  1429 Nov 30 21:53
    -rwxr-xr-x 1 root staff 13992 Nov 30 21:53
    -rwxr-xr-x 1 root staff  1405 Nov 30 21:53
    -rwxr-xr-x 1 root staff 13968 Nov 30 21:53

    I tried it on Debian 8 and Ubuntu 16.04. I also tried it with the additional --enable-python-scripting --enable-pyextension --enable-python-extension options for ./configure. Also a ldconfig after make install didn't help. When I did install it on my Workstation I did use a Virtual Enviroment and a custom--prefix. However, I also also tried this on the Debian server but without success. The servers have been fresh installs before testing. I also tried with the latest version from git.

    Does anybody has an idea what is wrong with my installation process?

    Update I did another test, this time with an virtual env again. When I did a

    python -c "import fontforge;print(fontforge)" 
    <module 'fontforge' (namespace)>

    it seems that an import fontforge doesn't load the .so file but the fontforge directory in /root/venv/lib/python3.4/site-packages which contains the .so file.

    Moving those .so files to the parent dir and remove the fontforge dir:

    mv /root/venv/lib/python3.4/site-packages/fontforge/* /root/venv/lib/python3.4/site-packages
    rm /root/venv/lib/python3.4/site-packages/fontforge

    But now:

    python -c "import fontforge" 
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    ImportError: cannot open shared object file: No such file or directory

    But the file is in /usr/local/lib.

    Update 2 If I add /usr/local/lib/python3.4/site-packages to the sys.path everything looks fine.

    python3 -c "import sys; sys.path.append('/usr/local/lib/python3.4/site-packages'); import fontforge; f=fontforge.font(); print(f)";
    <Font: Untitled1>
    opened by tobltobs 69
  • Redesign the menu structures of the 3 main windows

    Redesign the menu structures of the 3 main windows

    EDIT: @pathumego, @davelab6 and @larsenwork are currently trying to figure things out in this google doc. Feel free to comment and make suggestions there.

    EDIT: The latest updates #2734

    What we're trying to do (WIP)

    • [x] Making the 3 menus identical (except for what's grey'd out)
    • [x] Rearranging items so things are easier to find
    • [x] Renaming items to more understandable names
    • [x] No level below top-level -> submenu -> item
    • [ ] Updating tooltip text #2259
    • [x] Re-arrange/name right click menus incl. #2261

    Removing some items

    • [x] Browse web (broken)
    • [x] X-resource editor (

    What we later need a software developer for

    • [ ] Implement the changes (or tell us how) - #2734
    opened by davelab6 68
  • Remove outlines and more padding on Tools Pallet

    Remove outlines and more padding on Tools Pallet


    • [x] Create new icons
    • [x] Paletteselectedbg.png
    • [x] Mouse icon instead of Mse-stuff


    • [ ] Support for theme-adjustable palette margins + spacing
    • [ ] Support for Paletteselectedbg.png (
    • [ ] Support for the proposed restyling of Mse and make it "un-clickable"( + (
    • [ ] Change the order of the palette icons a bit (
    • [ ] Use visiblility_off/on.png as default instead of them ugly eyes.


    • [x] Removing the outlines on the toolbar pallet button would make a pleasant difference. And add 2px padding would be needed. (see below)
    • [x] ~~The eye icon is clipped on layers panel, maybe increase of the width would fix that.~~
    UI High Priority 
    opened by pathumego 67
  • Baseline shifts down unexpectedly

    Baseline shifts down unexpectedly

    • [x] Screenshot
    • [x] The FontForge version and the operating system you're using (13th April 2019, Win10)
    • [x] The behavior you expect to see, and the actual behavior
    • [x] Steps to reproduce the behavior
    • [ ] (optional) Possible solution/fix/workaround

    Hi. Pleas forgive me if this is not the appropriate place to ask. I wasn't able to find any other place. If there is, please direct me.

    The problem I found:

    I have a font. Here it is attached.

    I want to modify one glyph. It's assigned to F in the font. This is the glyph: 2022-06-21 14_13_17-F at 70 from MSI_Z101 LATIN CAPITAL LETTER F

    The modification I want to make is to delete one small part of the glyph. Here is the new modified glyph: 2022-06-21 14_13_30-F at 70 from MSI_Z101_ LATIN CAPITAL LETTER F

    I just deleted a small part on the left. I didn't change any baseline or any other metric.

    Now, I export the new font. Here is the exported font attached.

    The problem is: it seems that the baseline of the whole font has changed, so when I use this font in MSWord, all the glyphs in the font appear on the page a few pixels lower than they did previously.

    How can I prevent this? I just want to modify one single glyph, and don't want the baseline or metrics of any glyphs or the whole font to change.

    I've tried using ttx to compare font metrics, but there seem to be too many differences to understand what has changed.

    Thank you for your patience and help.

    opened by meadows19 1
  • Can't run FF Script in Windows 11 or Apple system

    Can't run FF Script in Windows 11 or Apple system

    I have a script below:

    Import SVG files into MZ Unicode Part I

    #Import SVG files into MZ Unicode Part I FilePath = ( "C://My Documents/Font Development/Class/MZ/SVG/" ); SVG = "MZ-0"; # This need to Change!!! i = 1; j = 0; ..... # Import function starts and loop thru all svg files

    I got error dialogbox below: Unterminated line

    I am not sure there is any error in line1 which is only comment statement. So, what did I do wrong in here??? My friend tried in his Apple and he said it did not run. But other two friends were able to run in Windows 11/10 without problem. So, what could be the problem??? Can FF script run in Apple?

    opened by waykyi 4
  • Last master Appimage fails to lauch

    Last master Appimage fails to lauch

    I tried last Appimage on Debian Linux Testing, but fails to launch:

    [email protected]:~/software_linux/fontforge$ ./FontForge-2022-06-17-78ca228-x86_64.AppImage ./bin/fontforge: symbol lookup error: /lib/x86_64-linux-gnu/ undefined symbol: g_memdup2

    opened by samiel60 0
  • Problems with default font on MAC version 12.4

    Problems with default font on MAC version 12.4


    I recently downloaded the Font Forge Version 202203-08 version and I am experiencing troubles with the font display. After trying to read up on the issue here, I tried downloading the Deja vu sans and also the Unicode font but it didn't really solve the problem. Installing the unicode font showed a couple of glyphs but unfortunately the Font in Appearance Editor or in Save as etc. doesn't work.

    see screenshots: Bildschirmfoto 2022-06-17 um 11 58 49 Bildschirmfoto 2022-06-17 um 11 59 17

    As I have hardly any knowledge or skills of coding, I don't know how to solve this issue. would be really greatful if someone could help me out and give me a solution on how to solve this issue? would need a tutorial for coding dummies :D

    thank you so much! have a great day cheers Felicitas

    opened by fitsarella 1
  • SVG export of horizontal advance unreliable

    SVG export of horizontal advance unreliable

    When generating an SVG font some glyphs are missing the horiz-adv-x attribute, although a glyph width is set.

    At first I thought it is just missing for glyphs that follow the standard horizontal advance value defined on the font element. But I discovered that this seems to happen quite randomly.

    Also I find it difficult to set a specific horiz-adv-x value for the font element and then set it to "0" explicitly for non-width glyphs. I think it would be better to do it the other way round, i.e. assign every glyph element a horiz-adv-x attribute that has a non-zero value.

    opened by rettinghaus 0
  • FF halts when simplifying a glyph

    FF halts when simplifying a glyph

    OS: Win 10 and Ubuntu 22.04 LTS Fontforge version 2022-03-08

    I am trying to simplify autotraced glyphs via Element -> Simplify. On some glyphs it works, but on some Fontforge halts immediately after clicking Simplify, and even after waiting half an hour nothing happens. In the end I have to force Fontforge to close. This happens both on Windows and on Ubuntu Linux.

    I have included a zipped SFD file with one glyph in it (0 character), that in my tests halts every time.

    opened by tersaton 0
Free (libre) font editor for Windows, Mac OS X and GNU+Linux
A terminal-based, mouse-driven BDF (bitmap) font editor.

bdfedit A terminal-based, mouse-driven BDF font editor. Capable of reading, writing, and editing bitmap font files fully within the terminal, and enti

Andrew 4 Jun 8, 2022
Simple text editor in C++ - Simple editor built upon kilo editor.

GUMBO editor Simple editor built upon kilo editor. Still big work in progress although this is just fun side project to learn more C/C++. From 0.0.2->

Filip Ivanušec 3 Sep 15, 2021
Visualization Library is a C++ middleware for high-performance 2D and 3D graphics applications based on OpenGL 1.x-4.x supporting Windows, Linux and Mac OS X.

Visualization Library 2.2 Gallery About Visualization Library is a C++ middleware for high-performance 2D and 3D graphics applications based on the in

Michele 293 Jun 26, 2022
Oxygine is C++ engine and framework for 2D games on iOS, Android, Windows, Linux and Mac

BUILD AND RUN See oxygine-framework/readme/ folder. It has instructions on how to build and run oxygine on different platforms. Wiki available at http

Oxygine 728 Jun 17, 2022
Serial Data Monitor is a multiplatform (Windows, Linux, Mac, ...) tool to interactively receive/edit/monitor data and send commands to an embedded system via the serial bus

See wiki for full documentation Serial Data Monitor Description Serial Data Monitor is a multiplatform (Windows, Linux, Mac, ...) tool to interactivel

monnoliv 4 Oct 29, 2021
Windscribe 2.0 desktop client for Windows, Mac and Linux

Windscribe 2.0 Desktop Application This repo contains the complete source code for the Windscribe 2.0 app. This includes installer, service/helper, ba

Windscribe 284 Jun 20, 2022
Drmemory - Memory Debugger for Windows, Linux, Mac, and Android

Dr. Memory: the memory debugger About Dr. Memory Dr. Memory is a memory monitoring tool capable of identifying memory-related programming errors such

DynamoRIO 2k Jun 23, 2022
Qt5 "Hello, world!" app for Linux, BSD, Windows, Mac.

hello world in qt5 Contributions in all forms (code, bug reports, community engagement, localization, etc) are warmly welcomed. Development activity I

Jakob Flierl 2 Jan 26, 2022
Allows to swap the Fn key and left Control key and other tweaks on Macbook Pro and Apple keyboards in GNU/Linux

A patched hid-apple kernel module UPDATE August 2020: swap_fn_leftctrl is now built-in in Linux 5.8 ?? UPDATE Jun 2020: New feature added (swap_fn_f13

Zakhar Semenov 295 Jun 23, 2022
emily - GNU/Linux applications and scripts launcher.

emily emily - GNU/Linux applications and scripts launcher. For What? Firstly emily has been maden as a replacement for i3-dmenu, because i don't like

null 1 May 13, 2022
Make your Pop!_OS (Ubuntu Linux) shortcut key experience more like Mac OS

Meta Mac Enables a Mac OS-like shortcut key experience on Pop!_OS (and most Ubuntu-based Linux distros). Installation Download or git clone this repos

Duane Johnson 11 May 27, 2022
A FREE Windows C development course where we will learn the Win32API and reverse engineer each step utilizing IDA Free in both an x86 and x64 environment.

FREE Reverse Engineering Self-Study Course HERE Hacking Windows The book and code repo for the FREE Hacking Windows book by Kevin Thomas. FREE Book Do

Kevin Thomas 984 Jun 17, 2022
A Mac like Control Center for Windows

A Mac like Control Center for Windows.

LoadingName 1 Mar 8, 2022
A FLOSS implementation of the ground breaking MacBook camera system for GNU/Linux

GNU/Notch Tired of your friends making fun of your dinosaur laptop? Can't afford anything but Free Software? Fret not for this simple X11 based progra

null 3 Jun 1, 2022
Simple Fetch Software for GNU/Linux

ponyfetch Simple Fetch Software for GNU/Linux Current Version: 1.2 Whats new in 1.2? You can now change the ASCII art and the labels used in ponyfetch

FlutterHeart the Alicorn 3 Nov 22, 2021
Volatile ELF payloads generator with Metasploit integrations for testing GNU/Linux ecosystems against low-level threats

Revenant Intro This tool combines SCC runtime, rofi, Msfvenom, Ngrok and a dynamic template processor, offering an easy to use interface for compiling

Red Code Labs 54 Jun 15, 2022
Tiny implementation of the GNU/Linux CGroupFS (sans resource controllers) as a PUFFS or FUSE filesystem for BSD platforms

CGrpFS CGrpFS is a tiny implementation of the GNU/Linux CGroup filesystem for BSD platforms. It takes the form of a either a PUFFS or FUSE filesystem,

null 11 Jan 10, 2022
Implements a complete GNU/Linux program

Linux-app Implements a complete GNU/Linux program The example program is part of a system for monitoring a running GNU/Linux system. It includes these

Spoorthi Naik 1 Jun 19, 2022
Portable, Noto-powered font-rendering abstraction based on FreeType and Raqm

Mechascribe Mechascribe is still under construction and nothing is functional yet. Mechascribe is a text rendering abstraction trying to support as mu

null 4 Jan 27, 2022