Support for "tall pixel" mode (Each pixel is 1x2). Run the program with "/tall" argument to test.
The following tools don't take the ratio into account; Circle, Grad rectangle, Brush rotation, Resizable brushes (diamond, squares, circles...) git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@376 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
parent
2033f2dfb4
commit
d2300cc2c1
2
Makefile
2
Makefile
@ -133,7 +133,7 @@ endif
|
|||||||
|
|
||||||
.PHONY : all debug release clean depend zip version force install uninstall
|
.PHONY : all debug release clean depend zip version force install uninstall
|
||||||
|
|
||||||
OBJ = $(OBJDIR)/main.o $(OBJDIR)/init.o $(OBJDIR)/graph.o $(OBJDIR)/sdlscreen.o $(OBJDIR)/divers.o $(OBJDIR)/special.o $(OBJDIR)/boutons.o $(OBJDIR)/palette.o $(OBJDIR)/aide.o $(OBJDIR)/operatio.o $(OBJDIR)/pages.o $(OBJDIR)/loadsave.o $(OBJDIR)/readline.o $(OBJDIR)/moteur.o $(OBJDIR)/files.o $(OBJDIR)/op_c.o $(OBJDIR)/readini.o $(OBJDIR)/saveini.o $(OBJDIR)/shade.o $(OBJDIR)/clavier.o $(OBJDIR)/io.o $(OBJDIR)/version.o $(OBJDIR)/texte.o $(OBJDIR)/SFont.o $(OBJDIR)/setup.o
|
OBJ = $(OBJDIR)/main.o $(OBJDIR)/init.o $(OBJDIR)/graph.o $(OBJDIR)/sdlscreen.o $(OBJDIR)/divers.o $(OBJDIR)/special.o $(OBJDIR)/boutons.o $(OBJDIR)/palette.o $(OBJDIR)/aide.o $(OBJDIR)/operatio.o $(OBJDIR)/pages.o $(OBJDIR)/loadsave.o $(OBJDIR)/readline.o $(OBJDIR)/moteur.o $(OBJDIR)/files.o $(OBJDIR)/op_c.o $(OBJDIR)/readini.o $(OBJDIR)/saveini.o $(OBJDIR)/shade.o $(OBJDIR)/clavier.o $(OBJDIR)/io.o $(OBJDIR)/version.o $(OBJDIR)/texte.o $(OBJDIR)/SFont.o $(OBJDIR)/setup.o $(OBJDIR)/pxsimple.o $(OBJDIR)/pxtall.o
|
||||||
CFGOBJ = $(OBJDIR)/gfxcfg.o $(OBJDIR)/SFont.o $(OBJDIR)/clavier.o $(OBJDIR)/io.o $(OBJDIR)/setup.o
|
CFGOBJ = $(OBJDIR)/gfxcfg.o $(OBJDIR)/SFont.o $(OBJDIR)/clavier.o $(OBJDIR)/io.o $(OBJDIR)/setup.o
|
||||||
|
|
||||||
all : $(BIN) $(CFGBIN)
|
all : $(BIN) $(CFGBIN)
|
||||||
|
|||||||
@ -12,7 +12,7 @@ $(OBJDIR)/files.o: files.c const.h struct.h global.h loadsave.h graph.h divers.h
|
|||||||
$(OBJDIR)/gfxcfg.o: gfxcfg.c SFont.h struct.h const.h clavier.h io.h hotkeys.h \
|
$(OBJDIR)/gfxcfg.o: gfxcfg.c SFont.h struct.h const.h clavier.h io.h hotkeys.h \
|
||||||
setup.h
|
setup.h
|
||||||
$(OBJDIR)/graph.o: graph.c global.h struct.h const.h loadsave.h moteur.h boutons.h \
|
$(OBJDIR)/graph.o: graph.c global.h struct.h const.h loadsave.h moteur.h boutons.h \
|
||||||
pages.h erreurs.h sdlscreen.h graph.h divers.h
|
pages.h erreurs.h sdlscreen.h graph.h divers.h pxsimple.h pxtall.h
|
||||||
$(OBJDIR)/init.o: init.c const.h struct.h global.h loadsave.h graph.h boutons.h \
|
$(OBJDIR)/init.o: init.c const.h struct.h global.h loadsave.h graph.h boutons.h \
|
||||||
palette.h aide.h operatio.h divers.h erreurs.h clavier.h io.h hotkeys.h \
|
palette.h aide.h operatio.h divers.h erreurs.h clavier.h io.h hotkeys.h \
|
||||||
files.h setup.h
|
files.h setup.h
|
||||||
@ -32,13 +32,17 @@ $(OBJDIR)/pages.o: pages.c global.h struct.h const.h loadsave.h pages.h graph.h
|
|||||||
$(OBJDIR)/palette.o: palette.c const.h struct.h global.h loadsave.h divers.h \
|
$(OBJDIR)/palette.o: palette.c const.h struct.h global.h loadsave.h divers.h \
|
||||||
graph.h moteur.h readline.h boutons.h pages.h aide.h sdlscreen.h \
|
graph.h moteur.h readline.h boutons.h pages.h aide.h sdlscreen.h \
|
||||||
erreurs.h op_c.h
|
erreurs.h op_c.h
|
||||||
|
$(OBJDIR)/pxsimple.o: pxsimple.c global.h struct.h const.h loadsave.h sdlscreen.h \
|
||||||
|
divers.h
|
||||||
|
$(OBJDIR)/pxtall.o: pxtall.c global.h struct.h const.h loadsave.h sdlscreen.h \
|
||||||
|
divers.h pxsimple.h
|
||||||
$(OBJDIR)/readini.o: readini.c const.h global.h struct.h loadsave.h graph.h
|
$(OBJDIR)/readini.o: readini.c const.h global.h struct.h loadsave.h graph.h
|
||||||
$(OBJDIR)/readline.o: readline.c const.h struct.h global.h loadsave.h graph.h \
|
$(OBJDIR)/readline.o: readline.c const.h struct.h global.h loadsave.h graph.h \
|
||||||
divers.h erreurs.h sdlscreen.h readline.h
|
divers.h erreurs.h sdlscreen.h readline.h
|
||||||
$(OBJDIR)/saveini.o: saveini.c const.h global.h struct.h loadsave.h readini.h io.h \
|
$(OBJDIR)/saveini.o: saveini.c const.h global.h struct.h loadsave.h readini.h io.h \
|
||||||
erreurs.h graph.h
|
erreurs.h graph.h
|
||||||
$(OBJDIR)/sdlscreen.o: sdlscreen.c global.h struct.h const.h loadsave.h sdlscreen.h \
|
$(OBJDIR)/sdlscreen.o: sdlscreen.c global.h struct.h const.h loadsave.h sdlscreen.h \
|
||||||
divers.h erreurs.h graph.h
|
erreurs.h graph.h
|
||||||
$(OBJDIR)/setup.o: setup.c struct.h const.h io.h files.h
|
$(OBJDIR)/setup.o: setup.c struct.h const.h io.h files.h
|
||||||
$(OBJDIR)/shade.o: shade.c global.h struct.h const.h loadsave.h graph.h moteur.h \
|
$(OBJDIR)/shade.o: shade.c global.h struct.h const.h loadsave.h graph.h moteur.h \
|
||||||
divers.h readline.h aide.h sdlscreen.h
|
divers.h readline.h aide.h sdlscreen.h
|
||||||
|
|||||||
2
aide.c
2
aide.c
@ -177,6 +177,8 @@ void Afficher_aide(void)
|
|||||||
Couleur=CM_Fonce;
|
Couleur=CM_Fonce;
|
||||||
}
|
}
|
||||||
Buffer_de_ligne_horizontale[Position_X++]=Couleur;
|
Buffer_de_ligne_horizontale[Position_X++]=Couleur;
|
||||||
|
if (Pixel_width>1)
|
||||||
|
Buffer_de_ligne_horizontale[Position_X++]=Couleur;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// On la splotche
|
// On la splotche
|
||||||
|
|||||||
@ -1488,11 +1488,11 @@ void Bouton_Resol(void)
|
|||||||
if (Mouse_K==2)
|
if (Mouse_K==2)
|
||||||
{
|
{
|
||||||
// On affecte également les dimensions de l'image:
|
// On affecte également les dimensions de l'image:
|
||||||
Largeur_choisie=Mode_video[Mode_choisi].Largeur;
|
Largeur_choisie=Mode_video[Mode_choisi].Largeur/Pixel_width;
|
||||||
Num2str(Largeur_choisie,Chaine,4);
|
Num2str(Largeur_choisie,Chaine,4);
|
||||||
Fenetre_Contenu_bouton_saisie(Bouton_saisie_Width,Chaine);
|
Fenetre_Contenu_bouton_saisie(Bouton_saisie_Width,Chaine);
|
||||||
|
|
||||||
Hauteur_choisie=Mode_video[Mode_choisi].Hauteur;
|
Hauteur_choisie=Mode_video[Mode_choisi].Hauteur/Pixel_height;
|
||||||
Num2str(Hauteur_choisie,Chaine,4);
|
Num2str(Hauteur_choisie,Chaine,4);
|
||||||
Fenetre_Contenu_bouton_saisie(Bouton_saisie_Height,Chaine);
|
Fenetre_Contenu_bouton_saisie(Bouton_saisie_Height,Chaine);
|
||||||
}
|
}
|
||||||
@ -5915,7 +5915,7 @@ void Bouton_Texte()
|
|||||||
Nouvelle_Brosse = Rendu_Texte(Chaine_preview, Position_curseur+Debut_liste, Taille_police, AntiAlias, Style_Bold, Style_Italic, &Nouvelle_Largeur, &Nouvelle_Hauteur);
|
Nouvelle_Brosse = Rendu_Texte(Chaine_preview, Position_curseur+Debut_liste, Taille_police, AntiAlias, Style_Bold, Style_Italic, &Nouvelle_Largeur, &Nouvelle_Hauteur);
|
||||||
if (Nouvelle_Brosse)
|
if (Nouvelle_Brosse)
|
||||||
{
|
{
|
||||||
Affiche_brosse_SDL(
|
Affiche_brosse(
|
||||||
Nouvelle_Brosse,
|
Nouvelle_Brosse,
|
||||||
Fenetre_Pos_X+Bouton_preview->Pos_X*Menu_Facteur_X,
|
Fenetre_Pos_X+Bouton_preview->Pos_X*Menu_Facteur_X,
|
||||||
Fenetre_Pos_Y+Bouton_preview->Pos_Y*Menu_Facteur_Y,
|
Fenetre_Pos_Y+Bouton_preview->Pos_Y*Menu_Facteur_Y,
|
||||||
|
|||||||
9
const.h
9
const.h
@ -126,11 +126,14 @@ enum CODES_D_ERREURS
|
|||||||
ERREUR_SORRY_SORRY_SORRY // On le refera plus, promis
|
ERREUR_SORRY_SORRY_SORRY // On le refera plus, promis
|
||||||
};
|
};
|
||||||
|
|
||||||
// Les différents types de modes vidéos
|
// Les différents types de pixels
|
||||||
|
|
||||||
enum TYPES_DE_MODES_VIDEO
|
enum PIXEL_RATIO
|
||||||
{
|
{
|
||||||
MODE_SDL
|
PIXEL_SIMPLE,
|
||||||
|
PIXEL_WIDE,
|
||||||
|
PIXEL_TALL,
|
||||||
|
PIXEL_DOUBLE
|
||||||
};
|
};
|
||||||
|
|
||||||
// Les différentes catégories de bouton:
|
// Les différentes catégories de bouton:
|
||||||
|
|||||||
16
divers.c
16
divers.c
@ -159,8 +159,8 @@ void Get_input(void)
|
|||||||
{
|
{
|
||||||
case SDL_MOUSEMOTION:
|
case SDL_MOUSEMOTION:
|
||||||
//Mouvement de la souris
|
//Mouvement de la souris
|
||||||
INPUT_Nouveau_Mouse_X = event.motion.x>>Mouse_Facteur_de_correction_X;
|
INPUT_Nouveau_Mouse_X = event.motion.x/Pixel_width;
|
||||||
INPUT_Nouveau_Mouse_Y = event.motion.y>>Mouse_Facteur_de_correction_Y;
|
INPUT_Nouveau_Mouse_Y = event.motion.y/Pixel_height;
|
||||||
break;
|
break;
|
||||||
case SDL_MOUSEBUTTONDOWN:
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
//Clic sur un des boutons de la souris
|
//Clic sur un des boutons de la souris
|
||||||
@ -256,8 +256,8 @@ void Get_input(void)
|
|||||||
if(ok)
|
if(ok)
|
||||||
{
|
{
|
||||||
SDL_WarpMouse(
|
SDL_WarpMouse(
|
||||||
INPUT_Nouveau_Mouse_X<<Mouse_Facteur_de_correction_X,
|
INPUT_Nouveau_Mouse_X*Pixel_width,
|
||||||
INPUT_Nouveau_Mouse_Y<<Mouse_Facteur_de_correction_Y
|
INPUT_Nouveau_Mouse_Y*Pixel_height
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -303,8 +303,8 @@ void Get_input(void)
|
|||||||
if (bl)
|
if (bl)
|
||||||
{
|
{
|
||||||
SDL_WarpMouse(
|
SDL_WarpMouse(
|
||||||
INPUT_Nouveau_Mouse_X<<Mouse_Facteur_de_correction_X,
|
INPUT_Nouveau_Mouse_X*Pixel_width,
|
||||||
INPUT_Nouveau_Mouse_Y<<Mouse_Facteur_de_correction_Y
|
INPUT_Nouveau_Mouse_Y*Pixel_height
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -562,8 +562,8 @@ byte Effet_Trame(word X,word Y)
|
|||||||
void Set_mouse_position(void)
|
void Set_mouse_position(void)
|
||||||
{
|
{
|
||||||
SDL_WarpMouse(
|
SDL_WarpMouse(
|
||||||
Mouse_X << Mouse_Facteur_de_correction_X,
|
Mouse_X*Pixel_width,
|
||||||
Mouse_Y << Mouse_Facteur_de_correction_Y
|
Mouse_Y*Pixel_height
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
6
global.h
6
global.h
@ -173,6 +173,9 @@ GLOBAL short Pinceau_Decalage_Y;
|
|||||||
|
|
||||||
// Commandes graphiques
|
// Commandes graphiques
|
||||||
|
|
||||||
|
GLOBAL int Pixel_ratio;
|
||||||
|
GLOBAL int Pixel_width;
|
||||||
|
GLOBAL int Pixel_height;
|
||||||
GLOBAL fonction_afficheur Pixel; // Affiche un point à l'écran
|
GLOBAL fonction_afficheur Pixel; // Affiche un point à l'écran
|
||||||
GLOBAL fonction_afficheur Pixel_dans_menu;// Affiche un point dans le menu (ou pas si le menu est invisible)
|
GLOBAL fonction_afficheur Pixel_dans_menu;// Affiche un point dans le menu (ou pas si le menu est invisible)
|
||||||
GLOBAL fonction_lecteur Lit_pixel; // Teste la couleur d'un pixel dans l'écran
|
GLOBAL fonction_lecteur Lit_pixel; // Teste la couleur d'un pixel dans l'écran
|
||||||
@ -193,7 +196,7 @@ GLOBAL fonction_display_zoom Display_zoomed_screen; // Affiche rapidement toute
|
|||||||
GLOBAL fonction_display_brush_Color_zoom Display_brush_Color_zoom;
|
GLOBAL fonction_display_brush_Color_zoom Display_brush_Color_zoom;
|
||||||
GLOBAL fonction_display_brush_Mono_zoom Display_brush_Mono_zoom;
|
GLOBAL fonction_display_brush_Mono_zoom Display_brush_Mono_zoom;
|
||||||
GLOBAL fonction_display_brush_Color_zoom Clear_brush_zoom;
|
GLOBAL fonction_display_brush_Color_zoom Clear_brush_zoom;
|
||||||
|
GLOBAL fonction_affiche_brosse Affiche_brosse;
|
||||||
// Données sur les dimensions de l'écran
|
// Données sur les dimensions de l'écran
|
||||||
|
|
||||||
GLOBAL int Resize_Largeur; // \__ Positionnées lorsque l'utilisateur tire
|
GLOBAL int Resize_Largeur; // \__ Positionnées lorsque l'utilisateur tire
|
||||||
@ -203,7 +206,6 @@ GLOBAL short Ecran_original_X; // |_ Dimensions de l'
|
|||||||
GLOBAL short Ecran_original_Y; // | l'image qui vient d'être chargée.
|
GLOBAL short Ecran_original_Y; // | l'image qui vient d'être chargée.
|
||||||
GLOBAL short Largeur_ecran; // Largeur de l'écran
|
GLOBAL short Largeur_ecran; // Largeur de l'écran
|
||||||
GLOBAL short Hauteur_ecran; // Hauteur de l'écran
|
GLOBAL short Hauteur_ecran; // Hauteur de l'écran
|
||||||
GLOBAL byte Plein_ecran; // Indique si on est en mode plein écran ou fenêtré
|
|
||||||
GLOBAL short Limite_Haut; // |
|
GLOBAL short Limite_Haut; // |
|
||||||
GLOBAL short Limite_Bas; // |_ Limites dans lesquelles
|
GLOBAL short Limite_Bas; // |_ Limites dans lesquelles
|
||||||
GLOBAL short Limite_Gauche; // | on peut écrire
|
GLOBAL short Limite_Gauche; // | on peut écrire
|
||||||
|
|||||||
110
graph.c
110
graph.c
@ -43,6 +43,8 @@
|
|||||||
#include "sdlscreen.h"
|
#include "sdlscreen.h"
|
||||||
#include "graph.h"
|
#include "graph.h"
|
||||||
#include "divers.h"
|
#include "divers.h"
|
||||||
|
#include "pxsimple.h"
|
||||||
|
#include "pxtall.h"
|
||||||
|
|
||||||
// Fonction qui met à jour la zone de l'image donnée en paramètre sur l'écran.
|
// Fonction qui met à jour la zone de l'image donnée en paramètre sur l'écran.
|
||||||
// Tient compte du décalage X et Y et du zoom, et fait tous les controles nécessaires
|
// Tient compte du décalage X et Y et du zoom, et fait tous les controles nécessaires
|
||||||
@ -1059,23 +1061,81 @@ void Initialiser_mode_video(int Largeur, int Hauteur, int Fullscreen)
|
|||||||
Hauteur_ecran!=Hauteur ||
|
Hauteur_ecran!=Hauteur ||
|
||||||
Mode_video[Resolution_actuelle].Fullscreen != Fullscreen)
|
Mode_video[Resolution_actuelle].Fullscreen != Fullscreen)
|
||||||
{
|
{
|
||||||
|
switch (Pixel_ratio)
|
||||||
|
{
|
||||||
|
case PIXEL_SIMPLE:
|
||||||
|
Pixel_width=1;
|
||||||
|
Pixel_height=1;
|
||||||
|
Pixel = Pixel_Simple ;
|
||||||
|
Lit_pixel= Lit_Pixel_Simple ;
|
||||||
|
Display_screen = Afficher_partie_de_l_ecran_Simple ;
|
||||||
|
Block = Block_Simple ;
|
||||||
|
Pixel_Preview_Normal = Pixel_Preview_Normal_Simple ;
|
||||||
|
Pixel_Preview_Loupe = Pixel_Preview_Loupe_Simple ;
|
||||||
|
Ligne_horizontale_XOR = Ligne_horizontale_XOR_Simple ;
|
||||||
|
Ligne_verticale_XOR = Ligne_verticale_XOR_Simple ;
|
||||||
|
Display_brush_Color = Display_brush_Color_Simple ;
|
||||||
|
Display_brush_Mono = Display_brush_Mono_Simple ;
|
||||||
|
Clear_brush = Clear_brush_Simple ;
|
||||||
|
Remap_screen = Remap_screen_Simple ;
|
||||||
|
Afficher_ligne = Afficher_une_ligne_ecran_Simple ;
|
||||||
|
Lire_ligne = Lire_une_ligne_ecran_Simple ;
|
||||||
|
Display_zoomed_screen = Afficher_partie_de_l_ecran_zoomee_Simple ;
|
||||||
|
Display_brush_Color_zoom = Display_brush_Color_zoom_Simple ;
|
||||||
|
Display_brush_Mono_zoom = Display_brush_Mono_zoom_Simple ;
|
||||||
|
Clear_brush_zoom = Clear_brush_zoom_Simple ;
|
||||||
|
Affiche_brosse = Affiche_brosse_Simple ;
|
||||||
|
break;
|
||||||
|
case PIXEL_TALL:
|
||||||
|
Pixel_width=1;
|
||||||
|
Pixel_height=2;
|
||||||
|
Pixel = Pixel_Tall;
|
||||||
|
Lit_pixel= Lit_Pixel_Tall;
|
||||||
|
Display_screen = Afficher_partie_de_l_ecran_Tall;
|
||||||
|
Block = Block_Tall;
|
||||||
|
Pixel_Preview_Normal = Pixel_Preview_Normal_Tall;
|
||||||
|
Pixel_Preview_Loupe = Pixel_Preview_Loupe_Tall;
|
||||||
|
Ligne_horizontale_XOR = Ligne_horizontale_XOR_Tall;
|
||||||
|
Ligne_verticale_XOR = Ligne_verticale_XOR_Tall;
|
||||||
|
Display_brush_Color = Display_brush_Color_Tall;
|
||||||
|
Display_brush_Mono = Display_brush_Mono_Tall;
|
||||||
|
Clear_brush = Clear_brush_Tall;
|
||||||
|
Remap_screen = Remap_screen_Tall;
|
||||||
|
Afficher_ligne = Afficher_une_ligne_ecran_Tall;
|
||||||
|
Lire_ligne = Lire_une_ligne_ecran_Tall;
|
||||||
|
Display_zoomed_screen = Afficher_partie_de_l_ecran_zoomee_Tall;
|
||||||
|
Display_brush_Color_zoom = Display_brush_Color_zoom_Tall;
|
||||||
|
Display_brush_Mono_zoom = Display_brush_Mono_zoom_Tall;
|
||||||
|
Clear_brush_zoom = Clear_brush_zoom_Tall;
|
||||||
|
Affiche_brosse = Affiche_brosse_Tall;
|
||||||
|
break;
|
||||||
|
}
|
||||||
// Valeurs raisonnables: minimum 320x200
|
// Valeurs raisonnables: minimum 320x200
|
||||||
|
if (Pixel_width==1 && Pixel_height==1)
|
||||||
|
{
|
||||||
if (Largeur < 320)
|
if (Largeur < 320)
|
||||||
Largeur = 320;
|
Largeur = 320;
|
||||||
if (Hauteur < 200)
|
if (Hauteur < 200)
|
||||||
Hauteur = 200;
|
Hauteur = 200;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (Largeur < 640)
|
||||||
|
Largeur = 640;
|
||||||
|
if (Hauteur < 400)
|
||||||
|
Hauteur = 400;
|
||||||
|
}
|
||||||
// La largeur doit être un multiple de 4
|
// La largeur doit être un multiple de 4
|
||||||
Largeur = (Largeur + 3 ) & 0xFFFFFFFC;
|
Largeur = (Largeur + 3 ) & 0xFFFFFFFC;
|
||||||
|
Set_Mode_SDL(&Largeur, &Hauteur,Fullscreen);
|
||||||
|
Largeur_ecran = Largeur/Pixel_width;
|
||||||
|
Hauteur_ecran = Hauteur/Pixel_height;
|
||||||
|
|
||||||
// Taille des menus
|
// Taille des menus
|
||||||
if (Largeur/320 > Hauteur/200)
|
if (Largeur_ecran/320 > Hauteur_ecran/200)
|
||||||
Facteur=Hauteur/200;
|
Facteur=Hauteur_ecran/200;
|
||||||
else
|
else
|
||||||
Facteur=Largeur/320;
|
Facteur=Largeur_ecran/320;
|
||||||
|
|
||||||
Largeur_ecran = Largeur;
|
|
||||||
Hauteur_ecran = Hauteur;
|
|
||||||
Plein_ecran = Fullscreen;
|
|
||||||
|
|
||||||
switch (Config.Ratio)
|
switch (Config.Ratio)
|
||||||
{
|
{
|
||||||
@ -1093,36 +1153,14 @@ void Initialiser_mode_video(int Largeur, int Hauteur, int Fullscreen)
|
|||||||
Menu_Facteur_X=1;
|
Menu_Facteur_X=1;
|
||||||
Menu_Facteur_Y=1;
|
Menu_Facteur_Y=1;
|
||||||
}
|
}
|
||||||
|
if (Pixel_height>Pixel_width)
|
||||||
|
Menu_Facteur_X*=2;
|
||||||
|
else if (Pixel_width>Pixel_height)
|
||||||
|
Menu_Facteur_Y*=2;
|
||||||
if (Buffer_de_ligne_horizontale)
|
if (Buffer_de_ligne_horizontale)
|
||||||
free(Buffer_de_ligne_horizontale);
|
free(Buffer_de_ligne_horizontale);
|
||||||
|
|
||||||
Buffer_de_ligne_horizontale=(byte *)malloc((Largeur_ecran>Principal_Largeur_image)?Largeur_ecran:Principal_Largeur_image);
|
Buffer_de_ligne_horizontale=(byte *)malloc(Pixel_width*((Largeur_ecran>Principal_Largeur_image)?Largeur_ecran:Principal_Largeur_image));
|
||||||
|
|
||||||
switch (MODE_SDL)
|
|
||||||
{
|
|
||||||
case MODE_SDL:
|
|
||||||
Pixel = Pixel_SDL;
|
|
||||||
Lit_pixel= Lit_Pixel_SDL;
|
|
||||||
Display_screen = Afficher_partie_de_l_ecran_SDL;
|
|
||||||
Block = Block_SDL;
|
|
||||||
Pixel_Preview_Normal = Pixel_Preview_Normal_SDL;
|
|
||||||
Pixel_Preview_Loupe = Pixel_Preview_Loupe_SDL;
|
|
||||||
Ligne_horizontale_XOR = Ligne_horizontale_XOR_SDL;
|
|
||||||
Ligne_verticale_XOR = Ligne_verticale_XOR_SDL;
|
|
||||||
Display_brush_Color = Display_brush_Color_SDL;
|
|
||||||
Display_brush_Mono = Display_brush_Mono_SDL;
|
|
||||||
Clear_brush = Clear_brush_SDL;
|
|
||||||
Remap_screen = Remap_screen_SDL;
|
|
||||||
Afficher_ligne = Afficher_une_ligne_ecran_SDL;
|
|
||||||
Lire_ligne = Lire_une_ligne_ecran_SDL;
|
|
||||||
Display_zoomed_screen = Afficher_partie_de_l_ecran_zoomee_SDL;
|
|
||||||
Display_brush_Color_zoom = Display_brush_Color_zoom_SDL;
|
|
||||||
Display_brush_Mono_zoom = Display_brush_Mono_zoom_SDL;
|
|
||||||
Clear_brush_zoom = Clear_brush_zoom_SDL;
|
|
||||||
Set_Mode_SDL();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
Set_palette(Principal_Palette);
|
Set_palette(Principal_Palette);
|
||||||
|
|
||||||
@ -1359,7 +1397,7 @@ void Encadrer_couleur_menu(byte Couleur)
|
|||||||
Menu_Facteur_X,Menu_Facteur_Y,
|
Menu_Facteur_X,Menu_Facteur_Y,
|
||||||
((Indice+Fin_Y)&1)?CM_Blanc:CM_Noir);
|
((Indice+Fin_Y)&1)?CM_Blanc:CM_Noir);
|
||||||
|
|
||||||
UpdateRect(Debut_X*Menu_Facteur_X,Debut_Y*Menu_Facteur_X,Menu_Taille_couleur*Menu_Facteur_X,Menu_Ordonnee+Menu_Facteur_Y*4);
|
UpdateRect(Debut_X*Menu_Facteur_X,Debut_Y*Menu_Facteur_Y,Menu_Taille_couleur*Menu_Facteur_X,Menu_Ordonnee+Menu_Facteur_Y*4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1548,7 +1586,7 @@ void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur
|
|||||||
{
|
{
|
||||||
Caractere=(Chaine[Indice])<<6;
|
Caractere=(Chaine[Indice])<<6;
|
||||||
for (Pos_X=0;Pos_X<8<<3;Pos_X+=1<<3)
|
for (Pos_X=0;Pos_X<8<<3;Pos_X+=1<<3)
|
||||||
for (Repeat_Menu_Facteur_X=0;Repeat_Menu_Facteur_X<Menu_Facteur_X;Repeat_Menu_Facteur_X++)
|
for (Repeat_Menu_Facteur_X=0;Repeat_Menu_Facteur_X<Menu_Facteur_X*Pixel_width;Repeat_Menu_Facteur_X++)
|
||||||
Buffer_de_ligne_horizontale[Reel_X++]=Fonte[Caractere+Pos_X+Pos_Y]?Couleur_texte:Couleur_fond;
|
Buffer_de_ligne_horizontale[Reel_X++]=Fonte[Caractere+Pos_X+Pos_Y]?Couleur_texte:Couleur_fond;
|
||||||
}
|
}
|
||||||
for (Repeat_Menu_Facteur_Y=0;Repeat_Menu_Facteur_Y<Menu_Facteur_Y;Repeat_Menu_Facteur_Y++)
|
for (Repeat_Menu_Facteur_Y=0;Repeat_Menu_Facteur_Y<Menu_Facteur_Y;Repeat_Menu_Facteur_Y++)
|
||||||
|
|||||||
2
graph.h
2
graph.h
@ -180,7 +180,7 @@ void Remap_picture(void);
|
|||||||
#define ToWinX(x) (((x)*Menu_Facteur_X)+Fenetre_Pos_X)
|
#define ToWinX(x) (((x)*Menu_Facteur_X)+Fenetre_Pos_X)
|
||||||
#define ToWinY(y) (((y)*Menu_Facteur_Y)+Fenetre_Pos_Y)
|
#define ToWinY(y) (((y)*Menu_Facteur_Y)+Fenetre_Pos_Y)
|
||||||
#define ToWinL(l) ((l)*Menu_Facteur_X)
|
#define ToWinL(l) ((l)*Menu_Facteur_X)
|
||||||
#define ToWinH(h) ((h)*Menu_Facteur_X)
|
#define ToWinH(h) ((h)*Menu_Facteur_Y)
|
||||||
|
|
||||||
byte Meilleure_couleur(byte Rouge,byte Vert,byte Bleu);
|
byte Meilleure_couleur(byte Rouge,byte Vert,byte Bleu);
|
||||||
byte Meilleure_couleur_sans_exclusion(byte Rouge,byte Vert,byte Bleu);
|
byte Meilleure_couleur_sans_exclusion(byte Rouge,byte Vert,byte Bleu);
|
||||||
|
|||||||
124
init.c
124
init.c
@ -1317,68 +1317,68 @@ void Definition_des_modes_video(void)
|
|||||||
SDL_Rect** Modes;
|
SDL_Rect** Modes;
|
||||||
Nb_modes_video=0;
|
Nb_modes_video=0;
|
||||||
// Doit être en premier pour avoir le numéro 0:
|
// Doit être en premier pour avoir le numéro 0:
|
||||||
Definir_mode_video( 640,480,MODE_SDL, 0);
|
Definir_mode_video( 640,480,0, 0);
|
||||||
|
|
||||||
Definir_mode_video( 320,200,MODE_SDL, 1);
|
Definir_mode_video( 320,200,0, 1);
|
||||||
Definir_mode_video( 320,224,MODE_SDL, 1);
|
Definir_mode_video( 320,224,0, 1);
|
||||||
Definir_mode_video( 320,240,MODE_SDL, 1);
|
Definir_mode_video( 320,240,0, 1);
|
||||||
Definir_mode_video( 320,256,MODE_SDL, 1);
|
Definir_mode_video( 320,256,0, 1);
|
||||||
Definir_mode_video( 320,270,MODE_SDL, 1);
|
Definir_mode_video( 320,270,0, 1);
|
||||||
Definir_mode_video( 320,282,MODE_SDL, 1);
|
Definir_mode_video( 320,282,0, 1);
|
||||||
Definir_mode_video( 320,300,MODE_SDL, 1);
|
Definir_mode_video( 320,300,0, 1);
|
||||||
Definir_mode_video( 320,360,MODE_SDL, 1);
|
Definir_mode_video( 320,360,0, 1);
|
||||||
Definir_mode_video( 320,400,MODE_SDL, 1);
|
Definir_mode_video( 320,400,0, 1);
|
||||||
Definir_mode_video( 320,448,MODE_SDL, 1);
|
Definir_mode_video( 320,448,0, 1);
|
||||||
Definir_mode_video( 320,480,MODE_SDL, 1);
|
Definir_mode_video( 320,480,0, 1);
|
||||||
Definir_mode_video( 320,512,MODE_SDL, 1);
|
Definir_mode_video( 320,512,0, 1);
|
||||||
Definir_mode_video( 320,540,MODE_SDL, 1);
|
Definir_mode_video( 320,540,0, 1);
|
||||||
Definir_mode_video( 320,564,MODE_SDL, 1);
|
Definir_mode_video( 320,564,0, 1);
|
||||||
Definir_mode_video( 320,600,MODE_SDL, 1);
|
Definir_mode_video( 320,600,0, 1);
|
||||||
Definir_mode_video( 360,200,MODE_SDL, 1);
|
Definir_mode_video( 360,200,0, 1);
|
||||||
Definir_mode_video( 360,224,MODE_SDL, 1);
|
Definir_mode_video( 360,224,0, 1);
|
||||||
Definir_mode_video( 360,240,MODE_SDL, 1);
|
Definir_mode_video( 360,240,0, 1);
|
||||||
Definir_mode_video( 360,256,MODE_SDL, 1);
|
Definir_mode_video( 360,256,0, 1);
|
||||||
Definir_mode_video( 360,270,MODE_SDL, 1);
|
Definir_mode_video( 360,270,0, 1);
|
||||||
Definir_mode_video( 360,282,MODE_SDL, 1);
|
Definir_mode_video( 360,282,0, 1);
|
||||||
Definir_mode_video( 360,300,MODE_SDL, 1);
|
Definir_mode_video( 360,300,0, 1);
|
||||||
Definir_mode_video( 360,360,MODE_SDL, 1);
|
Definir_mode_video( 360,360,0, 1);
|
||||||
Definir_mode_video( 360,400,MODE_SDL, 1);
|
Definir_mode_video( 360,400,0, 1);
|
||||||
Definir_mode_video( 360,448,MODE_SDL, 1);
|
Definir_mode_video( 360,448,0, 1);
|
||||||
Definir_mode_video( 360,480,MODE_SDL, 1);
|
Definir_mode_video( 360,480,0, 1);
|
||||||
Definir_mode_video( 360,512,MODE_SDL, 1);
|
Definir_mode_video( 360,512,0, 1);
|
||||||
Definir_mode_video( 360,540,MODE_SDL, 1);
|
Definir_mode_video( 360,540,0, 1);
|
||||||
Definir_mode_video( 360,564,MODE_SDL, 1);
|
Definir_mode_video( 360,564,0, 1);
|
||||||
Definir_mode_video( 360,600,MODE_SDL, 1);
|
Definir_mode_video( 360,600,0, 1);
|
||||||
Definir_mode_video( 400,200,MODE_SDL, 1);
|
Definir_mode_video( 400,200,0, 1);
|
||||||
Definir_mode_video( 400,224,MODE_SDL, 1);
|
Definir_mode_video( 400,224,0, 1);
|
||||||
Definir_mode_video( 400,240,MODE_SDL, 1);
|
Definir_mode_video( 400,240,0, 1);
|
||||||
Definir_mode_video( 400,256,MODE_SDL, 1);
|
Definir_mode_video( 400,256,0, 1);
|
||||||
Definir_mode_video( 400,270,MODE_SDL, 1);
|
Definir_mode_video( 400,270,0, 1);
|
||||||
Definir_mode_video( 400,282,MODE_SDL, 1);
|
Definir_mode_video( 400,282,0, 1);
|
||||||
Definir_mode_video( 400,300,MODE_SDL, 1);
|
Definir_mode_video( 400,300,0, 1);
|
||||||
Definir_mode_video( 400,360,MODE_SDL, 1);
|
Definir_mode_video( 400,360,0, 1);
|
||||||
Definir_mode_video( 400,400,MODE_SDL, 1);
|
Definir_mode_video( 400,400,0, 1);
|
||||||
Definir_mode_video( 400,448,MODE_SDL, 1);
|
Definir_mode_video( 400,448,0, 1);
|
||||||
Definir_mode_video( 400,480,MODE_SDL, 1);
|
Definir_mode_video( 400,480,0, 1);
|
||||||
Definir_mode_video( 400,512,MODE_SDL, 1);
|
Definir_mode_video( 400,512,0, 1);
|
||||||
Definir_mode_video( 400,540,MODE_SDL, 1);
|
Definir_mode_video( 400,540,0, 1);
|
||||||
Definir_mode_video( 400,564,MODE_SDL, 1);
|
Definir_mode_video( 400,564,0, 1);
|
||||||
Definir_mode_video( 400,600,MODE_SDL, 1);
|
Definir_mode_video( 400,600,0, 1);
|
||||||
Definir_mode_video( 640,224,MODE_SDL, 1);
|
Definir_mode_video( 640,224,0, 1);
|
||||||
Definir_mode_video( 640,240,MODE_SDL, 1);
|
Definir_mode_video( 640,240,0, 1);
|
||||||
Definir_mode_video( 640,256,MODE_SDL, 1);
|
Definir_mode_video( 640,256,0, 1);
|
||||||
Definir_mode_video( 640,270,MODE_SDL, 1);
|
Definir_mode_video( 640,270,0, 1);
|
||||||
Definir_mode_video( 640,300,MODE_SDL, 1);
|
Definir_mode_video( 640,300,0, 1);
|
||||||
Definir_mode_video( 640,350,MODE_SDL, 1);
|
Definir_mode_video( 640,350,0, 1);
|
||||||
Definir_mode_video( 640,400,MODE_SDL, 1);
|
Definir_mode_video( 640,400,0, 1);
|
||||||
Definir_mode_video( 640,448,MODE_SDL, 1);
|
Definir_mode_video( 640,448,0, 1);
|
||||||
Definir_mode_video( 640,480,MODE_SDL, 1);
|
Definir_mode_video( 640,480,0, 1);
|
||||||
Definir_mode_video( 640,512,MODE_SDL, 1);
|
Definir_mode_video( 640,512,0, 1);
|
||||||
Definir_mode_video( 640,540,MODE_SDL, 1);
|
Definir_mode_video( 640,540,0, 1);
|
||||||
Definir_mode_video( 640,564,MODE_SDL, 1);
|
Definir_mode_video( 640,564,0, 1);
|
||||||
Definir_mode_video( 640,600,MODE_SDL, 1);
|
Definir_mode_video( 640,600,0, 1);
|
||||||
Definir_mode_video( 800,600,MODE_SDL, 1);
|
Definir_mode_video( 800,600,0, 1);
|
||||||
Definir_mode_video(1024,768,MODE_SDL, 1);
|
Definir_mode_video(1024,768,0, 1);
|
||||||
|
|
||||||
Modes = SDL_ListModes(NULL, SDL_FULLSCREEN);
|
Modes = SDL_ListModes(NULL, SDL_FULLSCREEN);
|
||||||
if ((Modes != (SDL_Rect**)0) && (Modes!=(SDL_Rect**)-1))
|
if ((Modes != (SDL_Rect**)0) && (Modes!=(SDL_Rect**)-1))
|
||||||
@ -1397,7 +1397,7 @@ void Definition_des_modes_video(void)
|
|||||||
if (Indice2 >= Nb_modes_video)
|
if (Indice2 >= Nb_modes_video)
|
||||||
{
|
{
|
||||||
// Nouveau mode à ajouter à la liste
|
// Nouveau mode à ajouter à la liste
|
||||||
Definir_mode_video(Modes[Indice]->w,Modes[Indice]->h,MODE_SDL, 1);
|
Definir_mode_video(Modes[Indice]->w,Modes[Indice]->h,0, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Tri des modes : ceux trouvés par SDL ont été listés à la fin.
|
// Tri des modes : ceux trouvés par SDL ont été listés à la fin.
|
||||||
|
|||||||
14
main.c
14
main.c
@ -202,6 +202,10 @@ void Analyse_de_la_ligne_de_commande(int argc,char * argv[])
|
|||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if ( !strcmp(argv[Indice],"/tall") )
|
||||||
|
{
|
||||||
|
Pixel_ratio = PIXEL_TALL;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Si ce n'est pas un paramètre, c'est le nom du fichier à ouvrir
|
// Si ce n'est pas un paramètre, c'est le nom du fichier à ouvrir
|
||||||
@ -357,7 +361,7 @@ void Initialisation_du_programme(int argc,char * argv[])
|
|||||||
|
|
||||||
// On initialise tous les modes vidéo
|
// On initialise tous les modes vidéo
|
||||||
Definition_des_modes_video();
|
Definition_des_modes_video();
|
||||||
|
Pixel_ratio=PIXEL_SIMPLE;
|
||||||
// On initialise les données sur l'état du programme:
|
// On initialise les données sur l'état du programme:
|
||||||
// Donnée sur la sortie du programme:
|
// Donnée sur la sortie du programme:
|
||||||
Quit_demande=0;
|
Quit_demande=0;
|
||||||
@ -508,10 +512,10 @@ void Initialisation_du_programme(int argc,char * argv[])
|
|||||||
Mode_video[Mode_dans_lequel_on_demarre].Hauteur,
|
Mode_video[Mode_dans_lequel_on_demarre].Hauteur,
|
||||||
Mode_video[Mode_dans_lequel_on_demarre].Fullscreen);
|
Mode_video[Mode_dans_lequel_on_demarre].Fullscreen);
|
||||||
|
|
||||||
Principal_Largeur_image=Largeur_ecran;
|
Principal_Largeur_image=Largeur_ecran/Pixel_width;
|
||||||
Principal_Hauteur_image=Hauteur_ecran;
|
Principal_Hauteur_image=Hauteur_ecran/Pixel_height;
|
||||||
Brouillon_Largeur_image=Largeur_ecran;
|
Brouillon_Largeur_image=Largeur_ecran/Pixel_width;
|
||||||
Brouillon_Hauteur_image=Hauteur_ecran;
|
Brouillon_Hauteur_image=Hauteur_ecran/Pixel_height;
|
||||||
// Allocation de mémoire pour les différents écrans virtuels (et brosse)
|
// Allocation de mémoire pour les différents écrans virtuels (et brosse)
|
||||||
if (Initialiser_les_listes_de_backups_en_debut_de_programme(Config.Nb_pages_Undo+1,Largeur_ecran,Hauteur_ecran)==0)
|
if (Initialiser_les_listes_de_backups_en_debut_de_programme(Config.Nb_pages_Undo+1,Largeur_ecran,Hauteur_ecran)==0)
|
||||||
Erreur(ERREUR_MEMOIRE);
|
Erreur(ERREUR_MEMOIRE);
|
||||||
|
|||||||
13
moteur.c
13
moteur.c
@ -148,7 +148,7 @@ void Restaure_fond(byte *Buffer, int Pos_X, int Pos_Y, int Largeur, int Hauteur)
|
|||||||
{
|
{
|
||||||
int Indice;
|
int Indice;
|
||||||
for (Indice=0; Indice<Hauteur*Menu_Facteur_Y; Indice++)
|
for (Indice=0; Indice<Hauteur*Menu_Facteur_Y; Indice++)
|
||||||
Afficher_ligne(Pos_X,Pos_Y+Indice,Largeur*Menu_Facteur_X,Buffer+((int)Indice*Largeur*Menu_Facteur_Y));
|
Afficher_ligne(Pos_X,Pos_Y+Indice,Largeur*Menu_Facteur_X,Buffer+((int)Indice*Largeur*Menu_Facteur_X));
|
||||||
free(Buffer);
|
free(Buffer);
|
||||||
}
|
}
|
||||||
// Ecrit un pixel dans un fond de fenêtre
|
// Ecrit un pixel dans un fond de fenêtre
|
||||||
@ -494,8 +494,8 @@ void Gestion_principale(void)
|
|||||||
{
|
{
|
||||||
Effacer_curseur();
|
Effacer_curseur();
|
||||||
Initialiser_mode_video(Resize_Largeur, Resize_Hauteur, 0);
|
Initialiser_mode_video(Resize_Largeur, Resize_Hauteur, 0);
|
||||||
Mode_video[0].Largeur = Largeur_ecran;
|
Mode_video[0].Largeur = Largeur_ecran*Pixel_width;
|
||||||
Mode_video[0].Hauteur = Hauteur_ecran;
|
Mode_video[0].Hauteur = Hauteur_ecran*Pixel_height;
|
||||||
// Remise à zero des variables indiquant le Redimensionnement demandé
|
// Remise à zero des variables indiquant le Redimensionnement demandé
|
||||||
Afficher_menu();
|
Afficher_menu();
|
||||||
Afficher_ecran();
|
Afficher_ecran();
|
||||||
@ -897,14 +897,9 @@ void Gestion_principale(void)
|
|||||||
{
|
{
|
||||||
Effacer_curseur();
|
Effacer_curseur();
|
||||||
Temp_color=Couleur_debut_palette;
|
Temp_color=Couleur_debut_palette;
|
||||||
|
|
||||||
|
|
||||||
if (Config.Couleurs_separees)
|
|
||||||
Temp=Lit_pixel(Mouse_X,Mouse_Y);
|
|
||||||
else
|
|
||||||
Temp=Temp_color+
|
Temp=Temp_color+
|
||||||
((((Mouse_X/Menu_Facteur_X)-(LARGEUR_MENU+1))/Menu_Taille_couleur)<<3)+
|
((((Mouse_X/Menu_Facteur_X)-(LARGEUR_MENU+1))/Menu_Taille_couleur)<<3)+
|
||||||
((((Mouse_Y-Menu_Ordonnee)/Menu_Facteur_X)-2)>>2);
|
((((Mouse_Y-Menu_Ordonnee)/Menu_Facteur_Y)-2)>>2);
|
||||||
|
|
||||||
strcpy(Chaine,TITRE_BOUTON[Indice_bouton]);
|
strcpy(Chaine,TITRE_BOUTON[Indice_bouton]);
|
||||||
sprintf(Chaine+strlen(Chaine),"%d",Temp);
|
sprintf(Chaine+strlen(Chaine),"%d",Temp);
|
||||||
|
|||||||
471
pxsimple.c
Normal file
471
pxsimple.c
Normal file
@ -0,0 +1,471 @@
|
|||||||
|
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||||
|
|
||||||
|
Copyright 2008 Yves Rizoud
|
||||||
|
Copyright 2008 Franck Charlet
|
||||||
|
Copyright 2007 Adrien Destugues
|
||||||
|
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
|
||||||
|
|
||||||
|
Grafx2 is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; version 2
|
||||||
|
of the License.
|
||||||
|
|
||||||
|
Grafx2 is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with Grafx2; if not, see <http://www.gnu.org/licenses/> or
|
||||||
|
write to the Free Software Foundation, Inc.,
|
||||||
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <SDL/SDL.h>
|
||||||
|
#include "global.h"
|
||||||
|
#include "sdlscreen.h"
|
||||||
|
#include "divers.h"
|
||||||
|
|
||||||
|
void Pixel_Simple (word X,word Y,byte Couleur)
|
||||||
|
/* Affiche un pixel de la Couleur aux coords X;Y à l'écran */
|
||||||
|
{
|
||||||
|
*(Ecran + X + Y * Largeur_ecran)=Couleur;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte Lit_Pixel_Simple (word X,word Y)
|
||||||
|
/* On retourne la couleur du pixel aux coords données */
|
||||||
|
{
|
||||||
|
return *( Ecran + Y * Largeur_ecran + X );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Block_Simple (word Debut_X,word Debut_Y,word Largeur,word Hauteur,byte Couleur)
|
||||||
|
/* On affiche un rectangle de la couleur donnée */
|
||||||
|
{
|
||||||
|
SDL_Rect rectangle;
|
||||||
|
rectangle.x=Debut_X;
|
||||||
|
rectangle.y=Debut_Y;
|
||||||
|
rectangle.w=Largeur;
|
||||||
|
rectangle.h=Hauteur;
|
||||||
|
SDL_FillRect(Ecran_SDL,&rectangle,Couleur);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Afficher_partie_de_l_ecran_Simple (word Largeur,word Hauteur,word Largeur_image)
|
||||||
|
/* Afficher une partie de l'image telle quelle sur l'écran */
|
||||||
|
{
|
||||||
|
byte* Dest=Ecran; //On va se mettre en 0,0 dans l'écran (EDI)
|
||||||
|
byte* Src=Principal_Decalage_Y*Largeur_image+Principal_Decalage_X+Principal_Ecran; //Coords de départ ds la source (ESI)
|
||||||
|
int dx;
|
||||||
|
|
||||||
|
for(dx=Hauteur;dx!=0;dx--)
|
||||||
|
// Pour chaque ligne
|
||||||
|
{
|
||||||
|
// On fait une copie de la ligne
|
||||||
|
memcpy(Dest,Src,Largeur);
|
||||||
|
|
||||||
|
// On passe à la ligne suivante
|
||||||
|
Src+=Largeur_image;
|
||||||
|
Dest+=Largeur_ecran;
|
||||||
|
}
|
||||||
|
UpdateRect(0,0,Largeur,Hauteur);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Pixel_Preview_Normal_Simple (word X,word Y,byte Couleur)
|
||||||
|
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||||
|
* dans l'écran, en mode normal (pas en mode loupe)
|
||||||
|
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||||
|
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||||
|
{
|
||||||
|
// if(X-Principal_Decalage_X >= 0 && Y - Principal_Decalage_Y >= 0)
|
||||||
|
Pixel_Simple(X-Principal_Decalage_X,Y-Principal_Decalage_Y,Couleur);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Pixel_Preview_Loupe_Simple (word X,word Y,byte Couleur)
|
||||||
|
{
|
||||||
|
// Affiche le pixel dans la partie non zoomée
|
||||||
|
Pixel_Simple(X-Principal_Decalage_X,Y-Principal_Decalage_Y,Couleur);
|
||||||
|
|
||||||
|
// Regarde si on doit aussi l'afficher dans la partie zoomée
|
||||||
|
if (Y >= Limite_Haut_Zoom && Y <= Limite_visible_Bas_Zoom
|
||||||
|
&& X >= Limite_Gauche_Zoom && X <= Limite_visible_Droite_Zoom)
|
||||||
|
{
|
||||||
|
// On est dedans
|
||||||
|
int hauteur;
|
||||||
|
int Y_Zoom = Table_mul_facteur_zoom[Y-Loupe_Decalage_Y];
|
||||||
|
|
||||||
|
if (Menu_Ordonnee - Y_Zoom < Loupe_Facteur)
|
||||||
|
// On ne doit dessiner qu'un morceau du pixel
|
||||||
|
// sinon on dépasse sur le menu
|
||||||
|
hauteur = Menu_Ordonnee - Y_Zoom;
|
||||||
|
else
|
||||||
|
hauteur = Loupe_Facteur;
|
||||||
|
|
||||||
|
Block_Simple(
|
||||||
|
Table_mul_facteur_zoom[X-Loupe_Decalage_X]+Principal_X_Zoom,
|
||||||
|
Y_Zoom, Loupe_Facteur, hauteur, Couleur
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ligne_horizontale_XOR_Simple(word Pos_X,word Pos_Y,word Largeur)
|
||||||
|
{
|
||||||
|
//On calcule la valeur initiale de EDI:
|
||||||
|
byte* edi=Pos_Y*Largeur_ecran+Pos_X+Ecran;
|
||||||
|
|
||||||
|
int ecx;
|
||||||
|
|
||||||
|
for (ecx=0;ecx<Largeur;ecx++)
|
||||||
|
*(edi+ecx)=~*(edi+ecx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ligne_verticale_XOR_Simple(word Pos_X,word Pos_Y,word Hauteur)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
byte color;
|
||||||
|
for (i=Pos_Y;i<Pos_Y+Hauteur;i++)
|
||||||
|
{
|
||||||
|
color=*(Ecran+Pos_X+i*Largeur_ecran);
|
||||||
|
*(Ecran+Pos_X+i*Largeur_ecran)=~color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Display_brush_Color_Simple(word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,word Largeur_brosse)
|
||||||
|
{
|
||||||
|
// EDI = Position à l'écran
|
||||||
|
byte* EDI = Ecran + Pos_Y * Largeur_ecran + Pos_X;
|
||||||
|
// ESI = Position dans la brosse
|
||||||
|
byte* ESI = Brosse + Decalage_Y * Largeur_brosse + Decalage_X;
|
||||||
|
|
||||||
|
word DX,CX;
|
||||||
|
|
||||||
|
// Pour chaque ligne
|
||||||
|
for(DX = Hauteur;DX > 0; DX--)
|
||||||
|
{
|
||||||
|
// Pour chaque pixel
|
||||||
|
for(CX = Largeur;CX > 0; CX--)
|
||||||
|
{
|
||||||
|
// On vérifie que ce n'est pas la transparence
|
||||||
|
if(*ESI != Couleur_de_transparence)
|
||||||
|
{
|
||||||
|
*EDI = *ESI;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pixel suivant
|
||||||
|
ESI++; EDI++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// On passe à la ligne suivante
|
||||||
|
EDI = EDI + Largeur_ecran - Largeur;
|
||||||
|
ESI = ESI + Largeur_brosse - Largeur;
|
||||||
|
}
|
||||||
|
UpdateRect(Pos_X,Pos_Y,Largeur,Hauteur);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Display_brush_Mono_Simple(word Pos_X, word Pos_Y,
|
||||||
|
word Decalage_X, word Decalage_Y, word Largeur, word Hauteur,
|
||||||
|
byte Couleur_de_transparence, byte Couleur, word Largeur_brosse)
|
||||||
|
/* On affiche la brosse en monochrome */
|
||||||
|
{
|
||||||
|
byte* Dest=Pos_Y*Largeur_ecran+Pos_X+Ecran; // EDI = adr destination à
|
||||||
|
// l'écran
|
||||||
|
byte* Src=Largeur_brosse*Decalage_Y+Decalage_X+Brosse; // ESI = adr ds
|
||||||
|
// la brosse
|
||||||
|
int dx,cx;
|
||||||
|
|
||||||
|
for(dx=Hauteur;dx!=0;dx--)
|
||||||
|
//Pour chaque ligne
|
||||||
|
{
|
||||||
|
for(cx=Largeur;cx!=0;cx--)
|
||||||
|
//Pour chaque pixel
|
||||||
|
{
|
||||||
|
if (*Src!=Couleur_de_transparence)
|
||||||
|
*Dest=Couleur;
|
||||||
|
|
||||||
|
// On passe au pixel suivant
|
||||||
|
Src++;
|
||||||
|
Dest++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// On passe à la ligne suivante
|
||||||
|
Src+=Largeur_brosse-Largeur;
|
||||||
|
Dest+=Largeur_ecran-Largeur;
|
||||||
|
}
|
||||||
|
UpdateRect(Pos_X,Pos_Y,Largeur,Hauteur);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Clear_brush_Simple(word Pos_X,word Pos_Y,__attribute__((unused)) word Decalage_X,__attribute__((unused)) word Decalage_Y,word Largeur,word Hauteur,__attribute__((unused))byte Couleur_de_transparence,word Largeur_image)
|
||||||
|
{
|
||||||
|
byte* Dest=Ecran+Pos_X+Pos_Y*Largeur_ecran; //On va se mettre en 0,0 dans l'écran (EDI)
|
||||||
|
byte* Src = ( Pos_Y + Principal_Decalage_Y ) * Largeur_image + Pos_X + Principal_Decalage_X + Principal_Ecran; //Coords de départ ds la source (ESI)
|
||||||
|
int dx;
|
||||||
|
|
||||||
|
for(dx=Hauteur;dx!=0;dx--)
|
||||||
|
// Pour chaque ligne
|
||||||
|
{
|
||||||
|
// On fait une copie de la ligne
|
||||||
|
memcpy(Dest,Src,Largeur);
|
||||||
|
|
||||||
|
// On passe à la ligne suivante
|
||||||
|
Src+=Largeur_image;
|
||||||
|
Dest+=Largeur_ecran;
|
||||||
|
}
|
||||||
|
UpdateRect(Pos_X,Pos_Y,Largeur,Hauteur);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Affiche une brosse (arbitraire) à l'écran
|
||||||
|
void Affiche_brosse_Simple(byte * B, word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,word Largeur_brosse)
|
||||||
|
{
|
||||||
|
// EDI = Position à l'écran
|
||||||
|
byte* EDI = Ecran + Pos_Y * Largeur_ecran + Pos_X;
|
||||||
|
// ESI = Position dans la brosse
|
||||||
|
byte* ESI = B + Decalage_Y * Largeur_brosse + Decalage_X;
|
||||||
|
|
||||||
|
word DX,CX;
|
||||||
|
|
||||||
|
// Pour chaque ligne
|
||||||
|
for(DX = Hauteur;DX > 0; DX--)
|
||||||
|
{
|
||||||
|
// Pour chaque pixel
|
||||||
|
for(CX = Largeur;CX > 0; CX--)
|
||||||
|
{
|
||||||
|
// On vérifie que ce n'est pas la transparence
|
||||||
|
if(*ESI != Couleur_de_transparence)
|
||||||
|
{
|
||||||
|
*EDI = *ESI;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pixel suivant
|
||||||
|
ESI++; EDI++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// On passe à la ligne suivante
|
||||||
|
EDI = EDI + Largeur_ecran - Largeur;
|
||||||
|
ESI = ESI + Largeur_brosse - Largeur;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Remap_screen_Simple(word Pos_X,word Pos_Y,word Largeur,word Hauteur,byte * Table_de_conversion)
|
||||||
|
{
|
||||||
|
// EDI = coords a l'écran
|
||||||
|
byte* EDI = Ecran + Pos_Y * Largeur_ecran + Pos_X;
|
||||||
|
int dx,cx;
|
||||||
|
|
||||||
|
// Pour chaque ligne
|
||||||
|
for(dx=Hauteur;dx>0;dx--)
|
||||||
|
{
|
||||||
|
// Pour chaque pixel
|
||||||
|
for(cx=Largeur;cx>0;cx--)
|
||||||
|
{
|
||||||
|
*EDI = Table_de_conversion[*EDI];
|
||||||
|
EDI ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
EDI = EDI + Largeur_ecran - Largeur;
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateRect(Pos_X,Pos_Y,Largeur,Hauteur);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Afficher_une_ligne_ecran_Simple(word Pos_X,word Pos_Y,word Largeur,byte * Ligne)
|
||||||
|
/* On affiche toute une ligne de pixels. Utilisé pour les textes. */
|
||||||
|
{
|
||||||
|
memcpy(Ecran+Pos_X+Pos_Y*Largeur_ecran,Ligne,Largeur);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Afficher_une_ligne_transparente_mono_a_l_ecran_Simple(
|
||||||
|
word Pos_X, word Pos_Y, word Largeur, byte* Ligne,
|
||||||
|
byte Couleur_transparence, byte Couleur)
|
||||||
|
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||||
|
// Utilisé par les brosses en mode zoom
|
||||||
|
{
|
||||||
|
byte* Dest = Ecran+ Pos_Y * Largeur_ecran + Pos_X;
|
||||||
|
int Compteur;
|
||||||
|
// Pour chaque pixel
|
||||||
|
for(Compteur=0;Compteur<Largeur;Compteur++)
|
||||||
|
{
|
||||||
|
if (Couleur_transparence!=*Ligne)
|
||||||
|
*Dest = Couleur;
|
||||||
|
Ligne ++; // Pixel suivant
|
||||||
|
Dest++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Lire_une_ligne_ecran_Simple(word Pos_X,word Pos_Y,word Largeur,byte * Ligne)
|
||||||
|
{
|
||||||
|
memcpy(Ligne,Largeur_ecran * Pos_Y + Pos_X + Ecran,Largeur);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Afficher_partie_de_l_ecran_zoomee_Simple(
|
||||||
|
word Largeur, // Largeur non zoomée
|
||||||
|
word Hauteur, // Hauteur zoomée
|
||||||
|
word Largeur_image,byte * Buffer)
|
||||||
|
{
|
||||||
|
byte* ESI = Principal_Ecran + Loupe_Decalage_Y * Largeur_image
|
||||||
|
+ Loupe_Decalage_X;
|
||||||
|
int EDX = 0; // Ligne en cours de traitement
|
||||||
|
|
||||||
|
// Pour chaque ligne à zoomer
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
int CX;
|
||||||
|
|
||||||
|
// On éclate la ligne
|
||||||
|
Zoomer_une_ligne(ESI,Buffer,Loupe_Facteur,Largeur);
|
||||||
|
// On l'affiche Facteur fois, sur des lignes consécutives
|
||||||
|
CX = Loupe_Facteur;
|
||||||
|
// Pour chaque ligne
|
||||||
|
do{
|
||||||
|
// On affiche la ligne zoomée
|
||||||
|
Afficher_une_ligne_ecran_Simple(
|
||||||
|
Principal_X_Zoom, EDX, Largeur*Loupe_Facteur,
|
||||||
|
Buffer
|
||||||
|
);
|
||||||
|
// On passe à la suivante
|
||||||
|
EDX++;
|
||||||
|
if(EDX==Hauteur)
|
||||||
|
{
|
||||||
|
UpdateRect(Principal_X_Zoom,0,
|
||||||
|
Largeur*Loupe_Facteur,Hauteur);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
CX--;
|
||||||
|
}while (CX > 0);
|
||||||
|
ESI += Largeur_image;
|
||||||
|
}
|
||||||
|
// ATTENTION on n'arrive jamais ici !
|
||||||
|
}
|
||||||
|
|
||||||
|
void Afficher_une_ligne_transparente_a_l_ecran_Simple(word Pos_X,word Pos_Y,word Largeur,byte* Ligne,byte Couleur_transparence)
|
||||||
|
{
|
||||||
|
byte* ESI = Ligne;
|
||||||
|
byte* EDI = Ecran + Pos_Y * Largeur_ecran + Pos_X;
|
||||||
|
|
||||||
|
word cx;
|
||||||
|
|
||||||
|
// Pour chaque pixel de la ligne
|
||||||
|
for(cx = Largeur;cx > 0;cx--)
|
||||||
|
{
|
||||||
|
if(*ESI!=Couleur_transparence)
|
||||||
|
*EDI = *ESI;
|
||||||
|
ESI++;
|
||||||
|
EDI++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Affiche une partie de la brosse couleur zoomée
|
||||||
|
void Display_brush_Color_zoom_Simple(word Pos_X,word Pos_Y,
|
||||||
|
word Decalage_X,word Decalage_Y,
|
||||||
|
word Largeur, // Largeur non zoomée
|
||||||
|
word Pos_Y_Fin,byte Couleur_de_transparence,
|
||||||
|
word Largeur_brosse, // Largeur réelle de la brosse
|
||||||
|
byte * Buffer)
|
||||||
|
{
|
||||||
|
byte* ESI = Brosse+Decalage_Y*Largeur_brosse + Decalage_X;
|
||||||
|
word DX = Pos_Y;
|
||||||
|
byte bx;
|
||||||
|
|
||||||
|
// Pour chaque ligne
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
Zoomer_une_ligne(ESI,Buffer,Loupe_Facteur,Largeur);
|
||||||
|
// On affiche facteur fois la ligne zoomée
|
||||||
|
for(bx=Loupe_Facteur;bx>0;bx--)
|
||||||
|
{
|
||||||
|
Afficher_une_ligne_transparente_a_l_ecran_Simple(Pos_X,DX,Largeur*Loupe_Facteur,Buffer,Couleur_de_transparence);
|
||||||
|
DX++;
|
||||||
|
if(DX==Pos_Y_Fin)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ESI += Largeur_brosse;
|
||||||
|
}
|
||||||
|
// ATTENTION zone jamais atteinte
|
||||||
|
}
|
||||||
|
|
||||||
|
void Display_brush_Mono_zoom_Simple(word Pos_X, word Pos_Y,
|
||||||
|
word Decalage_X, word Decalage_Y,
|
||||||
|
word Largeur, // Largeur non zoomée
|
||||||
|
word Pos_Y_Fin,
|
||||||
|
byte Couleur_de_transparence, byte Couleur,
|
||||||
|
word Largeur_brosse, // Largeur réelle de la brosse
|
||||||
|
byte * Buffer
|
||||||
|
)
|
||||||
|
|
||||||
|
{
|
||||||
|
byte* ESI = Brosse + Decalage_Y * Largeur_brosse + Decalage_X;
|
||||||
|
int DX=Pos_Y;
|
||||||
|
|
||||||
|
//Pour chaque ligne à zoomer :
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
int BX;
|
||||||
|
// ESI = Ligne originale
|
||||||
|
// On éclate la ligne
|
||||||
|
Zoomer_une_ligne(ESI,Buffer,Loupe_Facteur,Largeur);
|
||||||
|
|
||||||
|
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||||
|
// lignes consécutives)
|
||||||
|
BX = Loupe_Facteur;
|
||||||
|
|
||||||
|
// Pour chaque ligne écran
|
||||||
|
do
|
||||||
|
{
|
||||||
|
// On affiche la ligne zoomée
|
||||||
|
Afficher_une_ligne_transparente_mono_a_l_ecran_Simple(
|
||||||
|
Pos_X, DX, Largeur * Loupe_Facteur,
|
||||||
|
Buffer, Couleur_de_transparence, Couleur
|
||||||
|
);
|
||||||
|
// On passe à la ligne suivante
|
||||||
|
DX++;
|
||||||
|
// On vérifie qu'on est pas à la ligne finale
|
||||||
|
if(DX == Pos_Y_Fin)
|
||||||
|
{
|
||||||
|
UpdateRect( Pos_X, Pos_Y,
|
||||||
|
Largeur * Loupe_Facteur, Pos_Y_Fin - Pos_Y );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
BX --;
|
||||||
|
}
|
||||||
|
while (BX > 0);
|
||||||
|
|
||||||
|
// Passage à la ligne suivante dans la brosse aussi
|
||||||
|
ESI+=Largeur_brosse;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Clear_brush_zoom_Simple(word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Pos_Y_Fin,__attribute__((unused)) byte Couleur_de_transparence,word Largeur_image,byte * Buffer)
|
||||||
|
{
|
||||||
|
// En fait on va recopier l'image non zoomée dans la partie zoomée !
|
||||||
|
byte* ESI = Principal_Ecran + Decalage_Y * Largeur_image + Decalage_X;
|
||||||
|
int DX = Pos_Y;
|
||||||
|
int bx;
|
||||||
|
|
||||||
|
// Pour chaque ligne à zoomer
|
||||||
|
while(1){
|
||||||
|
Zoomer_une_ligne(ESI,Buffer,Loupe_Facteur,Largeur);
|
||||||
|
|
||||||
|
bx=Loupe_Facteur;
|
||||||
|
|
||||||
|
// Pour chaque ligne
|
||||||
|
do{
|
||||||
|
Afficher_une_ligne_ecran_Simple(Pos_X,DX,
|
||||||
|
Largeur * Loupe_Facteur,Buffer);
|
||||||
|
|
||||||
|
// Ligne suivante
|
||||||
|
DX++;
|
||||||
|
if(DX==Pos_Y_Fin)
|
||||||
|
{
|
||||||
|
UpdateRect(Pos_X,Pos_Y,
|
||||||
|
Largeur*Loupe_Facteur,Pos_Y_Fin-Pos_Y);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
bx--;
|
||||||
|
}while(bx!=0);
|
||||||
|
|
||||||
|
ESI+= Largeur_image;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
47
pxsimple.h
Normal file
47
pxsimple.h
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||||
|
|
||||||
|
Copyright 2008 Yves Rizoud
|
||||||
|
Copyright 2007 Adrien Destugues
|
||||||
|
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
|
||||||
|
|
||||||
|
Grafx2 is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; version 2
|
||||||
|
of the License.
|
||||||
|
|
||||||
|
Grafx2 is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with Grafx2; if not, see <http://www.gnu.org/licenses/> or
|
||||||
|
write to the Free Software Foundation, Inc.,
|
||||||
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
#include "struct.h"
|
||||||
|
|
||||||
|
void Pixel_Simple (word X,word Y,byte Couleur);
|
||||||
|
byte Lit_Pixel_Simple (word X,word Y);
|
||||||
|
void Block_Simple (word Debut_X,word Debut_Y,word Largeur,word Hauteur,byte Couleur);
|
||||||
|
void Pixel_Preview_Normal_Simple (word X,word Y,byte Couleur);
|
||||||
|
void Pixel_Preview_Loupe_Simple (word X,word Y,byte Couleur);
|
||||||
|
void Ligne_horizontale_XOR_Simple (word Pos_X,word Pos_Y,word Largeur);
|
||||||
|
void Ligne_verticale_XOR_Simple (word Pos_X,word Pos_Y,word Hauteur);
|
||||||
|
void Display_brush_Color_Simple (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,word Largeur_brosse);
|
||||||
|
void Display_brush_Mono_Simple (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,byte Couleur,word Largeur_brosse);
|
||||||
|
void Clear_brush_Simple (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,word Largeur_image);
|
||||||
|
void Remap_screen_Simple (word Pos_X,word Pos_Y,word Largeur,word Hauteur,byte * Table_de_conversion);
|
||||||
|
void Afficher_partie_de_l_ecran_Simple (word Largeur,word Hauteur,word Largeur_image);
|
||||||
|
void Afficher_une_ligne_ecran_Simple (word Pos_X,word Pos_Y,word Largeur,byte * Ligne);
|
||||||
|
void Lire_une_ligne_ecran_Simple (word Pos_X,word Pos_Y,word Largeur,byte * Ligne);
|
||||||
|
void Afficher_partie_de_l_ecran_zoomee_Simple(word Largeur,word Hauteur,word Largeur_image,byte * Buffer);
|
||||||
|
void Display_brush_Color_zoom_Simple (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Pos_Y_Fin,byte Couleur_de_transparence,word Largeur_brosse,byte * Buffer);
|
||||||
|
void Display_brush_Mono_zoom_Simple (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Pos_Y_Fin,byte Couleur_de_transparence,byte Couleur,word Largeur_brosse,byte * Buffer);
|
||||||
|
void Clear_brush_zoom_Simple (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Pos_Y_Fin,byte Couleur_de_transparence,word Largeur_image,byte * Buffer);
|
||||||
|
void Affiche_brosse_Simple (byte * B, word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,word Largeur_brosse);
|
||||||
|
|
||||||
|
void Afficher_une_ligne_transparente_mono_a_l_ecran_Simple(
|
||||||
|
word Pos_X, word Pos_Y, word Largeur, byte* Ligne,
|
||||||
|
byte Couleur_transparence, byte Couleur);
|
||||||
|
void Afficher_une_ligne_transparente_a_l_ecran_Simple(word Pos_X,word Pos_Y,word Largeur,byte* Ligne,byte Couleur_transparence);
|
||||||
451
pxtall.c
Normal file
451
pxtall.c
Normal file
@ -0,0 +1,451 @@
|
|||||||
|
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||||
|
|
||||||
|
Copyright 2008 Yves Rizoud
|
||||||
|
Copyright 2008 Franck Charlet
|
||||||
|
Copyright 2007 Adrien Destugues
|
||||||
|
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
|
||||||
|
|
||||||
|
Grafx2 is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; version 2
|
||||||
|
of the License.
|
||||||
|
|
||||||
|
Grafx2 is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with Grafx2; if not, see <http://www.gnu.org/licenses/> or
|
||||||
|
write to the Free Software Foundation, Inc.,
|
||||||
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <SDL/SDL.h>
|
||||||
|
#include "global.h"
|
||||||
|
#include "sdlscreen.h"
|
||||||
|
#include "divers.h"
|
||||||
|
#include "pxsimple.h"
|
||||||
|
|
||||||
|
void Pixel_Tall (word X,word Y,byte Couleur)
|
||||||
|
/* Affiche un pixel de la Couleur aux coords X;Y à l'écran */
|
||||||
|
{
|
||||||
|
*(Ecran + X + Y * 2 * Largeur_ecran)=Couleur;
|
||||||
|
*(Ecran + X + (Y * 2 + 1) * Largeur_ecran)=Couleur;
|
||||||
|
}
|
||||||
|
|
||||||
|
byte Lit_Pixel_Tall (word X,word Y)
|
||||||
|
/* On retourne la couleur du pixel aux coords données */
|
||||||
|
{
|
||||||
|
return *( Ecran + Y * 2 * Largeur_ecran + X );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Block_Tall (word Debut_X,word Debut_Y,word Largeur,word Hauteur,byte Couleur)
|
||||||
|
/* On affiche un rectangle de la couleur donnée */
|
||||||
|
{
|
||||||
|
SDL_Rect rectangle;
|
||||||
|
rectangle.x=Debut_X;
|
||||||
|
rectangle.y=Debut_Y*2;
|
||||||
|
rectangle.w=Largeur;
|
||||||
|
rectangle.h=Hauteur*2;
|
||||||
|
SDL_FillRect(Ecran_SDL,&rectangle,Couleur);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Afficher_partie_de_l_ecran_Tall (word Largeur,word Hauteur,word Largeur_image)
|
||||||
|
/* Afficher une partie de l'image telle quelle sur l'écran */
|
||||||
|
{
|
||||||
|
byte* Dest=Ecran; //On va se mettre en 0,0 dans l'écran (EDI)
|
||||||
|
byte* Src=Principal_Decalage_Y*Largeur_image+Principal_Decalage_X+Principal_Ecran; //Coords de départ ds la source (ESI)
|
||||||
|
int dx;
|
||||||
|
|
||||||
|
for(dx=Hauteur;dx!=0;dx--)
|
||||||
|
// Pour chaque ligne
|
||||||
|
{
|
||||||
|
// On fait une copie de la ligne
|
||||||
|
memcpy(Dest,Src,Largeur);
|
||||||
|
Dest+=Largeur_ecran;
|
||||||
|
memcpy(Dest,Src,Largeur);
|
||||||
|
|
||||||
|
// On passe à la ligne suivante
|
||||||
|
Src+=Largeur_image;
|
||||||
|
Dest+=Largeur_ecran;
|
||||||
|
}
|
||||||
|
UpdateRect(0,0,Largeur,Hauteur);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Pixel_Preview_Normal_Tall (word X,word Y,byte Couleur)
|
||||||
|
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||||
|
* dans l'écran, en mode normal (pas en mode loupe)
|
||||||
|
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||||
|
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||||
|
{
|
||||||
|
// if(X-Principal_Decalage_X >= 0 && Y - Principal_Decalage_Y >= 0)
|
||||||
|
Pixel_Tall(X-Principal_Decalage_X,Y-Principal_Decalage_Y,Couleur);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Pixel_Preview_Loupe_Tall (word X,word Y,byte Couleur)
|
||||||
|
{
|
||||||
|
// Affiche le pixel dans la partie non zoomée
|
||||||
|
Pixel_Tall(X-Principal_Decalage_X,Y-Principal_Decalage_Y,Couleur);
|
||||||
|
|
||||||
|
// Regarde si on doit aussi l'afficher dans la partie zoomée
|
||||||
|
if (Y >= Limite_Haut_Zoom && Y <= Limite_visible_Bas_Zoom
|
||||||
|
&& X >= Limite_Gauche_Zoom && X <= Limite_visible_Droite_Zoom)
|
||||||
|
{
|
||||||
|
// On est dedans
|
||||||
|
int hauteur;
|
||||||
|
int Y_Zoom = Table_mul_facteur_zoom[Y-Loupe_Decalage_Y];
|
||||||
|
|
||||||
|
if (Menu_Ordonnee - Y_Zoom < Loupe_Facteur)
|
||||||
|
// On ne doit dessiner qu'un morceau du pixel
|
||||||
|
// sinon on dépasse sur le menu
|
||||||
|
hauteur = Menu_Ordonnee - Y_Zoom;
|
||||||
|
else
|
||||||
|
hauteur = Loupe_Facteur;
|
||||||
|
|
||||||
|
Block_Tall(
|
||||||
|
Table_mul_facteur_zoom[X-Loupe_Decalage_X]+Principal_X_Zoom,
|
||||||
|
Y_Zoom, Loupe_Facteur, hauteur, Couleur
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ligne_horizontale_XOR_Tall(word Pos_X,word Pos_Y,word Largeur)
|
||||||
|
{
|
||||||
|
//On calcule la valeur initiale de EDI:
|
||||||
|
byte* edi=Pos_Y*2*Largeur_ecran+Pos_X+Ecran;
|
||||||
|
|
||||||
|
int ecx;
|
||||||
|
|
||||||
|
for (ecx=0;ecx<Largeur;ecx++)
|
||||||
|
*(edi+ecx)=~*(edi+ecx);
|
||||||
|
|
||||||
|
edi=(Pos_Y*2+1)*Largeur_ecran+Pos_X+Ecran;
|
||||||
|
for (ecx=0;ecx<Largeur;ecx++)
|
||||||
|
*(edi+ecx)=~*(edi+ecx);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ligne_verticale_XOR_Tall(word Pos_X,word Pos_Y,word Hauteur)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
byte color;
|
||||||
|
for (i=Pos_Y*2;i<(Pos_Y+Hauteur)*2;i++)
|
||||||
|
{
|
||||||
|
color=*(Ecran+Pos_X+i*Largeur_ecran);
|
||||||
|
*(Ecran+Pos_X+i*Largeur_ecran)=~color;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Display_brush_Color_Tall(word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,word Largeur_brosse)
|
||||||
|
{
|
||||||
|
// EDI = Position à l'écran
|
||||||
|
byte* EDI = Ecran + Pos_Y * 2 * Largeur_ecran + Pos_X;
|
||||||
|
// ESI = Position dans la brosse
|
||||||
|
byte* ESI = Brosse + Decalage_Y * Largeur_brosse + Decalage_X;
|
||||||
|
|
||||||
|
word DX,CX;
|
||||||
|
|
||||||
|
// Pour chaque ligne
|
||||||
|
for(DX = Hauteur;DX > 0; DX--)
|
||||||
|
{
|
||||||
|
// Pour chaque pixel
|
||||||
|
for(CX = Largeur;CX > 0; CX--)
|
||||||
|
{
|
||||||
|
// On vérifie que ce n'est pas la transparence
|
||||||
|
if(*ESI != Couleur_de_transparence)
|
||||||
|
{
|
||||||
|
*EDI = *ESI;
|
||||||
|
*(EDI+Largeur_ecran) = *ESI;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pixel suivant
|
||||||
|
ESI++; EDI++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// On passe à la ligne suivante
|
||||||
|
EDI = EDI + 2 * Largeur_ecran - Largeur;
|
||||||
|
ESI = ESI + Largeur_brosse - Largeur;
|
||||||
|
}
|
||||||
|
UpdateRect(Pos_X,Pos_Y,Largeur,Hauteur);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Display_brush_Mono_Tall(word Pos_X, word Pos_Y,
|
||||||
|
word Decalage_X, word Decalage_Y, word Largeur, word Hauteur,
|
||||||
|
byte Couleur_de_transparence, byte Couleur, word Largeur_brosse)
|
||||||
|
/* On affiche la brosse en monochrome */
|
||||||
|
{
|
||||||
|
byte* Dest=Pos_Y*2*Largeur_ecran+Pos_X+Ecran; // EDI = adr destination à
|
||||||
|
// l'écran
|
||||||
|
byte* Src=Largeur_brosse*Decalage_Y+Decalage_X+Brosse; // ESI = adr ds
|
||||||
|
// la brosse
|
||||||
|
int dx,cx;
|
||||||
|
|
||||||
|
for(dx=Hauteur;dx!=0;dx--)
|
||||||
|
//Pour chaque ligne
|
||||||
|
{
|
||||||
|
for(cx=Largeur;cx!=0;cx--)
|
||||||
|
//Pour chaque pixel
|
||||||
|
{
|
||||||
|
if (*Src!=Couleur_de_transparence)
|
||||||
|
{
|
||||||
|
*Dest=Couleur;
|
||||||
|
*(Dest+Largeur_ecran)=Couleur;
|
||||||
|
}
|
||||||
|
|
||||||
|
// On passe au pixel suivant
|
||||||
|
Src++;
|
||||||
|
Dest++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// On passe à la ligne suivante
|
||||||
|
Src+=Largeur_brosse-Largeur;
|
||||||
|
Dest+=2*Largeur_ecran-Largeur;
|
||||||
|
}
|
||||||
|
UpdateRect(Pos_X,Pos_Y,Largeur,Hauteur);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Clear_brush_Tall(word Pos_X,word Pos_Y,__attribute__((unused)) word Decalage_X,__attribute__((unused)) word Decalage_Y,word Largeur,word Hauteur,__attribute__((unused))byte Couleur_de_transparence,word Largeur_image)
|
||||||
|
{
|
||||||
|
byte* Dest=Ecran+Pos_X+Pos_Y*2*Largeur_ecran; //On va se mettre en 0,0 dans l'écran (EDI)
|
||||||
|
byte* Src = ( Pos_Y + Principal_Decalage_Y ) * Largeur_image + Pos_X + Principal_Decalage_X + Principal_Ecran; //Coords de départ ds la source (ESI)
|
||||||
|
int dx;
|
||||||
|
|
||||||
|
for(dx=Hauteur;dx!=0;dx--)
|
||||||
|
// Pour chaque ligne
|
||||||
|
{
|
||||||
|
// On fait une copie de la ligne
|
||||||
|
memcpy(Dest,Src,Largeur);
|
||||||
|
Dest+=Largeur_ecran;
|
||||||
|
memcpy(Dest,Src,Largeur);
|
||||||
|
|
||||||
|
// On passe à la ligne suivante
|
||||||
|
Src+=Largeur_image;
|
||||||
|
Dest+=Largeur_ecran;
|
||||||
|
}
|
||||||
|
UpdateRect(Pos_X,Pos_Y,Largeur,Hauteur);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Affiche une brosse (arbitraire) à l'écran
|
||||||
|
void Affiche_brosse_Tall(byte * B, word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,word Largeur_brosse)
|
||||||
|
{
|
||||||
|
// EDI = Position à l'écran
|
||||||
|
byte* EDI = Ecran + Pos_Y * 2 * Largeur_ecran + Pos_X;
|
||||||
|
// ESI = Position dans la brosse
|
||||||
|
byte* ESI = B + Decalage_Y * Largeur_brosse + Decalage_X;
|
||||||
|
|
||||||
|
word DX,CX;
|
||||||
|
|
||||||
|
// Pour chaque ligne
|
||||||
|
for(DX = Hauteur;DX > 0; DX--)
|
||||||
|
{
|
||||||
|
// Pour chaque pixel
|
||||||
|
for(CX = Largeur;CX > 0; CX--)
|
||||||
|
{
|
||||||
|
// On vérifie que ce n'est pas la transparence
|
||||||
|
if(*ESI != Couleur_de_transparence)
|
||||||
|
{
|
||||||
|
*EDI = *ESI;
|
||||||
|
*(EDI+Largeur_ecran) = *ESI;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pixel suivant
|
||||||
|
ESI++; EDI++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// On passe à la ligne suivante
|
||||||
|
EDI = EDI + Largeur_ecran * 2 - Largeur;
|
||||||
|
ESI = ESI + Largeur_brosse - Largeur;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Remap_screen_Tall(word Pos_X,word Pos_Y,word Largeur,word Hauteur,byte * Table_de_conversion)
|
||||||
|
{
|
||||||
|
// EDI = coords a l'écran
|
||||||
|
byte* EDI = Ecran + Pos_Y * 2 * Largeur_ecran + Pos_X;
|
||||||
|
int dx,cx;
|
||||||
|
|
||||||
|
// Pour chaque ligne
|
||||||
|
for(dx=Hauteur*2;dx>0;dx--)
|
||||||
|
{
|
||||||
|
// Pour chaque pixel
|
||||||
|
for(cx=Largeur;cx>0;cx--)
|
||||||
|
{
|
||||||
|
*EDI = Table_de_conversion[*EDI];
|
||||||
|
EDI ++;
|
||||||
|
}
|
||||||
|
|
||||||
|
EDI = EDI + Largeur_ecran - Largeur;
|
||||||
|
}
|
||||||
|
|
||||||
|
UpdateRect(Pos_X,Pos_Y,Largeur,Hauteur);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Afficher_une_ligne_ecran_Tall(word Pos_X,word Pos_Y,word Largeur,byte * Ligne)
|
||||||
|
/* On affiche toute une ligne de pixels. Utilisé pour les textes. */
|
||||||
|
{
|
||||||
|
memcpy(Ecran+Pos_X+Pos_Y*2*Largeur_ecran,Ligne,Largeur);
|
||||||
|
memcpy(Ecran+Pos_X+(Pos_Y*2+1)*Largeur_ecran,Ligne,Largeur);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Lire_une_ligne_ecran_Tall(word Pos_X,word Pos_Y,word Largeur,byte * Ligne)
|
||||||
|
{
|
||||||
|
memcpy(Ligne,Largeur_ecran * 2 * Pos_Y + Pos_X + Ecran,Largeur);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Afficher_partie_de_l_ecran_zoomee_Tall(
|
||||||
|
word Largeur, // Largeur non zoomée
|
||||||
|
word Hauteur, // Hauteur zoomée
|
||||||
|
word Largeur_image,byte * Buffer)
|
||||||
|
{
|
||||||
|
byte* ESI = Principal_Ecran + Loupe_Decalage_Y * Largeur_image
|
||||||
|
+ Loupe_Decalage_X;
|
||||||
|
int EDX = 0; // Ligne en cours de traitement
|
||||||
|
|
||||||
|
// Pour chaque ligne à zoomer
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
int CX;
|
||||||
|
|
||||||
|
// On éclate la ligne
|
||||||
|
Zoomer_une_ligne(ESI,Buffer,Loupe_Facteur,Largeur);
|
||||||
|
// On l'affiche Facteur fois, sur des lignes consécutives
|
||||||
|
CX = Loupe_Facteur*2;
|
||||||
|
// Pour chaque ligne
|
||||||
|
do{
|
||||||
|
// On affiche la ligne zoomée
|
||||||
|
Afficher_une_ligne_ecran_Simple(
|
||||||
|
Principal_X_Zoom, EDX, Largeur*Loupe_Facteur,
|
||||||
|
Buffer
|
||||||
|
);
|
||||||
|
// On passe à la suivante
|
||||||
|
EDX++;
|
||||||
|
if(EDX==Hauteur*2)
|
||||||
|
{
|
||||||
|
UpdateRect(Principal_X_Zoom,0,
|
||||||
|
Largeur*Loupe_Facteur,Hauteur);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
CX--;
|
||||||
|
}while (CX > 0);
|
||||||
|
ESI += Largeur_image;
|
||||||
|
}
|
||||||
|
// ATTENTION on n'arrive jamais ici !
|
||||||
|
}
|
||||||
|
|
||||||
|
// Affiche une partie de la brosse couleur zoomée
|
||||||
|
void Display_brush_Color_zoom_Tall(word Pos_X,word Pos_Y,
|
||||||
|
word Decalage_X,word Decalage_Y,
|
||||||
|
word Largeur, // Largeur non zoomée
|
||||||
|
word Pos_Y_Fin,byte Couleur_de_transparence,
|
||||||
|
word Largeur_brosse, // Largeur réelle de la brosse
|
||||||
|
byte * Buffer)
|
||||||
|
{
|
||||||
|
byte* ESI = Brosse+Decalage_Y*Largeur_brosse + Decalage_X;
|
||||||
|
word DX = Pos_Y;
|
||||||
|
byte bx;
|
||||||
|
|
||||||
|
// Pour chaque ligne
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
Zoomer_une_ligne(ESI,Buffer,Loupe_Facteur,Largeur);
|
||||||
|
// On affiche facteur fois la ligne zoomée
|
||||||
|
for(bx=Loupe_Facteur;bx>0;bx--)
|
||||||
|
{
|
||||||
|
Afficher_une_ligne_transparente_a_l_ecran_Simple(Pos_X,DX*2,Largeur*Loupe_Facteur,Buffer,Couleur_de_transparence);
|
||||||
|
memcpy(Ecran + (DX*2 +1) * Largeur_ecran + Pos_X, Ecran + DX*2* Largeur_ecran + Pos_X, Largeur*Loupe_Facteur);
|
||||||
|
DX++;
|
||||||
|
if(DX==Pos_Y_Fin)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ESI += Largeur_brosse;
|
||||||
|
}
|
||||||
|
// ATTENTION zone jamais atteinte
|
||||||
|
}
|
||||||
|
|
||||||
|
void Display_brush_Mono_zoom_Tall(word Pos_X, word Pos_Y,
|
||||||
|
word Decalage_X, word Decalage_Y,
|
||||||
|
word Largeur, // Largeur non zoomée
|
||||||
|
word Pos_Y_Fin,
|
||||||
|
byte Couleur_de_transparence, byte Couleur,
|
||||||
|
word Largeur_brosse, // Largeur réelle de la brosse
|
||||||
|
byte * Buffer
|
||||||
|
)
|
||||||
|
|
||||||
|
{
|
||||||
|
byte* ESI = Brosse + Decalage_Y * Largeur_brosse + Decalage_X;
|
||||||
|
int DX=Pos_Y*2;
|
||||||
|
|
||||||
|
//Pour chaque ligne à zoomer :
|
||||||
|
while(1)
|
||||||
|
{
|
||||||
|
int BX;
|
||||||
|
// ESI = Ligne originale
|
||||||
|
// On éclate la ligne
|
||||||
|
Zoomer_une_ligne(ESI,Buffer,Loupe_Facteur,Largeur);
|
||||||
|
|
||||||
|
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||||
|
// lignes consécutives)
|
||||||
|
BX = Loupe_Facteur*2;
|
||||||
|
|
||||||
|
// Pour chaque ligne écran
|
||||||
|
do
|
||||||
|
{
|
||||||
|
// On affiche la ligne zoomée
|
||||||
|
Afficher_une_ligne_transparente_mono_a_l_ecran_Simple(
|
||||||
|
Pos_X, DX, Largeur * Loupe_Facteur,
|
||||||
|
Buffer, Couleur_de_transparence, Couleur
|
||||||
|
);
|
||||||
|
// On passe à la ligne suivante
|
||||||
|
DX++;
|
||||||
|
// On vérifie qu'on est pas à la ligne finale
|
||||||
|
if(DX == Pos_Y_Fin*2)
|
||||||
|
{
|
||||||
|
UpdateRect( Pos_X, Pos_Y,
|
||||||
|
Largeur * Loupe_Facteur, Pos_Y_Fin - Pos_Y );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
BX --;
|
||||||
|
}
|
||||||
|
while (BX > 0);
|
||||||
|
|
||||||
|
// Passage à la ligne suivante dans la brosse aussi
|
||||||
|
ESI+=Largeur_brosse;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Clear_brush_zoom_Tall(word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Pos_Y_Fin,__attribute__((unused)) byte Couleur_de_transparence,word Largeur_image,byte * Buffer)
|
||||||
|
{
|
||||||
|
// En fait on va recopier l'image non zoomée dans la partie zoomée !
|
||||||
|
byte* ESI = Principal_Ecran + Decalage_Y * Largeur_image + Decalage_X;
|
||||||
|
int DX = Pos_Y;
|
||||||
|
int bx;
|
||||||
|
|
||||||
|
// Pour chaque ligne à zoomer
|
||||||
|
while(1){
|
||||||
|
Zoomer_une_ligne(ESI,Buffer,Loupe_Facteur,Largeur);
|
||||||
|
|
||||||
|
bx=Loupe_Facteur;
|
||||||
|
|
||||||
|
// Pour chaque ligne
|
||||||
|
do{
|
||||||
|
Afficher_une_ligne_ecran_Tall(Pos_X,DX,
|
||||||
|
Largeur * Loupe_Facteur,Buffer);
|
||||||
|
|
||||||
|
// Ligne suivante
|
||||||
|
DX++;
|
||||||
|
if(DX==Pos_Y_Fin)
|
||||||
|
{
|
||||||
|
UpdateRect(Pos_X,Pos_Y,
|
||||||
|
Largeur*Loupe_Facteur,Pos_Y_Fin-Pos_Y);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
bx--;
|
||||||
|
}while(bx!=0);
|
||||||
|
|
||||||
|
ESI+= Largeur_image;
|
||||||
|
}
|
||||||
|
}
|
||||||
42
pxtall.h
Normal file
42
pxtall.h
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||||
|
|
||||||
|
Copyright 2008 Yves Rizoud
|
||||||
|
Copyright 2007 Adrien Destugues
|
||||||
|
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
|
||||||
|
|
||||||
|
Grafx2 is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; version 2
|
||||||
|
of the License.
|
||||||
|
|
||||||
|
Grafx2 is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with Grafx2; if not, see <http://www.gnu.org/licenses/> or
|
||||||
|
write to the Free Software Foundation, Inc.,
|
||||||
|
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
*/
|
||||||
|
#include "struct.h"
|
||||||
|
|
||||||
|
void Pixel_Tall (word X,word Y,byte Couleur);
|
||||||
|
byte Lit_Pixel_Tall (word X,word Y);
|
||||||
|
void Block_Tall (word Debut_X,word Debut_Y,word Largeur,word Hauteur,byte Couleur);
|
||||||
|
void Pixel_Preview_Normal_Tall (word X,word Y,byte Couleur);
|
||||||
|
void Pixel_Preview_Loupe_Tall (word X,word Y,byte Couleur);
|
||||||
|
void Ligne_horizontale_XOR_Tall (word Pos_X,word Pos_Y,word Largeur);
|
||||||
|
void Ligne_verticale_XOR_Tall (word Pos_X,word Pos_Y,word Hauteur);
|
||||||
|
void Display_brush_Color_Tall (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,word Largeur_brosse);
|
||||||
|
void Display_brush_Mono_Tall (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,byte Couleur,word Largeur_brosse);
|
||||||
|
void Clear_brush_Tall (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,word Largeur_image);
|
||||||
|
void Remap_screen_Tall (word Pos_X,word Pos_Y,word Largeur,word Hauteur,byte * Table_de_conversion);
|
||||||
|
void Afficher_partie_de_l_ecran_Tall (word Largeur,word Hauteur,word Largeur_image);
|
||||||
|
void Afficher_une_ligne_ecran_Tall (word Pos_X,word Pos_Y,word Largeur,byte * Ligne);
|
||||||
|
void Lire_une_ligne_ecran_Tall (word Pos_X,word Pos_Y,word Largeur,byte * Ligne);
|
||||||
|
void Afficher_partie_de_l_ecran_zoomee_Tall(word Largeur,word Hauteur,word Largeur_image,byte * Buffer);
|
||||||
|
void Display_brush_Color_zoom_Tall (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Pos_Y_Fin,byte Couleur_de_transparence,word Largeur_brosse,byte * Buffer);
|
||||||
|
void Display_brush_Mono_zoom_Tall (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Pos_Y_Fin,byte Couleur_de_transparence,byte Couleur,word Largeur_brosse,byte * Buffer);
|
||||||
|
void Clear_brush_zoom_Tall (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Pos_Y_Fin,byte Couleur_de_transparence,word Largeur_image,byte * Buffer);
|
||||||
|
void Affiche_brosse_Tall (byte * B, word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,word Largeur_brosse);
|
||||||
457
sdlscreen.c
457
sdlscreen.c
@ -25,7 +25,6 @@
|
|||||||
#include <SDL/SDL.h>
|
#include <SDL/SDL.h>
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
#include "sdlscreen.h"
|
#include "sdlscreen.h"
|
||||||
#include "divers.h"
|
|
||||||
#include "erreurs.h"
|
#include "erreurs.h"
|
||||||
#include "graph.h"
|
#include "graph.h"
|
||||||
|
|
||||||
@ -45,460 +44,18 @@
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void Set_Mode_SDL(int *Largeur, int *Hauteur, int Fullscreen)
|
||||||
void Pixel_SDL (word X,word Y,byte Couleur)
|
|
||||||
/* Affiche un pixel de la Couleur aux coords X;Y à l'écran */
|
|
||||||
{
|
|
||||||
*(Ecran + X + Y * Largeur_ecran)=Couleur;
|
|
||||||
}
|
|
||||||
|
|
||||||
byte Lit_Pixel_SDL (word X,word Y)
|
|
||||||
/* On retourne la couleur du pixel aux coords données */
|
|
||||||
{
|
|
||||||
return *( Ecran + Y * Largeur_ecran + X );
|
|
||||||
}
|
|
||||||
|
|
||||||
void Afficher_partie_de_l_ecran_SDL (word Largeur,word Hauteur,word Largeur_image)
|
|
||||||
/* Afficher une partie de l'image telle quelle sur l'écran */
|
|
||||||
{
|
|
||||||
byte* Dest=Ecran; //On va se mettre en 0,0 dans l'écran (EDI)
|
|
||||||
byte* Src=Principal_Decalage_Y*Largeur_image+Principal_Decalage_X+Principal_Ecran; //Coords de départ ds la source (ESI)
|
|
||||||
int dx;
|
|
||||||
|
|
||||||
for(dx=Hauteur;dx!=0;dx--)
|
|
||||||
// Pour chaque ligne
|
|
||||||
{
|
|
||||||
// On fait une copie de la ligne
|
|
||||||
memcpy(Dest,Src,Largeur);
|
|
||||||
|
|
||||||
// On passe à la ligne suivante
|
|
||||||
Src+=Largeur_image;
|
|
||||||
Dest+=Largeur_ecran;
|
|
||||||
}
|
|
||||||
UpdateRect(0,0,Largeur,Hauteur);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Block_SDL (word Debut_X,word Debut_Y,word Largeur,word Hauteur,byte Couleur)
|
|
||||||
/* On affiche un rectangle de la couleur donnée */
|
|
||||||
{
|
|
||||||
SDL_Rect rectangle;
|
|
||||||
rectangle.x=Debut_X;
|
|
||||||
rectangle.y=Debut_Y;
|
|
||||||
rectangle.w=Largeur;
|
|
||||||
rectangle.h=Hauteur;
|
|
||||||
SDL_FillRect(Ecran_SDL,&rectangle,Couleur);
|
|
||||||
// UpdateRect(Debut_X,Debut_Y,Largeur,Hauteur);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Pixel_Preview_Normal_SDL (word X,word Y,byte Couleur)
|
|
||||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
|
||||||
* dans l'écran, en mode normal (pas en mode loupe)
|
|
||||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
|
||||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
|
||||||
{
|
|
||||||
// if(X-Principal_Decalage_X >= 0 && Y - Principal_Decalage_Y >= 0)
|
|
||||||
Pixel_SDL(X-Principal_Decalage_X,Y-Principal_Decalage_Y,Couleur);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Pixel_Preview_Loupe_SDL (word X,word Y,byte Couleur)
|
|
||||||
{
|
|
||||||
// Affiche le pixel dans la partie non zoomée
|
|
||||||
Pixel_SDL(X-Principal_Decalage_X,Y-Principal_Decalage_Y,Couleur);
|
|
||||||
|
|
||||||
// Regarde si on doit aussi l'afficher dans la partie zoomée
|
|
||||||
if (Y >= Limite_Haut_Zoom && Y <= Limite_visible_Bas_Zoom
|
|
||||||
&& X >= Limite_Gauche_Zoom && X <= Limite_visible_Droite_Zoom)
|
|
||||||
{
|
|
||||||
// On est dedans
|
|
||||||
int hauteur;
|
|
||||||
int Y_Zoom = Table_mul_facteur_zoom[Y-Loupe_Decalage_Y];
|
|
||||||
|
|
||||||
if (Menu_Ordonnee - Y_Zoom < Loupe_Facteur)
|
|
||||||
// On ne doit dessiner qu'un morceau du pixel
|
|
||||||
// sinon on dépasse sur le menu
|
|
||||||
hauteur = Menu_Ordonnee - Y_Zoom;
|
|
||||||
else
|
|
||||||
hauteur = Loupe_Facteur;
|
|
||||||
|
|
||||||
Block_SDL(
|
|
||||||
Table_mul_facteur_zoom[X-Loupe_Decalage_X]+Principal_X_Zoom,
|
|
||||||
Y_Zoom, Loupe_Facteur, hauteur, Couleur
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Ligne_horizontale_XOR_SDL(word Pos_X,word Pos_Y,word Largeur)
|
|
||||||
{
|
|
||||||
//On calcule la valeur initiale de EDI:
|
|
||||||
byte* edi=Pos_Y*Largeur_ecran+Pos_X+Ecran;
|
|
||||||
|
|
||||||
int ecx;
|
|
||||||
|
|
||||||
for (ecx=0;ecx<Largeur;ecx++)
|
|
||||||
*(edi+ecx)=~*(edi+ecx);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Ligne_verticale_XOR_SDL (word Pos_X,word Pos_Y,word Hauteur)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
byte color;
|
|
||||||
for (i=Pos_Y;i<Pos_Y+Hauteur;i++)
|
|
||||||
{
|
|
||||||
color=*(Ecran+Pos_X+i*Largeur_ecran);
|
|
||||||
*(Ecran+Pos_X+i*Largeur_ecran)=~color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Display_brush_Color_SDL (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,word Largeur_brosse)
|
|
||||||
{
|
|
||||||
// EDI = Position à l'écran
|
|
||||||
byte* EDI = Ecran + Pos_Y * Largeur_ecran + Pos_X;
|
|
||||||
// ESI = Position dans la brosse
|
|
||||||
byte* ESI = Brosse + Decalage_Y * Largeur_brosse + Decalage_X;
|
|
||||||
|
|
||||||
word DX,CX;
|
|
||||||
|
|
||||||
// Pour chaque ligne
|
|
||||||
for(DX = Hauteur;DX > 0; DX--)
|
|
||||||
{
|
|
||||||
// Pour chaque pixel
|
|
||||||
for(CX = Largeur;CX > 0; CX--)
|
|
||||||
{
|
|
||||||
// On vérifie que ce n'est pas la transparence
|
|
||||||
if(*ESI != Couleur_de_transparence)
|
|
||||||
{
|
|
||||||
*EDI = *ESI;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pixel suivant
|
|
||||||
ESI++; EDI++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// On passe à la ligne suivante
|
|
||||||
EDI = EDI + Largeur_ecran - Largeur;
|
|
||||||
ESI = ESI + Largeur_brosse - Largeur;
|
|
||||||
}
|
|
||||||
UpdateRect(Pos_X,Pos_Y,Largeur,Hauteur);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Display_brush_Mono_SDL (word Pos_X, word Pos_Y,
|
|
||||||
word Decalage_X, word Decalage_Y, word Largeur, word Hauteur,
|
|
||||||
byte Couleur_de_transparence, byte Couleur, word Largeur_brosse)
|
|
||||||
/* On affiche la brosse en monochrome */
|
|
||||||
{
|
|
||||||
byte* Dest=Pos_Y*Largeur_ecran+Pos_X+Ecran; // EDI = adr destination à
|
|
||||||
// l'écran
|
|
||||||
byte* Src=Largeur_brosse*Decalage_Y+Decalage_X+Brosse; // ESI = adr ds
|
|
||||||
// la brosse
|
|
||||||
int dx,cx;
|
|
||||||
|
|
||||||
for(dx=Hauteur;dx!=0;dx--)
|
|
||||||
//Pour chaque ligne
|
|
||||||
{
|
|
||||||
for(cx=Largeur;cx!=0;cx--)
|
|
||||||
//Pour chaque pixel
|
|
||||||
{
|
|
||||||
if (*Src!=Couleur_de_transparence)
|
|
||||||
*Dest=Couleur;
|
|
||||||
|
|
||||||
// On passe au pixel suivant
|
|
||||||
Src++;
|
|
||||||
Dest++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// On passe à la ligne suivante
|
|
||||||
Src+=Largeur_brosse-Largeur;
|
|
||||||
Dest+=Largeur_ecran-Largeur;
|
|
||||||
}
|
|
||||||
UpdateRect(Pos_X,Pos_Y,Largeur,Hauteur);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Clear_brush_SDL (word Pos_X,word Pos_Y,__attribute__((unused)) word Decalage_X,__attribute__((unused)) word Decalage_Y,word Largeur,word Hauteur,__attribute__((unused))byte Couleur_de_transparence,word Largeur_image)
|
|
||||||
{
|
|
||||||
byte* Dest=Ecran+Pos_X+Pos_Y*Largeur_ecran; //On va se mettre en 0,0 dans l'écran (EDI)
|
|
||||||
byte* Src = ( Pos_Y + Principal_Decalage_Y ) * Largeur_image + Pos_X + Principal_Decalage_X + Principal_Ecran; //Coords de départ ds la source (ESI)
|
|
||||||
int dx;
|
|
||||||
|
|
||||||
for(dx=Hauteur;dx!=0;dx--)
|
|
||||||
// Pour chaque ligne
|
|
||||||
{
|
|
||||||
// On fait une copie de la ligne
|
|
||||||
memcpy(Dest,Src,Largeur);
|
|
||||||
|
|
||||||
// On passe à la ligne suivante
|
|
||||||
Src+=Largeur_image;
|
|
||||||
Dest+=Largeur_ecran;
|
|
||||||
}
|
|
||||||
UpdateRect(Pos_X,Pos_Y,Largeur,Hauteur);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Affiche une brosse (arbitraire) à l'écran
|
|
||||||
void Affiche_brosse_SDL(byte * B, word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,word Largeur_brosse)
|
|
||||||
{
|
|
||||||
// EDI = Position à l'écran
|
|
||||||
byte* EDI = Ecran + Pos_Y * Largeur_ecran + Pos_X;
|
|
||||||
// ESI = Position dans la brosse
|
|
||||||
byte* ESI = B + Decalage_Y * Largeur_brosse + Decalage_X;
|
|
||||||
|
|
||||||
word DX,CX;
|
|
||||||
|
|
||||||
// Pour chaque ligne
|
|
||||||
for(DX = Hauteur;DX > 0; DX--)
|
|
||||||
{
|
|
||||||
// Pour chaque pixel
|
|
||||||
for(CX = Largeur;CX > 0; CX--)
|
|
||||||
{
|
|
||||||
// On vérifie que ce n'est pas la transparence
|
|
||||||
if(*ESI != Couleur_de_transparence)
|
|
||||||
{
|
|
||||||
*EDI = *ESI;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Pixel suivant
|
|
||||||
ESI++; EDI++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// On passe à la ligne suivante
|
|
||||||
EDI = EDI + Largeur_ecran - Largeur;
|
|
||||||
ESI = ESI + Largeur_brosse - Largeur;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Remap_screen_SDL (word Pos_X,word Pos_Y,word Largeur,word Hauteur,byte * Table_de_conversion)
|
|
||||||
{
|
|
||||||
// EDI = coords a l'écran
|
|
||||||
byte* EDI = Ecran + Pos_Y * Largeur_ecran + Pos_X;
|
|
||||||
int dx,cx;
|
|
||||||
|
|
||||||
// Pour chaque ligne
|
|
||||||
for(dx=Hauteur;dx>0;dx--)
|
|
||||||
{
|
|
||||||
// Pour chaque pixel
|
|
||||||
for(cx=Largeur;cx>0;cx--)
|
|
||||||
{
|
|
||||||
*EDI = Table_de_conversion[*EDI];
|
|
||||||
EDI ++;
|
|
||||||
}
|
|
||||||
|
|
||||||
EDI = EDI + Largeur_ecran - Largeur;
|
|
||||||
}
|
|
||||||
|
|
||||||
UpdateRect(Pos_X,Pos_Y,Largeur,Hauteur);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Afficher_une_ligne_ecran_SDL (word Pos_X,word Pos_Y,word Largeur,byte * Ligne)
|
|
||||||
/* On affiche toute une ligne de pixels. Utilisé pour les textes. */
|
|
||||||
{
|
|
||||||
memcpy(Ecran+Pos_X+Pos_Y*Largeur_ecran,Ligne,Largeur);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Afficher_une_ligne_transparente_mono_a_l_ecran_SDL(
|
|
||||||
word Pos_X, word Pos_Y, word Largeur, byte* Ligne,
|
|
||||||
byte Couleur_transparence, byte Couleur)
|
|
||||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
|
||||||
// Utilisé par les brosses en mode zoom
|
|
||||||
{
|
|
||||||
byte* Dest = Ecran+ Pos_Y * Largeur_ecran + Pos_X;
|
|
||||||
int Compteur;
|
|
||||||
// Pour chaque pixel
|
|
||||||
for(Compteur=0;Compteur<Largeur;Compteur++)
|
|
||||||
{
|
|
||||||
if (Couleur_transparence!=*Ligne)
|
|
||||||
*Dest = Couleur;
|
|
||||||
Ligne ++; // Pixel suivant
|
|
||||||
Dest++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Lire_une_ligne_ecran_SDL (word Pos_X,word Pos_Y,word Largeur,byte * Ligne)
|
|
||||||
{
|
|
||||||
memcpy(Ligne,Largeur_ecran * Pos_Y + Pos_X + Ecran,Largeur);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Afficher_partie_de_l_ecran_zoomee_SDL(
|
|
||||||
word Largeur, // Largeur non zoomée
|
|
||||||
word Hauteur, // Hauteur zoomée
|
|
||||||
word Largeur_image,byte * Buffer)
|
|
||||||
{
|
|
||||||
byte* ESI = Principal_Ecran + Loupe_Decalage_Y * Largeur_image
|
|
||||||
+ Loupe_Decalage_X;
|
|
||||||
int EDX = 0; // Ligne en cours de traitement
|
|
||||||
|
|
||||||
// Pour chaque ligne à zoomer
|
|
||||||
while(1)
|
|
||||||
{
|
|
||||||
int CX;
|
|
||||||
|
|
||||||
// On éclate la ligne
|
|
||||||
Zoomer_une_ligne(ESI,Buffer,Loupe_Facteur,Largeur);
|
|
||||||
// On l'affiche Facteur fois, sur des lignes consécutives
|
|
||||||
CX = Loupe_Facteur;
|
|
||||||
// Pour chaque ligne
|
|
||||||
do{
|
|
||||||
// On affiche la ligne zoomée
|
|
||||||
Afficher_une_ligne_ecran_SDL(
|
|
||||||
Principal_X_Zoom, EDX, Largeur*Loupe_Facteur,
|
|
||||||
Buffer
|
|
||||||
);
|
|
||||||
// On passe à la suivante
|
|
||||||
EDX++;
|
|
||||||
if(EDX==Hauteur)
|
|
||||||
{
|
|
||||||
UpdateRect(Principal_X_Zoom,0,
|
|
||||||
Largeur*Loupe_Facteur,Hauteur);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
CX--;
|
|
||||||
}while (CX > 0);
|
|
||||||
ESI += Largeur_image;
|
|
||||||
}
|
|
||||||
// ATTENTION on n'arrive jamais ici !
|
|
||||||
}
|
|
||||||
|
|
||||||
void Afficher_une_ligne_transparente_a_l_ecran_SDL(word Pos_X,word Pos_Y,word Largeur,byte* Ligne,byte Couleur_transparence)
|
|
||||||
{
|
|
||||||
byte* ESI = Ligne;
|
|
||||||
byte* EDI = Ecran + Pos_Y * Largeur_ecran + Pos_X;
|
|
||||||
|
|
||||||
word cx;
|
|
||||||
|
|
||||||
// Pour chaque pixel de la ligne
|
|
||||||
for(cx = Largeur;cx > 0;cx--)
|
|
||||||
{
|
|
||||||
if(*ESI!=Couleur_transparence)
|
|
||||||
*EDI = *ESI;
|
|
||||||
ESI++;
|
|
||||||
EDI++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Affiche une partie de la brosse couleur zoomée
|
|
||||||
void Display_brush_Color_zoom_SDL (word Pos_X,word Pos_Y,
|
|
||||||
word Decalage_X,word Decalage_Y,
|
|
||||||
word Largeur, // Largeur non zoomée
|
|
||||||
word Pos_Y_Fin,byte Couleur_de_transparence,
|
|
||||||
word Largeur_brosse, // Largeur réelle de la brosse
|
|
||||||
byte * Buffer)
|
|
||||||
{
|
|
||||||
byte* ESI = Brosse+Decalage_Y*Largeur_brosse + Decalage_X;
|
|
||||||
word DX = Pos_Y;
|
|
||||||
byte bx;
|
|
||||||
|
|
||||||
// Pour chaque ligne
|
|
||||||
while(1)
|
|
||||||
{
|
|
||||||
Zoomer_une_ligne(ESI,Buffer,Loupe_Facteur,Largeur);
|
|
||||||
// On affiche facteur fois la ligne zoomée
|
|
||||||
for(bx=Loupe_Facteur;bx>0;bx--)
|
|
||||||
{
|
|
||||||
Afficher_une_ligne_transparente_a_l_ecran_SDL(Pos_X,DX,Largeur*Loupe_Facteur,Buffer,Couleur_de_transparence);
|
|
||||||
DX++;
|
|
||||||
if(DX==Pos_Y_Fin)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ESI += Largeur_brosse;
|
|
||||||
}
|
|
||||||
// ATTENTION zone jamais atteinte
|
|
||||||
}
|
|
||||||
|
|
||||||
void Display_brush_Mono_zoom_SDL (word Pos_X, word Pos_Y,
|
|
||||||
word Decalage_X, word Decalage_Y,
|
|
||||||
word Largeur, // Largeur non zoomée
|
|
||||||
word Pos_Y_Fin,
|
|
||||||
byte Couleur_de_transparence, byte Couleur,
|
|
||||||
word Largeur_brosse, // Largeur réelle de la brosse
|
|
||||||
byte * Buffer
|
|
||||||
)
|
|
||||||
|
|
||||||
{
|
|
||||||
byte* ESI = Brosse + Decalage_Y * Largeur_brosse + Decalage_X;
|
|
||||||
int DX=Pos_Y;
|
|
||||||
|
|
||||||
//Pour chaque ligne à zoomer :
|
|
||||||
while(1)
|
|
||||||
{
|
|
||||||
int BX;
|
|
||||||
// ESI = Ligne originale
|
|
||||||
// On éclate la ligne
|
|
||||||
Zoomer_une_ligne(ESI,Buffer,Loupe_Facteur,Largeur);
|
|
||||||
|
|
||||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
|
||||||
// lignes consécutives)
|
|
||||||
BX = Loupe_Facteur;
|
|
||||||
|
|
||||||
// Pour chaque ligne écran
|
|
||||||
do
|
|
||||||
{
|
|
||||||
// On affiche la ligne zoomée
|
|
||||||
Afficher_une_ligne_transparente_mono_a_l_ecran_SDL(
|
|
||||||
Pos_X, DX, Largeur * Loupe_Facteur,
|
|
||||||
Buffer, Couleur_de_transparence, Couleur
|
|
||||||
);
|
|
||||||
// On passe à la ligne suivante
|
|
||||||
DX++;
|
|
||||||
// On vérifie qu'on est pas à la ligne finale
|
|
||||||
if(DX == Pos_Y_Fin)
|
|
||||||
{
|
|
||||||
UpdateRect( Pos_X, Pos_Y,
|
|
||||||
Largeur * Loupe_Facteur, Pos_Y_Fin - Pos_Y );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
BX --;
|
|
||||||
}
|
|
||||||
while (BX > 0);
|
|
||||||
|
|
||||||
// Passage à la ligne suivante dans la brosse aussi
|
|
||||||
ESI+=Largeur_brosse;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Clear_brush_zoom_SDL (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Pos_Y_Fin,__attribute__((unused)) byte Couleur_de_transparence,word Largeur_image,byte * Buffer)
|
|
||||||
{
|
|
||||||
// En fait on va recopier l'image non zoomée dans la partie zoomée !
|
|
||||||
byte* ESI = Principal_Ecran + Decalage_Y * Largeur_image + Decalage_X;
|
|
||||||
int DX = Pos_Y;
|
|
||||||
int bx;
|
|
||||||
|
|
||||||
// Pour chaque ligne à zoomer
|
|
||||||
while(1){
|
|
||||||
Zoomer_une_ligne(ESI,Buffer,Loupe_Facteur,Largeur);
|
|
||||||
|
|
||||||
bx=Loupe_Facteur;
|
|
||||||
|
|
||||||
// Pour chaque ligne
|
|
||||||
do{
|
|
||||||
Afficher_une_ligne_ecran_SDL(Pos_X,DX,
|
|
||||||
Largeur * Loupe_Facteur,Buffer);
|
|
||||||
|
|
||||||
// Ligne suivante
|
|
||||||
DX++;
|
|
||||||
if(DX==Pos_Y_Fin)
|
|
||||||
{
|
|
||||||
UpdateRect(Pos_X,Pos_Y,
|
|
||||||
Largeur*Loupe_Facteur,Pos_Y_Fin-Pos_Y);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
bx--;
|
|
||||||
}while(bx!=0);
|
|
||||||
|
|
||||||
ESI+= Largeur_image;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void Set_Mode_SDL()
|
|
||||||
/* On règle la résolution de l'écran */
|
/* On règle la résolution de l'écran */
|
||||||
{
|
{
|
||||||
Ecran_SDL=SDL_SetVideoMode(Largeur_ecran,Hauteur_ecran,8,SDL_FULLSCREEN*Plein_ecran|SDL_RESIZABLE);
|
Ecran_SDL=SDL_SetVideoMode(*Largeur,*Hauteur,8,(Fullscreen?SDL_FULLSCREEN:0)|SDL_RESIZABLE);
|
||||||
if(Ecran_SDL != NULL)
|
if(Ecran_SDL != NULL)
|
||||||
{
|
{
|
||||||
// Vérification du mode obtenu (ce n'est pas toujours celui demandé)
|
// Vérification du mode obtenu (ce n'est pas toujours celui demandé)
|
||||||
if (Ecran_SDL->w != Largeur_ecran || Ecran_SDL->h != Hauteur_ecran)
|
if (Ecran_SDL->w != *Largeur || Ecran_SDL->h != *Hauteur)
|
||||||
{
|
{
|
||||||
DEBUG("Erreur mode video obtenu différent de celui demandé !!",0);
|
DEBUG("Erreur mode video obtenu différent de celui demandé !!",0);
|
||||||
Largeur_ecran = Ecran_SDL->w;
|
*Largeur = Ecran_SDL->w;
|
||||||
Hauteur_ecran = Ecran_SDL->h;
|
*Hauteur = Ecran_SDL->h;
|
||||||
}
|
}
|
||||||
Ecran=Ecran_SDL->pixels;
|
Ecran=Ecran_SDL->pixels;
|
||||||
}
|
}
|
||||||
@ -552,7 +109,7 @@ void Flush_update(void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SDL_UpdateRect(Ecran_SDL, Max(Min_X,0), Max(Min_Y,0), Min(Largeur_ecran, Max_X-Min_X), Min(Hauteur_ecran, Max_Y-Min_Y));
|
SDL_UpdateRect(Ecran_SDL, Max(Min_X,0)*Pixel_width, Max(Min_Y,0)*Pixel_height, Min(Largeur_ecran, Max_X-Min_X)*Pixel_width, Min(Hauteur_ecran, Max_Y-Min_Y)*Pixel_height);
|
||||||
|
|
||||||
Min_X=Min_Y=10000;
|
Min_X=Min_Y=10000;
|
||||||
Max_X=Max_Y=0;
|
Max_X=Max_Y=0;
|
||||||
@ -564,7 +121,7 @@ void Flush_update(void)
|
|||||||
void UpdateRect(short X, short Y, unsigned short Largeur, unsigned short Hauteur)
|
void UpdateRect(short X, short Y, unsigned short Largeur, unsigned short Hauteur)
|
||||||
{
|
{
|
||||||
#if (METHODE_UPDATE == METHODE_UPDATE_MULTI_RECTANGLE)
|
#if (METHODE_UPDATE == METHODE_UPDATE_MULTI_RECTANGLE)
|
||||||
SDL_UpdateRect(Ecran_SDL, (X), (Y), (Largeur), (Hauteur));
|
SDL_UpdateRect(Ecran_SDL, X*Pixel_width, Y*Pixel_height, Largeur*Pixel_width, Hauteur*Pixel_height);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (METHODE_UPDATE == METHODE_UPDATE_PAR_CUMUL)
|
#if (METHODE_UPDATE == METHODE_UPDATE_PAR_CUMUL)
|
||||||
|
|||||||
22
sdlscreen.h
22
sdlscreen.h
@ -25,26 +25,7 @@
|
|||||||
#include <SDL/SDL.h>
|
#include <SDL/SDL.h>
|
||||||
#include "struct.h"
|
#include "struct.h"
|
||||||
|
|
||||||
void Pixel_SDL (word X,word Y,byte Couleur);
|
void Set_Mode_SDL(int *,int *,int);
|
||||||
byte Lit_Pixel_SDL (word X,word Y);
|
|
||||||
void Block_SDL (word Debut_X,word Debut_Y,word Largeur,word Hauteur,byte Couleur);
|
|
||||||
void Block_SDL_Fast (word Debut_X,word Debut_Y,word Largeur,word Hauteur,byte Couleur);
|
|
||||||
void Pixel_Preview_Normal_SDL (word X,word Y,byte Couleur);
|
|
||||||
void Pixel_Preview_Loupe_SDL (word X,word Y,byte Couleur);
|
|
||||||
void Ligne_horizontale_XOR_SDL(word Pos_X,word Pos_Y,word Largeur);
|
|
||||||
void Ligne_verticale_XOR_SDL (word Pos_X,word Pos_Y,word Hauteur);
|
|
||||||
void Display_brush_Color_SDL (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,word Largeur_brosse);
|
|
||||||
void Display_brush_Mono_SDL (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,byte Couleur,word Largeur_brosse);
|
|
||||||
void Clear_brush_SDL (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,word Largeur_image);
|
|
||||||
void Remap_screen_SDL (word Pos_X,word Pos_Y,word Largeur,word Hauteur,byte * Table_de_conversion);
|
|
||||||
void Afficher_partie_de_l_ecran_SDL (word Largeur,word Hauteur,word Largeur_image);
|
|
||||||
void Afficher_une_ligne_ecran_SDL (word Pos_X,word Pos_Y,word Largeur,byte * Ligne);
|
|
||||||
void Lire_une_ligne_ecran_SDL (word Pos_X,word Pos_Y,word Largeur,byte * Ligne);
|
|
||||||
void Afficher_partie_de_l_ecran_zoomee_SDL(word Largeur,word Hauteur,word Largeur_image,byte * Buffer);
|
|
||||||
void Display_brush_Color_zoom_SDL(word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Pos_Y_Fin,byte Couleur_de_transparence,word Largeur_brosse,byte * Buffer);
|
|
||||||
void Display_brush_Mono_zoom_SDL (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Pos_Y_Fin,byte Couleur_de_transparence,byte Couleur,word Largeur_brosse,byte * Buffer);
|
|
||||||
void Clear_brush_zoom_SDL (word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Pos_Y_Fin,byte Couleur_de_transparence,word Largeur_image,byte * Buffer);
|
|
||||||
void Set_Mode_SDL();
|
|
||||||
void Gere_Evenement_SDL(SDL_Event * event);
|
void Gere_Evenement_SDL(SDL_Event * event);
|
||||||
|
|
||||||
SDL_Rect ** Liste_Modes_Videos_SDL;
|
SDL_Rect ** Liste_Modes_Videos_SDL;
|
||||||
@ -54,6 +35,5 @@
|
|||||||
void Flush_update(void);
|
void Flush_update(void);
|
||||||
byte * Surface_en_bytefield(SDL_Surface *Source, byte * Destination);
|
byte * Surface_en_bytefield(SDL_Surface *Source, byte * Destination);
|
||||||
SDL_Color Conversion_couleur_SDL(byte);
|
SDL_Color Conversion_couleur_SDL(byte);
|
||||||
void Affiche_brosse_SDL(byte * B, word Pos_X,word Pos_Y,word Decalage_X,word Decalage_Y,word Largeur,word Hauteur,byte Couleur_de_transparence,word Largeur_brosse);
|
|
||||||
|
|
||||||
#endif // SDLSCREEN_H_INCLUDED
|
#endif // SDLSCREEN_H_INCLUDED
|
||||||
|
|||||||
1
struct.h
1
struct.h
@ -48,6 +48,7 @@ typedef void (* fonction_procsline) (word,word,word,byte *);
|
|||||||
typedef void (* fonction_display_zoom) (word,word,word,byte *);
|
typedef void (* fonction_display_zoom) (word,word,word,byte *);
|
||||||
typedef void (* fonction_display_brush_Color_zoom) (word,word,word,word,word,word,byte,word,byte *);
|
typedef void (* fonction_display_brush_Color_zoom) (word,word,word,word,word,word,byte,word,byte *);
|
||||||
typedef void (* fonction_display_brush_Mono_zoom) (word,word,word,word,word,word,byte,byte,word,byte *);
|
typedef void (* fonction_display_brush_Mono_zoom) (word,word,word,word,word,word,byte,byte,word,byte *);
|
||||||
|
typedef void (* fonction_affiche_brosse) (byte *,word,word,word,word,word,word,byte,word);
|
||||||
|
|
||||||
struct __attribute__ ((__packed__)) Composantes
|
struct __attribute__ ((__packed__)) Composantes
|
||||||
{
|
{
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user