# Changes (Enhancements & Bug Fixes)

Changes since the last release may be found by performing a "cvs log" command on the file stamp.c.

> TEGEUS: Tell me, What is your opinion of Progress? Does it, for example, Exist? Is there ever progression without retrogression? Therefore is it not true that mankind Can more justly be said increasingly to Gress? |  | -- A Phoenix too Frequent Christopher Fry, 1950

> "The trouble is," he said, "is that things never get better, they just stay the same, only more so. |  | -- Faust Eric Terry Pratchett, 1990

- 2-Oct-2007
  - Add `Edit->Select->Autohintable`
  - Typo in parsing cmap format=6 subtables could cause a crash (or eccentric behavior)
  - Can build fontforge so that it is a python extension (as well as embedding python in ff).

    >     $ ./configure --enable-pyextension

  - If a tt spline had a control point on top of an on-curve point we would lose track of it when generating the font.
  - Add support for the Uncode variation subtable of the 'cmap' encoding table (format=14).
  - add xdg-open to the list of "known" browsers.
  - Patch from Torsten Bronger. Got the args wrong in (python) font.glyphs.
  - Fabrice Popineau & Taco Hoekwater point out that in the featurefile output routines I was using a single backslash inside a printf string. The intent was to output a single backslash. But I actually need to quote the backslash with another to do that.
  - If a text string were extremely long it could overflow the 16 bits allowed for a width in a metrixedit column. Truncate to 32767 in that case. Still can't scroll over the whole thing, but editing it will pop up a better view which will allow it all to be displayed.
  - If there are no slots in the current encoding, then clicking on the encoding menu caused a crash.
  - Give the user control over the code pages/unicode ranges fields of the OS/2 table. Add python scripting commands to access them too.
  - When the user renames a glyph then things dependant on it should change too.
    So if any substitution (or pairwise positioning) refers to the old name, change it to refer to the new.
    If any contextual change refers to the old name change to the new.
    If any class of glyphs (kerning class, apple state machine, contextual by classes) refers to the old name change to the new.

    More debateable: if we change "f" to "u0066" then change "f.sc" to "u0066.sc" and "f_f_l" to "u0066_u0066_l" (and recurse on those name changes).

  - Guess at the meaning for GDEF glyph class component glyph:
    - Something not encoded
    - Something which is refered to by at least one other glyph (as a reference)
    - Something which is not generated by GSUB
  - Further improvements to the auto instructor.
  - Make the [Guess] button in FontInfo->Private active when BlueScale is selected. (and make it work too).
  - Oops. A font member in python was mis-named. Documented to be "loadState" was "loadStyle". Corrected to match the documentation.
  - Some of the 'maxp' checks in the validator were off by 1, so fontlint would report errors on the glyph with the maximum value.
  - Validator was checking non-composite glyphs against composite boundries.
  - Barry Schwartz points out that I should validate the PostScript Private dictionary (Check that entries have the right types, check that BlueValues: has an even number of elements, is in order, that pairs are separated by bluefuzz*2+1, not too big for bluescale etc.).
  - FF would crash when building accented glyphs from unicode data that included a space as the base glyph.
  - Torsten Bronger points out that "import" is a python keyword and can't (easily) be used as a member/method name. So change the glyph.import function to importOutlines.
  - Patch by Mathias Kilian OpenBSD needs an include file linux doesn't (or rather that linux imports in another include file) declaration statement mixup.
  - Patch by Michal Nowakowski to disambiguate some strings and to make sure some others get translated.
- 17-Sept-2007
  - Patch from Daniel Johnson. FF didn't compile --with-regular-link
  - And FF didn't compile if it had libpng but not libjpeg
  - Added some warning messages when doing AutoInstr so that if a font does not contain a private dictionary, or if none of the selected glyphs contain hints, then let the user know s/he isn't going to get very useful instructions.
- 15-Sept-2007
  - Added the ability to upload a font to the open font library. (You need to have created an account with them first).
  - Further improvements to the auto instructor.
  - When all glyphs are selected and the user auto-instructs, then FontForge will clear any legacy tables ('fpgm', 'prep' and 'cvt '). The old values will be of no use, and they just get in the way.
  - Add a Edit->Select->Select by Script command
    Make the Select by Name take a wildcard (so you could select "*.sc").
  - ApplySubstitutions still had problems. Caused crashes in a font with instructions.
  - If one used the metrics view to create a kerning lookup then: there would be no 'kern' feature in the feature list yet, and the display would randomly lose track of kern pairs and then create new ones. Very confusing.
  - Hmm. In some cases Merge Fonts didn't copy over lookup info.
    Add the ability to merge cross-font kerning pairs (in case the two fonts being merged have the same glyphs for those which are in both fonts).
  - Provide a mass glyph rename menu item.
  - The [Merge] button in Font Info->Lookups was disabled when two subtables in the first lookup were selected.
  - If a glyph ended in a suffix (one.superior, etc.), then changes to that glyph were not reflected in the fontview.
  - Add the ability to Populate a lookup from the selection (in the lookup sub-table dialogs)
    Do a better job of providing default values for single substitutions & positions.
  - In the Print/Display dlg, deleting something so that the next line was blank caused ff to crash.
  - The Encoding->Make From Font menu item should be disabled if the encoding is not custom.
  - Fixed a system specific crash in the BDF Info window.
  - Major rewrite of tilepath. Now has initial, medial, final & isolated tiles which it will use depending on the circumstances. No longer uses the clipboard, but you can draw the tiles in the dlg.
  - In Italic/Oblique fonts (those where the font has an italic angle specified) make the center in width command correct for the italic angle.
  - Round to Int didn't round anchor points.
  - The Control Point Info window could wander off the bottom of the screen. I was very carefully calculating its position -- and then not using the result.
  - InkScape stuffs bitmap images into svg files using the data URI
    data:<mimetype>,<data>
    (see IETF standard RFC 2397)

    So, I'll support this now as my only way of handling type3 style svg fonts with embedded bitmaps.

    The standard points out that URIs are limitted to 1024 bytes, but I don't pay any attention to that restriction, and will stuff arbetrary sized images into these things.

  - The code that set up python import/export filters did not put an end of list entry after the last one. Sometimes it would be NULL (correct) and things would work and sometimes it would be garbage and things would crash.
  - Drat. In the outline glyph view, the Import command didn't set the filter properly when you changed the import type.
  - Extend fontforge to keep track of errors encountered when loading 'sfnt' files, and then have fontlint complain about them.

    Also extend fontlint to do validity checking in glyphs against the 'maxp' table. (This won't matter when editing fonts, as ff will fixup the maxp values when it generates the font, but there might be some existing fonts with buggy 'maxp' values).

  - Oops. When changing the weight of a glyph and retaining the counter sizes, fontforge would push two entries onto the undo stack rather than one. (So the user would have to do Edit->Undo twice to get back to where s/he started from).
  - Added several new python methods to font.
    - find(contour) will search the font for all glyphs containing contour and return an interator on that set.
    - replaceAll(srch,rpl) Will search for the "srch" contour/layer in the font and replace it (each time it occurs) with the "rpl" contour/layer.
    - glyphs(type) returns an iterator over all glyphs in the font. If present type may be "GID" (default if omitted) or "encoding" and it indicates the order in which the glyphs will be returned.

    Added some new members to glyph:

    - encoding -- returns the glyph's encoding in the font
    - script -- returns the OpenType tag (a 4 letter string) of the script of this glyph.
- 31-August-2007
  - New traditional Chinese translation of the UI by Wei-Lun Chao.
  - Updated Vietnamese translation by Clytie Siddall.
  - Removed the old MetaFont command (which didn't work) and replaced it with a styles menu (incorporating the old Effects menu, and a command to change weight, to condense/extend, and to oblique. Added python scripting commands {font,glyph}.{changeWeight,condenseExtend}
  - Lots of new work on the truetype autoinstructor by Alexej and Michal.
  - Add a validation dialog which can be run just before generating a font.
  - Try a different algorithm for approximating splines by line segments (for drawing them in the outline glyph view and elsewhere). This one should show symmetry better.
  - Provide the ability to ask freetype to rasterize glyphs without hints in the Print/Display dlg (even if the glyphs have hints, rasterize them without).
  - Oh dear, rasterizing stroked fonts only worked if multilayer was defined.
  - Try to improve display of stroked fonts.
  - When stroking splines don't let miter joins grow excessively.
  - FF would remove instructions from glyphs that had at least two contours the first of which started with a control point.
  - Add a short cut for Hide Grid in the metrics view.
  - Python 2.5 initializes itself differently from Python 2.[34]. 2.[34] delay the init until an import happens, while 2.5 does it at start up. I just assumed that when I called Py_Initialize that it did so. This led to a crash on 2.[34] when I tried to use my types before the user had tried to import fontforge.
  - Further improvements to tile path.
  - When moving a control point in a ttf font where one side of the cp was a real point, I would allow an implicit point on the far side of the real point to become real.
  - When dragging truetype points around, adjacent implicit points would remain where they were (and not be implicit any longer).
  - FF would randomly crash after removing a lot of glyphs.
  - The knife tool would not cut a contour if it landed on a point.
  - Trying to add a stylename to the size pane of fontinfo generally caused a crash.
  - All blank lines in the display dlg had the same line spacing as that of the first character displayed in the dlg.
  - I don't think feature files where handling classes defined with '-' properly.
  - Read the "lib" structures from UFO/GLIF files into our python persistant data. (And write our persistant data out if it's a dict).
  - Add the ability to call hooks (python functions) when various fontforge events take place.
  - Make fontforge's basic types (Point, Contour, and Layer) be picklable so they can now be saved in an sfd file.
  - Oops. With the inclusion of the library check argument, ff would not compile if NODYNAMIC were set.
  - FontForge now stores the "userdata" python members into the sfd file as pickled objects. (FontForge's own types are not currently pickleable).
  - Add the ability to mark a glyph so that just before being saved its references will be unlinked and we will run remove overlap on it. This means the user can work with the references (and get the automatic updating they confer) and still not have a self-intersecting glyph in the output (think Aring, Ccedilla, Eogonek).
  - Create a fontlint script file.
  - When dumping both apple and opentype bitmap tables if there were a BDF table, then we'd get garbage for 'bloc'/'bhed'.
  - Add some user interface commands to python, and more importantly, add the ability to create menu items which will invoke python scripts, and the ability to add import/export conversion filters (again, python scripts).
  - Counter hints for LCG glyphs came out wrong if autohint had not been applied first.
  - Counter masks were not read out of sfd files properly.
  - Selecting a counter mask in Glyph Info caused FF to crash.
  - The Execute Script dlg would sometimes complain about invalid scrollbar size when it got closed.
  - AddAnchorPoint (scripting command) should be prepared to cast real args to integers.
  - Just as I needed a special "in use" pass of GSUB when reading from a TTC, so I also need an "in use" pass of the MATH table.
  - All this time and I've mapped "nonmarkingreturn" (GID=2) to Unicode+000C instead of Unicode+000D. I'm a twit.
- 08-August-2007
  - Support for MicroSoft's new 'MATH' opentype table. Element->Math Info.
  - Michal Nowakowski and Alexej Kryukov have improved truetype hinting.
  - kerning display is off in a pairwise lookup window if a y position adjustment were requested.
  - When reverting a compacted font ff thought the font was compacted even when it was not.
  - Make some effort to retain context in the fontview when changing encodings.
  - ff scripting command CopyReference() was broken.
  - Werner wants little popup windows in show att. Give him some for substitutions.
  - If you examined a kerning pair subtable (either with glyph info or from double clicking on the subtable in the lookup pane) and then pressed [OK], and then generated an afm (tfm, old-style kern table, etc.) you would lose all the kern pairs you examined.
  - Patch by Barry SCHWARTZ to feature file output on 64bit machines.
  - In freetype 2.3.5 the binary layout of the execution context changed.
    This means that if ff is compiled against a 2.3.4 library it can't debug truetype if linked with a 2.3.5 library (and vice versa).
    So put in checks to see that the library version matches what we expect.

    Also the contents of one of the structures has changed a bit, and a value that used to live in one field has moved to another (the ppem value moved from (exc)->size->metrics.x_ppem to (exc)->size->root.metrics.x_ppem.

    Well, David warned me that this might happen.

    Warn the user (rather than just silently failing) when we have a freetype version mismatch.

  - Patch from Barry SCHWARTZ. python fontforge.font.addPosSub was expecting its args inside a redundant tuple.
  - New Vietnamese translation from Clytie.
    Also some spelling corrections in the original messages.
  - Patch by Barry SCHWARTZ to lookup/subtable comparison.
  - If a metricsview was open, then creating a new glyph slot would potentially screw up memory and sometimes crashed.
  - Edit->Merge (and simplify) still have bugs.
  - Fix two memory leaks in the metrics view (one was huge).
  - If freetype failed to rasterize a glyph, then we would fall back on returning a bitmap image from our own rasterizer -- even if we asked freetype for a greymap. this caused problems when routines expected byte data rather than bit data.
  - If we were given a cff (otf) font, with a bluevalues array which ended in 0 (as [-20 0]) then we would omit the final zero ([-20]).
  - Outputting extension subtables appears to have been broken.
  - The code which was supposed to detect two glyphs with the same set of kerning pairs and use the same data for them didn't work (forcing us to get an extension table which also didn't work).
  - Add some more checks against non-BMP characters when drawing text.
  - For first characters in the kern pair dlg, when editing class 0, the [Edit] button was enabled but did nothing. Should work now.
  - ff could crash if it tried to create a popup image of the <New> line in the substitution pane of Glyph Info.
  - Horizontal Scrolling in the matrix edit widget sometimes forgot to move the column labels.
  - Add glyph name completion to lookup subtable dlg and glyph info panes.
  - addKerningClass didn't parse its arguments correctly.
  - Drat. When printing full page glyphs to a pdf file, the glyph was shifted up by almost the full page and we got a second (and incorrect) title.
  - MS proposes two new feature tags with it's new 'MATH' table.
- 23-July-2007
  - I have merged (and substantially rewritten) the Print and Display Dialogs. There is now only one menu item (Print) which (vaguely) the old Display dlg except that it can now be printed. The text area widget now supports OpenType features just as the metrics view does. It also supports ligature carets.

    The dialog is no longer modal, however it does not get updated with each change to the font (that would make moving a point around in the outline view far too sluggish), instead there is a [Refresh] button the user can press to force an update.

  - It occurred to me that fontforge's current mechanism for setting ligature carets requires that there be a ligature substitution is the exact number of components used to make the glyph. But in indic fonts ligatures are often made up out of other ligatures (I think) which means that there won't be enough caret positions.

    So I've added a Ligature Caret count to the Element->Glyph Info dialog to give the user control over it when necessary.

  - Add minimal support for applying apple state machine lookups in metrics view. Support is minimal because:
    - Apple seems to figure line breaks before doing substitution process but I do it afterward so I don't know where the line breaks are and I can't enter either the line start or line end state.
    - When I delete a glyph I delete it. Apple inserts a deleted glyph mark and then removes that later. State machines can respond to deleted glyphs, but I can't.
    - I don't try to figure out which feature,settings should be on by default. So the user must pick them out manually.
  - Add popup graphics to the Glyph Info and Lookup subtable dialogs to show substitutions (that is if there is an entry like 'smcp' a => a.sc then create a popup window showing the "a" glyph and the "a.sc" so the user can see what happens.
  - Another futile attempt at an embolden command. Element->Embolden
  - Add shortcuts to the anchor control dlg (Page Up/Page Down) to move to the next/previous glyph.
  - Michal Nowakowski has improved the truetype autoinstructor. He warns that it probably still has bugs (as what does not?) so I am leaving the old code available for now. He says it works best in "a clean (uninstructed) font with well defined blue zones and stems".
  - If we have a glyph with multiple encodings, and the secondary encodings occur after the primary ones, then the backmap will probably contain a secondary encoding, which means that when we go to load the font in we will probably notice the secondary encoding twice and forget the primary.
  - I used not to distinguish between ligature anchors and normal mark to base anchors. Unfortunately when I moved to lookups (from features) I had to introduce that distinction. But I didn't work through all the implications and have fixed a number of bugs related to that.
  - Barry SCHWARTZ complains that font info says "fontnames must" but that the cited adobe tech note only says "should". So change "must" to "should".
  - When processing class-based contextual lookups fontforge could not handle class 0 (the class containing "all glyphs not in another class") add code to do that.
  - If the user did not select a Gasp Version (note: active selection was needed, just seeing that it was correct and leaving it didn't work) then [OK] would leave the font with an invalid version and on some systems caused a crash.
  - View->Insert Glyph After didn't work well on a ligature glyph. It would insert the glyph after the first component of the ligature, not after the last -- which would make more sense.
  - Misnamed some private dict entries when loading from otf.
  - Make entry of ghost hints better.
  - Add the ability to determine whether a point is selected or not from python.
  - Add a mechanism so the user can ask fontforge to check for the existance of optional libraries.
  - Add range checks to some library routines which blindly referenced some BMP arrays with codepoints outside bmp. Broken by UCS2->UCS4 change.
  - Werner wants GotoChar to be able to switch sub-fonts in a cid keyed font. This may introduce bugs...
  - Revert glyph still wasn't working.
  - Someone complained that using a negative stroke took a very long time but produced correct results. Um. Ok. It's easy always to use the absolute value.
  - Oops. The mac uses UCS2 for filenames, so when I moved to UCS4 I should have changed the mac resource file interface.
  - When creating a mac resource file we only set the type/creator fields and failed to initialize the finderFlags.
  - Fixed crash bug in generating a cursive connection anchor sub-table.
  - In TrueType composite glyphs with the USE_MY_METRICS bit set the lock icon wasn't scrolled properly.
  - The change from UCS2 to UCS4 broke text copy/paste.
    We failed to add a terminating NUL of the right size in all cases
    We continued to use charset=UCS-2 when it should have been UCS-4
  - FF crashed when trying to View->Show ATT on a font that appears to me to contain an invalid 'kern' sub-table. I have removed the proximate cause of the crash. I have provided a warning that the kern table appears invalid. And I have cleaned up my internals after detecting the bad sub-table (I had a lookup with a feature but no script and this caused problems).
  - Multiple substitutions in the metrics view did not properly update the count of glyphs to be displayed.
  - If nothing changed in the metrics input field and the output contained a ligature (or a mult subs I suspect). FF would complain.
  - in python, font.generate() didn't work. The PyArg_ParseTupleAndKeywords behaves in a way I did not expect.
  - [Bottom] and [Down] still didn't work for lookup subtables.
  - Try to force the text field in the metricsview to a fixed size. In some fonts it seems to be initialized to a huge value.
  - Add ability to display italic side bearings in the char view.
  - The lines drawn for italic fonts to show the italic origin and width were at slightly the wrong angle (I used a sine when I should have used a tangent).
  - If a font did not have any horizontal metrics then ff would not set the em-size.
  - Show Att trampled on memory when displaying apple contextual substitution state machines.
  - Wasn't parsing apple's 'lcar' table properly.
  - if a font contained a 'post' table but didn't name all names (or something like that), then the attempt to name the glyph based on the encoding was broken after the encoding change.
  - FF did not recognize that a bdf file was greymaped. Broken by the bdf properties work a year ago or so.
  - The import lookups button in fontinfo forgot about the subtables (sort of).
  - The metricsview used the wrong count field to determine whether things changed. It used the glyph count, not the char count (which meant that when we had a ligature and the number of chars was greater than the number of glyphs, things got confused.)
  - In the metrics view, anchored attachments only worked if the base glyph were itself unmoved (that is the mark was placed relative to the unmoved location, not the actual location).
  - The search dialog should provide user with control over the error bound.
    The rotate checkbox didn't work if the flip checkbox wasn't checked.
  - If a replace contour added a control point to a point that did not have one (went from a line to a curve) then that control point would get lost.
    If a search matched across the start point of a contour then search/replace could go into an infinite loop if the search and replace paths were the same.
  - Find/Replace (replace) didn't work on quadratic splines.
  - Add two python methods:
    - Layer.interpolateNewLayer(other-layer,amount)
    - Font.createInterpolatedGlyph(glyph1,glyph2,amount)

    The first creates a new layer by interpolating between the current layer and the layer in the first argument.
    The second creates a new glyph in the font by interpolating between the first two arguments. The glyph's unicodecode point and name will be copied from the first argument (the font must not already contain this glyph).
    If amount is 0 the result will look like the first glyph, if 1 then like the second.

  - When recovering from a crash, FF would sometimes complain about a mismatched version number. Don't.
  - Problems parsing 'mort' tables could cause a crash.
  - When building a contextual lookup, don't list that lookup as something that it could invoke (ie. list all lookups in this table (GPOS/GSUB) except for ourselves). Don't want to encourage users to create infinite lookup loops.
  - Point matching didn't work when there were references to references and multiple references within a glyph.
  - FF was having problems with extension lookups with multiple sub tables.
  - We were trying to print a trailing NUL in some strings from the fontview.
  - Kerning by classes got broken in metricsview by the addition of support for device tables.
  - A GPOS contextual lookup only listed GSUB lookups in the lookup/sequence dlg
    Pressing [OK] in the lookup/sequence dlg caused a crash if no lookup selected.
  - Openfontdlg was looking at the filter listbutton rather than the rename namelist listbutton.
  - mf2pt1 now uses "glyph_dimensions" rather than "bbox"
  - The metrics view should now handle device tables.
  - Goto could crash when used on small encodings.
  - -lang wasn't permitted before -c.
  - Use numeric text fields for anchor positioning.
  - Graham Asher points out that the meanings of underline position in the 'post' table and the FontInfo dictionary are different. One refers to the top of the underline rectangle and one to the center of it.
  - Align point would crash if the selected point were the end point of a contour (or if the two points around it were in the same place).
  - The baseline was not properly located when displaying it in the fontview.
  - The scripting command BitmapsAvail would generally cause FF to crash if done when there was a UI..
  - We seem to be misimplementing my obsolete (sfd file) convention for having duplicate encodings point to the same glyph. Result was that occasionally a glyph would be removed and a pointer to something it refered to would be put in its place.
  - Change the name of activeFontInUI to activeFont
    Add an activeGlyph method.
    Add the ability to call a python script from a outline view.
  - Hmmm. If a textfield is shifted right, and then resized so there's now room for all the text, the unshift it.
  - Werner suggests that it would be useful to be able to specify wildcards in the goto dlg.
  - Michael Zedler tells me that glyphs output by mf2pt1 contain a line:

         % MF2PT1: bbox 0 90 834 422

    where the third (so called) bounding box entry is actually the glyph's advance width. I was reluctant to use this at first, because that clearly isn't something that belongs in a bounding box...

  - Werner tells me that lilypond uses a slightly different syntax for the MF2PT1 bbox comment, so make our parsing slightly more generous.
  - When creating a new lookup subtable for an anchored lookup, it did not get marked as having anchor classes and feature file output failed because of that.
  - When outputing single lookups, the feature, script and language tags all had ^A where they should have had the second letter of the tag.
  - Remove the code to produce the old, broken, 'size' feature.
- 07-June-2007
  - Add support for Adobe's feature file syntax.
    Use Merge Kern (now Merge Feature) to read one
    Use Element->Font Info->Lookups->popup menu->Save to generate one

    Sigh. Adobe documents a feature file syntax they don't fully support, and even their documented syntax is inadequate to represent all the complexities of OpenType.

    FontForge supports anchors and device tables and will parse lookups which contain these. This is a syntax which Adobe documents but does not implement. Adobe also warns that this syntax may change when they get around to implementing it.

    FontForge makes one extension to the syntax which allows me to specify complex contextual features.

    Neither I nor Adobe support reverse contextual substitutions, nor GDEF mark classes.

  - Add a popup menu to the lookups pane of font info.
  - Change the name of `File->Merge Kern Info` to `File->Merge Feature Info`
  - Remove the code to produce the old, broken, 'size' feature.
  - An earlier patch, designed to make the tabset work in the charview even if the user changed the name, didn't work.
  - Bug in the selection iterator.
    Also Max Rabkin points out the docs say the iterator returns selected glyphs rather than encoding slots. Fix the docs, then add a member (.byGlyphs) which will make the iterator return glyphs.
  - Accept contour += (1,2) rather than forcing people to say contour += fontforge.point(1,2)
  - Was using an error return from two setter functions (contour.set_closed, set_is_quadratic) when I should have returned success.
  - Crash when mistyping a glyph name in Glyph Info possub panes. Probably in the equivalent lookup dlgs too.
  - If a glyph contained two copies of another glyph, and one of those copies was off by enough that ff didn't recognize it, the depending on how the contours were ordered, ff might fail to recognize the first glyph too, even though it did match.
  - Add iterators to contours and layers. Python users seem to expect them even when they aren't documented to exist.
  - layer += contour didn't work in python. I was examining a bit through the wrong data type.
  - Provide a mechanism for copying lookup information from one glyph to another. (`Edit->Copy Lookup Data`)
  - Loading kerning info from a mac 'FOND' resource was broken by the lookup change.
  - Python scripting command font.createChar didn't. Partial patch from Max Rabkin.
  - Adding a kerning pair from the metrics view would often add two or three pairs with the same character combination and different values.
  - Another remove overlap bug. Introduced recently.
  - Reinstate Apply Substitutions scripting command.
  - Add some dutch styles.
  - Make yet another attempt to correct for rounding errors when loading a postscript font.
  - Add a way to get a font's filename to python.
  - Werner points out that in scripting I use "break" in an example. It isn't documented to work and I don't implement it but I do show it. Oops. Ok, make it work.
  - Display substitutions was broken.
  - When generating default names for subtables, it is confusing to name them the same as the lookup.
  - Change to using USC4 from UCS2 internally.
  - Provide default names for lookups once the user sets the feature.
  - Disambiguate some strings for the polish translation
  - Revert glyph should not work for old sfd files.
- 11-May-2007
  - Loading some afm files would go into an infinite loop. (Introduced 9-May)
  - [Import] button on Font Info->Lookups crashed.
  - Fix a number of problems related to anchor classes.
  - After the user does an [Add Lookup] we should select the new lookup, to make it easier for him/her to do an [Add Subtable].
- 9-May-2007
  - When ff parsed an afm file it only read the first ligature on a line.
  - The [Call...] button in the scripting dialog is meaningless for python scripts (or I don't know how to give it meaning) so disable it.
  - Vertical scrolling in the metrics view tried to scroll the list of features too.
  - Tab, and arrow keys didn't work in the matrixedit widget after I added hidden columns. Make Return do the expected thing (move to start of next line and create it if possible).
  - Patch by Pierre to fix uninitialized value when compacting encodings.
  - Typo in realloc of lookups meant that nothing happened (when it should have increased array size by 1).
  - Add the OFL icon to the fontinfo dlg.
  - Plugins were broken with regular link configure option.
  - Inkscape can start X on the mac before it tries to connect. Hmm. I can do that too. Inkscape manages to start X without an xterm. I don't know how to do that.
  - When reading PS and CharStrings, the closepath operator didn't allow for rounding errors.
  - Metrics View would crash if more than 20 glyphs entered.
  - Alexej Kryukov points out that it would be nice if moving an anchor point did not set "changed since last hinted.
  - Alexej Kryukov points out that the "changed since last hinted" flag gets set inappropriately.
  - Alexej Kryukov points out that the Anchor control menu item looked as though it had changed, but actually had not.
- 1-May-2007
  - I've redone the way FontForge handles lookups so that it is more in keeping with OpenType.

    > The major change is that fontforge now presents lookups to the user rather than features. I think this makes simple things more difficult (which is why I avoided this when I started), but it makes complex things possible.

    > Sadly the world is not simple.

    > So when a piece of typographic information is created (a ligature, a kern pair, a glyph substitution, etc.) it must be tagged with a lookup (actually a lookup sub-table) rather than a feature tag.

    > The lookup itself will be tagged with a feature tag (possibly several tags) and with scripts and languages in which that lookup should be active.
    > NOTE: This reverses the way GPOS/GSUB think about things, but it contains the same information.

    > The Font Info dialog now contains a Lookup pane which allows you to create and edit lookups and their subtables. You can also reorder them. The order shown in the dialog is the order in which they will be applied.

    > A mac feature/setting subtable also gets converted into this format.

    > The Font Info dialog no longer has Anchor Classes, Contextual, or State Machine panes.

    > Instead you can edit a lookup subtable's data (for any subtable type). There are new dialogs which list all the information for each lookup type (ie. a dialog which lists all kern pairs in a subtable), and these provide access to the old anchor class, contextual or state machine dialogs.

    > The Glyph Info command has also changed. It looks simpler and more comprehensible (I think), but the act of creating a new substitution has become more complex because (potentially) one must create a new lookup and lookup subtable before doing the simple task of adding a new replacement glyph.

    > The kerning class, contextual and state machine dialogs have all changed in that they no longer request a feature tag, they now need a lookup subtable.

    > The metrics view also needs a subtable.
    > The metrics view has changed considerably.
    > It displays all the features in the font, and allows you to select which ones you want active in the view. It lets you set the script & language. It will apply lookups that it couldn't handle previously like ligatures and contextuals.

    > It does not do Indic glyph reordering. I'm not sure how to and last I checked MS had not updated their docs to reflect their new procedures.

    > Many other dialogs now take a lookup subtable where appropriate.

    > Show ATT has changed, but it is still not editable. I hope that the Lookups pane will do that instead.

    > There used to be a scripting command which indicated what ligature features got stored in afm files. Now each ligature lookup has a flag set on it which conveys this information.

    > The Element->Typographic Features menu has been removed. It's functionality has moved into Font Info->Lookups (I hope I've got everything).

    > Some scripting commands have been removed, others have been changed and others have been added. I apologize for this, as it will break existing scripts, but some basic concepts no longer exist and others, very different, have replaced them. (and anyway people may switch to python scripting now).

    > Removed:

    >                DefaultATT
    >                ControlAfmLigatureOutput
    >                ApplySubstitutions
    >                CopyGlyphFeatures
    >                AddATT         Replaced with AddPosSub
    >                RemoveATT
    >                GlyphInfo(Position/Pair/Substitution/AltSubs/MultSubs/Ligature)
    >                SelectByATT    Replaced with SelectByPosSub

    > Changed

    >                Set(V)Kern takes an optional third argument, a lookup subtable
    >                     name (if not specified it choses one)
    >                AddAnchorClass(name,type,lookup-subtable-name)
    >                GetPosSub(subtable-name)
    >                AutoKern(spacing,threshold,subtable-name[,kernfile])

    > Added

    >             AddLookup(name,type,flags,feature-script-lang-array[,after-lookup-name])
    >                  n*[feature-tag,script-lang-array]
    >                  n*[script-tag,lang-array]
    >                  n*[lang]
    >              GetLookupInfo(lookup-name) =>
    >             [type,flags,feature-script-lang-array]
    >              AddLookupSubtable(lookup-name,subtable-name[,after-subtable-name])
    >              GetLookupOfSubtable(subtable-name)
    >              GetSubtableOfAnchorClass(anchor-class-name)
    >              AddPosSub(subtable-name,variant(s))
    >                       (subtable-name,dx,dy,dadv_x,dadv_y)
    >                       (subtable-name,other-glyph-name,dx,dy...)
    >              RemoveLookupSubtable(subtable-name)
    >              RemoveLookup(lookup-name)
    >              MergeLookupSubtables(subtable-name1,subtable-name2)
    >              MergeLookups(lookup-name1,lookup-name2)
    >              SelectByPosSub(subtable-name,search_type)
    >              GetLookups("GPOS"/"GSUB")
    >              GetLookupSubtables(lookup-name)
    >              LookupStoreLigatureInAfm(lookup-name,store-it)
    >              LookupSetFeatureList(lookup-name,feature-script-lang-array)

    > The sfd format has changed. New files are tagged as version 2. Old files will still work, but ff will no longer produce file in the old format.

  - New translations to match the new UI: Polish, Greek, German, French, simplified Chinese.
  - FontForge now supports python scripting if it has been configured to do so.
  - Tell users they should add their email address to the License after pressing the [Add SIL Open Font License] button.
  - The metrics view had numerous problems. Most significant if a glyph changed elsewhere the metrics view would not be updated.
  - If the width of a glyph changed in the metrics view then that was not synchronized to dependent glyphs.
  - Enforce the "Use My Metrics" bit of a reference.
    In TrueType, if this bit is set on a reference then then width of the containing glyph will be the same as that of the reference.
    So don't let the user change the width of such glyphs. (and add a lock icon to the width line in the character view to show that it is fixed).
  - Fix a number of Remove Overlap bugs.
  - FF would destroy memory in the metrics view if the user attempted to display a character which was not in the font.
  - Was setting the last char index (of OS/2) incorrectly if the font contained non-BMP characters. Might also have set the first char index wrong two.
  - Bugs in 'PfEd' table, glyph comment subtable.
  - Couple of places where I actually say "FontForge 1.0". Let's bump that to 2.0 now that I've done that for the sfd format.
  - Overlap problems with incorrect path orientations.
  - Arrow keys didn't work in the charview if the tabset were active.
  - I used to use "><" on the font's window title to represent a compacted font. No one understood it. Use "Compacted" instead.
  - Philipp Poll wants to see the side bearings (I think) in the charview.
  - Nicolas Spalinger of SIL suggests a help button next to [Add OFL] to open a brow ser on the official OFL site.
  - Patch from Nicolas Spalinger of SIL regarding the verbiage surrounding the OFL i n the fontinfo. Also his suggestion to make the tooltip live longer.
  - Replace with Reference didn't check reference offsets correctly.
  - Find problems didn't find references which intersected.
  - Add some standard classes to the context chaining dlg.
  - Make sure we only generate a postscript name in the name table once.
  - The change length button of the cvt dlg didn't work.
  - Input/Output of Apple's 'lcar' table was inconsistent. I don't know if it is "right" now, but at least ff can read back what it wrote.
  - Werner points out that the debug windows show up at odd places if the window gets resized.
- 12-Mar-2007
  - Add a button to insert the SIL Open Font License into the 'name' table.
  - FF failed to store TeX heights and depths properly in a tfm file. FF failed to read or write TeX extension lists properly.
  - Patch from Reuben Thomas to turn off the splash screen from the preference dlg.
  - I had the dotlessj code point wrong. Again.
  - FF did not center the charview window well on an empty glyph.
  - The scripting command to add instructions to a glyph could immediately lose them if the glyph's points weren't numbered properly
  - We used to allow the syntax "<number><numbers>* command" in ttf instructions (which automagically inserted an implied push). Someone noticed that

    >     PUSHB_1
    >     1
    >     2

    would lose the second number and not complain. In fixing that, I broke the first. Now both should work (I hope).

  - Code which I hope will handle German keyboards and make them do what the menu says they (ignoring the shift key) should for certain hot keys (brackets, curly brackets, brokets all get different modifier sequences on a german keyboard than an english).
  - If a glyph had no hints then ff could add a hintmask operator (which didn't try to control any hints). Now I can't find anything in the docs which SAYS it's illegal to have a hintmask in a glyph with no fonts, it does seem bad practice, and a program called tx.exe complained about it.
  - Patch by Michal Nowakowski to allow a nicer notation for delta instructions in the instruction editing window: Example:
    `PUSHB_3 6@12 8 1 DELTAP2`
    This moves point 8 by six delta-steps (that's clear) at 37 ppem (that's not clear at first glance - assuming delta_base is 9, DELTAP2 works from 25 ppem to 25+15 ppem, in this example it's 25+12 ppem). So it's just a way of constructing an argument byte for DELTAP/C.
  - Allow FontForge's menu shortcuts (hot keys, whatever) to be user definable. We use a gettext based mechanism, type $ make FontForge-MenuShortCuts.pot to get a pot file for the process. It needs to be converted to an mo file and installed in $(prefix)/share/locale/$(LANG)/LC_MESSAGES, just like any other getext file.
  - The Export scripting command did not work as documented. It is documented to export all selected glyphs. Instead it exported all glyphs.
  - Redo the anchor control dlg.
  - Be a little more lenient about bitmap bounding boxes for empty glyphs when loading bdf fonts
  - Make the ClearHints scripting command take arguments: "Horizontal" or "Vertical" to allow users to choose to clear either horizontal or vertical hints (the old form with no args still works and clears both, of course).
  - Typo gives us an unititialized variable when saving ufo.
  - Various problems to various anchor dialogs.
  - If an anchor point contained an x devtab but not a y devtab then it produced a pointer to garbage for the y devtab instead of NUL.

    Pairwise positioning lookups could also get their device table offsets screwed up.

  - Werner points out that if you have a series of the same glyph in a row in the encoding (generally .notdef) and you are in a char view, then pressing Next Glyph does nothing. You are stuck at the same code point. (same thing happens for Prev Glyph).
  - a chinese input method steals keystrokes I use for hot keys (I think). So if users don't want glyph navigation by typing characters in the charview (controled by a preference item) then don't turn on the input method when the window is created.
  - Add hot key for Select->Points on selected contours.
  - Assign "dotlessj" to map to 0x237, the unicode code point, rather than to 0xf6be, the old Adobe private use area. !!!! THIS DOES NOT CONFORM TO THE AGL !!!!!
  - Oops. The gloss for the shift point/contour/zone was slightly off and gave the wrong information.
  - Add vietnamese font styles (bold, italic, regular, etc.)
    From Clytie Siddall.
  - Fixes for rounding errors in finding spline intersections.
  - Werner points out that removing a bitmap glyph from the bitmapview does not force a redisplay in the fontview.
  - Gleep. Werner points out that when generating bitmap strikes, ff would always generate a temporary postscript font to rasterize, so any truetype instructions would be ignored. And the generated strikes would be ugly.
  - Add a command to show anchor point attachments within the outline character view
    (View->Combinations->Anchor Glyph at Point)
  - Force point numbers to be correct when changing glyphs in the charview.
  - Add support for Apple/Adobe's obsolete 'typ1' sfnt. A way of stuffing a type1 font into an sfnt wrapper.
  - Even though the viewbox/output width hieght ratios are different, people want the image scaled the same in svg input.
  - People would like to have only one charview and double clicking in the fontview just changes the contents of an existing window.
    Preference Item: OpenCharsInNewWindow
  - Add a tabs line to the outline char window. If users are going to have only one charview open then they probably want some history too.
  - Werner points out that what I call "Type42 CID" should actually be called either "Type11" or "CID Type 2".

  Earlier Changes
  Changes to PfaEdit (predecessor to FontForge)