Some sources converted from Unicode to ANSI, and removed some warnings for mingw (implicit include of libc)

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@401 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud 2008-12-18 15:08:23 +00:00
parent fb6d1100dc
commit 77206f2baa
2 changed files with 189 additions and 186 deletions

182
brush.c
View File

@ -25,6 +25,8 @@
*/ */
#include <math.h> #include <math.h>
#include <stdlib.h>
#include <string.h> // memset()
#include "global.h" #include "global.h"
#include "graph.h" #include "graph.h"
@ -33,8 +35,8 @@
#include "windows.h" #include "windows.h"
#include "sdlscreen.h" #include "sdlscreen.h"
// Calcul de redimensionnement du pinceau pour éviter les débordements de // Calcul de redimensionnement du pinceau pour éviter les débordements de
// l'écran et de l'image // l'écran et de l'image
void Calculer_dimensions_clipees(short * X,short * Y,short * Largeur,short * Hauteur) void Calculer_dimensions_clipees(short * X,short * Y,short * Largeur,short * Hauteur)
{ {
if ((*X)<Limite_Gauche) if ((*X)<Limite_Gauche)
@ -60,8 +62,8 @@ void Calculer_dimensions_clipees(short * X,short * Y,short * Largeur,short * Hau
} }
} }
// -- Calcul de redimensionnement du pinceau pour éviter les débordements // -- Calcul de redimensionnement du pinceau pour éviter les débordements
// de l'écran zoomé et de l'image -- // de l'écran zoomé et de l'image --
void Calculer_dimensions_clipees_zoom(short * X,short * Y,short * Largeur,short * Hauteur) void Calculer_dimensions_clipees_zoom(short * X,short * Y,short * Largeur,short * Hauteur)
{ {
@ -89,24 +91,24 @@ void Calculer_dimensions_clipees_zoom(short * X,short * Y,short * Largeur,short
} }
// -- Afficher le pinceau (de façon définitive ou non) -- // -- Afficher le pinceau (de façon définitive ou non) --
void Afficher_pinceau(short X,short Y,byte Couleur,byte Preview) void Afficher_pinceau(short X,short Y,byte Couleur,byte Preview)
// X,Y: position du centre du pinceau // X,Y: position du centre du pinceau
// Couleur: couleur à appliquer au pinceau // Couleur: couleur à appliquer au pinceau
// Preview: "Il ne faut l'afficher qu'à l'écran" // Preview: "Il ne faut l'afficher qu'à l'écran"
{ {
short Debut_X; // Position X (dans l'image) à partir de laquelle on short Debut_X; // Position X (dans l'image) à partir de laquelle on
// affiche la brosse/pinceau // affiche la brosse/pinceau
short Debut_Y; // Position Y (dans l'image) à partir de laquelle on short Debut_Y; // Position Y (dans l'image) à partir de laquelle on
// affiche la brosse/pinceau // affiche la brosse/pinceau
short Largeur; // Largeur dans l'écran selon laquelle on affiche la short Largeur; // Largeur dans l'écran selon laquelle on affiche la
// brosse/pinceau // brosse/pinceau
short Hauteur; // Hauteur dans l'écran selon laquelle on affiche la short Hauteur; // Hauteur dans l'écran selon laquelle on affiche la
// brosse/pinceau // brosse/pinceau
short Debut_Compteur_X; // Position X (dans la brosse/pinceau) à partir short Debut_Compteur_X; // Position X (dans la brosse/pinceau) à partir
// de laquelle on affiche la brosse/pinceau // de laquelle on affiche la brosse/pinceau
short Debut_Compteur_Y; // Position Y (dans la brosse/pinceau) à partir short Debut_Compteur_Y; // Position Y (dans la brosse/pinceau) à partir
// de laquelle on affiche la brosse/pinceau // de laquelle on affiche la brosse/pinceau
short Pos_X; // Position X (dans l'image) en cours d'affichage short Pos_X; // Position X (dans l'image) en cours d'affichage
short Pos_Y; // Position Y (dans l'image) en cours d'affichage short Pos_Y; // Position Y (dans l'image) en cours d'affichage
@ -114,15 +116,15 @@ void Afficher_pinceau(short X,short Y,byte Couleur,byte Preview)
// d'affichage // d'affichage
short Compteur_Y; // Position Y (dans la brosse/pinceau) en cours short Compteur_Y; // Position Y (dans la brosse/pinceau) en cours
// d'affichage // d'affichage
short Fin_Compteur_X; // Position X ou s'arrête l'affichade de la short Fin_Compteur_X; // Position X ou s'arrête l'affichade de la
// brosse/pinceau // brosse/pinceau
short Fin_Compteur_Y; // Position Y ou s'arrête l'affichade de la short Fin_Compteur_Y; // Position Y ou s'arrête l'affichade de la
// brosse/pinceau // brosse/pinceau
byte Couleur_temporaire; // Couleur de la brosse en cours d'affichage byte Couleur_temporaire; // Couleur de la brosse en cours d'affichage
int Position; int Position;
byte * Temp; byte * Temp;
if (!(Preview && Mouse_K)) // Si bouton enfoncé & preview > pas de dessin if (!(Preview && Mouse_K)) // Si bouton enfoncé & preview > pas de dessin
switch (Pinceau_Forme) switch (Pinceau_Forme)
{ {
case FORME_PINCEAU_POINT : // !!! TOUJOURS EN PREVIEW !!! case FORME_PINCEAU_POINT : // !!! TOUJOURS EN PREVIEW !!!
@ -475,25 +477,25 @@ void Afficher_pinceau(short X,short Y,byte Couleur,byte Preview)
void Effacer_pinceau(short X,short Y) void Effacer_pinceau(short X,short Y)
// X,Y: position du centre du pinceau // X,Y: position du centre du pinceau
{ {
short Debut_X; // Position X (dans l'image) à partir de laquelle on short Debut_X; // Position X (dans l'image) à partir de laquelle on
// affiche la brosse/pinceau // affiche la brosse/pinceau
short Debut_Y; // Position Y (dans l'image) à partir de laquelle on short Debut_Y; // Position Y (dans l'image) à partir de laquelle on
// affiche la brosse/pinceau // affiche la brosse/pinceau
short Largeur; // Largeur dans l'écran selon laquelle on affiche la short Largeur; // Largeur dans l'écran selon laquelle on affiche la
// brosse/pinceau // brosse/pinceau
short Hauteur; // Hauteur dans l'écran selon laquelle on affiche la short Hauteur; // Hauteur dans l'écran selon laquelle on affiche la
// brosse/pinceau // brosse/pinceau
short Debut_Compteur_X; // Position X (dans la brosse/pinceau) à partir short Debut_Compteur_X; // Position X (dans la brosse/pinceau) à partir
// de laquelle on affiche la brosse/pinceau // de laquelle on affiche la brosse/pinceau
short Debut_Compteur_Y; // Position Y (dans la brosse/pinceau) à partir short Debut_Compteur_Y; // Position Y (dans la brosse/pinceau) à partir
// de laquelle on affiche la brosse/pinceau // de laquelle on affiche la brosse/pinceau
//short Pos_X; // Position X (dans l'image) en cours d'affichage //short Pos_X; // Position X (dans l'image) en cours d'affichage
//short Pos_Y; // Position Y (dans l'image) en cours d'affichage //short Pos_Y; // Position Y (dans l'image) en cours d'affichage
//short Compteur_X; // Position X (dans la brosse/pinceau) en cours //short Compteur_X; // Position X (dans la brosse/pinceau) en cours
//d'affichage //d'affichage
//short Compteur_Y; // Position Y (dans la brosse/pinceau) en cours d'affichage //short Compteur_Y; // Position Y (dans la brosse/pinceau) en cours d'affichage
short Fin_Compteur_X; // Position X ou s'arrête l'affichade de la brosse/pinceau short Fin_Compteur_X; // Position X ou s'arrête l'affichade de la brosse/pinceau
short Fin_Compteur_Y; // Position Y ou s'arrête l'affichade de la brosse/pinceau short Fin_Compteur_Y; // Position Y ou s'arrête l'affichade de la brosse/pinceau
byte * Temp; byte * Temp;
if (!Mouse_K) if (!Mouse_K)
@ -632,10 +634,10 @@ void Capturer_brosse(short Debut_X,short Debut_Y,short Fin_X,short Fin_Y,short E
if ((Debut_X<Principal_Largeur_image) && (Debut_Y<Principal_Hauteur_image)) if ((Debut_X<Principal_Largeur_image) && (Debut_Y<Principal_Hauteur_image))
{ {
// On met les décalages du tiling à 0 pour eviter toute incohérence. // On met les décalages du tiling à 0 pour eviter toute incohérence.
// Si par hasard on voulait les mettre à // Si par hasard on voulait les mettre à
// min(Tiling_Decalage_?,Brosse_?a??eur-1) // min(Tiling_Decalage_?,Brosse_?a??eur-1)
// il faudrait penser à les initialiser à 0 dans "MAIN.C". // il faudrait penser à les initialiser à 0 dans "MAIN.C".
Tiling_Decalage_X=0; Tiling_Decalage_X=0;
Tiling_Decalage_Y=0; Tiling_Decalage_Y=0;
@ -670,7 +672,7 @@ void Capturer_brosse(short Debut_X,short Debut_Y,short Fin_X,short Fin_Y,short E
Smear_Brosse_Hauteur=(Brosse_Hauteur>TAILLE_MAXI_PINCEAU)?Brosse_Hauteur:TAILLE_MAXI_PINCEAU; Smear_Brosse_Hauteur=(Brosse_Hauteur>TAILLE_MAXI_PINCEAU)?Brosse_Hauteur:TAILLE_MAXI_PINCEAU;
Smear_Brosse=(byte *)malloc(((long)Smear_Brosse_Hauteur)*Smear_Brosse_Largeur); Smear_Brosse=(byte *)malloc(((long)Smear_Brosse_Hauteur)*Smear_Brosse_Largeur);
if (!Smear_Brosse) // On ne peut même pas allouer la brosse du smear! if (!Smear_Brosse) // On ne peut même pas allouer la brosse du smear!
{ {
Erreur(0); Erreur(0);
@ -738,11 +740,11 @@ void Remap_brosse(void)
{ {
short Pos_X; // Variable de balayage de la brosse short Pos_X; // Variable de balayage de la brosse
short Pos_Y; // Variable de balayage de la brosse short Pos_Y; // Variable de balayage de la brosse
byte Utilisee[256]; // Tableau de booléens "La couleur est utilisée" byte Utilisee[256]; // Tableau de booléens "La couleur est utilisée"
int Couleur; int Couleur;
// On commence par initialiser le tableau de booléens à faux // On commence par initialiser le tableau de booléens à faux
for (Couleur=0;Couleur<=255;Couleur++) for (Couleur=0;Couleur<=255;Couleur++)
Utilisee[Couleur]=0; Utilisee[Couleur]=0;
@ -751,32 +753,32 @@ void Remap_brosse(void)
for (Pos_X=0;Pos_X<Brosse_Largeur;Pos_X++) for (Pos_X=0;Pos_X<Brosse_Largeur;Pos_X++)
Utilisee[Lit_pixel_dans_brosse(Pos_X,Pos_Y)]=1; Utilisee[Lit_pixel_dans_brosse(Pos_X,Pos_Y)]=1;
// On n'est pas censé remapper la couleur de transparence, sinon la brosse // On n'est pas censé remapper la couleur de transparence, sinon la brosse
// changera de forme, donc on dit pour l'instant qu'elle n'est pas utilisée // changera de forme, donc on dit pour l'instant qu'elle n'est pas utilisée
// ainsi on ne s'embêtera pas à la recalculer // ainsi on ne s'embêtera pas à la recalculer
Utilisee[Back_color]=0; Utilisee[Back_color]=0;
// On va maintenant se servir de la table "Utilisee" comme table de // On va maintenant se servir de la table "Utilisee" comme table de
// conversion: pour chaque indice, la table donne une couleur de // conversion: pour chaque indice, la table donne une couleur de
// remplacement. // remplacement.
// Note : Seules les couleurs utilisées on besoin d'êtres recalculées: les // Note : Seules les couleurs utilisées on besoin d'êtres recalculées: les
// autres ne seront jamais consultées dans la nouvelle table de // autres ne seront jamais consultées dans la nouvelle table de
// conversion puisque elles n'existent pas dans la brosse, donc elles // conversion puisque elles n'existent pas dans la brosse, donc elles
// ne seront pas utilisées par Remap_brush_LOWLEVEL. // ne seront pas utilisées par Remap_brush_LOWLEVEL.
for (Couleur=0;Couleur<=255;Couleur++) for (Couleur=0;Couleur<=255;Couleur++)
if (Utilisee[Couleur]) if (Utilisee[Couleur])
Utilisee[Couleur]=Meilleure_couleur(Brouillon_Palette[Couleur].R,Brouillon_Palette[Couleur].V,Brouillon_Palette[Couleur].B); Utilisee[Couleur]=Meilleure_couleur(Brouillon_Palette[Couleur].R,Brouillon_Palette[Couleur].V,Brouillon_Palette[Couleur].B);
// Il reste une couleur non calculée dans la table qu'il faut mettre à // Il reste une couleur non calculée dans la table qu'il faut mettre à
// jour: c'est la couleur de fond. On l'avait inhibée pour éviter son // jour: c'est la couleur de fond. On l'avait inhibée pour éviter son
// calcul inutile, mais comme il est possible qu'elle soit quand même dans // calcul inutile, mais comme il est possible qu'elle soit quand même dans
// la brosse, on va mettre dans la table une relation d'équivalence entre // la brosse, on va mettre dans la table une relation d'équivalence entre
// les deux palettes: comme on ne veut pas que la couleur soit remplacée, // les deux palettes: comme on ne veut pas que la couleur soit remplacée,
// on va dire qu'on veut qu'elle soit remplacée par la couleur en question. // on va dire qu'on veut qu'elle soit remplacée par la couleur en question.
Utilisee[Back_color]=Back_color; Utilisee[Back_color]=Back_color;
// Maintenant qu'on a une super table de conversion qui n'a que le nom // Maintenant qu'on a une super table de conversion qui n'a que le nom
// qui craint un peu, on peut faire l'échange dans la brosse de toutes les // qui craint un peu, on peut faire l'échange dans la brosse de toutes les
// teintes. // teintes.
Remap_general_LOWLEVEL(Utilisee,Brosse,Brosse_Largeur,Brosse_Hauteur,Brosse_Largeur); Remap_general_LOWLEVEL(Utilisee,Brosse,Brosse_Largeur,Brosse_Hauteur,Brosse_Largeur);
//Remap_brush_LOWLEVEL(Utilisee); //Remap_brush_LOWLEVEL(Utilisee);
@ -800,7 +802,7 @@ void Outline_brush(void)
if (Nouvelle_brosse) if (Nouvelle_brosse)
{ {
// On remplit la bordure ajoutée par la Backcolor // On remplit la bordure ajoutée par la Backcolor
memset(Nouvelle_brosse,Back_color,((long)Largeur)*Hauteur); memset(Nouvelle_brosse,Back_color,((long)Largeur)*Hauteur);
// On copie la brosse courante dans la nouvelle // On copie la brosse courante dans la nouvelle
@ -821,7 +823,7 @@ void Outline_brush(void)
Largeur-=2; Largeur-=2;
Hauteur-=2; Hauteur-=2;
// Si on "outline" avec une couleur différente de la Back_color on y va! // Si on "outline" avec une couleur différente de la Back_color on y va!
if (Fore_color!=Back_color) if (Fore_color!=Back_color)
{ {
// 1er balayage (horizontal) // 1er balayage (horizontal)
@ -847,12 +849,12 @@ void Outline_brush(void)
} }
} }
} }
// Cas du dernier pixel à droite de la ligne // Cas du dernier pixel à droite de la ligne
if (Etat) if (Etat)
Pixel_dans_brosse(Pos_X,Pos_Y,Fore_color); Pixel_dans_brosse(Pos_X,Pos_Y,Fore_color);
} }
// 2ème balayage (vertical) // 2ème balayage (vertical)
for (Pos_X=1; Pos_X<Brosse_Largeur-1; Pos_X++) for (Pos_X=1; Pos_X<Brosse_Largeur-1; Pos_X++)
{ {
Etat=0; Etat=0;
@ -885,16 +887,16 @@ void Outline_brush(void)
Brosse_Decalage_X=(Brosse_Largeur>>1); Brosse_Decalage_X=(Brosse_Largeur>>1);
Brosse_Decalage_Y=(Brosse_Hauteur>>1); Brosse_Decalage_Y=(Brosse_Hauteur>>1);
free(Temporaire); // Libération de l'ancienne brosse free(Temporaire); // Libération de l'ancienne brosse
// Réallocation d'un buffer de Smear // Réallocation d'un buffer de Smear
free(Smear_Brosse); free(Smear_Brosse);
Smear_Brosse_Largeur=(Brosse_Largeur>TAILLE_MAXI_PINCEAU)?Brosse_Largeur:TAILLE_MAXI_PINCEAU; Smear_Brosse_Largeur=(Brosse_Largeur>TAILLE_MAXI_PINCEAU)?Brosse_Largeur:TAILLE_MAXI_PINCEAU;
Smear_Brosse_Hauteur=(Brosse_Hauteur>TAILLE_MAXI_PINCEAU)?Brosse_Hauteur:TAILLE_MAXI_PINCEAU; Smear_Brosse_Hauteur=(Brosse_Hauteur>TAILLE_MAXI_PINCEAU)?Brosse_Hauteur:TAILLE_MAXI_PINCEAU;
Smear_Brosse=(byte *)malloc(((long)Smear_Brosse_Largeur)*Smear_Brosse_Hauteur); Smear_Brosse=(byte *)malloc(((long)Smear_Brosse_Largeur)*Smear_Brosse_Hauteur);
} }
else else
Erreur(0); // Pas assez de mémoire! Erreur(0); // Pas assez de mémoire!
} }
@ -959,12 +961,12 @@ void Nibble_brush(void)
} }
} }
} }
// Cas du dernier pixel à droite de la ligne // Cas du dernier pixel à droite de la ligne
if (Temporaire[((Pos_Y+1)*Largeur)+Pos_X+1]==Back_color) if (Temporaire[((Pos_Y+1)*Largeur)+Pos_X+1]==Back_color)
Pixel_dans_brosse(Pos_X-1,Pos_Y,Back_color); Pixel_dans_brosse(Pos_X-1,Pos_Y,Back_color);
} }
// 2ème balayage (vertical) // 2ème balayage (vertical)
for (Pos_X=0; Pos_X<Brosse_Largeur; Pos_X++) for (Pos_X=0; Pos_X<Brosse_Largeur; Pos_X++)
{ {
Etat=(Temporaire[Largeur+Pos_X+1]!=Back_color);; Etat=(Temporaire[Largeur+Pos_X+1]!=Back_color);;
@ -997,16 +999,16 @@ void Nibble_brush(void)
Brosse_Decalage_X=(Brosse_Largeur>>1); Brosse_Decalage_X=(Brosse_Largeur>>1);
Brosse_Decalage_Y=(Brosse_Hauteur>>1); Brosse_Decalage_Y=(Brosse_Hauteur>>1);
free(Temporaire); // Libération de l'ancienne brosse free(Temporaire); // Libération de l'ancienne brosse
// Réallocation d'un buffer de Smear // Réallocation d'un buffer de Smear
free(Smear_Brosse); free(Smear_Brosse);
Smear_Brosse_Largeur=(Brosse_Largeur>TAILLE_MAXI_PINCEAU)?Brosse_Largeur:TAILLE_MAXI_PINCEAU; Smear_Brosse_Largeur=(Brosse_Largeur>TAILLE_MAXI_PINCEAU)?Brosse_Largeur:TAILLE_MAXI_PINCEAU;
Smear_Brosse_Hauteur=(Brosse_Hauteur>TAILLE_MAXI_PINCEAU)?Brosse_Hauteur:TAILLE_MAXI_PINCEAU; Smear_Brosse_Hauteur=(Brosse_Hauteur>TAILLE_MAXI_PINCEAU)?Brosse_Hauteur:TAILLE_MAXI_PINCEAU;
Smear_Brosse=(byte *)malloc(((long)Smear_Brosse_Largeur)*Smear_Brosse_Hauteur); Smear_Brosse=(byte *)malloc(((long)Smear_Brosse_Largeur)*Smear_Brosse_Hauteur);
} }
else else
Erreur(0); // Pas assez de mémoire! Erreur(0); // Pas assez de mémoire!
} }
} }
@ -1040,7 +1042,7 @@ void Capturer_brosse_au_lasso(int Vertices, short * Points,short Effacement)
Fin_Y=Pos_Y; Fin_Y=Pos_Y;
} }
// On clippe ces bornes à l'écran: // On clippe ces bornes à l'écran:
if (Debut_X<Limite_Gauche) if (Debut_X<Limite_Gauche)
Debut_X=Limite_Gauche; Debut_X=Limite_Gauche;
if (Fin_X>Limite_Droite) if (Fin_X>Limite_Droite)
@ -1055,10 +1057,10 @@ void Capturer_brosse_au_lasso(int Vertices, short * Points,short Effacement)
if ((Debut_X<Principal_Largeur_image) && (Debut_Y<Principal_Hauteur_image)) if ((Debut_X<Principal_Largeur_image) && (Debut_Y<Principal_Hauteur_image))
{ {
// On met les décalages du tiling à 0 pour eviter toute incohérence. // On met les décalages du tiling à 0 pour eviter toute incohérence.
// Si par hasard on voulait les mettre à // Si par hasard on voulait les mettre à
// min(Tiling_Decalage_?,Brosse_?a??eur-1) // min(Tiling_Decalage_?,Brosse_?a??eur-1)
// il faudrait penser à les initialiser à 0 dans "MAIN.C". // il faudrait penser à les initialiser à 0 dans "MAIN.C".
Tiling_Decalage_X=0; Tiling_Decalage_X=0;
Tiling_Decalage_Y=0; Tiling_Decalage_Y=0;
@ -1088,7 +1090,7 @@ void Capturer_brosse_au_lasso(int Vertices, short * Points,short Effacement)
Smear_Brosse_Hauteur=(Brosse_Hauteur>TAILLE_MAXI_PINCEAU)?Brosse_Hauteur:TAILLE_MAXI_PINCEAU; Smear_Brosse_Hauteur=(Brosse_Hauteur>TAILLE_MAXI_PINCEAU)?Brosse_Hauteur:TAILLE_MAXI_PINCEAU;
Smear_Brosse=(byte *)malloc(((long)Smear_Brosse_Hauteur)*Smear_Brosse_Largeur); Smear_Brosse=(byte *)malloc(((long)Smear_Brosse_Hauteur)*Smear_Brosse_Largeur);
if (!Smear_Brosse) // On ne peut même pas allouer la brosse du smear! if (!Smear_Brosse) // On ne peut même pas allouer la brosse du smear!
{ {
Erreur(0); Erreur(0);
@ -1120,7 +1122,7 @@ void Capturer_brosse_au_lasso(int Vertices, short * Points,short Effacement)
Points[0],Points[1], Points[0],Points[1],
~Back_color); ~Back_color);
// On scanne la brosse pour remplacer tous les pixels affectés par le // On scanne la brosse pour remplacer tous les pixels affectés par le
// polyfill par ceux de l'image: // polyfill par ceux de l'image:
for (Pos_Y=Debut_Y;Pos_Y<=Fin_Y;Pos_Y++) for (Pos_Y=Debut_Y;Pos_Y<=Fin_Y;Pos_Y++)
for (Pos_X=Debut_X;Pos_X<=Fin_X;Pos_X++) for (Pos_X=Debut_X;Pos_X<=Fin_X;Pos_X++)
@ -1152,9 +1154,9 @@ void Etirer_brosse(short X1, short Y1, short X2, short Y2)
int Pos_X_dans_brosse; // Position courante dans l'ancienne brosse int Pos_X_dans_brosse; // Position courante dans l'ancienne brosse
int Pos_Y_dans_brosse; int Pos_Y_dans_brosse;
int Delta_X_dans_brosse; // "Vecteur incrémental" du point précédent int Delta_X_dans_brosse; // "Vecteur incrémental" du point précédent
int Delta_Y_dans_brosse; int Delta_Y_dans_brosse;
int Pos_X_initial; // Position X de début de parcours de ligne int Pos_X_initial; // Position X de début de parcours de ligne
int Dx,Dy; int Dx,Dy;
Dx=(X1<X2)?1:-1; Dx=(X1<X2)?1:-1;
@ -1171,7 +1173,7 @@ void Etirer_brosse(short X1, short Y1, short X2, short Y2)
// Calcul des anciennes dimensions de la brosse: // Calcul des anciennes dimensions de la brosse:
// Calcul du "vecteur incrémental": // Calcul du "vecteur incrémental":
Delta_X_dans_brosse=(Brosse_Largeur<<16)/(X2-X1+Dx); Delta_X_dans_brosse=(Brosse_Largeur<<16)/(X2-X1+Dx);
Delta_Y_dans_brosse=(Brosse_Hauteur<<16)/(Y2-Y1+Dy); Delta_Y_dans_brosse=(Brosse_Hauteur<<16)/(Y2-Y1+Dy);
@ -1181,7 +1183,7 @@ void Etirer_brosse(short X1, short Y1, short X2, short Y2)
else else
Pos_X_initial = (Brosse_Largeur<<16)-1; // Inversion en X de la brosse Pos_X_initial = (Brosse_Largeur<<16)-1; // Inversion en X de la brosse
free(Smear_Brosse); // On libère un peu de mémoire free(Smear_Brosse); // On libère un peu de mémoire
if ((New_Brosse=((byte *)malloc(New_Brosse_Largeur*New_Brosse_Hauteur)))) if ((New_Brosse=((byte *)malloc(New_Brosse_Largeur*New_Brosse_Hauteur))))
{ {
@ -1196,7 +1198,7 @@ void Etirer_brosse(short X1, short Y1, short X2, short Y2)
// Pour chaque ligne // Pour chaque ligne
for (Ligne=0;Ligne<New_Brosse_Hauteur;Ligne++) for (Ligne=0;Ligne<New_Brosse_Hauteur;Ligne++)
{ {
// On repart du début de la ligne: // On repart du début de la ligne:
Pos_X_dans_brosse=Pos_X_initial; Pos_X_dans_brosse=Pos_X_initial;
// Pour chaque colonne: // Pour chaque colonne:
@ -1204,13 +1206,13 @@ void Etirer_brosse(short X1, short Y1, short X2, short Y2)
{ {
// On copie le pixel: // On copie le pixel:
New_Brosse[Offset]=Lit_pixel_dans_brosse(Pos_X_dans_brosse>>16,Pos_Y_dans_brosse>>16); New_Brosse[Offset]=Lit_pixel_dans_brosse(Pos_X_dans_brosse>>16,Pos_Y_dans_brosse>>16);
// On passe à la colonne de brosse suivante: // On passe à la colonne de brosse suivante:
Pos_X_dans_brosse+=Delta_X_dans_brosse; Pos_X_dans_brosse+=Delta_X_dans_brosse;
// On passe au pixel suivant de la nouvelle brosse: // On passe au pixel suivant de la nouvelle brosse:
Offset++; Offset++;
} }
// On passe à la ligne de brosse suivante: // On passe à la ligne de brosse suivante:
Pos_Y_dans_brosse+=Delta_Y_dans_brosse; Pos_Y_dans_brosse+=Delta_Y_dans_brosse;
} }
@ -1224,7 +1226,7 @@ void Etirer_brosse(short X1, short Y1, short X2, short Y2)
Smear_Brosse_Hauteur=(Brosse_Hauteur>TAILLE_MAXI_PINCEAU)?Brosse_Hauteur:TAILLE_MAXI_PINCEAU; Smear_Brosse_Hauteur=(Brosse_Hauteur>TAILLE_MAXI_PINCEAU)?Brosse_Hauteur:TAILLE_MAXI_PINCEAU;
Smear_Brosse=(byte *)malloc(((long)Smear_Brosse_Hauteur)*Smear_Brosse_Largeur); Smear_Brosse=(byte *)malloc(((long)Smear_Brosse_Hauteur)*Smear_Brosse_Largeur);
if (!Smear_Brosse) // On ne peut même pas allouer la brosse du smear! if (!Smear_Brosse) // On ne peut même pas allouer la brosse du smear!
{ {
Erreur(0); Erreur(0);
@ -1243,9 +1245,9 @@ void Etirer_brosse(short X1, short Y1, short X2, short Y2)
} }
else else
{ {
// Ici la libération de mémoire n'a pas suffit donc on remet dans l'état // Ici la libération de mémoire n'a pas suffit donc on remet dans l'état
// où c'etait avant. On a juste à réallouer la Smear_Brosse car il y a // où c'etait avant. On a juste à réallouer la Smear_Brosse car il y a
// normalement la place pour elle puisque rien d'autre n'a pu être alloué // normalement la place pour elle puisque rien d'autre n'a pu être alloué
// entre temps. // entre temps.
Smear_Brosse=(byte *)malloc(((long)Smear_Brosse_Hauteur)*Smear_Brosse_Largeur); Smear_Brosse=(byte *)malloc(((long)Smear_Brosse_Hauteur)*Smear_Brosse_Largeur);
Erreur(0); Erreur(0);
@ -1276,7 +1278,7 @@ void Etirer_brosse_preview(short X1, short Y1, short X2, short Y2)
Largeur_dest=Pos_X_dest_Finale-Pos_X_dest_Initiale+1; Largeur_dest=Pos_X_dest_Finale-Pos_X_dest_Initiale+1;
Hauteur_dest=Pos_Y_dest_Finale-Pos_Y_dest_Initiale+1; Hauteur_dest=Pos_Y_dest_Finale-Pos_Y_dest_Initiale+1;
// Calcul des vecteurs d'incrémentation : // Calcul des vecteurs d'incrémentation :
Delta_X=(Brosse_Largeur<<16)/Largeur_dest; Delta_X=(Brosse_Largeur<<16)/Largeur_dest;
Delta_Y=(Brosse_Hauteur<<16)/Hauteur_dest; Delta_Y=(Brosse_Hauteur<<16)/Hauteur_dest;
@ -1394,7 +1396,7 @@ void Interpoler_texture(int Debut_X,int Debut_Y,int Xt1,int Yt1,
{ {
Xt=(((float)((Pos_X-Debut_X)*Delta_Xt))/(float)Delta_X2) + (float)Xt1; Xt=(((float)((Pos_X-Debut_X)*Delta_Xt))/(float)Delta_X2) + (float)Xt1;
Yt=(((float)((Pos_X-Debut_X)*Delta_Yt))/(float)Delta_X2) + (float)Yt1; Yt=(((float)((Pos_X-Debut_X)*Delta_Yt))/(float)Delta_X2) + (float)Yt1;
if (ScanY_X[0][Pos_Y]==INDEFINI) // Gauche non défini if (ScanY_X[0][Pos_Y]==INDEFINI) // Gauche non défini
{ {
ScanY_X[0][Pos_Y]=Pos_X; ScanY_X[0][Pos_Y]=Pos_X;
ScanY_Xt[0][Pos_Y]=Xt; ScanY_Xt[0][Pos_Y]=Xt;
@ -1404,7 +1406,7 @@ void Interpoler_texture(int Debut_X,int Debut_Y,int Xt1,int Yt1,
{ {
if (Pos_X>=ScanY_X[0][Pos_Y]) if (Pos_X>=ScanY_X[0][Pos_Y])
{ {
if ((ScanY_X[1][Pos_Y]==INDEFINI) // Droit non défini if ((ScanY_X[1][Pos_Y]==INDEFINI) // Droit non défini
|| (Pos_X>ScanY_X[1][Pos_Y])) || (Pos_X>ScanY_X[1][Pos_Y]))
{ {
ScanY_X[1][Pos_Y]=Pos_X; ScanY_X[1][Pos_Y]=Pos_X;
@ -1414,7 +1416,7 @@ void Interpoler_texture(int Debut_X,int Debut_Y,int Xt1,int Yt1,
} }
else else
{ {
if (ScanY_X[1][Pos_Y]==INDEFINI) // Droit non défini if (ScanY_X[1][Pos_Y]==INDEFINI) // Droit non défini
{ {
ScanY_X[1][Pos_Y]=ScanY_X[0][Pos_Y]; ScanY_X[1][Pos_Y]=ScanY_X[0][Pos_Y];
ScanY_Xt[1][Pos_Y]=ScanY_Xt[0][Pos_Y]; ScanY_Xt[1][Pos_Y]=ScanY_Xt[0][Pos_Y];
@ -1451,7 +1453,7 @@ void Interpoler_texture(int Debut_X,int Debut_Y,int Xt1,int Yt1,
{ {
Xt=(((float)((Pos_Y-Debut_Y)*Delta_Xt))/(float)Delta_Y2) + (float)Xt1; Xt=(((float)((Pos_Y-Debut_Y)*Delta_Xt))/(float)Delta_Y2) + (float)Xt1;
Yt=(((float)((Pos_Y-Debut_Y)*Delta_Yt))/(float)Delta_Y2) + (float)Yt1; Yt=(((float)((Pos_Y-Debut_Y)*Delta_Yt))/(float)Delta_Y2) + (float)Yt1;
if (ScanY_X[0][Pos_Y]==INDEFINI) // Gauche non défini if (ScanY_X[0][Pos_Y]==INDEFINI) // Gauche non défini
{ {
ScanY_X[0][Pos_Y]=Pos_X; ScanY_X[0][Pos_Y]=Pos_X;
ScanY_Xt[0][Pos_Y]=Xt; ScanY_Xt[0][Pos_Y]=Xt;
@ -1461,7 +1463,7 @@ void Interpoler_texture(int Debut_X,int Debut_Y,int Xt1,int Yt1,
{ {
if (Pos_X>=ScanY_X[0][Pos_Y]) if (Pos_X>=ScanY_X[0][Pos_Y])
{ {
if ((ScanY_X[1][Pos_Y]==INDEFINI) // Droit non défini if ((ScanY_X[1][Pos_Y]==INDEFINI) // Droit non défini
|| (Pos_X>ScanY_X[1][Pos_Y])) || (Pos_X>ScanY_X[1][Pos_Y]))
{ {
ScanY_X[1][Pos_Y]=Pos_X; ScanY_X[1][Pos_Y]=Pos_X;
@ -1471,7 +1473,7 @@ void Interpoler_texture(int Debut_X,int Debut_Y,int Xt1,int Yt1,
} }
else else
{ {
if (ScanY_X[1][Pos_Y]==INDEFINI) // Droit non défini if (ScanY_X[1][Pos_Y]==INDEFINI) // Droit non défini
{ {
ScanY_X[1][Pos_Y]=ScanY_X[0][Pos_Y]; ScanY_X[1][Pos_Y]=ScanY_X[0][Pos_Y];
ScanY_Xt[1][Pos_Y]=ScanY_Xt[0][Pos_Y]; ScanY_Xt[1][Pos_Y]=ScanY_Xt[0][Pos_Y];
@ -1519,7 +1521,7 @@ void Calculer_quad_texture(int X1,int Y1,int Xt1,int Yt1,
ScanY_X[0] =(float *)malloc(Hauteur*sizeof(float)); ScanY_X[0] =(float *)malloc(Hauteur*sizeof(float));
ScanY_X[1] =(float *)malloc(Hauteur*sizeof(float)); ScanY_X[1] =(float *)malloc(Hauteur*sizeof(float));
// Remplir avec des valeurs égales à INDEFINI. // Remplir avec des valeurs égales à INDEFINI.
for (Y=0; Y<Hauteur; Y++) for (Y=0; Y<Hauteur; Y++)
{ {
ScanY_X[0][Y]=INDEFINI; ScanY_X[0][Y]=INDEFINI;
@ -1574,7 +1576,7 @@ void Tourner_brosse(float Angle)
float cosA=cos(Angle); float cosA=cos(Angle);
float sinA=sin(Angle); float sinA=sin(Angle);
// Calcul des coordonnées des 4 coins: // Calcul des coordonnées des 4 coins:
// 1 2 // 1 2
// 3 4 // 3 4
@ -1597,11 +1599,11 @@ void Tourner_brosse(float Angle)
New_Brosse_Largeur=Xmax+1-Xmin; New_Brosse_Largeur=Xmax+1-Xmin;
New_Brosse_Hauteur=Ymax+1-Ymin; New_Brosse_Hauteur=Ymax+1-Ymin;
free(Smear_Brosse); // On libère un peu de mémoire free(Smear_Brosse); // On libère un peu de mémoire
if ((New_Brosse=((byte *)malloc(New_Brosse_Largeur*New_Brosse_Hauteur)))) if ((New_Brosse=((byte *)malloc(New_Brosse_Largeur*New_Brosse_Hauteur))))
{ {
// Et maintenant on calcule la nouvelle brosse tournée. // Et maintenant on calcule la nouvelle brosse tournée.
Calculer_quad_texture(X1,Y1, 0, 0, Calculer_quad_texture(X1,Y1, 0, 0,
X2,Y2,Brosse_Largeur-1, 0, X2,Y2,Brosse_Largeur-1, 0,
X3,Y3, 0,Brosse_Hauteur-1, X3,Y3, 0,Brosse_Hauteur-1,
@ -1618,7 +1620,7 @@ void Tourner_brosse(float Angle)
Smear_Brosse_Hauteur=(Brosse_Hauteur>TAILLE_MAXI_PINCEAU)?Brosse_Hauteur:TAILLE_MAXI_PINCEAU; Smear_Brosse_Hauteur=(Brosse_Hauteur>TAILLE_MAXI_PINCEAU)?Brosse_Hauteur:TAILLE_MAXI_PINCEAU;
Smear_Brosse=(byte *)malloc(((long)Smear_Brosse_Hauteur)*Smear_Brosse_Largeur); Smear_Brosse=(byte *)malloc(((long)Smear_Brosse_Hauteur)*Smear_Brosse_Largeur);
if (!Smear_Brosse) // On ne peut même pas allouer la brosse du smear! if (!Smear_Brosse) // On ne peut même pas allouer la brosse du smear!
{ {
Erreur(0); Erreur(0);
@ -1637,9 +1639,9 @@ void Tourner_brosse(float Angle)
} }
else else
{ {
// Ici la libération de mémoire n'a pas suffit donc on remet dans l'état // Ici la libération de mémoire n'a pas suffit donc on remet dans l'état
// où c'etait avant. On a juste à réallouer la Smear_Brosse car il y a // où c'etait avant. On a juste à réallouer la Smear_Brosse car il y a
// normalement la place pour elle puisque rien d'autre n'a pu être alloué // normalement la place pour elle puisque rien d'autre n'a pu être alloué
// entre temps. // entre temps.
Smear_Brosse=(byte *)malloc(((long)Smear_Brosse_Hauteur)*Smear_Brosse_Largeur); Smear_Brosse=(byte *)malloc(((long)Smear_Brosse_Hauteur)*Smear_Brosse_Largeur);
Erreur(0); Erreur(0);
@ -1673,7 +1675,7 @@ void Dessiner_quad_texture_preview(int X1,int Y1,int Xt1,int Yt1,
ScanY_X[0] =(float *)malloc(Hauteur*sizeof(float)); ScanY_X[0] =(float *)malloc(Hauteur*sizeof(float));
ScanY_X[1] =(float *)malloc(Hauteur*sizeof(float)); ScanY_X[1] =(float *)malloc(Hauteur*sizeof(float));
// Remplir avec des valeurs égales à INDEFINI. // Remplir avec des valeurs égales à INDEFINI.
for (Y=0; Y<Hauteur; Y++) for (Y=0; Y<Hauteur; Y++)
{ {
ScanY_X[0][Y]=INDEFINI; ScanY_X[0][Y]=INDEFINI;
@ -1728,7 +1730,7 @@ void Tourner_brosse_preview(float Angle)
float cosA=cos(Angle); float cosA=cos(Angle);
float sinA=sin(Angle); float sinA=sin(Angle);
// Calcul des coordonnées des 4 coins: // Calcul des coordonnées des 4 coins:
// 1 2 // 1 2
// 3 4 // 3 4
@ -1751,7 +1753,7 @@ void Tourner_brosse_preview(float Angle)
X4+=Brosse_Centre_rotation_X; X4+=Brosse_Centre_rotation_X;
Y4+=Brosse_Centre_rotation_Y; Y4+=Brosse_Centre_rotation_Y;
// Et maintenant on dessine la brosse tournée. // Et maintenant on dessine la brosse tournée.
Dessiner_quad_texture_preview(X1,Y1, 0, 0, Dessiner_quad_texture_preview(X1,Y1, 0, 0,
X2,Y2,Brosse_Largeur-1, 0, X2,Y2,Brosse_Largeur-1, 0,
X3,Y3, 0,Brosse_Hauteur-1, X3,Y3, 0,Brosse_Hauteur-1,

193
windows.c
View File

@ -25,6 +25,7 @@
*/ */
#include <math.h> #include <math.h>
#include <string.h> // strncpy() strlen()
#include "windows.h" #include "windows.h"
#include "global.h" #include "global.h"
@ -33,13 +34,13 @@
#include "divers.h" #include "divers.h"
#include "sdlscreen.h" #include "sdlscreen.h"
// Affichage d'un pixel dans le menu (le menu doît être visible) // Affichage d'un pixel dans le menu (le menu doit être visible)
void Pixel_dans_barre_d_outil(word X,word Y,byte Couleur) void Pixel_dans_barre_d_outil(word X,word Y,byte Couleur)
{ {
Block(X*Menu_Facteur_X,(Y*Menu_Facteur_Y)+Menu_Ordonnee,Menu_Facteur_X,Menu_Facteur_Y,Couleur); Block(X*Menu_Facteur_X,(Y*Menu_Facteur_Y)+Menu_Ordonnee,Menu_Facteur_X,Menu_Facteur_Y,Couleur);
} }
// Affichage d'un pixel dans la fenêtre (la fenêtre doît être visible) // Affichage d'un pixel dans la fenêtre (la fenêtre doit être visible)
void Pixel_dans_fenetre(word X,word Y,byte Couleur) void Pixel_dans_fenetre(word X,word Y,byte Couleur)
{ {
@ -47,35 +48,35 @@ void Pixel_dans_fenetre(word X,word Y,byte Couleur)
} }
// -- Affichages de différents cadres dans une fenêtre ----------------------- // -- Affichages de différents cadres dans une fenêtre -----------------------
// -- Cadre général avec couleurs paramètrables -- // -- Cadre général avec couleurs paramètrables --
void Fenetre_Afficher_cadre_general(word Pos_X,word Pos_Y,word Largeur,word Hauteur, void Fenetre_Afficher_cadre_general(word Pos_X,word Pos_Y,word Largeur,word Hauteur,
byte Couleur_HG,byte Couleur_BD,byte Couleur_S,byte Couleur_CHG,byte Couleur_CBD) byte Couleur_HG,byte Couleur_BD,byte Couleur_S,byte Couleur_CHG,byte Couleur_CBD)
// Paramètres de couleurs: // Paramètres de couleurs:
// Couleur_HG =Bords Haut et Gauche // Couleur_HG =Bords Haut et Gauche
// Couleur_BD =Bords Bas et Droite // Couleur_BD =Bords Bas et Droite
// Couleur_S =Coins Haut-Droite et Bas-Gauche // Couleur_S =Coins Haut-Droite et Bas-Gauche
// Couleur_CHG=Coin Haut-Gauche // Couleur_CHG=Coin Haut-Gauche
// Couleur_CBD=Coin Bas-Droite // Couleur_CBD=Coin Bas-Droite
{ {
// Bord haut (sans les extrémités) // Bord haut (sans les extrémités)
Block(Fenetre_Pos_X+((Pos_X+1)*Menu_Facteur_X), Block(Fenetre_Pos_X+((Pos_X+1)*Menu_Facteur_X),
Fenetre_Pos_Y+(Pos_Y*Menu_Facteur_Y), Fenetre_Pos_Y+(Pos_Y*Menu_Facteur_Y),
(Largeur-2)*Menu_Facteur_X,Menu_Facteur_Y,Couleur_HG); (Largeur-2)*Menu_Facteur_X,Menu_Facteur_Y,Couleur_HG);
// Bord bas (sans les extrémités) // Bord bas (sans les extrémités)
Block(Fenetre_Pos_X+((Pos_X+1)*Menu_Facteur_X), Block(Fenetre_Pos_X+((Pos_X+1)*Menu_Facteur_X),
Fenetre_Pos_Y+((Pos_Y+Hauteur-1)*Menu_Facteur_Y), Fenetre_Pos_Y+((Pos_Y+Hauteur-1)*Menu_Facteur_Y),
(Largeur-2)*Menu_Facteur_X,Menu_Facteur_Y,Couleur_BD); (Largeur-2)*Menu_Facteur_X,Menu_Facteur_Y,Couleur_BD);
// Bord gauche (sans les extrémités) // Bord gauche (sans les extrémités)
Block(Fenetre_Pos_X+(Pos_X*Menu_Facteur_X), Block(Fenetre_Pos_X+(Pos_X*Menu_Facteur_X),
Fenetre_Pos_Y+((Pos_Y+1)*Menu_Facteur_Y), Fenetre_Pos_Y+((Pos_Y+1)*Menu_Facteur_Y),
Menu_Facteur_X,(Hauteur-2)*Menu_Facteur_Y,Couleur_HG); Menu_Facteur_X,(Hauteur-2)*Menu_Facteur_Y,Couleur_HG);
// Bord droite (sans les extrémités) // Bord droite (sans les extrémités)
Block(Fenetre_Pos_X+((Pos_X+Largeur-1)*Menu_Facteur_X), Block(Fenetre_Pos_X+((Pos_X+Largeur-1)*Menu_Facteur_X),
Fenetre_Pos_Y+((Pos_Y+1)*Menu_Facteur_Y), Fenetre_Pos_Y+((Pos_Y+1)*Menu_Facteur_Y),
Menu_Facteur_X,(Hauteur-2)*Menu_Facteur_Y,Couleur_BD); Menu_Facteur_X,(Hauteur-2)*Menu_Facteur_Y,Couleur_BD);
@ -97,21 +98,21 @@ void Fenetre_Afficher_cadre_mono(word Pos_X,word Pos_Y,word Largeur,word Hauteur
Fenetre_Afficher_cadre_general(Pos_X,Pos_Y,Largeur,Hauteur,Couleur,Couleur,Couleur,Couleur,Couleur); Fenetre_Afficher_cadre_general(Pos_X,Pos_Y,Largeur,Hauteur,Couleur,Couleur,Couleur,Couleur,Couleur);
} }
// -- Cadre creux: foncé en haut-gauche et clair en bas-droite -- // -- Cadre creux: foncé en haut-gauche et clair en bas-droite --
void Fenetre_Afficher_cadre_creux(word Pos_X,word Pos_Y,word Largeur,word Hauteur) void Fenetre_Afficher_cadre_creux(word Pos_X,word Pos_Y,word Largeur,word Hauteur)
{ {
Fenetre_Afficher_cadre_general(Pos_X,Pos_Y,Largeur,Hauteur,CM_Fonce,CM_Blanc,CM_Clair,CM_Fonce,CM_Blanc); Fenetre_Afficher_cadre_general(Pos_X,Pos_Y,Largeur,Hauteur,CM_Fonce,CM_Blanc,CM_Clair,CM_Fonce,CM_Blanc);
} }
// -- Cadre bombé: clair en haut-gauche et foncé en bas-droite -- // -- Cadre bombé: clair en haut-gauche et foncé en bas-droite --
void Fenetre_Afficher_cadre_bombe(word Pos_X,word Pos_Y,word Largeur,word Hauteur) void Fenetre_Afficher_cadre_bombe(word Pos_X,word Pos_Y,word Largeur,word Hauteur)
{ {
Fenetre_Afficher_cadre_general(Pos_X,Pos_Y,Largeur,Hauteur,CM_Blanc,CM_Fonce,CM_Clair,CM_Blanc,CM_Fonce); Fenetre_Afficher_cadre_general(Pos_X,Pos_Y,Largeur,Hauteur,CM_Blanc,CM_Fonce,CM_Clair,CM_Blanc,CM_Fonce);
} }
// -- Cadre de séparation: un cadre bombé dans un cadre creux (3D!!!) -- // -- Cadre de séparation: un cadre bombé dans un cadre creux (3D!!!) --
void Fenetre_Afficher_cadre(word Pos_X,word Pos_Y,word Largeur,word Hauteur) void Fenetre_Afficher_cadre(word Pos_X,word Pos_Y,word Largeur,word Hauteur)
{ {
@ -120,7 +121,7 @@ void Fenetre_Afficher_cadre(word Pos_X,word Pos_Y,word Largeur,word Hauteur)
} }
//-- Affichages relatifs à la palette dans le menu --------------------------- //-- Affichages relatifs à la palette dans le menu ---------------------------
// -- Affichage des couleurs courante (fore/back) de pinceau dans le menu -- // -- Affichage des couleurs courante (fore/back) de pinceau dans le menu --
@ -165,7 +166,7 @@ void Encadrer_couleur_menu(byte Couleur)
Block(Debut_X,Debut_Y,Menu_Taille_couleur*Menu_Facteur_X, Block(Debut_X,Debut_Y,Menu_Taille_couleur*Menu_Facteur_X,
Menu_Facteur_Y<<2,Fore_color); Menu_Facteur_Y<<2,Fore_color);
UpdateRect(Debut_X,Debut_Y,Menu_Taille_couleur*Menu_Facteur_X,Menu_Facteur_Y*4); // TODO On met à jour toute la palette... peut mieux faire UpdateRect(Debut_X,Debut_Y,Menu_Taille_couleur*Menu_Facteur_X,Menu_Facteur_Y*4); // TODO On met à jour toute la palette... peut mieux faire
} }
else else
{ {
@ -297,13 +298,13 @@ void Afficher_menu(void)
} }
Print_nom_fichier(); Print_nom_fichier();
} }
UpdateRect(0,Menu_Ordonnee,Largeur_ecran,HAUTEUR_MENU*Menu_Facteur_Y); // on met toute la largur à jour, ça inclut la palette et la zone d'étant avec le nom du fichier UpdateRect(0,Menu_Ordonnee,Largeur_ecran,HAUTEUR_MENU*Menu_Facteur_Y); // on met toute la largur à jour, ça inclut la palette et la zone d'étant avec le nom du fichier
} }
} }
// -- Affichage de texte ----------------------------------------------------- // -- Affichage de texte -----------------------------------------------------
// -- Afficher une chaîne n'importe où à l'écran -- // -- Afficher une chaîne n'importe où à l'écran --
void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond) void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond)
{ {
@ -322,7 +323,7 @@ void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur
Reel_X=0; // Position dans le buffer Reel_X=0; // Position dans le buffer
for (Indice=0;Chaine[Indice]!='\0';Indice++) for (Indice=0;Chaine[Indice]!='\0';Indice++)
{ {
// Pointeur sur le premier pixel du caractère // Pointeur sur le premier pixel du caractère
Caractere=Fonte+(((unsigned char)Chaine[Indice])<<6); Caractere=Fonte+(((unsigned char)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*Pixel_width;Repeat_Menu_Facteur_X++) for (Repeat_Menu_Facteur_X=0;Repeat_Menu_Facteur_X<Menu_Facteur_X*Pixel_width;Repeat_Menu_Facteur_X++)
@ -333,7 +334,7 @@ void Print_general(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur
} }
} }
// -- Afficher un caractère dans une fenêtre -- // -- Afficher un caractère dans une fenêtre --
void Print_char_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byte Couleur_texte,byte Couleur_fond) void Print_char_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byte Couleur_texte,byte Couleur_fond)
{ {
@ -341,7 +342,7 @@ void Print_char_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byt
byte *Carac; byte *Carac;
Pos_X=(Pos_X*Menu_Facteur_X)+Fenetre_Pos_X; Pos_X=(Pos_X*Menu_Facteur_X)+Fenetre_Pos_X;
Pos_Y=(Pos_Y*Menu_Facteur_Y)+Fenetre_Pos_Y; Pos_Y=(Pos_Y*Menu_Facteur_Y)+Fenetre_Pos_Y;
// Premier pixel du caractère // Premier pixel du caractère
Carac=Fonte + (Caractere<<6); Carac=Fonte + (Caractere<<6);
for (X=0;X<8;X++) for (X=0;X<8;X++)
for (Y=0;Y<8;Y++) for (Y=0;Y<8;Y++)
@ -350,7 +351,7 @@ void Print_char_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byt
(*(Carac+(X<<3)+Y)?Couleur_texte:Couleur_fond)); (*(Carac+(X<<3)+Y)?Couleur_texte:Couleur_fond));
} }
// -- Afficher un caractère sans fond dans une fenêtre -- // -- Afficher un caractère sans fond dans une fenêtre --
void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byte Couleur) void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,unsigned char Caractere,byte Couleur)
{ {
@ -368,7 +369,7 @@ void Print_char_transparent_dans_fenetre(short Pos_X,short Pos_Y,unsigned char C
} }
} }
// -- Afficher une chaîne dans une fenêtre, avec taille maxi -- // -- Afficher une chaîne dans une fenêtre, avec taille maxi --
void Print_dans_fenetre_limite(short X,short Y,char * Chaine,byte Taille,byte Couleur_texte,byte Couleur_fond) void Print_dans_fenetre_limite(short X,short Y,char * Chaine,byte Taille,byte Couleur_texte,byte Couleur_fond)
{ {
@ -383,7 +384,7 @@ void Print_dans_fenetre_limite(short X,short Y,char * Chaine,byte Taille,byte Co
Print_dans_fenetre(X, Y, Chaine_affichee, Couleur_texte, Couleur_fond); Print_dans_fenetre(X, Y, Chaine_affichee, Couleur_texte, Couleur_fond);
} }
// -- Afficher une chaîne dans une fenêtre -- // -- Afficher une chaîne dans une fenêtre --
void Print_dans_fenetre(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond) void Print_dans_fenetre(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond)
{ {
@ -393,7 +394,7 @@ void Print_dans_fenetre(short X,short Y,char * Chaine,byte Couleur_texte,byte Co
UpdateRect(X*Menu_Facteur_X+Fenetre_Pos_X,Y*Menu_Facteur_Y+Fenetre_Pos_Y,8*Menu_Facteur_X*strlen(Chaine),8*Menu_Facteur_Y); UpdateRect(X*Menu_Facteur_X+Fenetre_Pos_X,Y*Menu_Facteur_Y+Fenetre_Pos_Y,8*Menu_Facteur_X*strlen(Chaine),8*Menu_Facteur_Y);
} }
// -- Afficher une chaîne dans le menu -- // -- Afficher une chaîne dans le menu --
void Print_dans_menu(char * Chaine, short Position) void Print_dans_menu(char * Chaine, short Position)
{ {
@ -401,9 +402,9 @@ void Print_dans_menu(char * Chaine, short Position)
UpdateRect((18+(Position<<3))*Menu_Facteur_X,Menu_Ordonnee_Texte,strlen(Chaine)*8*Menu_Facteur_X,8*Menu_Facteur_Y); UpdateRect((18+(Position<<3))*Menu_Facteur_X,Menu_Ordonnee_Texte,strlen(Chaine)*8*Menu_Facteur_X,8*Menu_Facteur_Y);
} }
// -- Afficher les coordonnées du pinceau dans le menu -- // -- Afficher les coordonnées du pinceau dans le menu --
// Note : cette fonction n'affiche que les chiffres, pas les X: Y: qui sont dans la gestion principale, car elle est apellée très souvent. // Note : cette fonction n'affiche que les chiffres, pas les X: Y: qui sont dans la gestion principale, car elle est apellée très souvent.
void Print_coordonnees(void) void Print_coordonnees(void)
{ {
char Tempo[5]; char Tempo[5];
@ -444,7 +445,7 @@ void Print_nom_fichier(void)
int Taille_nom; int Taille_nom;
if (Menu_visible) if (Menu_visible)
{ {
// Si le nom de fichier fait plus de 12 caractères, on n'affiche que les 12 derniers // Si le nom de fichier fait plus de 12 caractères, on n'affiche que les 12 derniers
strncpy(Nom_affiche,Principal_Nom_fichier,12); strncpy(Nom_affiche,Principal_Nom_fichier,12);
Taille_nom=strlen(Principal_Nom_fichier); Taille_nom=strlen(Principal_Nom_fichier);
Nom_affiche[12]='\0'; Nom_affiche[12]='\0';
@ -463,11 +464,11 @@ void Print_nom_fichier(void)
} }
} }
// Fonction d'affichage d'une chaine numérique avec une fonte très fine // Fonction d'affichage d'une chaine numérique avec une fonte très fine
// Spécialisée pour les compteurs RGB // Spécialisée pour les compteurs RGB
void Print_compteur(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond) void Print_compteur(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleur_fond)
{ {
// Macros pour écrire des litteraux binaires. // Macros pour écrire des litteraux binaires.
// Ex: Ob(11110000) == 0xF0 // Ex: Ob(11110000) == 0xF0
#define Ob(x) ((unsigned)Ob_(0 ## x ## uL)) #define Ob(x) ((unsigned)Ob_(0 ## x ## uL))
#define Ob_(x) ((x & 1) | (x >> 2 & 2) | (x >> 4 & 4) | (x >> 6 & 8) | \ #define Ob_(x) ((x & 1) | (x >> 2 & 2) | (x >> 4 & 4) | (x >> 6 & 8) | \
@ -663,7 +664,7 @@ void Print_compteur(short X,short Y,char * Chaine,byte Couleur_texte,byte Couleu
//---- Fenêtre demandant de confirmer une action et renvoyant la réponse ----- //---- Fenêtre demandant de confirmer une action et renvoyant la réponse -----
byte Demande_de_confirmation(char * Message) byte Demande_de_confirmation(char * Message)
{ {
short Bouton_clicke; short Bouton_clicke;
@ -701,7 +702,7 @@ byte Demande_de_confirmation(char * Message)
//---- Fenêtre avertissant de quelque chose et attendant un click sur OK ----- //---- Fenêtre avertissant de quelque chose et attendant un click sur OK -----
void Warning_message(char * Message) void Warning_message(char * Message)
{ {
short Bouton_clicke; short Bouton_clicke;
@ -773,7 +774,7 @@ void Afficher_pinceau_dans_menu(void)
} }
break; break;
default : // Pinceau default : // Pinceau
// On efface le pinceau précédent // On efface le pinceau précédent
for (Pos_menu_Y=2,Pos_Y=0;Pos_Y<HAUTEUR_SPRITE_MENU;Pos_menu_Y++,Pos_Y++) for (Pos_menu_Y=2,Pos_Y=0;Pos_Y<HAUTEUR_SPRITE_MENU;Pos_menu_Y++,Pos_Y++)
for (Pos_menu_X=1,Pos_X=0;Pos_X<LARGEUR_SPRITE_MENU;Pos_menu_X++,Pos_X++) for (Pos_menu_X=1,Pos_X=0;Pos_X<LARGEUR_SPRITE_MENU;Pos_menu_X++,Pos_X++)
{ {
@ -810,10 +811,10 @@ void Afficher_pinceau_dans_menu(void)
UpdateRect(0,Menu_Ordonnee,LARGEUR_SPRITE_MENU*Menu_Facteur_X+3,HAUTEUR_SPRITE_MENU*Menu_Facteur_Y+3); UpdateRect(0,Menu_Ordonnee,LARGEUR_SPRITE_MENU*Menu_Facteur_X+3,HAUTEUR_SPRITE_MENU*Menu_Facteur_Y+3);
} }
// -- Dessiner un pinceau prédéfini dans la fenêtre -- // -- Dessiner un pinceau prédéfini dans la fenêtre --
void Afficher_pinceau_dans_fenetre(word X,word Y,int Numero) void Afficher_pinceau_dans_fenetre(word X,word Y,int Numero)
// Pinceau = 0..NB_SPRITES_PINCEAU-1 : Pinceau prédéfini // Pinceau = 0..NB_SPRITES_PINCEAU-1 : Pinceau prédéfini
{ {
word Pos_X; word Pos_X;
word Pos_Y; word Pos_Y;
@ -834,7 +835,7 @@ void Afficher_pinceau_dans_fenetre(word X,word Y,int Numero)
for (Pos_fenetre_X=0,Pos_X=0; Pos_X<Pinceau_predefini_Largeur[Numero]; Pos_fenetre_X++,Pos_X++) for (Pos_fenetre_X=0,Pos_X=0; Pos_X<Pinceau_predefini_Largeur[Numero]; Pos_fenetre_X++,Pos_X++)
Block(Orig_X+Pos_fenetre_X*Taille_X,Orig_Y+Pos_fenetre_Y*Taille_Y,Taille_X,Taille_Y,(SPRITE_PINCEAU[Numero][Pos_Y][Pos_X])?CM_Noir:CM_Clair); Block(Orig_X+Pos_fenetre_X*Taille_X,Orig_Y+Pos_fenetre_Y*Taille_Y,Taille_X,Taille_Y,(SPRITE_PINCEAU[Numero][Pos_Y][Pos_X])?CM_Noir:CM_Clair);
// On n'utilise pas Pixel_dans_fenetre() car on ne dessine pas // On n'utilise pas Pixel_dans_fenetre() car on ne dessine pas
// forcément avec la même taille de pixel. // forcément avec la même taille de pixel.
UpdateRect( ToWinX(Orig_X), ToWinY(Orig_Y), UpdateRect( ToWinX(Orig_X), ToWinY(Orig_Y),
ToWinL(Pinceau_predefini_Largeur[Numero]), ToWinL(Pinceau_predefini_Largeur[Numero]),
@ -857,16 +858,16 @@ void Dessiner_zigouigoui(word X,word Y, byte Couleur, short Sens)
Pixel_dans_fenetre(X,Y+5,Couleur); Pixel_dans_fenetre(X,Y+5,Couleur);
} }
// -- Dessiner un bloc de couleurs dégradé verticalement // -- Dessiner un bloc de couleurs dégradé verticalement
void Bloc_degrade_dans_fenetre(word Pos_X,word Pos_Y,word Debut_block,word Fin_block) void Bloc_degrade_dans_fenetre(word Pos_X,word Pos_Y,word Debut_block,word Fin_block)
{ {
word Total_lignes =Menu_Facteur_Y<<6; // <=> à 64 lignes fct(Menu_Facteur) word Total_lignes =Menu_Facteur_Y<<6; // <=> à 64 lignes fct(Menu_Facteur)
word Nb_couleurs =(Debut_block<=Fin_block)?Fin_block-Debut_block+1:Debut_block-Fin_block+1; word Nb_couleurs =(Debut_block<=Fin_block)?Fin_block-Debut_block+1:Debut_block-Fin_block+1;
word Ligne_en_cours=(Debut_block<=Fin_block)?0:Total_lignes-1; word Ligne_en_cours=(Debut_block<=Fin_block)?0:Total_lignes-1;
word Debut_X =Fenetre_Pos_X+(Menu_Facteur_X*Pos_X); word Debut_X =Fenetre_Pos_X+(Menu_Facteur_X*Pos_X);
word Largeur_ligne =Menu_Facteur_X<<4; // <=> à 16 pixels fct(Menu_Facteur) word Largeur_ligne =Menu_Facteur_X<<4; // <=> à 16 pixels fct(Menu_Facteur)
word Debut_Y =Fenetre_Pos_Y+(Menu_Facteur_Y*Pos_Y); word Debut_Y =Fenetre_Pos_Y+(Menu_Facteur_Y*Pos_Y);
word Fin_Y =Debut_Y+Total_lignes; word Fin_Y =Debut_Y+Total_lignes;
@ -887,7 +888,7 @@ void Bloc_degrade_dans_fenetre(word Pos_X,word Pos_Y,word Debut_block,word Fin_b
// -- Dessiner un petit sprite représentant le type d'un drive -- // -- Dessiner un petit sprite représentant le type d'un drive --
void Fenetre_Afficher_sprite_drive(word Pos_X,word Pos_Y,byte Type) void Fenetre_Afficher_sprite_drive(word Pos_X,word Pos_Y,byte Type)
{ {
@ -903,15 +904,15 @@ void Fenetre_Afficher_sprite_drive(word Pos_X,word Pos_Y,byte Type)
void Afficher_palette_du_menu_en_evitant_la_fenetre(byte * Table) void Afficher_palette_du_menu_en_evitant_la_fenetre(byte * Table)
{ {
// On part du principe qu'il n'y a que le bas d'une fenêtre qui puisse // On part du principe qu'il n'y a que le bas d'une fenêtre qui puisse
// empiéter sur la palette... Et c'est déjà pas mal! // empiéter sur la palette... Et c'est déjà pas mal!
byte Couleur,Vraie_couleur; byte Couleur,Vraie_couleur;
word Debut_X,Debut_Y; word Debut_X,Debut_Y;
word Fin_X,Fin_Y; word Fin_X,Fin_Y;
word Largeur; word Largeur;
word Hauteur; word Hauteur;
word Coin_X=Fenetre_Pos_X+Fenetre_Largeur*Menu_Facteur_X; // |_ Coin bas-droit word Coin_X=Fenetre_Pos_X+Fenetre_Largeur*Menu_Facteur_X; // |_ Coin bas-droit
word Coin_Y=Fenetre_Pos_Y+Fenetre_Hauteur*Menu_Facteur_Y; // | de la fenêtre +1 word Coin_Y=Fenetre_Pos_Y+Fenetre_Hauteur*Menu_Facteur_Y; // | de la fenêtre +1
if (Config.Couleurs_separees) if (Config.Couleurs_separees)
@ -934,8 +935,8 @@ void Afficher_palette_du_menu_en_evitant_la_fenetre(byte * Table)
Fin_X=Debut_X+Largeur; Fin_X=Debut_X+Largeur;
Fin_Y=Debut_Y+Hauteur; Fin_Y=Debut_Y+Hauteur;
// On affiche le bloc en entier si on peut, sinon on le découpe autour // On affiche le bloc en entier si on peut, sinon on le découpe autour
// de la fenêtre. // de la fenêtre.
if ( (Debut_Y>=Coin_Y) || (Fin_X<=Fenetre_Pos_X) || (Debut_X>=Coin_X) ) if ( (Debut_Y>=Coin_Y) || (Fin_X<=Fenetre_Pos_X) || (Debut_X>=Coin_X) )
Block(Debut_X,Debut_Y,Largeur,Hauteur,Vraie_couleur); Block(Debut_X,Debut_Y,Largeur,Hauteur,Vraie_couleur);
else else
@ -989,12 +990,12 @@ void Afficher_palette_du_menu_en_evitant_la_fenetre(byte * Table)
} }
{ {
// Affichage du bloc directement dans le "buffer de fond" de la fenetre. // Affichage du bloc directement dans le "buffer de fond" de la fenetre.
// Cela permet au bloc de couleur d'apparaitre si on déplace la fenetre. // Cela permet au bloc de couleur d'apparaitre si on déplace la fenetre.
short Pos_X; short Pos_X;
short Pos_Y; short Pos_Y;
short Deb_X; // besoin d'une variable signée short Deb_X; // besoin d'une variable signée
short Deb_Y; // besoin d'une variable signée short Deb_Y; // besoin d'une variable signée
// Attention aux unités // Attention aux unités
Deb_X = ((short)Debut_X - (short)Fenetre_Pos_X); Deb_X = ((short)Debut_X - (short)Fenetre_Pos_X);
Deb_Y = ((short)Debut_Y - (short)Fenetre_Pos_Y); Deb_Y = ((short)Debut_Y - (short)Fenetre_Pos_Y);
@ -1008,15 +1009,15 @@ void Afficher_palette_du_menu_en_evitant_la_fenetre(byte * Table)
UpdateRect(LARGEUR_MENU*Menu_Facteur_X,Menu_Ordonnee_avant_fenetre,Largeur_ecran-(LARGEUR_MENU*Menu_Facteur_X),(HAUTEUR_MENU-9)*Menu_Facteur_Y); UpdateRect(LARGEUR_MENU*Menu_Facteur_X,Menu_Ordonnee_avant_fenetre,Largeur_ecran-(LARGEUR_MENU*Menu_Facteur_X),(HAUTEUR_MENU-9)*Menu_Facteur_Y);
} }
// -------- Calcul des bornes de la partie d'image visible à l'écran --------- // -------- Calcul des bornes de la partie d'image visible à l'écran ---------
void Calculer_limites(void) void Calculer_limites(void)
/* /*
Avant l'appel à cette fonction, les données de la loupe doivent être à jour. Avant l'appel à cette fonction, les données de la loupe doivent être à jour.
*/ */
{ {
if (Loupe_Mode) if (Loupe_Mode)
{ {
// -- Calcul des limites de la partie non zoomée de l'image -- // -- Calcul des limites de la partie non zoomée de l'image --
Limite_Haut =Principal_Decalage_Y; Limite_Haut =Principal_Decalage_Y;
Limite_Gauche=Principal_Decalage_X; Limite_Gauche=Principal_Decalage_X;
Limite_visible_Bas =Limite_Haut+Menu_Ordonnee-1; Limite_visible_Bas =Limite_Haut+Menu_Ordonnee-1;
@ -1032,7 +1033,7 @@ void Calculer_limites(void)
else else
Limite_Droite=Limite_visible_Droite; Limite_Droite=Limite_visible_Droite;
// -- Calcul des limites de la partie zoomée de l'image -- // -- Calcul des limites de la partie zoomée de l'image --
Limite_Haut_Zoom =Loupe_Decalage_Y; Limite_Haut_Zoom =Loupe_Decalage_Y;
Limite_Gauche_Zoom=Loupe_Decalage_X; Limite_Gauche_Zoom=Loupe_Decalage_X;
Limite_visible_Bas_Zoom =Limite_Haut_Zoom+Loupe_Hauteur-1; Limite_visible_Bas_Zoom =Limite_Haut_Zoom+Loupe_Hauteur-1;
@ -1069,7 +1070,7 @@ void Calculer_limites(void)
} }
// -- Calculer les coordonnées du pinceau en fonction du snap et de la loupe - // -- Calculer les coordonnées du pinceau en fonction du snap et de la loupe -
void Calculer_coordonnees_pinceau(void) void Calculer_coordonnees_pinceau(void)
{ {
if ((Loupe_Mode) && (Mouse_X>=Principal_X_Zoom)) if ((Loupe_Mode) && (Mouse_X>=Principal_X_Zoom))
@ -1106,7 +1107,7 @@ void Afficher_limites_de_l_image(void)
Bas_visible =Principal_Hauteur_image<Menu_Ordonnee; Bas_visible =Principal_Hauteur_image<Menu_Ordonnee;
// On vérifie que la limite à droite est visible: // On vérifie que la limite à droite est visible:
if (Droite_visible) if (Droite_visible)
{ {
Debut=Limite_Haut; Debut=Limite_Haut;
@ -1116,7 +1117,7 @@ void Afficher_limites_de_l_image(void)
if (Bas_visible) if (Bas_visible)
Fin++; Fin++;
// Juste le temps d'afficher les limites, on étend les limites de la loupe // Juste le temps d'afficher les limites, on étend les limites de la loupe
// aux limites visibles, car sinon Pixel_Preview ne voudra pas afficher. // aux limites visibles, car sinon Pixel_Preview ne voudra pas afficher.
Ancienne_Limite_Zoom=Limite_Droite_Zoom; Ancienne_Limite_Zoom=Limite_Droite_Zoom;
Limite_Droite_Zoom=Limite_visible_Droite_Zoom; Limite_Droite_Zoom=Limite_visible_Droite_Zoom;
@ -1129,14 +1130,14 @@ void Afficher_limites_de_l_image(void)
Limite_Droite_Zoom=Ancienne_Limite_Zoom; Limite_Droite_Zoom=Ancienne_Limite_Zoom;
} }
// On vérifie que la limite en bas est visible: // On vérifie que la limite en bas est visible:
if (Bas_visible) if (Bas_visible)
{ {
Debut=Limite_Gauche; Debut=Limite_Gauche;
Fin=(Limite_Droite<Principal_Largeur_image)? Fin=(Limite_Droite<Principal_Largeur_image)?
Limite_Droite:Principal_Largeur_image; Limite_Droite:Principal_Largeur_image;
// On étend également les limites en bas (comme pour la limite droit) // On étend également les limites en bas (comme pour la limite droit)
Ancienne_Limite_Zoom=Limite_Bas_Zoom; Ancienne_Limite_Zoom=Limite_Bas_Zoom;
Limite_Bas_Zoom=Limite_visible_Bas_Zoom; Limite_Bas_Zoom=Limite_visible_Bas_Zoom;
@ -1152,7 +1153,7 @@ void Afficher_limites_de_l_image(void)
// -- Recadrer la partie non-zoomée de l'image par rapport à la partie zoomée // -- Recadrer la partie non-zoomée de l'image par rapport à la partie zoomée
// lorsqu'on scrolle en mode Loupe -- // lorsqu'on scrolle en mode Loupe --
void Recadrer_ecran_par_rapport_au_zoom(void) void Recadrer_ecran_par_rapport_au_zoom(void)
{ {
@ -1186,7 +1187,7 @@ void Recadrer_ecran_par_rapport_au_zoom(void)
} }
// - Calcul des données du split en fonction de la proportion de chaque zone - // - Calcul des données du split en fonction de la proportion de chaque zone -
void Calculer_split(void) void Calculer_split(void)
{ {
//short Temp; //short Temp;
@ -1195,13 +1196,13 @@ void Calculer_split(void)
Principal_X_Zoom=Largeur_ecran-(((Largeur_ecran+(Loupe_Facteur>>1)-X_theorique)/Loupe_Facteur)*Loupe_Facteur); Principal_X_Zoom=Largeur_ecran-(((Largeur_ecran+(Loupe_Facteur>>1)-X_theorique)/Loupe_Facteur)*Loupe_Facteur);
Principal_Split=Principal_X_Zoom-(Menu_Facteur_X*LARGEUR_BARRE_SPLIT); Principal_Split=Principal_X_Zoom-(Menu_Facteur_X*LARGEUR_BARRE_SPLIT);
// Correction en cas de débordement sur la gauche // Correction en cas de débordement sur la gauche
while (Principal_Split*(Loupe_Facteur+1)<Largeur_ecran-(Menu_Facteur_X*LARGEUR_BARRE_SPLIT)) while (Principal_Split*(Loupe_Facteur+1)<Largeur_ecran-(Menu_Facteur_X*LARGEUR_BARRE_SPLIT))
{ {
Principal_Split+=Loupe_Facteur; Principal_Split+=Loupe_Facteur;
Principal_X_Zoom+=Loupe_Facteur; Principal_X_Zoom+=Loupe_Facteur;
} }
// Correction en cas de débordement sur la droite // Correction en cas de débordement sur la droite
X_theorique=Largeur_ecran-((NB_PIXELS_ZOOMES_MIN-1)*Loupe_Facteur); X_theorique=Largeur_ecran-((NB_PIXELS_ZOOMES_MIN-1)*Loupe_Facteur);
while (Principal_X_Zoom>=X_theorique) while (Principal_X_Zoom>=X_theorique)
{ {
@ -1215,7 +1216,7 @@ void Calculer_split(void)
// -------------------- Calcul des information de la loupe ------------------- // -------------------- Calcul des information de la loupe -------------------
void Calculer_donnees_loupe(void) void Calculer_donnees_loupe(void)
/* /*
Après modification des données de la loupe, il faut recalculer les limites. Après modification des données de la loupe, il faut recalculer les limites.
*/ */
{ {
Calculer_split(); Calculer_split();
@ -1236,7 +1237,7 @@ void Calculer_donnees_loupe(void)
// ------------ Changer le facteur de zoom et tout mettre à jour ------------- // ------------ Changer le facteur de zoom et tout mettre à jour -------------
void Changer_facteur_loupe(byte Indice_facteur) void Changer_facteur_loupe(byte Indice_facteur)
{ {
short Centre_X; short Centre_X;
@ -1251,11 +1252,11 @@ void Changer_facteur_loupe(byte Indice_facteur)
if (Loupe_Mode) if (Loupe_Mode)
{ {
// Recalculer le décalage de la loupe // Recalculer le décalage de la loupe
// Centrage "brut" de lécran par rapport à la loupe // Centrage "brut" de lécran par rapport à la loupe
Loupe_Decalage_X=Centre_X-(Loupe_Largeur>>1); Loupe_Decalage_X=Centre_X-(Loupe_Largeur>>1);
Loupe_Decalage_Y=Centre_Y-(Loupe_Hauteur>>1); Loupe_Decalage_Y=Centre_Y-(Loupe_Hauteur>>1);
// Correction en cas de débordement de l'image // Correction en cas de débordement de l'image
if (Loupe_Decalage_X+Loupe_Largeur>Principal_Largeur_image) if (Loupe_Decalage_X+Loupe_Largeur>Principal_Largeur_image)
Loupe_Decalage_X=Principal_Largeur_image-Loupe_Largeur; Loupe_Decalage_X=Principal_Largeur_image-Loupe_Largeur;
if (Loupe_Decalage_Y+Loupe_Hauteur>Principal_Hauteur_image) if (Loupe_Decalage_Y+Loupe_Hauteur>Principal_Hauteur_image)
@ -1279,7 +1280,7 @@ void Changer_facteur_loupe(byte Indice_facteur)
// -- Afficher la barre de séparation entre les parties zoomées ou non en // -- Afficher la barre de séparation entre les parties zoomées ou non en
// mode Loupe -- // mode Loupe --
void Afficher_barre_de_split(void) void Afficher_barre_de_split(void)
@ -1303,11 +1304,11 @@ void Afficher_barre_de_split(void)
Block(Principal_Split+Menu_Facteur_X,Menu_Facteur_Y, Block(Principal_Split+Menu_Facteur_X,Menu_Facteur_Y,
Menu_Facteur_X,(Menu_Ordonnee-(Menu_Facteur_Y<<1)),CM_Blanc); Menu_Facteur_X,(Menu_Ordonnee-(Menu_Facteur_Y<<1)),CM_Blanc);
// Bord droite (gris foncé) // Bord droite (gris foncé)
Block(Principal_X_Zoom-(Menu_Facteur_X<<1),Menu_Facteur_Y, Block(Principal_X_Zoom-(Menu_Facteur_X<<1),Menu_Facteur_Y,
Menu_Facteur_X,(Menu_Ordonnee-(Menu_Facteur_Y<<1)),CM_Fonce); Menu_Facteur_X,(Menu_Ordonnee-(Menu_Facteur_Y<<1)),CM_Fonce);
// Bord bas (gris foncé) // Bord bas (gris foncé)
Block(Principal_Split+(Menu_Facteur_X<<1),Menu_Ordonnee-Menu_Facteur_Y, Block(Principal_Split+(Menu_Facteur_X<<1),Menu_Ordonnee-Menu_Facteur_Y,
(LARGEUR_BARRE_SPLIT-3)*Menu_Facteur_X,Menu_Facteur_Y,CM_Fonce); (LARGEUR_BARRE_SPLIT-3)*Menu_Facteur_X,Menu_Facteur_Y,CM_Fonce);
@ -1318,7 +1319,7 @@ void Afficher_barre_de_split(void)
Block(Principal_X_Zoom-(Menu_Facteur_X<<1),0, Block(Principal_X_Zoom-(Menu_Facteur_X<<1),0,
Menu_Facteur_X,Menu_Facteur_Y,CM_Clair); Menu_Facteur_X,Menu_Facteur_Y,CM_Clair);
UpdateRect(Principal_Split,0,LARGEUR_BARRE_SPLIT*Menu_Facteur_X,Menu_Ordonnee); // On réaffiche toute la partie à gauche du split, ce qui permet d'effacer son ancienne position UpdateRect(Principal_Split,0,LARGEUR_BARRE_SPLIT*Menu_Facteur_X,Menu_Ordonnee); // On réaffiche toute la partie à gauche du split, ce qui permet d'effacer son ancienne position
} }
@ -1326,7 +1327,7 @@ void Afficher_barre_de_split(void)
// -- Fonctions de manipulation du curseur ----------------------------------- // -- Fonctions de manipulation du curseur -----------------------------------
// -- Afficher une barre horizontale XOR zoomée // -- Afficher une barre horizontale XOR zoomée
void Ligne_horizontale_XOR_Zoom(short Pos_X, short Pos_Y, short Largeur) void Ligne_horizontale_XOR_Zoom(short Pos_X, short Pos_Y, short Largeur)
{ {
@ -1343,7 +1344,7 @@ void Ligne_horizontale_XOR_Zoom(short Pos_X, short Pos_Y, short Largeur)
} }
// -- Afficher une barre verticale XOR zoomée // -- Afficher une barre verticale XOR zoomée
void Ligne_verticale_XOR_Zoom(short Pos_X, short Pos_Y, short Hauteur) void Ligne_verticale_XOR_Zoom(short Pos_X, short Pos_Y, short Hauteur)
{ {
@ -1372,8 +1373,8 @@ void Afficher_curseur(void)
short Pos_Y; short Pos_Y;
short Compteur_X; short Compteur_X;
short Compteur_Y; short Compteur_Y;
//short Fin_Compteur_X; // Position X ou s'arrête l'affichage de la brosse/pinceau //short Fin_Compteur_X; // Position X ou s'arrête l'affichage de la brosse/pinceau
//short Fin_Compteur_Y; // Position Y ou s'arrête l'affichage de la brosse/pinceau //short Fin_Compteur_Y; // Position Y ou s'arrête l'affichage de la brosse/pinceau
int Temp; int Temp;
byte Couleur; byte Couleur;
float cosA,sinA; float cosA,sinA;
@ -1464,7 +1465,7 @@ void Afficher_curseur(void)
if (Fin_Y<3) if (Fin_Y<3)
Ligne_verticale_XOR (Mouse_X,Mouse_Y+3,3-Fin_Y); Ligne_verticale_XOR (Mouse_X,Mouse_Y+3,3-Fin_Y);
// Petites barres aux extrémités // Petites barres aux extrémités
Debut_X=(!Mouse_X); Debut_X=(!Mouse_X);
Debut_Y=(!Mouse_Y); Debut_Y=(!Mouse_Y);
@ -1560,7 +1561,7 @@ void Afficher_curseur(void)
} }
break; break;
case FORME_CURSEUR_RECTANGLE_XOR : case FORME_CURSEUR_RECTANGLE_XOR :
// !!! Cette forme ne peut pas être utilisée en mode Loupe !!! // !!! Cette forme ne peut pas être utilisée en mode Loupe !!!
// Petite croix au centre // Petite croix au centre
Debut_X=(Mouse_X-3); Debut_X=(Mouse_X-3);
@ -1669,7 +1670,7 @@ void Afficher_curseur(void)
void Effacer_curseur(void) void Effacer_curseur(void)
{ {
byte Forme; byte Forme;
int Debut_X; // int car sont parfois négatifs ! (quand on dessine sur un bord) int Debut_X; // int car sont parfois négatifs ! (quand on dessine sur un bord)
int Debut_Y; int Debut_Y;
short Fin_X; short Fin_X;
short Fin_Y; short Fin_Y;
@ -1677,8 +1678,8 @@ void Effacer_curseur(void)
int Pos_Y; int Pos_Y;
short Compteur_X; short Compteur_X;
short Compteur_Y; short Compteur_Y;
//short Fin_Compteur_X; // Position X ou s'arrête l'affichage de la brosse/pinceau //short Fin_Compteur_X; // Position X ou s'arrête l'affichage de la brosse/pinceau
//short Fin_Compteur_Y; // Position Y ou s'arrête l'affichage de la brosse/pinceau //short Fin_Compteur_Y; // Position Y ou s'arrête l'affichage de la brosse/pinceau
int Temp; int Temp;
//byte Couleur; //byte Couleur;
float cosA,sinA; float cosA,sinA;
@ -1856,7 +1857,7 @@ void Effacer_curseur(void)
break; break;
case FORME_CURSEUR_RECTANGLE_XOR : case FORME_CURSEUR_RECTANGLE_XOR :
// !!! Cette forme ne peut pas être utilisée en mode Loupe !!! // !!! Cette forme ne peut pas être utilisée en mode Loupe !!!
// Petite croix au centre // Petite croix au centre
Debut_X=(Mouse_X-3); Debut_X=(Mouse_X-3);
@ -1972,7 +1973,7 @@ void Afficher_ecran(void)
word Largeur; word Largeur;
word Hauteur; word Hauteur;
// ---/\/\/\ Partie non zoomée: /\/\/\--- // ---/\/\/\ Partie non zoomée: /\/\/\---
if (Loupe_Mode) if (Loupe_Mode)
{ {
if (Principal_Largeur_image<Principal_Split) if (Principal_Largeur_image<Principal_Split)
@ -1993,7 +1994,7 @@ void Afficher_ecran(void)
Hauteur=Menu_Ordonnee; Hauteur=Menu_Ordonnee;
Display_screen(Largeur,Hauteur,Principal_Largeur_image); Display_screen(Largeur,Hauteur,Principal_Largeur_image);
// Effacement de la partie non-image dans la partie non zoomée: // Effacement de la partie non-image dans la partie non zoomée:
if (Loupe_Mode) if (Loupe_Mode)
{ {
if (Principal_Largeur_image<Principal_Split && Principal_Largeur_image < Largeur_ecran) if (Principal_Largeur_image<Principal_Split && Principal_Largeur_image < Largeur_ecran)
@ -2007,7 +2008,7 @@ void Afficher_ecran(void)
if (Principal_Hauteur_image<Menu_Ordonnee) if (Principal_Hauteur_image<Menu_Ordonnee)
Block(0,Principal_Hauteur_image,Largeur,(Menu_Ordonnee-Hauteur),0); Block(0,Principal_Hauteur_image,Largeur,(Menu_Ordonnee-Hauteur),0);
// ---/\/\/\ Partie zoomée: /\/\/\--- // ---/\/\/\ Partie zoomée: /\/\/\---
if (Loupe_Mode) if (Loupe_Mode)
{ {
// Affichage de la barre de split // Affichage de la barre de split
@ -2019,7 +2020,7 @@ void Afficher_ecran(void)
else else
Largeur=Loupe_Largeur; Largeur=Loupe_Largeur;
// Calcul du nombre de lignes visibles de l'image zoomée // Calcul du nombre de lignes visibles de l'image zoomée
if (Principal_Hauteur_image<Loupe_Hauteur) if (Principal_Hauteur_image<Loupe_Hauteur)
Hauteur=Principal_Hauteur_image*Loupe_Facteur; Hauteur=Principal_Hauteur_image*Loupe_Facteur;
else else
@ -2027,7 +2028,7 @@ void Afficher_ecran(void)
Display_zoomed_screen(Largeur,Hauteur,Principal_Largeur_image,Buffer_de_ligne_horizontale); Display_zoomed_screen(Largeur,Hauteur,Principal_Largeur_image,Buffer_de_ligne_horizontale);
// Effacement de la partie non-image dans la partie zoomée: // Effacement de la partie non-image dans la partie zoomée:
if (Principal_Largeur_image<Loupe_Largeur) if (Principal_Largeur_image<Loupe_Largeur)
Block(Principal_X_Zoom+(Principal_Largeur_image*Loupe_Facteur),0, Block(Principal_X_Zoom+(Principal_Largeur_image*Loupe_Facteur),0,
(Loupe_Largeur-Principal_Largeur_image)*Loupe_Facteur, (Loupe_Largeur-Principal_Largeur_image)*Loupe_Facteur,
@ -2039,7 +2040,7 @@ void Afficher_ecran(void)
// ---/\/\/\ Affichage des limites /\/\/\--- // ---/\/\/\ Affichage des limites /\/\/\---
if (Config.Afficher_limites_image) if (Config.Afficher_limites_image)
Afficher_limites_de_l_image(); Afficher_limites_de_l_image();
UpdateRect(0,0,Largeur_ecran,Menu_Ordonnee); // TODO On peut faire plus fin, en évitant de mettre à jour la partie à droite du split quand on est en mode loupe. Mais c'est pas vraiment intéressant ? UpdateRect(0,0,Largeur_ecran,Menu_Ordonnee); // TODO On peut faire plus fin, en évitant de mettre à jour la partie à droite du split quand on est en mode loupe. Mais c'est pas vraiment intéressant ?
} }
@ -2170,7 +2171,7 @@ byte Old_Trans;
void Remap_pixel(byte * Pix) void Remap_pixel(byte * Pix)
{ {
if (*Pix==Old_Clair) // On commence par tester le Gris clair if (*Pix==Old_Clair) // On commence par tester le Gris clair
*Pix=CM_Clair; // qui est pas mal utilisé. *Pix=CM_Clair; // qui est pas mal utilisé.
else else
{ {
if (*Pix==Old_Noir) // Puis le Noir... if (*Pix==Old_Noir) // Puis le Noir...
@ -2204,7 +2205,7 @@ void Remapper_ecran_apres_changement_couleurs_menu(void)
if ( (CM_Clair!=Old_Clair) || (CM_Fonce!=Old_Fonce) || (CM_Blanc!=Old_Blanc) || (CM_Noir !=Old_Noir ) if ( (CM_Clair!=Old_Clair) || (CM_Fonce!=Old_Fonce) || (CM_Blanc!=Old_Blanc) || (CM_Noir !=Old_Noir )
|| (CM_Trans!=Old_Trans) ) || (CM_Trans!=Old_Trans) )
{ {
// Création de la table de conversion // Création de la table de conversion
for (Indice=0; Indice<256; Indice++) for (Indice=0; Indice<256; Indice++)
Table_de_conversion[Indice]=Indice; Table_de_conversion[Indice]=Indice;
@ -2213,7 +2214,7 @@ void Remapper_ecran_apres_changement_couleurs_menu(void)
Table_de_conversion[Old_Clair]=CM_Clair; Table_de_conversion[Old_Clair]=CM_Clair;
Table_de_conversion[Old_Blanc]=CM_Blanc; Table_de_conversion[Old_Blanc]=CM_Blanc;
// Remappage de l'écran // Remappage de l'écran
Temp=Fenetre_Hauteur*Menu_Facteur_Y; Temp=Fenetre_Hauteur*Menu_Facteur_Y;
@ -2230,11 +2231,11 @@ void Remapper_ecran_apres_changement_couleurs_menu(void)
// Remappage de la partie du fond de la fenetre qui cacherait le menu... // Remappage de la partie du fond de la fenetre qui cacherait le menu...
Remappe_fond_fenetres(Table_de_conversion, Menu_Ordonnee_avant_fenetre, Hauteur_ecran); Remappe_fond_fenetres(Table_de_conversion, Menu_Ordonnee_avant_fenetre, Hauteur_ecran);
/* /*
Il faudrait peut-être remapper les pointillés délimitant l'image. Il faudrait peut-être remapper les pointillés délimitant l'image.
Mais ça va être chiant parce qu'ils peuvent être affichés en mode Loupe. Mais ça va être chiant parce qu'ils peuvent être affichés en mode Loupe.
Mais de toutes façons, c'est franchement facultatif... Mais de toutes façons, c'est franchement facultatif...
*/ */
// On passe la table juste pour ne rafficher que les couleurs modifiées // On passe la table juste pour ne rafficher que les couleurs modifiées
Afficher_palette_du_menu_en_evitant_la_fenetre(Table_de_conversion); Afficher_palette_du_menu_en_evitant_la_fenetre(Table_de_conversion);
} }
} }
@ -2282,7 +2283,7 @@ void Calculer_couleurs_menu_optimales(struct Composantes * Palette)
CM_Clair=Table[2]; CM_Clair=Table[2];
} }
// Recherche du gris foncé // Recherche du gris foncé
Calculer_les_4_meilleures_couleurs_pour_1_couleur_du_menu Calculer_les_4_meilleures_couleurs_pour_1_couleur_du_menu
(Coul_menu_pref[1].R, Coul_menu_pref[1].V, Coul_menu_pref[1].B,Palette,Table); (Coul_menu_pref[1].R, Coul_menu_pref[1].V, Coul_menu_pref[1].B,Palette,Table);
if ( (CM_Noir!=Table[0]) && (CM_Blanc!=Table[0]) && (CM_Clair!=Table[0]) ) if ( (CM_Noir!=Table[0]) && (CM_Blanc!=Table[0]) && (CM_Clair!=Table[0]) )
@ -2300,7 +2301,7 @@ void Calculer_couleurs_menu_optimales(struct Composantes * Palette)
} }
} }
// C'est peu probable mais il est possible que CM_Clair soit plus foncée que // C'est peu probable mais il est possible que CM_Clair soit plus foncée que
// CM_Fonce. Dans ce cas, on les inverse. // CM_Fonce. Dans ce cas, on les inverse.
if ( ((Palette[CM_Clair].R*30)+(Palette[CM_Clair].V*59)+(Palette[CM_Clair].B*11)) < if ( ((Palette[CM_Clair].R*30)+(Palette[CM_Clair].V*59)+(Palette[CM_Clair].B*11)) <
((Palette[CM_Fonce].R*30)+(Palette[CM_Fonce].V*59)+(Palette[CM_Fonce].B*11)) ) ((Palette[CM_Fonce].R*30)+(Palette[CM_Fonce].V*59)+(Palette[CM_Fonce].B*11)) )
@ -2310,7 +2311,7 @@ void Calculer_couleurs_menu_optimales(struct Composantes * Palette)
CM_Fonce=I; CM_Fonce=I;
} }
// On cherche une couleur de transparence différente des 4 autres. // On cherche une couleur de transparence différente des 4 autres.
for (CM_Trans=0; ((CM_Trans==CM_Noir) || (CM_Trans==CM_Fonce) || for (CM_Trans=0; ((CM_Trans==CM_Noir) || (CM_Trans==CM_Fonce) ||
(CM_Trans==CM_Clair) || (CM_Trans==CM_Blanc)); CM_Trans++); (CM_Trans==CM_Clair) || (CM_Trans==CM_Blanc)); CM_Trans++);