Why FontForge Simplify Causes Jagged Curves

Running the Simplify command in FontForge is a standard way to reduce redundant control points along glyph contours, but it frequently results in jagged, uneven, or flattened curves. This issue typically stems from overly aggressive tolerance settings, coordinate rounding on the font grid, and the accidental removal of structural extrema or smooth tangent constraints. Understanding how FontForge recalculates Bézier splines during simplification allows you to diagnose why curves degrade and apply the proper settings to preserve smooth outlines.

1. Excessive Error Tolerance

The core engine behind the Simplify command (Element > Simplify > Simplify) relies on a user-defined error threshold. This value defines how far the new spline can deviate from the original path. If the error tolerance is set too high, the algorithm eliminates necessary points and stretches the remaining Bézier handles across spans they cannot naturally bridge. This results in flat sections paired with sudden, sharp turns where adjacent curve segments meet at harsh angles.

2. Loss of Extrema and Inflection Points

Smooth digital curves require on-curve points at their local horizontal and vertical extrema (the highest, lowest, and widest points of a contour), as well as at points of inflection where a curve changes direction. The standard Simplify algorithm evaluates paths purely through mathematical approximation rather than typographical structure. If it deletes an extremum or an inflection point, the adjacent handles must compensate at unnatural angles, introducing noticeable kinks and asymmetrical humps.

3. Point Type Mutation and Broken Tangents

FontForge classifies points as curve, corner, or tangent points. For a junction between two Bézier curves to be visually continuous, the incoming handle, the on-curve point, and the outgoing handle must remain collinear (aligned in a straight line). Simplifying an outline often misinterprets subtle transitions, converting smooth curve points into corner points. When the handles on either side of a point are freed from collinearity, they shift independently, breaking the curvature continuity and creating an abrupt, jagged point.

4. Integer Coordinate Snapping

Font outlines in standard formats (such as PostScript/CFF and TrueType) store point positions using integer coordinates on an Em square grid. FontForge snaps point locations and Bézier control handles to the nearest whole integer. When Simplify computes new control handles over long spans, tiny rounding adjustments can severely alter the angle of a trajectory. On shallow curves, moving a handle by just one integer unit can introduce visible stepping or a jagged ripple.

5. Noisy Source Geometry

Simplification algorithms perform poorly on geometry originating from scanned or auto-traced artwork. These paths often contain clusters of microscopic segments with conflicting handle directions. When FontForge attempts to merge these erratic vectors, the algorithmic solver can produce overlapping segments or extreme handle extensions that cross over one another, producing jagged loops and sharp spikes along the contour.

How to Prevent Jagged Results

To maintain clean curves when reducing point counts:

  • Use "Simplify More": Navigate to Element > Simplify > Simplify More to open advanced controls. Lower the error threshold to make the fitting stricter.
  • Lock Tangents: In the Simplify settings, enable options that preserve point types and retain tangency along existing smooth points.
  • Add Extrema First: Run Element > Add Extrema before simplifying so the algorithm recognizes critical structural coordinates.
  • Clean Up Manually: For display typefaces or delicate curves, manually delete unnecessary points using the Delete key, which allows FontForge to heal the curve while keeping existing point constraints intact.