Windows Metafile (WMF) is an image file format originally designed for Microsoft Windows in the 1990s. The original Windows Metafile format was not device-independent (though could be made more so with placement headers) and may contain both vector graphics and bitmap components. It acts in a similar manner to SVG files. WMF files were later superseded by Enhanced Metafiles (EMF files) which did provide for device-independence. EMF files were then themselves enhanced via EMF+ files.
Essentially, a metafile stores a list of records consisting of drawing commands, property definitions and graphics objects to display an image on screen. The drawing commands used are closely related to the commands of the Graphics Device Interface (GDI) API used for drawing in Microsoft Windows.
There are three major types of metafiles – a WMF is a 16-bit format introduced in Windows 3.0. It is the native vector format for Microsoft Office applications such as Word, PowerPoint, and Publisher. , revision 18 of the Windows Metafile Format specification is available. EMF files, which replaced WMF files, work on the same principle only it is a 32-bit file format that also allows for the embedding of private data within "comment" records. EMF+ is an extension to EMF files and embedded in these comment records, allowing for images and text using commands, objects and properties that are similar to Windows GDI+.
History The original 16 bit WMF file format was fully specified in volume 4 of the 1992 Windows 3.1 SDK documentationMicrosoft Windows 3.1 Programmers Reference, Volume 4 Resources, Microsoft Press 1992, , chapter 3 pp. 21-45 (at least if combined with the descriptions of the individual functions and structures in the other volumes), but that specification was vague about a few details. These manuals were published as printed books available in bookstores with no click through EULA or other unusual licensing restrictions (just a general warning that if purchased as part of a software bundle, the software would be subject to one).
Over time the existence of that historic specification was largely forgotten and some alternative implementations resorted to reverse engineering to figure out the file format from existing WMF files, which was difficult and error prone. In September 2006, Microsoft again published the WMF file format specification in a more complete form in the context of the Microsoft Open Specification Promise, promising to not assert patent rights to file format implementors.
Microsoft later deprecated WMF files in favour of 32-bit EMF files as WMF files had real issues with device independence, despite the use of a "placeable" file header which provided basic device independence. Microsoft found that developers who use the format were "[embedding] application, location, or scaling comments in the metafiles... Others added headers to the metafile that provided various application-specific information", causing major compatibility issues. Thus, in 1992 with Windows NT 3.1, Microsoft introduced the Enhanced Metafile format (EMF) — a format which was based on the Win32 API and with which they built-in device independence. — these were also known as NT metafiles. With the release of Windows XP and GDI+, the set of records had to be significantly increased and so Microsoft released EMF+ as an extension to the existing EMF file format.
Metafile structure
WMF, EMF and EMF+ files all consist of a series of records that are played back to produce graphical output. Some records define objects which can specify graphical objects used to determine how graphics should be drawn (e.g. pens specify the color and width of lines). Each of these objects are stored in metafiles and are placed into an object table, which tracks the usage of graphic objects while processing the metafile. The object table is an associative array of indexes to graphical object structures defined within the metafile.
WMF and EMF files handle object processing differently to EMF+ records in EMF files. As a WMF and EMF file is being processed, the records are read into an object table once an object is defined. If an object is deleted then the object is released from the table and the identifier can be reused. Notably an object will not be used until it is specifically selected during record playback. This differs for EMF+ files, which also use an associative array via a hashmap which records the object along with an object identifier. However, unlike WMF and EMF files which can delete an object, when a new object is created that has the same index as an existing object, the entry in the table is replaced with the new object. An EMF file also does not need to specifically select an object before it is used.
WMF
WMF files were not originally designed to be device independent, meaning that a file could not be played back on output devices that differed from the original device on which the file was recorded. A partial solution to this issue was invented by Aldus Corporation, who added an additional "placeable" header, called the "APM header", which added a bounding rectangle, a metafile version, metafile size, number of objects in the metafile and the size of the largest single record in the metafile. This was later incorporated into the WMF format by Microsoft, starting in Windows 2000.
WMF files are structured by a series of records, starting with a number of control records: the header record, the aforementioned optional placeable record, and finished by an end of file record.
Encapsulated by the control records are the records that make up the image itself. These records work within what is known as the playback device context, which is the collection of properties and objects that make up a device's graphical environment as the metafile is being "played back" onto this output device.
Records other than control records can be largely grouped into bitmap records, drawing records, object records, state records and escape records.
Bitmap records
Bitmap records manage and output bitmap images.
Name Description META_BITBLT Specifies how to do a bit block transfer. These records can specify a bitmap to use as the source, or a region. META_DIBBITBLT Specifies how to do a bit block transfer of a device-independent bitmap image. These records can specify a bitmap to use as the source, or a region. META_DIBSTRETCHBITBLT Specifies how to do a bit block transfer of a device-independent bitmap image, but allows for expansion or contraction of the image. These records can specify a bitmap to use as the source, or a region. META_SETDIBTODEV Specifies color to set a block of pixels in a device-independent bitmap image. These records can specify a bitmap to use as the source, or a region. META_STRETCHBLT Specifies how to do a bit block transfer, but allows for expansion or contraction of the image. META_STRETCHDIB Specifies how to do a bit block transfer of a device-independent bitmap image, but allows for expansion or contraction of the image. These records can specify a bitmap to use as the source, or a region.
Drawing records Drawing records produce graphics output.
Name Description META_ARC Draws an elliptical arc. META_CHORD Draws a chord. META_ELLIPSE Draws an elliptical arc. META_EXTFLOODFILL Fills an area with a brush. META_EXTTEXTOUT Draw text with font, background color and text color of the playback device context. META_FILLREGION Fills a region with a specified brush. META_FLOODFILL Fills an area with a brush. META_FRAMEREGION Draws a border around a region of the page with a brush. META_INVERTREGION Paints a region of the graphic with inverted colors. META_LINETO Draws a half-open line from the drawing position defined in the playback device context to a specified point. META_PAINTREGION Paint a region with the current brush specified in the playback device context. META_PATBLT Paint a region with the current brush specified in the playback device context and then combine the brush color and surface color(s) using a raster operation. META_PIE Draw a pie-shaped wedge bounded by the intersection of an ellipse and two radials — the line is set via the pen set via the playback device context, and the area bounded by the pie shape is filled in by the current brush of the playback device context. META_POLYLINE Draws a series of line segnments by connecting the points in a specified array. META_POLYGON Paints a polygon consisting of two or more vertices connected by straight lines. The polygon is outlined by using the pen and filled by using the brush and polygon fill mode that are defined in the playback device context. META_POLYPOLYGON Paints a series of closed polygons, which may overlap. Each polygon is outlined by using the pen and filled by using the brush and polygon fill mode that are defined in the playback device context. META_RECTANGLE Paints a rectangle, which is outlined by using the pen and filled by using the brush and is filled by using the brush that is defined in the playback device context. META_ROUNDRECT Paints a rectangle with rounded corners. The rectangle is outlined by using the pen and filled by using the brush and is filled by using the brush that is defined in the playback device context. META_SETPIXEL Sets the pixel at the specified coordinates to the specified color. META_TEXTOUT Outputs a character string at the specified location by using the font, background color, and text color that are defined in the playback device context.
Object records Object records create and manage graphics objects. In WMF files there are two broad categories of objects – graphics objects and structure objects. Structure objects are not explicitly created or deleted in a WMF, they are instead of complex structures. For example, the BitmapCoreHeader contains information about the dimensions and color format of a device-independent bitmap, which is itself part of a DeviceIndependentBitmap object. A graphics object, however, specifies parameters for graphics output and during playback of the WMF it sets up the playback device context.
Graphics objects can be brushes (defines the style, color and pattern of a brush which defines how to paint an area of the graphic), fonts (defines properties that affect how text is displayed), palettes (specifies colors as device-independent values, defined by an application), pens (specifies the graphical attributes of a line), and regions (which specify line and curve segments that define a shape).
Name Description META_CREATEBRUSHINDIRECT Creates a brush object from a LogBrush (logical brush) object. META_CREATEFONTINDIRECT Creates a brush object from a font object. META_CREATEPALETTE Creates a palette object. META_CREATEPATTERNBRUSH Creates a brush object from a LogBrush (logical brush) object. META_CREATEPENINDIRECT Creates a pen object. META_CREATEREGION Creates a region object. META_DELETEOBJECT Delete an object. META_CREATEBRUSHINDIRECT Creates a brush object from a LogBrush (logical brush) object. META_DIBCREATEPATTERNBRUSH Creates a brush object from a device-independent bitmap. META_SELECTCLIPREGION Specifies the region object that will be the current clipping region. META_SELECTOBJECT Selects the object that will be the current object for the playback device context, which works on all graphics objects except palette objects, which must be set with META_SELECTPALETTE. META_SELECTPALETTE Selects the logical palette for the playback device context.
State records State records manage the graphics properties of the playback device context.