Dans DirectDraw, vous pouvez créer une surface à partir des données en mémoire, en mettant en place certains champs dans la structure DDSURFACEDESC
et le passage à la méthode CreateSurface
de l'interface IDirectDraw
.
Vous devez d'abord dire DirectDraw quels champs de la structure DDSURFACEDESC
contiennent les informations correctes en définissant le champ dwFlags
à l'ensemble des drapeaux suivants: DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_LPSURFACE | DDSD_PITCH
. Oh, et cela ne fonctionne que pour les surfaces de mémoire système, il est donc probablement nécessaire d'ajouter l'indicateur DDSCAPS_SYSTEMMEMORY
dans le champ ddsCaps.dwCaps
(si DirectDraw ne le fait pas par défaut).
Ensuite, vous spécifiez l'adresse du début de votre tableau de données de pixels dans le champ lpSurface
. Si votre tampon est continu, réglez simplement le lPitch
sur 0. Sinon vous réglez la hauteur correcte (la distance en octets entre les débuts de deux lignes de balayage suivantes).
Réglez le format de pixel correct dans ddpfPixelFormat
champ, avec la profondeur de bit correct dans dwRGBBitCount
et masques RVB dans dwRBitMask
, dwGBitMask
et dwBBitMask
.
Définissez ensuite lXPitch
sur le nombre d'octets de votre pixel (3 pour RGB). Cela dépend du format de pixel que vous utilisez.
Passez ensuite la structure remplie dans CreateSurface
et voyez si cela fonctionne. Lorsque vous créez la surface de cette façon, gardez à l'esprit que DirectDraw ne gérera pas lui-même son tampon de données et ne libérera pas cette mémoire lorsque vous appellerez Release
sur votre surface. Vous devez libérer cette mémoire quand elle n'est plus utilisée par la surface. Si vous souhaitez que ces données de pixels soient placées dans la mémoire vidéo, vous devez créer une surface hors écran de la manière habituelle, puis la verrouiller, copier vos pixels dans la mémoire vidéo de votre propre mémoire tampon (vous trouvera son adresse dans le champ lpSurface
, et n'oubliez pas de prendre le lPitch
en compte!), puis déverrouillez-le.