Partager via


Copie de bitmaps

Les fonctions de transfert de blocs de bits (BitBlt) implémentées par les pilotes copient des blocs de bits d’une surface à une autre. Ces fonctions incluent :

Il existe également une fonction BitBlt spécifique au pilote d’affichage nommée DrvSaveScreenBits.

Si la surface dessinée sur est une surface ou une bitmap gérée par l’appareil , le pilote doit prendre en charge un niveau minimal de fonctions de transfert de bloc de bits. Si la surface est une bitmap de format standard gérée par GDI, GDI gère uniquement les opérations qui ne sont pas accrochées par le pilote.

DrvBitBlt

La fonction DrvBitBlt fournit des fonctionnalités générales de transfert de blocs de bits. Si une source est utilisée, DrvBitBlt copie le contenu du rectangle source dans le rectangle de destination. (Le paramètre pptlSrc de cette fonction identifie le coin supérieur gauche du rectangle.) S’il n’existe aucun rectangle source, DrvBitBlt ignore le paramètre pptlSrc . Le rectangle de destination, la surface à modifier, est défini par deux points entiers, les coins supérieur gauche et inférieur droit. Le rectangle est exclusif en bas à droite ; les bords inférieur et droit du rectangle ne font pas partie du transfert de bloc. DrvBitBlt ne peut pas être appelé avec un rectangle de destination vide. Les deux points du rectangle sont toujours bien ordonnés ; autrement dit, les deux coordonnées du point inférieur droit sont supérieures à leurs équivalents dans le point supérieur gauche.

DrvBitBlt traite différents ROPs et effectue des optimisations en fonction de l’appareil. Dans certains cas, si le ROP est une couleur unie, un remplissage peut être effectué au lieu d’un BitBlt. Pour les appareils ou les pilotes qui ne prennent pas en charge les ROP, tels que le pilote Pscript, il peut y avoir des différences entre les images affichées et imprimées.

Si vous le souhaitez, un transfert de bloc géré par DrvBitBlt peut être masqué et impliquer une traduction d’index de couleur. Un vecteur de traduction facilite la traduction d’index de couleur pour les palettes. Le transfert peut avoir besoin d’être arbitrairement clippé par un pilote d’affichage, à l’aide d’une série de rectangles de clip. La région et les informations requises sont fournies par GDI.

L’implémentation de DrvBitBlt représente une partie importante du travail impliqué dans l’écriture d’un pilote pour un pilote d’affichage raster qui n’a pas de mémoire tampon de trame de format standard. Le pilote Microsoft VGA fourni avec le Kit de pilotes Windows (WDK) fournit un exemple de code qui prend en charge la fonction de base pour un appareil planaire. L’implémentation de DrvBitBlt pour d’autres appareils peut être moins complexe.

DrvCopyBits

La fonction DrvCopyBits est appelée par GDI à partir de ses opérations de simulation pour se traduire entre une surface raster gérée par l’appareil et une bitmap de format standard GDI. DrvCopyBits fournit un chemin d’accès rapide pour les transferts de blocs de bits ROP SRCCOPY (0xCCCC).

Requise pour un pilote graphique avec des bitmaps gérées par le périphérique ou des surfaces raster, cette fonction doit traduire les surfaces de pilote vers et depuis n’importe quelle image bitmap de format standard. DrvCopyBits n’est jamais appelé avec un rectangle de destination vide, et les deux points du rectangle de destination sont toujours bien ordonnés. Cet appel a les mêmes exigences que DrvBitBlt.

Si un pilote prend en charge une surface ou une bitmap gérée par l’appareil, il doit implémenter la fonction DrvCopyBits . Au minimum, le pilote doit effectuer les opérations suivantes lorsque DrvCopyBits est appelé :

  • Effectuez un transfert de bloc vers et depuis une bitmap, dans le format préféré de l’appareil, et vers l’aire de l’appareil.
  • Effectuez le transfert avec l’opération raster (ROP) SRCCOPY (0xCCCC).
  • Autoriser le découpage arbitraire.

Le pilote peut utiliser les services d’énumération GDI CLIPOBJ pour réduire le découpage à une série de rectangles de découpage. GDI transmet un vecteur de traduction, la structure XLATEOBJ , pour faciliter la traduction d’index de couleur entre les surfaces source et de destination.

Si la surface d’un appareil est organisée en tant que bitmap indépendante du périphérique (DIB) de format standard, le pilote ne peut prendre en charge que des transferts simples. Si un appel arrive avec un ROP compliqué, le pilote peut renvoyer la demande de transfert de bloc à GDI avec un appel à la fonction EngCopyBits . Cela permet à GDI de diviser l’appel en fonctions plus simples que le pilote peut effectuer.

DrvCopyBits est également appelé avec les bitmaps RLE (voir la documentation Microsoft Windows SDK) et les bitmaps dépendantes des appareils (DDB). Les bitmaps sont fournies à cette fonction à la suite d’appels de programmes d’application à plusieurs routines Win32 GDI. La base de données DDB facultative n’est prise en charge que par quelques pilotes spécialisés.

DrvStretchBlt

Un pilote peut éventuellement fournir la fonction DrvStretchBlt , même les pilotes qui prennent en charge les surfaces gérées par les appareils. Cette fonction fournit des fonctionnalités d’étirement des transferts de blocs entre des surfaces gérées par l’appareil et gérées par GDI. DrvStretchBlt prend en charge uniquement certains types d’étirements, tels que l’étirement par des multiples entiers.

DrvStretchBlt permet également à un pilote d’écrire sur des bitmaps GDI, en particulier lorsque le pilote peut effectuer un halftoning. La fonction permet également d’appliquer le même algorithme de halftoning aux bitmaps GDI et aux surfaces d’appareil.

DrvStretchBlt mappe un rectangle source géométrique exactement sur un rectangle de destination géométrique. La source est un rectangle avec des coins déplacés par (-0,5,-0,5) des coordonnées entières données. Les points spécifiés dans les paramètres de fonction se trouvent sur des coordonnées entières qui correspondent aux centres de pixels. Un rectangle défini par deux points de ce type est considéré comme géométrique, avec deux sommets dont les coordonnées sont les points donnés, mais avec 0,5 soustrait de chaque coordonnée. (Les structures GDI POINTL utilisent une notation abrégée pour spécifier ces sommets de coordonnées fractionnaires.) Notez que les bords d’un tel rectangle ne croisent jamais un pixel, mais contourlent un ensemble de pixels. Les pixels à l’intérieur du rectangle sont des pixels normaux pour un rectangle en bas à droite.

Les points définissant les coins du rectangle source sont bien ordonnés ; DrvStretchBlt ne peut pas recevoir un rectangle source vide. Contrairement à DrvBitBlt, DrvStretchBlt peut être appelé avec un rectangle de découpage unique pour éviter les erreurs d’arrondi lors du découpage de la sortie.

Le rectangle de destination est défini par deux points entiers. Ces points ne sont pas bien ordonnés, ce qui signifie que les coordonnées du deuxième point ne sont pas nécessairement supérieures à celles du premier. Le rectangle source décrit par ces points n’inclut pas les bords inférieur et droit. Étant donné que le rectangle n’est pas bien ordonné, DrvStretchBlt doit parfois effectuer des inversions dans les deux coordonnées x et/ou les deux coordonnées y. (Le pilote ne doit pas tenter de lire les pixels qui ne se trouvent pas sur la surface source). DrvStretchBlt ne peut pas être appelé avec un rectangle de destination vide.

Pour la traduction de couleurs, DrvStretchBlt fournit un pointeur, pxlo, vers la structure XLATEOBJ , qui est utilisé pour traduire entre les surfaces source et de destination. La structure XLATEOBJ peut être interrogée pour rechercher l’index de destination pour n’importe quel index source. Pour un transfert de bloc d’étirement de haute qualité, DrvStretchBlt est nécessaire pour interpoler les couleurs dans certains cas. DrvStretchBlt utilise également la structure COLORADJUSTMENT pour définir les valeurs d’ajustement des couleurs qui doivent être appliquées à la bitmap source avant que les bits ne soient étirés.

DrvStretchBlt utilise le paramètre iMode pour définir la façon dont les pixels sources doivent être combinés pour la sortie. En particulier, iMode fournit l’option HALFTONE qui permet au pilote d’utiliser des groupes de pixels dans la surface de sortie pour se rapprocher de la couleur ou du niveau de gris de la sortie. Les modifications apportées à la structure COLORADJUSTMENT sont passées au pilote après l’appel DrvStretchBlt suivant avec un iMode de HALFTONE. En outre, si le pilote exige que GDI gère l’exécution semi-automatique pour les bitmaps GDI, le pilote branche DrvStretchBlt, définit le paramètre iMode sur HALFTONE et le retourne dans EngStretchBlt.

Si DrvStretchBlt a crocheté un appel à la fonction EngStretchBlt et est invité à effectuer quelque chose qu’il ne prend pas en charge, il retourne la demande à GDI afin que la fonction appropriée puisse la gérer.

DrvTransparentBlt

La fonction DrvTransparentBlt entraîne la copie d’une bitmap source sur une bitmap de destination afin que des parties de la bitmap de destination restent visibles après la copie. Le paramètre iTransColor de cette fonction spécifie la couleur à rendre transparente.

La figure suivante illustre un exemple de blt transparent.

Diagramme illustrant le processus de blt transparent avec des bitmaps source et de destination.

De gauche à droite, la figure précédente montre l’image bitmap source, la bitmap de destination avant le blt transparent et la bitmap de destination après le blt transparent. Notez que la couleur dans iTransColor est la même que dans les quatre régions ci-dessus, ci-dessous et de part et d’autre de la région centrale dans la bitmap source.

Lorsque l’opération blt a lieu, ces quatre régions ne sont pas copiées, ce qui fait que tout modèle de pixels dans la bitmap de destination sous ces régions reste visible. Tout modèle de pixel sous les autres régions (les quatre coins et le centre) est remplacé dans le blt transparent.

Cela est illustré dans l’image la plus à droite : les parties de la lettre « M » dans les quatre coins et le centre ont été remplacées par les couleurs de la bitmap source. Les parties de la lettre « M » sous les quatre régions dont la couleur est identique à celle dans iTransColor restent visibles.