Bonjour à tous,
Je suis en train d'essayer d'afficher un bmp en c avec asm sous dos en vga (13h) . j'utilise comme compilateur borland c++ 3.0, mais je ne pense pas que cela vienne du compilateur.
j'utilise une structure pour ramener les parametres de l'image(fonction LitParam), elle fonctionne, car j'arrive à les afficher.
De même pour ma fonction de remplissage du tableau contenant l'image(LireTab8)
Bref, ces routines fonctionnaient sous windows. de plus, même quand je définis une constante (Col) pour afficher une couleur, rien ne ne passe à l'écran. cela ne vient donc pas du tableau image.
Peut être cela est il dû au fait que dos est en 16 bits au lieu de 32, mais il m'a semblé etre assez vigilant à ce niveau.
Y a t-il quelqu'un susceptible de m'éclairer de sa lanterne bienveillante??
Merci d'avance.
Philippe
// I N C L U D E S ///////////////////////////////////////////////////////////
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <alloc.h>
#include <malloc.h>
#include <dos.h>
#include <mem.h>
#include <string.h>
// D E F I N E S ////////////////////////////////////////////////////////////
#define MODE13H 0x13
#define TEXT_MODE 0x03
typedef struct{
char Nom[10];
int Hauteur;
int Largeur;
int Offset;
int NbCouleurs;
}ParamBMP;
ParamBMP Fichier; //structure contenant les parametres de l'image.
////////////////////////////////////////////////////////////////////////////
void Video_Mode(int vmode);
void Draw_Sprite(int X, int Y,ParamBMP *Fich,unsigned char ** pImage);
void LitPal();
void LireTab8(ParamBMP * Fich,unsigned char **Tab);
void LireDonnees(ParamBMP * Fich);
void WriteRGB(unsigned char couleur, unsigned char rouge,
unsigned char vert, unsigned char bleu);
////////////////////////////////////////////////////////////////////////////
unsigned char far *video_buffer = (char far *)0xA0000000L;
unsigned char far *offscreen_buffer = NULL;
unsigned char ** Image; //pointeur du Tableau contenat l'image
int i,j;
void main(void) {
Video_Mode(MODE13H);
LireDonnees(&Fichier);//ramene les données dans la structure Fichier
LitPal();//génère la palette
Image=(unsigned char**)malloc((Fichier.Hauteur)*sizeof(unsigned char*)); //création dynamique
for(i=0;i<(Fichier.Hauteur);i++) //du tableau
Image[i]=(unsigned char*)malloc((Fichier.Largeur)*sizeof(unsigned char)); //contenant l'image
LireTab8(&Fichier,Image);//remplissage du tableau image
Draw_Sprite(5,5,Image); //affichage NE MARCHE PAS...mais routine semble correcte...
getch();
for (i=0;i<Fichier.Hauteur;i++)//liberation tableau image
free(Image[i]);
free(Image);
Video_Mode(TEXT_MODE);
}
/////////////////////////////////////////////////////////////////////////////
// VideoMode : Lance le mode 13h ou texte //
/////////////////////////////////////////////////////////////////////////////
void Video_Mode(int vmode) {
asm mov ah, 0
asm mov al, BYTE PTR vmode
asm int 10h
}
/////////////////////////////////////////////////////////////////////////////
// WriteRGB : Etablit une nouvelle couleur dans la palette //
/////////////////////////////////////////////////////////////////////////////
void WriteRGB(unsigned char couleur, unsigned char rouge,
unsigned char vert, unsigned char bleu)
{
outportb(0x03C8, couleur); // Entre le num?ro de la couleur ? modifier dans
// le port hex:0x3C8 (dec:968)
outportb(0x03C9, rouge); // Entre sa composante rouge
outportb(0x03C9, vert); // Entre sa composante vert
outportb(0x03C9, bleu); // Entre sa composante bleu
}
/////////////////////////////////////////////////////////////////////////////
// Affiche Un Sprite //
/////////////////////////////////////////////////////////////////////////////
void Draw_Sprite(int X, int Y,ParamBMP *Fich,unsigned char ** pImage)
{
asm{
mov ax, 0a000h ;//Met dans es l'adresse
mov es, ax ;//du segment video
}
unsigned char Col;
for (i=Y; i<Y+Fich->Hauteur; i++){
for (j=X; j<X+Fich->Largeur; j++){
Col=pImage[i][j];
asm{ ;
mov ax,i ;
shl ax,6 ;//calculs pour mettre le point au bon endroit
mov di,ax ;
shl ax,2 ;
add di,ax ;
add di,j ;//===>ajout de l'abscisse...
mov al,Col ;//la couleur est stockée dans al
mov Byte Ptr es:[di],al ;//et est placée au bon endroit du segment video
}
}
}
};
////////////////////////////////////////////////////////////////////////////////
// LireDonnees //
////////////////////////////////////////////////////////////////////////////////
void LireDonnees(ParamBMP * Fich)
{
FILE * pFichierLu;
pFichierLu=fopen ("image8bit.bmp","rb");
fseek(pFichierLu,10,SEEK_SET);
fread(&Fich->Offset,1,2,pFichierLu);//1,4
fseek(pFichierLu,18,SEEK_SET);
fread(&Fich->Largeur,1,2,pFichierLu);//1,4
fseek(pFichierLu,2,SEEK_CUR);
fread(&Fich->Hauteur,1,2,pFichierLu);//1,4
fseek(pFichierLu,2,SEEK_CUR);
fread(&Fich->NbCouleurs,1,2,pFichierLu);1,2
fclose(pFichierLu);
return;
}
////////////////////////////////////////////////////////////////////////////////
// LireTab8 //
////////////////////////////////////////////////////////////////////////////////
void LireTab8(ParamBMP * Fich,unsigned char **Tab)
{
FILE * pFichierLu;
unsigned char pix;
pFichierLu=fopen("image8bit.bmp","rb");
j=0;
int NumLigne=(Fich->Hauteur)-1;
int NumCol=0;
fseek(pFichierLu,Fich->Offset,SEEK_SET); //54+1024
while (j<(Fich->Hauteur)*(Fich->Largeur))
{
if (NumCol>=(Fich->Largeur)){
NumLigne=NumLigne-1;
NumCol=0;
}
fread (&pix,1,1,pFichierLu);
Tab[NumLigne][NumCol]=pix;
NumCol++;
j++;
}
fclose(pFichierLu);
return;
}
////////////////////////////////////////////////////////////////////////////////
// LirePalette //
////////////////////////////////////////////////////////////////////////////////
void LitPal()
{
unsigned char TabTemp0;
unsigned char TabTemp1;
unsigned char TabTemp2;
i=0;
FILE * pFichierLu;
pFichierLu=fopen ("image8bit.bmp","rb");
fseek(pFichierLu,54,SEEK_SET);
while (i<256){
fread(&TabTemp0,1,1,pFichierLu);//Lecture des données
fread(&TabTemp1,1,1,pFichierLu);//Lecture des données
fread(&TabTemp2,1,1,pFichierLu);//Lecture des données
fseek(pFichierLu,1,SEEK_CUR);
WriteRGB(i,TabTemp2,TabTemp1,TabTemp0);
i++;
}
fclose(pFichierLu);
return;
}