As promised, the conclusions I've come to (for the record, or for others to argue over):
Derivation of items in the descriptor of a downloaded PCL5 Type 15 (TrueType Scalable) or Type 16 (Universal) soft font.
The donor TrueType font file may include an optional PCLT table (although this is strongly discouraged, according to the OpenType specification (see
for details)).
Where TrueType table items are referenced below, these references are shown in the form TableId.ItemName (e.g. head.yMax).
Some item values are fixed; some depend on which characters will be included in the PCL font being constructed; some are obtained from the PCLT table (if present) or an alternative table item, or a default; others are obtained from mandatory tables.
I think that the following list of item values is reasonably accurate, but I can’t claim that it is definitive.
----------------------------------------------
byte(s) 00-01 : Descriptor size
= 72 (fixed value)
----------------------------------------------
byte(s) 02 : Descriptor format
= 15 (TrueType) or
= 16 (Universal)
Font descriptors are the same in both cases (except this field); most modern devices support the preferred format 16, although a few don’t.
----------------------------------------------
byte(s) 03 : Symbol Set Type
= 2 (Bound 8-bit) usually
= other value as required
----------------------------------------------
byte(s) 04 : Style (MSB)
= PCLT.Style (MSB) if PCLT table present
= 0 as default(?) otherwise
----------------------------------------------
byte(s) 05 : Reserved
= 0 (fixed value)
----------------------------------------------
byte(s) 06-07 : Baseline Position
= 0 (fixed value)
----------------------------------------------
byte(s) 08-09 : Cell Width
= head.xMax - head.xMin
----------------------------------------------
byte(s) 10-11 : Cell Height
= head.yMax - head.yMin
----------------------------------------------
byte(s) 12 : Orientation
= 0 (fixed value)
----------------------------------------------
byte(s) 13 : Spacing
= 0 (Fixed-Pitch) if the appropriate Monospaced flag is set in the OS/2.panose classification fields
= 1 (Proportionally-Spaced) otherwise
The position and value of the Monospaced flag varies according to the Panose Family Kind (the value of the first Panose digit); see
for details.
----------------------------------------------
byte(s) 14-15 : Symbol Set
= Kind1 equivalent of required Symbol Set ID
----------------------------------------------
byte(s) 16-17 : Pitch
= PCLT.Pitch if PCLT table present;
= advance width for space character (usually glyph 4) otherwise.
----------------------------------------------
byte(s) 18-19 : Height
= 0 (fixed value)
----------------------------------------------
byte(s) 20-21 : x-Height
= PCLT.xHeight if PCLT table present
= OS/2.sxHeight otherwise
----------------------------------------------
byte(s) 22 : Width Type
= PCLT.WidthType if PCLT table present
= OS/2.usWidthClass otherwise (modified as there is not a 1:1 mapping)
----------------------------------------------
byte(s) 23 : Style (LSB)
= PCLT.Style (LSB) if PCLT table present
= 0 as default(?) otherwise
----------------------------------------------
byte(s) 24 : Stroke Weight
= PCLT.StrokeWeight if PCLT table present
= OS/2.usWeightClass otherwise (modified as there is not a 1:1 mapping)
----------------------------------------------
byte(s) 25 : Typeface (LSB)
= PCLT.TypeFamily (LSB) if PCLT table present
= 0 as default(?) otherwise
----------------------------------------------
byte(s) 26 : Typeface (MSB)
= PCLT.TypeFamily (MSB) if PCLT table present
= 0 as default(?) otherwise
----------------------------------------------
byte(s) 27 : Serif Style
= PCLT.SerifStyle if PCLT table present
= 0 as default(?) otherwise
----------------------------------------------
byte(s) 28 : Quality
= 2 (LetterQuality) (fixed value)
----------------------------------------------
byte(s) 29 : Placement
= 0 (fixed value)
----------------------------------------------
byte(s) 30 : Underline Position
= 0 (fixed value)
----------------------------------------------
byte(s) 31 : Underline Thickness
= 0 (fixed value)
----------------------------------------------
byte(s) 32-33 : Text Height
= hhea.yAscender – hhea.yDescender + hhea.yLineGap
----------------------------------------------
byte(s) 34-35 : Text Width
= OS/2.xAvgCharWidth
----------------------------------------------
byte(s) 36-37 : First Code
= 0x0020 for Symbol Set Type 2 usually(?)
= other value for specific font
----------------------------------------------
byte(s) 38-39 : Last Code
= 0x00ff for Symbol Set Type 2 usually(?)
= other value for specific font
----------------------------------------------
byte(s) 40 : Pitch Extended
= 0 (fixed value)
----------------------------------------------
byte(s) 41 : Height Extended
= 0 (fixed value)
----------------------------------------------
byte(s) 42-43 : Cap Height
= PCLT.CapHeight if PCLT table present
= OS/2.sCapHeight otherwise
----------------------------------------------
byte(s) 44-47 : Font Number
= PCLT.FontNumber if PCLT table present
= 0 otherwise
----------------------------------------------
byte(s) 48-63 : Font Name
= PCLT.Typeface if PCLT table present
= name.ID4 (for language = 0x0409) otherwise; value is usually (Big-Endian) Unicode, so must be converted to ANSI
----------------------------------------------
byte(s) 64-65 : Scale Factor
= head.unitsPerEm
----------------------------------------------
byte(s) 66-67 : Master Underline Position
= -(head.unitsPerEm * 20%)
----------------------------------------------
byte(s) 68-69 : Master Underline Thickness
= (head.unitsPerEm * 5%)
----------------------------------------------
byte(s) 70 : Font Scaling Technology
= 1 (TrueType) (fixed value)
----------------------------------------------
byte(s) 71 : Variety
= 0 (fixed value)