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:
- Open the
.fontfile — verifyfch_FileID == OTAG_ID(0x0F03). - Open the
.otagfile — verifyOT_FileIdentis present and equals the file size. Copy the entire file into memory. - Resolve
OT_Indirectreferences — tags with theOT_Indirectbit set have values that are offsets within the.otagfile, not direct values. - Pass tag list to bullet.library via
SetInfo()withOA_TagList. - Set rendering parameters: size (
OT_PointHeight,OT_PointWidth), aspect (OT_StretchX,OT_StretchY), shear (OT_ShearAngle), weight (OT_EmBolden). - Call
DescribeProperties()to get metrics (advance widths, bounding boxes). - Use
diskfont.libraryto create a standardstruct TextFontfrom the outline, which can then be used normally withSetFont()andText().
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