Метафайл Windows — Windows Metafile
Метафайл Windows (WMF ) — это формат файла изображения изначально разработан для Microsoft Windows в 1990-х годах. Исходный формат метафайла Windows не был независимым от устройства (хотя его можно было сделать в большей степени с помощью заголовков размещения) и мог содержать компоненты как векторной графики , так и растрового изображения . Он действует аналогично файлам SVG . Файлы WMF позже были заменены расширенными метафайлами (файлы EMF), которые действительно обеспечивали независимость от устройств. Затем файлы EMF сами улучшались с помощью файлов EMF + .
По сути, метафайл хранит список записей, состоящий из команд рисования, определений свойств и графических объектов для отображения изображения на экране. Используемые команды рисования тесно связаны с командами интерфейса графического устройства (GDI) API , используемых для рисования в Microsoft Windows.
Существует три основных типа метафайлов — WMF — это 16-битный формат, представленный в Windows 3.0 . Это собственный векторный формат для приложений Microsoft Office , таких как Word , PowerPoint и Publisher . Начиная с 2017 г. 14 версия спецификации формата метафайлов Windows доступна для чтения в Интернете или для загрузки в формате PDF. Файлы EMF, которые заменили файлы WMF, работают по тому же принципу, только это 32-разрядный формат файла, который также позволяет встраивать личные данные в записи «комментариев». EMF + — это расширение для файлов EMF и встроенное в эти записи комментариев, позволяющее использовать для изображений и текста команды, объекты и свойства, аналогичные Windows GDI + .
Содержание
История
Исходный 16-битный формат файла WMF был полностью указан в томе 4 документация Windows 3.1 SDK 1992 года (по крайней мере, если она сочетается с описаниями отдельных функций и структур в других томах), но эта спецификация расплывчата по некоторым деталям. Эти руководства были опубликованы в виде печатных книг, доступных в книжных магазинах без переходов по EULA или других необычных лицензионных ограничений (просто общее предупреждение о том, что при покупке в составе пакета программного обеспечения программное обеспечение будет подлежат одному).
Со временем о существовании этой исторической спецификации было в значительной степени забыто, и некоторые альтернативные реализации прибегли к обратному проектированию, чтобы выяснить формат файла из существующих файлов WMF, что было сложно и подвержено ошибкам. В сентябре 2006 года Microsoft снова опубликовала спецификацию формата файлов WMF в более полной форме в контексте Microsoft Open Specification Promise , пообещав не заявлять патентные права разработчикам форматов файлов.
Позднее Microsoft отказалась от файлов WMF в пользу 32-разрядных файлов EMF, поскольку файлы WMF имели реальные проблемы с независимостью от устройства, несмотря на использование «размещаемого» заголовка файла, который обеспечивал базовую независимость от устройства. Microsoft обнаружила, что разработчики, использующие этот формат, «[встраивали] приложение, расположение или масштабирование комментариев в метафайлы . Другие добавляли в метафайл заголовки, которые предоставляли различную информацию о приложении», что приводило к серьезным проблемам совместимости. Так, в 1992 г. с Windows NT 3.1 Microsoft представила формат расширенного метафайла (EMF) — формат, основанный на Win32 API, с которым они встроили независимость от устройств. . — они также были известны как метафайлы NT. С выпуском Windows XP и GDI + набор записей пришлось значительно увеличить, и поэтому Microsoft выпустила EMF + как расширение существующего формата файлов EMF.
Структура метафайлов
Файлы WMF, EMF и EMF + состоят из серии записей, которые воспроизводятся для создания графического вывода. Некоторые записи определяют объекты, которые могут указывать графические объекты, используемые для определения способа рисования графики (например, перья определяют цвет и ширину линий). Каждый из этих объектов хранится в метафайлах и помещается в таблицу объектов, которая отслеживает использование графических объектов при обработке метафайла. Таблица объектов — это ассоциативный массив индексов структур графических объектов, определенных в метафайле.
Файлы WMF и EMF обрабатывают объекты иначе, чем записи EMF + в файлах EMF. В процессе обработки файлов WMF и EMF записи считываются в таблицу объектов после определения объекта. Если объект удален, объект удаляется из таблицы, и идентификатор можно использовать повторно. Примечательно, что объект не будет использоваться, пока он не будет специально выбран во время воспроизведения записи. Это отличается от файлов EMF +, которые также используют ассоциативный массив через хэш-карту , которая записывает объект вместе с идентификатором объекта. Однако, в отличие от файлов WMF и EMF, которые могут удалять объект, когда создается новый объект, имеющий тот же индекс, что и существующий объект, запись в таблице заменяется новым объектом. Для файла EMF также не нужно специально выбирать объект перед его использованием.
Файлы WMF изначально не были разработаны как независимые от устройств, что означает, что вы не могли воспроизвести файл на устройствах вывода, отличных от исходного устройства, на котором был записан файл. Частичное решение этой проблемы было изобретено Aldus Corporation , которая добавила дополнительный «размещаемый» заголовок, названный «заголовком APM», который добавил ограничивающий прямоугольник, версию метафайла, размер метафайла, количество объектов. в метафайле и размер самой большой отдельной записи в метафайле. Позднее он был включен в формат WMF Microsoft, начиная с Windows 2000.
Файлы WMF структурированы серией записей, начиная с ряда контрольных записей: запись заголовка, вышеупомянутая необязательная размещаемая запись, и заканчивается записью конца файла .
Инкапсулированные контрольными записями записи, составляющие само изображение. Эти записи работают в так называемом контексте устройства воспроизведения, который представляет собой набор свойств и объектов, составляющих графическую среду устройства, когда метафайл «воспроизводится» на этом устройстве вывода.
Другие записи. чем управляющие записи могут быть в значительной степени сгруппированы в записи растровых изображений, записи чертежей, записи объектов, записи состояний и записи перехода.
Записи растрового изображения
Управление записями растрового изображения и вывод растровых изображений .
Имя | Описание |
META_BITBLT | Определяет, как выполнять передачу битового блока . Эти записи могут указывать растровое изображение для использования в качестве источника или регион. |
META_DIBBITBLT | Определяет, как выполнить передачу битового блока независимого от устройства растрового изображения изображения. Эти записи могут указывать растровое изображение для использования в качестве источника или региона. |
META_DIBSTRETCHBITBLT | Определяет, как выполнять передачу битовых блоков независимого от устройства растрового изображения, но допускает расширение или сжатие образ. Эти записи могут указывать растровое изображение для использования в качестве источника или область. |
META_SETDIBTODEV | Определяет цвет для установки блока пикселей в независимом от устройства растровом изображении. Эти записи могут указывать растровое изображение для использования в качестве источника или региона. |
META_STRETCHBLT | Определяет, как выполнить передачу битового блока, но допускает расширение или сжатие изображения. |
META_STRETCHDIB | Определяет, как выполнить передачу битовых блоков независимого от устройства растрового изображения, но позволяет увеличивать или уменьшать изображение. Эти записи могут указывать растровое изображение для использования в качестве источника или область. |
Записи чертежа
Записи чертежа производят графический вывод.
Имя | Описание |
META_ARC | Рисует эллиптическую дугу . |
META_CHORD | Рисует хорду . |
META_ELLIPSE | Рисует эллиптическую дугу . |
META_EXTFLOODFILL | Заполняет область кистью. |
META_EXTTEXTOUT | Рисует текст со шрифтом, цветом фона и цветом текста в контексте устройства воспроизведения . |
META_FILLREGION | Заполняет область указанной кистью. |
META_FLOODFILL | Заполняет область кистью. |
META_FRAMEREGION | Рисует границу вокруг область страницы с помощью кисти. |
META_INVERTREGION | Закрашивает область изображения инвертированными цветами. |
META_LINETO | Рисует полуоткрытый линия от позиции рисования, определенной в контексте устройства воспроизведения, до указанной точки. |
META_PAINTREGION | Закрашивание области текущей кистью, указанной в контексте устройства воспроизведения. |
META_PATBLT | Нарисуйте область текущей кистью, указанной в контексте устройства воспроизведения, а затем объедините цвет кисти и цвет (а) поверхности с помощью растровой операции . |
META_PIE | Нарисуйте клин в форме пирога, ограниченный пересечением эллипса и двух радиалов — линия устанавливается через перо устанавливается через контекст устройства воспроизведения, а область, ограниченная круговой формой, заполняется текущей кистью контекста устройства воспроизведения. |
META_POLYLINE | Рисует серию сегментов линии, соединяя точки в указанный массив. |
META_POLYGON | Закрашивает многоугольник , состоящий из двух или более вершин , соединенных прямыми линиями. Многоугольник обводится пером и заполняется с помощью кисти и режима заливки многоугольника, которые определены в контексте устройства воспроизведения. |
META_POLYPOLYGON | Закрашивает серию замкнутых многоугольников, которые могут перекрываться. Каждый многоугольник обводится пером и заполняется с помощью кисти и режима заливки многоугольника, которые определены в контексте устройства воспроизведения. |
META_RECTANGLE | Закрашивает прямоугольник, который обводится с помощью пера и заполняется с помощью кисти и заполняется с помощью кисти, определенной в контексте устройства воспроизведения. |
META_ROUNDRECT | Закрашивает прямоугольник со скругленными углами. Прямоугольник обводится пером, заполняется кистью и заполняется кистью, которая определена в контексте устройства воспроизведения. |
META_SETPIXEL | Устанавливает пиксель с указанными координатами на указанные цвет. |
META_TEXTOUT | Выводит строку символов в указанном месте, используя шрифт, цвет фона и цвет текста, которые определены в контексте устройства воспроизведения. |
Объект записи
Записи объектов создают графические объекты и управляют ими. В файлах WMF есть две широкие категории объектов — графические объекты и объекты структуры. Объекты структуры не создаются и не удаляются в WMF явно, а вместо сложных структур. Например, BitmapCoreHeader содержит информацию о размерах и цветовом формате не зависящего от устройства растрового изображения, которое само является частью объекта DeviceIndependentBitmap. Графический объект, однако, определяет параметры для вывода графики, а во время воспроизведения WMF он устанавливает контекст устройства воспроизведения.
Графические объекты могут быть кистями (определяет стиль, цвет и узор кисти, который определяет, как для рисования области рисунка), шрифтов (определяет свойства, которые влияют на отображение текста), палитры (задает цвета как независимые от устройства значения, определенные приложением), перья (задает графические атрибуты линии) и области (которые определяют сегменты линии и кривой, определяющие форму).
Имя | Описание |
META_CREATEBRUSHINDIRECT | Создает объект кисти из объекта LogBrush (логическая кисть). |
META_CREATEFONTINDIRECT | Создает объект кисти из объекта шрифта. |
META_CREATEPALETTE | Создает объект палитры. |
META_CREATEPATTERNBRUSH | Создает объект кисти из объекта LogBrush (логическая кисть). |
META_CREATEPENINDIRECT | Создает объект пера. |
META_CREATEREGION | Создает объект области. |
META_DELETEOBJECT | Удалить объект. |
META_CREATEBRUSHINDIRECT | Создает объект кисти из объекта LogBrush (логическая кисть). |
META_DIBCREATEPATTERNBRUSH | Создает объект кисти из не зависящего от устройства растрового изображения. |
META_SELECTCLIPREGION | Определяет объект области, который будет текущей областью отсечения . |
META_SELECTOBJECT | Выбирает объект, который будет быть текущим объектом для контекста устройства воспроизведения, который работает со всеми графическими объектами, кроме объектов палитры, которые должны быть установлены с помощью META_SELECTPALETTE. |
META_SELECTPLAETTE | Выбирает логическую палитру для контекста устройства воспроизведения. |
Записи состояния
Записи состояния управляют графическими свойствами контекста устройства воспроизведения.
Имя | Описание |
META_ANIMATEPALETTE | Переопределяет записи в логической палитре, которая определена в контексте устройства воспроизведения с помощью указанного объекта палитры. |
META_EXCLUDECLIPRECT | Устанавливает область отсечения, которая определена в устройстве воспроизведения контекст существующей области отсечения за вычетом указанного прямоугольника. |
META_INTERSECTCLIPRECT | Устанавливает область отсечения, которая определена в контексте устройства воспроизведения, на пересечении существующей области отсечения и указанного прямоугольника. |
META_MOVETO | Устанавливает позицию вывода в контексте устройства воспроизведения в указанную точку. |
META_OFFSETCLIPRGN | Перемещает область отсечения, определенную в контексте устройства воспроизведения, на указанные смещения. |
META_OFFSETVIEWPORTORG | Перемещает исходную точку окна просмотра в контексте устройства воспроизведения на заданные горизонтальные и вертикальные смещения. |
META_OFFSETWINDOWORG | Перемещает исходную точку окна вывода в контексте устройства воспроизведения по заданной горизонтали и вертикали l смещения. |
META_REALIZEPALETTE | Отображает записи из логической палитры, которая определена в контексте устройства воспроизведения, в системную палитру. |
META_RESIZEPALETTE | Повторно определяет размер логической палитры, которая определяется в контексте устройства воспроизведения. |
META_RESTOREDC | Восстанавливает контекст устройства воспроизведения из ранее сохраненного контекста устройства. |
META_SAVEDC | Сохраняет контекст устройства воспроизведения для последующего извлечения. |
META_SCALEVIEWPORTEXT | Масштабирует горизонтальные и вертикальные границы области просмотра, которые определены в контексте устройства воспроизведения, с использованием соотношений, образованных указанными множителями и делителями. |
META_SCALEWINDOWEXT | Масштабирует горизонтальное и вертикальные пределы окна вывода, которое определяется в контексте устройства воспроизведения с использованием соотношений, образованных указанными множителями и делителями. |
META_SETBKCOLOR | Устанавливает заданный цвет фона в контексте устройства воспроизведения. |
META_SETBKMODE | Устанавливает режим фонового микширования в контексте устройства воспроизведения. |
META_SETLAYOUT | Определяет ориентацию макета в контексте устройства воспроизведения. |
META_SETMAPMODE | Определяет режим сопоставления при воспроизведении контекст устройства. |
META_SETMAPPERFLAGS | Определяет алгоритм, который использует средство сопоставления шрифтов при сопоставлении логических шрифтов с физическими шрифтами. |
META_SETPALENTRIES | Определяет значения цвета RGB в диапазоне записей в логическая палитра, которая определена в контексте устройства воспроизведения. |
META_SETPOLYFILLMODE | Определяет режим заливки многоугольника в контексте устройства воспроизведения для графических операций, которые заполняют многоугольники. |
META_SETRELABS | Неиспользуемая запись . |
META_SETROP2 | Определяет режим смешивания работы с растром переднего плана в контексте устройства воспроизведения. |
META_SETSTRETCHBLTMODE | Определяет режим растяжения растрового изображения в контексте устройства воспроизведения. |
META_SETTEXTALIGN | Определяет значения выравнивания текста в контексте устройства воспроизведения. |
META _SETTEXTCHAREXTRA | Определяет межсимвольный интервал для выравнивания текста в контексте устройства воспроизведения. |
META_SETTEXTCOLOR | Определяет цвет переднего плана текста в контексте устройства воспроизведения. |
META_SETTEXTJUSTIFICATION | Определяет количество места, которое нужно добавить для разбиения символов в строке выровненного текста. |
META_SETVIEWPORTEXT | Определяет горизонтальные и вертикальные пределы области просмотра в контексте устройства воспроизведения. |
META_SETVIEWPORTORG | Определяет исходную точку окна просмотра в контексте устройства воспроизведения. |
META_SETWINDOWEXT | Определяет горизонтальные и вертикальные пределы окна вывода в контексте устройства воспроизведения. |
META_SETWINDOWORG | Определяет источник окна вывода в контексте устройства воспроизведения. |
Escape-записи
Escape-записи — это средство расширения функциональности метафайла с помощью записей, которые иначе не определены как тип записи WMF. Каждая escape-запись содержит функцию записи, escape-функцию и потенциально управляющие данные.
Следующие escape-записи составляют файл WMF.
Имя | Описание |
ABORTDOC | Останавливает обработку текущего документа. |
BEGIN_PATH | Открывает путь. |
CHECK_JPEGFORMAT | Определяет, может ли он обрабатывать данное изображение JPEG . |
CHECK_PNGFORMAT | Определяет, может ли он обрабатывать данное изображение PNG . |
CLIP_TO_PATH | Применяет функцию к текущему контуру обрезки PostScript . |
CLOSE_CHANNEL | То же, что и ENDDOC. |
DOWNLOAD_FACE | Устанавливает имя шрифта на устройстве вывода. |
DOWNLOAD_HEADER | Загружает наборы процедур PostScript. |
DRAW_PATTERNRECT | Рисует прямоугольник с заданным узором. |
ENCAPSULATED_POSTSCRIPT | Отправляет произвольные инкапсулированные данные PostScript (EPS) непосредственно в драйвер принтера. |
END_PATH | Завершает путь. |
ENDDOC | Сообщает драйверу принтера о завершении нового задания на печать. |
EPS_PRINTING | Указывает начало и конец печати EPS. |
EXTTEXTOUT | Рисует текст, используя текущий выбранный шрифт, цвет фона и цвет текста. |
GET_COLORTABLE | Получает значения таблицы цветов из драйвера принтера. |
GET_DEVICEUNITS | Возвращает единицы устройства, в настоящее время настроенные на устройстве вывода. |
GET_EXTENDED_TEXTMETRICS | Получает расширенные текстовые метрики, которые в настоящее время настроено в драйвере принтера. |
GET_FACENAME | Получает имя шрифта, настроенное в данный момент на устройстве вывода. |
GET_PAIRKERNTABLE | Получает таблицу ядра шрифта в настоящее время определено на устройстве вывода. |
GET_PHYSPAGESIZE | Извлекает физический размер страницы, выбранный в данный момент на устройстве вывода. |
GET_PRINTINGOFFSET | Извлекает смещение от верхнего левого угла физическая страница, на которой начинается фактическая печать или рисунок. |
GET_PS_FEATURESETTING | Запрашивает драйвер принтера для получения информации о функциях PostScript, поддерживаемых на устройстве вывода. |
GET_SCALINGFACTOR | Извлекает коэффициенты масштабирования для ось x и ось y принтера. |
META_ESCAPE_ENHANCED_METAFILE | Используется для e mbed метафайл EMF в метафайл WMF. |
METAFILE_DRIVER | Запрашивает драйвер принтера о его поддержке метафайлов на устройстве вывода. |
NEWFRAME | Уведомляет драйвер принтера, что приложение завершила запись на страницу. |
NEXTBAND | Уведомляет драйвер принтера о том, что приложение завершило запись в полосу. |
PASSTHROUGH | Передает произвольные данные драйверу принтера. |
POSTSCRIPT_DATA | Отправляет произвольные данные PostScript на устройство вывода. |
POSTSCRIPT_IDENTIFY | Устанавливает для драйвера принтера режим PostScript или GDI. |
POSTSCRIPT_IGNORE | Уведомляет устройство вывода об игнорировании данных PostScript. |
POSTSCRIPT_INJECTION | Вставляет блок необработанных данных в поток PostScript. |
POSTSCRIPT_PASSTHROUGH | Отправляет произвольные данные непосредственно в драйвер принтера, который, как ожидается, будет обрабатывать эти данные только в режиме PostScript. |
OPEN_CHANNEL | Действует так же, как STARTDOC, с NULL документом и выходным именем файла и данными в необработанном режиме. |
QUERY_DIBSUPPORT | Запрашивает драйвер принтера о его поддержке DIB на устройстве вывода. |
QUERY_ESCSUPPORT | Запрашивает драйвер принтера, чтобы определить, поддерживается ли конкретная escape-функция WMF на устройстве вывода. |
SET_COLORTABLE | Устанавливает значения таблицы цветов. |
SET_COPYCOUNT | Устанавливает количество копий. |
SET_LINECAP | Определяет режим окончания строки для использования при выводе на устройство вывода. |
SET_LINEJOIN | Определяет режим соединения строк для использования при выводе на устройство вывода. |
SET_MITERLIMIT | Устанавливает предел длины угловых соединений для использования при рисовании с устройством вывода. |
SPCLPASSTHROUGH2 | Позволяет документам включать частные процедуры и другие произвольные данные в документы. |
STARTDOC | Уведомляет драйвер принтера о том, что начинается новое задание печати. |
В управляющих записях вокруг A была обнаружена серьезная уязвимость . bort escape-запись, которая хранит код процедуры прерывания внутри самой записи. Это затронуло системы Windows (см. CVE — 2005-4560 ) и проект Wine (см. CVE —
2006-0106 ) . Согласно Secunia , «Уязвимость вызвана ошибкой в обработке файлов метафайлов Windows (‘.wmf’), содержащих специально созданные записи SETABORTPROC ‘Escape’. Такие записи позволяют произвольно заданной пользователем функции выполнять выполняться при сбое рендеринга файла WMF. » Согласно документации SDK Windows 3.1, escape-код SETABORTPROC был устаревшим и заменен одноименной функцией в Windows 3.1 задолго до того, как была обнаружена уязвимость WMF. Однако устаревший escape-код был сохранен для совместимости с 16-битными программами, написанными для (или, по крайней мере, обратно совместимыми с) Windows 3.0. Это изменение произошло примерно в то же время, когда Microsoft создавала 32-битную повторную реализацию GDI для Windows NT, и вполне вероятно, что уязвимость возникла во время этой попытки.
После того, как Стив Гибсон из Gibson Research Corporation обвинил Microsoft в преднамеренном внедрении бэкдора в свой код, Марк Руссинович представил опровержение и заявил, что:
. все было по-другому, когда формат был разработан. В Windows 3.1 код модели «большой» памяти по своей природе не зависит от местоположения, и Windows никогда не была исправлена, поэтому и Windows, и приложение могли просто скопировать функцию приложения в файл WMF и предположить, что она будет работать при воспроизведении одним и тем же приложением в более поздний сеанс запуска. В любом случае неясно, предполагали ли разработчики приложения, создающие метафайлы на диске с процедурами прерывания. Кроме того, как Стивен Тулуза из Microsoft указал в опровержении Microsoft утверждений Стива, ландшафт безопасности в начале 1990-х сильно отличался от сегодняшнего, и всему коду, включая тот, который хранится в файле WMF, по своей сути доверяли. 319>Питер Ферри из Symantec Security Response, США, также не согласился с Гибсоном, отметив, что:
Гибсон утверждал, что создается поток для запуска обработчика SetAbortProc. Фактически, никакой поток для запуска обработчика не создается — это обратный вызов, который вызывается анализатором, и синтаксический анализатор должен ждать, пока обратный вызов не вернется, в противном случае весь смысл функции (для прерывания печати) теряется. . По его собственному признанию, Гибсон не читал документацию (на самом деле он утверждал, что не мог ее найти, хотя она находится в свободном доступе на веб-сайте Microsoft), и он утверждал, что контекст устройства недоступен для обработчика функций. . Конечно, контекст устройства доступен обработчику функции — это один из двух параметров, которые ему передаются (см. Выше), и он требуется для прерывания печати. Наконец, Гибсон заявил, что поток управления не может вернуться в Windows. Дело просто в том, что функция возвращает и отбрасывает параметры, которые были переданы в стек. Если запись сформирована правильно, Windows продолжит анализ файла, как и раньше. . Гибсон признает, что догадывался о нескольких вещах. К сожалению, он плохо угадал. Думаю, теперь мы знаем лучше.
Файлы EMF имеют три возможных версии заголовков. Исходные заголовки — это просто контейнер для изображений, вторая и третья версии инкапсулируют исходный заголовок и содержат запись в формате пикселей и поддержку записей OpenGL, а третья версия инкапсулирует второе расширение заголовка и увеличивает точность EMF и масштабируемость EMF, поскольку это добавляет возможность измерения расстояний до поверхностей устройства с использованием метрической системы.
Каждый заголовок EMF начинается с записи EMR_HEADER и записывает соответствующие свойства устройства, на котором было записано изображение метафайла. Исходный заголовок EMF имеет 80-байтовый заголовок и дополнительную строку описания переменной длины. Другие метафайлы содержат поля расширения, которые инкапсулируют исходный заголовок. EmfMetafileHeaderExtension1 — это запись, которая вставляется непосредственно после исходного заголовка EMF, указывает, есть ли дескриптор формата пикселя и смещение объекта дескриптора в заголовке, а также поле, которое указывает, Записи OpenGL существуют в метафайле. Дескриптор формата пикселя определяет возможности поверхности рисования и то, закодирован ли пиксель в RGBA или является индексом в таблице цветов. EmfMetafileHeaderExtension2 — это запись, которая вставляется непосредственно после EmfMetafileHeaderExtension1 запись, и она содержит два поля со значениями X и Y для измерения поверхности устройства в микрометрах.
Как и файлы WMF, записи могут быть классифицированы по функциям, однако есть больше записей типов в файлах EMF, чем в файлах WMF. Записи могут быть классифицированы как элементы управления, растровые изображения, обрезки, комментарии, рисование, экранирование, создание объекта, манипулирование объектами, OpenGL, скобки пути, записи состояния и преобразования.
С выпуском Windows XP был представлен формат расширенного формата метафайлов плюс расширения (EMF +). EMF + предоставляет способ сериализации вызовов API GDI + таким же образом, как WMF / EMF хранит вызовы GDI.
Существуют также сжатые версии метафайлов Windows, известные как сжатый метафайл Windows (WMZ) и сжатый расширенный метафайл Windows (EMZ), которые в основном представляют собой сжатые gzip файлы WMF и EMF соответственно.
Реализации
Формат WMF был разработан для выполнения на уровне Windows GDI для восстановления изображения , но поскольку двоичные файлы WMF содержат определение Графические примитивы GDI, составляющие это изображение, позволяют создавать альтернативные библиотеки, которые визуализируют двоичные файлы WMF или конвертируют их в другие графические форматы.