Metarchivo de Windows
Metarchivo de Windows (WMF) es un formato de archivo de imagen diseñado originalmente para Microsoft Windows en la década de 1990. El formato de metarchivo de Windows original no era independiente del dispositivo (aunque podría hacerse más con encabezados de ubicación) y puede contener gráficos vectoriales y componentes de mapa de bits. Actúa de manera similar a los archivos SVG. Los archivos WMF fueron reemplazados posteriormente por Metarchivos mejorados (archivos EMF) que proporcionaban independencia del dispositivo. Luego, los archivos EMF se mejoraron a través de archivos EMF+.
Esencialmente, un metarchivo almacena una lista de registros que consta de comandos de dibujo, definiciones de propiedades y objetos gráficos para mostrar una imagen en la pantalla. Los comandos de dibujo utilizados están estrechamente relacionados con los comandos de la API de interfaz de dispositivo gráfico (GDI) que se utiliza para dibujar en Microsoft Windows.
Hay tres tipos principales de metarchivos: un WMF es un formato de 16 bits introducido en Windows 3.0. Es el formato vectorial nativo para aplicaciones de Microsoft Office como Word, PowerPoint y Publisher. A partir de 2017, la revisión 14 de la especificación de formato de metarchivo de Windows está disponible para lectura en línea o descarga como PDF. Los archivos EMF, que reemplazaron a los archivos WMF, funcionan con el mismo principio, solo que es un formato de archivo de 32 bits que también permite la incrustación de datos privados dentro de "comentario" registros. EMF+ es una extensión de los archivos EMF y está incrustada en estos registros de comentarios, lo que permite que las imágenes y el texto usen comandos, objetos y propiedades similares a Windows GDI+.
Historia
El formato de archivo WMF original de 16 bits se especificó completamente en el volumen 4 de la documentación del SDK de Windows 3.1 de 1992 (al menos si se combina con las descripciones de las funciones y estructuras individuales en los otros volúmenes), pero esa especificación era vaga sobre un pocos detalles Estos manuales se publicaron como libros impresos disponibles en las librerías sin hacer clic en EULA u otras restricciones de licencia inusuales (solo una advertencia general de que si se compra como parte de un paquete de software, el software estaría sujeto a uno).
Con el tiempo, la existencia de esa especificación histórica se olvidó en gran medida y algunas implementaciones alternativas recurrieron a la ingeniería inversa para descubrir el formato de archivo de los archivos WMF existentes, lo cual era difícil y propenso a errores. En septiembre de 2006, Microsoft volvió a publicar la especificación de formato de archivo WMF en una forma más completa en el contexto de la Promesa de especificación abierta de Microsoft, prometiendo no hacer valer los derechos de patente a los implementadores de formato de archivo.
Más tarde, Microsoft desechó los archivos WMF en favor de los archivos EMF de 32 bits, ya que los archivos WMF tenían problemas reales con la independencia del dispositivo, a pesar del uso de un "ubicable" encabezado de archivo que proporcionó independencia básica del dispositivo. Microsoft descubrió que los desarrolladores que usan el formato estaban "[incrustando] comentarios de aplicación, ubicación o escalado en los metarchivos... Otros agregaron encabezados al metarchivo que proporcionaban diversa información específica de la aplicación", causando importantes problemas de compatibilidad.. Por lo tanto, en 1992 con Windows NT 3.1, Microsoft introdujo el formato de metarchivo mejorado (EMF), un formato basado en la API de Win32 y con el que incorporaron la independencia del dispositivo. — estos también se conocían como metarchivos NT. Con el lanzamiento de Windows XP y GDI+, el conjunto de registros tuvo que aumentar significativamente, por lo que Microsoft lanzó EMF+ como una extensión del formato de archivo EMF existente.
Estructura del metarchivo
Los archivos WMF, EMF y EMF+ constan de una serie de registros que se reproducen para producir una salida gráfica. Algunos registros definen objetos que pueden especificar objetos gráficos utilizados para determinar cómo deben dibujarse los gráficos (por ejemplo, las plumas especifican el color y el ancho de las líneas). Cada uno de estos objetos se almacena en metarchivos y se colocan en una tabla de objetos, que rastrea el uso de objetos gráficos mientras se procesa el metarchivo. La tabla de objetos es una matriz asociativa de índices para estructuras de objetos gráficos definidas dentro del metarchivo.
Los archivos WMF y EMF manejan el procesamiento de objetos de manera diferente a los registros EMF+ en los archivos EMF. A medida que se procesa un archivo WMF y EMF, los registros se leen en una tabla de objetos una vez que se define un objeto. Si se elimina un objeto, el objeto se libera de la tabla y el identificador se puede reutilizar. En particular, un objeto no se utilizará hasta que se seleccione específicamente durante la reproducción de la grabación. Esto difiere para los archivos EMF+, que también utilizan una matriz asociativa a través de un hashmap que registra el objeto junto con un identificador de objeto. Sin embargo, a diferencia de los archivos WMF y EMF que pueden eliminar un objeto, cuando se crea un nuevo objeto que tiene el mismo índice que un objeto existente, la entrada en la tabla se reemplaza con el nuevo objeto. Un archivo EMF tampoco necesita seleccionar específicamente un objeto antes de usarlo.
WMF
Los archivos WMF no se diseñaron originalmente para ser independientes del dispositivo, lo que significa que no se podía reproducir el archivo en dispositivos de salida que difieran del dispositivo original en el que se grabó el archivo. Una solución parcial a este problema fue inventada por Aldus Corporation, quien agregó un "ubicable" encabezado, llamado "encabezado APM", que agregó un rectángulo delimitador, una versión de metarchivo, tamaño de metarchivo, número de objetos en el metarchivo y el tamaño del registro único más grande en el metarchivo. Posteriormente, Microsoft lo incorporó al formato WMF, a partir de Windows 2000.
Los archivos WMF están estructurados por una serie de registros, comenzando con una serie de registros de control: el registro de encabezado, el registro colocable opcional antes mencionado, y terminan con un registro de fin de archivo.
Encapsulados por los registros de control están los registros que componen la imagen misma. Estos registros funcionan dentro de lo que se conoce como el contexto del dispositivo de reproducción, que es la colección de propiedades y objetos que conforman el entorno gráfico de un dispositivo cuando el metarchivo se "reproduce& #34; en este dispositivo de salida.
Los registros distintos de los registros de control se pueden agrupar en gran medida en registros de mapa de bits, registros de dibujo, registros de objetos, registros de estado y registros de escape.
Registros de mapa de bits
Los registros de mapa de bits administran y generan imágenes de mapa de bits.
Nombre | Descripción |
---|---|
META_BITBLT | Especifica cómo hacer una transferencia de bloques. Estos registros pueden especificar un bitmap para usar como fuente, o una región. |
META_DIBBITBLT | Especifica cómo hacer una transferencia de bloques de una imagen de bitmap dependiente del dispositivo. Estos registros pueden especificar un bitmap para usar como fuente, o una región. |
META_DIBSTRETCHBITBLT | Especifica cómo hacer una transferencia de bloques de un bitmap dependiente del dispositivo, pero permite la expansión o contracción de la imagen. Estos registros pueden especificar un bitmap para usar como fuente, o una región. |
META_SETDIBTODEV | Especifica el color para establecer un bloque de píxeles en una imagen de bitmap dependiente del dispositivo. Estos registros pueden especificar un bitmap para usar como fuente, o una región. |
META_STRETCHBLT | Especifica cómo hacer una transferencia de bloques, pero permite la expansión o contracción de la imagen. |
META_STRETCHDIB | Especifica cómo hacer una transferencia de bloques de un bitmap dependiente del dispositivo, pero permite la expansión o contracción de la imagen. Estos registros pueden especificar un bitmap para usar como fuente, o una región. |
Registros de dibujo
Los registros de dibujo producen resultados gráficos.
Nombre | Descripción |
---|---|
META_ARC | Dibuja un arco elíptico. |
META_CHORD | Dibuja un acorde. |
META_ELLIPSE | Dibuja un arco elíptico. |
META_EXTFLOODFILL | Llena un área con un cepillo. |
META_EXTTEXTOUT | Dibujar texto con fuente, color de fondo y color de texto del contexto del dispositivo de reproducción. |
META_FILLREGION | Llena una región con un cepillo especificado. |
META_FLOODFILL | Llena un área con un cepillo. |
META_FRAMEREGION | Dibuja una frontera alrededor de una región de la página con un cepillo. |
META_INVERTREGION | Pinta una región del gráfico con colores invertidos. |
META_LINETO | Dibuja una línea media abierta desde la posición de dibujo definida en el contexto del dispositivo de reproducción hasta un punto especificado. |
META_PAINTREGION | Pintar una región con el cepillo actual especificado en el contexto del dispositivo de reproducción. |
META_PATBLT | Pintar una región con el cepillo actual especificado en el contexto del dispositivo de reproducción y luego combinar el color del pincel y el color de la superficie usando una operación de mapa. |
META_PIE | Dibuja una cuña en forma de pie atada por la intersección de una elipse y dos radiales — la línea se establece a través del conjunto de la pluma a través del contexto del dispositivo de reproducción, y el área atada por la forma de la tarta se llena por el cepillo actual del contexto del dispositivo de reproducción. |
META_POLYLINE | Dibuja una serie de secuencias de línea conectando los puntos en un array especificado. |
META_POLYGON | Pinta un polígono compuesto por dos o más vértices conectados por líneas rectas. El polígono se describe utilizando la pluma y se llena usando el modo de relleno de cepillo y polígono que se define en el contexto del dispositivo de reproducción. |
META_POLYPOLYGON | Pinta una serie de polígonos cerrados, que pueden superponerse. Cada polígono se delinea utilizando el bolígrafo y llenado utilizando el modo de relleno de pincel y polígono que se define en el contexto del dispositivo de reproducción. |
META_RECTANGLE | Pinta un rectángulo, que se esboza mediante el lápiz y se llena mediante el cepillo y se llena mediante el cepillo que se define en el contexto del dispositivo de reproducción. |
META_ROUNDRECT | Pinta un rectángulo con esquinas redondeadas. El rectángulo se describe mediante el uso de la pluma y se llena mediante el cepillo y se llena mediante el cepillo que se define en el contexto del dispositivo de reproducción. |
META_SETPIXEL | Establece el píxel en las coordenadas especificadas al color especificado. |
META_TEXTOUT | Muestra una cadena de caracteres en la ubicación especificada utilizando la fuente, el color de fondo y el color de texto que se definen en el contexto del dispositivo de reproducción. |
Registros de objetos
Los registros de objetos crean y administran objetos gráficos. En los archivos WMF hay dos amplias categorías de objetos: objetos gráficos y objetos de estructura. Los objetos de estructura no se crean ni eliminan explícitamente en un WMF, sino que son estructuras complejas. Por ejemplo, BitmapCoreHeader contiene información sobre las dimensiones y el formato de color de un mapa de bits independiente del dispositivo, que a su vez forma parte de un objeto DeviceIndependentBitmap. Sin embargo, un objeto gráfico especifica parámetros para la salida de gráficos y, durante la reproducción de WMF, configura el contexto del dispositivo de reproducción.
Los objetos gráficos pueden ser pinceles (define el estilo, el color y el patrón de un pincel que define cómo pintar un área del gráfico), fuentes (define propiedades que afectan cómo se muestra el texto), paletas (especifica los colores como valores independientes del dispositivo, definidos por una aplicación), bolígrafos (especifica los atributos gráficos de una línea) y < i>regiones (que especifican segmentos de línea y curva que definen una forma).
Nombre | Descripción |
---|---|
META_CREATEBRUSHINDIRECT | Crea un objeto de pincel de un objeto LogBrush (bloqueo lógico). |
META_CREATEFONTINDIRECT | Crea un objeto de pincel de un objeto de fuente. |
META_CREATEPALETTE | Crea un objeto de paleta. |
META_CREATEPATTERNBRUSH | Crea un objeto de pincel de un objeto LogBrush (bloqueo lógico). |
META_CREATEPENINDIRECT | Crea un objeto pluma. |
META_CREATEREGION | Crea un objeto de región. |
META_DELETEOBJECT | Borrar un objeto. |
META_CREATEBRUSHINDIRECT | Crea un objeto de pincel de un objeto LogBrush (bloqueo lógico). |
META_DIBCREATEPATTERNBRUSH | Crea un objeto de cepillo de un bitmap independiente del dispositivo. |
META_SELECTCLIPREGION | Especifica el objeto de la región que será la región de recortado actual. |
META_SELECTOBJECT | Selecciona el objeto que será el objeto actual para el contexto del dispositivo de reproducción, que funciona en todos los objetos gráficos excepto los objetos de paleta, que debe establecerse con META_SELECTPALETTE. |
META_SELECTPLAETTE | Selecciona la paleta lógica para el contexto del dispositivo de reproducción. |
Registros estatales
Los registros de estado administran las propiedades gráficas del contexto del dispositivo de reproducción.
Nombre | Descripción |
---|---|
META_ANIMATEPALETTE | Redefines entradas en la paleta lógica que se define en el contexto del dispositivo de reproducción con un objeto de paleta especificado. |
META_EXCLUDECLIPRECT | Establece la región de clipping que se define en el contexto del dispositivo de reproducción a la región de clipping existente menos un rectángulo especificado. |
META_INTERSECTCLIPRECT | Establece la región de recortado que se define en el contexto del dispositivo de reproducción a la intersección de la región de recortado existente y un rectángulo especificado. |
META_MOVETO | Establece la posición de salida en el contexto del dispositivo de reproducción a un punto especificado. |
META_OFFSETCLIPRGN | Mueva la región de clipping que se define en el contexto del dispositivo de reproducción por los offsets especificados. |
META_OFFSETVIEWPORTORG | Mueva el origen del mirador en el contexto del dispositivo de reproducción por los offsets horizontales y verticales especificados. |
META_OFFSETWINDOWORG | Mueva el origen de la ventana de salida en el contexto del dispositivo de reproducción por los offsets horizontales y verticales especificados. |
META_REALIZEPALETTE | Mapas entradas de la paleta lógica que se define en el contexto del dispositivo de reproducción a la paleta del sistema. |
META_RESIZEPALETTE | Redetique el tamaño de la paleta lógica que se define en el contexto del dispositivo de reproducción. |
META_RESTOREDC | Restaura el contexto del dispositivo de reproducción desde un contexto de dispositivo previamente guardado. |
META_SAVEDC | Guarda el contexto del dispositivo de reproducción para posterior recuperación. |
META_SCALEVIEWPORTEXT | Escala las dimensiones horizontales y verticales del mirador que se define en el contexto del dispositivo de reproducción utilizando las proporciones formadas por multiplicadores y divisores especificados. |
META_SCALEWINDOWEXT | Escala las dimensiones horizontales y verticales de la ventana de salida que se define en el contexto del dispositivo de reproducción utilizando las proporciones formadas por multiplicadores y divisores especificados. |
META_SETBKCOLOR | Establece el color de fondo en el contexto del dispositivo de reproducción a un color especificado. |
META_SETBKMODE | Establece el modo de mezcla de fondo en el contexto del dispositivo de reproducción. |
META_SETLAYOUT | Define la orientación de diseño en el contexto del dispositivo de reproducción. |
META_SETMAPMODE | Define el modo de mapeo en el contexto del dispositivo de reproducción. |
META_SETMAPPERFLAGS | Define el algoritmo que el mapper fuente utiliza cuando mapea fuentes lógicas a fuentes físicas. |
META_SETPALENTRIES | Define los valores de color RGB en una gama de entradas en la paleta lógica que se define en el contexto del dispositivo de reproducción. |
META_SETPOLYFILLMODE | Define el modo de relleno de polígono en el contexto del dispositivo de reproducción para operaciones gráficas que llenan polígonos. |
META_SETRELABS | Un disco sin usar. |
META_SETROP2 | Define el modo de mezclado de raster de primer plano en el contexto del dispositivo de reproducción. |
META_SETSTRETCHBLTMODE | Define el modo de estiramiento bitmap en el contexto del dispositivo de reproducción. |
META_SETTEXTALIGN | Define los valores de alineación de texto en el contexto del dispositivo de reproducción. |
META_SETTEXTCHAREXTRA | Define el espaciamiento entre caracteres para la justificación de texto en el contexto del dispositivo de reproducción. |
META_SETTEXTCOLOR | Define el color del primer plano de texto en el contexto del dispositivo de reproducción. |
META_SETTEXTJUSTIFICACIÓN | Define la cantidad de espacio para añadir para romper caracteres en una cadena de texto justificado. |
META_SETVIEWPORTEXT | Define las dimensiones horizontales y verticales del mirador en el contexto del dispositivo de reproducción. |
META_SETVIEWPORTORG | Define el origen visual en el contexto del dispositivo de reproducción. |
META_SETWINDOWEXT | Define las dimensiones horizontales y verticales de la ventana de salida en el contexto del dispositivo de reproducción. |
META_SETWINDOWORG | Define el origen de la ventana de salida en el contexto del dispositivo de reproducción. |
Récords de escape
Los registros de escape son un medio para ampliar la funcionalidad de metarchivo a través de registros que no están definidos de otro modo como un tipo de registro WMF. Cada registro de escape contiene una función de registro, una función de escape y potencialmente datos de escape.
Los siguientes registros de escape forman un archivo WMF.
Nombre | Descripción |
---|---|
ABORTDOC | Deja de procesar el documento actual. |
BEGIN_PATH | Abre un camino. |
CHECK_JPEGFORMAT | Determina si puede manejar la imagen JPEG dada. |
CHECK_PNGFORMAT | Determina si puede manejar la imagen PNG dada. |
CLIP_TO_PATH | Aplica una función a la actual ruta de clipping PostScript. |
CLOSE_CHAEL | Igual que ENDDOC. |
DOWNLOAD_FACE | Establece el nombre de la fuente en el dispositivo de salida. |
DOWNLOAD_HEADER | Descargas conjuntos de procedimientos de PostScript. |
DRAW_PATTERNRECT | Dibuja un rectángulo con un patrón definido. |
ENCAPSULATED_POSTSCRIPT | Envía datos de PostScript encapsulados arbitrarios directamente al controlador de impresora. |
END_PATH | Termina un camino. |
ENDDOC | Notifica al conductor de la impresora que un nuevo trabajo de impresión está terminando. |
EPS_PRINING | Indica el inicio y final de la impresión EPS. |
EXTTEXTO | Dibuja texto usando la fuente seleccionada, color de fondo y color de texto. |
GET_COLORTABLE | Obtiene valores de tabla de colores del controlador de impresora. |
GET_DEVICEUNITS | Consigue las unidades de dispositivo configuradas actualmente en el dispositivo de salida. |
GET_EXTENDED_TEXTMETRICS | Obtiene las métricas de texto extendidas que actualmente están configuradas en el controlador de impresora. |
GET_FACENAME | Consigue el nombre de la fuente configurado actualmente en el dispositivo de salida. |
GET_PAIRKERNTABLE | Consigue la tabla de fuentes kern actualmente definida en el dispositivo de salida. |
GET_PHYSPAGESIZE | Retrieves el tamaño de página física actualmente seleccionado en el dispositivo de salida. |
Get_PRININGOFFSET | Retrieves el offset desde la esquina superior izquierda de la página física donde comienza la impresión o dibujo real. |
GET_PS_FEATURESETING | Consulta el controlador de impresora para información sobre las funciones PostScript soportadas en el dispositivo de salida. |
GET_SCALINGFACTOR | Retrieves los factores de escalado para el eje x y el eje y de una impresora. |
META_ESCAPE_ENHANCED_METAFILE | Solía incrustar un metafil EMF dentro de un metafile WMF. |
METAFILE_DRIVER | Consulta al controlador de impresora sobre su soporte para metafiles en el dispositivo de salida. |
NEWFRAME | Notifica al controlador de impresora que la aplicación ha terminado de escribir a una página. |
NEXTBAND | Notifica al controlador de impresora que la aplicación ha terminado de escribir a una banda. |
PASSTHROUGH | Pasa a través de datos arbitrarios al controlador de impresora. |
POSTSCRIPT_DATA | Envía datos de PostScript arbitrarios al dispositivo de salida. |
POSTSCRIPT_IDENTIFY | Establece el controlador de impresora a modo PostScript centrado o GDI centrado. |
POSTSCRIPT_IGNORE | Notifica el dispositivo de salida para ignorar los datos de PostScript. |
POSTSCRIPT_INJECTION | Inserta un bloque de datos crudos en un flujo PostScript. |
POSTSCRIPT_PASSTHROUGH | Envia datos arbitrarios directamente a un controlador de impresora, que se espera procesar estos datos sólo cuando se encuentra en modo PostScript. |
OPEN_CHANIEL | Actúa igual que STARTDOC, con documento NULL y nombre de archivo de salida, y datos en modo bruto. |
QUERY_DIBSUPPORT | Consulta al controlador de impresora sobre su soporte para DIBs en el dispositivo de salida. |
QUERY_ESCSUPPORT | Consulta al controlador de impresora para determinar si una función de escape WMF específica es compatible con el dispositivo de salida. |
SET_COLORTABLE | Establece valores de mesa de color. |
SET_COPYCOUNT | Establece el número de copias. |
SET_LINECAP | Especifica el modo de conexión para usar en el dibujo al dispositivo de salida. |
SET_LINEJOIN | Especifica el modo de unión de líneas para usar en el dibujo al dispositivo de salida. |
SET_MITERLIMIT | Establece el límite para la longitud de miter se une para utilizar en el dibujo al dispositivo de salida. |
SPCLPASSTHROUGH2 | Permite que los documentos incluyan en los documentos los procedimientos privados y otros datos arbitrarios. |
STARTDOC | Notifica al conductor de la impresora que un nuevo trabajo de impresión está empezando. |
Se encontró una vulnerabilidad importante en los registros de escape en torno al registro de escape Anular, que almacena el código del procedimiento de anulación dentro del propio registro. Esto afectó a los sistemas Windows (ver CVE-2005-4560) y al proyecto Wine (ver CVE-2006-0106). Según Secunia, "La vulnerabilidad se debe a un error en el manejo de los archivos de metarchivo de Windows ('.wmf') que contienen SETABORTPROC 'Escape' registros. Dichos registros permiten que se ejecute una función arbitraria definida por el usuario cuando falla la representación de un archivo WMF." Según la documentación del SDK de Windows 3.1, el escape SETABORTPROC quedó obsoleto y fue reemplazado por la función del mismo nombre en Windows 3.1, mucho antes de que se descubriera la vulnerabilidad WMF. Sin embargo, el código de escape obsoleto se mantuvo por compatibilidad con programas de 16 bits escritos para (o al menos compatibles con versiones anteriores) de Windows 3.0. Este cambio ocurrió aproximadamente al mismo tiempo que Microsoft estaba creando la reimplementación de 32 bits de GDI para Windows NT, y es probable que la vulnerabilidad ocurriera durante este esfuerzo.
Después de que Steve Gibson acusara a Microsoft de implementar deliberadamente una puerta trasera en su código, Mark Russinovich proporcionó una refutación y afirmó que:
...las cosas eran diferentes cuando el formato era arquitecto. En el código de memoria "grande" de Windows 3.1 es inherentemente independiente de ubicación y Windows nunca fue parcheado, por lo que Windows y una aplicación simplemente podría copiar una función de aplicación en el archivo WMF y asumir que funcionaría cuando se reproduce de nuevo por la misma aplicación en una sesión de ejecución posterior. En cualquier caso, no está claro que los desarrolladores imaginaran aplicaciones creando metafiles on-disk con procedimientos abortados. Además, como señaló Stephen Toulouse de Microsoft en la refutación de Microsoft a las afirmaciones de Steve, el paisaje de seguridad a principios de los años noventa era muy diferente de hoy y todo el código, incluyendo el almacenado en un archivo WMF, era inherentemente confiable.
Peter Ferrie de Symantec Security Response, EE. UU., tampoco estuvo de acuerdo con Gibson y señaló que:
Gibson afirmó que se crea un hilo para ejecutar el manipulador SetAbortProc. De hecho, ningún hilo se crea para ejecutar el manejador – es un callback, que es llamado por el parser, y el parser tiene que esperar hasta que el callback regrese, de lo contrario todo el punto de la función (para abortar la impresión) se pierde. Por su propia admisión, Gibson no leyó la documentación (de hecho, afirmó que no podía encontrarla, aunque está disponible libremente en el sitio web de Microsoft), y afirmó que el contexto del dispositivo no está disponible para el manejador de funciones. Por supuesto, el contexto del dispositivo está disponible para el manejador de funciones — es uno de los dos parámetros que se le pasa (ver arriba), y se requiere para abortar la impresión. Finalmente, Gibson afirmó que el flujo de control no podía regresar a Windows. Es simplemente una cuestión de la función que regresa y descarta los parámetros que se pasaron en la pila. Si el registro está bien formado, Windows seguirá analizando el archivo, como antes.... Gibson admite que estaba adivinando algunas cosas. Desafortunadamente, adivinó mal. Supongo que ahora lo sabemos mejor.
CEM
Los archivos EMF tienen tres posibles versiones de encabezados. Los encabezados originales son solo un contenedor de imágenes, la segunda y la tercera versión encapsulan el encabezado original y contienen un registro en formato de píxel y soporte para registros OpenGL, y la tercera versión encapsula la extensión del segundo encabezado y aumenta la precisión y la escalabilidad de los EMF a medida que agrega la capacidad de medir distancias de superficies de dispositivos utilizando el sistema métrico.
Cada encabezado EMF comienza con un registro EMR_HEADER y registra las propiedades relevantes del dispositivo en el que se registró la imagen del metarchivo. El encabezado EMF original tiene un encabezado de 80 bytes y una cadena de descripción de longitud variable opcional. Otros metarchivos contienen campos de extensión, que encapsulan el encabezado original. EmfMetafileHeaderExtension1
es un registro que se inserta directamente después del encabezado EMF original, especifica si hay un descriptor de formato de píxel y el desplazamiento del objeto descriptor dentro del encabezado, así como un campo que especifica si los registros OpenGL existen en el metarchivo. El descriptor de formato de píxel especifica las capacidades de la superficie de dibujo y si un píxel está codificado en RGBA o es un índice en una tabla de colores. EmfMetafileHeaderExtension2
es un registro que se inserta directamente después del registro EmfMetafileHeaderExtension1
y contiene dos campos con los valores X e Y para medir la superficie del dispositivo en micrómetros.
Al igual que los archivos WMF, los registros se pueden clasificar por función; sin embargo, hay más tipos de registro en los archivos EMF que en los archivos WMF. Los registros se pueden clasificar como registros de control, mapa de bits, recorte, comentario, dibujo, escape, creación de objetos, manipulación de objetos, OpenGL, soporte de ruta, estado y transformación.
CEM+
Con el lanzamiento de Windows XP, se introdujo el formato Formato de metaarchivo mejorado más extensiones (EMF+). EMF+ proporciona una forma de serializar llamadas a la API de GDI+ de la misma manera que WMF/EMF almacena llamadas a GDI.
También hay versiones comprimidas de metarchivos de Windows conocidas como metarchivo de Windows comprimido (WMZ) y metarchivo mejorado de Windows comprimido (EMZ), que son básicamente WMF y EMF comprimidos con gzip. archivos correspondientemente.
Implementaciones
El formato WMF fue diseñado para ser ejecutado por la capa GDI de Windows para restaurar la imagen, pero como los archivos binarios WMF contienen la definición de las primitivas gráficas GDI que constituyen esta imagen, es posible diseñar bibliotecas alternativas que renderice archivos binarios WMF o conviértalos a otros formatos gráficos.
Contenido relacionado
Microsoft Windows
Filigrana
Ferrocarril del Pacífico Central