Windows Metafile - Windows Metafile
Windows Metafile ( WMF ) er et bildefilformat som opprinnelig ble designet for Microsoft Windows på 1990-tallet. Det opprinnelige Windows Metafile-formatet var ikke enhetsuavhengig (men kunne gjøres mer med plasseringshoder) og kan inneholde både vektorgrafikk og bitmapkomponenter . Det fungerer på samme måte som SVG- filer. WMF-filer ble senere erstattet av Enhanced Metafiles (EMF-filer) som sørget for enhetsuavhengighet. EMF-filer ble deretter forbedret via EMF + -filer.
I hovedsak lagrer en metafil en liste over poster som består av tegningskommandoer, definisjoner av egenskaper og grafikkobjekter for å vise et bilde på skjermen. Tegningskommandoene som er brukt, er nært beslektet med kommandoene til GDI- API ( Graphics Device Interface ) som brukes til tegning i Microsoft Windows.
Det er tre hovedtyper metafiler - en WMF er et 16-biters format introdusert i Windows 3.0 . Det er det opprinnelige vektorformatet for Microsoft Office- applikasjoner som Word , PowerPoint og Publisher . Fra og med 2017 er revisjon 14 av Windows Metafile Format-spesifikasjonen tilgjengelig for online lesing eller nedlasting som PDF. EMF-filer, som erstattet WMF-filer, fungerer på samme prinsipp bare det er et 32-biters filformat som også muliggjør innebygging av private data i "kommentar" poster. EMF + er en utvidelse av EMF-filer og innebygd i disse kommentaroppføringene, og tillater bilder og tekst ved hjelp av kommandoer, objekter og egenskaper som ligner på Windows GDI + .
Historie
Det opprinnelige 16-biters WMF-filformatet ble spesifisert i volum 4 av Windows 3.1 SDK-dokumentasjonen fra 1992 (i det minste hvis kombinert med beskrivelsene av de enkelte funksjonene og strukturene i de andre volumene), men spesifikasjonen var vag om noen få detaljer. Disse håndbøkene ble publisert som trykte bøker tilgjengelig i bokhandlere uten klikk gjennom EULA eller andre uvanlige lisensbegrensninger (bare en generell advarsel om at hvis programvaren ble kjøpt som en del av en programvarepakke, vil den være underlagt en).
Over tid ble eksistensen av den historiske spesifikasjonen stort sett glemt, og noen alternative implementeringer brukte reversering for å finne ut filformatet fra eksisterende WMF-filer, noe som var vanskelig og feilutsatt. I september 2006 publiserte Microsoft igjen WMF-filformatspesifikasjonen i en mer fullstendig form i sammenheng med Microsoft Open Specification Promise , og lovet å ikke hevde patentrettigheter til filformatimplanterere.
Microsoft avskrev senere WMF-filer til fordel for 32-biters EMF-filer, da WMF-filer hadde reelle problemer med enhetsuavhengighet, til tross for bruk av en "plasserbar" filoverskrift som ga grunnleggende enhetsuavhengighet. Microsoft fant at utviklere som bruker formatet var "[innebygd] applikasjon, plassering eller skaleringskommentarer i metafilene ... Andre la til overskrifter i metafilen som ga forskjellige applikasjonsspesifikke opplysninger", og forårsaket store kompatibilitetsproblemer. I 1992 med Windows NT 3.1 introduserte Microsoft således Enhanced Metafile format (EMF) - et format som var basert på Win32 API og som de innebygde enhetsuavhengighet med. - disse var også kjent som NT-metafiler. Med utgivelsen av Windows XP og GDI + måtte settet med poster økes betydelig, og derfor ga Microsoft ut EMF + som en utvidelse av det eksisterende EMF-filformatet.
Metafile struktur
WMF-, EMF- og EMF + -filer består av en rekke poster som spilles av for å gi grafisk utdata. Noen poster definerer objekter som kan spesifisere grafiske objekter som brukes til å bestemme hvordan grafikk skal tegnes (f.eks. Angir penner fargen og bredden på linjene). Hver av disse objektene lagres i metafiler og plasseres i en objekttabell, som sporer bruken av grafiske objekter mens du behandler metafilen. Objektbordet er et assosiativt utvalg av indekser til grafiske objektstrukturer definert i metafilen.
WMF- og EMF-filer håndterer objektbehandling på en annen måte enn EMF + -poster i EMF-filer. Når en WMF- og EMF-fil behandles, blir postene lest inn i en objekttabell når et objekt er definert. Hvis et objekt slettes, frigjøres objektet fra tabellen, og identifikatoren kan brukes på nytt. Spesielt vil et objekt ikke brukes før det er valgt spesielt under avspilling av plater. Dette er forskjellig for EMF + -filer, som også bruker en assosiativ matrise via en hashmap som registrerer objektet sammen med en objektidentifikator. Imidlertid, i motsetning til WMF- og EMF-filer som kan slette et objekt, når et nytt objekt opprettes med samme indeks som et eksisterende objekt, blir oppføringen i tabellen erstattet med det nye objektet. En EMF-fil trenger heller ikke å velge et objekt spesifikt før det brukes.
WMF
WMF-filer ble ikke opprinnelig designet for å være enhetsuavhengige, noe som betyr at du ikke kunne spille av filen på utdataenheter som avviker fra den opprinnelige enheten som filen ble spilt inn på. En delvis løsning på dette problemet ble oppfunnet av Aldus Corporation , som la til en ekstra "plasserbar" header, kalt "APM-header", som la til en avgrensningsrettbar, en metafilversjon, metafilestørrelse, antall objekter i metafilen og størrelsen av den største enkeltplaten i metafilen. Dette ble senere innlemmet i WMF-formatet av Microsoft, fra og med Windows 2000.
WMF-filer er strukturert av en serie poster, startende med et antall kontrollposter: toppteksten, den nevnte valgfrie plasserbare posten, og avsluttes med en slutt på filopptaket.
Innkapslet av kontrollpostene er postene som utgjør selve bildet. Disse postene fungerer innenfor det som kalles avspillingsenhetskonteksten , som er samlingen av egenskaper og objekter som utgjør enhetens grafiske miljø når metafilen "spilles" av på denne utdataenheten.
Andre poster enn kontrollposter kan i stor grad grupperes i bitmapposter, tegningsposter, objektposter, tilstandsposter og rømningsposter.
Bitmap poster
Bitmap-poster administrerer og sender ut bitmap-bilder .
Navn | Beskrivelse |
---|---|
META_BITBLT | Spesifiserer hvordan du gjør litt blokkoverføring . Disse postene kan spesifisere en bitmap som skal brukes som kilde eller som en region. |
META_DIBBITBLT | Spesifiserer hvordan du gjør litt blokkering av et enhetsuavhengig bitmapbilde . Disse postene kan spesifisere et bitmappe som skal brukes som kilde eller som en region. |
META_DIBSTRETCHBITBLT | Spesifiserer hvordan du gjør litt overføring av et enhetsuavhengig bitmapbilde, men tillater utvidelse eller sammentrekning av bildet. Disse postene kan spesifisere et bitmappe som skal brukes som kilde eller som en region. |
META_SETDIBTODEV | Spesifiserer farge for å angi en blokk med piksler i et enhetsuavhengig bitmapbilde. Disse postene kan spesifisere en bitmap som skal brukes som kilde eller som en region. |
META_STRETCHBLT | Spesifiserer hvordan du gjør litt overføring av blokkering, men tillater utvidelse eller sammentrekning av bildet. |
META_STRETCHDIB | Spesifiserer hvordan du gjør litt overføring av et enhetsuavhengig bitmapbilde, men tillater utvidelse eller sammentrekning av bildet. Disse postene kan spesifisere et bitmappe som skal brukes som kilde eller som en region. |
Tegne poster
Tegningsposter produserer grafikkoutput.
Navn | Beskrivelse |
---|---|
META_ARC | Tegner en elliptisk lysbue . |
META_CHORD | Tegner et akkord . |
META_ELLIPSE | Tegner en elliptisk lysbue . |
META_EXTFLOODFILL | Fyller et område med en børste. |
META_EXTTEXTOUT | Tegn tekst med skrift, bakgrunnsfarge og tekstfarge i avspillingsenhetens sammenheng. |
META_FILLREGION | Fyller en region med en spesifisert børste. |
META_FLOODFILL | Fyller et område med en børste. |
META_FRAMEREGION | Tegner en kant rundt en region på siden med en pensel. |
META_INVERTREGION | Maler en region av grafikken med inverterte farger. |
META_LINETO | Tegner en halv åpen linje fra tegningsposisjonen som er definert i avspillingsenhetens kontekst til et spesifisert punkt. |
META_PAINTREGION | Mal et område med gjeldende pensel spesifisert i avspillingsenhetens sammenheng. |
META_PATBLT | Mal et område med gjeldende pensel spesifisert i avspillingsenhetens sammenheng, og kombiner deretter penselfarge og overflatefarge (r) ved hjelp av en rasteroperasjon . |
META_PIE | Tegn en kakeformet kil begrenset av skjæringspunktet mellom en ellips og to radialer - linjen blir satt via pennesettet via avspillingsenhetens kontekst, og området avgrenset av kakeformen fylles ut av gjeldende børste til avspillingsenheten kontekst. |
META_POLYLINE | Tegner en serie linjesegmenter ved å koble punktene i en spesifisert matrise. |
META_POLYGON | Maler en polygon som består av to eller flere hjørner forbundet med rette linjer. Polygonet skisseres ved hjelp av pennen og fylles ved hjelp av pensel- og polygonfyllingsmodus som er definert i avspillingsenhetens sammenheng. |
META_POLYPOLYGON | Maler en serie lukkede polygoner som kan overlappe hverandre. Hver polygon skisseres ved hjelp av pennen og fylles ved hjelp av pensel- og polygonfyllingsmodus som er definert i avspillingsenhetens sammenheng. |
META_RECTANGLE | Maler et rektangel, som er skissert ved bruk av pennen og fylt ut med penselen og fylles med penselen som er definert i avspillingsenhetens sammenheng. |
META_ROUNDRECT | Maler et rektangel med avrundede hjørner. Rektangelet skisseres ved hjelp av pennen og fylles ved hjelp av børsten og fylles ved hjelp av børsten som er definert i avspillingsenhetens sammenheng. |
META_SETPIXEL | Angir pikselet ved de angitte koordinatene til den angitte fargen. |
META_TEXTOUT | Skriver ut en tegnstreng på det angitte stedet ved å bruke skrift, bakgrunnsfarge og tekstfarge som er definert i avspillingsenhetens sammenheng. |
Objekt poster
Objektposter oppretter og administrerer grafikkobjekter. I WMF-filer er det to brede kategorier av objekter - grafikkobjekter og strukturobjekter. Strukturobjekter blir ikke eksplisitt opprettet eller slettet i en WMF, de er i stedet for komplekse strukturer. For eksempel inneholder BitmapCoreHeader informasjon om dimensjonene og fargeformatet til en enhetsuavhengig bitmap, som i seg selv er en del av et DeviceIndependentBitmap-objekt. Et grafikkobjekt spesifiserer imidlertid parametere for grafikkutgang, og under avspilling av WMF setter den opp avspillingsenhetskonteksten.
Grafikkobjekter kan være pensler (definerer stil, farge og mønster på en pensel som definerer hvordan man skal male et område av grafikken), skrifter (definerer egenskaper som påvirker hvordan teksten vises), paletter (spesifiserer farger som enhetsuavhengige verdier, definert av et program), penner (spesifiserer de grafiske attributtene til en linje) og regioner (som spesifiserer linje- og kurvesegmenter som definerer en form).
Navn | Beskrivelse |
---|---|
META_CREATEBRUSHINDIRECT | Oppretter et penselobjekt fra et LogBrush-objekt (logisk børste). |
META_CREATEFONTINDIRECT | Oppretter et penselobjekt fra et fontobjekt. |
META_CREATEPALETTE | Oppretter et palettobjekt. |
META_CREATEPATTERNBRUSH | Oppretter et penselobjekt fra et LogBrush-objekt (logisk børste). |
META_CREATEPENINDIRECT | Lager et pennobjekt. |
META_CREATEREGION | Oppretter et regionobjekt. |
META_DELETEOBJECT | Slett et objekt. |
META_CREATEBRUSHINDIRECT | Oppretter et penselobjekt fra et LogBrush-objekt (logisk børste). |
META_DIBCREATEPATTERNBRUSH | Oppretter et penselobjekt fra en enhetsuavhengig bitmap. |
META_SELECTCLIPREGION | Spesifiserer regionobjektet som vil være den nåværende utklippsregionen . |
META_SELECTOBJECT | Velger objektet som vil være det gjeldende objektet for avspillingsenhetens kontekst, som fungerer på alle grafikkobjekter unntatt palettobjekter, som må angis med META_SELECTPALETTE. |
META_SELECTPLAETTE | Velger den logiske paletten for avspillingsenhetens kontekst. |
Statlige poster
Statlige poster administrerer grafikkegenskapene til avspillingsenhetens sammenheng.
Navn | Beskrivelse |
---|---|
META_ANIMATEPALETTE | Definerer oppføringer i den logiske paletten på nytt som er definert i avspillingsenhetens sammenheng med et spesifisert palettobjekt. |
META_EXCLUDECLIPRECT | Angir klippeområdet som er definert i avspillingsenhetens sammenheng til det eksisterende klippeområdet minus et spesifisert rektangel. |
META_INTERSECTCLIPRECT | Angir klippeområdet som er definert i avspillingsenhetens sammenheng til skjæringspunktet mellom det eksisterende klippeområdet og et spesifisert rektangel. |
META_MOVETO | Stiller utgangsposisjonen i avspillingsenhetens kontekst til et spesifisert punkt. |
META_OFFSETCLIPRGN | Flytter utklippsregionen som er definert i avspillingsenhetens sammenheng med angitte forskyvninger. |
META_OFFSETVIEWPORTORG | Flytter visningsopprinnelsen i avspillingsenhetens sammenheng med angitte horisontale og vertikale forskyvninger. |
META_OFFSETWINDOWORG | Flytter utgangsvinduets opprinnelse i avspillingsenhetens sammenheng med angitte horisontale og vertikale forskyvninger. |
META_REALIZEPALETTE | Kartlegger oppføringer fra den logiske paletten som er definert i avspillingsenhetens sammenheng til systempaletten. |
META_RESIZEPALETTE | Definerer størrelsen på den logiske paletten som er definert i avspillingsenhetskonteksten. |
META_RESTOREDC | Gjenoppretter avspillingskontekst fra en tidligere lagret enhetskontekst. |
META_SAVEDC | Lagrer avspillingsenhetens kontekst for senere henting. |
META_SCALEVIEWPORTEXT | Skalerer de horisontale og vertikale delene av visningsporten som er definert i avspillingsenhetens kontekst ved hjelp av forholdstallene som er dannet av spesifiserte multiplikaler og delere. |
META_SCALEWINDOWEXT | Skaler de horisontale og vertikale delene av utgangsvinduet som er definert i avspillingsenhetens kontekst ved hjelp av forholdstallene dannet av spesifiserte multiplikaler og divisorer. |
META_SETBKCOLOR | Angir bakgrunnsfargen i avspillingsenhetens kontekst til en spesifisert farge. |
META_SETBKMODE | Stiller inn bakgrunnsblandingsmodus i avspillingskontekst. |
META_SETLAYOUT | Definerer layoutretningen i avspillingsenhetens kontekst. |
META_SETMAPMODE | Definerer kartleggingsmodus i avspillingskontekst. |
META_SETMAPPERFLAGS | Definerer algoritmen som font mapper bruker når den tilordner logiske skrifter til fysiske skrifter. |
META_SETPALENTRIES | Definerer RGB-fargeværdier i en rekke oppføringer i den logiske paletten som er definert i avspillingsenhetens sammenheng. |
META_SETPOLYFILLMODE | Definerer polygonfyllingsmodus i avspillingsenhetens kontekst for grafikkoperasjoner som fyller polygoner. |
META_SETRELABS | Ubrukt plate. |
META_SETROP2 | Definerer rasteroperasjonens blandingsmodus i avspillingsenhetens sammenheng. |
META_SETSTRETCHBLTMODE | Definerer bitmap-strekkingsmodus i avspillingsenhetens sammenheng. |
META_SETTEXTALIGN | Definerer verdier for tekstjustering i avspillingsenhetens sammenheng. |
META_SETTEXTCHAREXTRA | Definerer mellomrom mellom tegn for tekstjustering i avspillingsenhetens sammenheng. |
META_SETTEXTCOLOR | Definerer tekst forgrunnsfarge i avspillingsenhetens sammenheng. |
META_SETTEXTJUSTIFICATION | Definerer hvor mye plass som skal legges til for å bryte tegn i en streng med berettiget tekst. |
META_SETVIEWPORTEXT | Definerer de horisontale og vertikale delene av visningsområdet i avspillingsenhetens sammenheng. |
META_SETVIEWPORTORG | Definerer visningsopprinnelsen i avspillingsenhetens sammenheng. |
META_SETWINDOWEXT | Definerer de horisontale og vertikale delene av utgangsvinduet i avspillingsenhetens sammenheng. |
META_SETWINDOWORG | Definerer utgangsvinduets opprinnelse i avspillingsenhetens sammenheng. |
Escape-poster
Escape-poster er et middel for å utvide metafile-funksjonalitet via poster som ellers ikke er definert som en WMF-posttype. Hver rømningspost inneholder en postfunksjon, en rømningsfunksjon og potensielt rømningsdata.
Følgende fluktposter utgjør en WMF-fil.
Navn | Beskrivelse |
---|---|
ABORTDOC | Stopper behandlingen av det gjeldende dokumentet. |
BEGIN_PATH | Åpner en sti. |
CHECK_JPEGFORMAT | Bestemmer om den kan håndtere det gitte JPEG- bildet. |
CHECK_PNGFORMAT | Bestemmer om den kan håndtere det gitte PNG- bildet. |
CLIP_TO_PATH | Bruker en funksjon på den nåværende PostScript- klippestien. |
CLOSE_CHANNEL | Samme som ENDDOC. |
LAST NED_FACE | Angir navnet på skriftens ansiktsnavn på utdataenheten. |
LAST NED_HEADER | Last ned sett med PostScript-prosedyrer. |
DRAW_PATTERNRECT | Tegner et rektangel med et definert mønster. |
ENCAPSULATED_POSTSCRIPT | Sender vilkårlig innkapslet PostScript (EPS) data direkte til skriverdriveren. |
END_PATH | Avslutter en sti. |
ENDDOC | Varsler skriverdriveren om at en ny utskriftsjobb avsluttes. |
EPS_PRINTING | Indikerer start og slutt på EPS-utskrift. |
EXTTEXTOUT | Tegner tekst med den valgte fonten, bakgrunnsfargen og tekstfargen. |
GET_COLORTABLE | Henter fargetabellverdier fra skriverdriveren. |
GET_DEVICEUNITS | Får enhetene som for øyeblikket er konfigurert på utdataenheten. |
GET_EXTENDED_TEXTMETRICS | Henter de utvidede tekstberegningene som for øyeblikket er konfigurert i skriverdriveren. |
GET_FACENAME | Får navnet på skrifttypen som for øyeblikket er konfigurert på utdataenheten. |
GET_PAIRKERNTABLE | Får fontkjernetabellen som for øyeblikket er definert på utdataenheten. |
GET_PHYSPAGESIZE | Henter den fysiske sidestørrelsen som er valgt på utdataenheten. |
GET_PRINTINGOFFSET | Henter forskyvningen fra øvre venstre hjørne av den fysiske siden der den faktiske utskriften eller tegningen begynner. |
GET_PS_FEATURESETTING | Spør skriverdriveren for informasjon om PostScript-funksjoner som støttes på utdataenheten. |
GET_SCALINGFACTOR | Henter skaleringsfaktorene for x-aksen og y-aksen til en skriver. |
META_ESCAPE_ENHANCED_METAFILE | Brukes til å bygge inn en EMF-metafil i en WMF-metafil. |
METAFILE_DRIVER | Spør skriverdriveren om støtten til metafiler på utdataenheten. |
NEWFRAME | Varsler skriverdriveren at applikasjonen er ferdig med å skrive til en side. |
NESTEBAND | Varsler skriverdriveren om at applikasjonen er ferdig med å skrive til et bånd. |
GÅ IGJENNOM | Passerer vilkårlige data til skriverdriveren. |
POSTSCRIPT_DATA | Sender vilkårlige PostScript-data til utdataenheten. |
POSTSCRIPT_IDENTIFY | Stiller skriverdriveren til enten PostScript-sentrisk eller GDI-sentrisk modus. |
POSTSCRIPT_IGNORE | Varsler utdataenheten om å ignorere PostScript-data. |
POSTSCRIPT_INJECTION | Setter inn en blokk med rådata i en PostScript-strøm. |
POSTSCRIPT_PASSTHROUGH | Sender vilkårlige data direkte til en skriverdriver, som forventes å behandle disse dataene bare i PostScript-modus. |
OPEN_CHANNEL | Fungerer det samme som STARTDOC, med et NULL-dokument og utdatafilnavn og data i råmodus. |
QUERY_DIBSUPPORT | Spør skriverdriveren om støtten for DIB på utdataenheten. |
QUERY_ESCSUPPORT | Spør skriverdriveren for å finne ut om en bestemt WMF-rømningsfunksjon støttes på utdataenheten. |
SET_COLORTABLE | Angir verdier for fargetabell. |
SET_COPYCOUNT | Angir antall eksemplarer. |
SET_LINECAP | Spesifiserer linjeavslutningsmodus som skal brukes til å tegne til utdataenheten. |
SET_LINEJOIN | Spesifiserer linjeforbindelsesmodusen som skal brukes til å tegne til utdataenheten. |
SET_MITERLIMIT | Angir grensen for lengden på gjæringsforbindelsen som skal brukes til å tegne til utdataenheten. |
SPCLPASSTHROUGH2 | Gjør det mulig for dokumenter å inkludere private prosedyrer og andre vilkårlige data i dokumenter. |
STARTDOC | Varsler skriverdriveren om at en ny utskriftsjobb starter. |
Det var en stor sårbarhet funnet i fluktposter rundt Abort escape-posten, som lagrer koden for avbruddsprosedyre i selve posten. Dette påvirket Windows-systemer (se CVE - 2005-4560 ) og Wine-prosjektet (se CVE - 2006-0106 ). Ifølge Secunia , "Sårbarheten er forårsaket av en feil i håndteringen av Windows Metafile-filer ('.wmf') som inneholder spesiallagde SETABORTPROC 'Escape' poster. Slike poster tillater at vilkårlig brukerdefinert funksjon kan utføres når gjengivelsen av en WMF-fil mislykkes. " I følge Windows 3.1 SDK-dokumentasjonen var SETABORTPROC-flukten foreldet og erstattet av funksjonen med samme navn i Windows 3.1, lenge før WMF-sårbarheten ble oppdaget. Den foreldede rømningskoden ble imidlertid beholdt for kompatibilitet med 16-biters programmer skrevet for (eller i det minste bakoverkompatible med) Windows 3.0. Denne endringen skjedde omtrent samtidig som Microsoft opprettet 32-biters reimplementering av GDI for Windows NT, og det er sannsynlig at sårbarheten oppstod under dette arbeidet.
Etter at Steve Gibson beskyldte Microsoft for bevisst å ha implementert en bakdør i koden, ga Mark Russinovich en tilbakevisning og uttalte at:
... ting var annerledes da formatet ble arkitektert. I Windows 3.1 er "stort" minnemodellkode iboende plasseringsuavhengig og Windows ble aldri lappet, så både Windows og et program kunne ganske enkelt kopiere en applikasjonsfunksjon til WMF-filen og anta at den ville fungere når den ble spilt av det samme programmet i en senere løpetur. I alle fall er det ikke klart at utviklerne så for seg applikasjoner som oppretter metafiler på disk med avbruddsprosedyrer. Som Microsofts Stephen Toulouse påpekte i Microsofts tilbakevisning av Steves påstander, var sikkerhetslandskapet tidlig på 1990-tallet veldig annerledes enn i dag, og all kode, inkludert den som var lagret i en WMF-fil, var iboende klarert.
Peter Ferrie fra Symantec Security Response, USA, var også uenig med Gibson og bemerket at:
Gibson hevdet at en tråd er opprettet for å kjøre SetAbortProc-behandleren. Det opprettes faktisk ingen tråder for å kjøre behandleren - det er en tilbakeringing, som kalles av parseren, og parseren må vente til tilbakeringingen returnerer, ellers går hele poenget med funksjonen (for å avbryte utskriften) tapt . Etter eget innrømmelse leste ikke Gibson dokumentasjonen (faktisk hevdet han at han ikke kunne finne den, selv om den er fritt tilgjengelig på Microsofts nettsted), og han hevdet at enhetskonteksten ikke er tilgjengelig for funksjonsbehandleren. . Enhetskonteksten er selvfølgelig tilgjengelig for funksjonsbehandleren - det er en av de to parametrene som sendes til den (se ovenfor), og det er nødvendig for å avbryte utskriften. Til slutt hevdet Gibson at kontrollflyten ikke kunne gå tilbake til Windows. Det handler ganske enkelt om at funksjonen returnerer og forkaster parametrene som ble sendt på bunken. Hvis posten er godt utformet, vil Windows fortsette å analysere filen, som før. ... Gibson innrømmer at han gjettet om en rekke ting. Dessverre gjettet han dårlig. Jeg vet vel at vi vet bedre nå.
EMF
EMF-filer har tre mulige versjoner av overskrifter. De originale topptekstene er bare en beholder for bilder, den andre og tredje versjonen innkapsler den originale overskriften og inneholder et pikselformatopptak og støtte for OpenGL-poster, og den tredje versjonen innkapsler den andre topptekstforlengelsen og øker EMF-nøyaktighet og skalerbarhet av EMF-er som den legger til muligheten til å måle avstander på enhetsflater ved hjelp av det metriske systemet.
Hver EMF-topptekst starter med en EMR_HEADER-post, og registrerer de relevante egenskapene til enheten som metafilbildet ble spilt inn på. Den originale EMF-toppteksten har en 80 byte-topptekst og en valgfri beskrivelsesstreng med variabel lengde. Andre metafiler inneholder utvidelsesfelt som innkapsler den originale overskriften. EmfMetafileHeaderExtension1
er en post som settes inn rett etter den originale EMF-overskriften, spesifiserer om det er en pikselformatbeskrivelse og forskyvningen til deskriptorobjektet i overskriften, samt et felt som spesifiserer om OpenGL- poster eksisterer i metafilen. Pikselformatbeskrivelsen spesifiserer funksjonene til tegningsflaten og om en piksel er kodet i RGBA eller er en indeks i en fargetabell. EmfMetafileHeaderExtension2
er en post som settes inn rett etter EmfMetafileHeaderExtension1
posten, og den inneholder to felt med X- og Y-verdiene for å måle enhetens overflate i mikrometer.
I likhet med WMF-filer kan poster klassifiseres etter funksjon, men det er flere posttyper i EMF-filer enn det er i WMF-filer. Postene kan klassifiseres som kontroll, bitmap, utklipp, kommentar, tegning, rømning, oppretting av objekter, objektmanipulering, OpenGL, banebrakett, tilstand og transformasjonsposter.
EMF +
Med utgivelsen av Windows XP ble formatet Enhanced Metafile Format Plus Extensions (EMF +) introdusert. EMF + gir en måte å serieisere samtaler til GDI + API på samme måte som WMF / EMF lagrer samtaler til GDI.
Det er også komprimerte versjoner av Windows Metafiles, kjent som Compressed Windows Metafile (WMZ) og Compressed Windows Enhanced Metafile (EMZ), som i utgangspunktet er gzip- komprimerte WMF- og EMF-filer tilsvarende.
Implementeringer
WMF-formatet ble designet for å bli utført av Windows GDI-laget for å gjenopprette bildet , men ettersom WMF-binære filer inneholder definisjonen av GDI-grafiske primitiver som utgjør dette bildet, er det mulig å designe alternative biblioteker som gjør WMF binære filer eller konvertere dem til andre grafiske formater.
Se også
- PostScript
- Vector Markup Language (VML)
- Skalerbar vektorgrafikk (SVG)