Metarquivo do Windows - Windows Metafile

Windows Metafile ( WMF ) é um formato de arquivo de imagem projetado originalmente para o Microsoft Windows na década de 1990. O formato original do Windows Metafile não era independente do dispositivo (embora pudesse ser feito ainda mais com cabeçalhos de posicionamento) e pode conter gráficos vetoriais e componentes de bitmap . Ele atua de maneira semelhante aos arquivos SVG . Os arquivos WMF foram substituídos posteriormente por Metafiles aprimorados (arquivos EMF), que forneciam independência de dispositivo. Os arquivos EMF foram então aprimorados por meio de arquivos EMF + .

Essencialmente, um metarquivo armazena uma lista de registros que consiste em comandos de desenho, definições de propriedades e objetos gráficos para exibir uma imagem na tela. Os comandos de desenho usados ​​estão intimamente relacionados aos comandos da API Graphics Device Interface (GDI) usada para desenhar no Microsoft Windows.

Existem três tipos principais de metarquivos - um WMF é um formato de 16 bits introduzido no Windows 3.0 . É o formato vetorial nativo para aplicativos do Microsoft Office , como Word , PowerPoint e Publisher . A partir de 2017, a revisão 14 da especificação do Windows Metafile Format está disponível para leitura online ou download como PDF. Os arquivos EMF, que substituíram os arquivos WMF, funcionam com o mesmo princípio, apenas em um formato de arquivo de 32 bits que também permite a incorporação de dados privados em registros de "comentários". EMF + é uma extensão para arquivos EMF e incorporado a esses registros de comentários, permitindo imagens e texto usando comandos, objetos e propriedades semelhantes ao Windows GDI + .

História

O formato de arquivo WMF original de 16 bits foi totalmente especificado no volume 4 da documentação do SDK do Windows 3.1 de 1992 (pelo menos se combinado com as descrições das funções e estruturas individuais nos outros volumes), mas essa especificação era vaga sobre alguns detalhes. Esses manuais foram publicados como livros impressos disponíveis em livrarias sem cliques por meio do EULA ou outras restrições de licenciamento incomuns (apenas um aviso geral de que, se adquirido como parte de um pacote de software, o software estará sujeito a um).

Com o tempo, a existência dessa especificação histórica foi amplamente esquecida e algumas implementações alternativas recorreram à engenharia reversa para descobrir o formato de arquivo dos arquivos WMF existentes, o que era difícil e sujeito a erros. Em setembro de 2006, a Microsoft publicou novamente a especificação do formato de arquivo WMF de uma forma mais completa no contexto da Promessa de Especificação Aberta da Microsoft , prometendo não reivindicar direitos de patente para implementadores de formato de arquivo.

Mais tarde, a Microsoft substituiu os arquivos WMF em favor dos arquivos EMF de 32 bits, pois os arquivos WMF apresentavam problemas reais com a independência do dispositivo, apesar do uso de um cabeçalho de arquivo "placável" que fornecia independência básica do dispositivo. A Microsoft descobriu que os desenvolvedores que usam o formato estavam "[incorporando] comentários de aplicativo, localização ou dimensionamento nos metarquivos ... Outros adicionaram cabeçalhos ao metarquivo que forneciam várias informações específicas do aplicativo", causando grandes problemas de compatibilidade. Assim, em 1992 com o Windows NT 3.1 , a Microsoft introduziu o formato Enhanced Metafile (EMF) - um formato que foi baseado na API Win32 e com o qual incorporou independência de dispositivo. - também eram conhecidos como meta-arquivos NT. Com o lançamento do Windows XP e GDI +, o conjunto de registros teve que ser aumentado significativamente e, portanto, a Microsoft lançou o EMF + como uma extensão do formato de arquivo EMF existente.

Estrutura de metarquivo

Comparação de metarquivos do Windows - observe que os arquivos WMF podem incluir registros EMF +

Todos os arquivos WMF, EMF e EMF + consistem em uma série de registros que são reproduzidos para produzir saída gráfica. Alguns registros definem objetos que podem especificar objetos gráficos usados ​​para determinar como os gráficos devem ser desenhados (por exemplo, canetas especificam a cor e a largura das linhas). Cada um desses objetos é armazenado em metarquivos e colocados em uma tabela de objetos, que rastreia o uso de objetos gráficos durante o processamento do metarquivo. A tabela de objetos é uma matriz associativa de índices para estruturas de objetos gráficos definidas no metarquivo.

Os arquivos WMF e EMF lidam com o processamento de objetos de maneira diferente dos registros EMF + em arquivos EMF. Conforme um arquivo WMF e EMF está sendo processado, os registros são lidos em uma tabela de objetos assim que um objeto é definido. Se um objeto for excluído, ele será liberado da tabela e o identificador poderá ser reutilizado. Notavelmente, um objeto não será usado até que seja especificamente selecionado durante a reprodução da gravação. Isso é diferente para arquivos EMF +, que também usam uma matriz associativa por meio de um hashmap que registra o objeto junto com um identificador de objeto. No entanto, ao contrário dos arquivos WMF e EMF, que podem excluir um objeto, quando um novo objeto é criado com o mesmo índice de um objeto existente, a entrada na tabela é substituída pelo novo objeto. Um arquivo EMF também não precisa selecionar especificamente um objeto antes de ser usado.

WMF

Estruturas de meta-arquivos originais e posicionáveis ​​do Windows

Os arquivos WMF não foram originalmente projetados para serem independentes de dispositivo, o que significa que você não pode reproduzir o arquivo em dispositivos de saída diferentes do dispositivo original no qual o arquivo foi gravado. Uma solução parcial para esse problema foi inventada pela Aldus Corporation , que adicionou um cabeçalho "placável" adicional, chamado de "cabeçalho APM", que adicionou um retável delimitador, uma versão do metarquivo, tamanho do metarquivo, número de objetos no metarquivo e o tamanho do maior registro único no metarquivo. Posteriormente, foi incorporado ao formato WMF pela Microsoft, a partir do Windows 2000.

Os arquivos WMF são estruturados por uma série de registros, começando com uma série de registros de controle: o registro de cabeçalho, o registro opcional colocável acima mencionado e terminando por um registro de fim de arquivo .

Encapsulados pelos registros de controle são os registros que constituem a própria imagem. Esses registros funcionam dentro do que é conhecido como contexto de dispositivo de reprodução , que é a coleção de propriedades e objetos que compõem o ambiente gráfico de um dispositivo enquanto o metarquivo é "reproduzido" neste dispositivo de saída.

Os registros diferentes dos registros de controle podem ser amplamente agrupados em registros de bitmap, registros de desenho, registros de objeto, registros de estado e registros de escape.

Registros de bitmap

Os registros de bitmap gerenciam e geram imagens de bitmap .

Nome Descrição
META_BITBLT Especifica como fazer uma transferência de bloco de bits . Esses registros podem especificar um bitmap a ser usado como origem ou uma região.
META_DIBBITBLT Especifica como fazer uma transferência de bloco de bits de uma imagem de bitmap independente de dispositivo . Esses registros podem especificar um bitmap a ser usado como origem ou uma região.
META_DIBSTRETCHBITBLT Especifica como fazer uma transferência de bloco de bits de uma imagem de bitmap independente de dispositivo, mas permite a expansão ou contração da imagem. Esses registros podem especificar um bitmap a ser usado como origem ou uma região.
META_SETDIBTODEV Especifica a cor para definir um bloco de pixels em uma imagem bitmap independente de dispositivo. Esses registros podem especificar um bitmap a ser usado como origem ou uma região.
META_STRETCHBLT Especifica como fazer uma transferência de bloco de bits, mas permite a expansão ou contração da imagem.
META_STRETCHDIB Especifica como fazer uma transferência de bloco de bits de uma imagem de bitmap independente de dispositivo, mas permite a expansão ou contração da imagem. Esses registros podem especificar um bitmap a ser usado como origem ou uma região.

Registros de desenho

Os registros de desenho produzem saída gráfica.

Nome Descrição
META_ARC Desenha um arco elíptico .
META_CHORD Desenha um acorde .
META_ELLIPSE Desenha um arco elíptico .
META_EXTFLOODFILL Preenche uma área com um pincel.
META_EXTTEXTOUT Desenhe texto com fonte, cor de fundo e cor de texto do contexto do dispositivo de reprodução.
META_FILLREGION Preenche uma região com um pincel especificado.
META_FLOODFILL Preenche uma área com um pincel.
META_FRAMEREGION Desenha uma borda em torno de uma região da página com um pincel.
META_INVERTREGION Pinta uma região do gráfico com cores invertidas.
META_LINETO Desenha uma linha semiaberta da posição de desenho definida no contexto do dispositivo de reprodução até um ponto especificado.
META_PAINTREGION Pinte uma região com o pincel atual especificado no contexto do dispositivo de reprodução.
META_PATBLT Pinte uma região com o pincel atual especificado no contexto do dispositivo de reprodução e, a seguir, combine a cor do pincel e as cores da superfície usando uma operação de varredura .
META_PIE Desenhe uma cunha em forma de torta delimitada pela interseção de uma elipse e dois radiais - a linha é definida por meio da caneta definida por meio do contexto do dispositivo de reprodução e a área delimitada pela forma de torta é preenchida pelo pincel atual do dispositivo de reprodução contexto.
META_POLYLINE Desenha uma série de segmentos de linha conectando os pontos em uma matriz especificada.
META_POLYGON Pinta um polígono que consiste em dois ou mais vértices conectados por linhas retas. O polígono é delineado usando a caneta e preenchido usando o pincel e o modo de preenchimento de polígono que são definidos no contexto do dispositivo de reprodução.
META_POLYPOLYGON Pinta uma série de polígonos fechados, que podem se sobrepor. Cada polígono é delineado usando a caneta e preenchido usando o pincel e o modo de preenchimento de polígono que são definidos no contexto do dispositivo de reprodução.
META_RECTANGLE Pinta um retângulo, que é delineado com a caneta e preenchido com o pincel e preenchido com o pincel definido no contexto do dispositivo de reprodução.
META_ROUNDRECT Pinta um retângulo com cantos arredondados. O retângulo é delineado com a caneta e preenchido com o pincel e preenchido com o pincel definido no contexto do dispositivo de reprodução.
META_SETPIXEL Define o pixel nas coordenadas especificadas para a cor especificada.
META_TEXTOUT Produz uma sequência de caracteres no local especificado usando a fonte, a cor de fundo e a cor do texto que são definidas no contexto do dispositivo de reprodução.

Registros de objeto

Os registros de objeto criam e gerenciam objetos gráficos. Em arquivos WMF, existem duas grandes categorias de objetos - objetos gráficos e objetos de estrutura. Objetos de estrutura não são explicitamente criados ou excluídos em um WMF, eles são estruturas complexas. Por exemplo, o BitmapCoreHeader contém informações sobre as dimensões e o formato de cor de um bitmap independente de dispositivo, que por sua vez faz parte de um objeto DeviceIndependentBitmap. Um objeto gráfico, no entanto, especifica parâmetros para saída de gráficos e durante a reprodução do WMF, ele configura o contexto do dispositivo de reprodução.

Objetos gráficos podem ser pincéis (define o estilo, cor e padrão de um pincel que define como pintar uma área do gráfico), fontes (define propriedades que afetam como o texto é exibido), paletas (especifica cores como valores independentes de dispositivo, definidas por um aplicativo), canetas (especifica os atributos gráficos de uma linha) e regiões (que especificam segmentos de linha e curva que definem uma forma).

Nome Descrição
META_CREATEBRUSHINDIRECT Cria um objeto de pincel a partir de um objeto LogBrush (pincel lógico).
META_CREATEFONTINDIRECT Cria um objeto de pincel a partir de um objeto de fonte.
META_CREATEPALETTE Cria um objeto de paleta.
META_CREATEPATTERNBRUSH Cria um objeto de pincel a partir de um objeto LogBrush (pincel lógico).
META_CREATEPENINDIRECT Cria um objeto caneta.
META_CREATEREGION Cria um objeto de região.
META_DELETEOBJECT Exclua um objeto.
META_CREATEBRUSHINDIRECT Cria um objeto de pincel a partir de um objeto LogBrush (pincel lógico).
META_DIBCREATEPATTERNBRUSH Cria um objeto de pincel a partir de um bitmap independente de dispositivo.
META_SELECTCLIPREGION Especifica o objeto de região que será a região de recorte atual .
META_SELECTOBJECT Seleciona o objeto que será o objeto atual para o contexto do dispositivo de reprodução, que funciona em todos os objetos gráficos, exceto objetos de paleta, que devem ser definidos com META_SELECTPALETTE.
META_SELECTPLAETTE Seleciona a paleta lógica para o contexto do dispositivo de reprodução.

Registros estaduais

Os registros de estado gerenciam as propriedades gráficas do contexto do dispositivo de reprodução.

Nome Descrição
META_ANIMATEPALETTE Redefine entradas na paleta lógica que é definida no contexto do dispositivo de reprodução com um objeto de paleta especificado.
META_EXCLUDECLIPRECT Define a região de recorte que é definida no contexto do dispositivo de reprodução para a região de recorte existente menos um retângulo especificado.
META_INTERSECTCLIPRECT Define a região de recorte que é definida no contexto do dispositivo de reprodução para a interseção da região de recorte existente e um retângulo especificado.
META_MOVETO Define a posição de saída no contexto do dispositivo de reprodução para um ponto especificado.
META_OFFSETCLIPRGN Move a região de recorte definida no contexto do dispositivo de reprodução por deslocamentos especificados.
META_OFFSETVIEWPORTORG Move a origem da janela de visualização no contexto do dispositivo de reprodução por deslocamentos horizontais e verticais especificados.
META_OFFSETWINDOWORG Move a origem da janela de saída no contexto do dispositivo de reprodução por deslocamentos horizontais e verticais especificados.
META_REALIZEPALETTE Mapeia as entradas da paleta lógica definida no contexto do dispositivo de reprodução para a paleta do sistema.
META_RESIZEPALETTE Redefine o tamanho da paleta lógica que é definida no contexto do dispositivo de reprodução.
META_RESTOREDC Restaura o contexto do dispositivo de reprodução de um contexto de dispositivo salvo anteriormente.
META_SAVEDC Salva o contexto do dispositivo de reprodução para recuperação posterior.
META_SCALEVIEWPORTEXT Dimensiona as extensões horizontais e verticais da janela de visualização que é definida no contexto do dispositivo de reprodução usando as proporções formadas por multiplicandos e divisores especificados.
META_SCALEWINDOWEXT Dimensiona as extensões horizontais e verticais da janela de saída que é definida no contexto do dispositivo de reprodução usando as proporções formadas por multiplicandos e divisores especificados.
META_SETBKCOLOR Define a cor de fundo no contexto do dispositivo de reprodução para uma cor especificada.
META_SETBKMODE Define o modo de mixagem de fundo no contexto do dispositivo de reprodução.
META_SETLAYOUT Define a orientação do layout no contexto do dispositivo de reprodução.
META_SETMAPMODE Define o modo de mapeamento no contexto do dispositivo de reprodução.
META_SETMAPPERFLAGS Define o algoritmo que o mapeador de fontes usa ao mapear fontes lógicas para fontes físicas.
META_SETPALENTRIES Define os valores de cor RGB em um intervalo de entradas na paleta lógica que é definida no contexto do dispositivo de reprodução.
META_SETPOLYFILLMODE Define o modo de preenchimento de polígono no contexto do dispositivo de reprodução para operações gráficas que preenchem polígonos.
META_SETRELABS Registro não utilizado.
META_SETROP2 Define o modo de mixagem da operação raster de primeiro plano no contexto do dispositivo de reprodução.
META_SETSTRETCHBLTMODE Define o modo de alongamento de bitmap no contexto do dispositivo de reprodução.
META_SETTEXTALIGN Define valores de alinhamento de texto no contexto do dispositivo de reprodução.
META_SETTEXTCHAREXTRA Define o espaçamento entre caracteres para justificação do texto no contexto do dispositivo de reprodução.
META_SETTEXTCOLOR Define a cor do primeiro plano do texto no contexto do dispositivo de reprodução.
META_SETTEXTJUSTIFICATION Define a quantidade de espaço a ser adicionada para quebrar caracteres em uma string de texto justificado.
META_SETVIEWPORTEXT Define as extensões horizontal e vertical da janela de visualização no contexto do dispositivo de reprodução.
META_SETVIEWPORTORG Define a origem da janela de visualização no contexto do dispositivo de reprodução.
META_SETWINDOWEXT Define as extensões horizontal e vertical da janela de saída no contexto do dispositivo de reprodução.
META_SETWINDOWORG Define a origem da janela de saída no contexto do dispositivo de reprodução.

Registros de fuga

Registro de escape genérico WMF

Os registros de escape são um meio de estender a funcionalidade do metarquivo por meio de registros que não são definidos de outra forma como um tipo de registro WMF. Cada registro de escape contém uma função de registro, uma função de escape e dados de escape potencialmente.

Os seguintes registros de escape constituem um arquivo WMF.

Nome Descrição
ABORTDOC Pára de processar o documento atual.
BEGIN_PATH Abre um caminho.
CHECK_JPEGFORMAT Determina se ele pode lidar com a imagem JPEG fornecida .
CHECK_PNGFORMAT Determina se ele pode lidar com a imagem PNG fornecida .
CLIP_TO_PATH Aplica uma função ao caminho de recorte PostScript atual .
CLOSE_CHANNEL O mesmo que ENDDOC.
DOWNLOAD_FACE Define o nome da face da fonte no dispositivo de saída.
DOWNLOAD_HEADER Baixa conjuntos de procedimentos PostScript.
DRAW_PATTERNRECT Desenha um retângulo com um padrão definido.
POSTSCRIPT ENCAPSULADO Envia dados PostScript encapsulados arbitrariamente (EPS) diretamente para o driver da impressora.
END_PATH Termina um caminho.
ENDDOC Notifica o driver da impressora que um novo trabalho de impressão está terminando.
EPS_PRINTING Indica o início e o fim da impressão EPS.
EXTTEXTOUT Desenha o texto usando a fonte, a cor de fundo e a cor do texto atualmente selecionadas.
GET_COLORTABLE Obtém os valores da tabela de cores do driver da impressora.
GET_DEVICEUNITS Obtém as unidades de dispositivo atualmente configuradas no dispositivo de saída.
GET_EXTENDED_TEXTMETRICS Obtém as métricas de texto estendido atualmente configuradas no driver da impressora.
GET_FACENAME Obtém o nome da face da fonte atualmente configurada no dispositivo de saída.
GET_PAIRKERNTABLE Obtém a tabela de kern de fonte atualmente definida no dispositivo de saída.
GET_PHYSPAGESIZE Recupera o tamanho da página física atualmente selecionado no dispositivo de saída.
GET_PRINTINGOFFSET Recupera o deslocamento do canto superior esquerdo da página física onde a impressão ou desenho real começa.
GET_PS_FEATURESETTING Consulta o driver da impressora para obter informações sobre os recursos PostScript suportados no dispositivo de saída.
GET_SCALINGFACTOR Recupera os fatores de escala para o eixo xe o eixo y de uma impressora.
META_ESCAPE_ENHANCED_METAFILE Usado para incorporar um metarquivo EMF em um metarquivo WMF.
METAFILE_DRIVER Consulta o driver da impressora sobre seu suporte para metarquivos no dispositivo de saída.
NEWFRAME Notifica o driver da impressora que o aplicativo terminou de gravar em uma página.
NEXTBAND Notifica o driver da impressora que o aplicativo concluiu a gravação em uma banda.
ATRAVESSAR Passa dados arbitrários para o driver da impressora.
POSTSCRIPT_DATA Envia dados PostScript arbitrários para o dispositivo de saída.
POSTSCRIPT_IDENTIFY Define o driver da impressora para o modo centrado em PostScript ou centralizado em GDI.
POSTSCRIPT_IGNORE Notifica o dispositivo de saída para ignorar os dados PostScript.
POSTSCRIPT_INJECTION Insere um bloco de dados brutos em um fluxo PostScript.
POSTSCRIPT_PASSTHROUGH Envia dados arbitrários diretamente para um driver de impressora, que deve processar esses dados apenas no modo PostScript.
OPEN_CHANNEL Atua da mesma forma que STARTDOC, com um documento NULL e nome de arquivo de saída e dados em modo bruto.
QUERY_DIBSUPPORT Consulta o driver da impressora sobre seu suporte para DIBs no dispositivo de saída.
QUERY_ESCSUPPORT Consulta o driver da impressora para determinar se uma função de escape WMF específica é suportada no dispositivo de saída.
SET_COLORTABLE Define os valores da tabela de cores.
SET_COPYCOUNT Define o número de cópias.
SET_LINECAP Especifica o modo de finalização de linha a ser usado no desenho para o dispositivo de saída.
SET_LINEJOIN Especifica o modo de junção de linha a ser usado no desenho para o dispositivo de saída.
SET_MITERLIMIT Define o limite para o comprimento das junções de esquadria a serem usadas no desenho para o dispositivo de saída.
SPCLPASSTHROUGH2 Permite que os documentos incluam procedimentos privados e outros dados arbitrários nos documentos.
STARTDOC Notifica o driver da impressora que um novo trabalho de impressão está sendo iniciado.

Houve uma grande vulnerabilidade encontrada em registros de escape em torno do registro de escape Abort, que armazena o código do procedimento de aborto dentro do próprio registro. Isso afetou os sistemas Windows (consulte CVE - 2005-4560 ) e o projeto Wine (consulte CVE - 2006-0106 ). De acordo com a Secunia , "A vulnerabilidade é causada por um erro no manuseio de arquivos Windows Metafile ('.wmf') contendo registros SETABORTPROC 'Escape' especialmente criados. Esses registros permitem que funções arbitrárias definidas pelo usuário sejam executadas durante a renderização de um arquivo WMF falha. " De acordo com a documentação do SDK do Windows 3.1, o escape SETABORTPROC estava obsoleto e foi substituído pela função de mesmo nome no Windows 3.1, muito antes da vulnerabilidade do WMF ser descoberta. No entanto, o código de escape obsoleto foi mantido para compatibilidade com programas de 16 bits escritos para (ou pelo menos compatível com versões anteriores) do Windows 3.0. Essa alteração aconteceu aproximadamente ao mesmo tempo que a Microsoft estava criando a reimplementação de 32 bits do GDI para Windows NT e é provável que a vulnerabilidade tenha ocorrido durante esse esforço.

Depois que Steve Gibson acusou a Microsoft de implementar deliberadamente um backdoor em seu código, Mark Russinovich forneceu uma réplica e afirmou que:

... as coisas eram diferentes quando o formato foi arquitetado. No Windows 3.1, o código do modelo de memória “grande” é inerentemente independente da localização e o Windows nunca foi corrigido, então tanto o Windows quanto um aplicativo poderiam simplesmente copiar uma função do aplicativo para o arquivo WMF e assumir que funcionaria quando reproduzido pelo mesmo aplicativo em uma sessão de execução posterior. Em qualquer caso, não está claro se os desenvolvedores imaginaram aplicativos criando metarquivos em disco com procedimentos de aborto. Além disso, como Stephen Toulouse, da Microsoft, apontou na refutação da Microsoft às afirmações de Steve, o cenário de segurança no início dos anos 1990 era muito diferente do de hoje e todo código, incluindo aquele armazenado em um arquivo WMF, era inerentemente confiável.

Peter Ferrie, da Symantec Security Response, EUA, também discordou de Gibson, observando que:

Gibson afirmou que um thread é criado para executar o manipulador SetAbortProc. Na verdade, nenhum thread é criado para executar o manipulador - é um retorno de chamada, que é chamado pelo analisador, e o analisador tem que esperar até que o retorno de chamada retorne, caso contrário, todo o ponto da função (para abortar a impressão) é perdido . Por sua própria admissão, Gibson não leu a documentação (na verdade, ele alegou que não conseguiu encontrá-la, embora esteja disponível gratuitamente no site da Microsoft), e afirmou que o contexto do dispositivo não está disponível para o manipulador de funções . É claro que o contexto do dispositivo está disponível para o manipulador da função - é um dos dois parâmetros que são passados ​​a ele (veja acima) e é necessário para abortar a impressão. Finalmente, Gibson afirmou que o fluxo de controle não poderia retornar ao Windows. É simplesmente uma questão de a função retornar e descartar os parâmetros que foram passados ​​na pilha. Se o registro estiver bem formado, o Windows continuará a analisar o arquivo, como antes. ... Gibson admite que estava adivinhando sobre uma série de coisas. Infelizmente, ele adivinhou mal. Acho que sabemos melhor agora.

EMF

Cabeçalhos Windows Enhanced Metafile

Os arquivos EMF têm três versões possíveis de cabeçalhos. Os cabeçalhos originais são apenas um contêiner para imagens, a segunda e a terceira versão encapsula o cabeçalho original e contém um registro de formato de pixel e suporte para registros OpenGL, e a terceira versão encapsula a segunda extensão do cabeçalho e aumenta a precisão de EMF e escalabilidade de EMFs conforme ela adiciona a capacidade de medir distâncias de superfícies de dispositivos usando o sistema métrico.

Cada cabeçalho EMF começa com um registro EMR_HEADER e registra as propriedades relevantes do dispositivo no qual a imagem do metarquivo foi gravada. O cabeçalho EMF original tem um cabeçalho de 80 bytes e uma string de descrição opcional de comprimento variável. Outros metarquivos contêm campos de extensão, que encapsulam o cabeçalho original. EmfMetafileHeaderExtension1é um registro que é inserido diretamente após o cabeçalho EMF original, especifica se há um descritor de formato de pixel e o deslocamento para o objeto descritor dentro do cabeçalho, bem como um campo que especifica se existem registros OpenGL no metarquivo. O descritor de formato de pixel especifica os recursos da superfície de desenho e se um pixel é codificado em RGBA ou é um índice em uma tabela de cores. EmfMetafileHeaderExtension2é um registro inserido diretamente após o EmfMetafileHeaderExtension1registro e contém dois campos com os valores X e Y para medir a superfície do dispositivo em micrômetros.

Como os arquivos WMF, os registros podem ser classificados por função, entretanto, há mais tipos de registro em arquivos EMF do que em arquivos WMF. Os registros podem ser classificados como controle, bitmap, recorte, comentário, desenho, escape, criação de objeto, manipulação de objeto, OpenGL, colchete de caminho, estado e registros de transformação.

EMF +

Com o lançamento do Windows XP , o formato Enhanced Metafile Format Plus Extensions (EMF +) foi introduzido. EMF + fornece uma maneira de serializar chamadas para a API GDI + da mesma maneira que WMF / EMF armazena chamadas para GDI.

Também existem versões compactadas de metarquivos do Windows, conhecidos como metarquivo compactado do Windows (WMZ) e metarquivo aprimorado do Windows compactado (EMZ), que são basicamente arquivos WMF e EMF compactados por gzip, correspondentemente.

Implementações

O formato WMF foi projetado para ser executado pela camada GDI do Windows para restaurar a imagem , mas como os arquivos binários WMF contêm a definição das primitivas gráficas GDI que constituem esta imagem, é possível projetar bibliotecas alternativas que renderizam o binário WMF arquivos ou convertê-los em outros formatos gráficos.

Veja também

Referências

links externos