Programming in XPCE/Prolog: Section B.5

## B.5 Accessing Windows Fonts

The normal screen, helvetica, roman and times font families available in the Unix/X11 version are available using the same names. The system will try to use an as close as possible equivalent Windows TrueType font for these.

The Windows `stock' fonts as available from the GetStockObject() API are available under the special `family' "win". They are in table 11

`font(win, ansi_fixed)` | Default ANSI encoded fixed font
`font(win, ansi_var)` | Default ANSI encoded variable font
`font(win, device_default)` | Default device font
`font(win, oem_fixed)` | Computers `native' fixed font (PC)
`font(win, system)` | Variable pitched system font
`font(win, system_fixed)` | Fixed system font

Table 11 : Windows font name mapping

Note that these fonts do not have a specified point-size. Their point-size depends on the Windows installation. The get-method `<-`points will return the `<-`height of the font.

Other Windows fonts may be accessed using a similar method as in Unix/X11: provide a fourth argument describing the font using the hosts conventions. For the Win32 API, this is a textual description of the Windows API structure LOGFONT passed to CreateFontIndirect(). The description is a `:' (colon) separated list of attributes of the structure. The attributes need not be specified in the order of the structure-layout. Omited attributes are set to their default.

Attributes come in four types: numeric, boolean, enumerated and string. In general, an attribute is specified as:

> <name>(<value>)

<name> is matches case-insensitive against the name of the structure field without the leading `lf' string. For numeric types, the argument is interpreted as a decimal number (spaces are not allowed). For a boolean argument, the (value) part is omitted. By default the boolean attributes are FALSE. Including the attribute name in the specification sets the field to TRUE. Enumerated fields are specified using their symbolic name. Name-matching is case-insensitive. Common parts of the API identifier to make the symbol unique (for example _CHARSET in ANSI_CHARSET) are removed. String arguments simply take the value between the brackets. Spaces are included in the output, case is not changed and there is no escape for the closing-brace.

The default settings are in table 12, the attributes are in table 13.

`charset` | ansi
`height` | <points> × font.scale
`weigth` | bold if <style> is bold, normal otherwise
`italic` | TRUE if <style> is italic or oblique
`pitch` | fixed if <family> is screen
`family` | swiss if <family> is helvetica, roman if <family> is times, modern if <family> is screen dontcare otherwise.
`face` | <family>

Table 12 : Windows font defaults

`height`(int) | point-size of the requested font
`width`(int) | average width of the characters
`escapement`(int) | angle in 1/10 degrees of the baseline
`orientation`(int) | angle for each character
`weigth`(int) | 0..1000 scale for thickness
`italic` | request italic look
`underline` | underline all characters
`strikeout` | use strikeout-fonts
`charset`(enum) | character encoding {`ansi, oem, symbol`}
`outprecision`(enum) | accurate aspects {`character, default, string, stroke`}
`clipprecision`(enum) | how the characters clip {`character, default, stroke`}
`quality`(enum) | Quality of output {`default, draft, proof`}
`pitch`(enum) | Spacing attributes {`default, fixed, variable`}
`family`(enum) | Style of the characters {`decorative, dontcare, modern, roman, script, swiss`}
`face`(string) | Use specific font database

Table 13 : Windows font attributes

The following example binds the Windows `WingDings' symbol-font:

    1 ?- new(F, font(wingdings, roman, 20, 'charset(symbol)')).

The following example uses this font to create an image from such a character:

    :- send(@display, font_alias, wingdings,
            font(wingdings, roman, 20, 'charset(symbol)')).

    wingding_image(Index, Image) :-
            new(Image, image(@nil, 32, 32)),
            new(T, text(string('%c', Index), center, wingdings)),
            send(T, center, point(16, 16)),
            send(Image, draw_in, T),
            send(T, done).

    test :-
            wingding_image(60, Floppy),
            send(label(test, Floppy), open).