Format of GEM metafile (.GEM)
Overview
The GEM metafile is a stored sequence of GEM drawing instructions. Its normal uses are:
- The native file format of GEM Draw, a vector drawing program;
- GEM Paint always produces a minimal .GEM file to accompany the .IMG files it saves.
- The standard method used for printing in GEM. Because GEM is small enough to run in 512k of RAM, there is usually not enough room in memory for a large program and a printer driver. Therefore the program generates a metafile, and then runs OUTPUT.APP to send that metafile to the printer.
Judging by the code in GEM Output, .GMP files created by Desktop Publisher use the same or a very similar format.
All word values are 16-bit, signed and little-endian (at least in Intel GEM). In this listing, "DW" (define word) is used to indicate such a word.
File header
All GEM metafiles start with a header:
DW magic ;Magic number. DW length ;Header length DW version ;GEM version required to interpret this file. DW coords ;Coordinate type DW Xmin,Ymin,Xmax,Ymax DW Xpage,Ypage DW Xminc,Yminc,Xmaxc,Ymaxc DW flags
Most GEM metafiles have a 24-word header; the remaining header words being reserved.
- magic
- is always -1 (0xFFFF)
- length
- is the number of words in the header; in most metafiles, this will be 24 (0x18). Some metafiles (those generated by Deskpress) have been seen with headers 71 words long; words nos. 23-70 being a text description with one character per word.
- version
- is the GEM version needed to play back this file, encoded as a
decimal number. Common versions are:
- 0 (ie, any GEM)
- Metafile EVENTS.GEM in the Programmers' Toolkit
- 101 (ie, GEM 1.01)
- Metafiles produced by GEM Paint and GEM Draw
- 310 (ie, GEM 3.10)
- Metafiles produced by Deskpress.
- 400 (ie, GEM 4.00)
- Metafiles produced by Artline.
- coords
- is the coordinate system in use. This is either 0 (Normalised
Device Coordinates) or 2 (Raster Coordinates).
- NDC files have their origin in the bottom left hand corner of the page, and coordinates are given as 32767 * fraction of the page size (so 16383 means halfway across the page).
- RC files have their origin at the top left hand corner of the page, and coordinates are given in pixels.
Nearly always, files will be in raster coordinates.
- Xmin,Ymin,Xmax,Ymax
- The maximum and minimum coordinates used by the image.
- Xpage,Ypage
- The size of the page, in tenths of millimetres. Can be zero.
- Xminc,Yminc,Xmaxc,Ymaxc
- The bottom left and top right corners of the coordinate system. In the case of GEM Paint images, this is the maximum size that the bitmap could have been (in pixels). These values can be zero, in which case the coordinate system is assumed to go from (0,0) to (32767,32767).
- Flags
- Bit 0 is set if the metafile is a wrapper for a bitmap image (eg: those files written by GEM Paint).
Metafile records
The body of the file is composed of drawing commands. Each record is laid out as follows:
DW command DW n_points DW n_integers DW subcommand- then n_points pairs of coordinates:
DW x DW y- and finally n_integers integers:
DW z
The command and subcommand numbers are the same as those used in VDI calls - see the VDI list for details.
Metafile sub-opcodes
VDI function 5, subfunction 99 is used to implement functions unique to metafiles. These functions must take at least one integer parameter, which is the "sub-opcode":
10 Start Group. 11 End Group. 32 Set Bezier curve quality. Two further integer parameters; the first is always 1, and the second is the quality (%). 49 Set No Line Style. 50 Set Attribute Shadow On. 51 Set Attribute Shadow Off. 80 Start Draw Area Type Primitive. 81 End Draw Area Type Primitive.
End of metafile
DW -1 ;End
The file is terminated by the function number -1.
PAINT.APP files
Files produced by PAINT.APP contain one drawing instruction:
DW 5 ;Escape DW 2 ;2 points DW lf ;5 + length of filename DW 23 ;Bitmap image escape DW xmin,ymin,xmax,ymax DW aspect ; 0 to ignore aspect ratio, 1 to preserve it DW xscale ; X axis scaling: 0 = fractional, 1 = integer DW yscale ; Y axis scaling: 0 = fractional, 1 = integer DW halign ; Horizontal alignment: 0=left 1=centre 2=right DW valign ; Vertical alignment: 0=top 1=centre 2=bottom DW filename character 1 DW filename character 2 ... DW filename character n
The filename is the name (no path) of the corresponding .IMG file.