PM.TXT


Remove Frame

                   OS/2 2.0 Technical Library

           Presentation Manager Programming Reference

                           Volume III

                       Part Number 1OG6272

Note

Before using this information and the product it supports, be sure
to read the general information under "Notices" on page vii.


First Edition (March 1992)

The following paragraph does not apply to the United Kingdom or
any country where such provisions are inconsistent with local law:
INTERNATIONAL BUSINESS MACHINES CORPORATION PROVIDES THIS
PUBLICATION "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Some states
do not allow disclaimer of express or implied warranties in certain
transactions, therefore, this statement may not apply to you.

This publication could include technical inaccuracies or
typographical errors. Changes are periodically made to the
information herein; these changes will be incorporated in new
editions of the publication. IBM may make improvements and/or
changes in the product(s) and/or the program(s) described in this
publication at any time.

It is possible that this publication may contain reference to, or
information about, IBM products (machines and programs),
programming, or services that are not announced in your country.
Such references or information must not be construed to mean that
IBM intends to announce such IBM products, programming, or services
in your country.

Requests for technical information about IBM products should be
made to your IBM Authorized Dealer or your IBM Marketing
Representative.

COPYRIGHT LICENSE: This publication contains printed sample
application programs in source language, which illustrate OS/2
programming techniques. You may copy and distribute these sample
programs in any form without payment to IBM, for the purposes of
developing, using, marketing or distributing application programs
conforming to the OS/2 application programming interface.

Each copy of any portion of these sample programs or any derivative
work, which is distributed to others, must include a copyright
notice as follows: "(c) (your company name) (year) All Rights
Reserved."

(c) Copyright International Business Machines Corporation 1992. All
rights reserved.
Note to U.S. Government Users--Documentation related to restricted
rights--Use, duplication or disclosure is subject to restrictions
set forth in GSA ADP Schedule Contract with IBM Corp.


Appendix D. Standard Bit-Map Formats

There are four standard bit-map formats. All device drivers have
to be able to translate between any of these formats and their own
internal formats. The standard formats are:

Bitcount  Planes
1         1
4         1
8         1
24        1

These formats are chosen because they are identical or similar to
all formats commonly used by raster devices. Only single-plane
formats are standard, but it is very easy to convert these to any
multiple-plane format used internally by a device.

Bit-Map Data
The pel data is stored in the bit map in the order that the
coordinates appear on a display screen. That is, the pel in the
lower-left corner is the first in the bit map. Pels are scanned to
the right, and upward, from that position. The bits of the first
pel are stored, beginning with the most significant bits of the
first byte. The data for pels in each scan line is packed together
tightly, but all scan lines are padded at the end, so that each one
begins on a ULONG boundary.

Bit-Map Information Tables
Each standard-format bit map must be accompanied by a bit-map
information table. Because the standard-format bit maps are
intended to be traded between devices, the color indexes in the bit
map are meaningless without more information; for a description of
this structure, see BITMAPINFO2.

Some calls use a structure that is similar to BITMAPINFO2 but does
not have the color table array; for a description of this
structure, see BITMAPINFOHEADER2. Wherever BITMAPINFO2 is shown,
BITMAPINFO is also allowed. Similarly, wherever BITMAPINFOHEADER2
is shown, BITMAPINFOHEADER is also allowed.

Bit-Map Example
To make the ordering of all the bytes clear, consider this simple
example of a 5-by-3 array of colored pels:

Red   Green  Blue   Red    Green
Blue  Red    Green  Blue   Red
Green Blue   Red    Green  Blue

ULONG ExampleBitmap[] {
     0x23,0x12,0x30,0x00             /* bottom line */
     0x31,0x23,0x10,0x00             /* middle line */
     0x12,0x31,0x20,0x00             /* top line */
};

#define BLACK     0X00000000L
#define RED       0X00FF0000L
#define GREEN     0X0000FF00L
#define BLUE      0X000000FFL

struct BitmapInfoTable ExampleInfo
       5,                       /* width       */
       3,                       /* height      */
       1,                       /* planes      */
       4,                       /* bitcount    */
       BLACK,RED,GREEN,BLUE,    /* color table */
       BLACK,BLACK,BLACK,BLACK,
       BLACK,BLACK,BLACK,BLACK,
       BLACK,BLACK,BLACK,BLACK
};

Bit-Map File Format
The operating system uses the same file format for bit maps, icons,
and pointers in resource files. in the following description, "bit
map" refers to bit maps, icons, and pointers unless otherwise
specified.

Two formats are supported. In the first, a single-size version of
the bit map is defined. This is used whatever the target device.

The second format allows multiple versions of the bit map to be
defined, including one or more device-independent versions, and a
number of device-dependent versions, each intended for use with a
particular device.

In the case of icons and pointers, when more than one version of
the bit map exists, the preferred version is one that matches the
device size of icon or pointer. Otherwise the device-independent
version is used to scale a bit map to the required size.

The operating system provides pointers that match the requirements
of the display device in use, typically pointers are 32x32 pels,
one bit per plane.

Icons provided with the operating system are designed to match the
requirements of the most common display devices. The following
versions of each icon are included in each file:

     32x32 4 bpp (16 color)
     40x40 4 bpp (16 color)
     32x32 1 bpp (black and white)
     20x20 1 bpp (black and white)
     16x16 1 bpp (black and white)

The 32x32 versions are designed for VGA displays and for
device-independent use.

The 40x40 version is for 8514/A and XGA displays.

The 20x20 and 16x16 are half-size icons designed for use as
mini-icons.

For general bit maps, which may be of arbitrary size, the preferred
version is one matching the requested bit map size; otherwise one
matching the display size is selected. If neither is available, the
device-independent version is used from which to scale a bit map.

For both formats, the definition consists of two sections. The
first section contains general information about the type,
dimensions, and other attributes of the resource. The second
section contains data describing the pels that make up the bit
map(s), and is in the format specified in "Bit-Map Data" on page
D-1.

In the multiple-version format, the first section contains an array
of BITMAPARRAYFILEHEADER structures. or BITMAPARRAYFILEHEADER2
structures. The format of these is as follows:

typedef struct _BITMAPARRAYFILEHEADER {     /* bafh */
      USHORT             usType;
      ULONG              cbSize;
      ULONG              offNext;
      USHORT             cxDisplay;
      USHORT             cyDisplay;
      BITMAPFILEHEADER   bfh;
} BITMAPARRAYFILEHEADER;
typedef BITMAPARRAYFILEHEADER *PBITMAPARRAYFILEHEADER;

typedef struct _BITMAPARRAYFILEHEADER2 {    /* bafh */

      USHORT             usType;
      ULONG              cbSize;
      ULONG              offNext;
      USHORT             cxDisplay;
      USHORT             cyDisplay;
      BITMAPFILEHEADER2  bfh2;
} BITMAPARRAYFILEHEADER2;
typedef BITMAPARRAYFILEHEADER2 *PBITMAPARRAYFILEHEADER2;

The fields in BITMAPARRAYFILEHEADER and BITMAPARRAYFILEHEADER2 have
these meanings:

usType                   Type of structure. This is:

                         BFT_BITMAPARRAY (X'4142'--`BA'for
                         BITMAPARRAYFILEHEADER or
                         BITMAPARRAYFILEHEADER2)

cbSize                   Size of the BITMAPARRAYFILEHEADER or
                         BITMAPARRAYFILEHEADER2 structure in bytes.

offNext                  Offset of the next BITMAPARRAYFILEHEADER
                         or BITMAPARRAYFILEHEADER2 structure from
                         the start of the file

cxDisplay, CyDisplay     Pel dimensions of the device for which
                         this version is intended (for example,
                         640 x 480 for VGA).

The device-independent version must be the first
BITMAPARRAYFILEHEADER or BITMAPARRAYFILEHEADER2 defined.

In the single-size format, the BITMAPARRAYFILEHEADER or
BITMAPARRAYFILEHEADER2 structure is not present. The definition
consists of one or two BITMAPFILEHEADER or BITMAPFILEHEADER2
structures.

The format of the BITMAPFILEHEADER and BITMAPFILEHEADER2 structure
is:

typedef struct _BITMAPFILEHEADER {          /* bfh */

      USHORT             usType;
      ULONG              cbSize;
      SHORT              xHotspot;
      SHORT              yHotspot;
      ULONG              offBits;
      BITMAPINFOHEADER   bmp;
} BITMAPFILEHEADER;
typedef BITMAPFILEHEADER *PBITMAPFILEHEADER;

typedef struct _BITMAPFILEHEADER2           /* bfh2 */

      USHORT             usType;
      ULONG              cbSize;
      SHORT              xHotspot;
      SHORT              yHotspot;
      ULONG              offBits;
      BITMAPINFOHEADER2  bmp2;
} BITMAPFILEHEADER2;
typedef BITMAPFILEHEADER2 *PBITMAPFILEHEADER2;

BITMAPINFOHEADER2 is a standard data type (see above, and also
BITMAPINFOHEADER2).

The fields in BITMAPFILEHEADER and BITMAPFILEHEADER2 have these
meanings:

usType              Type of resource the file contains. The valid
                    values are:

                    BFT_BMAP (X'4D42'--`BM' for bit maps)
                    BFT_ICON (X'4349'--`IC' for icons)
                    BFT_POINTER (X'5450'--`PT' for pointers).
                    BFT_COLORICON (X'4943'--`CI' for color icons).
                    BFT_COLORPOINTER (X'5043'--`CP' for color
                    pointers).

cbSize              Size of the BITMAPFILEHEADER or
                    BITMAPFILEHEADER2 structure in bytes.

xHotspot, yHotspot  Coordinates of the hotspot for icons and
                    pointers. This field is ignored for bit maps.

offBits             Offset in bytes to the beginning of the bit-map
                    pel data in the file, from the start of the
                    definition.

For icons and pointers, the cy field in bmp is actually twice the
pel height of the image that appears on the screen. This is because
these types actually contain two full bit-map pel definitions. The
first bit-map definition is the XOR mask, which contains invert
information (0 = no invert, 1 = invert) for the pointer or icon.
The second is the AND mask, which determines whether the pointer
or the screen is shown (0 = black/white, 1 = screen/inverse
screen).

For color icons or pointers, there are two bit-maps involved: one
that is black and white and consists of an AND and an XOR mask,
and one that is color that defines the color content.

The cy field in the BITMAPINFOHEADER2 structure for the color
bit-map must be the real height, that is, half the value specified
for the black and white bit-map. The cx fields must be the same.

The following table shows how these two bit-maps are used for a
color icon or pointer:

     XOR     AND     COLOR
      1       1        x         Invert screen
      0       0        x         Use color x
      0       1        x         Transparency
      1       0        x         Use color x

For color icons or pointers, two BITMAPFILEHEADER or
BITMAPFILEHEADER2 structures are therefore required:

BITMAPFILEHEADER2     with ustype BFT_COLORICON or BFT-COLORPOINTER
   BITMAPINFOHEADER2 (part of BITMAPFILEHEADER2)
   Color table
BITMAPFILEHEADER2     with same ustype
   BITMAPINFOHEADER2 (part of BITMAPFILEHEADER2)
   Color table
**
bits for one bit-map
**
**
bits for other bit-map
**

The ustype for the first BITMAPFILEHEADER2 is either BFT_COLORICON
or BFT_COLORPOINTER. This means that a second BITMAPFILEHEADER2 is
present as part of the definition of a color icon or pointer. The
first BITMAPFILEHEADER2 structure contains the information for the
black and white AND and XOR masks, while the second
BITMAPFILEHEADER2 structure contains the information for the color
part of the pointer or icon.

BITMAPFILEHEADER and BITMAPINFOHEADER can occur in place of
BITMAPFILEHEADER2 and BITMAPINFOHEADER2 in this example.

For the multiple version format, the file is as follows:

BITMAPARRAYFILEHEADER2    for device-independent version
   BITMAPFILEHEADER2      (part of BITMAPARRAYFILEHEADER2)
      BITMAPINFOHEADER2   (part of BITMAPFILEHEADER2)
      Color table

    BITMAPFILEHEADER2     )
       BITMAPINFOHEADER2  ) only if this is a color icon or pointer
       Color table        )

BITMAPARRAYFILEHEADER2    for first device-dependent version
   BITMAPFILEHEADER2      (part of BITMAPARRAYFILEHEADER2)
      BITMAPINFOHEADER2   (part of BITMAPFILEHEADER2)
      Color table

    BITMAPFILEHEADER2     )
       BITMAPINFOHEADER2  ) only if this is a color icon or pointer
       Color table        )


Further BITMAPARRAYFILEHEADER2 groups occur here as required for
additional device-dependent versions

**
bits for one bit-map
**
**
bits for next bit-map
**

And so on for as many bit-maps as necessary.

As before, BITMAPARRAYFILEHEADER, BITMAPFILEHEADER and
BITMAPINFOHEADER can occur in place of BITMAPARRAYFILEHEADER2,
BITMAPFILEHEADER2 and BITMAPINFOHEADER2.


Appendix F. The Font-File Format

The OS/2 font-file format consists of two sections. The first
section contains the general attributes of the font, and describes
features such as its typeface, style, and nominal size. The second
section contains the actual definitions of the characters belonging
to the font.

The font resource is a set of self-defining records of the form:
typedef struct _RECORD {
      ULONG     ulIdentity;        /* structure identity code */
      ULONG     ulsize;            /* structure size in bytes */
        .                          /*  data */
        .
        .
      } RECORD;

A font starts with a special font-signature structure and ends with
an ending structure. The font signature has the form:

typedef struct _FONTSIGNATURE
        ULONG  ulIdentity;
        ULONG  ulSize;
        CHAR   achSignature [12]
        } FONTSIGNATURE;

where:

ulIdentity     = X'FFFFFFFE'
ulSize         = 20
achSignature   = "OS/2 FONT"   for an OS/2 1.x format font, or
               = "OS/2 FONT 2" for an OS/2 2.0 format font.

A 2.0 format font includes additional font description information
in the PANOSE structure. This structure will be added to the end
of the .FNT file (prior to the ENDFONT record).

The font end structure has the form:

typedef struct _ENDFONT{
        ULONG   ulIdentity;
        ULONG   ulSize;
        }ENDFONT

where:

ulIdentity    = X'FFFFFFFFI
ulSize        = 8

All records should be in the order of their identity fields.

There are three or four records in a font resource between the font
signature and the font end:

  *  The font metrics
  *  The font character definitions
  *  The pair kerning table.
  *  The PANOSE description (for "OS/2 FONT 2" fonts).

Following compilation, the records in the resource are in the order
defined above.


Metric Information Contained in Fonts

This section gives an explanation of how to set the fields of the
FOCAMETRICS structure when developing:

  *  A bit map or outline font for general use by PM graphics
     applications

  *  A description of a bit map or outline device font that is
     built in to a device or can be downloaded to a device.

The following structure contains the physical font metrics used
when creating fonts. It is defined in the file \INCLUDE\PMFONT.H.

typedef struct _FOCAMETRICS {
     ULONG          ulIdentity;
     ULONG          ulSize;
     CHAR           szFamilyname[321;
     CHAR           szFacename[321;
     SHORT          usRegistryId;
     SHORT          usCodePage;
     SHORT          yEmHeight;
     SHORT          yXHeight;
     SHORT          yMaxAscender;
     SHORT          yMaxDescender;
     SHORT          yLowerCaseAscent;
     SHORT          yLowerCaseDescent;
     SHORT          yInternalLeading;
     SHORT          yExternalLeading;
     SHORT          xAveCharWidth;
     SHORT          xMaxCharInc;
     SHORT          xEmInc;
     SHORT          yMaxBaselineExt;
     SHORT          sCharSlope;
     SHORT          sInlineDir;
     SHORT          sCharRot;
     USHORT         usWeightClass;
     USHORT         usWidthClass;
     SHORT          xDeviceRes;
     SHORT          yDeviceRes;
     SHORT          usFirstChar;
     SHORT          usLastChar;
     SHORT          usDefauItChar;
     SHORT          usBreakChar;
     SHORT          usNominalPointSize;
     SHORT          usMinimumPointSize;
     SHORT          usMaximumPointSize;
     SHORT          fsTypeFlags;
     SHORT          fsdefn;
     SHORT          fsSelectionFlags;
     SHORT          fscapabilities;
     SHORT          ySubscriptXSize;
     SHORT          ySubscriptYSize;
     SHORT          ySubscriptXOffset;
     SHORT          ySubscriptYOffset;
     SHORT          ySuperscriptXSize;
     SHORT          ySuperscriptYSize;
     SHORT          ySuperscriptXOffset;
     SHORT          ySuperscriptYOffset;
     SHORT          yUnderscoreSize;
     SHORT          yUnderscorePosition;
     SHORT          yStrikeoutSize;
     SHORT          yStrikeoutPosition;
     SHORT          usKerningPairs;
     SHORT          sFamilyClass;
     PSZ            pszDeviceNameOffset;
  }  FOCAMETRICS;

Note:  FOCAMETRICS is a parallel structure with FONTMETRICS as
       returned to applications in the GpiQueryFonts and
       GpiQueryFontMetrics function calls.

The FONTMETRICS fields are derived from FOCAMETRICS by the
Presentation Manager graphics engine. Most values are passed though
unchanged. The exceptions are:

  *  The identity field. This must be 1. This field is not a part
     of the FONTMETRICS structure.

  *  The Size field. This must be set to the size of the
     FOCAMETRICS structure. This field is not a part of the
     FONTMETRICS structure.

  *  The Codepage field. Ignore the description in FONTMETRICS,
     and use the following:

         Place 850 in this field if the font is intended to
         support any PM supported code page. The list of
         Presentation Manager supported code pages is given in
         Chapter 34, "Code Pages" on page 34-1.

         Place 65400 in this field if the font has special glyphs,
         for example if it is a Symbol font.

         Place other valid code pages in this field if the font is
         specific to this code page. Do not place other values in
         this field.

     * FONTMETRICS fields which contain values in world
       coordinates. The corresponding field in FOCAMETRICS should
       contain pel values for bit-map fonts, and notional units for
       outline fonts.

See FONTMETRICS on page A-56 for a detailed explanation of the
fields.


Font Character Definitions

Two formats of font character definition are supported. These are:

Image format
     The character glyphs are represented as pel images.

Outline format
     The character glyphs are represented by vector data that
     traces the outline of the character.

     Note: Intelligent Font Technology fonts (such as ATM Type-1
     fonts) may be stored in a technology specific format, and thus
     will not conform to this definition for outline fonts.

The definition consists of a header portion and a portion carrying
the characters themselves.

The header portion contains information about the format of the
character definitions and data about each character including width
data and the offset into the definition section at which the
character definition begins. (See "a-space, b-space, c-space" on
page F-13.)

  1. Proportional characters (a + b+ c = character increment) for
     each character:
     a,b,c ***> 0

  2. Characters where a, b, and c are definitions for all
     characters:

     b ***> 0
     a, c any integer

Raster fonts contain a "null character." The character definition
record for this occurs after the one for the last character. Thus
the format has usLastChar + 2 characters, although the null
character is not counted in the range returned. The null character
is composed of zeros and is always eight pels wide.


Font Definition Header

This structure defines the format or the character definition
records that follow it:

    typedef struct_FONTDEFINITIONHEADER {
     ULONG     ulIdentity;
     ULONG     ulSize;
     SHORT     fsfontdef;
     SHORT     fschardef;
     SHORT     usCellSize;
     SHORT     xCellWidth;
     SHORT     yCellHeight;
     SHORT     xCellIncrement;
     SHORT     xCellA;
     SHORT     xCellB;
     SHORT     xCellC;
     SHORT     pCellBaseOffset;
     } FONTDEFINITIONHEADER;
typedef FONTDEFINITIONHEADER FAR *PFONTDEFINITIONHEADER;

ulIdentity       4 bytes.

                 Must be equal to 2.

ulSize           4 bytes.

                 Size of this structure in bytes.

fsFontdef        2 bytes of flags.

                 Indicates which fields are present in the font
                 definition data in the header.

                 Type 1

                 Bit 0     1 = width defined in header
                 Bit 1     1 = height defined in header
                 Bit 2     1 = char increment same as width, so
                           that it is defined for the whole font
                 Bit 3     0 = a-space not defined
                 Bit 4     0 = b-space not defined
                 Bit 5     0 = c-space not defined
                 Bit 6     1 = base offset same for all characters.

                 Type 2

                 Bit 0     0 = width for each character unique
                 Bit 1     1 = height defined in header
                 Bit 2     0 = char increment same as width, so
                           that it is unique for each character
                 Bit 3     0 = a-space not defined
                 Bit 4     0 = b-space not defined
                 Bit 5     0 = c-space not defined
                 Bit 6     1 = base offset same for all characters.

                 Type 3

                 Bit 0     0 = width for each character unique
                 Bit 1     1 = height defined in header
                 Bit 2     0 = char increment same as width, so
                           that it is unique
                 Bit 3     0 = a-space not defined
                 Bit 4     0 = b-space not defined
                 Bit 5     0 = c-space not defined
                 Bit 6     1 = base offset same for all characters.

FaChardef        2 bytes of flags.
                 Indicates which fields are present on a per
                 character basis.

                 Type 1

                 Bit 0     1 = width defined for each character
                           (performance op)
                 Bit 1     0 = height is in header
                 Bit 2     0 = char increment is in header
                 Bit 3     0 = a-space not defined
                 Bit 4     0 = b-space not defined
                 Bit 5     0 = c-space not defined
                 Bit 6     0 = base offset defined in header
                 Bit 7     1 = offset to glyph defined.

                 Type 2

                 Bit 0     1 = width defined for each character
                 Bit 1     0 = height is in header
                 Bit 2     0 = char increment same as width
                 Bit 3     0 = a-space not defined
                 Bit 4     0 = b-space not defined
                 Bit 5     0 = c-space not defined
                 Bit 6     0 = base offset defined in header
                 Bit 7     1 = offset to glyph defined.

                 Type 3

                 Bit 0     1 = width not defined, use a, b, c
                 Bit 1     0 = height is in header
                 Bit 2     0 = char increment same as width
                 Bit 3     1 = a-space defined
                 Bit 4     1 = b-space defined
                 Bit 5     1 = c-space defined
                 Bit 6     0 = base offset defined in header
                 Bit 7     1 = offset to glyph defined.

usCellSize       2-byte integer.

                 Indicates the length in bytes of each character
                 definition record (the per character data).

                 Type 1    6 bytes
                 Type 2    6 bytes
                 Type 3    10 bytes.

xCellWidth       2-byte integer

                 The width of the characters, in pels for image
                 fonts, and relative units for outline fonts.

                 Type 1    Width of the characters
                 Type 2    Zero
                 Type 3    Zero.

yCellHeight      2-byte integer.

                 The height of the characters, in pels for image
                 fonts, and relative units for outline fonts.

                 Type 1    Height of the characters
                 Type 2    Height of the characters
                 Type 3    Height of the characters.

xCellincrement   2-byte integer.

                 The distance along the character baseline required
                 to step from one character to the next (when
                 forming a character string).

                 Type 1    Width of the characters
                 Type 2    Zero
                 Type 3    Zero.

xCellA           2-byte signed integer.

                 The width of the space before a character in the
                 inline direction (the a-space).

                 Type 1    Zero
                 Type 2    Zero
                 Type 3    a-space for all characters.

xCellB           2-byte integer.

                 The width of a character (inline direction). The
                 b-space.

                 Type 1    Zero
                 Type 2    Zero
                 Type 3    b-space for all characters.

xcellc           2-byte signed integer.

                 The width of the space after a character in the
                 inline direction (the c-space).

                 Type 1    Zero
                 Type 2    Zero
                 Type 3    c-space for all characters.

pCellBaseOffset  2-byte signed integer.

                 The position of the top of a character definition
                 relative to the baseline in the direction
                 perpendicular to the baseline.

                 Type 1  Baseline offset for all characters
                 Type 2  Baseline offset for all characters
                 Type 3  Baseline offset for all characters.

Character Definition Record
                 xCellSize bytes per record.

                 The following fields may or may not be present,
                 according to the font character definition fields
                 flags. if a field is present, it is present for
                 each character and the value applies to that
                 character only.

                 There are usLastChar+2 such records for raster
                 fonts. The final one is for the null character.

                  * Character Definition Offset: 4-byte integer.

                    The offset into the Font File at which the
                    character definition begins.

                    Data for a single character raster or vector
                    should not span two segments; that is, if a
                    character is too big to fit into a segment it
                    should be put in the next segment.

                    This field should be set to zero if the
                    character being defined is a blank character.

                  * Character Cell Width: 2-byte integer.

                    The width of the character definition in pels.

                  * Character Cell Height: 2-byte integer.

                    The height of the character definition in pels.

                  * Character Increment: 2-byte integer.

                    The length along the character baseline
                    required to step from this character to the
                    next (when forming a character string).

                  * Character a-space: 2-byte signed integer.

                    The width of the space before the character in
                    the inline direction.

                  * Character b-space: 2-byte integer.

                    The width of the character shape (inline
                    direction).

                  * Character c-space: 2-byte signed integer.

                    The width of the space after the character in
                    the inline direction.

                  * Character Baseline Offset: 2-byte signed
                    integer.

                    The position of the top of a character
                    definition relative to the baseline in the
                    direction perpendicular to the baseline.

     Note: Type 1 fonts have offset/width pairs (like type 2);
     however, the usCellSize and xCellIncrement are nonzero. In
     the fstype field of the font metrics, the proportional-space
     flag, bit 0, is set.

Image Data Format
  The bits for each character are stored separately, and start on
  a byte boundary. Sequential bytes represent vertical pieces of
  the character image. For example, a 15-bit-wide H is stored as
  follows:

byte                    byte
 1   00000000.0000000-.  13
 2   01100000 0000110-   14
 3   01100000 0000110-   15
 4   01100000 0000110-   16
 5   01100000 0000110-   17
 6   01111111 1111110-   18
 7   01111111 1111110-   19
 8   01100000 0000110-   20
 9   01100000 0000110-   21
10   01100000 0000110-   22
11   01100000 0000110-   23
12   00000000.0000000-.  24

Bytes 1 through 12 are composed of whole bytes of data stored row
by row.

Bytes 13 through 24 are composed of bytes stored row by row, where
each byte contains 7 bits of information and the last bit is
unused.

Thus the character is laid down in byte-wide columns.

Notes:

1. There is always an additional (null) character defined in an
   image Font (defined at character position LastChar + 2) which
   is 8 bits wide, the height of the font character, and set to all
   zeros.

2. The maximum size of each individual Image Font must not exceed
   64KB.


The Kerning Pair Table

The kerning pair table record is not present if the _KerningPairs
record in the metrics is zero. If it is present, the code points
are words, not bytes. This table should be sorted by kpChar1 and
kpChar2 order to allow binary searches.

typedef struct_KERNPAIRTABLE
        ULONG     ulIdentity;
        ULONG     ulSize;
        CHAR      cFirstpair;
}KERNPAIRTABLE;

typedef struct _KERNPAIRS
        SHORT  sFirstChar;
        SHORT  sSecondChar;
        SHORT  sKerningAmount;
}KERNINGPAIRS;

where:

  ulIdentity      = 3
  ulSize          = 10
  sFirstChar      = First character of the kerning pair
  sSecondChar     = Second character of the kerning pair
  sKerningAmount  = Kerning value. Positive values increase the
                    inter-character spacing while negative values
                    bring the characters closer together.

Outline Data Format
  Fonts defined by outlines (vectors) may contain any of these
  graphics orders:

   * Line at given position (GLINE)
   * Line at current position (GCLINE)
   * Relative line at given position (GRLINE)
   * Relative line at current position (GCRLINE)
   * Fillet at given position (GFLT)
   * Fillet at current position (GCFLT)
   * Sharp fillet at given position (GSFLT)
   * Sharp fillet at current position (GCSFLT)
   * B�zier curve at given position (GBEZ)
   * B�zier curve at current position (GCBEZ)
   * No operation (GNOPL)
   * Comment (GCOMT)
   * End of symbol definition (GESD).

The maximum length of the data in these orders is 255 bytes. The
drawing order code and the length fields are not included in the
length count.

The size of each outline font definition must not be longer than
64KB.


The Additional Metrics

The additional metrics structure extends the metrics describing the
font to include the PANOSE fields. The fields allow for
quantitative descriptions of the visual properties of font faces.
The format of the ADDITIONALMETRICS structure is:

  typedef struct {
        ULONG       ulIdentity;
        ULONG       ulSize;
        PANOSE      panose;
  } ADDITIONALMETRICS;

  where:

    ulIdentity      = 4
    ulSize          = 20
    panose          = The ten digit PANOSE number with two bytes
                      of padding.

The PANOSE definition consists of ten digits, each of which
describes one of up to sixteen variations. The current digits are:

1. Family Kind (6 variations)

   0     = Any
   1     = No Fit
   2     = Text and Display
   3     = Script
   4     = Decorative
   5     = Pictorial

2. Serif Style (16 variations)

   0     = Any
   1     = No Fit
   2     = Cove
   3     = Obtuse Cove
   4     = Square Cove
   5     = Obtuse Square Cove
   6     = Square
   7     = Thin
   8     = Bone
   9     = Exaggerated
   10    = Triangle
   11    = Normal Sans
   12    = Obtuse Sans
   13    = Perp Sans
   14    = Flared
   15    = Rounded

3. Weight (12 variations)

   0     = Any
   1     = No Fit
   2     = Very Light
   3     = Light
   4     = Thin
   5     = Book
   6     = Medium
   7     = Demi
   8     = Bold
   9     = Heavy
   10    = Black
   11    = Nord

4. Proportion (10 variations)

   0     = Any
   1     = No Fit
   2     = Old Style
   3     = Modern
   4     = Even Width
   5     = Expanded
   6     = Condensed
   7     = Very Expanded
   8     = Very Condensed
   9     = Monospaced

5. Contrast (10 variations)

   0     = Any
   1     = No Fit
   2     = None
   3     = Very Low
   4     = Low
   5     = Medium Low
   6     = Medium
   7     = Medium High
   8     = High
   9     = Very High

6. Stroke Variation (9 variations)

   1     = Any
   2     = No Fit
   3     = Gradual/Diagonal
   4     = Gradual/Transitional
   5     = Gradual/Vertical
   6     = Gradual/Horizontal
   7     = Rapid/Vertical
   8     = Rapid/Horizontal
   9     = Instant/Vertical

7. Arm Style (12 variations)

   0     = Any
   1     = No Fit
   2     = Straight Arms/Horizontal
   3     = Straight Arms/Wedge
   4     = Straight Arms/Vertical
   5     = Straight Arms/Single Serif
   6     = Straight Arms/Double Serif
   7     = Non-Straight Arms/Horizontal
   8     = Non-Straight Arms/Wedge
   9     = Non-Straight Arms/Vertical
   10    = Non-Straight Arms/Single Serif
   11    = Non-Straight Arms/Double Serif

8. Letterform (16 variations)

   0     = Any
   1     = No Fit
   2     = Normal/Contact
   3     = Normal/Weighted
   4     = Normal/Boxed
   5     = Normal/Flattened
   6     = Normal/Rounded
   7     = Normal/Off Center
   8     = Normal/Square
   9     = Oblique/Contact
   10    = Oblique/Weighted
   11    = Oblique/Boxed
   12    = Oblique/Flattened
   13    = Oblique/Rounded
   14    = Oblique/Off Center
   15    = Oblique/Square

9. Midline (14 variations)

   0     = Any
   1     = No Fit
   2     = Standard/Trimmed
   3     = Standard/Pointed
   4     = Standard/Serifed
   5     = High/Trimmed
   6     = High/Pointed
   7     = High/Serifed
   8     = Constant/Trimmed
   9     = Constant/Pointed
   10    = Constant/Serifed
   11    = Low/Trimmed
   12    = Low/Pointed
   13    = Low/Serifed

10. X-height (8 variations)

    0    = Any
    1    = No Fit
    2    = Constant/Small
    3    = Constant/Standard
    4    = Constant/Large
    5    = Ducking/Small
    6    = Ducking/Standard
    7    = Ducking/Large

When using the PANOSE number to match fonts, the ordering of the
PANOSE digit is the key to finding the closest match. The most
significant digit is the first digit, and the least significant
digit is number ten. To find matches, the digits need to be
compared, in the order given. A font mapper may want to change the
precedence of the digits, to give higher weightings to other font
features.


Font Directory

This section describes the directory section of a font resource.
A font resource contains a directory consisting of a set of
structures each containing the metrics of a font and a pointer to
the font itself This font directory is generated by the resource
compiler.

The format of the font directory is:

typedef struct (
   USHORT      usHeaderSize;
   USHORT      usnFonts;
   USHORT      usiMETRICS;
   FONTENTRY   fntEntry[1];
} FONTDIRECTORY;

typedef struct {
   USHORT          usIndex;
   FONTFILEMETRICS metrics;
} FONTENTRY;

Where:

usHeaderSize     The size of the header, in bytes.

usnFonts         The number of fonts in the resource.

usiMetrics       The size of the FOCAMETRICS structures that follow
                 the header. Note that the set of metrics for all
                 the fonts in the resource follow the header.

usindex          The index of a particular font; an identifier
                 assigned to the font when the resource was created
                 (defined in the RC file).

metrics          The font metrics structure for the font. This is
                 identical to a FOCAMETRICS structure with the
                 addition of the PANOSE fields to the end.

Definitions of Terms Used When Describing Fonts

a-space, b-space, c-space
The a-space is the distance from the left of the character frame
to the left edge of the character. The b-space is the width of the
character. The c-space is the distance from the right edge of the
character to the right of the character frame. Negative values of
a and c allow adjacent character frames to overlap. See also
character increment, and space default values.

average char width
The average horizontal distance from the left edge of one character
to the left edge of the next. Contrast with max char increment.

baseline
The line on which the bottom of a character rests, and below which
a descender extends.

break char cade point
The code point of the space or break character. Contrast with
default char code point, first char code point, and last char code
point.

character increment
A set.of three values (a-space, b-space, and c-space) that define
the proportions of a character. The sum of the three values (a+b+c)
specifies only one value for the entire character increment.
See also font width and space default values.

character rotation
The angle by which each character is rotated around its own center,
increasing clockwise from vertical. Contrast with character slope
and inline direction.

character slope
The angle by which a character is slanted, increasing clockwise
from vertical. Contrast with character rotation and inline
direction.

default char code point
The code point of the character to be used if a code point outside
the range of a font is passed to an application using that font.
Contrast with break char code point, first char code point, and
last char code point.

em height
The maximum distance above the baseline reached by an uppercase
symbol. Contrast with x height.

external leading
The vertical distance from the bottom of one character to the top
of the character below it. Contrast with internal leading and max
baseline extent.

first char code point
The code point of the first character. All numbers between the
first char code point and the last char code point must represent
a character in the font. Contrast with break char code point,
default char code point, and last char code point.

fixed spacing
The same amount of space separates each character. Contrast with
proportional spacing.

font weight
The line-thickness of a character relative to its size. Contrast
with font width.

font width
The relative width of a character to its height; condensed fonts
are very narrow while expanded fonts are very wide. See also
character increment. Contrast with font weight.

Inline direction
The angle of a line of type, increasing clockwise from horizontal.
Contrast with character rotation and character slope.

Internal leading
The vertical distance from the top or bottom of a character to any
accent marks that may appear with it. Contrast with external
leading.

last char code point
The code point of the last character. All numbers between the first
char code point and the last char code point must represent a
character in the font. Contrast with break char code point, default
char code point, and first char code point.

lowercase ascent
The maximum distance above the baseline reached by any part of any
lowercase character. Contrast with maximum ascender and x height.

lowercase descent
The maximum distance below the baseline reached by any part of any
lowercase character. Contrast with maximum descender.

max baseline extent
The maximum space occupied by the font (typically, the sum of the
maximum ascender and maximum descender). Contrast with external
leading and max char increment.

max char increment
The maximum horizontal distance from the left edge of one character
to the left edge of the next character to the right. Contrast with
average char width and max baseline extent.

maximum ascender
The maximum distance that any part of any character may extend
above the x height of a font. Contrast with lowercase ascent and
maximum descender.

maximum descender
The maximum distance that any part of any character may extend
below the x height of a font. Contrast with lowercase descent and
maximum ascender.

maximum vert point size
The maximum vertical dimensions to which a font can be resized.
Contrast with minimum vert point size and nominal vert point size.

minimum vert point size
The minimum vertical dimensions to which a font can be resized.
Contrast with maximum vert point size and nominal vert point size.

nominal vert point size
The normal display size of a font. Contrast with maximum vert point
size and minimum vert point size.

pel
The smallest element of a display surface that can be independently
assigned color and density.

point
Printer's unit of measurement. There are 72 points to an inch
(approximately 3.5 points to a millimeter).

proportional spacing
The space that each character occupies is in proportion to its
width. See also font width, Contrast with fixed spacing.

Registry ID
A code number that Presentation Manager uses to register a font
file as a resource.

space default values
Values that specify the space to be left between characters. Once
defined, they are used for the entire font, and do not have to be
specified for each character. However, they can be changed for
characters that require more or less spacing than the defaults
provide, by giving values for the a Space and the c Space. See also
character increment.

strikeout position
The distance of the strikeout character above the baseline (in
pels). See also strikeout size and underscore position.

strikeout size
The size of the strikeout character (in points). See also strikeout
position and underscore size.

subscript position
The distance of a subscript character of a font below the baseline
(in pels). See also subscript size and superscript position.

subscript size
The size of a subscript character (in points). See also subscript
position and superscript size.

superscript position
The distance of a superscript character above the baseline (in
pels). See also subscript position and superscript size.

superscript size
The size of a superscript character (in points). See also subscript
size and superscript position.

target dev resolution X
The number of pels per inch in the horizontal axis of a display
device on which a font is to be displayed. Contrast with target dev
resolution Y.

target dev resolution Y
The number of pels per inch in the vertical axis of a display
device on which a font is to be displayed. Contrast with target dev
resolution X.

underscore position
The distance in pels of the first underscore stroke from the
baseline of a font. Successive strokes below this create a heavier
underscore. See also strikeout position and underscore size.

underscore size
The size of the underscore character measured in single strikeout
strokes. See also strikeout size and underscore position.

x height
The maximum distance above the baseline reached by a lowercase
character. Contrast with em height and lowercase ascent.


Appendix G. Format of Interchange Files

A metafile is a file in which graphics are stored. The file is
application-created, and it contains the graphics orders generated
from those GPI calls that are valid in a metafile. Metafiled
graphics can be reused by the application that created them. They
can also be made available to other applications at the same, or
at a different, workstation.

This chapter describes the restrictions which apply when generating
the metafile and gives detail of the overall structure. For the
graphics orders descriptions, see Chapter 33, "Graphics Orders" on
page 33-1.


Metafile Restrictions

The following restrictions apply to the generation of all
metafiles, and also to the generation of a PM_Q-STD print file to
a OD_QUEUED device:

  *  If GpiWCBitBit or GpiBitBit is used to copy a bit map to a
     device context in an application, the application should not
     delete that bit map handle with GpiDeleteBitmap before the
     device context is closed (metafile is closed).

  *  GpiSetPS must not be used.

  *  GpiSetPageViewport is ignored.

The following section lists some general rules that must be
followed when creating a metafile that is to be acceptable to
SAA-conforming implementations, or replayed into a presentation
space that is in draw-and-retain or retain mode (see
GpiSetDrawingMode).

 *  These items must be established or defaulted before any drawing
    occurs to the graphics presentation space, and not changed
    subsequently:

    --  The graphics field (GpiSetGraphicsField). For an
        SAA-conforming metafile, the graphics field must be
        defaulted or set to no clipping.
    --  The code page for the default character set (GpiSetCp).
    --  The color table or palette (GpiCreateLogColorTable or
        GpiCreatePalette). The size of the color table must not
        exceed 31 KB (KB equals 1024 bytes).
    --  The default viewing transform (GpiSetDefaultViewMatrix).
    --  The setting of the draw controls (GpiSetDrawControl).
        DCTL-DISPLAY must be defaulted or set ON.
    --  The default values of attributes (see GpiSetDefAttrs),
        viewing limits (see GpiSetDefViewingLimits), primitive tag
        (see GpiSetDefrag) and arc parameters (see
        GpiSetDefArcParams).

 *  These calls should not be used:

    --  GpiBitBit
    --  GpiDeleteSetId (note that this means that local identifiers
        cannot be used again within the picture)
    --  GpiErase
    --  GpiExcludeClipRectangle
    --  GpilntersectClipRectangle
    --  GpiOffsetClipRegion
    --  GpiPaintRegion
    --  GpiResetPS
    --  GpiSetClipRegion
    --  GpiSetPel
    --  GpiSetPS
    --  DevEscape (for an escape which is metafiled).

 *  GpiCreateLogFont must not redefine a local identifier that has
    previously been used within the picture.

 *  The metafile context must not be reassociated.

 *  If a bit map is used as the source of a GpiWCBitBit operation,
    or as an area-fill pattern, it must not be modified or deleted
    (GpiDeleteBitmap) before the metafile is closed.

 *  Only these foreground mixes must be used (see GpiSetMix):

    --FM_DEFAULT
    --FM_OR
    --FM_OVERPAINT
    --FM_LEAVEALONE.

 *  Only these background mixes must be used (see GpiSetBackMix):

    --BM_DEFAULT
    --BM_OVERPAINT
    --BM_LEAVEALONE.

 *  If palettes are used (see GpiCreatePalette), the palette that
    is metafiled is the one in force when the metafile device
    context is dissociated from the (final) presentation space. if
    the palette is changed during the course of the picture (using
    GpiSetPaletteEntries), it must therefore only be with
    incremental additions.

Note: There is no restriction concerning the use of primitives
outside segments. These are metafiled in segment(s) with zero
identifier.


Metafile Data Format

This section describes the format of the data in a metafile, as it
would be stored in an OS/2 Version 2.0 disk file.

Metafile data is stored as a sequence of structured fields. Each
structured field starts with an eight-byte header consisting of a
two-byte length field and a three-byte identifier field. These are
followed by a one-byte flags field and a two-byte segment sequence
number field.

The length field contains a count of the total number of bytes in
the structured field, including the length field. The identifier
field uniquely identifies the type of the structured field.

The flags and segment sequence number fields are always zero.

Following the header are positional parameters that are optional
and dependent on the particular structured field.

Following the positional parameters are non-positional parameters
called triplets. These are self-defining parameters and consist of
a one-byte length field, followed by a one-byte identifier field,
followed by the data of the parameter.

The length field contains a count of the total number of bytes in
the triplet, including the length and identifier fields. The
identifier field identifies uniquely the type of the triplet.

A metafile is structured into a number of different functional
components; for example, document and graphics object. Each
component comprises a number of structured fields, and is delimited
by "begin-component" and "end-component" structured fields.
Structured fields marked as required, inside an optional structured
field bracket, are required if the containing bracket is present.

The graphics orders that describe a picture occur in the graphics
data structured field. See page G-17.


Structured Field Formats

The format of the various structured fields is given below:

Begin Document

Structured Field Introducer (BDT): required
0-1     Length X'n+1E'
2-4     BDT X'D3A8AB'
5       Flags X'00'
6-7     Segment sequence number X'0000'

Parameters
0-7     Document name C'0000 0001'
8       Architecture version X'00'
9       Document security X'00'

Triplets (all required)
0       Length X'05'
1       Triplet Id X'18'
2       Interchange set type X'03' (resource document)
3-4     Base set definition X'0C00' (level 12, version 0)

0       Length X'06'
1       Triplet Id X'01'
2-5     GCID

0       Length X'n+1'
1       Triplet Id X'65'
2-n     Comment, used for metafile description of up to 252 bytes.

Begin Resource Group (BRG): required

  Structured Field Introducer
  0-1   Length X'0010'
  2-4   BRG X'D3ABC6'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-7   Resource group name    C'0000 0002'

Begin Color Attribute (BCA) Table: required

  Structured Field Introducer
  0-1   Length X'0010'
  2-4   BCA X'D3AB77'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-7   Color table name C'0000 0004'

Color Attribute Table (CAT) required
  Structured Field Introducer
  0-1   Length X'n+B'
  2-4   CAT X'D3BO77'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters

  Base Part (required)
  0     Flags
        0   Reserved B'0'
        1   Reset
            B'0' Do not reset to default
            B'1' Do reset to default
        2-7 Reserved B'000000'
  1     Reserved X'00'
  2     LCTID X'00'

  Element list(s) (triple generating) are mutually-exclusive. One
  or other is required.

  Element List (repeating)
  0     Length of this parameter
  1     Type X'01': element list
  2     Flags X'00': reserved
  3     Format
        X'01' RGB
  4-6   Starting Index
        (Top Byte Truncated)
  7     Size of RGB component1 X'08'
  8     Size of RGB component2 X'08'
  9     Size of RGB component3 X'08'
  10    Number of bytes in each
        following color triple X'04'
  11-m  Color triples

Triple Generating
  0     Length of this parameter X'OA'
  1     Type X'02': bit generator
  2     Flags
        0 ABFlag
         B'0' Normal
        1-7 Reserved B'0000000'
  3     Format
        X'01' RGB
  4-6   Starting index (top byte truncated)
  7     Size of RGB component1 X'08'
  8     Size of RGB component2 X'08'
  9     Size of RGB component3 X'08'

End Color Attribute (ECA) Table: required

  Structured Field Introducer
  0-1   Length X'0010'
  2-4   ECA X'D3A977'
  5     Flags '00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-7   Color table name C'0000 0004'

Begin Image Object (BIM): optional, repeating

  Structured Field Introducer
  0-1   Length X'0010'
  2-4   BIM X'D3A8FB'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-7   Image name C'xxxx xxxx'

Begin Resource Group (BRG): optional

    Structured Field Introducer
    0-1   Length X'9010'
    2-4   BRG X'D3A8C6'
    5     Flags X'00'
    6-7   Segment sequence number X'0000'

    Parameters
    0-7   Resource group name C'xxxx xxxx'

Color Attribute Table (BCA): optional

      Structured Field Introducer
      0-1   Length X'0010'
      2-4   BCA X'D3A877'
      5     Flags X'00'
      6-7   Segment sequence number X'0000'

      Parameters
      0-7   Color table name C'xxxx xxxx'

Color Attribute Table (CAT): required

        Structured Field Introducer
        0-1   Length
        2-4   CAT X'D3B077'
        5     Flags X'00'
        6-7   Segment sequence number X'0000'

        Parameters

        Base Part
        0     Flags X'00'
        1     Reserved X'00'
        2     LUTID

        Element List (repeating)
        0     Length of this parameter
        1     Type X'01': element list
        2     Flags X'00': reserved
        3     Format X'01': RGB
        4-6   Starting index
              (top byte truncated)
        7     Size of RGB component1 X'08'
        8     Size of RGB component2 X'08'
        9     Size of RGB component3 X'08'
        10    Number of bytes in each following color triple X'03'
        11-n  Color triples

End Color Attribute Table (ECA): required if BCA present
  Structured Field Introducer
  0-1   Length X'0010'
  2-4   ECA X'D3A977'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-7   Color Table name C'xxxx xxxx'

End Resource Group (ERG): required if RG present
  Structured Field Introducer
  0-1   Length X'0010'
  2-4   ERG X'D3A9C6'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-7 Resource Group name C'xxxx xxxx'

Begin Object Environment Group (BOG): optional
  Structured Field Introducer
  0-1   Length X'0010'
  2-4   BOG X'D3A8C7'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-7   Object environment group
        name C'xxxx xxxx'

Map Color Attribute (MCA) Table: required
  Structured Field Introducer
  0-1   Length X'001A'
  2-4   MCA X'D3AB77'
  5     Flags '00'
  6-7   Segment sequence number X'0000'

  Parameters
  9-1   Length

  Triplet (required)
  0     Length X'0C'
  1     Triplet type:
        fully qualified name X'02'
  2     Type: ref to
        Begin Resource Object X'84'
  3     ID X'00'
  4-11  Color table name C'xxxx xxxx'

  lcid (required)
  0     Length X'04'
  1     Triplet type:
        resource local ID X'24'
  2     Type color table resource X'07'
  3     Local identifier (LUT-ID) X'01'

End Object Environment Group (EOG): required if BOG present
  Structured Field Introducer
  0-1   Length X'0010'
  2-4   EOG X'D3A9C7'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-7   Object Environment Group
        name C'xxxx xxxx'

Image Data Descriptor (IDD): required
  Structured Field Introducer
  0-1   Length X'0011'
  2-4   IDD X'D3A6FB'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0     Unit of measure:
        X'00' tens of inches
        X'01' tens of centimeters
  1-2   X resolution image points / UOM
  3-4   Y resolution image points / UOM
  5-6   X extent of image PS
  7-8   Y extent of image PS

Image Picture Data (IPD): required
  Structured Field Introducer
  0-1   Length
  2-4   IPD XID3EEFB'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters (all required and in this order, except that only one
  of image LUT-ID and IDE structure is present)

  Begin Segment
  0     Type X'70': begin segment
  1     Length of following X'00'

  Begin Image Content
  0     Type X'91': Begin Image Content
  1     Length of following X'01'
  2     Format X'FF'

  Image Size
  0     Type X'94': image size
  1     Length of following X'09'
  2     Units of measure X'02': logical
  3-4   Horizontal resolution
  5-6   Vertical resolution
  7-8   Height in pels
  9-10  Width in pels

  Image Encoding
  0     Type X'95': image encoding
  1     Length of following X'02'
  2     Compression algorithm X'03': none
  3     Recording algorithm X'03': bottom-to-top

  Image IDE-Size
  0     Type X'96': image IDE-Size
  1     Length of following X'0l'
  2     Number of bits per element

  Image LUT-ID
        (For bit maps with other than 24 bits per pel)
  0     Type X'97' Image LUT-ID
  1     Length of following X'Ol'
  2     LUT-ID

  IDE Structure
        (For bit maps with 24 bits per pel)
  0     Type X'9B': IDE structure
  1     Length of following X'08'
  2     Flags:
        0  ABFlag
           B'0' Normal (Additive)
        1-7 Reserved B'0000000'
  3     Format
        X'01' RGB
  4-6   Reserved X'000000'
  7     Size of element 1
  8     Size of element 2
  9     Size of element 3

Image Picture Data (IPD): required, repeating
  Structured Field Introducer
  0-1   Length
  2-4   IPD X'D3EEFB'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters

  Image Data
  0-1   Type X'FE92': image data
  2-3   Length of following
  4-n   Image data (scan lines of bit maps)

  End Image Content
        (required, only present in last Image Picture Data)
  0     Type X'93': End Image Content
  1     Length of following X'00'

  End Segment
        (required, only present in last Image Picture Data)
  0     Type X'71': end segment
  1     Length of following X'00'

End Image Object (EIM): required if BIM present
  Structured Field Introducer
  0-1   Length X'0010'
  2-4   EIM X'D3A9FB'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-7 Image name C'xxxx xxxx'

Begin Graphics Object (BGR): required
  Structured Field Introducer
  0-1   Length X'0010'
  2-4   BGR X'D3A8BB'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-7   Graphics object name C'0000 0007'

Begin Object Environment Group (BOG): optional
  Structured Field Introducer
  0-1   Length X'0016'
  2-4   BOG X'D3A8C7'
  5       Flags X'00'
  6-7     Segment sequence number X'0000'

  Parameters
  0-7 Object Environment Group
      name C'0000 0007'

Map Color Attribute Table (MCA): required
  Structured Field Introducer
  0-1   Length X'0016'
  2-4   MCA X'D3AB77'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-1 Length

  Triplet (required)
  0     Length X'0C'
  1     Triplet type:
        fully qualified name X'02'
  2     Type: ref to
        Begin Resource Object X'84'
  3     ID    X'00'
  4-11  Color table name C'0000 0004'

Map Coded Font (MCF): required, for default font
  Structured Field Introducer
  0-1   Length X'20'
  2-4   MCF X'D3AB8A'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-1   Length

  Triplets (required)

  Font name
  0     Length X'0C'
  1     Triplet type:
        fully qualified name X'02'
  2     Type: ref to coded font X'84'
  3     ID  X'00'
  4-11  Coded font name: C'nnxx xxxx'
        where n is X'FF'

  lcid
  0     Length X'04'
  1     Triplet type:
        Resource Local ID X'24'
  2     Type: Coded Font Resource X'05'
  3     Local identifier (LCID) X'00'

  Font Binary GCID
  0     Length X'06'
  1     Triplet type: Font Binary GCID X'20'
  2-5   GCID

Map Coded Font (MCF): optional, repeating, for loaded fonts
  Structured Field Introducer
  0-1   Length X'58'
  2-4   MCF X'D3AB8A'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-1 Length

  Triplets (required)

  Font name
  0     Length X'0C'
  1     Triplet type:
        fully qualified name X'02'
  2     Type: ref to coded font X'84'
  3     ID X'00'
  4-11  Coded font name

  lcid
  0     Length X'04'
  1     Triplet type:
        Resource Local ID X'24'
  2     Type: coded font resource X'05'
  3     Local identifier (LCID)

  Font Attributes
  0     Length X'14'
  1     Triplet type:
        Font Descriptor X'IF'
  2     Weight Class
  3     Width Class
  4-5   Font Height
  6-7   Char Width
  8     Descript Flags
  9     Usage Codes
  10    Family
  11    Activity Class
  12    Font Quality
  13-14 CAP Height
  15-16 X Height
  17-18 Line Density
  19    Use Flags

  Font Binary GCID
  0     Length X'06'
  1     Triplet type:
        Font Binary GCID X'20'
  2-5   GCID

  Font Typeface
  0     Length X'24'
  1     Triplet type:
        fully qualified name X'02'
  2     Type: ref to font typeface X'08'
  3     ID X'00'
  4-35  Font typeface C'xxx..xxx'

Map Data Resource (MDR): optional, repeating
  Structured Field Introducer
  0-1   Length X'lD'
  2-4   MDR X'D3ABC3'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-1   Length

  Triplets (required)

  Bit-map Name
  0     Length X'0C'
  1     Triplet type:
        fully qualified name X'02'
  2     Type: ref to Imaqe Object X'84'
  3     ID X'00' .
  4-11  Image name C'xxxx xxxx'

  Extended Resource lcid
  0     Length X'07'
  1     Triplet type:
        Extended Resource Local ID X'22'
  2     Type: Image Resource X'10'
  3-6   Bit-map handle

End Object Environment Group (EOG): required if BOG present

  Structured Field Introducer
  0-1   Length X'0010'
  2-4   EOG X'D3A9C7'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-7 Object Environment Group name C'0000 0007'

Graphics Data Descriptor (GDD): required

  Structured Field Introducer
  0-1   Length X'nnnn'
  2-4   GDD X'D3A6BB'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters (all required and in this order)
  0     X'F7' Specify GVM Subset
  1     Length of following data X'07'
  2     X'B0' drawing order subset
  3-4   X'0000'
  5     X'23' Level 3.2
  6     X'Ol' Version 1
  7     Length of following field X'Ol'
  8     Coordinate types in data
        X'04' Intel16
        X'05' Intel32

  0     X'F6' Set Picture Descriptor
  1     Length of following data
  2     Flags
        0 B'0' Picture in 2D
        1 Picture Dimensions
          B'0' Not absolute (PU_ARBITRARY PS)
          B'1' Absolute (example: PU_TWIPS PS)
        2 Picture Elements
          B'0' Not pels
          B'1' Pels (PU_PELS PS)
               (Bit 1 must also be set)
        3-7 B'00000'
  3     X'00' Reserved
  4     Picture frame size coordinate type
        X'04' Intel16
        X'05' Intel32
  5     UnitsOfMeasure
        X'00' Ten inches
        X'0l' Decimeter
  6-11 or 6-17 (2 or 4 bytes) Resolution.
        GPS Units / UOM on x axis
        GPS Units / UOM on y axis
        GPS Units / UOM on z axis
  12-23 or 18-41 (2 or 4 bytes) Window Size.
        GPS X left, X right
        GPS Y bottom, Y top
        GPS Z near, Z far

  0     X'21' Set Current Defaults
  1     Length of following data
  2     Set Default Parameter Format X'08'
  3-4   Mask X'E000'
  5     Names X'8F'
  6     Coordinates
        X'00' Picture in 2D
  7     Transforms
        X'04' Intel16
        X'05' Intel32
  8     Geometrics
        X'04' Intel16
        X'05' Intel32

  0     X'21' Set Current Defaults
  1     Length of following data
  2     Set default viewing transform X'07'
  3-4   Mask X'CC0C'
  5     Names X'8F'
  6-n   M11, M12, M21, M22, M41, M42  Matrix elements

  0     X'21' Set Current Defaults
  1     Length of following data
  2     Set default line attributes X'01'
  3-4   Mask--OR of as many of the following bits as are required:
        X'8000'  Line type
        X'4000'  Line width
        X'2000'  Line end
        X'1000'  Line join
        X'0800'  Stroke width
        X'0008'  Line color
        X'0002'  Line mix
  5	   Flags
        X'0F'Set indicated default
                    attributes to initial values.
                    (Data field is not present
                    in this instance).
        X'8F' Set indicated default attributes
                    to specified values.
  6-n Data--data values as required, in the
                    following order if present.
      No space is reserved for attributes for which the
      corresponding mask flag was not set.
      (1 byte)---Line type
      (1 byte)---Line width
      (1 byte)---Line end
      (1 byte)---Line join
      (G bytes)--Stroke width
      (4 bytes)--Line color
      (1 byte)---Line mix
                 (G=2 or 4 depending on the Geometrics
                 parameter of Set Default Parameter Format)

  0     X'21' Set Current Defaults
  1     Length of following data
  2     Set Default Character Attributes X'02'
  3-4   Mask--OR of as many of the following bits as are required:

        X'8000'  Character angle
        X'4000'  Character box
        X'2000'  Character direction
        X'1000'  Character precision
        X'0800'  Character set
        X'0400'  Character shear
        X'0040'  Character break extra
        X'0020'  Character extra
        X'O008'  Character color
        X'0004'  Character background color
        X'0002'  Character mix
        X'0001'  character background mix
  5     Flags
        X'0F' Set indicated default attributes to initial values.
                    (Data field is not present in this case).
        X'8F' Set indicated default attributes to specified values.
  6-n   Data--data values as required, in the following order if
        present.

        No space is reserved for attributes for which the
        corresponding Mask flag was not set.
        (2*G bytes) - Character angle
        (2*G + 4 bytes) - Character box
        (1 byte)    - Character direction
        (1 byte)    - Character precision
        (1 byte)    - Character set
        (2*G bytes) - Character shear
        (4 bytes)   - Character break extra
        (4 bytes)   - Character extra
        (4 bytes)   - Character color
        (4 bytes)   - Character background color
        (1 byte)    - Character mix
        (1 byte)    - Character background mix
           (G=2 or 4 depending on the Geometrics parameter of Set
           Default Parameter Format)

  0     X'21' Set Current Defaults
  1     Length of following data
  2     Set Default Marker Attributes X'03'
  3-4   Mask--OR of as many of the following bits as are required:
        X'4000'   Marker box
        X'1000'   Marker precision
        X'0800'   Marker set
        X'0080'   Marker symbol
        X'0008'   Marker color
        X'0004'   Marker background color
        X'0002'   Marker mix
        X'0001'   Marker background mix
  5     Flags
        X'0F' Set indicated default attributes to initial values.
                      (Data field is not present in this instance)
        X'8F' Set indicated default attributes to specified values.
  6-n   Data--data values as required, in this order if present.
        No space is reserved for attributes for which the
        corresponding Mask flag was not set.
        (2*G bytes) - Marker box
        (1 byte)    - Marker precision
        (1 byte)    - Marker set
        (1 byte)    - Marker symbol
        (4 bytes)   - Marker color
        (4 bytes)   - Marker background color
        (1 byte)    - Marker mix
        (1 byte)    - Marker background mix
          (G=2 or 4 depending on the Geometrics parameter of Set
          Default Parameter Format)

  0     X,'21,' Set Current Defaults
  1     Length of following data
  2     Set Default Pattern Attributes X'04'
  3-4   Mask--OR of as many of the following bits as are required:

        X'0800'   Pattern set
        X'0100'   Pattern symbol
        X'0080'   Pattern reference point
        X'0008'   Pattern color
        X'0004'   Pattern background color
        X'0002'   Pattern mix
        X'0001'   Pattern background mix
  5     Flags
        X'0F' Set indicated default attributes to initial values.
           (Data field is not present in this instance)
        X'8F' Set indicated default attributes to specified values.
  6-n   Data--data values as required, in this order if present.
        No space is reserved for attributes for which the
        corresponding Mask flag was not set.
        (1 byte)    - Pattern set
        (1 byte)    - Pattern symbol
        (2*G bytes) - Pattern reference point
        (4 bytes)   - Pattern color
        (4 bytes)   - Pattern background color
        (1 byte)    - Pattern mix
        (1 byte)    - Pattern background mix

        (G=2 or 4 depending on the Geometrics parameter of Set
        Default Parameter Format)

  0     X'21' Set Current Defaults
  1     Length of following data
  2     Set Default Image Attributes X'06'
  3-4   Mask--OR of as many of these bits as are required:
        X'0008' Image color
        X'0004' Image background color
        X'0002' Image mix
        X'0001' Image background mix
  5     Flags
        X'0F' Set indicated default attributes to initial values.
                     (Data field is not present in this instance)
        X'8F' Set indicated default attributes to specified values.
  6-n   Data--data values as required, in this order if present.
        No space is reserved for attributes for which the
        corresponding Mask flag was not set.
        (4 bytes)       - Image color
        (4 bytes)       - Image background color
        (1 byte)        - Image mix
        (1 byte)        - Image background mix

  0     X'21' Set Current Defaults
  1     Length of following data
  2     Set Default Viewing Window X'05'
  3-4   Mask--OR of as many of the following bits as are required:
        X'8000' x left limit
        X'4000' x right limit
        X'2000' y bottom limit
        X'1000' y top limit
  5     Flags
        X'0F' Set indicated default attributes to initial values.
                        (Data field is not present in this case).
        X'8F' Set indicated default attributes to specified values.
  6-n   Data--data values as required, in the following order if
        present. No space is reserved for attributes for which the
        corresponding Mask flag was not set.
        (2*G bytes) - x left limit
        (2*G bytes) - x right limit
        (2*G bytes) - y bottom limit
        (2*G bytes) - y top limit
           (G=2 or 4 depending on the Geometrics parameter of Set
           Default Parameter Format)

  0     X'21' Set Current Defaults
  1     Length of following data
  2     Set Default Arc Parameters X'0B'
  3-4   Mask--OR of as many of the following bits as are required:
        X'8000' P value
        X'4000' Q value
        X'2000' R value
        X'1000' S value
  5     Flags
        X'0F' Set indicated default attributes to initial values.
                        (Data field is not present in this case).
        X'8F' Set indicated default attributes to specified values.
  6-n   Data--data values as required, in the following order if
        present. No space is reserved for attributes for which the
        corresponding Mask flag was not set.
        (G bytes) - P value
        (G bytes) - Q value
        (G bytes) - R value
        (G bytes) - S value
          (G=2 or 4 depending on the Geometrics parameter of Set
          Default Parameter Format)

  0     X'21' Set Current Defaults
  1     Length of following data
  2     Set Default Pick Identifier X'0C'
  3-4   Mask--OR of as many of the following bits as are required:
        X'8000' Pick identifier
  5     Flags
        X'0F' Set indicated default attributes to initial values.
                        (Data field is not present in this case).
        X'8F' Set indicated default attributes to specified values.
  6-n   Data--data values as required, in the following order if
        present. No space is reserved for attributes for which the
        corresponding Mask flag was not set.
        (4 bytes) - Pick identifier

  0     X'E7' Set Bit-map Identifier
  1     Length of following data X'07'
  2-3   Usage Flags X'8000'
  4-7   Bit-map handle
  8     Lcid

Graphics Data (GAD): optional, repeating

  Structured Field Introducer
  0-1   Length X'n+9'
  2-4   GAD X'D3EEBB'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters (maximum length in one structured field is 32759)

  Graphics Segment (optional, repeating)
  Segment data (including the Begin Segment parameter) can be split
  at any point between successive Graphics Data structured fields.
  0     X'70' Begin Segment
  1     Length of following data X'0E'
  2-5   Segment identifier
  6     Segment attributes (1)
        0 B'1' Invisible
        1 B'1' Propagate invisibility
        2 B'1' Detectable
        3 B'1' Propagate detectability
        6 B'1' Dynamic
        7 B'1' Fast chaining
  7     Segment attributes (2)
        0 B'1' Non-chained
        3 B'1' Prolog
  8-9   Segment data length (low-order 2 bytes)
  10-13 Reserved
  14-15 Segment data length (high-order 2 bytes)
  16-n  Graphics orders (see page 33-1)

End Graphics Object (EGR)
  Structured Field Introducer
  0-1   Length X'0010'
  2-4   EGR X'D3A9BB'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-7 Graphics object name C'0000 0007'

End Resource Group (ERG): required
  Structured Field Introducer
  0-1   Length X'0010'
  2-4   ERG X'D3A9C6'
  5     Flags X'00'
  6-7   Segment sequence number X'0000'

  Parameters
  0-7 Resource Group name  C'0000 0002'

End Document (EDT): required

Structured Field Introducer
0-1     Length X'0010'
2-4     EDT X'D3A9A8'
5       Flags X'00'
6-7     Segment sequence number X'0000'

Parameters
0-7     Document name    C'0000 0001'