CHAPLAIN: |
Current changes
Changes to PfaEdit (predecessor to
FontForge)
Changes to the sfd format.
Changes to create a stub Mac application. Add an apple event handler to fontforge so that it will notice when the finder wants it to open files. Add icons, etc. so it will look like a mac app.
With layers that should all change. We should only set the width if there is nothing in any of the potential foreground layers. Don't count the background layers or the grid psuedo layer. Don't count open contours (might be a secondary guide line layer or something). If we're going to clear a layer before pasting (normal behavior in fontview) then don't count the layer cleared.
Also allow the user to specify exactly how many ligature carets s/he wants rather than just setting a minimum bound.
Also 'lcar' (Apple) output was broken.
Also neither AAT nor OpenType supports negative lig carets, so if the user drags a lig caret line negative, have it stick at 0.
We don't generate version 4 yet, and we won't for a while. Version 4 will include the ability to insert backslash newline into long lines. This is so we can conform to the internet requirements of fewer than 990 bytes on a line. And the delay is so that people don't scream at me for making an incompatible change to the format -- if I give the parser time to perculate through the user community, with luck no one will even notice -- especially as long lines are rare.
Actually it's worse than that, the spec says that if there are too many things on the stack then start parsing the stack from the unexpected end.
Adobe have admitted that the obvious reading of their spec is incorrect (they can't quite bring themselves to say the spec is wrong). So revert some of the way we were parsing type2 charstrings.
(Only do this if font doesn't use these areas).
Fix a couple of other foreground specific things too.
Do something similar for bad transformation matrices (those with members 2 or more (or less than -2)).
(setting is sticky).
glyph.altuni
either None, or a tuple of tuples, one sub-tuple for each alternate. each sub-tuple is (alternate-unicode, variation selector (or -1), reserved for future=0 now).
Provide some icons
Also update the install procedure to put them in the right place.
Preference item containing a directory from which to read icon files
(also boxify the Find Problems dlg).
Also add a bookmark (and back/forward) mechanism.
$ fontforge
http://openfontlibrary.org/people/Nasenbaer/Nasenbaer_-_Widelands.ttf
Also, was a crash bug when mixing a font with a baseline table and a font without one (in the disply dlg).
Element->Insert Text
Outlines)
It adds the text outlines directly (instead of a draw command
using another font) because most fonts can't include text drawing in their
glyphs. Also include a Bind to Path variant.
This could be used to produce a grid of guidelines, or, in conjunction with
Element->Overlap->Intersec
t it could provide a poor man's
"Pattern Fill" (Since Pattern fills are only available in type3 fonts this
sort of makes them work for any font type).
Add python scripting (font.horizontalBaseline, font.verticalBaseline) too.
Add support under Show ATT.
Remove the old vertical origin field.
./configure --enable-type3
is specified, of course.
Also add support for cliping paths
Make fonts containing images work in pdf output.
The big change in this release is that every font database can now contain multiple layers. Before this all layers in a font used the same type of splines and there were only 2 or 3 of them.
Now there may be any number of layers, and each layer can contain different types of splines -- so one database can contain both quadratic and cubic data and can store data for both PostScript and TrueType fonts.
In a normal font all glyphs have the same number of layers (this is not true
in a type3 font, which each glyph may have it's own set of layers). You may
set the number, names and types of layers width the Element->Font
Info->Layers
pane.
In the font view you can select which layer is active (and displayed) with
the View->Layers
menu item. You can copy selected glyphs
of one layer to another (automagically adjusting the spline type if needed)
with Edit->Copy Layer To Layer
. You can compare to layers
for differences with Element->Compare Layers...
.
In the character view the Layers palette has changed. The things which controlled
the visibility of hints have moved to the View->Show
menu
(as have some other entries that used to be in the top level
View
menu). The layers palette solely displays the glyph's layers
and controls which layer is active.
The File->Generate Fonts...
dialog allows you to specify
which layer is to go into the font. Note that many things remain common:
the hints and truetype instructions apply to all layers. GPOS, GSUB, kern,
and morx information is common all layers. The outlines may differ in detail,
but outlines from which a font will be generated should have the same shape.
Add new python stuff to handle layers:
font.layers[1].name = "Foreground" font.layers[0].is_quadratic = TRUE
del font.layers["Extra layer"]
font.layers.add("name",is_quadratic)
(this object has an iterator which returns the names of all layers)
So the command line now takes an --allglyphs argument, and the scripting open commands now take a value of 4 for the openflags argument to mean this.
(If you hold down the <Alt> key when you select the menu item, FF will leave the ellipse it calculated in the background layer. That was a debugging technique but I thought it was kind of interesting and left it in.)
If a line's unit vector is close enough to the font's italic slant, then prefer the unit vector based on the italic slant instead.
Added an experimental mode which allows to build glyph data based on a preexisting hint layout and extend it with additional stems.
(Also provide default values now when [Add]ing private entries in Font Info.
He also tells me that the internationalized weight classes don't get parsed properly.
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.
Change the "Ref with bad ttf transformation" so that it checks for integral coordinates too.
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.
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.
Add subtables to hold:
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.
Make the window open at 33% instead.
- Previously I forgot to mention Alexey's changes in DStems hinting code.
$ ./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.
In theory.
Add python support for the contour_name.
However, they ain't gwana change, so I must. Always dump out an Encoding dictionary even when it shouldn't be needed.
It expected to find spiros in a glyph marked as being edited in spiro mode, and was surprised when none were available.
The new stuff all worked as far back as 10.3 -- but FontForge source is no longer compatible with 10.2.
Edit->Select->Autohintable
$ ./configure --enable-pyextension
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).
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 limited to 1024 bytes, but I don't pay any attention to that restriction, and will stuff arbetrary sized images into these things.
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).
Added some new members to glyph:
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.
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.
So I've added a Ligature Caret count to the Element->Glyph Info dialog to give the user control over it when necessary.
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.
% 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...
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.
File->Merge Kern Info
to
File->Merge Feature Info
Edit->Copy Lookup Data
)
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.
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).
Pairwise positioning lookups could also get their device table offsets screwed up.
fontforge.FontView.FontSize: 24
[a-z] a b => does nothing a b [a-z] => does nothing a b => substitutes
will only substitute of "ab" is a word all to itself.
Make the "+" operator concatenate arrays
[1,2] + [3,4] == [1,2,3,4] [1,2] + 3 == [1,2,3]
There was no objection.
I have now removed them.
I also made the SetPrefs scripting function sort of work if the user tries to set one of these (it will set the appropriate flags in the default option set used by generate).
The defaults of these flags were different on the Mac from everywhere else. This meant that a script could do different things on the Mac and on linux. That seems like a bad idea. I have changed things so that the default options setting for generate is always OpenType.
THIS IS AN INCOMPATIBLE CHANGE AND SCRIPTS ON THE MAC COULD NOW BEHAVE DIFFERENTLY.
Legacy programs will not work when given a font in the correct format. New programs should be able to handle either correct or broken 'size' features.
A few of Adobe's programs make use of the 'size' feature, and XeTeX does. I know of no others (besides font editors). Both intend to upgrade their programs... So this may be less of an issue than I initially feared.
FontForge should now be able to read in a size feature in either format and gives the user the option of producing 'size' features in either format on output.
Windows won't use a font where the codepages field is 0.
The first sets the start point of each contour to the leftmost point, while the second orders the contours by their leftmost points. This will slightly reduce the size of output charstrings. It will also make more things available to be put in subroutines.
Use the appropriate defn for the version we happen to be outputting.
Both will select all encoding slots containing the named glyph (or unicode value)
Now if the pagesize has not been set, don't specify a PageSize to setpagedevice.
I added the following new scripting functions:
I added the following new scripting functions:
Actually ALL glyphs in a monospace font should default to the mono-space width rather than 1em.
These search all selected glyphs, looking for any references in those glyphs with the given name/unicode value, and then translating the reference by (xoff,yoff) or positioning the reference absolutely at (x,y).
There are two problems with this:
instead figure widths out after all pastes have completed, looking at the use_my_metrics bit to get things right.
Setting this bit should give you a symbol encoding as well as all the other encodings you've set bits for. It doesn't work under windows. It doesn't work. TrueType fonts do not provide a symbol encoding, while 'CFF ' fonts only provide a symbol encoding. But hey, let's support it anyway!
change View->Goto to know about this range as MS Symbol.
On the other hand some people might want to make fonts that only work on macs. So add a configure flag.
(just to scripting)
So the script sub-table of both GPOS/GSUB should contain all scripts used in either (rather than just the scripts used in the current one).
(Behavior in the outline view when there is a selection remains the same. So if the endpoints of a spline are both selected then all local extrema will be added to that spline, no matter how long it may be).
HheadAOffset: 0 HheadDOffset: 0
to be:
HheadAOffset: 1 HheadDOffset: 1
cos(y-axis-rotation) | 0 |
0 |
cos(x-axis-rotation) |
FontForge was first released on 2-Mar-2004. An earlier version of the program, called PfaEdit, was begun in Sept of 2000, released on the web 7-Nov-2000, and moved to pfaedit.sf.net on 21-Apr-2001.