LA TECHNIQUE DU BLITTING

Dans cet article, nous couvrirons les bases de l'utilisation de la technique du blitting pour les transfères entre les surfaces.

Types de Blitting

DirectDraw (enfin DirectX) a l'avantage de travailler directement avec le HardWare, contrairement au GDI de Windows. Ceci rend l'application plus rapide.

Quand vous aurez fini de créer les surfaces (contenant vos images et autres), vous aurez besoin de faire des transfères entre celles-ci.
Par exemple: j'ai une surface contenant un paysage, et une autre contenant une voiture. Le principe est de coller la voiture sur le paysage: c'est ce qu'on appelle le Blitting.

Il existe différents types de Blit avec DirectDraw:

BLTFAST

Le blit avec BltFast est assez simple, voici la structure de la fonction.

DestSurface.BltFast(DestX As Long, DestY as Long, SrcSurface As DirectDrawSurface7,SrcRect As RECT,flags As CONST_BLTFASTFLAGS)

Un petit exemple nous fera du bien.

DestSurface.BltFast 0, 0, SrcSurface, ddRect(0, 0, 100, 100), DDBLTFAST_WAIT

On blit dans la surface DestSurface, dans le coin en haut à gauche, depuis la surface SrcSurface, dans un rectangle ddRect(0,0,100,100).
On précise au hardware d'attendre que le blit est fini pour continuer (DDBLTFAST_WAIT), cela vous évitera des problèmes.

A Noter que la fonction ddRect(0,0,100,100) n'est pas une fonction vb ! Nous allons voir comment la créer plus bas.

BLT

La fonction Blt demande un peu plus de paramètres. Voici sa structure:

DestSurface.Blt(DestRect As RECT,SrcSurface As DirectDrawSurface7, SrcRect As RECT,flags As CONST_BLTFLAGS)

Voyons un exemple:

DestSurface.Blt ddRect(50,0,150,100), SrcSurface, ddRect(0,0,100,100),DDBLT_WAIT

On blit dans la surface DestSurface (dans le rectangle ddRect(50,0,150,100)), depuis la surface SrcSurface (enfin la portion de surface définie par ddRect(0,0,100,100)).
On précise au hardware d'attendre que le blit est fini pour continuer (DDBLT_WAIT).

Vous avez vite remarqué que pour faire des agrandissements ou réductions (technique du Stretching) il suffit de modifier les rectangles source et destination.

Pour les non-speaking english:
To Stretch = Etirer

  AGRANDISSEMENT

Il faut que le rectangle de destination soit plus grand que le rectangle source. Exemple:

DestSurface.Blt ddRect(0,0,200,200), SrcSurface, ddRect(0,0,100,100),DDBLT_WAIT

Cet exemple double la taille de SrcSurface et le colle dans DestSurface.

  REDUCTION

Il faut que le rectangle de destination soit plus petit que le rectangle source. Exemple:

DestSurface.Blt ddRect(0,0,100,100), SrcSurface, ddRect(0,0,200,200),DDBLT_WAIT

Cet exemple réduit de moitié la taille de SrcSurface et le colle dans DestSurface.

Types de Blitting

La fonction BltColorFill permet de remplir une surface avec une couleur donnée. Voici la structure:

DestSurface.BltColorFill (destRect as Rect, fillValue as Long) as Long

Un petit exemple:

DestSurface.BltColorFill ddRect(0,0,100,100), 0

On remplit la portion ddRect(0,0,100,100) de la surface DestSurface avec la couleur Noire (Noir = 0).

BLITTING: ASTUCE

Lors d'un blitting, si vous ne connaissez pas exactement les différentes dimensions des surfaces, vous pouvez demander à DirectDraw de sélectionner les surfaces en entier.
Il suffit de passer comme paramètre un rectangle vide: ddRect(0,0,0,0)
Exemple:

DestSurface.BltColorFill ddRect(0,0,0,0), 0

Ceci va sélectionner la surface DestSurface en entier et la remplir avec la couleur noire.

La fonction ddRect(x1 as long, y1 as long, x2 as long, y2 as long) as RECT

Comme je l'ai dis plus haut, la fonction ddRect n'est pas une fonction vb, il faut donc la créer.
La fonction ddRect permet d'enregistrer des valeurs à travers ses arguments et ensuite de renvoyer un objet de type RECT.

Public Function ddRect(x1 As Long, y1 As Long, x2 As Long, y2 As Long) As RECT
  ddRect.Left = x1
  ddRect.Right = x2
  ddRect.Top = y1
  ddRect.Bottom = y2
End Function

Vous pourrez ensuite l'utiliser ainsi:

DestSurface.BltColorFill ddRect(0,0,200,100), 0

Au lieu de faire encore tout ceci:

Dim myRect As RECT

myRect.Left = 0
myRect.Right = 150
myRect.Top = 0
myRect.Bottom = 100

Surface.BltColorFill myRect, 0

C'était pas trop difficile tout ça!

Conclusion

Bien vous venez de découvrir les différents types de blitting que DirectDraw nous offre. Nous avons seulement vu quelques types, les autres sont peu importants et un peu trop sophistiqués pour le moment.
Nous sommes maintenant prêts à dessiner sur l'écran de l'utilisateur.
Lorsque nous serons en Mode Plein Ecran nous appellerons cela le Flipping et en Mode Fenêtré le Clipping.

[Home] lienie.gif (941 octets)[Actualités]  [Trucs & Astuces] [Astuces Windows] [ActiveX-Ocx/Dll] [Articles] [Codes Sources] [VB Games] [Fichiers Sons] [Fichiers Icônes] [Programmes & Sources]  mailing.gif (910 octets)[Mailing-List] smiley.gif (359 octets)[Divers] about.gif (920 octets)[A Propos]