# 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

- 3-Feb-2008
  - New Vietnamese translation from Clytie
  - New Russian translation from Alexandre Prokoudne.
  - New Polish translation from Michal N. .
  - FF could crash if a cmap subtable contained invalid encoding points.
  - Add various new features/scripts/language tags from OpenType draft 1.5.
  - Add two proposed features from the pre-draft of OT 1.6
    - Drop Caps
    - Character Variants 00-99
  - The warnings window didn't resize properly. It didn't let you copy text (ie. a warning) It didn't enough. It should have scrolled with keypad keys (arrows, page up/down, etc). There should be a way to clear the windows so you know that all the warnings are from a given operation. Added a popup menu.
  - Fixed a problem in the auto hinter.
  - Could not attach lookups to mac feature settings.
  - Clean up some display problems in the type3 layers palette and layer info dlg.
  - Autoinstructor: turned on strong point interpolation:
    - Various important outline points are correctly placed between hints' edges.
    - Potential benefits for DStem positioning.
    - Drawbacks: 2x slower, code generated is now much bigger.
  - The merge (and simplify) command could produce odd results if the points surrounding the merge had no control points.
  - Extend find/replace to handle changing angles.
  - The Display/Print dlg would crash when the user pressed the reset button if there were at least two pointsizes of the font on display. Perhaps in other cases too.
  - Make shift click in the lookup dialog (but not the subtable part) select all lookups between current click and a previously selected point.
  - glyph.addPosSub doesn't work for ligatures or multiple substitutions. It treats both as alternate substitutions.
  - Michal Now. points out that there are some strings not marked for translation in cvruler.c.
  - FontForge never checked that fonts had fewer than 65536 glyphs. I just blythely assumed I wouldn't have to worry. Well someone handed me a font with 65731 glyphs, and FF treated it as having 195 glyphs. Things got nasty after the 196th.
  - Fix a crash in autohint.c and an infinite loop in stemdb.c.
  - Font Compare would crash if one font had a lookup subtable which was not in the other.
  - Improve the algorithm used to detect reference points for stem edges. Enable snapping "corner extrema" to predefined hints.
  - Remove the obsolete Private Dict to CVT table command.
  - Michal Now. wants short cuts to change grid fit attributes, so a new sub menu with things like increase point size, change AA, etc. (with shortcuts, of course).
  - Patch by Michal Nowakowski. In Show Grid fit not setting the mono bit correctly in freetype.
  - Bug in pfm file output.
  - If we failed to open a plugin library during init, it would call LogError before the display was initialized, leading to a crash.
  - Autoinstructor: If a horizontal stem interpolated between blue zones was very close to one of them, it often jumped beyond that zone in small ppems. This was especcially annoying for serif fonts.
  - Improvements (I hope) to the ruler tool
    1. Make it snap to splines (in addition to points)
    2. Have it draw a line from the start point to the mouse
    3. If they start on a spline, then include info on the offset in coordinates parallel to the spline and normal to it.
    4. Provide a "spline length" if the start and end points are on the same spline (instead of just if they were the end-points of the spline).
  - In python scripting contour.reverseDirection only worked on closed contours.
  - If you click wildly in the cvt editor it would eventually go into infinite recursion.
  - If there were no free anchor class then attempting to add an anchor point would pop up the Mark Classes pane of Font Info (rather than Lookups). This is sufficiently close to Anchor Class as to be very confusing.
  - Make label gadgets (and buttons which are also labels) handle multiline text.
  - If the user closes the font info dlg when there are mark class dialogs floating around then close them too (there was code which was supposed to do this, but it didn't work).
  - Try to make it clear in the Mark Classes pane of the Font Info that mark classes are not anchor classes. Someone got confused...
  - Fix some bugs in parsing mark anchors in feature files.
  - When adding an hvcurve point into an existing spline it behaved like a curved point and laid parallel to the spline rather than being either horiz or vert.
  - FontForge uses floats (which have ~24 bits of precision internally) to represent coordinates. Type2 fonts use a 16.16 fixed notation, which means that we only represent coordinates <256 accurately. This will cause slight errors during output and input of a font. Unfortunately, due to the rel-rel nature of postscript these slight errors accumulate.

    So instead, when loading and saving a Type2 font use double precision temporaries. This should mean there will be no errors to accumulate. There will be slight errors when converted to SplinePoints, but these errors will not accumulate.

  - Check several adjacent splines when detecting active zones for curved segments and thus make the algorithm less dependent from the number of additional points on a contour and their exact positions.
  - Fix a number of problems that -pedantic complains about.
  - Some mnemonics in the Element menu are used for two items. Clean it up a bit.
  - Add a "Find Problems" for non integral coordinates.

    Change the "Ref with bad ttf transformation" so that it checks for integral coordinates too.

  - the glyph.validate function in python was marked as taking NOARGS in the method table, but, in fact, does take arguments.
  - Oops. Validate used to complain if the StemSnap[HV] array were missing. But that's perfectly ok.
  - Be more lenient when closing a path (when reading in a type1/2 font)... we can get rounding errors.
  - Add a little LogError to let the user know if there are sfnt tables we ignore.
  - Deep in the heart of Find Problems check for bad contour direction, was a bug where it looked at the wrong spline.
  - Just as it is possible to have things in 'morx' that are not in 'GSUB', it is possible that a 'GPOS' table contains no kerning information but a 'kern' table does. We used not to read 'kern' if we had 'GPOS', be a little subtler and check for the presence of a 'kern' feature inside 'GPOS' before deciding whether to read the 'kern' table.
  - The anchor control dialog didn't work for mark to mark anchors when looking at a base mark.
  - When a font contained glyphs with multiple encodings, then ff would produce bdf files with a char count which matched the # glyphs, not the number of encoding slots used.
  - In a compacted cid font, the status line (containing unicode, unicode block/name, etc) was junk.
  - Barry wants to be able to mark that it's ok for a spline to have intermediate extrema.
  - The []TeX Table checkbox was always disabled in the save font dlg.
  - The DejaVu people want to be able to associate a comment with a cvt entry.
  - Find Problems->ATT->Missing glyph name complains about the special string <Delete> which I used in Apple lookups to represent the "Delete Glyph" action that apple supports and OT does not. Don't complain about this any more.

    Add a problem which will look at the glyphs a lookup is active for, and then checks the script of each glyph against the scripts attached to the features which invoke this lookup. If the script doesn't match anything, then complain.

  - If a font contained an empty anchor class (having either no base glyphs or no mark glyphs) then when dumping out the font subsequent anchor classes got the wrong data associated with them.
  - Barry wants non-integral hints.
  - Barry points out that Scale To Em doesn't scale the guidelines.

    Barry also complains that spiro points are rounded. This is more debatable. The bezier conversion will put bezier points where there were spiros, so if we don't round the spiros we get non-integral points. But if we do round the spiros we mess up the splines. Hmm.

  - When complaining about a bad class in a mark (GPOS) sub-table, specify the name of the offending mark if we can.
- 10-Jan-2008
  - Fixed a crash bug in Auto Hint
  - Replaced the Short Cut to AutoInstr
  - In Font Info->Lookups, added to the lookup tooltip to show what contextual lookups used the current one.
- 9-Jan-2008
  - Fix some problems with AAT. Mutually exclusive features in the chain didn't get the right OffFlags set. (and didn't work).
  - Add DHint support for native & python scripts. Prevent users from specifying incorrect unit vectors for diagonal hints added via scripts. Also use stemdb.c to calculate active zones for normal (horizontal and vertical) hints added via scripts.
  - Remove my original (and not very good) auto instructor. Clean up the docs to remove references to how bad it was.
  - Add the ability to store a fontlog in the sfd file. Available to python scripting. A way to save it to FontLog.txt when generating a font. A way to modify it before generating. Normal access through Font Info.
  - Change the PfEd table so that the font comment is in utf8, and the glyph comment subtable too.

    Add subtables to hold:

    - Names of lookups and lookup subtables and anchor classes
    - Guide lines
    - Background and spiro layers
    - Font Log
  - It used to be that when a font had both 'mor[tx]' and 'GSUB' we would only read 'GSUB'. But Michel Boyer wanted to read both. So... read 'morx' after 'GSUB' and if we find a feature/setting that looks as though it corresponds to an existing OpenType lookup (which we can convert to a Mac format) then skip that feature/setting, presuming it to contain redundant data.

    This is a finer grain approach, but similar to, the previous one. There we skipped the whole table, presuming it redundant. But in CharisSIL the morx table has a lot of functionality orthogonal to GSUB. So we must parse both.

  - The 'feat' table was being output in the wrong order. Features were linked together in several ways and 'feat' followed the wrong field.
  - Two related bugs that Charis SIL invokes:
    1. This font has a contextual substitution which uses class 0 and replaces it via a nested lookup. But my feature file output could not handle class 0 (since it isn't really specified) and would crash.
    2. However, in this case class 0 was specified by the coverage table (we fixed that earlier but just for kerning classes). So now fix for contextuals.
  - Auto recovery was broken. Ever since I put in the code to ask the user what to do with a recovery file (It always recovered into a new file).
  - When FF opens a char window on my screen it has a bad habit of opening it at 40% magnification. Which means mouse clicks give things either at em or at half me positions. That's bad. Don't want the default behavior to create lots of .5 coordinate values.

    Make the window open at 33% instead.

  - FontForge warns the user when a glyph's name does not match its unicode encoding. But in the past it would do this for glyphs with multiple encodings even if the name matched one of the encodings. Fix that.
  - When FF uses doubles internally, it still outputs float precision into the sfd file. Fix that.
  - Still said "Tangent" rather than "Constraint" in points menu when in Spiro mode.
  - Ben Laenen of Deja Vu says it would be nice if sfd files stored truetype instructions as recognizable text rather that squirrily ASCII85 encoded binary data. Sounds reasonable. Might as well store 'cvt ' and 'maxp' as numbers then.
  - Remove some deprecated DStem code. Also move CVNumForePointsSelected() to charview.c and make it static (not used anywhere else except that file).
  - Sometimes the pointers to libspiro didn't get initialized.
  - If a font had no private dica and one tried to put something in it from python, ff would crash.
  - Alexej points out that my use of iconv was broken on many systems where UCS-4 is big endian on a little-endian machine.
  - Use freetype to rasterize the fill blit in the char view.
  - - In search_edge, an array subscript was sometimes -1?

    - Previously I forgot to mention Alexey's changes in DStems hinting code.

  - Simple optimization for blue zone hinting - cupped serifs should benefit most.
  - Update copyright notices. (add 2008)
  - Oops, typo in python menu code.
  - There is now an incomplete fontforge which uses the gtk toolkit.

    >     $ ./configure
    >     $ make
    >     $ make install
    >     $ make fontforgegtk
    >     $ make install_gtk

    About all it can do is open a font and display it. If a menu command does not require a dialog then it might work. There are probably scores of bugs even in the little bit that supposedly does work.

    I think the open dialog is extremely ugly. That's not my fault, that's gtk's widget. The open dialog is far less functional than the one in the gdraw fontforge -- I can't figure out how to enhance it.

  - Switching to a new internal representation of diagonal stem hints.
  - Add a mechanism to check that the executable has been configured to match the library. And include a library date stamp as well as an executable stamp.
  - In the metrics view, if I switch from outline view to bitmap view (by selecting a strike by pixel size from the view menu) then ff would crash.
  - Cleanup the library executable interface a bit more.
  - Minor tweaks to fontview.
  - - Alexey suggested improvement for HStemGeninst().
  - - Added optional experimental code for interpolating strong points.
  - Barry Schwartz wants to be able to set the "don't autohint flag" from python. I'm calling it "manualHints" though.
  - Barry Schwartz points out that the simplify flag "setstarttoextremum" is incorrectly documented. Fix that.
  - - In HStemGeninst(), new positioning method gives bizarre results for overlapping stems. Added fallback to old method.
  - Make it obvious that the Print/Display dlg HAS a menu.
  - Crossland wants a way to insert random text into the Print/Display dialog. So add the ability to generate a bunch of random words that look vaguely reasonable. (Invoked by the popup menu in the dlg).
  - Exporting spiros to a plate file produced garbage if any spiros were selected.
  - The Print dlg tended to crash if you did much editing in it.
  - When switching to spiro mode on an empty glyph (or perhaps the first glyph in a new font), FF would complain: Internal Error: Character out of bounds in bitmap font 0>=0
  - Oof. The math stuff doesn't work if device tables are disabled. fix it.
  - Fix some problems with configuration modes I don't use. Correct some pointer arguments which differ in signedness.
  - If lines are attached to both sides of a diagonal stem, then prefer the longer line's unit vector for this stem.
  - - Fixed snap_to_blues(): it used to mess global accuracy setting up.
  - - Fixed finish_stem(): it did not mark edges of previous hints as done.
  - - CHanged HStemGeninst(): it now tries to interpolate HStems within blues when possible.
  - Dave Crossland points out that ff didn't compile if --without-native-script were set.
  - Trying to change control points with the point info dlg on hv-curve points didn't work.
  - Add the ability to insert a list of words into the metrics view.
- 10-Dec-2007
  - Redo the internals of fontforge to separate the core font engine from its dependance on gdraw, and stuff all of that into libfontforge. So libfontforge no longer needs gdraw, and can be used to build another user interface with a different widget set.

    In theory.

  - Add the ability to insert a list of words into the metrics view.
  - If a font has a variant selector 'cmap' subtable, and has some unnamed glyphs then base names on the information found in the vs subtable as: (u0020.vsFE00)
  - If a font has a 'MATH' table and some unnamed glyphs then try to guess names for glyphs refered to in horizontal/vertical glyph construction tables.
  - When outputing horizontal glyph variants in the 'MATH' table I used their vertical size rather than their horizontal size.
  - Further refinements to the concept of lines: all points assigned to the same line now should have filled space at the same side. So what we used to call lines would be better called edges now. Also the handling of bounding box hints has been improved: all relevant points are now assigned to a BBox stem hint (not just one point from each side).
  - Add a user interface to control file recovery (used to be only a command line argument).
  - Patch by Barry who points out an extraneous line in the font iter by search.
  - Barry points out that there is a disconnect between the docs and the program about the "spiros" member of a Contour python object. So correct the docs to read "spiros", and change the program so it will accept "spiro" as well as "spiros".
  - Add the ability to name contours, primarily for guidelines.

    Add python support for the contour_name.

  - Add support for reading Apple's old sfnt wrapped CID format (basically the same as the sfnt wrapped 'typ1' format.
  - FF crashed on Nastaliq Navees from SIL.
    1. It has no unicode cmap (which ff handled incorrectly)
    2. It has cross-kerning (which ff doesn't handle, but still died while explaining that it didn't handle it)
  - Use routines from stemdb.c to generate active zones (or stem instances) for manually added hints. The old algorithm is still used when reading Type 1/OTF font files.
  - FontView -> Hints->Clear hints did not set the hints changed bit.
  - Erik van Blockland points out that python glyph.addPosSub doesn't check for duplicate entries and will blindly add something when it should be replacing it.
  - Also added a short cut so that it is posible to specify simple kerning by typing one number rather than requiring an additional 7 zeroes.
  - Prevent some redundant stem chunks from being generated.
  - Both Adobe Acrobat and Apple's Preview exhibit what I consider to be a bug. According to the PDF reference manual, if an Encoding dictionary is not specified for a font object then the built in encoding will be used. But both these programs reencode to AdobeStandard and do not use the font's built in encoding. GhostScript agrees with my interpretation and does not reencode.

    However, they ain't gwana change, so I must. Always dump out an Encoding dictionary even when it shouldn't be needed.

  - - Lines are more actively used: stems now have 'leftline' and 'rightline' properties, and for diagonal stems the stem unit vector is always set equal to the unit vector of the line corresponding to the left edge of the given stem;
    - I no longer attempt to calculate "active" zones for bounding box hints (they usually don't correspond to any actual glyph features and thus look ugly). So now only edges of such hints (without any active zones) are displayed in the charview;
    - diagonal stem detection improved (some checks were too strict and actually oriented to HV stems);
    - the 'blue' property is now used not only for ghost hints, but also for regular horizontal stems. This may be useful if I ever implement an autoinstructor based directly on the stem detector;
    - glyph data initialization has been separated from stem detection and put into a separate routine (a first step for unification of algorithms used to calculate stem active zones).
  - When doing a print sample to pdf, the second page came out in times bold rather than the user's font.
  - I think setting a compact encoding could overflow an allocated string array.
  - I was setting the Regular bit of OS2.fsSelection if the weight class was 400. I probably should have used 500 instead. Or maybe both. Let's try both for now.
  - If a ufo font did not have a lib.plist file (and python was enabled) then ff would crash on loading it.
  - When importing an eps file, ff did not turn off the "Bitmap-only" flag. This means that new fonts composed entirely of eps files would be treated as bitmap fonts (sometimes).
  - Moving quadratic control points with the pointer is broken (again).
  - Metricsview would crash if you deleted a character and then clicked in one of it's textfields.
  - Fix typo in stemdb.c
  - Add a Select->Open Contours command.
  - Add some serbian text (to the built in print samples).
  - Update the location on the charview info line when dragging out a guideline.
  - If a glyph had a unicode encoding for one code point, and a name which mapped to another, then double clicking on the other code point would cause fontforge to provide a reference to the base glyphs from the new encoding slot. But only in the current encoding map. In other words I forgot to set the AltUni field.
  - Some people have though winDescent should be a negative value for things below the baseline. So make the sign of the various descent fields explicit in the corresponding popup messages.
    - Typo Descent: Negative
    - Win Descent: Positive
    - Hhea Descent: Negative
  - If a user edited a glyph in spiro mode, and then did something in the fontview ehich caused the spiros to be removed (Lots of things: Overlap, Expand Stroke, Embolden, ...), and then did a Round to Int (and perhaps other things) from the font view, then FontForge would crash.

    It expected to find spiros in a glyph marked as being edited in spiro mode, and was surprised when none were available.

  - Dave Crossland doesn't like having "..." at the end of window titles.
  - Back out the Add Extrema in spiro mode patch. Turn off display of extrema in spiro mode (and of Points of Inflection too).
  - Add an autowidth command to the python interface.
  - contour.lineTo and friends didn't work (didn't increment the contour's point count).
  - With SnapToInt preference on, and at high magnifications, a mouse click would often be snapped so that it was well outside the fudge region. This meant that clicking on something might not select it.
- 10-Nov-2007
  - Another bug when loading feature files
- 9-Nov-2007
  - Introduced Raph Levien's Spiro curves. Please download libspiro before using fontforge.
  - Deal with things that got deprecated as the mac moved from 10.4 to 10.5
    - NSAddImage and family have been replaced by dlopen
    - the old mechanism for referencing a resource fork from POSIX "foo/rsrc" has changed to "foo/..namedfork/rsrc".

    The new stuff all worked as far back as 10.3 -- but FontForge source is no longer compatible with 10.2.

  - In a truetype font, if a substitution lead to an unencoded glyph and the cursor hung over the substitution long enough to invoke the popup, then we'd generate a tiny font containing just the unencoded glyph, we'd complain that there were no encoded glyphs, we'd dismiss the popup, we'd generate the glyph image, then we'd try to free it with no free function because the popup was dismissed.
  - Merge Feature File didn't actually merge things in, it forgot about existing things -- which caused problems for kerning classes which get stored in two lists.
  - Allow people to order entries in the PostScript Private dictionary (in Font Info)
  - Give the user control over how much arrow keys accelerate when holding down the Alt (Meta) key.
  - People want a Snap To Int preference item.
  - Simplify sometimes ignored points.
  - People expect to be able to drag guidelines from the rulers (because everyone else does that) and don't want to bother to learn FF's mechanism. So make that possible.
  - Dave C wants to be able to use Cntl-Tab to switch tabs in the charview.
  - If freetype gets a single point open contour in postscript mode, it simply skips the contour (does not call FT_MoveTo on it). This screwed up my attempt to match the results of freetype with the actual splines and caused a crash.
  - Glyphs with no contours didn't set widthset when read from ufo and so were viewed as empty.
  - FF was expecting descent to be a postive value in a ufo (it is in ArialBlack.ufo), but it seems to be negative in most UFOs.
  - Erik wants the creation order of contours preserved when reading a glif file.
  - Oops. glyph/glyphPen types got the wrong names in the fontforge python module. (interchanged)
  - remove the Elide command. (There's no reason to use it, Merge is always better, it just confused people.
  - Refrain from simplifying an order2 point where the second derivative changes sign.
  - If a font has no "fullname" field (and fonts aren't required to have one) ff would crash when generating the font.
  - Ability to Import/Export Raph Levien's plate file format.
  - If I moved a corner point adjacent to a tangent, the slope on the other side of the tangent did not change.
  - Exporting a glyph to BMP or PNG was broken, probably since the addition of python import export filters.
  - Add a Strftime scripting command to the legacy language.
  - Werner points out that I misspelled "persistent" as "persistant" in many places, including python member names. Correct that. (but leave the old, misspelled membernames around but undocumented in case anyone has been mislead by my previous documentation.
  - Add new python stuff to provide access to spiros.
    The fontforge module has a new method -- hasSpiro() which returns whether we've got access to libspiro or not.
    The module also has a bunch of numeric constants defined spiroG4, spiroG2, etc. for use in the
    The Contour type has a new member -- spiros which is a tuple of spiro control points (which are themselves tuples: x,y,type,flags, where type is one of the numeric constants above.
  - People would complain that the python interface would give them "Invalid second order spline" but no one bothered to give me a test case. I hope I've tracked it down now.
  - Add a "problem" to check for glyphs whose bounding boxes are: too tall, too short, too wide, too much to the left.
  - Used to be I had many problems checked by default. Best to turn them all off.
  - Oops. FF was using Py_BuildValue("s") on something that was already a python string.
  - Adam Twardoch suggests that codepoints in the PUA have their script determined by their name (rather than just returning DFLT). Since Adobe used to put things like "a.sc" in this area, that seems a good idea.
  - FF marked almost all fonts with the Oblique bit in the OS/2 table.
  - - Patch from Alexej for his diagonal hinting routines, fixes an ugly problem reported by Max Rabin.
  - Various fixes in stem detection. In particular added a concept of "base start" and "base end" for curved segments of stem edges, allowing to determine more precisely if an active zone (which merges left and right segments together) should actually be considered "curved" at its
  - Make implied points to be ignored when determining a diagonal stem validity.
  - Swith the timestamps to GMT. Prior to this all timestamps have been PS/DT, but now that other people are making source changes GMT seems more sensible.
  - Max Rabkin supplies a patch to let python import plate files.
  - A couple of new name table string ids: WWS Family & WWS Subfamily.
    Provide reasonable defaults for the wws* ttf names.
  - Correct the list of dutch font styles.
  - Most of the items in the popup menu of the lookup pane didn't work.
  - FF wasn't loading python init files from ~/.FontForge/python
  - When I fixed mark to ligature positioning I broke the other three types of anchor positioning (to base, to mark & cursive).
  - If you pressed the [*] Default check box in the Font Info->OS/2->Panose area, the values didn't go back to the defaults.
  - When copying glyphs from one font to another ff would sometimes use a temporary value of -2 for the orig_pos. This meant that reference fixups didn't work when looking at those glyphs.
  - Drat. Typo when copying a contextual lookup from one font to another caused a crash.
  - Add a new point tool which creates curved points which are always either horizontally or vertically oriented. (I call 'em hvcurves)
  - Use ~/.FontForge instead of ~/.PfaEdit
  - I'm told there was a typo in my Bulgarian text for the Print/Display dlg, and that this should fix it.
  - Get some proper Belorussian text.
  - Several bugs in my mark attachment routines. There was an assumption that only one mark could be attached to a base glyph per sub-table. This is wrong for mark to base, in that there can be several anchor classes per subtable. It is even worse for mark to ligature where there can be many marks per anchor class (one per ligature position).
  - Having done this make sure we don't use the same anchor point more than once.
  - What glyph class should be used by default if a glyph is both a ligature and a mark? Probably mark. There are greek accent ligatures, and its probably more important to treat them as marks than as ligatures (I don't know any fonts which actually "skip ligatures" but there are lots which "skip marks").
  - Select->Next/Prev Point always selected the first point. Select First point did the wrong thing.
  - Pressing the [Refresh] button could crash ff if a "FontData" depended on another (same font).
  - Someone (John ?Morrison?) requested a way to access fonts by numeric index rather than font name when opening font collections like ttc files or dfonts.
  - * I no longer have separate l/lpotential and r/rpotential pairs Â of point data objects. Instead I use just 'l' and 'r' accompanied by Â boolean flags indicating their state as "potential". This greatly Â simplifies some tests and makes the code more readable. * When I am adding a chunk based on a single point to an existing stem, Â I always mark the second point as "potential". Later this state can Â be changed if check based on the second point produces the same chunk, Â or at least doesn't produce another (conflicting) stem. Again, this Â simplifies some tests which accompany adding new chunks and makes the Â result of the stem detection less dependent from the order in which Â the points are processed. * I allow assigning a point to a stem even when its distance from the Â stem edge is larger than standard dist_error_hv or dist_error_diag, Â if only the difference between maximum possible deviations to the Â both sides of the edge doesn't exceed the double dist_error_* value. Â This prevents us from adding several almost-coincident hints, actually Â controlling the same stem. * I have added a function which performs some stem normalization, Â sorting chunks by point coordinates. For HV stems it also can Â slightly modify the positioning of the stem edges preferring the Â coordinate which is closer to most points assigned to each edge. * There is now a special function used to compare conflicting stems Â and decide if one of these two should be preferred, or they both are Â worth to be output. * The detection of serifs and similar elements, which, not being Â exactly horizontal/vertical, still have to be marked with a HV Â stem, has been improved (two points, forming a serif termination, Â now should not necessarily follow each other).
  - Drat. If we had libjpeg and not libpng we'd get a complaint about an undefined symbol.
  - Add "Mismatch Unicode & Name" to the Find Problems dlg.
  - There are ttf files in existance where glyph names do not match unicode code points. Tons of fonts use ".notdef" for glyphs other than "GID=0". Other fonts use ASCII glyph names (space, exclam, numbersign,...) for glyphs in other scripts (Kedage-n.ttf does this).
  - In the past, ff has felt that the presence of a zero-width ".null" and "nonmarkingreturn" glyph meant that a font was not mono-space. In the future ignore these glyphs when determining whether a font has fixed width.
  - in some rare cases we got an uninitialized value in spline->line display conversion.
  - Up the size of the File->Recent menu to 10, and include non-sfd files in the list.
  - The routine to create an apple state machine from a set of OpenType ('init','medi','fina','isol') forms would often crash.
  - When scaling BlueValues, or other arrays, a trailing space after the last number and before the ']' was considered an error. If found then ff would not scale that entry.
- 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 persistent data. (And write our persistent 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.

  Earlier Changes
  Changes to PfaEdit (predecessor to FontForge)