A telecharger

Transcription

A telecharger
Win32 : Multimédia
Manipulation des images, sons et vidéos
Manipulation des images
! Une image peut être une ressource
(dans ce cas, difficilement modifiable dynamiquement)
! Accès par son identifiant
" L'image doit faire partie des ressources
" Chargement par LoadBitmap()
! Si un contrôle de type bitmap à été placé sur une boite
de dialogue, on peut actualiser cet affichage en envoyant
un message à ce contrôle
" Utilisation de SendDlgItemMessage()
HANDLE hBitmap;
hBitmap = LoadBitmap(TheInstance, MAKEINTRESOURCE(IDB_BITMAP1));
SendDlgItemMessage(hwnd,
IDC_BITMAP,
STM_SETIMAGE,
(WPARAM)IMAGE_BITMAP,(LPARAM) (HANDLE) hBitmap);
1
Chargement dynamique des images
! Facile pour les fichiers BMP
" Proche de la structure interne (DIB) utilisé pour afficher les
images avec l'interface GDI (interface classique de Windows)
" Support existant pour le JPEG et le PNG
" Ecrire le code pour les autres formats !
! L'affichage GDI support les palettes, le mode "true color"
et (théoriquement) la transparence (alpha chanel) avec
GDI+
! Après avoir créé un DIB en mémoire, plusieurs fonctions
de l'API Win32 permettent d'afficher cette image dans la
zone client.
Le format BMP (1/3)
! Format typé Microsoft ! Extension du DIB (format interne
pour affichage GDI)
•
•
•
•
Images 2 couleurs utilisant 1 bit par pixel (1 octet=8 pixels)
Images 16 couleurs utilisant 4 bits par pixel (1 octet=2 pixels)
Images 256 couleurs utilisant 8 bits par pixel (1 octet=index de la palette)
Images en couleurs réelles (24 bits par pixel)
3 octets par pixel (ATTENTION : ordre bleu, vert et rouge).
! Structure
•
•
•
•
En-tête du fichier (file header)
En-tête du bitmap (bitmap information header)
Palette (optionnelle)
Corps de l'image
! Signature (sur 2 octets) : BM, 424D en hexadécimal
2
Le format BMP (2/3)
! Compression RLE possible
BMP
DIB
! Structures (BITMAPINFO, BITMAPINFOHEADER, …)
prédéfinies dans "windows.h"
Le format BMP (3/3)
/* Structure BITMAPFILEHEADER */
typedef struct tagBITMAPFILEHEADER { // bmfh
WORD
bfType;
/* Specifies the file type. It must be BM */
DWORD
bfSize;
/* Specifies the size, in bytes, of the bitmap file */
WORD
bfReserved1;
/* Reserved; must be zero */
WORD
bfReserved2;
/* Reserved; must be zero */
DWORD
bfOffBits;
/* Specifies the offset, in bytes,
from the BITMAPFILEHEADER structure to the bitmap bits */
} BITMAPFILEHEADER;
/* Structure BITMAPINFOHEADER */
typedef struct tagBITMAPINFOHEADER{ // bmih
DWORD biSize;
/* Specifies the number of bytes required by the structure */
LONG
biWidth;
/* Specifies the width of the bitmap, in pixels */
LONG
biHeight;
/* Specifies the height of the bitmap, in pixels */
WORD
biPlanes;
/* Specifies the number of planes for the target device.
This value must be set to 1 */
WORD
biBitCount
/* Specifies the number of bits per pixel */
DWORD biCompression;
/* Specifies the type of compression */
DWORD biSizeImage;
/* Specifies the size, in bytes, of the image */
LONG
biXPelsPerMeter; /* Specifies the horizontal resolution,
in pixels per meter, of the target device for the bitmap */
LONG
biYPelsPerMeter; /* Specifies the vertical resolution, in pixels per meter,
of the target device for the bitmap */
DWORD biClrUsed;
/* Specifies the number of color indexes in the color table
that are actually used by the bitmap */
DWORD biClrImportant;
/* Specifies the number of color indexes that are required
for displaying the bitmap */
} BITMAPINFOHEADER;
3
Lecture BMP
! Lecture entête BMP et affichage
FILE *fp;
BITMAPFILEHEADER h;
fp = fopen("toto.bmp","rb");
fread(&h,1,sizeof(BITMAPFILEHEADER),fp);
printf("\nTaille du fichier %d",h.bfSize);
char *c;
c = (char*)(h.bfType);
printf("\nSignature : %c%c",c[0],c[1]);
BITMAPINFOHEADER h;
! Lecture entête DIB fread(&ih,1,sizeof(BITMAPINFOHEADER),fp);
! Allocation et lecture données (si image couleur 24 bits)
char* data;
data = (char*)malloc(ih.biWidth * ih.biHeight * 3);
fread(data,1, ih.biWidth * ih.biHeight * 3,fp);
Manipulation des DIB : StretchDIBits
The StretchDIBits function copies the color data for a rectangle of pixels
in a DIB to the specified destination rectangle. If the destination
rectangle is larger than the source rectangle, this function stretches the
rows and columns of color data to fit the destination rectangle. If the
destination rectangle is smaller than the source rectangle, this function
compresses the rows and columns by using the specified raster operation.
Windows 98/Me, Windows 2000/XP: StretchDIBits has been extended to allow a
JPEG or PNG image to be passed as the source image.
int StretchDIBits(
HDC hdc,
int XDest,
int YDest,
int nDestWidth,
int nDestHeight,
int XSrc,
int YSrc,
int nSrcWidth,
int nSrcHeight,
CONST VOID *lpBits,
CONST BITMAPINFO *lpBitsInfo,
UINT iUsage,
DWORD dwRop
);
//
//
//
//
//
//
//
//
//
//
//
//
//
handle to DC
x-coord of destination upper-left corner
y-coord of destination upper-left corner
width of destination rectangle
height of destination rectangle
x-coord of source upper-left corner
y-coord of source upper-left corner
width of source rectangle
height of source rectangle
bitmap bits
bitmap data
usage options
raster operation code
4
Raster Operations
! Raster operation
Boolean operation
R2_BLACK
0
R2_COPYPEN
P
R2_MASKNOTPEN
DPna
R2_MASKPEN
DPa
R2_MASKPENNOT
PDna
R2_MERGENOTPEN
DPno
R2_MERGEPEN
DPo
R2_MERGEPENNOT
PDno
R2_NOP
D
R2_NOT
Dn
R2_NOTCOPYPEN
Pn
R2_NOTMASKPEN
DPan
R2_NOTMERGEPEN
DPon
R2_NOTXORPEN
DPxn
R2_WHITE
1
R2_XORPEN
DPx
Raster Operations
! Raster Operations specify how the current PEN and
BRUSH colors will be combined with the colors on the
screen.
» Par exemple : R2_NOTXORPEN
! R2_NOTXOR is really NOT (XOR (current_color,
screen_color)). For two one bit numbers, the truth table
is,
•
•
•
•
•
X
0
0
1
1
Y
0
1
0
1
XOR(X,Y)NOT(XOR(X,Y))
0
1
1
0
1
0
0
1
5
Utilisation pour la sélection d'une zone
! Tracé de rectangle de
sélection, …
" Eviter de mémoriser la zone
sous le tracé
" Utiliser des "modifications
réversibles"
MCI (Multimedia Control Interface)
! MCI provides applications with device-independent
capabilities for controlling audio and visual peripherals.
Your application can use MCI to control any supported
multimedia device, including waveform-audio devices,
MIDI sequencers, CD audio devices, and digital-video
(video playback) devices.
! 2 possibilités :
" Envoi de commandes MCI
• Remplir une structure, envoyer la commande avec la structure en paramètres
" Envoi d'ordre MCI sous forme de chaînes de caractères
• MCISendString
6
Commandes spécifiques MCI
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
acmDriverAdd
acmDriverClose
acmDriverDetails
acmDriverEnum
acmDriverEnumCallback
acmDriverID
acmDriverMessage
acmDriverOpen
acmDriverPriority
acmDriverProc
acmDriverRemove
acmFilterChoose
acmFilterChooseHookProc
acmFilterDetails
acmFilterEnum
acmFilterEnumCallback
acmFilterTagDetails
acmFilterTagEnum
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
acmFilterTagEnumCallback
acmFormatChoose
acmFormatChooseHookProc
acmFormatDetails
acmFormatEnum
acmFormatEnumCallback
acmFormatSuggest
acmFormatTagDetails
acmFormatTagEnum
acmFormatTagEnumCallback
acmGetVersion
acmMetrics
acmStreamClose
acmStreamConvert
acmStreamConvertCallback
acmStreamMessage
acmStreamOpen
acmStreamPrepareHeader
acmStreamReset
Commandes spécifiques MCI
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
auxGetDevCaps
auxGetNumDevs
auxGetVolume
auxOutMessage
auxSetVolume
AVIBuildFilter
AVIClearClipboard
AVIFileAddRef
AVIFileCreateStream
AVIFileEndRecord
AVIFileExit
AVIFileGetStream
AVIFileInfo
AVIFileInit
AVIFileOpen
AVIFileReadData
AVIFileRelease
AVIFileWriteData
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
AVIGetFromClipboard
...
AVISave
AVISaveOptions
AVISaveOptionsFree
...
AVIStreamGetFrameOpen
AVIStreamInfo
AVIStreamLength
AVIStreamOpenFromFile
AVIStreamRead
...
AVIStreamSetFormat
AVIStreamStart
AVIStreamTimeToSample
AVIStreamWrite
AVIStreamWriteData
7
Commandes spécifiques MCI
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
capControlCallback
capCreateCaptureWindow
capErrorCallback
...
CreateEditableStream
DllGetClassObject
DrawDibBegin
DrawDibChangePalette
DrawDibClose
DrawDibDraw
DrawDibEnd
DrawDibGetBuffer
DrawDibGetPalette
DrawDibOpen
DrawDibProfileDisplay
...
DrawDibTime
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
EditStreamClone
EditStreamCopy
EditStreamCut
EditStreamPaste
EditStreamSetInfo
EditStreamSetName
GetOpenFileNamePreview
GetSaveFileNamePreview
ICClose
ICCompress
ICCompressorChoose
ICCompressorFree
ICDecompress
ICDecompressEx
ICDecompressExBegin
ICDecompressExQuery
ICDraw
Commandes spécifiques MCI
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
ICDrawBegin
ICDrawSuggestFormat
ICGetDisplayFormat
ICGetInfo
ICImageCompress
ICImageDecompress
ICInfo
ICInstall
ICLocate
ICOpen
ICOpenFunction
ICRemove
ICSendMessage
ICSeqCompressFrame
ICSeqCompressFrameEnd
ICSeqCompressFrameStart
ICSetStatusProc
IOProc
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
joyConfigChanged
joyGetDevCaps
joyGetNumDevs
joyGetPos
joyGetPosEx
joyGetThreshold
joyReleaseCapture
joySetCapture
joySetThreshold
mciExecute
mciGetCreatorTask
mciGetDeviceID
mciGetDeviceIDFromElementID
mciGetErrorString
mciGetYieldProc
mciSendCommand
mciSendString
mciSetYieldProc
8
Commandes spécifiques MCI
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
midiConnect
midiDisconnect
midiInAddBuffer
midiInClose
midiInGetDevCaps
midiInGetErrorText
midiInGetID
midiInGetNumDevs
midiInMessage
midiInOpen
midiInPrepareHeader
MidiInProc
midiInReset
midiInStart
midiInStop
midiInUnprepareHeader
midiOutCacheDrumPatches
midiOutCachePatches
midiOutClose
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
mixerClose
mixerGetControlDetails
mixerGetDevCaps
mixerGetID
mixerGetLineControls
mixerGetLineInfo
mixerGetNumDevs
mixerMessage
mixerOpen
mixerSetControlDetails
mmioAdvance
mmioAscend
mmioClose
mmioCreateChunk
...
...
mmioSeek
mmioSendMessage
mmioSetBuffer
Commandes spécifiques MCI
!
!
!
!
!
!
!
!
!
!
!
!
MyStatusProc
PlaySound
sndPlaySound
StretchDIB
timeBeginPeriod
timeEndPeriod
timeGetDevCaps
timeGetSystemTime
timeGetTime
timeKillEvent
TimeProc
timeSetEvent
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
waveInAddBuffer
waveInClose
waveInGetDevCaps
waveInGetErrorText
waveInGetID
waveInGetNumDevs
waveInGetPosition
waveInMessage
waveInOpen
waveInPrepareHeader
waveInProc
waveInReset
waveInStart
waveInStop
waveInUnprepareHeader
waveOutBreakLoop
waveOutClose
waveOutGetDevCaps
waveOutGetErrorText
9
Exemple : PlaySound
! PlaySound()
Header: mmsystem.h
Import Library: winmm.lib
BOOL PlaySound(
LPCSTR pszSound,
HMODULE hmod,
DWORD fdwSound
);
PlaySound("ding.wav",NULL, SND_FILENAME);
Format WAV ?
! CODEC
COdeur/DECodeur ou
COmpresseur/DECompresseur
! Software / Hardware
! Avec ou sans perte
! Format d’encapsulation : WAV
" Le format WAV (comme les
AVI) est un fichier RIFF
(Ressource Interchange File
Format)
! Portabilité du fichier ?
10
Autre possibilité de son : norme MIDI
! MIDI : Musical Instrument Digital Interface
" Standard de connectivité (PC, instruments,…)
! La première chose à faire lorsqu’on veut envoyer et recevoir des
messages MIDI, c'est-à-dire de jouer ou enregistrer des morceaux,
c’est de repérer le nombre de devices MIDI. Ces devices sont sur les
cartes son enfichées dans le PC. Ils peuvent être de plusieurs types :
" MOD_MIDIPORT : port hardware matérialisant une voie de
communication avec des instruments extérieurs
" MOD_SQSYNTH : synthétiseur interne de signaux carrés
" MOD_FMSYNTH :synthétiseur FM interne. Permet de simuler des
instruments de musique
" MOD_MAPPER : Microsoft MIDI mapper
! Si on veut communiquer avec un instrument MIDI extérieur (clavier,
synthétiseur), il faut rechercher un MOD_MIDIPORT. Si on veut
simuler les instruments sur le synthé FM de la carte son, on
cherchera un MOD_FMSYNTH.
Commandes MIDI
! En premier on recherche le nombre de devices MIDI
int NbreDevs = midiOutGetNumDevs() ;
! On effectue ensuite une boucle sur le nombre précédent pour
rechercher le ou les devices qui correspondent au type de sortie que
l’on veut faire :
MIDIOUTCAPS OutCaps ;
int wDeviceID ;
for(wDeviceID=0 ; wDeviceID<NbreDevs ; wDeviceID++)
{
midiOutGetDevCaps(wDeviceID, &OutCaps, sizeof(OutCaps) ) ;
if( OutCaps.wTechnology==MOD_FMSYNTH )
break ;
}
! par exemple. En sortie de la routine, la variable wDeviceID contient
l’ID du 1er device MIDI du type FMSYNTH présent sur une des cartes
son du PC.
11
Commandes MIDI
! Envoyer un message MIDI NoteOn :
DWORD lNoteOn = 0x00ddnn9c ;
dd = volume sonore =[0 ;7F]
nn = n° note : 0=do-3 ; 7F=sol8
c = canal = [0 ; NbreNotesMax]
! Envoi au synthé FM par :
midiOutShortMsg( hMidiOut, lNoteOn ) ;
! Pour arrêter une note, il faut envoyer le message Note Off :
DWORD lNoteOff = 0x0000nn8c
midiOutShortMsg( hMidiOut, lNoteOff ) ;
! Lorsque l’utilisation du port MIDI prend fin, il faut le fermer avec :
midiOutClose( h MidiOut ) ;
Commandes MIDI
! Pour changer l’instrument associé à un canal, il suffit
d’utiliser le message " program change " :
DWORD message = 0x0000ppcc
pp = n° du programme = [0 ; 127]
cc = 0xC0 + n° canal
! et d’envoyer un midiOutShortMsg
12
Et la vidéo ? (1/3)
! De façon très simple, utiliser des commandes MCI :
" Lecture dans une fenêtre externe :
szCommandString = "Play AVIFile fullscreen wait"
mciSendString (szCommandString, NULL, 0, NULL);
" Lecture plein écran
szCommandString = "Play AVIFile wait"
mciSendString (szCommandString, NULL, 0,
NULL);
Vidéo (2/3)
! Dans une fenêtre de l’IHM
wsprintf(szCommandString,"open skiing.avi alias mov style
child parent %d", (int)GetDlgItem(hwnd,IDC_ANIMATE1));
mciSendString(szCommand, NULL, 0, NULL);
mciSendString("window mov state show", NULL, 0, NULL);
mciSendString("play mov notify", NULL, 0, hwnd);
13
Vidéo (3/3)
! Format d’encapsulation : AVI
" Le format AVI (comme les
.WAV) est un fichier RIFF
(Ressource Interchange File
Format)
! Codec
COdeur/DECodeur ou
COmpresseur/DECompresseur
" Software / Hardware
" Avec ou sans perte
La prochaine fois… les
objets COM et directX
14
Windows : les DLL
! Les bibliothèques de liens dynamiques (ou DLL :
dynamic link library), comme winmm.dll, sont des fichiers
séparés des programmes
! Ces fichiers contiennent du code binaire correspondant à
des fonctions qui peuvent être appelées par des
programmes ou par d'autres DLL
! Une bibliothèque ne devient active que lorsqu'elle est
appelée
! Windows lui-même fonctionne avec trois bibliothèques de
liens dynamiques qui correspondent à trois parties de
Windows : Kernel, User et GDI.
Windows : utilité des DLL
! Plusieurs programmes peuvent se partager le code
binaire d’une fonction si celle-ci est dans une DLL (plutôt
que de répéter dans chaque programme la même portion de code source)
! Les programmes se branchent à l'exécution sur les DLL
correspondantes (d'ou le nom de lien dynamique).
! Lors de l ’édition de liens, il faut lier le programme avec
une bibliothèque d'importation ou 'bibliothèque de
référencement' (Elle possède elle aussi l'extension '.lib ’)
" Celle-ci ne contient pas de code mais des informations pour les
liens dynamiques afin d'indiquer dans quelles DLL se trouvent le
code binaire des fonctions utilisées
15
Edition de liens avec une bibliothèque statique
Edition de liens avec une bibliothèque dynamique
16
Réutilisation du code...
! Lorsque l'on écrit une DLL en C++, par exemple,
l'algorithme propriétaire de C++, qui dénature les
noms, rend impossible l'utilisation de la DLL par
autre chose qu'un client composé avec le même
compilateur.
! Cet objet n'est utilisable ni avec Visual Basic ni
par des clients Java.
! Si un développeur modifie et redéploie une DLL, il
doit s'assurer qu'aucun numéro de la DLL n'a
changé, auquel cas les liaisons statiques à cette
DLL provoqueraient une incompatibilité avec le
client.
Le concept COM…
! Component Object Model (modèle d'objets composants)
! Structure de composants logiciels (propre à Microsoft !)
pouvant être appelés et exécutés dans les environnements
Windows récents.
Distributed COM (ou DCOM) permet de lancer l'exécution des objets à
distance.
Dans l'environnement Web, les objets COM sont appelés Control ActiveX.
! COM est une spécification très largement respectée,
destinée à offrir des interfaces de programmation
réutilisables et indépendantes du langage.
Binaire réutilisable !
17
! COM réalise cette opération magique en fournissant une
matrice de pointeurs vers les méthodes exportées par
l'interface
Classe de base IUnknow
! Toutes le interfaces COM reposent sur l'interface IUnknow qui joue
le role d'une classe de base abstraite en C++ pour fournir un jeu de
fonctions à implémenter et pour permettre l'ajout de fonctions
complémentaires par chaque interface. La définition de IUnknow
inclut trois fonctions :
" QueryInterface()
• Sert à atteindre les pointeurs dirigeant vers les interface dérivées de
l'interface en cours.
" AddRef
• Incrémente le compteur de références de l'interface en cours.
" Release
• Sert à libérer une interface qui
n'est plus utilisée.
Décrémente le compteur de
références et détruit l'objet
lorsque le compte atteint zéro.
18
Les objets COM
! L'interface de base, qu'il est obligatoire d'implémenter
pour un objet, est l'interface IUnknown. Cette interface
est disponible pour tous les objets OLE/COM.
! L'interface IUnknown possède, entre autres, une méthode appelée
QueryInterface() qui permet à un programme utilisant l'objet considéré de
prendre connaissance de l'existence d'une interface implémentée dans
l'objet. Si l'interface demandée existe, la méthode QueryInterface() renvoie
un pointeur sur celle-ci afin que l'objet demandeur puisse l'utiliser.
! Chaque interface d'un objet est identifiée de façon unique par un GUID
(Globally Unique IDentifier) attribué par Microsoft pour éviter tout conflit
d'identifiant. Ce dernier, codé sur 128 bits, est stocké dans la base des
registres de Windows. Dans cette base, pour chaque GUID, on trouve le
nom et la localisation du serveur (DLL par exemple) fournissant l'objet dont
on veut accéder à l'une de ses interfaces. On trouve également pour chaque
interface un certain nombre d'informations telles que sa version, les types de
données reconnus, etc.
Demande d'interface
19
Quel est le lien entre COM et les IHM !
! Avec Windows 95, Microsoft a voulu créer une meilleure
plateforme pour les jeux. Cela a pris la forme de pilotes
qui permettent un accès direct aux fonctionnalités
matérielles des unités graphiques, audio et vidéo; les
développeurs n'ont plus besoin d'écrire leurs propres
pilotes.
" Souvent, un pilote par type de carte graphique / carte son
! La SDK directX est entièrement basée sur des objets
COM
DirectX : Les éléments
! DirectDraw
DirectDraw permet d'exploiter les capacités 2D d'une carte
graphique tout en autorisant l'utilisant des services du GDI
(Graphic Device Interface), l'API graphique de Windows.
! Direct3D
Direct3D permet de créer des scènes de 3D, d'en manipuler
les objets avec une palette de services et de les afficher en
utilisant les capacités 3D d'une carte graphique quand elle
en dispose. Direct3D dispose de deux modes de
d'utilisation:
" Le mode immédiat permet de gérer la transformation,
l'illumination et le rendu de simples primitives (triangles,
points, droites).
" Le mode retenu met à la disposition du développeur un moteur
3D complet capable de gérer des objets.
20
DirectX : Les éléments
! DirectSound
DirectSound permet d'exploiter les capacités d'entrée-sortie
d'une carte son pour numériser, mixer des échantillons
sonores et en restituer le résultat, éventuellement
agrémenté d'effets 3D perfectionnés.
! DirectInput
DirectInput permet de récupérer les informations transmises
par l'utilisateur, que ce soit par l'intermédiaire de la souris,
du clavier ou du joystick. Elle permet aussi de renvoyer des
données vers des périphériques à retour de force.
! DirectPlay
DirectPlay permet de mettre en place et d'administrer un
dialogue point à point ou client-serveur entre plusieurs
utilisateurs désirant évoluer simultanément dans un même
contexte ; par exemple pour une interactivité entre joueurs
connectés par Internet, par un réseau local ou par une
connexion directe (modem ou câble série).
Éléments DirectMedia
! DirectX Transform
DirectX Transform pour la création d'effets graphiques
dynamiques en 2D et en 3D, notamment pour la fusion des
couches alpha et les distorsions de surface.
! DirectAnimation
DirectAnimation est un ensemble de contrôles (chemins de
déplacement, sprites, éléments de 3D, séquenceurs) qu'il
est possible de référencer depuis une page Web. Ces
contrôles disposent d'API qui permettent de les manipuler
via un script JScript ou VBscript ou encore une applet Java.
Il est possible d'intégrer ces contrôles dans une application
développée en Java, en Visual Basic ou en C++.
! DirectShow
DirectShow permet de jouer des séquences vidéo et audio
(accédés en local ou à distance) et d'en capturer via des
périphériques spécialistes. DirectShow supporte de
nombreux formats : MPEG-1, WAV, MIDI, MPEG-2, PCM,
DSS, AVI, …
21
DirectX
! L'avantage des fonctions de DirectX
pour les programmeurs est que celles-ci
utilisent (si possible) un algorithme
alternatif (confié au processeur) quand
le matériel installé ne gère pas ce type
de traitement. Il fonctionne comme une
surcouche de Windows, évitant
théoriquement aux programmeurs de
devoir s'occuper des différences
matérielles qui existent entre les
différents PCs. Par exemple, si une
carte vidéo n'a pas de fonctions dédiées
à la 3D, DirectX demandera au
processeur de s'occuper du rendu d'une
image de synthèse ou le rendu 3D en
temps réel.
DirectShow et MCI
! Les premières versions de DirectX n'eurent pas d'effet
sur les applications multimédia; DirectSound, la partie de
DirectX chargée de jouer le son, n'était pas prévu pour
de telles applications et ne pouvait pas enregistrer le son.
! Depuis, Microsoft a ajouté DirectShow qui rend plus
facile la programmation des applications multimédia.
! DirectShow encapsule l'interface MCI
22
DirectX
! Ne pas avoir peur de COM…
! L'accès bas niveau aux objets est souvent masqué par
des fonctions de + haut niveau.
g_pDisplay = new CDisplay();
g_pDisplay->CreateFullScreenDisplay( hWnd, SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP );
// Create a surface, and draw a bitmap resource on it.
hr = g_pDisplay->CreateSurfaceFromBitmap( &g_pAnimationSurface,
MAKEINTRESOURCE(IDB_ANIMATE_SHEET ), SPRITE_DIAMETER * 5, SPRITE_DIAMETER * 6 );
if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
return E_FAIL;
. . .
D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3( 0.0f, 3.0f,-5.0f ),
&D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),
&D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) );
g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
DirectX
! Attention : DirectX n'inclut pas
les objets / méthodes pour la
réalisation / gestion des IHM
(pas de contrôles prédéfinis).
23
Perspectives IHM
! Les applications interactives sont de plus en plus souvent
implémentées au-dessus de librairies graphiques
évoluées telles qu'OpenGL ou DirectX.
! Toutefois, jusque très récemment, la plupart des
systèmes de fenêtrage étaient toujours basés sur des
modèles graphiques vieux de plus de 15 ans, tels que
GDI, QuickDraw ou la Xlib. Aqua, l'interface utilisateur de
MacOS X donne pourtant une petite idée de ce que
pourrait être un système de fenêtrage reposant sur un
modèle graphique évolué incluant la transparence, le
placage de textures, des transformations 3D ou
l'éclairage.
Interface Aqua
24
AVALON
! Les prochaines versions de Windows sont annoncées
avec une fusion du GDI et de DirectX : Nom de code
AVALON
! L'interface reposera sur les WGF (Windows Graphic
Foundation).
! Fera partie du successeur de XP (Nom de code
longhorn) prévu pour 2006
AVALON
25
26
27