[DJGPP] Affichage d'un BMP/PCX avec Allegro en résolution 640x480 (si possible mode VESA) sous MS-DOS

Post Reply
Kitsune
Site Admin
Posts: 21
Joined: Sun Nov 28, 2021 7:09 pm

[DJGPP] Affichage d'un BMP/PCX avec Allegro en résolution 640x480 (si possible mode VESA) sous MS-DOS

Post by Kitsune »

Code source à utiliser avec la librairie Allegro et DJGPP pour MS-DOS.
Ce code affiche un fichier au format BMP dans une résolution de 640x480, Allegro se charge de choisir la configuration optimale des couleurs.
Il est nécessaire d'avoir un fichier BMP en résolution 640x480 nommé "PICTURE2.BMP" a placer dans le même répertoire que l'exécutable.

Code: Select all

#include <stdio.h>
#include <allegro.h>

const int scrx = 640;
const int scry = 480;

int main(int argc, char* argv[]) {
        int depth=0;
        
        

        printf("Before loading the BMP\n");

  if(allegro_init()){
    allegro_message("Cannot initalize Allegro.\n");
    return 1;
  }

  //Set the window title when in a GUI environment
  set_window_title("Hello World");

  if (install_keyboard()) {
    allegro_message("Cannot initalize keyboard input.\n");
    return 1;
  }

  //set graphics mode, trying all acceptable depths
  set_color_depth(32);
  if (set_gfx_mode(GFX_AUTODETECT, scrx, scry, 0, 0)) {
    set_color_depth(24);
    if (set_gfx_mode(GFX_AUTODETECT, scrx, scry, 0, 0)) {
      set_color_depth(16);
      if (set_gfx_mode(GFX_AUTODETECT, scrx, scry, 0, 0)) {
        set_color_depth(15);
        if (set_gfx_mode(GFX_AUTODETECT, scrx, scry, 0, 0)) {
          allegro_message("Video Error: %s.\n", allegro_error);
          return 1;
        }
      }
    }
  }
        //Get the current color depth
        depth=get_color_depth();
        BITMAP *my_pic=NULL;
        //set_color_conversion(COLORCONV_24_TO_16);
        my_pic= load_bitmap("PICTURE2.BMP", NULL); // Load our picture
        lock_bitmap(my_pic);
        blit(my_pic,screen,0,0,0,0,my_pic->w,my_pic->h);//Draw the whole bitmap to the screen at (0,0)
        
        textprintf_ex(screen,font,100,85,makecol(255,0,50),0,"Valeur de Depth : %d",depth);
  //set text background color to bright blue
  text_mode(makecol(0, 0, 255));
        
  //prints yellow "Hello World!!!" in middle of screen
  textout_centre(screen, font,"Hello World!!!", scrx/2,
                 scry/2, makecol(255, 255, 0));

  //Wait for a key to be pressed
        while (!keypressed()) {}
        
        set_color_depth(8); 
        set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0);       
        destroy_bitmap(my_pic); 
               
        allegro_exit();
        return 0;
  //Allegro will automatically deinitalize itself on exit
}
END_OF_MAIN()
Pour compiler ce code avec Allegro il faut par exemple le placer dans un fichier nommé 640.c et puis tapper ceci:
gcc 640.c -o 640.exe -lalleg
640

---

Une variante de ce code permet de charger des fichiers images au format PCX. Le format PCX permet la prise en charge de palette en 256 couleurs et donc moins lourd a charger qu'un fichier BMP.

Code: Select all

#include <stdio.h>
#include <allegro.h>

const int scrx = 640;
const int scry = 480;

int main(int argc, char* argv[]) {
        int depth=0;
        
        

        printf("Before loading the BMP\n");

  if(allegro_init()){
    allegro_message("Cannot initalize Allegro.\n");
    return 1;
  }

  //Set the window title when in a GUI environment
  set_window_title("Hello World");

  if (install_keyboard()) {
    allegro_message("Cannot initalize keyboard input.\n");
    return 1;
  }

  //set graphics mode, trying all acceptable depths
  set_color_depth(32);
  if (set_gfx_mode(GFX_AUTODETECT, scrx, scry, 0, 0)) {
    set_color_depth(24);
    if (set_gfx_mode(GFX_AUTODETECT, scrx, scry, 0, 0)) {
      set_color_depth(16);
      if (set_gfx_mode(GFX_AUTODETECT, scrx, scry, 0, 0)) {
        set_color_depth(15);
        if (set_gfx_mode(GFX_AUTODETECT, scrx, scry, 0, 0)) {
          allegro_message("Video Error: %s.\n", allegro_error);
          return 1;
        }
      }
    }
  }
        //Get the current color depth
        depth=get_color_depth();
		
		BITMAP *my_pic=NULL;
		my_pic = load_pcx("picture2.pcx", NULL);
		
		if (!my_pic){
			printf("Error loading picture2.pcx");
			return 1;
		}
		
		
		
        lock_bitmap(my_pic);
        blit(my_pic,screen,0,0,0,0,my_pic->w,my_pic->h);//Draw the whole bitmap to the screen at (0,0)
        
        textprintf_ex(screen,font,100,85,makecol(255,0,50),0,"Valeur de Depth : %d",depth);
  //set text background color to bright blue
  text_mode(makecol(0, 0, 255));
        
  //prints yellow "Hello World!!!" in middle of screen
  textout_centre(screen, font,"Hello World!!!", scrx/2,
                 scry/2, makecol(255, 255, 0));

  //Wait for a key to be pressed
        while (!keypressed()) {}
        
        set_color_depth(8); 
        set_gfx_mode(GFX_AUTODETECT, 320, 200, 0, 0);       
        destroy_bitmap(my_pic); 
               
        allegro_exit();
        return 0;
  //Allegro will automatically deinitalize itself on exit
}
END_OF_MAIN()

Post Reply