{"name":"FXY File Format","title":"FXY File Format","type":"topic","url":"https://community.bistudio.com/wiki/FXY_File_Format","revid":376491,"updated":"2025-10-22T15:56:34Z","aliases":["CfgFontFamilies","FXY","Fonts"],"markdown":"> **Disclaimer: This page describes internal undocumented structures of Bohemia Interactive software.**\n>\n> This page contains unofficial information.\n>\n> Some usage of this information may constitute a violation of the rights of Bohemia Interactive and is in no way endorsed or recommended by Bohemia Interactive.\n> Bohemia Interactive is not willing to tolerate use of such tools if it contravenes any general licenses granted to end users of this community wiki or BI products.\n\n### Introduction\n\nThe Operation Flashpoint and ArmA: Armed Assault engines use a limited set of bit mapped fonts developed by Bohemia Interactive for the engine. They are bitmaps and each glyph within is treated as a texture.\n\nA character set (such as [Ascii](https://en.wikipedia.org/wiki/ASCII)) is a series of 'glyphs' (characters) where any one of these characters is always identified by the same index value. For example the letter **A** is always hex **41** and so on. Regardless of the font set employed, the character set within it, is set-in-concrete. Hex 41 always renders a glyph that 'looks like' the letter A. Be it **bold**, *italic*, or fills the entire screen, it is the letter 'A'.\n\nThe character set for all BI fonts in OFP is different for each language version. For Western languages it approximates [Latin codepage 858](https://en.wikipedia.org/wiki/Code_page_858). In ArmA Unicode is used for fonts.\n\nA font set is a collection of displayable characters (termed glyphs) that have a common appearance. E.g all glyphs in THIS set are bold, or all the glyphs are italic, all the glyphs are Times Roman (seriffed).\n\nIndividual font sets exist for Tahoma, Garamond, and so on. The glyphs within these sets are contained in a series of .paa files.\n\nAnd, because these are bitmapped fonts, eg fixed dimensions, non-scaleable, there are unique font sets, for, unique sizes.\n\nFor example, in Resistance engine, the popular Tahoma font is in three different font sets. 24 point, 36 point, 48 point.\n\nA 'point' approximates 1/72th of an inch. Thus the Tahoma fonts available (for Resistance) are approximately a third, a half, and two thirds of an inch tall when displayed.\n\n### Description\n\nAn fxy file is the 'character set' index. It is, the codepage.\n\nAn fxy file is implicitly associated with one or more paa files within the same folder. The fxy file is the header entry for these files, it describes the position in the paa file and the size to be rendered on screen, for a 'glyph'.\n\nAssociation of files between fxy and paa is implicit. The CourierNewB64.fxy is implicitly associated with the CourierNewB64-xx.paa file(s). xx indicating one of several CourierNewB64 paa's.\n\n#### Legend\n\nsee Generic FileFormat Data Types.\n\n#### Struct\n\n```cpp\nFxy\n{\n// ===== ARMA ONLY ========\n    char MimeType[4];    // e.g \"BIFo\", BI Font\n    ulong Version;        // 0x101 == Arma 1 and 2\n                        // 0x102 == Arma 3\n// =========================\n    FxyEntry    Entry1;\n//    (...)\n    FxyEntry    EntryLast;\n}\n```\n\n##### FxyEntry\n\n```cpp\nFxyEntry\n{\n    ushort CharCode;        // '''0x21''' = 'A' <<< see note\n    ushort PaaFileNumber;    // 01\n    ushort X,Y;                // Offset (in pixels) in the paa file, to the Top-left of this glyph.\n    ushort Width,Height;    // area (number of) pixels used from the paa file for this glyph.\n    ushort KerningWidth;    // ARMA only. Width used to determine this character spacing\n};\n```\n\nApart from the ARMA header (in Arma fxy files only), the fxy is a contiguous series of 12 byte (ofp) or 14 byte (Arma) entries.\n\n##### CharCode\n\nOFP uses a USASCII character set. Arma uses Unicode.\n\nThe first 256 unicodes ARE us-ascii. For this reason, the first 32 (x20) glyphs in EITHER character set, are control characters, never intended for display, and not included in the paa file(s) nor the fxy header. For that reason, in all circumstances, *the* displayed character is charcode+x20. Thus\n\n```\n'Actual Character' = charcode + x20;\n```\n\n```\nCharcode x21 = index-entry = x21 = character x20 + x21 = 0x41 = Glyph 'A'.\n```\n\nThis is a constant, irrespective of the number of fxy tables (fonts) now or in the future. Charcode x21 can only ever be glyph 'A' (rendered in whatever style and size the font wants to render it)\n\n- For Operation Flashpoint, there are 224 entries in any fxy table (which therefore covers the 256 (224 + 32) possible us ascii 'characters').\n- Armed Assault fxy's have 448 character entries + 16 specials, as each font supports both Western European, Eastern European and Cyrillic character sets.\n\nBearing in mind that basic 16 bit Unicode can display 65,000 glyphs, standard Arma fonts only use (and are only capable of displaying) a small selection:\n\n- x20...17F Us Ascii + (most) European Languages\n- 400...45F Cyrillic\n- 2010...201F Special chars. unknown how they work.\n\nYou could extend this range in custom fonts of course to whatever you need from 16bit Unicode.\n\nNote that index entries happen to be linear sequential. The nth index entry is also CharCode n. Which way, the engine actually accesses this table for character 'n' is up to the engine.\n\n##### PaaFileNumber\n\n`-number` of texture file:\nThis is simply a convenience to allow large fonts to be spread across several paa's. For example if font name is \"CourierNewB64\":\n\n- The fxy file is `CourierNewB64.fxy`\n- The first texture file is `CourierNewB64-01.paa`\n- The second texture file is `CourierNewB64-02.paa`\n- etc.\n\n> [!NOTE]\n> Note that you cannot assume the glyph character 'A' (nor any other glyph) is ordered the same way in any given paa font-set, nor, in fact that the glyph will 'always be' in e.g fontfile 1.\n\nOrder of glyphs is entirely random in the sense that binarising these files uses a 'best fit' method to squeeze as much content into that file. Not perfect, but not badly done either.\n\n### Usage\n\nThis example uses the new font name in a Description.ext:\n\n```cpp\nclass RscText\n{\n    type = CT_STATIC;\n    idc = -1;\n    style = ST_LEFT;\n    colorBackground[] = { 0, 0, 0, 0 };\n    colorText[] = { 1, 1, 1, 1 };\n    font = Bitstream;\n    sizeEx = 0.04;\n};\n```\n\n### Paa Content\n\n#### Resistance\n\n.paa files used for the font must be in 8080 format: (Alpha luminosity)\n\n- 8bit - Brightness (all with 255 value - \"white\")\n- 8bit - Alpha (255 for character, 0 for space)\n\n#### Armed Assault\n\nArmA Glyph files (paa) are formatted in DXT5 compressed textures. Using the TAGG labelling, they must additionally specify:\n\n```\nAvg Color: any\nMax Color: always FFFFFFFF\nAlphaFlag: 1\n```\n\n### Available Fonts\n\n#### Arma 3\n\nThese fonts can be found in CfgFontFamilies:\n\n- Caveat\n- EtelkaMonospacePro\n- EtelkaMonospaceProBold\n- EtelkaNarrowMediumPro\n- LCD14\n- LucidaConsoleB\n- PuristaBold\n- PuristaLight\n- PuristaMedium\n- PuristaSemibold\n- RobotoCondensed\n- RobotoCondensedBold\n- RobotoCondensedLight\n- TahomaB\n\n#### Arma 2\n\n- LucidaConsoleB\n- Zeppelin33\n- Zeppelin33Italic\n- Zeppelin32\n- EtelkaNarrowMediumPro\n- Bitstream\n- TahomaB\n- EtelkaMonospaceProBold\n\n#### Armed Assault\n\n- Arial Bold 7 -> 24 pt\n- BitStream\n- Versans bold 7 -> 20, 22, 28 pt\n- Zeppelin32 12 -> 20, 22, 28 pt\n- Zeppelin33 12 -> 20, 22, 28 pt\n- Zeppelin33 italic 12 -> 20, 22, 28pt\n\n#### Operation Flashpoint: Elite\n\n- Arial Bold 7, 8, 10, 11, 12 pt\n- Arial Italic 9, 13, 18, 48 pt\n- CourierNew 9pt\n- Hel67-CM 10, 11 pt\n- HelvCondLight 8, 9, 10 pt\n- Helvetica-Narrow 11pt\n- Helvetica-Narrow Bold 8pt\n- Helvetica37-CondensedThin bold 10pt\n- Helvetica57-Condensed 10, 13, 16pt\n- Helvetica57-Condensed 9, 13, 14 pt Bold\n- Helvetica67-Condensed 9, 10, 11pt Medium\n- HelveticaNarrow 10, 11pt\n- HelveticaNarrow bold 10, 13, 18, 22pt\n- HelveticaNeue 10 -> 14, 22pt\n- HelveticaNeue Bold 22pt\n- LucidaConsole Bold 8, 11pt\n- MSS Bold 9pt\n- System 10pt\n- System Bold 10pt\n- Tahoma 10, 11, 12, 14, 16, 20, 21pt\n- Tahoma bold 5, 6, 7, 9 -> 14, 16, 20, 21pt\n- Tahoma Bold Italic 12pt\n\n#### Operation Flashpoint\n\n- AudreysHand Italic 48pt\n- AudreysHand Bold 48pt\n- CourierNew Bold 64pt\n- Garamond 64pt\n- Steelfish bold 64, 128pt\n- SteelfishCE bold 64 pt\n- Tahoma bold 24, 36, 48pt","sections":[{"heading":null,"level":1,"markdown":"> **Disclaimer: This page describes internal undocumented structures of Bohemia Interactive software.**\n>\n> This page contains unofficial information.\n>\n> Some usage of this information may constitute a violation of the rights of Bohemia Interactive and is in no way endorsed or recommended by Bohemia Interactive.\n> Bohemia Interactive is not willing to tolerate use of such tools if it contravenes any general licenses granted to end users of this community wiki or BI products."},{"heading":"Introduction","level":3,"markdown":"The Operation Flashpoint and ArmA: Armed Assault engines use a limited set of bit mapped fonts developed by Bohemia Interactive for the engine. They are bitmaps and each glyph within is treated as a texture.\n\nA character set (such as [Ascii](https://en.wikipedia.org/wiki/ASCII)) is a series of 'glyphs' (characters) where any one of these characters is always identified by the same index value. For example the letter **A** is always hex **41** and so on. Regardless of the font set employed, the character set within it, is set-in-concrete. Hex 41 always renders a glyph that 'looks like' the letter A. Be it **bold**, *italic*, or fills the entire screen, it is the letter 'A'.\n\nThe character set for all BI fonts in OFP is different for each language version. For Western languages it approximates [Latin codepage 858](https://en.wikipedia.org/wiki/Code_page_858). In ArmA Unicode is used for fonts.\n\nA font set is a collection of displayable characters (termed glyphs) that have a common appearance. E.g all glyphs in THIS set are bold, or all the glyphs are italic, all the glyphs are Times Roman (seriffed).\n\nIndividual font sets exist for Tahoma, Garamond, and so on. The glyphs within these sets are contained in a series of .paa files.\n\nAnd, because these are bitmapped fonts, eg fixed dimensions, non-scaleable, there are unique font sets, for, unique sizes.\n\nFor example, in Resistance engine, the popular Tahoma font is in three different font sets. 24 point, 36 point, 48 point.\n\nA 'point' approximates 1/72th of an inch. Thus the Tahoma fonts available (for Resistance) are approximately a third, a half, and two thirds of an inch tall when displayed."},{"heading":"Description","level":3,"markdown":"An fxy file is the 'character set' index. It is, the codepage.\n\nAn fxy file is implicitly associated with one or more paa files within the same folder. The fxy file is the header entry for these files, it describes the position in the paa file and the size to be rendered on screen, for a 'glyph'.\n\nAssociation of files between fxy and paa is implicit. The CourierNewB64.fxy is implicitly associated with the CourierNewB64-xx.paa file(s). xx indicating one of several CourierNewB64 paa's."},{"heading":"Legend","level":4,"markdown":"see Generic FileFormat Data Types."},{"heading":"Struct","level":4,"markdown":"```cpp\nFxy\n{\n// ===== ARMA ONLY ========\n    char MimeType[4];    // e.g \"BIFo\", BI Font\n    ulong Version;        // 0x101 == Arma 1 and 2\n                        // 0x102 == Arma 3\n// =========================\n    FxyEntry    Entry1;\n//    (...)\n    FxyEntry    EntryLast;\n}\n```"},{"heading":"FxyEntry","level":5,"markdown":"```cpp\nFxyEntry\n{\n    ushort CharCode;        // '''0x21''' = 'A' <<< see note\n    ushort PaaFileNumber;    // 01\n    ushort X,Y;                // Offset (in pixels) in the paa file, to the Top-left of this glyph.\n    ushort Width,Height;    // area (number of) pixels used from the paa file for this glyph.\n    ushort KerningWidth;    // ARMA only. Width used to determine this character spacing\n};\n```\n\nApart from the ARMA header (in Arma fxy files only), the fxy is a contiguous series of 12 byte (ofp) or 14 byte (Arma) entries."},{"heading":"CharCode","level":5,"markdown":"OFP uses a USASCII character set. Arma uses Unicode.\n\nThe first 256 unicodes ARE us-ascii. For this reason, the first 32 (x20) glyphs in EITHER character set, are control characters, never intended for display, and not included in the paa file(s) nor the fxy header. For that reason, in all circumstances, *the* displayed character is charcode+x20. Thus\n\n```\n'Actual Character' = charcode + x20;\n```\n\n```\nCharcode x21 = index-entry = x21 = character x20 + x21 = 0x41 = Glyph 'A'.\n```\n\nThis is a constant, irrespective of the number of fxy tables (fonts) now or in the future. Charcode x21 can only ever be glyph 'A' (rendered in whatever style and size the font wants to render it)\n\n- For Operation Flashpoint, there are 224 entries in any fxy table (which therefore covers the 256 (224 + 32) possible us ascii 'characters').\n- Armed Assault fxy's have 448 character entries + 16 specials, as each font supports both Western European, Eastern European and Cyrillic character sets.\n\nBearing in mind that basic 16 bit Unicode can display 65,000 glyphs, standard Arma fonts only use (and are only capable of displaying) a small selection:\n\n- x20...17F Us Ascii + (most) European Languages\n- 400...45F Cyrillic\n- 2010...201F Special chars. unknown how they work.\n\nYou could extend this range in custom fonts of course to whatever you need from 16bit Unicode.\n\nNote that index entries happen to be linear sequential. The nth index entry is also CharCode n. Which way, the engine actually accesses this table for character 'n' is up to the engine."},{"heading":"PaaFileNumber","level":5,"markdown":"`-number` of texture file:\nThis is simply a convenience to allow large fonts to be spread across several paa's. For example if font name is \"CourierNewB64\":\n\n- The fxy file is `CourierNewB64.fxy`\n- The first texture file is `CourierNewB64-01.paa`\n- The second texture file is `CourierNewB64-02.paa`\n- etc.\n\n> [!NOTE]\n> Note that you cannot assume the glyph character 'A' (nor any other glyph) is ordered the same way in any given paa font-set, nor, in fact that the glyph will 'always be' in e.g fontfile 1.\n\nOrder of glyphs is entirely random in the sense that binarising these files uses a 'best fit' method to squeeze as much content into that file. Not perfect, but not badly done either."},{"heading":"Usage","level":3,"markdown":"This example uses the new font name in a Description.ext:\n\n```cpp\nclass RscText\n{\n    type = CT_STATIC;\n    idc = -1;\n    style = ST_LEFT;\n    colorBackground[] = { 0, 0, 0, 0 };\n    colorText[] = { 1, 1, 1, 1 };\n    font = Bitstream;\n    sizeEx = 0.04;\n};\n```"},{"heading":"Paa Content","level":3,"markdown":""},{"heading":"Resistance","level":4,"markdown":".paa files used for the font must be in 8080 format: (Alpha luminosity)\n\n- 8bit - Brightness (all with 255 value - \"white\")\n- 8bit - Alpha (255 for character, 0 for space)"},{"heading":"Armed Assault","level":4,"markdown":"ArmA Glyph files (paa) are formatted in DXT5 compressed textures. Using the TAGG labelling, they must additionally specify:\n\n```\nAvg Color: any\nMax Color: always FFFFFFFF\nAlphaFlag: 1\n```"},{"heading":"Available Fonts","level":3,"markdown":""},{"heading":"Arma 3","level":4,"markdown":"These fonts can be found in CfgFontFamilies:\n\n- Caveat\n- EtelkaMonospacePro\n- EtelkaMonospaceProBold\n- EtelkaNarrowMediumPro\n- LCD14\n- LucidaConsoleB\n- PuristaBold\n- PuristaLight\n- PuristaMedium\n- PuristaSemibold\n- RobotoCondensed\n- RobotoCondensedBold\n- RobotoCondensedLight\n- TahomaB"},{"heading":"Arma 2","level":4,"markdown":"- LucidaConsoleB\n- Zeppelin33\n- Zeppelin33Italic\n- Zeppelin32\n- EtelkaNarrowMediumPro\n- Bitstream\n- TahomaB\n- EtelkaMonospaceProBold"},{"heading":"Armed Assault","level":4,"markdown":"- Arial Bold 7 -> 24 pt\n- BitStream\n- Versans bold 7 -> 20, 22, 28 pt\n- Zeppelin32 12 -> 20, 22, 28 pt\n- Zeppelin33 12 -> 20, 22, 28 pt\n- Zeppelin33 italic 12 -> 20, 22, 28pt"},{"heading":"Operation Flashpoint: Elite","level":4,"markdown":"- Arial Bold 7, 8, 10, 11, 12 pt\n- Arial Italic 9, 13, 18, 48 pt\n- CourierNew 9pt\n- Hel67-CM 10, 11 pt\n- HelvCondLight 8, 9, 10 pt\n- Helvetica-Narrow 11pt\n- Helvetica-Narrow Bold 8pt\n- Helvetica37-CondensedThin bold 10pt\n- Helvetica57-Condensed 10, 13, 16pt\n- Helvetica57-Condensed 9, 13, 14 pt Bold\n- Helvetica67-Condensed 9, 10, 11pt Medium\n- HelveticaNarrow 10, 11pt\n- HelveticaNarrow bold 10, 13, 18, 22pt\n- HelveticaNeue 10 -> 14, 22pt\n- HelveticaNeue Bold 22pt\n- LucidaConsole Bold 8, 11pt\n- MSS Bold 9pt\n- System 10pt\n- System Bold 10pt\n- Tahoma 10, 11, 12, 14, 16, 20, 21pt\n- Tahoma bold 5, 6, 7, 9 -> 14, 16, 20, 21pt\n- Tahoma Bold Italic 12pt"},{"heading":"Operation Flashpoint","level":4,"markdown":"- AudreysHand Italic 48pt\n- AudreysHand Bold 48pt\n- CourierNew Bold 64pt\n- Garamond 64pt\n- Steelfish bold 64, 128pt\n- SteelfishCE bold 64 pt\n- Tahoma bold 24, 36, 48pt"}],"categories":["ArmA: Armed Assault: File Formats","Real Virtuality File Formats"],"groups":["Tools and File Formats"]}