Advanced Search
Apple Developer Connection
Member Login Log In | Not a Member? Contact ADC



TrueEdit Technical Reference


This appendix documents miscellaneous internal technical details of TrueEdit which may be of interest to font developers.

TrueEdit source table formats

Much of the binary data in the mort, kern, and just tables is compiled from source-format tables. These source tables have names of the form TRnn, where nn is a two-digit number. (The EDT0 and EDT1 tables are not used by TrueEdit.)

In general, source tables are introduced only when necessary; whenever possible, the binary data is decompiled instead. One kind of data that is very difficult (or impossible) to decompile is a state table; therefore, for each kind of state table that may be present in a font, a corresponding source table has been defined.

The usage and formats of all the TRnn tables currently used by TrueEdit are documented below.

TR00: Required Ligatures

The TR00 table is used to compile the mort subtable that implements the Required Ligatures feature setting. It has the following format:
Type Name Description
uint16 nLigs The number of ligatures in the table
SrcLig ligArray[nLigs] The ligatures list, sorted in increasing dictionary order of the component glyph ids. (By "dictionary order", what is meant is the ordering of strings as in a dictionary, i.e. sorting on the first glyph, then on the second, then on the third, and so on.)

Each SrcLig has the following format:
Type Name Description
uint16 ligGlyphId The glyph ID of the ligature
uint16 nComps The number of component glyphs in the ligature (2 or 3)
uint16 compGlyphIds[3] The glyph IDs of the component glyphs

TR01: Common Ligatures

The TR01 table is used to compile the mort subtable that implements the Common Ligatures feature setting. It has the same format as the TR00 table.

TR02: Rare Ligatures

The TR02 table is used to compile the mort subtable that implements the Rare Ligatures feature setting. It has the same format as the TR00 table.

TR03: Logos

The TR03 table is used to compile the mort subtable that implements the Logos feature setting. It has the same format as the TR00 table.

TR04: Rebus Pictures

The TR04 table is used to compile the mort subtable that implements the Rebus Pictures feature setting. It has the same format as the TR00 table.

TR05: Cursive

The TR05 table is used to compile the mort subtable that implements the Cursive feature setting.

At the moment, this table is capable of implementing only the kind of cursive script found in Arabic text. It is not capable of implementing Roman cursive text. At some point in the future TrueEdit may support Roman cursive, at which time the format of this table will have to change.


The TR05 table currently has the following format:

Type Name Description
int32 numQuadruples The number of cursive entries in the table
int32 numKashidas The number of kashida glyphs in the table
int32 numVowels The number of vowel glyphs in the table
uint16 firstKashida The smallest kashida glyph ID in the table
uint16 lastKashida The largest kashida glyph ID in the table
uint16 firstVowel The smallest vowel glyph ID in the table
uint16 lastVowel The largest vowel glyph ID in the table
uint16 firstSole The smallest standalone glyph ID in the table
uint16 lastSole The largest standalone glyph ID in the table
uint16 firstFinal The smallest final glyph ID in the table
uint16 lastFinal The largest final glyph ID in the table
uint16 kashidas[numKashidas] The glyph IDs of the kashidas in the table, in increasing glyph ID order
uint16 vowels[numVowels] The glyph IDs of the vowels in the table, in increasing glyph ID order
QuadrupleRec quads[numQuadruples] The list of cursive entries in the table, sorted in increasing order of the glyph ID of the standalone form of the glyph in each cursive entry


Each QuadrupleRec has the following format:
Type Name Description
uint16 sole The glyph ID of the standalone form of the glyph
uint16 final The glyph ID of the final form of the glyph
uint16 medial The glyph ID of the medial form of the glyph
uint16 initial The glyph ID of the initial form of the glyph

TR06: Show Diacritics

The TR06 table is used to compile the mort subtable that implements the Show Diacritics feature setting. It has the same format as the TR00 table.

TR07: Hide Diacritics

The TR07 table is used to compile the mort subtable that implements the Hide Diacritics feature setting. It has the same format as the TR00 table.

TR08: Ordinals

The TR08 table is used to compile the mort subtable that implements the Ordinals feature setting. It has the following format:
Type Name Description
uint16 numDigits The number of digit glyphs in the table
uint16 numLetters The number of (letter, superior) entries in the table
uint16 firstDigit The smallest digit glyph ID in the table
uint16 lastDigit The largest digit glyph ID in the table
uint16 firstLetter The smallest letter glyph ID in the table
uint16 lastLetter The largest letter glyph ID in the table
DigitRec digits[numDigits] The list of digits that can take ordinals, sorted in increasing glyph ID order
LetterRec letters[numLetters] The list of (letter, superior) entries, sorted in increasing order of letter glyph ID


Each DigitRec has the following format:
Type Name Description
uint16 digit The glyph ID of a digit
Boolean selectionFlag A flag indicating whether the corresponding cell in the TrueEdit edit window is currently selected (i.e., highlighted)


Each LetterRec has the following format:
Type Name Description
uint16 letter The glyph ID of a letter
uint16 superior The glyph ID of the superior form of the letter
Boolean selectionFlag A flag indicating whether the corresponding cell in the TrueEdit edit window is currently selected (i.e., highlighted)

TR09: Vertical Fractions

The TR09 table is used to compile the mort subtable that implements the Vertical Fractions feature setting. It has the same format as the TR00 table.

TR10: Diagonal Fractions

The TR10 table is used to compile the mort subtable that implements the Diagonal Fractions feature setting. It has the following format:
Type Name Description
uint16 numTriplets The number of (digit, numerator, denominator) entries in the table
uint16 numSlashes The number of slash glyphs in the table
uint16 firstSlash The smallest slash glyph ID in the table
uint16 lastSlash The largest slash glyph ID in the table
uint16 firstDigit The smallest digit glyph ID in the table
uint16 lastDigit The largest digit glyph ID in the table
uint16 firstLower The smallest denominator glyph ID in the table
uint16 lastLower The largest denominator glyph ID in the table
SlashRec slashes[numSlashes] The list of slashes, sorted in increasing glyph ID order
TripletRec triplets[numTriplets] The list of (digit, numerator, denominator) entries, sorted in increasing order of the digit glyph IDs


Each SlashRec has the following format:

Type Name Description
uint16 glyphId The glyph ID of the slash
Boolean selectionFlag A flag indicating whether the corresponding cell in the TrueEdit edit window is currently selected (i.e. highlighted)


Each TripletRec has the following format:

Type Name Description
uint16 digit The glyph ID of a digit
uint16 upper The glyph ID of the numerator form of that digit
uint16 lower The glyph ID of the denominator form of that digit
Boolean selectionFlag A flag indicating whether the corresponding cell in the TrueEdit edit window is currently selected (i.e. highlighted)

TR11: Contextual Kerning

The TR11 table is used to compile the kern subtable that implements Contextual Kerning. It has the following format:

Type Name Description
KernOctalRec octals[] The list of contextual kerning entries. Each entry describes a sequence of up to eight glyphs, as well as the kerning values between these glyphs. The number of entries in the table is determined by dividing the size of the table by the size of an entry

Each KernOctalRec has the following format:

Type Name Description
unsigned short numGlyphs The number of glyphs in the contextual kerning string
unsigned short glyphs[8] The glyph IDs of the glyphs composing the string
int16 kernVals[7] The kerning values that apply between the glyphs in the string
Boolean selectionFlag A flag indicating whether the corresponding row in the TrueEdit edit window is currently selected (i.e. highlighted)

 

TR12: Class-Based Kerning

The TR12 table is used to compile the kern subtable that implements Class-Based Kerning. Its format is not documented here because this table may be removed in future versions of TrueEdit.

[Sticky!]

TR13: Justification

The TR13 table is used to compile the just table, which implements Justification. Its format is not documented here at this time because:

(1) It is quite complex

(2) It will probably change with future versions of the just editor in TrueEdit.

[Sticky!]

TR14: Smart Swashes

The TR14 table is used to compile the mort subtables that implement the various Smart Swashes feature settings (Word Initial Swashes, Word Final Swashes, Line Initial Swashes, Line Final Swashes, and Non-Final Swashes). It has the following format:

Type Name Description
Boolean subtableType[5] Five flags indicating whether each of the corresponding five Smart Swashes settings currently exists in the mort table
int32 numSwash The number of swash entries in the table
int32 numPunc The number of punctuation glyphs in the table
int32 numSpec The number of special glyphs in the table
uint16 firstGlyph The smallest normal, i.e. non- swash, glyph ID in the table
uint16 lastGlyph The largest normal, i.e. non- swash, glyph ID in the table
uint16 firstPunc The smallest punctuation glyph ID in the table
uint16 lastPunc The largest punctuation glyph ID in the table
uint16 firstSpec The smallest special glyph ID in the table
uint16 lastSpec The largest special glyph ID in the table
uint16 punc[numPunc] The glyph IDs of the punctuation glyphs, sorted in increasing glyph ID order
uint16 spec[numSpec] The glyph IDs of the special glyphs, sorted in increasing glyph ID order
MortSwashRec swashRecs[numSwash] The swash entries, sorted in increasing glyph ID order of the normal, i.e. non-swash, form of the glyph in each swash entry

Each MortSwashRec record has the following format:

Type Name Description
long glyph The glyph ID of the normal, i.e. non-swash, form of the glyph
long wordInitial The glyph ID of the Word Initial swash form of the glyph
long wordFinal The glyph ID of the Word Final swash form of the glyph
long lineInitial The glyph ID of the Line Initial swash form of the glyph
long lineFinal The glyph ID of the Line Final swash form of the glyph
long nonFinal The glyph ID of the Non Final swash form of the glyph

TR15: Diphthong Ligatures

The TR15 table is used to compile the mort subtable that implements the Diphthong Ligatures feature setting. It has the same format as the TR00 table.

TR16: Prevent Overlap

The TR16 table is used to compile the mort subtable that implements the Prevent Overlap feature setting. Information on its format will be added to a later version of this document.

TR17: Hyphens to Em Dash

The TR17 table is used to compile the mort subtable that implements the Hyphens to Em Dash feature setting. It has the following format:

Type Name Description
long hyphen The glyph ID of the hyphen
long emDash The glyph ID of the em dash

TR18: Hyphen to En Dash

The TR18 table is used to compile the mort subtable that implements the Hyphen to En Dash feature setting. It has the following format:

Type Name Description
long hyphen The glyph ID of the hyphen
long enDash The glyph ID of the en dash
int16 numSpaces The number of space glyphs in the table
int16 numDigits The number of digit glyphs in the table
uint16 firstSpace The smallest space glyph ID in the table
uint16 lastSpace The largest space glyph ID in the table
uint16 firstDigit The smallest digit glyph ID in the table
uint16 lastDigit The largest digit glyph ID in the table
uint16 spaces[numSpaces] The glyph IDs of the space glyphs, sorted in increasing glyph ID order
uint16 digits[numDigits] The glyph IDs of the digit glyphs, sorted in increasing glyph ID order

TR19: Asterisk to Multiply

The TR19 table is used to compile the mort subtable that implements the Asterisk to Multiply feature setting. It has the following format:

Type Name Description
long star The glyph ID of the asterisk
long multSign The glyph ID of the multiplication sign
int16 numSpaces The number of space glyphs in the table
uint16 firstSpace The smallest space glyph ID in the table
uint16 lastSpace The largest space glyph ID in the table
uint16 spaces[numSpaces] The glyph IDs of the space glyphs, sorted in increasing glyph ID order

TR20: Exponent

The TR20 table is used to compile the mort subtable that implements the Exponent feature setting. It has the following format:

Type Name Description
long caret The glyph ID of the caret
int16 numDigits The number of digit glyphs in the table
uint16 firstDigit The smallest digit glyph ID in the table
uint16 lastDigit The largest digit glyph ID in the table
MortExpDigitRec expDigitRecs[numDigits] The list of (digit, exponent) entries in the table, sorted in increasing glyph ID order of the digits


Each MortExpDigitRec has the following format:

Type Name Description
long digit The glyph ID of the digit
long superiorForm The glyph ID of the corresponding exponent

TR21: Hyphen to Minus

The TR21 table is used to compile the mort subtable that implements the Hyphen to Minus feature setting. It has the following format:

Type Name Description
long hyphen The glyph ID of the hyphen
long minusSign The glyph ID of the minus sign
int16 numSpaces The number of space glyphs in the table
uint16 firstSpace The smallest space glyph ID in the table
uint16 lastSpace The largest space glyph ID in the table
uint16 spaces[numSpaces] The glyph IDs of the space glyphs, sorted in increasing glyph ID order

TR22: Slash to Divide

The TR22 table is used to compile the mort subtable that implements the Slash to Divide feature setting. It has the following format:

Type Name Description
long slash The glyph ID of the slash
long divSymbol The glyph ID of the divide sign
int16 numSpaces The number of space glyphs in the table
uint16 firstSpace The smallest space glyph ID in the table
uint16 lastSpace The largest space glyph ID in the table
uint16 spaces[numSpaces] The glyph IDs of the space glyphs, sorted in increasing glyph ID order

TR23: Inequality Ligatures

The TR23 table is used to compile the mort subtable that implements the Inequality Ligatures feature setting. It has the following format:

Type Name Description
long greaterThan The glyph ID of the "greater than" sign
long lessThan The glyph ID of the "less than" sign
long equal The glyph ID of the equal sign
long greaterThanOrEqualTo The glyph ID of the "greater than or equal to" sign
long lessThanOrEqualTo The glyph ID of the "less than or equal to" sign

TR24: Initial Caps

The TR24 table is used to compile the mort subtable that implements the Initial Caps feature setting. It has the following format:

Type Name Description
int16 numPairs The number of (lower case, upper case) glyph pairs in the table
int16 numSpaces The number of space glyphs in the table
uint16 firstLower The smallest lower case glyph ID in the table
uint16 lastLower The largest lower case glyph ID in the table
uint16 firstSpace The smallest space glyph ID in the table
uint16 lastSpace The largest space glyph ID in the table
MortUpperPairRec pairRecs[numPairs] The list of (lower case, upper case) glyph pairs, sorted in increasing order of the lower case glyph ids
uint16 spaces[numSpaces] The glyph IDs of the spaces, in increasing glyph ID order

Each MortUpperPairRec has the following format:
Type Name Description
long lower The glyph ID of a lower case glyph
long upper The glyph ID of the corresponding upper case glyph

TR25

Information on this table will be added to a later version of this document.

TR26: Smart Quotes

Information on this topic will be added to a later version of this document.

TrueEdit and the mort table

The format of the mort table is specified in QuickDraw GX Font Formats. In addition, TrueEdit makes some assumptions about how the mort table is laid out. If these assumptions are not valid for a particular font, then TrueEdit will not be able to open the mort table properly.

TrueEdit at present does not check the layout of the mort table first; it just goes ahead and tries to open it, and typically hangs or bombs if the layout of the table is not as expected.


The following are the assumptions made by TrueEdit regarding the overall layout of the mort table:

  • The mort table consists of a single chain, i.e. contains at most 32 feature settings.
  • The order of the feature settings in the Feature List following the Chain Header is the order in which they will be displayed by TrueEdit when it opens the mort table main window.
  • The order of the subtables in the mort table is the same as the order, in the Feature List, of the feature settings which they implement. If more than one subtable is needed to implement a particular feature setting, all those subtables will be contiguous, and, as a group, they will be in Feature List order.

Currently, the only feature setting that requires more than one subtable to implement is Diagonal Fractions. It requires two subtables: one to scan the run in the forward direction, and one to scan the run in the reverse direction.

TrueEdit makes no assumptions about how many subtables are used to implement each feature setting; it can deduce this information from the Subfeature Flags of the subtables, and the Enable Flags of the Feature List entries (more on this below).

  • The Enable Flags of each "Active" feature setting (i.e. each feature setting not of the "Disable" variety; more on this below) consist of a single "on" bit and 31 "off" bits. The bit which is "on" will be different for each feature setting. The Subfeature Flags for each subtable that participates in implementing a particular feature setting are equal to the Enable Flags for that feature setting.
  • The Feature List consists of the "Active" feature settings, followed by the "Disable" feature settings, and ends with an "All Typographic Features: Off" feature setting. The "Active" feature settings are those for which subtables exist to implement them. The "Disable" feature settings consist of the following:
    • The "None" setting for each radio button feature type that has such a setting (see attached Feature Registry summary), and that has at least one setting in the "Active" part of the Feature List.
    • The "Off" setting corresponding to each "On" check-box setting in the "Active" part of the Feature List.
  • The Enable Flags and Disable Flags for each feature setting in the Feature List have the following values:
    • "Active" Radio Button feature setting:
      • Enable Flags = a single, unique "On" bit
      • Disable Flags = such that they disable all other settings of that feature type in the Feature List (including the "Disable" setting, if any)
    • "Disable" Radio Button feature setting:
      • Enable Flags = 0
      • Disable Flags = such that they disable all other settings of that feature type in the Feature List
    • "Active" Check Box feature setting:
      • Enable Flags = a single, unique "On" bit
      • Disable Flags = 0
    • "Disable" Check Box feature setting:
      • Enable Flags = 0
      • Disable Flags = complement of the Enable Flags for the corresponding "On" setting
    • "All Typographic Features: Off" feature setting:
      • Enable Flags = 0
      • Disable Flags = 0

The CHMP resource

The "Build & Add" option available in TrueEdit for adding a cmap subtable is useful because it allows the user to add a complete subtable, without having to specify any of the new subtable's entries. The entries in the new subtable are determined by the platform, script, and language IDs specified by the user. TrueEdit determines the format (0, 4, or 6) of the new subtable based on its contents.

The new subtable is built by using a CHMP resource (from TrueEdit's resource file) in conjunction with an existing cmap subtable in the font. Details of the CHMP resource follow.

How it works

The CHMP resource maps character codes in a source (src) encoding to those in a destination (dest) encoding. For example, one CHMP might map Mac-Roman-English character codes to their Unicode-Roman-English equivalents, another might map Mac-Roman-Dutch codes to Microsoft-Roman-Dutch codes, etc. There may be one CHMP resource for each mapping from one set of encoding IDs to another. If CHMP resources with duplicate encoding IDs exist, the first applicable CHMP will be used.

The following diagram shows how an existing cmap subtable in an sfnt and a CHMP which shares a similar set of encoding IDs (differing only in platform) can be used to generate a new cmap subtable. The new cmap subtable maps each destination character code in the CHMP to the glyph index which is mapped to in the existing cmap subtable by the corresponding source (Mac) character code in the CHMP.


In the Add cmap Subtable dialog, TrueEdit allows the user to specify the platform, script, and language IDs of the cmap subtable to be added. The Build & Add button in this dialog will be highlighted, enabling a cmap subtable to be built from a CHMP resource and an existing cmap subtable, if the following conditions hold:

  • The encoding IDs of the subtable to be added do not duplicate those of an existing subtable.
  • There is an existing subtable in the sfnt with the same script and language IDs as the subtable to be added but with "Macintosh" as a platform.
  • There is a CHMP resource in TrueEdit's resource file which meets the following requirements:
    • source platform ID = "Macintosh"
    • destination platform ID = platform ID of subtable to be added
    • source/destination script IDs = script ID of subtable to be added
    • source/destination language IDs = language ID of subtable to be added

Format

ResEdit should be used to create or modify CHMP resources.

If a CHMP is being created outside of the TrueEdit resource file, create a new resource file or open an existing one in ResEdit and choose "Create New Resource" from the Resource menu. Enter CHMP in the text field, and a new window (a hex window) will appear.

If a resource file which already contains CHMPs is being used, double-click CHMP in the list and choose "Create New Resource".

In either case, the new CHMP can be built once a hex window has been created for it in ResEdit. The following is a representation of the format of the CHMP resource.


Note that:

  • All values in a CHMP resource are in hexadecimal.
  • On the Macintosh, the source platform should always be "Macintosh".
  • All CHMP character codes are two bytes in length.
  • If there is a source character code which does not map to a destination character code, it can either be excluded from the CHMP or mapped to character code 0xFFFF.

Below is a screen snapshot taken in ResEdit. It shows an actual CHMP with its components labeled. This particular CHMP maps 256 Macintosh-Roman-English character codes to the equivalent 256 Unicode-Roman-English codes. Notice the block of FFFFs, which denote those codes which exist in the source encoding (Mac-Roman-English) but not in the destination encoding (Unicode-Roman-English).


It is simple, though a bit tedious, to create CHMPs. The benefit of spending the time creating a CHMP is that TrueEdit users will not have to spend time on painful and repetitive entry of character codes and their associated glyph indices; this process is automated by the presence of CHMP resources.

For more information

Consult the documents TrueType Font Format Specification and QuickDraw GX Font Formats for more information on cmaps. The latter document offers an in-depth explanation of the different cmap formats, including format 2, which might be useful in working with cmaps.




The Apple Fonts Group (applefonts@apple.com)