Bullet Library and Outline Fonts

bullet.library (V38+) is the AGFA/Compugraphic IntelliFont scaling engine. It enables outline font rendering: arbitrary sizing, rotation, shearing, and emboldening of typefaces installed via the Fountain utility.

What bullet.library does

  • Rasterize a typeface to any horizontal/vertical resolution
  • Rotate glyph baselines to any angle
  • Shear glyphs (italic) from -45° to +45°
  • Kerning table access for proper letter spacing
  • Algorithmic emboldening (bold effect without a separate font)

How outline fonts work on Amiga

Amiga fonts come in pairs: - .font — font contents file (FontContentsHeader). The fch_FileID field tells the type: OFI_ID for bitmap fonts, OTAG_ID (0x0F03) for outline fonts. - .otag — outline tag file (for outline fonts only). Contains a TagItem list describing the typeface.

Outline fonts are installed in FONTS:_bullet/ (or FONTS:_pointsize/ for bitmap). The Fountain/Intellifont utility manages installation.

Using outline fonts programmatically

The BulletLibrary tutorial describes a multi-step process:

  1. Open the .font file — verify fch_FileID == OTAG_ID (0x0F03).
  2. Open the .otag file — verify OT_FileIdent is present and equals the file size. Copy the entire file into memory.
  3. Resolve OT_Indirect references — tags with the OT_Indirect bit set have values that are offsets within the .otag file, not direct values.
  4. Pass tag list to bullet.library via SetInfo() with OA_TagList.
  5. Set rendering parameters: size (OT_PointHeight, OT_PointWidth), aspect (OT_StretchX, OT_StretchY), shear (OT_ShearAngle), weight (OT_EmBolden).
  6. Call DescribeProperties() to get metrics (advance widths, bounding boxes).
  7. Use diskfont.library to create a standard struct TextFont from the outline, which can then be used normally with SetFont() and Text().

Tags (from diskfont/diskfonttag.h)

Key outline tags: - OT_FileIdent — file identifier (level 1, required) - OT_FontName — font name (indirect) - OT_Family — font family name (indirect) - OT_PointHeight / OT_PointWidth — desired size - OT_ShearAngle — italic angle (-45 to 45) - OT_EmBolden — bold amount - OT_RotateSin / OT_RotateCos — rotation parameters - OT_IsExtended — extended encoding (Unicode-ready)

Tags are level 1 (required), level 2 (optional), or level 3 (optional). See <diskfont/diskfonttag.h> for the full list.

Practical shortcut: diskfont.library

For most applications, diskfont.library wraps the bullet.library complexity:

struct TextFont *OpenDiskFont(struct TextAttr *ta);

If the requested font is an outline font, OpenDiskFont() automatically uses bullet.library to rasterize it at the requested size. You get back a standard TextFont that works everywhere — SetFont(), Text(), etc.

See Also


Sources: Commodore-Amiga, Inc., "Bullet Library and Compugraphic Typefaces" tutorial (1991-1993). Raw: raw/tutorials/locale-datatypes-bullet.md Updated: 2026-08-04