PureBasic & GDI+ 1.0
Metafile



Métafichier est le mot français pour métafile. Tout ce qui suit concerne uniquement les formats supportés par GDI et GDI+ sauf indications supplémentaires. Un métafichier (également appelé image vectorielle) contient une suite d'enregistrements qui décrivent une séquence d'opérations graphiques qui peuvent être enregistrées et lues. Par exemple, un métafichier vectoriel contient la description sous forme de vecteurs d'une image à la place de l'image elle-même. GDI+ comme GDI permet d'ajouter des commentaires au métafichier à l'emplacement de son choix dans la séquence d'opérations. Plusieurs séquences de commentaires peuvent être ajoutées.

Les éléments enregistrés dans un métafichier peuvent être stockés en mémoire, dans un fichier ou dans un flux (stream).

Les métafichiers stockent une image dans un format non tributaire du type de périphérique, ce qui les sépare des bitmaps. A la différence d'un bitmap, un métafichier garantit l'indépendance vis-à-vis des périphériques (sauf pour le format WMF). Les métafichiers sont généralement dessinés plus lentement que les bitmaps. Par conséquent, si une application necéssite des opérations d'affichage rapides et que l'indépendance par rapport aux périphériques n'est pas cruciale, elle devrait utiliser des bitmaps au lieu des métafichiers.

Voir la page MS ici :

http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/dnargdi/html/msdn_enhmeta.asp

La structure complète ENHMetaHeader est décrite ici (renomée ENHMetaHeader_EX pour PB):

http://msdn2.microsoft.com/en-us/library/ms534529

Les différents formats Windows et variantes

Métafichier Windows (WMF)

Le format WMF est un format de métafichier 16 bits qui peut contenir à la fois des informations vectorielles et des informations d'image bitmap.Ce format ne devrait être que rarement utilisé. Ce format est limité et les fonctions GDI existent encore pour la compatibilité avec les anciennes versions de Windows fonctionnant en 16 bits. Le format WMF est un format standard Windows qui fonctionne bien avec Office.

Voir ici :

http://msdn2.microsoft.com/en-us/library/ms534274
http://support.microsoft.com/kb/320314

Limitations du format WMF:

- Ce format est dépendant du périphérique et de l'application. Les changements de mode mapping ou de la résolution du périphérique affectent l'apparence des métafichiers créés dans ce format.
- Ce format ne contient pas un en-tête complet (header) décrivant les dimensions originales de l'image, la résolution du périphérique avec lequel l'image a été créée, la description facultative des textes, ou la palette de couleur.
- Ce format n'accepte pas les nouvelles courbes, chemins et fonctions de transformation (courbes de Bézier, Path etc).
- Certains enregistrements de ce formats ne peuvent pas être redimensionnés.
- Une application ne peut pas rechercher les données du contexte de périphérique associé à un métafichier WMF (données de résolution du périphérique, tailles des polices etc.).


Aldus Placeable Metafile (WMF)

Ce format non-windows est une variante du format WFM développée par Aldus Coorporation. Ce format est donc un 16 bits.

Le format diffère par la présence avant le Header, d'un pre-Header d'une taille de 22 octets. Le header contient des informations sur le ratio d'affichage et la taille d'origine du métafichier. GDI ne permettait pas l'utilisation directe du format tandis que GDI+ le permet.

Voir ici :

http://support.microsoft.com/kb/66949 --> pour les fichiers placeable
http://wvware.sourceforge.net/caolan/ora-wmf.html


Enhanced Metafile (EMF) (métafichier amélioré)

Le format Enhanced Metafile est un format 32 bits qui peut contenir à la fois des informations vectorielles et des informations d'image bitmap.
Ce format est une amélioration du format WMF (Windows Metafile Format) qui contient des fonctionnalités étendues telles que :

- Informations de mise à l'échelle intégrées
- Descriptions intégrées qui sont enregistrées avec le fichier.
- Améliorations des palettes de couleurs et indépendance envers les périphériques

Le format EMF est un format extensible, ce qui signifie qu'un programmeur peut modifier la spécification d'origine afin d'ajouter une fonctionnalité ou répondre à des besoins spécifiques. Cette modification peut entraîner des incompatibilités entre différents types d'images EMF.

Avantages du format EMF:

- Format de fichier extensible
- Fonctionnalités améliorées comparé au format WMF

Inconvénients du format EMF:

- L'extensibilité donne lieu à l'existence de nombreux types différents d'images EMF. Tous les fichiers EMF ne sont pas compatibles avec tous les programmes qui prennent en charge la norme EMF.


Enhanced Metafile + (EMF+)

Le format EMF+ est une extension du format EMF qui permet le stockage des enregistrements GDI+ et/ou GDI.

Il existe deux variantes du format EMF+ :

- EMF+ Only

Les métafichiers EMF+ Only contiennent uniquement des enregistrements GDI+. Ils peuvent être affichés par GDI+ mais pas par GDI.

- EMF+ Dual

Les métafichiers EMF+ Dual contiennent des enregistrements GDI+ et GDI. Chaque enregistrement GDI+ d'un métafichier EMF+ Dual est associé à un enregistrement GDI apparié. Ces métafichiers peuvent être affichés par GDI+ ou par GDI.

Les différents formats supportés par GDI et GDI+

GDI+ peut afficher des métafichiers stockés dans les formats suivants :

métafichier Windows (WMF)
métafichier Windows (WMF placeable)
métafichier amélioré (EMF)
métafichier amélioré (EMF+ only)
métafichier amélioré (EMF+ dual)

GDI+ peut modifier des métafichiers aux formats suivants :

métafichier Windows (WMF) ?
métafichier Windows (WMF placeable) ?
métafichier amélioré (EMF)
métafichier amélioré (EMF+ only)
métafichier amélioré (EMF+ dual)

GDI+ peut enregistrer des métafichiers aux formats suivants :

métafichier amélioré (EMF)
métafichier amélioré (EMF+ only)
métafichier amélioré (EMF+ dual)

les métafichier Windows (WMF/WMF placeable) ne peuvent pas être enregistrés directement par GDI+

Structures des différents formats

Les métafichiers Windows sont constitués d'un Header suivi de valeurs qui codent les opérations graphiques (enregistrements).
GDI+ permet avec une seule structure, de récupérer les infos des différents métafichiers supportés. Avant de décrire la structure utilisée par GDI+, les structures propres à chaque type sont décrites (structures GDI).
Le type de métafichier non Windows (format APM) est un fichier WMF mais qui possède un pre-Header (WMF placeable). Ce format est décrit plus bas.

Métafichier Windows (WMF)

Le Header (en-tête) standard des métafichiers WMF a une taille de 18 octets et est structuré comme ceci :

 

Structure MetaHeader
   mtType.w
   mtHeaderSize.w
   mtVersion.w
   mtSize.l
   mtNoObjects.w
   mtMaxRecord.l
   mtNoParameters.w

EndStructure

 

Cette structure est une structure GDI

Voir les détails de la structure MetaHeader ici

 

Aldus Placeable Metafile (APM = WMF placeable)

Le pré-header des métafichiers WMF Placeable a une taille de 22 octets et est structuré comme ceci :

 

Structure WmfPlaceableFileHeader
   Key.l
   Hmf.w
   BoundingBox.PWMFRect16
   Inch.w
   Reserved.l
   Checksum.w

EndStructure

Le Header est le même que métafichier wmf standard.

Cette structure est une structure GDI+

Voir les détails de la structure WmfPlaceableFileHeader ici

 

Enhanced Metafile (EMF) (métafichier amélioré)

 

Le Header (en-tête) des métafichiers EMF a une taille variable en fonction de la version de Windows. Pour une question de portabilité des exécutables, il vaut mieux déclarer la structure complète telles qu'elle est présentée ci-après et qui a une taille de 108 octets car la structure déclarée par PB (ENHMetaHeader) ne tient pas compte des nouveaux OS (taille de 88 octets) et c'est un risque possible de crash pour un programme. La structure complète est définie comme ceci :

Structure ENHMetaHeader_EX
   iType.l
   nSize.l
   rclBounds.RECTL
   rclFrame.RECTL
   dSignature.l
   nVersion.l
   nBytes.l
   nRecords.l
   nHandles.w
   sReserved.w
   nDescription.l
   offDescription.l
   nPalEntries.l
   szlDevice.SIZEL
   szlMillimeters.SIZEL
   cbPixelFormat.l  
         ; WINVER >= 0x0400
   offPixelFormat.l 
          ; WINVER >= 0x0400
   bOpenGL.l                    
; WINVER >= 0x0400
   szlMicrometers.SIZEL   
; WINVER >= 0x0500

EndStructure

Cette structure est une structure GDI

Voir les détails de la structure ENHMetaHeader_EX ici

Structure utilisée pour lire le Header par GDI+

Gdi+ accède aux informations du Header d'un métafichier (WMF/EMF et EMF+) avec la structure MetafileHeader. Cette structure utilise aussi un élément basé sur la structure EnhMetaHeader3 qui est également décrite ci-après.

Ces deux structures sont des structures GDI+

Voir la définition MS des structures ici :

http://msdn2.microsoft.com/en-us/library/ms534480.aspx     (MetafileHeader)
http://msdn2.microsoft.com/en-gb/library/ms534065.aspx    (EnhMetaHeader3)

Voir les détails de la structure MetafileHeader ici

La structure EnhMetaHeader3 est un élément de la structure MetafileHeader.

Voir les détails de la structure EnhMetaHeader3 ici

Liste des commandes

GdipCreateMetafileFromEmf
GdipCreateMetafileFromFile
GdipCreateMetafileFromStream
GdipCreateMetafileFromWmf
GdipCreateMetafileFromWmfFile
GdipComment
GdipEmfToWmfBits
GdipEnumerateMetafileDestPoint
GdipEnumerateMetafileDestPointI
GdipEnumerateMetafileDestPoints
GdipEnumerateMetafileDestPointsI
GdipEnumerateMetafileDestRect
GdipEnumerateMetafileDestRectI
GdipEnumerateMetafileSrcRectDestPoint
GdipEnumerateMetafileSrcRectDestPointI
GdipEnumerateMetafileSrcRectDestPoints
GdipEnumerateMetafileSrcRectDestPointsI
GdipEnumerateMetafileSrcRectDestRect
GdipEnumerateMetafileSrcRectDestRectI
GdipGetHemfFromMetafile
GdipGetMetafileDownLevelRasterizationLimit
GdipGetMetafileHeaderFromEmf
GdipGetMetafileHeaderFromFile
GdipGetMetafileHeaderFromMetafile
GdipGetMetafileHeaderFromStream
GdipGetMetafileHeaderFromWmf
GdipPlayMetafileRecord
GdipRecordMetafile
GdipRecordMetafileI
GdipRecordMetafileFileName
GdipRecordMetafileFileNameI
GdipRecordMetafileStream
GdipRecordMetafileStreamI
GdipSetMetafileDownLevelRasterizationLimit