Convert comments to UTF-8

most were encoded in Latin1 / CP1252
but a few lines in op_c.c were using IBM437/850 !
This commit is contained in:
Thomas Bernard 2018-06-26 10:54:47 +02:00
parent 6731a57999
commit 92facef46d
53 changed files with 2424 additions and 2424 deletions

View File

@ -2,7 +2,7 @@
# #
# Copyright 2018 Thomas Bernard # Copyright 2018 Thomas Bernard
# Copyright 2012 Franck Charlet # Copyright 2012 Franck Charlet
# Copyright 2011 Pawel Góralski # Copyright 2011 Pawel Góralski
# Copyright 2009 Per Olofsson # Copyright 2009 Per Olofsson
# Copyright 2008 Peter Gordon # Copyright 2008 Peter Gordon
# Copyright 2008-2010 Yves Rizoud # Copyright 2008-2010 Yves Rizoud

View File

@ -42,8 +42,8 @@ static byte * Brush_rotate_buffer;
static int Brush_rotate_width; static int Brush_rotate_width;
static int Brush_rotate_height; static int Brush_rotate_height;
// 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 Compute_clipped_dimensions(short * x,short * y,short * width,short * height) void Compute_clipped_dimensions(short * x,short * y,short * width,short * height)
{ {
if ((*x)<Limit_left) if ((*x)<Limit_left)
@ -69,8 +69,8 @@ void Compute_clipped_dimensions(short * x,short * y,short * width,short * height
} }
} }
// -- 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 Compute_clipped_dimensions_zoom(short * x,short * y,short * width,short * height) void Compute_clipped_dimensions_zoom(short * x,short * y,short * width,short * height)
{ {
@ -101,19 +101,19 @@ void Compute_clipped_dimensions_zoom(short * x,short * y,short * width,short * h
/// Display the paintbrush (preview : on screen only) /// Display the paintbrush (preview : on screen only)
void Display_paintbrush(short x,short y,byte color) void Display_paintbrush(short x,short y,byte color)
// x,y: position du centre du pinceau // x,y: position du centre du pinceau
// color: couleur à appliquer au pinceau // color: couleur à appliquer au pinceau
{ {
short start_x; // Position X (dans l'image) à partir de laquelle on short start_x; // Position X (dans l'image) à partir de laquelle on
// affiche la brosse/pinceau // affiche la brosse/pinceau
short start_y; // Position Y (dans l'image) à partir de laquelle on short start_y; // Position Y (dans l'image) à partir de laquelle on
// affiche la brosse/pinceau // affiche la brosse/pinceau
short width; // width dans l'écran selon laquelle on affiche la short width; // width dans l'écran selon laquelle on affiche la
// brosse/pinceau // brosse/pinceau
short height; // height dans l'écran selon laquelle on affiche la short height; // height dans l'écran selon laquelle on affiche la
// brosse/pinceau // brosse/pinceau
short start_x_counter; // Position X (dans la brosse/pinceau) à partir short start_x_counter; // Position X (dans la brosse/pinceau) à partir
// de laquelle on affiche la brosse/pinceau // de laquelle on affiche la brosse/pinceau
short start_y_counter; // Position Y (dans la brosse/pinceau) à partir short start_y_counter; // Position Y (dans la brosse/pinceau) à partir
// de laquelle on affiche la brosse/pinceau // de laquelle on affiche la brosse/pinceau
byte * temp; byte * temp;
@ -256,19 +256,19 @@ void Display_paintbrush(short x,short y,byte color)
/// Draw the paintbrush in the image buffer /// Draw the paintbrush in the image buffer
void Draw_paintbrush(short x,short y,byte color) void Draw_paintbrush(short x,short y,byte color)
// x,y: position du centre du pinceau // x,y: position du centre du pinceau
// color: couleur à appliquer au pinceau // color: couleur à appliquer au pinceau
{ {
short start_x; // Position X (dans l'image) à partir de laquelle on short start_x; // Position X (dans l'image) à partir de laquelle on
// affiche la brosse/pinceau // affiche la brosse/pinceau
short start_y; // Position Y (dans l'image) à partir de laquelle on short start_y; // Position Y (dans l'image) à partir de laquelle on
// affiche la brosse/pinceau // affiche la brosse/pinceau
short width; // width dans l'écran selon laquelle on affiche la short width; // width dans l'écran selon laquelle on affiche la
// brosse/pinceau // brosse/pinceau
short height; // height dans l'écran selon laquelle on affiche la short height; // height dans l'écran selon laquelle on affiche la
// brosse/pinceau // brosse/pinceau
short start_x_counter; // Position X (dans la brosse/pinceau) à partir short start_x_counter; // Position X (dans la brosse/pinceau) à partir
// de laquelle on affiche la brosse/pinceau // de laquelle on affiche la brosse/pinceau
short start_y_counter; // Position Y (dans la brosse/pinceau) à partir short start_y_counter; // Position Y (dans la brosse/pinceau) à partir
// de laquelle on affiche la brosse/pinceau // de laquelle on affiche la brosse/pinceau
short x_pos; // Position X (dans l'image) en cours d'affichage short x_pos; // Position X (dans l'image) en cours d'affichage
short y_pos; // Position Y (dans l'image) en cours d'affichage short y_pos; // Position Y (dans l'image) en cours d'affichage
@ -276,9 +276,9 @@ void Draw_paintbrush(short x,short y,byte color)
// d'affichage // d'affichage
short counter_y; // Position Y (dans la brosse/pinceau) en cours short counter_y; // Position Y (dans la brosse/pinceau) en cours
// d'affichage // d'affichage
short end_counter_x; // Position X ou s'arrête l'affichade de la short end_counter_x; // Position X ou s'arrête l'affichade de la
// brosse/pinceau // brosse/pinceau
short end_counter_y; // Position Y ou s'arrête l'affichade de la short end_counter_y; // Position Y ou s'arrête l'affichade de la
// brosse/pinceau // brosse/pinceau
byte temp_color; // color de la brosse en cours d'affichage byte temp_color; // color de la brosse en cours d'affichage
int position; int position;
@ -688,17 +688,17 @@ byte Realloc_brush(word new_brush_width, word new_brush_height, byte *new_brush,
void Hide_paintbrush(short x,short y) void Hide_paintbrush(short x,short y)
// x,y: position du centre du pinceau // x,y: position du centre du pinceau
{ {
short start_x; // Position X (dans l'image) à partir de laquelle on short start_x; // Position X (dans l'image) à partir de laquelle on
// affiche la brosse/pinceau // affiche la brosse/pinceau
short start_y; // Position Y (dans l'image) à partir de laquelle on short start_y; // Position Y (dans l'image) à partir de laquelle on
// affiche la brosse/pinceau // affiche la brosse/pinceau
short width; // width dans l'écran selon laquelle on affiche la short width; // width dans l'écran selon laquelle on affiche la
// brosse/pinceau // brosse/pinceau
short height; // height dans l'écran selon laquelle on affiche la short height; // height dans l'écran selon laquelle on affiche la
// brosse/pinceau // brosse/pinceau
short start_x_counter; // Position X (dans la brosse/pinceau) à partir short start_x_counter; // Position X (dans la brosse/pinceau) à partir
// de laquelle on affiche la brosse/pinceau // de laquelle on affiche la brosse/pinceau
short start_y_counter; // Position Y (dans la brosse/pinceau) à partir short start_y_counter; // Position Y (dans la brosse/pinceau) à partir
// de laquelle on affiche la brosse/pinceau // de laquelle on affiche la brosse/pinceau
//short x_pos; // Position X (dans l'image) en cours d'affichage //short x_pos; // Position X (dans l'image) en cours d'affichage
//short y_pos; // Position Y (dans l'image) en cours d'affichage //short y_pos; // Position Y (dans l'image) en cours d'affichage
@ -839,10 +839,10 @@ void Capture_brush(short start_x,short start_y,short end_x,short end_y,short cle
if ((start_x<Main.image_width) && (start_y<Main.image_height)) if ((start_x<Main.image_width) && (start_y<Main.image_height))
{ {
// 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_offset_X=0; Tiling_offset_X=0;
Tiling_offset_Y=0; Tiling_offset_Y=0;
@ -922,7 +922,7 @@ void Remap_brush(void)
int color; int color;
// On commence par initialiser le tableau de booléens à faux // On commence par initialiser le tableau de booléens à faux
for (color=0;color<=255;color++) for (color=0;color<=255;color++)
Brush_colormap[color]=0; Brush_colormap[color]=0;
@ -931,18 +931,18 @@ void Remap_brush(void)
for (x_pos=0;x_pos<Brush_width;x_pos++) for (x_pos=0;x_pos<Brush_width;x_pos++)
Brush_colormap[*(Brush_original_pixels + y_pos * Brush_width + x_pos)]=1; Brush_colormap[*(Brush_original_pixels + y_pos * Brush_width + x_pos)]=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
Brush_colormap[Back_color]=0; Brush_colormap[Back_color]=0;
// On va maintenant se servir de la table comme table de // On va maintenant se servir de la table 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_general_lowlevel. // ne seront pas utilisées par Remap_general_lowlevel.
for (color=0;color<=255;color++) for (color=0;color<=255;color++)
if (Brush_colormap[color] != 0) if (Brush_colormap[color] != 0)
{ {
@ -959,16 +959,16 @@ void Remap_brush(void)
Brush_colormap[color]=Best_color_perceptual_except(r,g,b,Back_color); Brush_colormap[color]=Best_color_perceptual_except(r,g,b,Back_color);
} }
// 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.
Brush_colormap[Back_color]=Back_color; Brush_colormap[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(Brush_colormap,Brush_original_pixels,Brush,Brush_width,Brush_height,Brush_width); Remap_general_lowlevel(Brush_colormap,Brush_original_pixels,Brush,Brush_width,Brush_height,Brush_width);
@ -996,7 +996,7 @@ void Outline_brush(void)
return; return;
} }
// On remplit la bordure ajoutée par la Backcolor // On remplit la bordure ajoutée par la Backcolor
memset(Brush,Back_color,((long)Brush_width)*Brush_height); memset(Brush,Back_color,((long)Brush_width)*Brush_height);
// On copie la brosse courante dans la nouvelle // On copie la brosse courante dans la nouvelle
@ -1005,7 +1005,7 @@ void Outline_brush(void)
Brush, // Destination Brush, // Destination
1, 1, Brush_width); 1, 1, Brush_width);
// 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)
@ -1028,12 +1028,12 @@ void Outline_brush(void)
state=1; state=1;
} }
} }
// Cas du dernier pixel à droite de la ligne // Cas du dernier pixel à droite de la ligne
if (state != 0) if (state != 0)
Pixel_in_brush(x_pos,y_pos,Fore_color); Pixel_in_brush(x_pos,y_pos,Fore_color);
} }
// 2ème balayage (vertical) // 2ème balayage (vertical)
for (x_pos=1; x_pos<Brush_width-1; x_pos++) for (x_pos=1; x_pos<Brush_width-1; x_pos++)
{ {
state=0; state=0;
@ -1069,7 +1069,7 @@ void Outline_brush(void)
Brush_offset_X=(Brush_width>>1); Brush_offset_X=(Brush_width>>1);
Brush_offset_Y=(Brush_height>>1); Brush_offset_Y=(Brush_height>>1);
free(old_brush); // Libération de l'ancienne brosse free(old_brush); // Libération de l'ancienne brosse
} }
@ -1131,12 +1131,12 @@ void Nibble_brush(void)
} }
} }
} }
// Cas du dernier pixel à droite de la ligne // Cas du dernier pixel à droite de la ligne
if (old_brush[((y_pos+1)*old_width)+x_pos+1]==Back_color) if (old_brush[((y_pos+1)*old_width)+x_pos+1]==Back_color)
Pixel_in_brush(x_pos-1,y_pos,Back_color); Pixel_in_brush(x_pos-1,y_pos,Back_color);
} }
// 2ème balayage (vertical) // 2ème balayage (vertical)
for (x_pos=0; x_pos<Brush_width; x_pos++) for (x_pos=0; x_pos<Brush_width; x_pos++)
{ {
state=(old_brush[old_width+x_pos+1]!=Back_color);; state=(old_brush[old_width+x_pos+1]!=Back_color);;
@ -1209,7 +1209,7 @@ void Capture_brush_with_lasso(int vertices, short * points,short clear)
end_y=y_pos; end_y=y_pos;
} }
// On clippe ces bornes à l'écran: // On clippe ces bornes à l'écran:
if (start_x<Limit_left) if (start_x<Limit_left)
start_x=Limit_left; start_x=Limit_left;
if (end_x>Limit_right) if (end_x>Limit_right)
@ -1224,10 +1224,10 @@ void Capture_brush_with_lasso(int vertices, short * points,short clear)
if ((start_x<Main.image_width) && (start_y<Main.image_height)) if ((start_x<Main.image_width) && (start_y<Main.image_height))
{ {
// 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_offset_X=0; Tiling_offset_X=0;
Tiling_offset_Y=0; Tiling_offset_Y=0;
@ -1260,7 +1260,7 @@ void Capture_brush_with_lasso(int vertices, short * points,short clear)
points[0],points[1], points[0],points[1],
xor_lut[Back_color]); xor_lut[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 (y_pos=start_y;y_pos<=end_y;y_pos++) for (y_pos=start_y;y_pos<=end_y;y_pos++)
for (x_pos=start_x;x_pos<=end_x;x_pos++) for (x_pos=start_x;x_pos<=end_x;x_pos++)
@ -1367,7 +1367,7 @@ void Stretch_brush_preview(short x1, short y1, short x2, short y2)
dest_width=final_dest_x_pos-initial_dest_x_pos+1; dest_width=final_dest_x_pos-initial_dest_x_pos+1;
dest_height=final_dest_y_pos-initial_dest_y_pos+1; dest_height=final_dest_y_pos-initial_dest_y_pos+1;
// Calcul des vecteurs d'incrémentation : // Calcul des vecteurs d'incrémentation :
delta_x=(Brush_width<<16)/dest_width; delta_x=(Brush_width<<16)/dest_width;
delta_y=(Brush_height<<16)/dest_height; delta_y=(Brush_height<<16)/dest_height;
@ -1691,7 +1691,7 @@ void Interpolate_texture(int start_x,int start_y,int xt1,int yt1,
{ {
xt=(((float)((x_pos-start_x)*delta_xt))/(float)delta_x2) + (float)xt1; xt=(((float)((x_pos-start_x)*delta_xt))/(float)delta_x2) + (float)xt1;
yt=(((float)((x_pos-start_x)*delta_yt))/(float)delta_x2) + (float)yt1; yt=(((float)((x_pos-start_x)*delta_yt))/(float)delta_x2) + (float)yt1;
if (isnan(ScanY_X[0][y_pos])) // Gauche non défini if (isnan(ScanY_X[0][y_pos])) // Gauche non défini
{ {
ScanY_X[0][y_pos]=(float)x_pos; ScanY_X[0][y_pos]=(float)x_pos;
ScanY_Xt[0][y_pos]=xt; ScanY_Xt[0][y_pos]=xt;
@ -1701,7 +1701,7 @@ void Interpolate_texture(int start_x,int start_y,int xt1,int yt1,
{ {
if ((float)x_pos>=ScanY_X[0][y_pos]) if ((float)x_pos>=ScanY_X[0][y_pos])
{ {
if (isnan(ScanY_X[1][y_pos]) // Droit non défini if (isnan(ScanY_X[1][y_pos]) // Droit non défini
|| (x_pos>ScanY_X[1][y_pos])) || (x_pos>ScanY_X[1][y_pos]))
{ {
ScanY_X[1][y_pos]=(float)x_pos; ScanY_X[1][y_pos]=(float)x_pos;
@ -1711,7 +1711,7 @@ void Interpolate_texture(int start_x,int start_y,int xt1,int yt1,
} }
else else
{ {
if (isnan(ScanY_X[1][y_pos])) // Droit non défini if (isnan(ScanY_X[1][y_pos])) // Droit non défini
{ {
ScanY_X[1][y_pos]=ScanY_X[0][y_pos]; ScanY_X[1][y_pos]=ScanY_X[0][y_pos];
ScanY_Xt[1][y_pos]=ScanY_Xt[0][y_pos]; ScanY_Xt[1][y_pos]=ScanY_Xt[0][y_pos];
@ -1748,7 +1748,7 @@ void Interpolate_texture(int start_x,int start_y,int xt1,int yt1,
{ {
xt=(((float)((y_pos-start_y)*delta_xt))/(float)delta_y2) + (float)xt1; xt=(((float)((y_pos-start_y)*delta_xt))/(float)delta_y2) + (float)xt1;
yt=(((float)((y_pos-start_y)*delta_yt))/(float)delta_y2) + (float)yt1; yt=(((float)((y_pos-start_y)*delta_yt))/(float)delta_y2) + (float)yt1;
if (isnan(ScanY_X[0][y_pos])) // Gauche non défini if (isnan(ScanY_X[0][y_pos])) // Gauche non défini
{ {
ScanY_X[0][y_pos]=(float)x_pos; ScanY_X[0][y_pos]=(float)x_pos;
ScanY_Xt[0][y_pos]=xt; ScanY_Xt[0][y_pos]=xt;
@ -1758,7 +1758,7 @@ void Interpolate_texture(int start_x,int start_y,int xt1,int yt1,
{ {
if ((float)x_pos>=ScanY_X[0][y_pos]) if ((float)x_pos>=ScanY_X[0][y_pos])
{ {
if (isnan(ScanY_X[1][y_pos]) // Droit non défini if (isnan(ScanY_X[1][y_pos]) // Droit non défini
|| (x_pos>ScanY_X[1][y_pos])) || (x_pos>ScanY_X[1][y_pos]))
{ {
ScanY_X[1][y_pos]=(float)x_pos; ScanY_X[1][y_pos]=(float)x_pos;
@ -1768,7 +1768,7 @@ void Interpolate_texture(int start_x,int start_y,int xt1,int yt1,
} }
else else
{ {
if (isnan(ScanY_X[1][y_pos])) // Droit non défini if (isnan(ScanY_X[1][y_pos])) // Droit non défini
{ {
ScanY_X[1][y_pos]=ScanY_X[0][y_pos]; ScanY_X[1][y_pos]=ScanY_X[0][y_pos];
ScanY_Xt[1][y_pos]=ScanY_Xt[0][y_pos]; ScanY_Xt[1][y_pos]=ScanY_Xt[0][y_pos];
@ -1817,7 +1817,7 @@ void Compute_quad_texture( byte *texture, int texture_width,
ScanY_X[0] =(float *)malloc(height*sizeof(float)); ScanY_X[0] =(float *)malloc(height*sizeof(float));
ScanY_X[1] =(float *)malloc(height*sizeof(float)); ScanY_X[1] =(float *)malloc(height*sizeof(float));
// Fill_general avec des valeurs égales à NAN. // Fill_general avec des valeurs égales à NAN.
for (y=0; y<height; y++) for (y=0; y<height; y++)
{ {
ScanY_X[0][y]=NAN ; ScanY_X[0][y]=NAN ;
@ -1947,7 +1947,7 @@ void Rotate_brush(float angle)
float cos_a=cos(angle); float cos_a=cos(angle);
float sin_a=sin(angle); float sin_a=sin(angle);
// Calcul des coordonnées des 4 coins: // Calcul des coordonnées des 4 coins:
// 1 2 // 1 2
// 3 4 // 3 4
@ -1978,7 +1978,7 @@ void Rotate_brush(float angle)
Error(0); Error(0);
return; return;
} }
// Et maintenant on calcule la nouvelle brosse tournée. // Et maintenant on calcule la nouvelle brosse tournée.
Compute_quad_texture( Brush_rotate_buffer, Brush_rotate_width, Compute_quad_texture( Brush_rotate_buffer, Brush_rotate_width,
x1,y1, offset, offset, x1,y1, offset, offset,
x2,y2,Brush_rotate_width-offset-1, offset, x2,y2,Brush_rotate_width-offset-1, offset,
@ -2026,7 +2026,7 @@ void Draw_quad_texture_preview(byte *texture, int texture_width,
ScanY_X[0] =(float *)malloc(height*sizeof(float)); ScanY_X[0] =(float *)malloc(height*sizeof(float));
ScanY_X[1] =(float *)malloc(height*sizeof(float)); ScanY_X[1] =(float *)malloc(height*sizeof(float));
// Fill_general avec des valeurs égales à NAN. // Fill_general avec des valeurs égales à NAN.
for (y=0; y<height; y++) for (y=0; y<height; y++)
{ {
ScanY_X[0][y]=NAN; ScanY_X[0][y]=NAN;
@ -2086,7 +2086,7 @@ void Rotate_brush_preview(float angle)
float sin_a=sin(angle); float sin_a=sin(angle);
int offset=0; int offset=0;
// Calcul des coordonnées des 4 coins: // Calcul des coordonnées des 4 coins:
// 1 2 // 1 2
// 3 4 // 3 4
@ -2110,7 +2110,7 @@ void Rotate_brush_preview(float angle)
x4+=Brush_rotation_center_X; x4+=Brush_rotation_center_X;
y4+=Brush_rotation_center_Y; y4+=Brush_rotation_center_Y;
// Et maintenant on dessine la brosse tournée. // Et maintenant on dessine la brosse tournée.
Draw_quad_texture_preview(Brush_rotate_buffer, Brush_rotate_width, Draw_quad_texture_preview(Brush_rotate_buffer, Brush_rotate_width,
x1, y1, offset, offset, x1, y1, offset, offset,
x2, y2, Brush_rotate_width-offset-1, offset, x2, y2, Brush_rotate_width-offset-1, offset,

View File

@ -47,20 +47,20 @@ void Return_to_draw_mode(void)
{ {
// Comme l'enclenchement du bouton efface le curseur, il faut l'afficher au // Comme l'enclenchement du bouton efface le curseur, il faut l'afficher au
// préalable: // préalable:
Display_cursor(); Display_cursor();
if (Mouse_K) if (Mouse_K)
Wait_end_of_click(); Wait_end_of_click();
// !!! Efface la croix puis affiche le viseur !!! // !!! Efface la croix puis affiche le viseur !!!
Select_button(BUTTON_DRAW,LEFT_SIDE); // Désenclenche au passage le bouton brosse Select_button(BUTTON_DRAW,LEFT_SIDE); // Désenclenche au passage le bouton brosse
if (Config.Auto_discontinuous) if (Config.Auto_discontinuous)
{ {
// On se place en mode Dessin discontinu à la main // On se place en mode Dessin discontinu à la main
while (Current_operation!=OPERATION_DISCONTINUOUS_DRAW) while (Current_operation!=OPERATION_DISCONTINUOUS_DRAW)
Select_button(BUTTON_DRAW,RIGHT_SIDE); Select_button(BUTTON_DRAW,RIGHT_SIDE);
} }
// Maintenant, il faut réeffacer le curseur parce qu'il sera raffiché en fin // Maintenant, il faut réeffacer le curseur parce qu'il sera raffiché en fin
// d'appel à cette action: // d'appel à cette action:
Hide_cursor(); Hide_cursor();
// On passe en brosse couleur: // On passe en brosse couleur:
@ -76,40 +76,40 @@ void Return_to_draw_mode(void)
void Magnifier_12_0(void) void Magnifier_12_0(void)
// Opération : 4 (item d'une Loupe) // Opération : 4 (item d'une Loupe)
// Click Souris: 1 ou 2 // Click Souris: 1 ou 2
// Taille_Pile : 0 // Taille_Pile : 0
// //
// Souris effacée: Oui // Souris effacée: Oui
{ {
// On passe en mode loupe // On passe en mode loupe
Main.magnifier_mode=1; Main.magnifier_mode=1;
// La fonction d'affichage dans la partie image est désormais un affichage // La fonction d'affichage dans la partie image est désormais un affichage
// spécial loupe. // spécial loupe.
Pixel_preview=Pixel_preview_magnifier; Pixel_preview=Pixel_preview_magnifier;
// On calcule l'origine de la loupe // On calcule l'origine de la loupe
Main.magnifier_offset_X=Mouse_X-(Main.magnifier_width>>1); Main.magnifier_offset_X=Mouse_X-(Main.magnifier_width>>1);
Main.magnifier_offset_Y=Mouse_Y-(Main.magnifier_height>>1); Main.magnifier_offset_Y=Mouse_Y-(Main.magnifier_height>>1);
// Calcul des coordonnées absolues de ce coin DANS L'IMAGE // Calcul des coordonnées absolues de ce coin DANS L'IMAGE
Main.magnifier_offset_X+=Main.offset_X; Main.magnifier_offset_X+=Main.offset_X;
Main.magnifier_offset_Y+=Main.offset_Y; Main.magnifier_offset_Y+=Main.offset_Y;
Clip_magnifier_offsets(&Main.magnifier_offset_X, &Main.magnifier_offset_Y); Clip_magnifier_offsets(&Main.magnifier_offset_X, &Main.magnifier_offset_Y);
// On calcule les bornes visibles dans l'écran // On calcule les bornes visibles dans l'écran
Position_screen_according_to_zoom(); Position_screen_according_to_zoom();
Compute_limits(); Compute_limits();
Display_all_screen(); Display_all_screen();
// Repositionner le curseur en fonction des coordonnées visibles // Repositionner le curseur en fonction des coordonnées visibles
Compute_paintbrush_coordinates(); Compute_paintbrush_coordinates();
// On fait de notre mieux pour restaurer l'ancienne opération: // On fait de notre mieux pour restaurer l'ancienne opération:
Start_operation_stack(Operation_before_interrupt); Start_operation_stack(Operation_before_interrupt);
Display_cursor(); Display_cursor();
Wait_end_of_click(); Wait_end_of_click();
@ -121,11 +121,11 @@ void Magnifier_12_0(void)
void Colorpicker_12_0(void) void Colorpicker_12_0(void)
// //
// Opération : OPERATION_COLORPICK // Opération : OPERATION_COLORPICK
// Click Souris: 1 ou 2 // Click Souris: 1 ou 2
// Taille_Pile : 0 // Taille_Pile : 0
// //
// Souris effacée: Oui // Souris effacée: Oui
// //
{ {
Init_start_operation(); Init_start_operation();
@ -144,11 +144,11 @@ void Colorpicker_12_0(void)
void Colorpicker_1_1(void) void Colorpicker_1_1(void)
// //
// Opération : OPERATION_COLORPICK // Opération : OPERATION_COLORPICK
// Click Souris: 1 // Click Souris: 1
// Taille_Pile : 1 // Taille_Pile : 1
// //
// Souris effacée: Non // Souris effacée: Non
// //
{ {
char str[4]; char str[4];
@ -186,11 +186,11 @@ void Colorpicker_1_1(void)
void Colorpicker_2_1(void) void Colorpicker_2_1(void)
// //
// Opération : OPERATION_COLORPICK // Opération : OPERATION_COLORPICK
// Click Souris: 2 // Click Souris: 2
// Taille_Pile : 1 // Taille_Pile : 1
// //
// Souris effacée: Non // Souris effacée: Non
// //
{ {
char str[4]; char str[4];
@ -229,11 +229,11 @@ void Colorpicker_2_1(void)
void Colorpicker_0_1(void) void Colorpicker_0_1(void)
// //
// Opération : OPERATION_COLORPICK // Opération : OPERATION_COLORPICK
// Click Souris: 0 // Click Souris: 0
// Taille_Pile : 1 // Taille_Pile : 1
// //
// Souris effacée: Oui // Souris effacée: Oui
// //
{ {
short click; short click;
@ -287,11 +287,11 @@ byte Rightclick_colorpick(byte cursor_visible)
void Rightclick_colorpick_2_1(void) void Rightclick_colorpick_2_1(void)
// //
// Opération : OPERATION_RMB_COLORPICK // Opération : OPERATION_RMB_COLORPICK
// Click Souris: 2 // Click Souris: 2
// Taille_Pile : 1 // Taille_Pile : 1
// //
// Souris effacée: Non // Souris effacée: Non
// //
{ {
char str[4]; char str[4];
@ -323,11 +323,11 @@ void Rightclick_colorpick_2_1(void)
void Rightclick_colorpick_0_1(void) void Rightclick_colorpick_0_1(void)
// //
// Opération : OPERATION_RMB_COLORPICK // Opération : OPERATION_RMB_COLORPICK
// Click Souris: 0 // Click Souris: 0
// Taille_Pile : 1 // Taille_Pile : 1
// //
// Souris effacée: Non // Souris effacée: Non
// //
{ {
short dummy; short dummy;
@ -356,31 +356,31 @@ void Rightclick_colorpick_0_1(void)
void Brush_12_0(void) void Brush_12_0(void)
// //
// Opération : OPERATION_GRAB_BRUSH // Opération : OPERATION_GRAB_BRUSH
// Click Souris: 1 ou 2 // Click Souris: 1 ou 2
// Taille_Pile : 0 // Taille_Pile : 0
// //
// Souris effacée: Oui // Souris effacée: Oui
// //
{ {
Init_start_operation(); Init_start_operation();
if (Mouse_K==RIGHT_SIDE) // Besoin d'effacer la brosse après ? if (Mouse_K==RIGHT_SIDE) // Besoin d'effacer la brosse après ?
{ {
Operation_push(1); Operation_push(1);
// Puisque la zone où on prend la brosse sera effacée, on fait un backup // Puisque la zone où on prend la brosse sera effacée, on fait un backup
Backup(); Backup();
} }
else else
Operation_push(0); Operation_push(0);
// On laisse une trace du curseur pour que l'utilisateur puisse visualiser // On laisse une trace du curseur pour que l'utilisateur puisse visualiser
// où demarre sa brosse: // où demarre sa brosse:
Display_cursor(); Display_cursor();
Operation_push(Paintbrush_X); // Début X Operation_push(Paintbrush_X); // Début X
Operation_push(Paintbrush_Y); // Début Y Operation_push(Paintbrush_Y); // Début Y
Operation_push(Paintbrush_X); // Dernière position X Operation_push(Paintbrush_X); // Dernière position X
Operation_push(Paintbrush_Y); // Dernière position Y Operation_push(Paintbrush_Y); // Dernière position Y
if ((Config.Coords_rel) && (Menu_is_visible)) if ((Config.Coords_rel) && (Menu_is_visible))
Print_in_menu("\035: 1 \022: 1",0); Print_in_menu("\035: 1 \022: 1",0);
@ -389,11 +389,11 @@ void Brush_12_0(void)
void Brush_12_5(void) void Brush_12_5(void)
// //
// Opération : OPERATION_GRAB_BRUSH // Opération : OPERATION_GRAB_BRUSH
// Click Souris: 1 ou 2 // Click Souris: 1 ou 2
// Taille_Pile : 5 // Taille_Pile : 5
// //
// Souris effacée: Non // Souris effacée: Non
// //
{ {
char str[5]; char str[5];
@ -435,11 +435,11 @@ void Brush_12_5(void)
void Brush_0_5(void) void Brush_0_5(void)
// //
// Opération : OPERATION_GRAB_BRUSH // Opération : OPERATION_GRAB_BRUSH
// Click Souris: 0 // Click Souris: 0
// Taille_Pile : 5 // Taille_Pile : 5
// //
// Souris effacée: Oui // Souris effacée: Oui
// //
{ {
short start_x; short start_x;
@ -448,7 +448,7 @@ void Brush_0_5(void)
short old_paintbrush_y; short old_paintbrush_y;
short clear; short clear;
// Comme on a demandé l'effacement du curseur, il n'y a plus de croix en // Comme on a demandé l'effacement du curseur, il n'y a plus de croix en
// (Paintbrush_X,Paintbrush_Y). C'est une bonne chose. // (Paintbrush_X,Paintbrush_Y). C'est une bonne chose.
Operation_stack_size-=2; Operation_stack_size-=2;
@ -461,7 +461,7 @@ void Brush_0_5(void)
old_paintbrush_y=Paintbrush_Y; old_paintbrush_y=Paintbrush_Y;
Paintbrush_X=start_x; Paintbrush_X=start_x;
Paintbrush_Y=start_y; Paintbrush_Y=start_y;
Hide_cursor(); // Maintenant, il n'y a plus de croix à l'écran. Hide_cursor(); // Maintenant, il n'y a plus de croix à l'écran.
Paintbrush_X=old_paintbrush_x; Paintbrush_X=old_paintbrush_x;
Paintbrush_Y=old_paintbrush_y; Paintbrush_Y=old_paintbrush_y;
@ -500,11 +500,11 @@ void Brush_0_5(void)
void Polybrush_12_8(void) void Polybrush_12_8(void)
// Opération : OPERATION_POLYBRUSH // Opération : OPERATION_POLYBRUSH
// Click Souris: 1 ou 2 // Click Souris: 1 ou 2
// Taille_Pile : 8 // Taille_Pile : 8
// //
// Souris effacée: Non // Souris effacée: Non
{ {
short click; short click;
short end_y; short end_y;
@ -528,13 +528,13 @@ void Polybrush_12_8(void)
if (((start_x!=Paintbrush_X) || (start_y!=Paintbrush_Y)) && if (((start_x!=Paintbrush_X) || (start_y!=Paintbrush_Y)) &&
(Polyfill_number_of_points<Config.Nb_max_vertices_per_polygon)) (Polyfill_number_of_points<Config.Nb_max_vertices_per_polygon))
{ {
// Il existe un nouveau segment défini par // Il existe un nouveau segment défini par
// (start_x,start_y)-(Paintbrush_X,Paintbrush_Y) // (start_x,start_y)-(Paintbrush_X,Paintbrush_Y)
Hide_cursor(); Hide_cursor();
Print_coordinates(); Print_coordinates();
// On le place à l'écran // On le place à l'écran
Draw_line_preview_xor(start_x,start_y,end_x,end_y,0); Draw_line_preview_xor(start_x,start_y,end_x,end_y,0);
Draw_line_preview_xor(start_x,start_y,Paintbrush_X,Paintbrush_Y,0); Draw_line_preview_xor(start_x,start_y,Paintbrush_X,Paintbrush_Y,0);
@ -563,13 +563,13 @@ void Polybrush_12_8(void)
Hide_cursor(); Hide_cursor();
Print_coordinates(); Print_coordinates();
// On le place à l'écran // On le place à l'écran
Draw_line_preview_xor(start_x,start_y,end_x,end_y,0); Draw_line_preview_xor(start_x,start_y,end_x,end_y,0);
Draw_line_preview_xor(start_x,start_y,Paintbrush_X,Paintbrush_Y,0); Draw_line_preview_xor(start_x,start_y,Paintbrush_X,Paintbrush_Y,0);
Display_cursor(); Display_cursor();
} }
// On remet les mêmes valeurs (comme si on n'avait pas cliqué): // On remet les mêmes valeurs (comme si on n'avait pas cliqué):
Operation_push(start_x); Operation_push(start_x);
Operation_push(start_y); Operation_push(start_y);
Operation_push(Paintbrush_X); Operation_push(Paintbrush_X);
@ -588,7 +588,7 @@ void Polybrush_12_8(void)
} }
else else
{ {
// L'utilisateur souhaite arrêter l'opération et refermer le polygone // L'utilisateur souhaite arrêter l'opération et refermer le polygone
Operation_pop(&color); Operation_pop(&color);
Operation_pop(&initial_y); Operation_pop(&initial_y);
@ -607,8 +607,8 @@ void Polybrush_12_8(void)
if (click==RIGHT_SIDE) if (click==RIGHT_SIDE)
End_of_modification(); End_of_modification();
// On raffiche l'écran pour effacer les traits en xor et pour raffraichir // On raffiche l'écran pour effacer les traits en xor et pour raffraichir
// l'écran si on a découpé une partie de l'image en prenant la brosse. // l'écran si on a découpé une partie de l'image en prenant la brosse.
Display_all_screen(); Display_all_screen();
Paintbrush_hidden=0; Paintbrush_hidden=0;
@ -630,27 +630,27 @@ void Polybrush_12_8(void)
void Stretch_brush_12_0(void) void Stretch_brush_12_0(void)
// //
// Opération : OPERATION_STRETCH_BRUSH // Opération : OPERATION_STRETCH_BRUSH
// Click Souris: 1 ou 2 // Click Souris: 1 ou 2
// Taille_Pile : 0 // Taille_Pile : 0
// //
// Souris effacée: Oui // Souris effacée: Oui
// //
{ {
Init_start_operation(); Init_start_operation();
if (Mouse_K==LEFT_SIDE) if (Mouse_K==LEFT_SIDE)
{ {
// On laisse une trace du curseur pour que l'utilisateur puisse visualiser // On laisse une trace du curseur pour que l'utilisateur puisse visualiser
// où demarre sa brosse: // où demarre sa brosse:
Display_cursor(); Display_cursor();
Operation_push(Paintbrush_X); // Dernier calcul X Operation_push(Paintbrush_X); // Dernier calcul X
Operation_push(Paintbrush_Y); // Dernier calcul Y Operation_push(Paintbrush_Y); // Dernier calcul Y
Operation_push(Paintbrush_X); // Début X Operation_push(Paintbrush_X); // Début X
Operation_push(Paintbrush_Y); // Début Y Operation_push(Paintbrush_Y); // Début Y
Operation_push(Paintbrush_X); // Dernière position X Operation_push(Paintbrush_X); // Dernière position X
Operation_push(Paintbrush_Y); // Dernière position Y Operation_push(Paintbrush_Y); // Dernière position Y
Operation_push(1); // State précédent Operation_push(1); // State précédent
if ((Config.Coords_rel) && (Menu_is_visible)) if ((Config.Coords_rel) && (Menu_is_visible))
Print_in_menu("\035: 1 \022: 1",0); Print_in_menu("\035: 1 \022: 1",0);
@ -666,11 +666,11 @@ void Stretch_brush_12_0(void)
void Stretch_brush_1_7(void) void Stretch_brush_1_7(void)
// //
// Opération : OPERATION_STRETCH_BRUSH // Opération : OPERATION_STRETCH_BRUSH
// Click Souris: 1 // Click Souris: 1
// Taille_Pile : 7 // Taille_Pile : 7
// //
// Souris effacée: Non // Souris effacée: Non
// //
{ {
char str[5]; char str[5];
@ -756,11 +756,11 @@ void Stretch_brush_1_7(void)
void Stretch_brush_0_7(void) void Stretch_brush_0_7(void)
// //
// Opération : OPERATION_STRETCH_BRUSH // Opération : OPERATION_STRETCH_BRUSH
// Click Souris: 0 // Click Souris: 0
// Taille_Pile : 7 // Taille_Pile : 7
// //
// Souris effacée: Non // Souris effacée: Non
// //
{ {
char str[5]; char str[5];
@ -799,7 +799,7 @@ void Stretch_brush_0_7(void)
} }
// Utilise Key_ANSI au lieu de Key, car Get_input() met ce dernier // Utilise Key_ANSI au lieu de Key, car Get_input() met ce dernier
// à zero si une operation est en cours (Operation_stack_size!=0) // à zero si une operation est en cours (Operation_stack_size!=0)
if (Key_ANSI) if (Key_ANSI)
{ {
size_change=1; size_change=1;
@ -817,15 +817,15 @@ void Stretch_brush_0_7(void)
width=start_x+Brush_width-1; width=start_x+Brush_width-1;
height=start_y+(Brush_height<<1)-1; height=start_y+(Brush_height<<1)-1;
break; break;
case 'h': // Moitié case 'h': // Moitié
width=(Brush_width>1)?start_x+(Brush_width>>1)-1:1; width=(Brush_width>1)?start_x+(Brush_width>>1)-1:1;
height=(Brush_height>1)?start_y+(Brush_height>>1)-1:1; height=(Brush_height>1)?start_y+(Brush_height>>1)-1:1;
break; break;
case 'X': // Moitié X case 'X': // Moitié X
width=(Brush_width>1)?start_x+(Brush_width>>1)-1:1; width=(Brush_width>1)?start_x+(Brush_width>>1)-1:1;
height=start_y+Brush_height-1; height=start_y+Brush_height-1;
break; break;
case 'Y': // Moitié Y case 'Y': // Moitié Y
width=start_x+Brush_width-1; width=start_x+Brush_width-1;
height=(Brush_height>1)?start_y+(Brush_height>>1)-1:1; height=(Brush_height>1)?start_y+(Brush_height>>1)-1:1;
break; break;
@ -872,11 +872,11 @@ void Stretch_brush_0_7(void)
void Stretch_brush_2_7(void) void Stretch_brush_2_7(void)
// //
// Opération : OPERATION_STRETCH_BRUSH // Opération : OPERATION_STRETCH_BRUSH
// Click Souris: 2 // Click Souris: 2
// Taille_Pile : 7 // Taille_Pile : 7
// //
// Souris effacée: Oui // Souris effacée: Oui
// //
{ {
short computed_x; short computed_x;
@ -894,7 +894,7 @@ void Stretch_brush_2_7(void)
// On efface la preview de la brosse (et la croix) // On efface la preview de la brosse (et la croix)
Display_all_screen(); Display_all_screen();
// Et enfin on stocke pour de bon la nouvelle brosse étirée // Et enfin on stocke pour de bon la nouvelle brosse étirée
Stretch_brush(start_x,start_y,computed_x,computed_y); Stretch_brush(start_x,start_y,computed_x,computed_y);
Return_to_draw_mode(); Return_to_draw_mode();
@ -906,11 +906,11 @@ void Stretch_brush_2_7(void)
void Rotate_brush_12_0(void) void Rotate_brush_12_0(void)
// //
// Opération : OPERATION_ROTATE_BRUSH // Opération : OPERATION_ROTATE_BRUSH
// Click Souris: 1 ou 2 // Click Souris: 1 ou 2
// Taille_Pile : 0 // Taille_Pile : 0
// //
// Souris effacée: Oui // Souris effacée: Oui
// //
{ {
Init_start_operation(); Init_start_operation();
@ -919,11 +919,11 @@ void Rotate_brush_12_0(void)
Brush_rotation_center_X=Paintbrush_X+(Brush_width>>1)-Brush_width; Brush_rotation_center_X=Paintbrush_X+(Brush_width>>1)-Brush_width;
Brush_rotation_center_Y=Paintbrush_Y; Brush_rotation_center_Y=Paintbrush_Y;
Brush_rotation_center_is_defined=1; Brush_rotation_center_is_defined=1;
Operation_push(Paintbrush_X); // Dernière position calculée X Operation_push(Paintbrush_X); // Dernière position calculée X
Operation_push(Paintbrush_Y); // Dernière position calculée Y Operation_push(Paintbrush_Y); // Dernière position calculée Y
Operation_push(Paintbrush_X); // Dernière position X Operation_push(Paintbrush_X); // Dernière position X
Operation_push(Paintbrush_Y); // Dernière position Y Operation_push(Paintbrush_Y); // Dernière position Y
Operation_push(1); // State précédent Operation_push(1); // State précédent
if ((Config.Coords_rel) && (Menu_is_visible)) if ((Config.Coords_rel) && (Menu_is_visible))
Print_in_menu("Angle: 0\xb0 ",0); Print_in_menu("Angle: 0\xb0 ",0);
@ -931,7 +931,7 @@ void Rotate_brush_12_0(void)
else else
{ {
Start_operation_stack(Operation_before_interrupt); Start_operation_stack(Operation_before_interrupt);
Wait_end_of_click(); // FIXME: celui-la il donne un résultat pas très chouette en visuel Wait_end_of_click(); // FIXME: celui-la il donne un résultat pas très chouette en visuel
} }
} }
@ -939,11 +939,11 @@ void Rotate_brush_12_0(void)
void Rotate_brush_1_5(void) void Rotate_brush_1_5(void)
// //
// Opération : OPERATION_ROTATE_BRUSH // Opération : OPERATION_ROTATE_BRUSH
// Click Souris: 1 // Click Souris: 1
// Taille_Pile : 5 // Taille_Pile : 5
// //
// Souris effacée: Non // Souris effacée: Non
// //
{ {
char str[4]; char str[4];
@ -958,7 +958,7 @@ void Rotate_brush_1_5(void)
Operation_pop(&old_y); Operation_pop(&old_y);
Operation_pop(&old_x); Operation_pop(&old_x);
// On corrige les coordonnées de la ligne si la touche shift est appuyée... // On corrige les coordonnées de la ligne si la touche shift est appuyée...
cursor_x = Paintbrush_X; cursor_x = Paintbrush_X;
cursor_y = Paintbrush_Y; cursor_y = Paintbrush_Y;
if(SDL_GetModState() & KMOD_SHIFT) if(SDL_GetModState() & KMOD_SHIFT)
@ -1006,11 +1006,11 @@ void Rotate_brush_1_5(void)
void Rotate_brush_0_5(void) void Rotate_brush_0_5(void)
// //
// Opération : OPERATION_ROTATE_BRUSH // Opération : OPERATION_ROTATE_BRUSH
// Click Souris: 0 // Click Souris: 0
// Taille_Pile : 5 // Taille_Pile : 5
// //
// Souris effacée: Non // Souris effacée: Non
// //
{ {
char str[4]; char str[4];
@ -1029,7 +1029,7 @@ void Rotate_brush_0_5(void)
Operation_pop(&old_y); Operation_pop(&old_y);
Operation_pop(&old_x); Operation_pop(&old_x);
// On corrige les coordonnées de la ligne si la touche shift est appuyée... // On corrige les coordonnées de la ligne si la touche shift est appuyée...
cursor_x = Paintbrush_X; cursor_x = Paintbrush_X;
cursor_y = Paintbrush_Y; cursor_y = Paintbrush_Y;
if(SDL_GetModState() & KMOD_SHIFT) if(SDL_GetModState() & KMOD_SHIFT)
@ -1062,7 +1062,7 @@ void Rotate_brush_0_5(void)
} }
// Utilise Key_ANSI au lieu de Key, car Get_input() met ce dernier // Utilise Key_ANSI au lieu de Key, car Get_input() met ce dernier
// à zero si une operation est en cours (Operation_stack_size!=0) // à zero si une operation est en cours (Operation_stack_size!=0)
if (Key_ANSI) if (Key_ANSI)
{ {
angle_change=1; angle_change=1;
@ -1106,11 +1106,11 @@ void Rotate_brush_0_5(void)
void Rotate_brush_2_5(void) void Rotate_brush_2_5(void)
// //
// Opération : OPERATION_ROTATE_BRUSH // Opération : OPERATION_ROTATE_BRUSH
// Click Souris: 2 // Click Souris: 2
// Taille_Pile : 5 // Taille_Pile : 5
// //
// Souris effacée: Oui // Souris effacée: Oui
// //
{ {
short computed_x; short computed_x;
@ -1126,7 +1126,7 @@ void Rotate_brush_2_5(void)
Operation_pop(&computed_y); Operation_pop(&computed_y);
Operation_pop(&computed_x); Operation_pop(&computed_x);
// Calcul de l'angle par rapport à la dernière position calculée // Calcul de l'angle par rapport à la dernière position calculée
if ( (Brush_rotation_center_X==computed_x) if ( (Brush_rotation_center_X==computed_x)
&& (Brush_rotation_center_Y==computed_y) ) && (Brush_rotation_center_Y==computed_y) )
angle=0.0; angle=0.0;
@ -1138,7 +1138,7 @@ void Rotate_brush_2_5(void)
if (dy>0) angle=M_2PI-angle; if (dy>0) angle=M_2PI-angle;
} }
// Et enfin on stocke pour de bon la nouvelle brosse étirée // Et enfin on stocke pour de bon la nouvelle brosse étirée
Rotate_brush(angle); Rotate_brush(angle);
Return_to_draw_mode(); Return_to_draw_mode();
@ -1161,11 +1161,11 @@ void Draw_stretch_spot(short x_pos, short y_pos)
void Distort_brush_0_0(void) void Distort_brush_0_0(void)
// //
// Opération : OPERATION_DISTORT_BRUSH // Opération : OPERATION_DISTORT_BRUSH
// Click Souris: 0 // Click Souris: 0
// Taille_Pile : 0 // Taille_Pile : 0
// //
// Souris effacée: Non // Souris effacée: Non
// //
{ {
if ( Menu_is_visible ) if ( Menu_is_visible )
@ -1176,11 +1176,11 @@ void Distort_brush_0_0(void)
void Distort_brush_1_0(void) void Distort_brush_1_0(void)
// //
// Opération : OPERATION_DISTORT_BRUSH // Opération : OPERATION_DISTORT_BRUSH
// Click Souris: 1 // Click Souris: 1
// Taille_Pile : 0 // Taille_Pile : 0
// //
// Souris effacée: Non // Souris effacée: Non
// //
{ {
short x_pos, y_pos; short x_pos, y_pos;
@ -1235,11 +1235,11 @@ void Distort_brush_1_0(void)
void Distort_brush_1_8(void) void Distort_brush_1_8(void)
// //
// Opération : OPERATION_DISTORT_BRUSH // Opération : OPERATION_DISTORT_BRUSH
// Click Souris: 1 // Click Souris: 1
// Taille_Pile : 8 // Taille_Pile : 8
// //
// Souris effacée: No // Souris effacée: No
// //
{ {
// How far (in pixels) you can catch a handle // How far (in pixels) you can catch a handle
@ -1282,11 +1282,11 @@ void Distort_brush_1_8(void)
void Distort_brush_1_9(void) void Distort_brush_1_9(void)
// //
// Opération : OPERATION_DISTORT_BRUSH // Opération : OPERATION_DISTORT_BRUSH
// Click Souris: 1 // Click Souris: 1
// Taille_Pile : 9 // Taille_Pile : 9
// //
// Souris effacée: No // Souris effacée: No
// //
{ {
short i; short i;
@ -1339,11 +1339,11 @@ void Distort_brush_1_9(void)
} }
void Distort_brush_0_9(void) void Distort_brush_0_9(void)
// //
// Opération : OPERATION_DISTORT_BRUSH // Opération : OPERATION_DISTORT_BRUSH
// Click Souris: 0 // Click Souris: 0
// Taille_Pile : 9 // Taille_Pile : 9
// //
// Souris effacée: No // Souris effacée: No
// //
{ {
short selected_corner; short selected_corner;
@ -1353,11 +1353,11 @@ void Distort_brush_0_9(void)
void Distort_brush_2_0(void) void Distort_brush_2_0(void)
// //
// Opération : OPERATION_DISTORT_BRUSH // Opération : OPERATION_DISTORT_BRUSH
// Click Souris: 2 // Click Souris: 2
// Taille_Pile : 0 // Taille_Pile : 0
// //
// Souris effacée: Oui // Souris effacée: Oui
// //
{ {
Paintbrush_hidden=0; Paintbrush_hidden=0;
@ -1372,11 +1372,11 @@ void Distort_brush_2_0(void)
void Distort_brush_2_8(void) void Distort_brush_2_8(void)
// //
// Opération : OPERATION_DISTORT_BRUSH // Opération : OPERATION_DISTORT_BRUSH
// Click Souris: 2 // Click Souris: 2
// Taille_Pile : 8 // Taille_Pile : 8
// //
// Souris effacée: Oui // Souris effacée: Oui
// //
{ {
short i; short i;

View File

@ -2,7 +2,7 @@
*/ */
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
Copyright 2007-2017 Adrien Destugues (PulkoMandy) Copyright 2007-2017 Adrien Destugues (PulkoMandy)
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
@ -234,7 +234,7 @@ void Change_paintbrush_shape(byte shape)
Paintbrush_shape=PAINTBRUSH_SHAPE_NONE; Paintbrush_shape=PAINTBRUSH_SHAPE_NONE;
break; break;
// Note: Il existe un Paintbrush_shape_before_lasso, mais comme le lasso aura // Note: Il existe un Paintbrush_shape_before_lasso, mais comme le lasso aura
// été automatiquement désactivé avant d'arriver ici, y'a pas de problème. // été automatiquement désactivé avant d'arriver ici, y'a pas de problème.
} }
} }
@ -440,8 +440,8 @@ void Button_Hide_menu(int btn)
Compute_magnifier_data(); Compute_magnifier_data();
} }
// On repositionne le décalage de l'image pour qu'il n'y ait pas d'in- // On repositionne le décalage de l'image pour qu'il n'y ait pas d'in-
// -cohérences lorsqu'on sortira du mode Loupe. // -cohérences lorsqu'on sortira du mode Loupe.
if (Main.offset_Y+Screen_height>Main.image_height) if (Main.offset_Y+Screen_height>Main.image_height)
{ {
if (Screen_height>Main.image_height) if (Screen_height>Main.image_height)
@ -611,7 +611,7 @@ byte Button_Quit_local_function(void)
if (!Main.image_is_modified) if (!Main.image_is_modified)
return 1; return 1;
// On commence par afficher la fenêtre de QUIT // On commence par afficher la fenêtre de QUIT
Open_window(160,84,"Quit ?"); Open_window(160,84,"Quit ?");
Window_set_normal_button(20,20,120,14,"Stay",0,1,KEY_ESC); // 1 Window_set_normal_button(20,20,120,14,"Stay",0,1,KEY_ESC); // 1
Window_set_normal_button(20,40,120,14,"Save & quit",1,1,SDLK_s); // 2 Window_set_normal_button(20,40,120,14,"Save & quit",1,1,SDLK_s); // 2
@ -656,14 +656,14 @@ byte Button_Quit_local_function(void)
Display_cursor(); Display_cursor();
if (!File_error) if (!File_error)
// L'ayant sauvée avec succès, // L'ayant sauvée avec succès,
return 1; // On peut quitter return 1; // On peut quitter
else else
// Il y a eu une erreur lors de la sauvegarde, // Il y a eu une erreur lors de la sauvegarde,
return 0; // On ne peut donc pas quitter return 0; // On ne peut donc pas quitter
} }
else else
// L'utilisateur ne veut pas écraser l'ancien fichier, // L'utilisateur ne veut pas écraser l'ancien fichier,
return 0; // On doit donc rester return 0; // On doit donc rester
case 3 : return 1; // Quitter case 3 : return 1; // Quitter
} }
@ -680,7 +680,7 @@ void Button_Quit(int btn)
if (Spare.image_is_modified) if (Spare.image_is_modified)
{ {
Button_Page(BUTTON_PAGE); // On passe sur le brouillon Button_Page(BUTTON_PAGE); // On passe sur le brouillon
// Si l'utilisateur présente les derniers symptomes de l'abandon // Si l'utilisateur présente les derniers symptomes de l'abandon
if (Button_Quit_local_function()) if (Button_Quit_local_function())
Quitting=1; Quitting=1;
} }
@ -698,7 +698,7 @@ void Button_Quit(int btn)
} }
//---------------------------- Effacer l'écran ------------------------------- //---------------------------- Effacer l'écran -------------------------------
void Button_Clear(int btn) void Button_Clear(int btn)
{ {
Hide_cursor(); Hide_cursor();
@ -730,7 +730,7 @@ void Button_Clear_with_backcolor(int btn)
} }
//------------------------------- Paramètres --------------------------------- //------------------------------- Paramètres ---------------------------------
#define SETTING_PER_PAGE 11 #define SETTING_PER_PAGE 11
#define SETTING_PAGES 5 #define SETTING_PAGES 5
@ -1197,11 +1197,11 @@ void Button_Settings(int btn)
Close_window(); Close_window();
Unselect_button(btn); Unselect_button(btn);
// Raffichage du menu pour que les inscriptions qui y figurent soient // Raffichage du menu pour que les inscriptions qui y figurent soient
// retracées avec la nouvelle fonte // retracées avec la nouvelle fonte
Display_menu(); Display_menu();
Display_cursor(); Display_cursor();
// On vérifie qu'on peut bien allouer le nombre de pages Undo. // On vérifie qu'on peut bien allouer le nombre de pages Undo.
Set_number_of_backups(Config.Max_undo_pages); Set_number_of_backups(Config.Max_undo_pages);
} }
@ -1526,7 +1526,7 @@ void Button_Skins(int btn)
Close_window(); Close_window();
Unselect_button(btn); Unselect_button(btn);
// Raffichage du menu pour que les inscriptions qui y figurent soient retracées avec la nouvelle fonte // Raffichage du menu pour que les inscriptions qui y figurent soient retracées avec la nouvelle fonte
Display_menu(); Display_menu();
// Redraw all buttons, to ensure all specific sprites are in place. // Redraw all buttons, to ensure all specific sprites are in place.
// This is necessary for multi-state buttons, for example Freehand. // This is necessary for multi-state buttons, for example Freehand.
@ -1578,7 +1578,7 @@ void Button_Page(int btn)
End_of_modification(); End_of_modification();
// -- // --
// A la fin, on affiche l'écran // A la fin, on affiche l'écran
for (factor_index=0; ZOOM_FACTOR[factor_index]!=Main.magnifier_factor; factor_index++); for (factor_index=0; ZOOM_FACTOR[factor_index]!=Main.magnifier_factor; factor_index++);
//Change.magnifier_factor(factor_index,0); //Change.magnifier_factor(factor_index,0);
Compute_magnifier_data(); Compute_magnifier_data();
@ -1633,7 +1633,7 @@ void Copy_image_only(void)
// Copie des dimensions de l'image // Copie des dimensions de l'image
/* /*
C'est inutile, le "Backuper et redimensionner brouillon" a déjà modifié C'est inutile, le "Backuper et redimensionner brouillon" a déjà modifié
ces valeurs pour qu'elles soient correctes. ces valeurs pour qu'elles soient correctes.
*/ */
/* /*
@ -2056,7 +2056,7 @@ void Button_Resolution(int btn)
// Si l'utilisateur s'est servi du bouton droit de la souris: // Si l'utilisateur s'est servi du bouton droit de la souris:
if (Mouse_K==2) if (Mouse_K==2)
{ {
// On affecte également les dimensions de l'image: // On affecte également les dimensions de l'image:
chosen_width=Video_mode[selected_mode].Width/Pixel_width; chosen_width=Video_mode[selected_mode].Width/Pixel_width;
Num2str(chosen_width,str,4); Num2str(chosen_width,str,4);
Window_input_content(input_width_button,str); Window_input_content(input_width_button,str);
@ -2080,10 +2080,10 @@ void Button_Resolution(int btn)
chosen_pixel=Window_attribute2; chosen_pixel=Window_attribute2;
break; break;
default: // Boutons de tag des états des modes default: // Boutons de tag des états des modes
temp=list_start+clicked_button-8; temp=list_start+clicked_button-8;
if (Video_mode[temp].Fullscreen==1 && // On n'a pas le droit de cocher le mode fenêtré if (Video_mode[temp].Fullscreen==1 && // On n'a pas le droit de cocher le mode fenêtré
!(Video_mode[temp].State & 128)) // Ni ceux non détectés par SDL !(Video_mode[temp].State & 128)) // Ni ceux non détectés par SDL
{ {
if (Window_attribute1==LEFT_SIDE) if (Window_attribute1==LEFT_SIDE)
Video_mode[temp].State=((Video_mode[temp].State&0x7F)+1)&3; Video_mode[temp].State=((Video_mode[temp].State&0x7F)+1)&3;
@ -2097,7 +2097,7 @@ void Button_Resolution(int btn)
} }
} }
// Gestion des touches de déplacement dans la liste // Gestion des touches de déplacement dans la liste
switch (Key) switch (Key)
{ {
case SDLK_UP : // Haut case SDLK_UP : // Haut
@ -2197,7 +2197,7 @@ void Button_Resolution(int btn)
Video_mode[selected_mode].Fullscreen, Video_mode[selected_mode].Fullscreen,
chosen_pixel)) chosen_pixel))
{ {
Error(0); // On signale à l'utilisateur que c'est un mode invalide Error(0); // On signale à l'utilisateur que c'est un mode invalide
Pixel_ratio=PIXEL_SIMPLE; Pixel_ratio=PIXEL_SIMPLE;
Init_mode_video( Init_mode_video(
Video_mode[Current_resolution].Width, Video_mode[Current_resolution].Width,
@ -2245,12 +2245,12 @@ void Button_Safety_resolution(int btn)
Display_all_screen(); Display_all_screen();
Unselect_button(btn); Unselect_button(btn);
// Le pinceau est affiché à la position du clic et pas // Le pinceau est affiché à la position du clic et pas
Display_cursor(); Display_cursor();
} }
//------------------ Gestion des boutons de dessin à la main ----------------- //------------------ Gestion des boutons de dessin à la main -----------------
void Button_Draw(int btn) void Button_Draw(int btn)
{ {
@ -2420,21 +2420,21 @@ void Button_Circle_switch_mode(int btn)
Window_dropdown_clear_items(&dropdown); Window_dropdown_clear_items(&dropdown);
} }
// -- Gestion du menu des dégradés ------------------------------------------ // -- Gestion du menu des dégradés ------------------------------------------
void Draw_button_gradient_style(short x_pos,short y_pos,int technique) void Draw_button_gradient_style(short x_pos,short y_pos,int technique)
{ {
short line; short line;
// On commence par afficher les 2 côtés qui constituent le dégradé de base: // On commence par afficher les 2 côtés qui constituent le dégradé de base:
// Côté gauche (noir) // Côté gauche (noir)
Window_rectangle(x_pos+2, y_pos+2, 6, 10, MC_Black); Window_rectangle(x_pos+2, y_pos+2, 6, 10, MC_Black);
// Côté droit (blanc) // Côté droit (blanc)
Window_rectangle(x_pos+8, y_pos+2, 5, 10, MC_White); Window_rectangle(x_pos+8, y_pos+2, 5, 10, MC_White);
switch(technique) switch(technique)
{ {
case 1 : // Dégradé de trames simples case 1 : // Dégradé de trames simples
// Au centre, on place 10 lignes tramées simplement // Au centre, on place 10 lignes tramées simplement
for (line=2;line<2+10;line++) for (line=2;line<2+10;line++)
if (line&1) if (line&1)
{ {
@ -2450,8 +2450,8 @@ void Draw_button_gradient_style(short x_pos,short y_pos,int technique)
Pixel_in_window(x_pos+ 9,y_pos+line,MC_Black); Pixel_in_window(x_pos+ 9,y_pos+line,MC_Black);
} }
break; break;
case 2 : // Dégradé de trames étendues case 2 : // Dégradé de trames étendues
// Au centre, on place 10 lignes tramées de façon compliquée // Au centre, on place 10 lignes tramées de façon compliquée
for (line=2;line<2+10;line++) for (line=2;line<2+10;line++)
if (line&1) if (line&1)
{ {
@ -2487,20 +2487,20 @@ void Load_gradient_data(int index)
switch(Main.backups->Pages->Gradients->Range[index].Technique) switch(Main.backups->Pages->Gradients->Range[index].Technique)
{ {
case 0 : // Degradé de base case 0 : // Degradé de base
Gradient_function=Gradient_basic; Gradient_function=Gradient_basic;
break; break;
case 1 : // Dégradé de trames simples case 1 : // Dégradé de trames simples
Gradient_function=Gradient_dithered; Gradient_function=Gradient_dithered;
break; break;
case 2 : // Dégradé de trames étendues case 2 : // Dégradé de trames étendues
Gradient_function=Gradient_extra_dithered; Gradient_function=Gradient_extra_dithered;
} }
} }
void Draw_gradient_preview(short start_x,short start_y,short width,short height,int index) void Draw_gradient_preview(short start_x,short start_y,short width,short height,int index)
{ {
short x_pos; // Variables de balayage du block en bas de l'écran. short x_pos; // Variables de balayage du block en bas de l'écran.
short y_pos; short y_pos;
short end_x; short end_x;
short end_y; short end_y;
@ -2584,7 +2584,7 @@ void Button_Gradients(int btn)
Num2str(Current_gradient+1,str,2); Num2str(Current_gradient+1,str,2);
Print_in_window(215,100,str,MC_Black,MC_Light); Print_in_window(215,100,str,MC_Black,MC_Light);
// On affiche le cadre autour de la préview // On affiche le cadre autour de la préview
Window_display_frame_in(7,127,110,16); Window_display_frame_in(7,127,110,16);
// On affiche la preview // On affiche la preview
Draw_gradient_preview(8,128,108,14,Current_gradient); Draw_gradient_preview(8,128,108,14,Current_gradient);
@ -2616,7 +2616,7 @@ void Button_Gradients(int btn)
// On affiche le sens qui va avec // On affiche le sens qui va avec
Print_in_window(12,23,(Main.backups->Pages->Gradients->Range[Current_gradient].Inverse)?"\033":"\032",MC_Black,MC_Light); Print_in_window(12,23,(Main.backups->Pages->Gradients->Range[Current_gradient].Inverse)?"\033":"\032",MC_Black,MC_Light);
// On raffiche le mélange (jauge) qui va avec // On raffiche le mélange (jauge) qui va avec
mix_scroller->Position=Main.backups->Pages->Gradients->Range[Current_gradient].Mix; mix_scroller->Position=Main.backups->Pages->Gradients->Range[Current_gradient].Mix;
Window_draw_slider(mix_scroller); Window_draw_slider(mix_scroller);
@ -2660,11 +2660,11 @@ void Button_Gradients(int btn)
{ {
// On vient de clicker // On vient de clicker
// On met à jour l'intervalle du dégradé // On met à jour l'intervalle du dégradé
first_color=last_color=Main.backups->Pages->Gradients->Range[Current_gradient].Start=Main.backups->Pages->Gradients->Range[Current_gradient].End=temp_color; first_color=last_color=Main.backups->Pages->Gradients->Range[Current_gradient].Start=Main.backups->Pages->Gradients->Range[Current_gradient].End=temp_color;
// On tagge le bloc // On tagge le bloc
Tag_color_range(Main.backups->Pages->Gradients->Range[Current_gradient].Start,Main.backups->Pages->Gradients->Range[Current_gradient].End); Tag_color_range(Main.backups->Pages->Gradients->Range[Current_gradient].Start,Main.backups->Pages->Gradients->Range[Current_gradient].End);
// Tracé de la preview: // Tracé de la preview:
Draw_gradient_preview(8,128,108,14,Current_gradient); Draw_gradient_preview(8,128,108,14,Current_gradient);
} }
else else
@ -2672,7 +2672,7 @@ void Button_Gradients(int btn)
// On maintient le click, on va donc tester si le curseur bouge // On maintient le click, on va donc tester si le curseur bouge
if (temp_color!=last_color) if (temp_color!=last_color)
{ {
// On commence par ordonner la 1ère et dernière couleur du bloc // On commence par ordonner la 1ère et dernière couleur du bloc
if (first_color<temp_color) if (first_color<temp_color)
{ {
Main.backups->Pages->Gradients->Range[Current_gradient].Start=first_color; Main.backups->Pages->Gradients->Range[Current_gradient].Start=first_color;
@ -2687,7 +2687,7 @@ void Button_Gradients(int btn)
Main.backups->Pages->Gradients->Range[Current_gradient].Start=Main.backups->Pages->Gradients->Range[Current_gradient].End=first_color; Main.backups->Pages->Gradients->Range[Current_gradient].Start=Main.backups->Pages->Gradients->Range[Current_gradient].End=first_color;
// On tagge le bloc // On tagge le bloc
Tag_color_range(Main.backups->Pages->Gradients->Range[Current_gradient].Start,Main.backups->Pages->Gradients->Range[Current_gradient].End); Tag_color_range(Main.backups->Pages->Gradients->Range[Current_gradient].Start,Main.backups->Pages->Gradients->Range[Current_gradient].End);
// Tracé de la preview: // Tracé de la preview:
Draw_gradient_preview(8,128,108,14,Current_gradient); Draw_gradient_preview(8,128,108,14,Current_gradient);
last_color=temp_color; last_color=temp_color;
} }
@ -2695,14 +2695,14 @@ void Button_Gradients(int btn)
Display_cursor(); Display_cursor();
} }
break; break;
case 2 : // Nouvel indice de dégradé case 2 : // Nouvel indice de dégradé
// Nouvel indice dans Window_attribute2 // Nouvel indice dans Window_attribute2
Current_gradient=Window_attribute2; Current_gradient=Window_attribute2;
changed_gradient_index=1; changed_gradient_index=1;
break; break;
case 3 : // Nouveau mélange de dégradé case 3 : // Nouveau mélange de dégradé
Hide_cursor(); Hide_cursor();
// Nouvel mélange dans Window_attribute2 // Nouvel mélange dans Window_attribute2
Main.backups->Pages->Gradients->Range[Current_gradient].Mix=Window_attribute2; Main.backups->Pages->Gradients->Range[Current_gradient].Mix=Window_attribute2;
// On affiche la nouvelle preview // On affiche la nouvelle preview
Draw_gradient_preview(8,128,108,14,Current_gradient); Draw_gradient_preview(8,128,108,14,Current_gradient);
@ -2744,7 +2744,7 @@ void Button_Gradients(int btn)
if (!Mouse_K) if (!Mouse_K)
switch (Key) switch (Key)
{ {
case SDLK_BACKQUOTE : // Récupération d'une couleur derrière le menu case SDLK_BACKQUOTE : // Récupération d'une couleur derrière le menu
case SDLK_COMMA : case SDLK_COMMA :
Get_color_behind_window(&color,&click); Get_color_behind_window(&color,&click);
if (click) if (click)
@ -2752,11 +2752,11 @@ void Button_Gradients(int btn)
Hide_cursor(); Hide_cursor();
temp_color=color; temp_color=color;
// On met à jour l'intervalle du dégradé // On met à jour l'intervalle du dégradé
first_color=last_color=Main.backups->Pages->Gradients->Range[Current_gradient].Start=Main.backups->Pages->Gradients->Range[Current_gradient].End=temp_color; first_color=last_color=Main.backups->Pages->Gradients->Range[Current_gradient].Start=Main.backups->Pages->Gradients->Range[Current_gradient].End=temp_color;
// On tagge le bloc // On tagge le bloc
Tag_color_range(Main.backups->Pages->Gradients->Range[Current_gradient].Start,Main.backups->Pages->Gradients->Range[Current_gradient].End); Tag_color_range(Main.backups->Pages->Gradients->Range[Current_gradient].Start,Main.backups->Pages->Gradients->Range[Current_gradient].End);
// Tracé de la preview: // Tracé de la preview:
Draw_gradient_preview(8,128,108,14,Current_gradient); Draw_gradient_preview(8,128,108,14,Current_gradient);
Display_cursor(); Display_cursor();
Wait_end_of_click(); Wait_end_of_click();
@ -2816,7 +2816,7 @@ void Button_Gradients(int btn)
} }
// -- Gestion des boutons de cercle / ellipse / rectangle dégradés -------------------- // -- Gestion des boutons de cercle / ellipse / rectangle dégradés --------------------
void Button_Grad_rectangle(int btn) void Button_Grad_rectangle(int btn)
{ {
@ -3073,7 +3073,7 @@ void Button_Brush_monochrome(int btn)
Display_cursor(); Display_cursor();
} }
// -- Fonction renvoyant le mode vidéo le plus adapté à l'image chargée ----- // -- Fonction renvoyant le mode vidéo le plus adapté à l'image chargée -----
#define TOLERANCE_X 8 #define TOLERANCE_X 8
#define TOLERANCE_Y 4 #define TOLERANCE_Y 4
int Best_video_mode(void) int Best_video_mode(void)
@ -3083,11 +3083,11 @@ int Best_video_mode(void)
short temp_x,temp_y; short temp_x,temp_y;
int mode; int mode;
// Si mode fenêtre, on reste dans ce mode. // Si mode fenêtre, on reste dans ce mode.
if (Current_resolution == 0) if (Current_resolution == 0)
return 0; return 0;
// On commence par borner les dimensions, ou du moins les rendre cohérentes // On commence par borner les dimensions, ou du moins les rendre cohérentes
if ((Original_screen_X<=0) || (Config.Set_resolution_according_to==2)) if ((Original_screen_X<=0) || (Config.Set_resolution_according_to==2))
Original_screen_X=Main.image_width; Original_screen_X=Main.image_width;
else else
@ -3223,7 +3223,7 @@ void Load_picture(enum CONTEXT_TYPE type)
Select_button(BUTTON_DRAW,LEFT_SIDE); Select_button(BUTTON_DRAW,LEFT_SIDE);
if (Config.Auto_discontinuous) if (Config.Auto_discontinuous)
{ {
// On se place en mode Dessin discontinu à la main // On se place en mode Dessin discontinu à la main
while (Current_operation!=OPERATION_DISCONTINUOUS_DRAW) while (Current_operation!=OPERATION_DISCONTINUOUS_DRAW)
Select_button(BUTTON_DRAW,RIGHT_SIDE); Select_button(BUTTON_DRAW,RIGHT_SIDE);
} }
@ -3312,7 +3312,7 @@ void Load_picture(enum CONTEXT_TYPE type)
void Button_Load(int btn) void Button_Load(int btn)
{ {
(void)btn; (void)btn;
// On sauve l'état actuel des paramètres de l'image pour pouvoir les // On sauve l'état actuel des paramètres de l'image pour pouvoir les
// restituer en cas d'erreur n'affectant pas l'image // restituer en cas d'erreur n'affectant pas l'image
Upload_infos_page(&Main); Upload_infos_page(&Main);
@ -3327,7 +3327,7 @@ void Button_Reload(int btn)
int new_mode; int new_mode;
(void)btn; (void)btn;
// On sauve l'état actuel des paramètres de l'image pour pouvoir les // On sauve l'état actuel des paramètres de l'image pour pouvoir les
// restituer en cas d'erreur n'affectant pas l'image // restituer en cas d'erreur n'affectant pas l'image
Upload_infos_page(&Main); Upload_infos_page(&Main);
@ -3437,10 +3437,10 @@ static void Backup_existing_file(const char * filename)
File_error=0; File_error=0;
// On fait un backup si le nom du fichier n'est pas celui qu'on a choisi // On fait un backup si le nom du fichier n'est pas celui qu'on a choisi
// pour nommer les backups (c'est évident!). // pour nommer les backups (c'est évident!).
if (strcmp(new_filename,filename)) if (strcmp(new_filename,filename))
{ {
// S'il y avait déjà un fichier Backup, on l'efface // S'il y avait déjà un fichier Backup, on l'efface
if ((File_exists(new_filename)) if ((File_exists(new_filename))
&& (remove(new_filename)!=0)) && (remove(new_filename)!=0))
File_error=1; File_error=1;
@ -3673,7 +3673,7 @@ void Button_Brush(int btn)
void Button_Unselect_brush(int btn) void Button_Unselect_brush(int btn)
{ {
(void)btn; (void)btn;
// On fait de notre mieux pour restaurer l'ancienne opération: // On fait de notre mieux pour restaurer l'ancienne opération:
Start_operation_stack(Operation_before_interrupt); Start_operation_stack(Operation_before_interrupt);
} }
@ -3712,7 +3712,7 @@ void Button_Lasso(int btn)
void Button_Unselect_lasso(int btn) void Button_Unselect_lasso(int btn)
{ {
(void)btn; (void)btn;
// On fait de notre mieux pour restaurer l'ancienne opération: // On fait de notre mieux pour restaurer l'ancienne opération:
Start_operation_stack(Operation_before_interrupt); Start_operation_stack(Operation_before_interrupt);
Paintbrush_shape=Paintbrush_shape_before_lasso; Paintbrush_shape=Paintbrush_shape_before_lasso;
} }
@ -3751,7 +3751,7 @@ void Button_Unselect_colorpicker(int btn)
( (!Main.magnifier_mode) || (Mouse_X<Main.separator_position) || (Mouse_X>=Main.X_zoom) ) ) ( (!Main.magnifier_mode) || (Mouse_X<Main.separator_position) || (Mouse_X>=Main.X_zoom) ) )
Print_in_menu("X: Y: ",0); Print_in_menu("X: Y: ",0);
// On fait de notre mieux pour restaurer l'ancienne opération: // On fait de notre mieux pour restaurer l'ancienne opération:
if (Current_operation==OPERATION_COLORPICK) if (Current_operation==OPERATION_COLORPICK)
{ {
Start_operation_stack(Operation_before_interrupt); Start_operation_stack(Operation_before_interrupt);
@ -3799,32 +3799,32 @@ void Button_Magnify(int btn)
Start_operation_stack(OPERATION_MAGNIFY); Start_operation_stack(OPERATION_MAGNIFY);
} }
else else
{ /* Ceci est de la duplication de code de presque toute l'opération de */ { /* Ceci est de la duplication de code de presque toute l'opération de */
/* la loupe... Il serait peut-être plus propre de faire une procédure */ /* la loupe... Il serait peut-être plus propre de faire une procédure */
/* qui s'en charge... */ /* qui s'en charge... */
// On passe en mode loupe // On passe en mode loupe
Main.magnifier_mode=1; Main.magnifier_mode=1;
// La fonction d'affichage dans la partie image est désormais un affichage // La fonction d'affichage dans la partie image est désormais un affichage
// spécial loupe. // spécial loupe.
Pixel_preview=Pixel_preview_magnifier; Pixel_preview=Pixel_preview_magnifier;
// On calcule l'origine de la loupe // On calcule l'origine de la loupe
Main.magnifier_offset_X=Mouse_X-(Main.magnifier_width>>1); Main.magnifier_offset_X=Mouse_X-(Main.magnifier_width>>1);
Main.magnifier_offset_Y=Mouse_Y-(Main.magnifier_height>>1); Main.magnifier_offset_Y=Mouse_Y-(Main.magnifier_height>>1);
// Calcul des coordonnées absolues de ce coin DANS L'IMAGE // Calcul des coordonnées absolues de ce coin DANS L'IMAGE
Main.magnifier_offset_X+=Main.offset_X; Main.magnifier_offset_X+=Main.offset_X;
Main.magnifier_offset_Y+=Main.offset_Y; Main.magnifier_offset_Y+=Main.offset_Y;
Clip_magnifier_offsets(&Main.magnifier_offset_X, &Main.magnifier_offset_Y); Clip_magnifier_offsets(&Main.magnifier_offset_X, &Main.magnifier_offset_Y);
// On calcule les bornes visibles dans l'écran // On calcule les bornes visibles dans l'écran
Position_screen_according_to_zoom(); Position_screen_according_to_zoom();
Compute_limits(); Compute_limits();
Display_all_screen(); Display_all_screen();
// Repositionner le curseur en fonction des coordonnées visibles // Repositionner le curseur en fonction des coordonnées visibles
Compute_paintbrush_coordinates(); Compute_paintbrush_coordinates();
} }
} }
@ -3887,12 +3887,12 @@ void Button_Unselect_magnifier(int btn)
Main.magnifier_mode=0; Main.magnifier_mode=0;
// --> Recalculer le décalage de l'écran lorsqu'on sort de la loupe <-- // --> Recalculer le décalage de l'écran lorsqu'on sort de la loupe <--
// Centrage "brut" de lécran par rapport à la loupe // Centrage "brut" de lécran par rapport à la loupe
Main.offset_X=Main.magnifier_offset_X-((Screen_width-Main.magnifier_width)>>1); Main.offset_X=Main.magnifier_offset_X-((Screen_width-Main.magnifier_width)>>1);
Main.offset_Y=Main.magnifier_offset_Y-((Menu_Y-Main.magnifier_height)>>1); Main.offset_Y=Main.magnifier_offset_Y-((Menu_Y-Main.magnifier_height)>>1);
// Correction en cas de débordement de l'image // Correction en cas de débordement de l'image
if (Main.offset_X+Screen_width>Main.image_width) if (Main.offset_X+Screen_width>Main.image_width)
Main.offset_X=Main.image_width-Screen_width; Main.offset_X=Main.image_width-Screen_width;
if (Main.offset_X<0) if (Main.offset_X<0)
@ -3903,19 +3903,19 @@ void Button_Unselect_magnifier(int btn)
if (Main.offset_Y<0) if (Main.offset_Y<0)
Main.offset_Y=0; Main.offset_Y=0;
// La fonction d'affichage dans l'image est désormais un affichage normal. // La fonction d'affichage dans l'image est désormais un affichage normal.
Pixel_preview=Pixel_preview_normal; Pixel_preview=Pixel_preview_normal;
// Calculer les bornes visibles dans l'écran // Calculer les bornes visibles dans l'écran
Compute_limits(); Compute_limits();
Display_all_screen(); // <=> Display_screen(); Display_all_screen(); // <=> Display_screen();
// Repositionner le curseur en fonction des coordonnées visibles // Repositionner le curseur en fonction des coordonnées visibles
Compute_paintbrush_coordinates(); Compute_paintbrush_coordinates();
Old_MX = -1; Old_MX = -1;
Old_MY = -1; Old_MY = -1;
} }
else // On fait de notre mieux pour restaurer l'ancienne opération: else // On fait de notre mieux pour restaurer l'ancienne opération:
Start_operation_stack(Operation_before_interrupt); Start_operation_stack(Operation_before_interrupt);
} }
@ -3944,7 +3944,7 @@ void Button_Brush_FX(int btn)
Window_set_normal_button(155, 99,131,14,"Recolorize" ,0,1,Config_Key[SPECIAL_RECOLORIZE_BRUSH][0]); // 9 Window_set_normal_button(155, 99,131,14,"Recolorize" ,0,1,Config_Key[SPECIAL_RECOLORIZE_BRUSH][0]); // 9
Window_set_normal_button(155,117,131,14,"Get brush colors",0,1,Config_Key[SPECIAL_GET_BRUSH_COLORS][0]); // 10 Window_set_normal_button(155,117,131,14,"Get brush colors",0,1,Config_Key[SPECIAL_GET_BRUSH_COLORS][0]); // 10
// Boutons représentant les coins du brush handle: (HG,HD,C,BG,BD) // Boutons représentant les coins du brush handle: (HG,HD,C,BG,BD)
Window_set_normal_button( 75, 90,11,11,"",0,1,Config_Key[SPECIAL_TOP_LEFT_ATTACHMENT][0]); // 11 Window_set_normal_button( 75, 90,11,11,"",0,1,Config_Key[SPECIAL_TOP_LEFT_ATTACHMENT][0]); // 11
Window_set_normal_button(103, 90,11,11,"",0,1,Config_Key[SPECIAL_TOP_RIGHT_ATTACHMENT][0]); // 12 Window_set_normal_button(103, 90,11,11,"",0,1,Config_Key[SPECIAL_TOP_RIGHT_ATTACHMENT][0]); // 12
Window_set_normal_button( 89,104,11,11,"",0,1,Config_Key[SPECIAL_CENTER_ATTACHMENT][0]); // 13 Window_set_normal_button( 89,104,11,11,"",0,1,Config_Key[SPECIAL_CENTER_ATTACHMENT][0]); // 13
@ -3966,7 +3966,7 @@ void Button_Brush_FX(int btn)
Print_in_window( 20,102,"Brush",MC_Dark,MC_Light); Print_in_window( 20,102,"Brush",MC_Dark,MC_Light);
Print_in_window( 16,110,"handle",MC_Dark,MC_Light); Print_in_window( 16,110,"handle",MC_Dark,MC_Light);
// Dessin des pointillés pour le "brush handle" // Dessin des pointillés pour le "brush handle"
for (index=0; index<13; index+=2) for (index=0; index<13; index+=2)
{ {
Pixel_in_window( 88+index, 92,MC_Dark); Pixel_in_window( 88+index, 92,MC_Dark);
@ -4013,7 +4013,7 @@ void Button_Brush_FX(int btn)
Close_window(); Close_window();
Unselect_button(btn); Unselect_button(btn);
// Gestion du bouton clické // Gestion du bouton clické
switch (clicked_button) switch (clicked_button)
{ {
case 2 : // Flip X case 2 : // Flip X
@ -4026,10 +4026,10 @@ void Button_Brush_FX(int btn)
// Remap according to the last used remap table // Remap according to the last used remap table
Remap_general_lowlevel(Brush_colormap,Brush_original_pixels,Brush,Brush_width,Brush_height,Brush_width); Remap_general_lowlevel(Brush_colormap,Brush_original_pixels,Brush,Brush_width,Brush_height,Brush_width);
break; break;
case 4 : // 90° Rotation case 4 : // 90° Rotation
Rotate_90_deg(); Rotate_90_deg();
break; break;
case 5 : // 180° Rotation case 5 : // 180° Rotation
Rotate_180_deg_lowlevel(Brush_original_pixels, Brush_width, Brush_height); Rotate_180_deg_lowlevel(Brush_original_pixels, Brush_width, Brush_height);
Remap_general_lowlevel(Brush_colormap,Brush_original_pixels,Brush,Brush_width,Brush_height,Brush_width); Remap_general_lowlevel(Brush_colormap,Brush_original_pixels,Brush,Brush_width,Brush_height,Brush_width);
Brush_offset_X=(Brush_width>>1); Brush_offset_X=(Brush_width>>1);
@ -4094,7 +4094,7 @@ void Button_Brush_FX(int btn)
} }
//---------------------------- Courbes de Bézier ---------------------------- //---------------------------- Courbes de Bézier ----------------------------
void Button_Curves(int btn) void Button_Curves(int btn)
{ {
@ -4220,11 +4220,11 @@ void Button_Airbrush_menu(int btn)
Window_display_frame(173,56,45,86); Window_display_frame(173,56,45,86);
Window_display_frame(137,19,81,33); Window_display_frame(137,19,81,33);
// On tagge toutes les couleurs utilisées // On tagge toutes les couleurs utilisées
for (index=0; index<256; index++) for (index=0; index<256; index++)
if (Airbrush_multi_flow[index]) if (Airbrush_multi_flow[index])
Stencil_tag_color(index,MC_Black); Stencil_tag_color(index,MC_Black);
// Et enfin, on tagge la couleur sélectionnée // Et enfin, on tagge la couleur sélectionnée
Stencil_tag_color(selected_color,MC_White); Stencil_tag_color(selected_color,MC_White);
Refresh_airbrush_settings(selected_color,0); Refresh_airbrush_settings(selected_color,0);
@ -4269,7 +4269,7 @@ void Button_Airbrush_menu(int btn)
Hide_cursor(); Hide_cursor();
Stencil_tag_color(selected_color,(Airbrush_multi_flow[selected_color])?MC_Black:MC_Light); Stencil_tag_color(selected_color,(Airbrush_multi_flow[selected_color])?MC_Black:MC_Light);
Stencil_update_color(selected_color); Stencil_update_color(selected_color);
// Mettre la couleur sélectionnée à jour suivant le click // Mettre la couleur sélectionnée à jour suivant le click
selected_color=(clicked_button==4) ? Window_attribute2 : Read_pixel(Mouse_X,Mouse_Y); selected_color=(clicked_button==4) ? Window_attribute2 : Read_pixel(Mouse_X,Mouse_Y);
if (Mouse_K==2) if (Mouse_K==2)
Airbrush_multi_flow[selected_color]=0; Airbrush_multi_flow[selected_color]=0;
@ -4277,7 +4277,7 @@ void Button_Airbrush_menu(int btn)
if (Airbrush_multi_flow[selected_color]==0) if (Airbrush_multi_flow[selected_color]==0)
Airbrush_multi_flow[selected_color]=spray_init; Airbrush_multi_flow[selected_color]=spray_init;
// Tagger la couleur sélectionnée en blanc // Tagger la couleur sélectionnée en blanc
Stencil_tag_color(selected_color,MC_White); Stencil_tag_color(selected_color,MC_White);
Refresh_airbrush_settings(selected_color,1); Refresh_airbrush_settings(selected_color,1);
Display_cursor(); Display_cursor();
@ -4333,7 +4333,7 @@ void Button_Airbrush_menu(int btn)
Display_cursor(); Display_cursor();
break; break;
case 9 : // ÷2 case 9 : // ÷2
for (index=0; index<256; index++) for (index=0; index<256; index++)
{ {
if (Airbrush_multi_flow[index]>1) if (Airbrush_multi_flow[index]>1)
@ -4346,11 +4346,11 @@ void Button_Airbrush_menu(int btn)
case 10 : // Clear case 10 : // Clear
memset(Airbrush_multi_flow,0,256); memset(Airbrush_multi_flow,0,256);
// On raffiche les infos de la couleur sélectionnée // On raffiche les infos de la couleur sélectionnée
Refresh_airbrush_settings(selected_color,1); Refresh_airbrush_settings(selected_color,1);
// On efface les anciens TAGs // On efface les anciens TAGs
Window_clear_tags(); Window_clear_tags();
// Tagger la couleur sélectionnée en blanc // Tagger la couleur sélectionnée en blanc
Stencil_tag_color(selected_color,MC_White); Stencil_tag_color(selected_color,MC_White);
Stencil_update_color(selected_color); Stencil_update_color(selected_color);
break; break;
@ -4427,7 +4427,7 @@ void Button_Airbrush_menu(int btn)
if (!Mouse_K) if (!Mouse_K)
switch (Key) switch (Key)
{ {
case SDLK_BACKQUOTE : // Récupération d'une couleur derrière le menu case SDLK_BACKQUOTE : // Récupération d'une couleur derrière le menu
case SDLK_COMMA : case SDLK_COMMA :
Get_color_behind_window(&color,&click); Get_color_behind_window(&color,&click);
if (click) if (click)
@ -4435,7 +4435,7 @@ void Button_Airbrush_menu(int btn)
Hide_cursor(); Hide_cursor();
Stencil_tag_color(selected_color,(Airbrush_multi_flow[selected_color])?MC_Black:MC_Light); Stencil_tag_color(selected_color,(Airbrush_multi_flow[selected_color])?MC_Black:MC_Light);
Stencil_update_color(selected_color); Stencil_update_color(selected_color);
// Mettre la couleur sélectionnée à jour suivant le click // Mettre la couleur sélectionnée à jour suivant le click
selected_color=color; selected_color=color;
if (click==2) if (click==2)
Airbrush_multi_flow[selected_color]=0; Airbrush_multi_flow[selected_color]=0;
@ -4443,7 +4443,7 @@ void Button_Airbrush_menu(int btn)
if (Airbrush_multi_flow[selected_color]==0) if (Airbrush_multi_flow[selected_color]==0)
Airbrush_multi_flow[selected_color]=spray_init; Airbrush_multi_flow[selected_color]=spray_init;
// Tagger la couleur sélectionnée en blanc // Tagger la couleur sélectionnée en blanc
Stencil_tag_color(selected_color,MC_White); Stencil_tag_color(selected_color,MC_White);
Refresh_airbrush_settings(selected_color,1); Refresh_airbrush_settings(selected_color,1);
Display_cursor(); Display_cursor();
@ -4471,9 +4471,9 @@ void Button_Airbrush_menu(int btn)
Close_window(); Close_window();
/* /*
// Tant que l'on aura pas résolu le problème du désenclenchement du mode // Tant que l'on aura pas résolu le problème du désenclenchement du mode
// de dessin précedent, il faudra laisser ça en remarque et donc passer en // de dessin précedent, il faudra laisser ça en remarque et donc passer en
// spray même si on a clické sur Cancel (idem pour OK (un peu plus bas)). // spray même si on a clické sur Cancel (idem pour OK (un peu plus bas)).
if (clicked_button==1) // Cancel if (clicked_button==1) // Cancel
{ {
if (Current_operation!=OPERATION_AIRBRUSH) if (Current_operation!=OPERATION_AIRBRUSH)
@ -5284,7 +5284,7 @@ void Button_Text(int btn)
Select_button(BUTTON_DRAW,LEFT_SIDE); Select_button(BUTTON_DRAW,LEFT_SIDE);
if (Config.Auto_discontinuous) if (Config.Auto_discontinuous)
{ {
// On se place en mode Dessin discontinu à la main // On se place en mode Dessin discontinu à la main
while (Current_operation!=OPERATION_DISCONTINUOUS_DRAW) while (Current_operation!=OPERATION_DISCONTINUOUS_DRAW)
Select_button(BUTTON_DRAW,RIGHT_SIDE); Select_button(BUTTON_DRAW,RIGHT_SIDE);
} }

View File

@ -105,7 +105,7 @@ void Button_Brush_monochrome(int);
*/ */
void Button_Paintbrush_menu(int); void Button_Paintbrush_menu(int);
// Boutons relatifs au mode de dessin à main levée // Boutons relatifs au mode de dessin à main levée
/*! /*!
Callback for the freehand draw button left click. Callback for the freehand draw button left click.
@ -168,7 +168,7 @@ void Button_Airbrush(int);
*/ */
void Button_Airbrush_menu(int); void Button_Airbrush_menu(int);
// Courbes de Bézier // Courbes de Bézier
/*! /*!
Callback for the curves button left click. Callback for the curves button left click.
@ -204,7 +204,7 @@ void Button_Filled_rectangle(int);
*/ */
void Button_Text(int); void Button_Text(int);
// Boutons relatifs aux dégradés // Boutons relatifs aux dégradés
/*! /*!
Callback for the gradation button. Callback for the gradation button.
@ -463,7 +463,7 @@ void Button_Lasso(int);
*/ */
void Button_Unselect_lasso(int); void Button_Unselect_lasso(int);
// Button relatifs à la pipette // Button relatifs à la pipette
/*! /*!
Starts the color picking operation. Starts the color picking operation.
@ -497,14 +497,14 @@ void Button_Magnify_menu(int);
*/ */
void Button_Unselect_magnifier(int); void Button_Unselect_magnifier(int);
// Les différents effets sur la brosse // Les différents effets sur la brosse
/*! /*!
Display the Brush effects window. Display the Brush effects window.
*/ */
void Button_Brush_FX(int); void Button_Brush_FX(int);
// Boutons relatifs aux différentes pages // Boutons relatifs aux différentes pages
/*! /*!
Swap main and spare drawing pages. Swap main and spare drawing pages.
@ -526,7 +526,7 @@ void Copy_image_only(void);
*/ */
void Button_Kill(int); void Button_Kill(int);
// Boutons relatifs aux changements de résolution et de taille d'image // Boutons relatifs aux changements de résolution et de taille d'image
/*! /*!
Display the screenmode menu. Display the screenmode menu.
@ -560,7 +560,7 @@ void Button_Save(int);
*/ */
void Button_Autosave(int); void Button_Autosave(int);
// Réglage des paramètres de l'utilisateur // Réglage des paramètres de l'utilisateur
/*! /*!
Display the setting menu. Display the setting menu.
@ -572,7 +572,7 @@ void Button_Settings(int);
*/ */
void Button_Skins(int); void Button_Skins(int);
// Annulation de la dernière modification // Annulation de la dernière modification
/*! /*!
Undo the last modification to the picture. Undo the last modification to the picture.

View File

@ -67,13 +67,13 @@ void Menu_tag_colors(char * window_title, byte * table, byte * mode, byte can_ca
{ {
Window_set_normal_button(91,129,78,14,"OK" ,0,1,SDLK_RETURN); // 4 Window_set_normal_button(91,129,78,14,"OK" ,0,1,SDLK_RETURN); // 4
Window_set_normal_button( 7,129,78,14,"Cancel",0,1,KEY_ESC); // 5 Window_set_normal_button( 7,129,78,14,"Cancel",0,1,KEY_ESC); // 5
// On enregistre la table dans un backup au cas où on ferait Cancel // On enregistre la table dans un backup au cas où on ferait Cancel
memcpy(backup_table,table,256); memcpy(backup_table,table,256);
} }
else else
Window_set_normal_button(49,129,78,14,"OK" ,0,1,SDLK_RETURN); // 4 Window_set_normal_button(49,129,78,14,"OK" ,0,1,SDLK_RETURN); // 4
// On affiche l'état actuel de la table // On affiche l'état actuel de la table
for (index=0; index<=255; index++) for (index=0; index<=255; index++)
Stencil_tag_color(index, (table[index])?MC_Black:MC_Light); Stencil_tag_color(index, (table[index])?MC_Black:MC_Light);
@ -123,7 +123,7 @@ void Menu_tag_colors(char * window_title, byte * table, byte * mode, byte can_ca
if (!Mouse_K) if (!Mouse_K)
switch (Key) switch (Key)
{ {
case SDLK_BACKQUOTE : // Récupération d'une couleur derrière le menu case SDLK_BACKQUOTE : // Récupération d'une couleur derrière le menu
case SDLK_COMMA : case SDLK_COMMA :
Get_color_behind_window(&color,&click); Get_color_behind_window(&color,&click);
if (click) if (click)
@ -682,7 +682,7 @@ void Button_Smooth_menu(void)
if (clicked_button==2) // OK if (clicked_button==2) // OK
{ {
memcpy(Smooth_matrix,chosen_matrix,sizeof(Smooth_matrix)); memcpy(Smooth_matrix,chosen_matrix,sizeof(Smooth_matrix));
Smooth_mode=0; // On le met à 0 car la fonct° suivante va le passer à 1 Smooth_mode=0; // On le met à 0 car la fonct° suivante va le passer à 1
Button_Smooth_mode(); Button_Smooth_mode();
} }
@ -754,9 +754,9 @@ void Button_Colorize_mode(void)
void Button_Colorize_display_selection(int mode) void Button_Colorize_display_selection(int mode)
{ {
short y_pos=0; // Ligne où afficher les flèches de sélection short y_pos=0; // Ligne où afficher les flèches de sélection
// On commence par effacer les anciennes sélections: // On commence par effacer les anciennes sélections:
// Partie gauche // Partie gauche
Print_in_window(4,37," ",MC_Black,MC_Light); Print_in_window(4,37," ",MC_Black,MC_Light);
Print_in_window(4,57," ",MC_Black,MC_Light); Print_in_window(4,57," ",MC_Black,MC_Light);
@ -768,19 +768,19 @@ void Button_Colorize_display_selection(int mode)
Print_in_window(129,74," ",MC_Black,MC_Light); Print_in_window(129,74," ",MC_Black,MC_Light);
Print_in_window(129,91," ",MC_Black,MC_Light); Print_in_window(129,91," ",MC_Black,MC_Light);
// Ensuite, on affiche la flèche là où il le faut: // Ensuite, on affiche la flèche là où il le faut:
switch(mode) switch(mode)
{ {
case 0 : // Méthode interpolée case 0 : // Méthode interpolée
y_pos=37; y_pos=37;
break; break;
case 1 : // Méthode additive case 1 : // Méthode additive
y_pos=57; y_pos=57;
break; break;
case 2 : // Méthode soustractive case 2 : // Méthode soustractive
y_pos=74; y_pos=74;
break; break;
case 3 : // Méthode alpha case 3 : // Méthode alpha
y_pos=91; y_pos=91;
} }
Print_in_window(4,y_pos,"\020",MC_Black,MC_Light); Print_in_window(4,y_pos,"\020",MC_Black,MC_Light);
@ -825,7 +825,7 @@ void Button_Colorize_menu(void)
switch(clicked_button) switch(clicked_button)
{ {
case 1: // Zone de saisie de l'opacité case 1: // Zone de saisie de l'opacité
Num2str(chosen_opacity,str,3); Num2str(chosen_opacity,str,3);
Readline(89,23,str,3,INPUT_TYPE_INTEGER); Readline(89,23,str,3,INPUT_TYPE_INTEGER);
chosen_opacity=atoi(str); chosen_opacity=atoi(str);
@ -861,7 +861,7 @@ void Button_Colorize_menu(void)
Colorize_opacity =chosen_opacity; Colorize_opacity =chosen_opacity;
Colorize_current_mode=selected_mode; Colorize_current_mode=selected_mode;
Compute_colorize_table(); Compute_colorize_table();
Colorize_mode=0; // On le met à 0 car la fonct° suivante va le passer à 1 Colorize_mode=0; // On le met à 0 car la fonct° suivante va le passer à 1
Button_Colorize_mode(); Button_Colorize_mode();
} }
@ -917,12 +917,12 @@ void Button_Tiling_menu(void)
{ {
clicked_button=Window_clicked_button(); clicked_button=Window_clicked_button();
if (clicked_button==3) // Zone de saisie du décalage X if (clicked_button==3) // Zone de saisie du décalage X
{ {
Num2str(chosen_offset_x,str,4); Num2str(chosen_offset_x,str,4);
Readline(93,23,str,4,INPUT_TYPE_INTEGER); Readline(93,23,str,4,INPUT_TYPE_INTEGER);
chosen_offset_x=atoi(str); chosen_offset_x=atoi(str);
// On corrige le décalage en X // On corrige le décalage en X
if (chosen_offset_x>=Brush_width) if (chosen_offset_x>=Brush_width)
{ {
chosen_offset_x=Brush_width-1; chosen_offset_x=Brush_width-1;
@ -932,12 +932,12 @@ void Button_Tiling_menu(void)
Display_cursor(); Display_cursor();
} }
else else
if (clicked_button==4) // Zone de saisie du décalage Y if (clicked_button==4) // Zone de saisie du décalage Y
{ {
Num2str(chosen_offset_y,str,4); Num2str(chosen_offset_y,str,4);
Readline(93,37,str,4,INPUT_TYPE_INTEGER); Readline(93,37,str,4,INPUT_TYPE_INTEGER);
chosen_offset_y=atoi(str); chosen_offset_y=atoi(str);
// On corrige le décalage en Y // On corrige le décalage en Y
if (chosen_offset_y>=Brush_height) if (chosen_offset_y>=Brush_height)
{ {
chosen_offset_y=Brush_height-1; chosen_offset_y=Brush_height-1;
@ -1000,9 +1000,9 @@ void Draw_sieve_scaled(short origin_x, short origin_y)
short start_y=Window_pos_Y+(Menu_factor_Y*78); short start_y=Window_pos_Y+(Menu_factor_Y*78);
x_size=Menu_factor_X*5; // |_ Taille d'une case x_size=Menu_factor_X*5; // |_ Taille d'une case
y_size=Menu_factor_Y*5; // | de la trame zoomée y_size=Menu_factor_Y*5; // | de la trame zoomée
// On efface de contenu précédent // On efface de contenu précédent
Block(origin_x,origin_y, Block(origin_x,origin_y,
Menu_factor_X*Window_special_button_list->Width, Menu_factor_X*Window_special_button_list->Width,
Menu_factor_Y*Window_special_button_list->Height,MC_Light); Menu_factor_Y*Window_special_button_list->Height,MC_Light);
@ -1024,7 +1024,7 @@ void Draw_sieve_scaled(short origin_x, short origin_y)
} }
// Dessiner la preview de la trame // Dessiner la preview de la trame
x_size=Menu_factor_X*51; // |_ Taille de la fenêtre x_size=Menu_factor_X*51; // |_ Taille de la fenêtre
y_size=Menu_factor_Y*71; // | de la preview y_size=Menu_factor_Y*71; // | de la preview
for (y_pos=0; y_pos<y_size; y_pos++) for (y_pos=0; y_pos<y_size; y_pos++)
for (x_pos=0; x_pos<x_size; x_pos++) for (x_pos=0; x_pos<x_size; x_pos++)
@ -1077,7 +1077,7 @@ void Invert_trame(void)
Sieve[x_pos][y_pos]=!(Sieve[x_pos][y_pos]); Sieve[x_pos][y_pos]=!(Sieve[x_pos][y_pos]);
} }
// Rafraichit toute la zone correspondant à la trame zoomee. // Rafraichit toute la zone correspondant à la trame zoomee.
void Update_sieve_area(short x, short y) void Update_sieve_area(short x, short y)
{ {
Update_rect(x,y,80*Menu_factor_X,80*Menu_factor_Y); Update_rect(x,y,80*Menu_factor_X,80*Menu_factor_Y);
@ -1097,7 +1097,7 @@ void Button_Sieve_menu(void)
static byte default_bg_color=0; static byte default_bg_color=0;
T_Normal_button * button_bg_color; T_Normal_button * button_bg_color;
char str[3]; char str[3];
byte temp; // Octet temporaire servant à n'importe quoi byte temp; // Octet temporaire servant à n'importe quoi
short old_sieve_width=Sieve_width; short old_sieve_width=Sieve_width;
short old_sieve_height=Sieve_height; short old_sieve_height=Sieve_height;
byte old_sieve[16][16]; byte old_sieve[16][16];
@ -1201,10 +1201,10 @@ void Button_Sieve_menu(void)
temp=MC_White; temp=MC_White;
else else
temp=MC_Black; temp=MC_Black;
// Affichage du pixel dans la fenêtre zoomée // Affichage du pixel dans la fenêtre zoomée
Block(origin_x+(old_x_pos*x_pos), origin_y+(old_y_pos*y_pos), Block(origin_x+(old_x_pos*x_pos), origin_y+(old_y_pos*y_pos),
x_pos-Menu_factor_X, y_pos-Menu_factor_Y, temp); x_pos-Menu_factor_X, y_pos-Menu_factor_Y, temp);
// Mise à jour de la preview // Mise à jour de la preview
Draw_sieve_scaled(origin_x,origin_y); Draw_sieve_scaled(origin_x,origin_y);
Display_cursor(); Display_cursor();
// Maj de la case seule // Maj de la case seule
@ -1269,7 +1269,7 @@ void Button_Sieve_menu(void)
Change_paintbrush_shape(PAINTBRUSH_SHAPE_COLOR_BRUSH); Change_paintbrush_shape(PAINTBRUSH_SHAPE_COLOR_BRUSH);
break; break;
case 8 : // Réduire hauteur case 8 : // Réduire hauteur
if (Sieve_height>1) if (Sieve_height>1)
{ {
Hide_cursor(); Hide_cursor();
@ -1297,7 +1297,7 @@ void Button_Sieve_menu(void)
} }
break; break;
case 10 : // Réduire largeur case 10 : // Réduire largeur
if (Sieve_width>1) if (Sieve_width>1)
{ {
Hide_cursor(); Hide_cursor();
@ -1325,7 +1325,7 @@ void Button_Sieve_menu(void)
} }
break; break;
case 12 : // Toggle octets insérés case 12 : // Toggle octets insérés
Hide_cursor(); Hide_cursor();
default_bg_color=!default_bg_color; default_bg_color=!default_bg_color;
Window_rectangle(button_bg_color->Pos_X+2, Window_rectangle(button_bg_color->Pos_X+2,
@ -1396,7 +1396,7 @@ void Button_Sieve_menu(void)
Update_sieve_area(origin_x, origin_y); Update_sieve_area(origin_x, origin_y);
break; break;
default : // Boutons de trames prédéfinies default : // Boutons de trames prédéfinies
Hide_cursor(); Hide_cursor();
Copy_preset_sieve(clicked_button-17); Copy_preset_sieve(clicked_button-17);
Draw_sieve_scaled(origin_x,origin_y); Draw_sieve_scaled(origin_x,origin_y);

View File

@ -85,7 +85,7 @@
// Character to show a left arrow, used when editing long strings. It's present in ::Gfx->System_font // Character to show a left arrow, used when editing long strings. It's present in ::Gfx->System_font
#define LEFT_TRIANGLE_CHARACTER 17 #define LEFT_TRIANGLE_CHARACTER 17
/// Character to display in menus for an ellipsis. /// Character to display in menus for an ellipsis.
//#define ELLIPSIS_CHARACTER '…' //#define ELLIPSIS_CHARACTER '…'
#define ELLIPSIS_CHARACTER '\x85' #define ELLIPSIS_CHARACTER '\x85'
#define NB_LAYERS 1 ///< Initial number of layers for a new image #define NB_LAYERS 1 ///< Initial number of layers for a new image
#define MAX_NB_FRAMES 999 ///< Maximum number of frames that can be used in a grafx2 animation. #define MAX_NB_FRAMES 999 ///< Maximum number of frames that can be used in a grafx2 animation.

View File

@ -53,7 +53,7 @@ short Old_MY = -1;
//---------- Annuler les effets des modes de dessin (sauf la grille) --------- //---------- Annuler les effets des modes de dessin (sauf la grille) ---------
// Variables mémorisants les anciens effets // Variables mémorisants les anciens effets
byte Shade_mode_before_cancel; byte Shade_mode_before_cancel;
byte Quick_shade_mode_before_cancel; byte Quick_shade_mode_before_cancel;
@ -374,11 +374,11 @@ void Unselect_button(int btn_number)
{ {
if (Buttons_Pool[btn_number].Pressed) if (Buttons_Pool[btn_number].Pressed)
{ {
// On considère que le bouton est relâché // On considère que le bouton est relâché
Buttons_Pool[btn_number].Pressed=BUTTON_RELEASED; Buttons_Pool[btn_number].Pressed=BUTTON_RELEASED;
// On affiche le cadre autour du bouton de façon à ce qu'il paraisse relâché // On affiche le cadre autour du bouton de façon à ce qu'il paraisse relâché
Draw_menu_button(btn_number,BUTTON_RELEASED); Draw_menu_button(btn_number,BUTTON_RELEASED);
// On appelle le désenclenchement particulier au bouton: // On appelle le désenclenchement particulier au bouton:
Buttons_Pool[btn_number].Unselect_action(btn_number); Buttons_Pool[btn_number].Unselect_action(btn_number);
} }
} }
@ -419,31 +419,31 @@ void Select_button(int btn_number,byte click)
Draw_menu_button(btn_number-1, BUTTON_RELEASED); Draw_menu_button(btn_number-1, BUTTON_RELEASED);
} }
// On note déjà la famille du bouton (La "Famiglia" c'est sacré) // On note déjà la famille du bouton (La "Famiglia" c'est sacré)
family=Buttons_Pool[btn_number].Family; family=Buttons_Pool[btn_number].Family;
switch (family) switch (family)
{ {
case FAMILY_TOOLBAR: // On ne fait rien (on préserve les interruptions) case FAMILY_TOOLBAR: // On ne fait rien (on préserve les interruptions)
break; break;
case FAMILY_INTERRUPTION: // Petit cas spécial dans la famille "Interruption": case FAMILY_INTERRUPTION: // Petit cas spécial dans la famille "Interruption":
if ((btn_number!=BUTTON_MAGNIFIER) || (!Main.magnifier_mode)) if ((btn_number!=BUTTON_MAGNIFIER) || (!Main.magnifier_mode))
// Pour chaque bouton: // Pour chaque bouton:
for (b=0; b<NB_BUTTONS; b++) for (b=0; b<NB_BUTTONS; b++)
// S'il est de la même famille // S'il est de la même famille
if ( if (
(b!=btn_number) && (b!=btn_number) &&
(Buttons_Pool[b].Family==FAMILY_INTERRUPTION) && (Buttons_Pool[b].Family==FAMILY_INTERRUPTION) &&
( (b!=BUTTON_MAGNIFIER) || ( (b!=BUTTON_MAGNIFIER) ||
((b==BUTTON_MAGNIFIER) && (!Main.magnifier_mode)) ) ((b==BUTTON_MAGNIFIER) && (!Main.magnifier_mode)) )
) )
// Alors on désenclenche le bouton // Alors on désenclenche le bouton
Unselect_button(b); Unselect_button(b);
break; break;
default: default:
// On désenclenche D'ABORD les interruptions // On désenclenche D'ABORD les interruptions
// Pour chaque bouton: // Pour chaque bouton:
for (b=0; b<NB_BUTTONS; b++) for (b=0; b<NB_BUTTONS; b++)
// S'il est de la famille interruption // S'il est de la famille interruption
@ -451,7 +451,7 @@ void Select_button(int btn_number,byte click)
&& (Buttons_Pool[b].Family==FAMILY_INTERRUPTION) && (Buttons_Pool[b].Family==FAMILY_INTERRUPTION)
// Et que ce n'est pas la loupe, ou alors qu'on n'est pas en mode loupe // Et que ce n'est pas la loupe, ou alors qu'on n'est pas en mode loupe
&& (!(Main.magnifier_mode && (b==BUTTON_MAGNIFIER))) ) && (!(Main.magnifier_mode && (b==BUTTON_MAGNIFIER))) )
// Alors on désenclenche le bouton // Alors on désenclenche le bouton
Unselect_button(b); Unselect_button(b);
// Right-clicking on Adjust opens a menu, so in this case we skip // Right-clicking on Adjust opens a menu, so in this case we skip
// the unselection of all "Tool" buttons. // the unselection of all "Tool" buttons.
@ -462,17 +462,17 @@ void Select_button(int btn_number,byte click)
break; break;
// Pour chaque bouton: // Pour chaque bouton:
for (b=0; b<NB_BUTTONS; b++) for (b=0; b<NB_BUTTONS; b++)
// S'il est de la même famille // S'il est de la même famille
if ( (b!=btn_number) if ( (b!=btn_number)
&& (Buttons_Pool[b].Family==family) ) && (Buttons_Pool[b].Family==family) )
// Alors on désenclenche le bouton // Alors on désenclenche le bouton
Unselect_button(b); Unselect_button(b);
} }
// On considère que le bouton est enfoncé // On considère que le bouton est enfoncé
Buttons_Pool[btn_number].Pressed=BUTTON_PRESSED; Buttons_Pool[btn_number].Pressed=BUTTON_PRESSED;
// On affiche le cadre autour du bouton de façon à ce qu'il paraisse enfoncé // On affiche le cadre autour du bouton de façon à ce qu'il paraisse enfoncé
Draw_menu_button(btn_number, BUTTON_PRESSED); Draw_menu_button(btn_number, BUTTON_PRESSED);
Display_cursor(); Display_cursor();
@ -480,7 +480,7 @@ void Select_button(int btn_number,byte click)
if ((click==1 && !Buttons_Pool[btn_number].Left_instant) if ((click==1 && !Buttons_Pool[btn_number].Left_instant)
||(click!=1 && !Buttons_Pool[btn_number].Right_instant)) ||(click!=1 && !Buttons_Pool[btn_number].Right_instant))
{ {
// On attend ensuite que l'utilisateur lâche son bouton: // On attend ensuite que l'utilisateur lâche son bouton:
Wait_end_of_click(); Wait_end_of_click();
} }
@ -641,10 +641,10 @@ void Layer_preview_off(int * preview_is_visible)
void Main_handler(void) void Main_handler(void)
{ {
static byte temp_color; static byte temp_color;
int button_index; // Numéro de bouton de menu en cours int button_index; // Numéro de bouton de menu en cours
int prev_button_number=0; // Numéro de bouton de menu sur lequel on était précédemment int prev_button_number=0; // Numéro de bouton de menu sur lequel on était précédemment
byte blink; // L'opération demande un effacement du curseur byte blink; // L'opération demande un effacement du curseur
int key_index; // index du tableau de touches spéciales correspondant à la touche enfoncée int key_index; // index du tableau de touches spéciales correspondant à la touche enfoncée
byte temp; byte temp;
byte effect_modified; byte effect_modified;
byte action; byte action;
@ -769,7 +769,7 @@ void Main_handler(void)
Special_previous_backcolor(); Special_previous_backcolor();
action++; action++;
break; break;
case SPECIAL_SMALLER_PAINTBRUSH: // Rétrécir le pinceau case SPECIAL_SMALLER_PAINTBRUSH: // Rétrécir le pinceau
Smaller_paintbrush(); Smaller_paintbrush();
action++; action++;
break; break;
@ -922,13 +922,13 @@ void Main_handler(void)
Display_cursor(); Display_cursor();
action++; action++;
break; break;
case SPECIAL_ROTATE_90 : // 90° brush rotation case SPECIAL_ROTATE_90 : // 90° brush rotation
Hide_cursor(); Hide_cursor();
Rotate_90_deg(); Rotate_90_deg();
Display_cursor(); Display_cursor();
action++; action++;
break; break;
case SPECIAL_ROTATE_180 : // 180° brush rotation case SPECIAL_ROTATE_180 : // 180° brush rotation
Hide_cursor(); Hide_cursor();
Rotate_180_deg_lowlevel(Brush_original_pixels, Brush_width, Brush_height); Rotate_180_deg_lowlevel(Brush_original_pixels, Brush_width, Brush_height);
// Remap according to the last used remap table // Remap according to the last used remap table
@ -1392,8 +1392,8 @@ void Main_handler(void)
} }
} }
// Si on a modifié un effet, il faut rafficher le bouton des effets en // Si on a modifié un effet, il faut rafficher le bouton des effets en
// conséquence. // conséquence.
if (effect_modified) if (effect_modified)
{ {
Hide_cursor(); Hide_cursor();
@ -1433,7 +1433,7 @@ void Main_handler(void)
{ {
if (Menu_is_visible) if (Menu_is_visible)
{ {
// On nettoie les coordonnées // On nettoie les coordonnées
Hide_cursor(); Hide_cursor();
/*if (Gfx->Hover_effect && prev_button_number > -1 && !Buttons_Pool[prev_button_number].Pressed) /*if (Gfx->Hover_effect && prev_button_number > -1 && !Buttons_Pool[prev_button_number].Pressed)
@ -1528,7 +1528,7 @@ void Main_handler(void)
// Le curseur se trouve dans l'image // Le curseur se trouve dans l'image
if ( (!Cursor_in_menu) && (Menu_is_visible) && (Old_MY != Mouse_Y || Old_MX != Mouse_X || Key || Mouse_K)) // On ne met les coordonnées à jour que si l'utilisateur a fait un truc if ( (!Cursor_in_menu) && (Menu_is_visible) && (Old_MY != Mouse_Y || Old_MX != Mouse_X || Key || Mouse_K)) // On ne met les coordonnées à jour que si l'utilisateur a fait un truc
{ {
if(Cursor_in_menu_previous) if(Cursor_in_menu_previous)
{ {
@ -1576,14 +1576,14 @@ void Main_handler(void)
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// différentes fonctions d'affichage utilisées dans les fenêtres // // différentes fonctions d'affichage utilisées dans les fenêtres //
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
//----------------------- Tracer une fenêtre d'options ----------------------- //----------------------- Tracer une fenêtre d'options -----------------------
void Open_window(word width,word height, const char * title) void Open_window(word width,word height, const char * title)
// Lors de l'appel à cette procédure, la souris doit être affichée. // Lors de l'appel à cette procédure, la souris doit être affichée.
// En sortie de cette procedure, la souris est effacée. // En sortie de cette procedure, la souris est effacée.
{ {
//word i,j; //word i,j;
size_t title_length; size_t title_length;
@ -1605,20 +1605,20 @@ void Open_window(word width,word height, const char * title)
Window_width=width; Window_width=width;
Window_height=height; Window_height=height;
// Positionnement de la fenêtre // Positionnement de la fenêtre
Window_pos_X=(Screen_width-(width*Menu_factor_X))>>1; Window_pos_X=(Screen_width-(width*Menu_factor_X))>>1;
Window_pos_Y=(Screen_height-(height*Menu_factor_Y))>>1; Window_pos_Y=(Screen_height-(height*Menu_factor_Y))>>1;
Window_draggable=1; Window_draggable=1;
// Sauvegarde de ce que la fenêtre remplace // Sauvegarde de ce que la fenêtre remplace
Save_background(&(Window_background[Windows_open-1]), Window_pos_X, Window_pos_Y, width, height); Save_background(&(Window_background[Windows_open-1]), Window_pos_X, Window_pos_Y, width, height);
// Fenêtre grise // Fenêtre grise
Window_rectangle(2,2,width-4,height-4,MC_Window); Window_rectangle(2,2,width-4,height-4,MC_Window);
// -- Frame de la fenêtre ----- --- -- - - // -- Frame de la fenêtre ----- --- -- - -
// Frame noir puis en relief // Frame noir puis en relief
Window_display_frame_mono(0,0,width,height,MC_Black); Window_display_frame_mono(0,0,width,height,MC_Black);
@ -1652,7 +1652,7 @@ void Open_window(word width,word height, const char * title)
Allow_drag_and_drop(0); Allow_drag_and_drop(0);
} }
// Initialisation des listes de boutons de la fenêtre // Initialisation des listes de boutons de la fenêtre
Window_normal_button_list =NULL; Window_normal_button_list =NULL;
Window_palette_button_list =NULL; Window_palette_button_list =NULL;
Window_scroller_button_list=NULL; Window_scroller_button_list=NULL;
@ -1662,11 +1662,11 @@ void Open_window(word width,word height, const char * title)
} }
//----------------------- Fermer une fenêtre d'options ----------------------- //----------------------- Fermer une fenêtre d'options -----------------------
void Close_window(void) void Close_window(void)
// Lors de l'appel à cette procedure, la souris doit être affichée. // Lors de l'appel à cette procedure, la souris doit être affichée.
// En sortie de cette procedure, la souris est effacée. // En sortie de cette procedure, la souris est effacée.
{ {
T_Normal_button * temp1; T_Normal_button * temp1;
T_Palette_button * temp2; T_Palette_button * temp2;
@ -1717,7 +1717,7 @@ void Close_window(void)
if (Windows_open != 1) if (Windows_open != 1)
{ {
// Restore de ce que la fenêtre cachait // Restore de ce que la fenêtre cachait
Restore_background(&Window_background[Windows_open-1], Window_pos_X, Window_pos_Y, Window_width, Window_height); Restore_background(&Window_background[Windows_open-1], Window_pos_X, Window_pos_Y, Window_width, Window_height);
Update_window_area(0,0,Window_width,Window_height); Update_window_area(0,0,Window_width,Window_height);
Windows_open--; Windows_open--;
@ -1752,7 +1752,7 @@ void Close_window(void)
} }
//---------------- Dessiner un bouton normal dans une fenêtre ---------------- //---------------- Dessiner un bouton normal dans une fenêtre ----------------
// undersc_letter is 0 for no underscore, 1-indexed array index otherwise // undersc_letter is 0 for no underscore, 1-indexed array index otherwise
void Window_draw_normal_bouton(word x_pos,word y_pos,word width,word height, void Window_draw_normal_bouton(word x_pos,word y_pos,word width,word height,
const char * title,byte undersc_letter,byte clickable) const char * title,byte undersc_letter,byte clickable)
@ -1783,14 +1783,14 @@ void Window_draw_normal_bouton(word x_pos,word y_pos,word width,word height,
} }
// -- Button normal enfoncé dans la fenêtre -- // -- Button normal enfoncé dans la fenêtre --
void Window_select_normal_button(word x_pos,word y_pos,word width,word height) void Window_select_normal_button(word x_pos,word y_pos,word width,word height)
{ {
Window_display_frame_generic(x_pos,y_pos,width,height,MC_Dark,MC_Black,MC_Dark,MC_Dark,MC_Black); Window_display_frame_generic(x_pos,y_pos,width,height,MC_Dark,MC_Black,MC_Dark,MC_Dark,MC_Black);
Update_window_area(x_pos, y_pos, width, height); Update_window_area(x_pos, y_pos, width, height);
} }
// -- Button normal désenfoncé dans la fenêtre -- // -- Button normal désenfoncé dans la fenêtre --
void Window_unselect_normal_button(word x_pos,word y_pos,word width,word height) void Window_unselect_normal_button(word x_pos,word y_pos,word width,word height)
{ {
Window_display_frame_out(x_pos,y_pos,width,height); Window_display_frame_out(x_pos,y_pos,width,height);
@ -1798,7 +1798,7 @@ void Window_unselect_normal_button(word x_pos,word y_pos,word width,word height)
} }
//--------------- Dessiner un bouton palette dans une fenêtre ---------------- //--------------- Dessiner un bouton palette dans une fenêtre ----------------
void Window_draw_palette_bouton(word x_pos,word y_pos) void Window_draw_palette_bouton(word x_pos,word y_pos)
{ {
word color; word color;
@ -1811,7 +1811,7 @@ void Window_draw_palette_bouton(word x_pos,word y_pos)
// -------------------- Effacer les TAGs sur les palette --------------------- // -------------------- Effacer les TAGs sur les palette ---------------------
// Cette fonct° ne sert plus que lorsqu'on efface les tags dans le menu Spray. // Cette fonct° ne sert plus que lorsqu'on efface les tags dans le menu Spray.
void Window_clear_tags(void) void Window_clear_tags(void)
{ {
word origin_x; word origin_x;
@ -1861,10 +1861,10 @@ void Tag_color_range(byte start,byte end)
if (start!=end) if (start!=end)
{ {
// On complète le 1er TAG // On complète le 1er TAG
Pixel_in_window(origin_x+1,origin_y+4,MC_Black); Pixel_in_window(origin_x+1,origin_y+4,MC_Black);
// On affiche le 2ème TAG // On affiche le 2ème TAG
origin_x=(Window_palette_button_list->Pos_X+3)+(end>>4)*10; origin_x=(Window_palette_button_list->Pos_X+3)+(end>>4)*10;
origin_y=(Window_palette_button_list->Pos_Y+3)+(end&15)* 5; origin_y=(Window_palette_button_list->Pos_Y+3)+(end&15)* 5;
for (y_pos=0,window_y_pos=origin_y; y_pos<5; y_pos++,window_y_pos++) for (y_pos=0,window_y_pos=origin_y; y_pos<5; y_pos++,window_y_pos++)
@ -1873,13 +1873,13 @@ void Tag_color_range(byte start,byte end)
Pixel_in_window(origin_x+1,window_y_pos,MC_Black); Pixel_in_window(origin_x+1,window_y_pos,MC_Black);
Pixel_in_window(origin_x+2,origin_y+2,MC_Black); Pixel_in_window(origin_x+2,origin_y+2,MC_Black);
// On TAG toutes les couleurs intermédiaires // On TAG toutes les couleurs intermédiaires
for (index=start+1;index<end;index++) for (index=start+1;index<end;index++)
{ {
Window_rectangle(Window_palette_button_list->Pos_X+3+((index>>4)*10), Window_rectangle(Window_palette_button_list->Pos_X+3+((index>>4)*10),
Window_palette_button_list->Pos_Y+3+((index&15)* 5), Window_palette_button_list->Pos_Y+3+((index&15)* 5),
2,5,MC_Black); 2,5,MC_Black);
// On efface l'éventuelle pointe d'une ancienne extrémité de l'intervalle // On efface l'éventuelle pointe d'une ancienne extrémité de l'intervalle
Pixel_in_window(Window_palette_button_list->Pos_X+5+((index>>4)*10), Pixel_in_window(Window_palette_button_list->Pos_X+5+((index>>4)*10),
Window_palette_button_list->Pos_Y+5+((index&15)* 5), Window_palette_button_list->Pos_Y+5+((index&15)* 5),
MC_Light); MC_Light);
@ -1893,7 +1893,7 @@ void Tag_color_range(byte start,byte end)
} }
//------------------ Dessiner un scroller dans une fenêtre ------------------- //------------------ Dessiner un scroller dans une fenêtre -------------------
void Compute_slider_cursor_length(T_Scroller_button * button) void Compute_slider_cursor_length(T_Scroller_button * button)
{ {
@ -1981,7 +1981,7 @@ void Window_draw_scroller_button(T_Scroller_button * button)
} }
//--------------- Dessiner une zone de saisie dans une fenêtre --------------- //--------------- Dessiner une zone de saisie dans une fenêtre ---------------
void Window_draw_input_bouton(word x_pos,word y_pos,word width_in_characters) void Window_draw_input_bouton(word x_pos,word y_pos,word width_in_characters)
{ {
@ -2005,7 +2005,7 @@ void Window_clear_input_button(T_Special_button * button)
} }
//------ Rajout d'un bouton à la liste de ceux présents dans la fenêtre ------ //------ Rajout d'un bouton à la liste de ceux présents dans la fenêtre ------
// undersc_letter is 0 for no underscore, 1-indexed array index otherwise // undersc_letter is 0 for no underscore, 1-indexed array index otherwise
T_Normal_button * Window_set_normal_button(word x_pos, word y_pos, T_Normal_button * Window_set_normal_button(word x_pos, word y_pos,
word width, word height, word width, word height,
@ -2035,7 +2035,7 @@ T_Normal_button * Window_set_normal_button(word x_pos, word y_pos,
Window_draw_normal_bouton(x_pos,y_pos,width,height,title,undersc_letter,clickable); Window_draw_normal_bouton(x_pos,y_pos,width,height,title,undersc_letter,clickable);
return temp; return temp;
} }
//------ Rajout d'un bouton à la liste de ceux présents dans la fenêtre ------ //------ Rajout d'un bouton à la liste de ceux présents dans la fenêtre ------
// undersc_letter is 0 for no underscore, 1-indexed array index otherwise // undersc_letter is 0 for no underscore, 1-indexed array index otherwise
T_Normal_button * Window_set_repeatable_button(word x_pos, word y_pos, T_Normal_button * Window_set_repeatable_button(word x_pos, word y_pos,
word width, word height, word width, word height,
@ -2194,9 +2194,9 @@ T_Dropdown_button * Window_set_dropdown_button(word x_pos,word y_pos,word width,
return temp; return temp;
} }
// Ajoute un choix à une dropdown. Le libellé est seulement référencé, // Ajoute un choix à une dropdown. Le libellé est seulement référencé,
// il doit pointer sur une zone qui doit être encore valide à la fermeture // il doit pointer sur une zone qui doit être encore valide à la fermeture
// de la fenêtre (comprise). // de la fenêtre (comprise).
void Window_dropdown_add_item(T_Dropdown_button * dropdown, word btn_number, const char *label) void Window_dropdown_add_item(T_Dropdown_button * dropdown, word btn_number, const char *label)
{ {
T_Dropdown_choice *temp; T_Dropdown_choice *temp;
@ -2210,7 +2210,7 @@ void Window_dropdown_add_item(T_Dropdown_button * dropdown, word btn_number, con
last=dropdown->First_item; last=dropdown->First_item;
if (last) if (last)
{ {
// On cherche le dernier élément // On cherche le dernier élément
for (;last->Next;last=last->Next) for (;last->Next;last=last->Next)
; ;
last->Next=temp; last->Next=temp;
@ -2289,12 +2289,12 @@ void Window_redraw_list(T_List_button * list)
//----------------------- Ouverture d'un pop-up ----------------------- //----------------------- Ouverture d'un pop-up -----------------------
void Open_popup(word x_pos, word y_pos, word width,word height) void Open_popup(word x_pos, word y_pos, word width,word height)
// Lors de l'appel à cette procédure, la souris doit être affichée. // Lors de l'appel à cette procédure, la souris doit être affichée.
// En sortie de cette procedure, la souris est effacée. // En sortie de cette procedure, la souris est effacée.
// Note : les pop-ups sont gérés comme s'ils étaient des sous-fenêtres, ils ont donc leur propre boucle d'évènements et tout, on peut ajouter des widgets dedans, ... // Note : les pop-ups sont gérés comme s'ils étaient des sous-fenêtres, ils ont donc leur propre boucle d'évènements et tout, on peut ajouter des widgets dedans, ...
// Les différences sont surtout graphiques : // Les différences sont surtout graphiques :
// -Possibilité de préciser la position XY // -Possibilité de préciser la position XY
// -Pas de titre // -Pas de titre
// -Pas de cadre en relief mais seulement un plat, et il est blanc au lieu de noir. // -Pas de cadre en relief mais seulement un plat, et il est blanc au lieu de noir.
{ {
@ -2311,11 +2311,11 @@ void Open_popup(word x_pos, word y_pos, word width,word height)
Window_pos_Y=y_pos; Window_pos_Y=y_pos;
Window_draggable=0; Window_draggable=0;
// Sauvegarde de ce que la fenêtre remplace // Sauvegarde de ce que la fenêtre remplace
Save_background(&(Window_background[Windows_open-1]), Window_pos_X, Window_pos_Y, width, height); Save_background(&(Window_background[Windows_open-1]), Window_pos_X, Window_pos_Y, width, height);
/* /*
// Fenêtre grise // Fenêtre grise
Window_rectangle(1,1,width-2,height-2,MC_Light); Window_rectangle(1,1,width-2,height-2,MC_Light);
// Frame noir puis en relief // Frame noir puis en relief
@ -2333,7 +2333,7 @@ void Open_popup(word x_pos, word y_pos, word width,word height)
Paintbrush_hidden=1; Paintbrush_hidden=1;
} }
// Initialisation des listes de boutons de la fenêtre // Initialisation des listes de boutons de la fenêtre
Window_normal_button_list =NULL; Window_normal_button_list =NULL;
Window_palette_button_list =NULL; Window_palette_button_list =NULL;
Window_scroller_button_list=NULL; Window_scroller_button_list=NULL;
@ -2343,11 +2343,11 @@ void Open_popup(word x_pos, word y_pos, word width,word height)
} }
//----------------------- Fermer une fenêtre d'options ----------------------- //----------------------- Fermer une fenêtre d'options -----------------------
void Close_popup(void) void Close_popup(void)
// Lors de l'appel à cette procedure, la souris doit être affichée. // Lors de l'appel à cette procedure, la souris doit être affichée.
// En sortie de cette procedure, la souris est effacée. // En sortie de cette procedure, la souris est effacée.
{ {
T_Normal_button * temp1; T_Normal_button * temp1;
T_Palette_button * temp2; T_Palette_button * temp2;
@ -2398,7 +2398,7 @@ void Close_popup(void)
if (Windows_open != 1) if (Windows_open != 1)
{ {
// Restore de ce que la fenêtre cachait // Restore de ce que la fenêtre cachait
Restore_background(&Window_background[Windows_open-1], Window_pos_X, Window_pos_Y, Window_width, Window_height); Restore_background(&Window_background[Windows_open-1], Window_pos_X, Window_pos_Y, Window_width, Window_height);
Update_window_area(0,0,Window_width,Window_height); Update_window_area(0,0,Window_width,Window_height);
Windows_open--; Windows_open--;
@ -2431,12 +2431,12 @@ void Close_popup(void)
} }
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// // // //
// Mini-MOTEUR utilisé dans les fenêtres (menus des boutons...) // // Mini-MOTEUR utilisé dans les fenêtres (menus des boutons...) //
// // // //
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// -- Indique si on a cliqué dans une zone définie par deux points extremes -- // -- Indique si on a cliqué dans une zone définie par deux points extremes --
byte Window_click_in_rectangle(short start_x,short start_y,short end_x,short end_y) byte Window_click_in_rectangle(short start_x,short start_y,short end_x,short end_y)
{ {
short x_pos,y_pos; short x_pos,y_pos;
@ -2452,7 +2452,7 @@ byte Window_click_in_rectangle(short start_x,short start_y,short end_x,short end
// --- Attend que l'on clique dans la palette pour renvoyer la couleur choisie // --- Attend que l'on clique dans la palette pour renvoyer la couleur choisie
// ou bien renvoie -1 si on a annulé l'action pas click-droit ou Escape ------ // ou bien renvoie -1 si on a annulé l'action pas click-droit ou Escape ------
short Wait_click_in_palette(T_Palette_button * button) short Wait_click_in_palette(T_Palette_button * button)
{ {
short start_x=button->Pos_X+5; short start_x=button->Pos_X+5;
@ -2517,13 +2517,13 @@ short Wait_click_in_palette(T_Palette_button * button)
// -------------- Récupération d'une couleur derrière un menu ---------------- // -------------- Récupération d'une couleur derrière un menu ----------------
void Get_color_behind_window(byte * color, byte * click) void Get_color_behind_window(byte * color, byte * click)
{ {
short old_x=-1; short old_x=-1;
short old_y=-1; short old_y=-1;
short index; short index;
short a,b,c,d; // Variables temporaires et multitâches... short a,b,c,d; // Variables temporaires et multitâches...
byte * buffer = NULL; byte * buffer = NULL;
char str[25]; char str[25];
byte cursor_was_hidden; byte cursor_was_hidden;
@ -2547,7 +2547,7 @@ void Get_color_behind_window(byte * color, byte * click)
Cursor_shape=CURSOR_SHAPE_COLORPICKER; Cursor_shape=CURSOR_SHAPE_COLORPICKER;
b=Paintbrush_hidden; b=Paintbrush_hidden;
Paintbrush_hidden=1; Paintbrush_hidden=1;
c=-1; // color pointée: au début aucune, comme ça on initialise tout c=-1; // color pointée: au début aucune, comme ça on initialise tout
if (Menu_is_visible_before_window) if (Menu_is_visible_before_window)
Print_in_menu(Buttons_Pool[BUTTON_CHOOSE_COL].Tooltip,0); Print_in_menu(Buttons_Pool[BUTTON_CHOOSE_COL].Tooltip,0);
@ -2563,7 +2563,7 @@ void Get_color_behind_window(byte * color, byte * click)
a=Read_pixel(Mouse_X,Mouse_Y); a=Read_pixel(Mouse_X,Mouse_Y);
if (a!=c) if (a!=c)
{ {
c=a; // Mise à jour de la couleur pointée c=a; // Mise à jour de la couleur pointée
if (Menu_is_visible_before_window) if (Menu_is_visible_before_window)
{ {
sprintf(str,"%d",a); sprintf(str,"%d",a);
@ -2614,7 +2614,7 @@ void Get_color_behind_window(byte * color, byte * click)
// ------------ Opération de déplacement de la fenêtre à l'écran ------------- // ------------ Opération de déplacement de la fenêtre à l'écran -------------
void Move_window(short dx, short dy) void Move_window(short dx, short dy)
{ {
short new_x=Mouse_X-dx; short new_x=Mouse_X-dx;
@ -2711,19 +2711,19 @@ void Move_window(short dx, short dy)
Menu_Y=a; Menu_Y=a;
Menu_is_visible=b; Menu_is_visible=b;
// Sauvegarde du contenu actuel de la fenêtre // Sauvegarde du contenu actuel de la fenêtre
Save_background(&buffer, Window_pos_X, Window_pos_Y, Window_width, Window_height); Save_background(&buffer, Window_pos_X, Window_pos_Y, Window_width, Window_height);
// Restore de ce que la fenêtre cachait // Restore de ce que la fenêtre cachait
Restore_background(&Window_background[Windows_open-1], Window_pos_X, Window_pos_Y, Window_width, Window_height); Restore_background(&Window_background[Windows_open-1], Window_pos_X, Window_pos_Y, Window_width, Window_height);
// Sauvegarde de ce que la fenêtre remplace // Sauvegarde de ce que la fenêtre remplace
Save_background(&(Window_background[Windows_open-1]), new_x, new_y, Window_width, Window_height); Save_background(&(Window_background[Windows_open-1]), new_x, new_y, Window_width, Window_height);
// Raffichage de la fenêtre // Raffichage de la fenêtre
Restore_background(&buffer, new_x, new_y, Window_width, Window_height); Restore_background(&buffer, new_x, new_y, Window_width, Window_height);
// Mise à jour du rectangle englobant // Mise à jour du rectangle englobant
Update_rect( Update_rect(
(new_x>Window_pos_X)?Window_pos_X:new_x, (new_x>Window_pos_X)?Window_pos_X:new_x,
(new_y>Window_pos_Y)?Window_pos_Y:new_y, (new_y>Window_pos_Y)?Window_pos_Y:new_y,
@ -2757,7 +2757,7 @@ T_Dropdown_choice * Dropdown_activate(T_Dropdown_button *button, short off_x, sh
short box_height; short box_height;
T_Dropdown_choice *item; T_Dropdown_choice *item;
// Taille de l'ombre portée (en plus des dimensions normales) // Taille de l'ombre portée (en plus des dimensions normales)
#define SHADOW_RIGHT 3 #define SHADOW_RIGHT 3
#define SHADOW_BOTTOM 4 #define SHADOW_BOTTOM 4
@ -2783,7 +2783,7 @@ T_Dropdown_choice * Dropdown_activate(T_Dropdown_button *button, short off_x, sh
Window_rectangle(0,0,1,box_height,MC_Black); Window_rectangle(0,0,1,box_height,MC_Black);
// Frame fonce et blanc // Frame fonce et blanc
Window_display_frame_out(1,0,button->Dropdown_width-1,box_height); Window_display_frame_out(1,0,button->Dropdown_width-1,box_height);
// Ombre portée // Ombre portée
if (SHADOW_BOTTOM) if (SHADOW_BOTTOM)
{ {
Window_rectangle(SHADOW_RIGHT, Window_rectangle(SHADOW_RIGHT,
@ -2815,7 +2815,7 @@ T_Dropdown_choice * Dropdown_activate(T_Dropdown_button *button, short off_x, sh
while (1) while (1)
{ {
old_selected_index = selected_index; old_selected_index = selected_index;
// Fenêtre grise // Fenêtre grise
Window_rectangle(2,1,button->Dropdown_width-3,box_height-2,MC_Light); Window_rectangle(2,1,button->Dropdown_width-3,box_height-2,MC_Light);
// Affichage des items // Affichage des items
for(item=button->First_item,choice_index=0; item!=NULL; item=item->Next,choice_index++) for(item=button->First_item,choice_index=0; item!=NULL; item=item->Next,choice_index++)
@ -2843,7 +2843,7 @@ T_Dropdown_choice * Dropdown_activate(T_Dropdown_button *button, short off_x, sh
{ {
// Attente // Attente
Get_input(20); Get_input(20);
// Mise à jour du survol // Mise à jour du survol
selected_index=Window_click_in_rectangle(2,2,button->Dropdown_width-2,box_height-1)? selected_index=Window_click_in_rectangle(2,2,button->Dropdown_width-2,box_height-1)?
(((Mouse_Y-Window_pos_Y)/Menu_factor_Y-2)>>3) : -1; (((Mouse_Y-Window_pos_Y)/Menu_factor_Y-2)>>3) : -1;
@ -2901,9 +2901,9 @@ short Window_dropdown_on_click(T_Dropdown_button *button)
} }
// --- Fonction de clic sur un bouton a peu près ordinaire: // --- Fonction de clic sur un bouton a peu près ordinaire:
// Attend que l'on relache le bouton, et renvoie le numero du bouton si on // Attend que l'on relache le bouton, et renvoie le numero du bouton si on
// est resté dessus, 0 si on a annulé en sortant du bouton. // est resté dessus, 0 si on a annulé en sortant du bouton.
short Window_normal_button_onclick(word x_pos, word y_pos, word width, word height, short btn_number) short Window_normal_button_onclick(word x_pos, word y_pos, word width, word height, short btn_number)
{ {
while(1) while(1)
@ -3146,7 +3146,7 @@ short Window_get_button_shortcut(void)
else else
Window_attribute1=LEFT_SIDE; Window_attribute1=LEFT_SIDE;
// On fait une première recherche // On fait une première recherche
temp=Window_normal_button_list; temp=Window_normal_button_list;
while (temp!=NULL) while (temp!=NULL)
{ {
@ -3178,9 +3178,9 @@ short Window_get_button_shortcut(void)
temp2=temp2->Next; temp2=temp2->Next;
} }
// Si la recherche n'a pas été fructueuse ET que l'utilisateur appuyait sur // Si la recherche n'a pas été fructueuse ET que l'utilisateur appuyait sur
// <Shift>, on regarde si un bouton ne pourrait pas réagir comme si <Shift> // <Shift>, on regarde si un bouton ne pourrait pas réagir comme si <Shift>
// n'était pas appuyé. // n'était pas appuyé.
if (Window_attribute1==RIGHT_SIDE) if (Window_attribute1==RIGHT_SIDE)
{ {
temp=Window_normal_button_list; temp=Window_normal_button_list;
@ -3350,7 +3350,7 @@ short Window_clicked_button(void)
{ {
list->List_start=list->List_start+list->Cursor_position; list->List_start=list->List_start+list->Cursor_position;
list->Cursor_position=0; list->Cursor_position=0;
// Mise à jour du scroller // Mise à jour du scroller
list->Scroller->Position=list->List_start; list->Scroller->Position=list->List_start;
Window_draw_slider(list->Scroller); Window_draw_slider(list->Scroller);
} }
@ -3370,7 +3370,7 @@ short Window_clicked_button(void)
{ {
list->List_start=list->List_start+list->Cursor_position-(list->Scroller->Nb_visibles-1); list->List_start=list->List_start+list->Cursor_position-(list->Scroller->Nb_visibles-1);
list->Cursor_position=(list->Scroller->Nb_visibles-1); list->Cursor_position=(list->Scroller->Nb_visibles-1);
// Mise à jour du scroller // Mise à jour du scroller
list->Scroller->Position=list->List_start; list->Scroller->Position=list->List_start;
Window_draw_slider(list->Scroller); Window_draw_slider(list->Scroller);
} }
@ -3387,7 +3387,7 @@ short Window_clicked_button(void)
Hide_cursor(); Hide_cursor();
list->Cursor_position=0; list->Cursor_position=0;
list->List_start=0; list->List_start=0;
// Mise à jour du scroller // Mise à jour du scroller
list->Scroller->Position=list->List_start; list->Scroller->Position=list->List_start;
Window_draw_slider(list->Scroller); Window_draw_slider(list->Scroller);
Window_redraw_list(list); Window_redraw_list(list);
@ -3406,7 +3406,7 @@ short Window_clicked_button(void)
{ {
list->List_start=list->List_start+list->Cursor_position-(list->Scroller->Nb_visibles-1); list->List_start=list->List_start+list->Cursor_position-(list->Scroller->Nb_visibles-1);
list->Cursor_position=(list->Scroller->Nb_visibles-1); list->Cursor_position=(list->Scroller->Nb_visibles-1);
// Mise à jour du scroller // Mise à jour du scroller
list->Scroller->Position=list->List_start; list->Scroller->Position=list->List_start;
Window_draw_slider(list->Scroller); Window_draw_slider(list->Scroller);
} }
@ -3436,7 +3436,7 @@ short Window_clicked_button(void)
{ {
list->List_start=list->Scroller->Nb_elements-list->Scroller->Nb_visibles; list->List_start=list->Scroller->Nb_elements-list->Scroller->Nb_visibles;
} }
// Mise à jour du scroller // Mise à jour du scroller
list->Scroller->Position=list->List_start; list->Scroller->Position=list->List_start;
Window_draw_slider(list->Scroller); Window_draw_slider(list->Scroller);
} }
@ -3462,7 +3462,7 @@ short Window_clicked_button(void)
{ {
list->List_start=0; list->List_start=0;
} }
// Mise à jour du scroller // Mise à jour du scroller
list->Scroller->Position=list->List_start; list->Scroller->Position=list->List_start;
Window_draw_slider(list->Scroller); Window_draw_slider(list->Scroller);
} }
@ -3481,10 +3481,10 @@ short Window_clicked_button(void)
else else
list->List_start=0; list->List_start=0;
list->Cursor_position-=list->List_start; list->Cursor_position-=list->List_start;
// On affiche à nouveau la liste // On affiche à nouveau la liste
Hide_cursor(); Hide_cursor();
Window_redraw_list(list); Window_redraw_list(list);
// Mise à jour du scroller // Mise à jour du scroller
list->Scroller->Position=list->List_start; list->Scroller->Position=list->List_start;
Window_draw_slider(list->Scroller); Window_draw_slider(list->Scroller);
Display_cursor(); Display_cursor();
@ -3498,10 +3498,10 @@ short Window_clicked_button(void)
list->List_start=list->Scroller->Nb_elements-list->Scroller->Nb_visibles; list->List_start=list->Scroller->Nb_elements-list->Scroller->Nb_visibles;
} }
list->Cursor_position-=list->List_start; list->Cursor_position-=list->List_start;
// On affiche à nouveau la liste // On affiche à nouveau la liste
Hide_cursor(); Hide_cursor();
Window_redraw_list(list); Window_redraw_list(list);
// Mise à jour du scroller // Mise à jour du scroller
list->Scroller->Position=list->List_start; list->Scroller->Position=list->List_start;
Window_draw_slider(list->Scroller); Window_draw_slider(list->Scroller);
Display_cursor(); Display_cursor();
@ -3515,8 +3515,8 @@ short Window_clicked_button(void)
} }
// Fonction qui sert à remapper les parties sauvegardées derriere les // Fonction qui sert à remapper les parties sauvegardées derriere les
// fenetres ouvertes. C'est utilisé par exemple par la fenetre de palette // fenetres ouvertes. C'est utilisé par exemple par la fenetre de palette
// Qui remappe des couleurs, afin de propager les changements. // Qui remappe des couleurs, afin de propager les changements.
void Remap_window_backgrounds(const byte * conversion_table, int Min_Y, int Max_Y) void Remap_window_backgrounds(const byte * conversion_table, int Min_Y, int Max_Y)
{ {
@ -3656,8 +3656,8 @@ void Set_bar_visibility(word bar, int visible, int with_redraw)
Compute_magnifier_data(); Compute_magnifier_data();
} }
// On repositionne le décalage de l'image pour qu'il n'y ait pas d'in- // On repositionne le décalage de l'image pour qu'il n'y ait pas d'in-
// -cohérences lorsqu'on sortira du mode Loupe. // -cohérences lorsqu'on sortira du mode Loupe.
if (Main.offset_Y+Screen_height>Main.image_height) if (Main.offset_Y+Screen_height>Main.image_height)
{ {
if (Screen_height>Main.image_height) if (Screen_height>Main.image_height)

View File

@ -3,7 +3,7 @@
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2018 Thomas Bernard Copyright 2018 Thomas Bernard
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2009 Petter Lindquist Copyright 2009 Petter Lindquist
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
Copyright 2008 Franck Charlet Copyright 2008 Franck Charlet
@ -89,7 +89,7 @@ void Test_IMG(T_IO_Context * context, FILE * file)
(void)context; (void)context;
File_error=1; File_error=1;
// Lecture et vérification de la signature // Lecture et vérification de la signature
if (Read_bytes(file,IMG_header.Filler1,6) if (Read_bytes(file,IMG_header.Filler1,6)
&& Read_word_le(file,&(IMG_header.Width)) && Read_word_le(file,&(IMG_header.Width))
&& Read_word_le(file,&(IMG_header.Height)) && Read_word_le(file,&(IMG_header.Height))
@ -206,7 +206,7 @@ void Save_IMG(T_IO_Context * context)
if (File_error) if (File_error)
Remove_file(context); Remove_file(context);
} }
else // Error d'écriture (disque plein ou protégé) else // Error d'écriture (disque plein ou protégé)
{ {
fclose(file); fclose(file);
Remove_file(context); Remove_file(context);
@ -272,10 +272,10 @@ void Test_IFF(FILE * IFF_file, const char *sub_type)
if (! Read_dword_be(IFF_file, &dummy)) if (! Read_dword_be(IFF_file, &dummy))
break; break;
// On aurait pu vérifier que ce long est égal à la taille // On aurait pu vérifier que ce long est égal à la taille
// du fichier - 8, mais ça aurait interdit de charger des // du fichier - 8, mais ça aurait interdit de charger des
// fichiers tronqués (et déjà que c'est chiant de perdre // fichiers tronqués (et déjà que c'est chiant de perdre
// une partie du fichier il faut quand même pouvoir en // une partie du fichier il faut quand même pouvoir en
// garder un peu... Sinon, moi je pleure :'( !!! ) // garder un peu... Sinon, moi je pleure :'( !!! )
if (! Read_bytes(IFF_file,format,4)) if (! Read_bytes(IFF_file,format,4))
break; break;
@ -367,12 +367,12 @@ int IFF_Skip_section(FILE * file)
// ------------------------- Attendre une section ------------------------- // ------------------------- Attendre une section -------------------------
byte IFF_Wait_for(FILE * file, const char * expected_section) byte IFF_Wait_for(FILE * file, const char * expected_section)
{ {
// Valeur retournée: 1=Section trouvée, 0=Section non trouvée (erreur) // Valeur retournée: 1=Section trouvée, 0=Section non trouvée (erreur)
byte section_read[4]; byte section_read[4];
if (! Read_bytes(file,section_read,4)) if (! Read_bytes(file,section_read,4))
return 0; return 0;
while (memcmp(section_read,expected_section,4)) // Sect. pas encore trouvée while (memcmp(section_read,expected_section,4)) // Sect. pas encore trouvée
{ {
if (!IFF_Skip_section(file)) if (!IFF_Skip_section(file))
return 0; return 0;
@ -382,7 +382,7 @@ byte IFF_Wait_for(FILE * file, const char * expected_section)
return 1; return 1;
} }
// Les images ILBM sont stockés en bitplanes donc on doit trifouiller les bits pour // Les images ILBM sont stockés en bitplanes donc on doit trifouiller les bits pour
// en faire du chunky // en faire du chunky
/// ///
@ -2061,11 +2061,11 @@ void Load_IFF(T_IO_Context * context)
switch (IFF_list_size) switch (IFF_list_size)
{ {
case 0 : // Première couleur case 0 : // Première couleur
IFF_color_list[0]=color; IFF_color_list[0]=color;
IFF_list_size=1; IFF_list_size=1;
break; break;
case 1 : // Deuxième couleur case 1 : // Deuxième couleur
last_color=IFF_color_list[0]; last_color=IFF_color_list[0];
IFF_repetition_mode=(last_color==color); IFF_repetition_mode=(last_color==color);
IFF_color_list[1]=color; IFF_color_list[1]=color;
@ -2074,7 +2074,7 @@ void Load_IFF(T_IO_Context * context)
default: // Couleurs suivantes default: // Couleurs suivantes
last_color =IFF_color_list[IFF_list_size-1]; last_color =IFF_color_list[IFF_list_size-1];
second_last_color=IFF_color_list[IFF_list_size-2]; second_last_color=IFF_color_list[IFF_list_size-2];
if (last_color==color) // On a une répétition de couleur if (last_color==color) // On a une répétition de couleur
{ {
if ( (IFF_repetition_mode) || (second_last_color!=color) ) if ( (IFF_repetition_mode) || (second_last_color!=color) )
// On conserve le mode... // On conserve le mode...
@ -2095,7 +2095,7 @@ void Load_IFF(T_IO_Context * context)
IFF_repetition_mode=1; IFF_repetition_mode=1;
} }
} }
else // La couleur n'est pas la même que la précédente else // La couleur n'est pas la même que la précédente
{ {
if (!IFF_repetition_mode) // On conserve le mode... if (!IFF_repetition_mode) // On conserve le mode...
{ {
@ -2154,7 +2154,7 @@ void Save_IFF(T_IO_Context * context)
setvbuf(IFF_file, NULL, _IOFBF, 64*1024); setvbuf(IFF_file, NULL, _IOFBF, 64*1024);
Write_bytes(IFF_file,"FORM",4); Write_bytes(IFF_file,"FORM",4);
Write_dword_be(IFF_file,0); // On mettra la taille à jour à la fin Write_dword_be(IFF_file,0); // On mettra la taille à jour à la fin
if (context->Format == FORMAT_LBM) if (context->Format == FORMAT_LBM)
Write_bytes(IFF_file,"ILBM",4); Write_bytes(IFF_file,"ILBM",4);
@ -2246,7 +2246,7 @@ void Save_IFF(T_IO_Context * context)
body_offset = ftell(IFF_file); body_offset = ftell(IFF_file);
Write_bytes(IFF_file,"BODY",4); Write_bytes(IFF_file,"BODY",4);
Write_dword_be(IFF_file,0); // On mettra la taille à jour à la fin Write_dword_be(IFF_file,0); // On mettra la taille à jour à la fin
if (context->Format == FORMAT_LBM) if (context->Format == FORMAT_LBM)
{ {
@ -3121,7 +3121,7 @@ static void Load_BMP_Pixels(T_IO_Context * context, FILE * file, unsigned int co
x_pos+=a; x_pos+=a;
y_pos-=b; y_pos-=b;
break; break;
default: // Nouvelle série default: // Nouvelle série
while (b) while (b)
{ {
if(Read_byte(file, &a)!=1) if(Read_byte(file, &a)!=1)
@ -3178,7 +3178,7 @@ static void Load_BMP_Pixels(T_IO_Context * context, FILE * file, unsigned int co
x_pos+=a; x_pos+=a;
y_pos-=b; y_pos-=b;
break; break;
default: // Nouvelle série (B 1/2 pixels bruts) default: // Nouvelle série (B 1/2 pixels bruts)
for (index=1; ((index<=b) && (!File_error)); index++,x_pos++) for (index=1; ((index<=b) && (!File_error)); index++,x_pos++)
{ {
if (index&1) if (index&1)
@ -3190,7 +3190,7 @@ static void Load_BMP_Pixels(T_IO_Context * context, FILE * file, unsigned int co
Set_pixel(context, x_pos,y_pos,c&0xF); Set_pixel(context, x_pos,y_pos,c&0xF);
} }
// On lit l'octet rendant le nombre d'octets pair, si // On lit l'octet rendant le nombre d'octets pair, si
// nécessaire. Encore un truc de crétin "made in MS". // nécessaire. Encore un truc de crétin "made in MS".
if ( ((b&3)==1) || ((b&3)==2) ) if ( ((b&3)==1) || ((b&3)==2) )
{ {
byte dummy; byte dummy;
@ -3421,11 +3421,11 @@ void Save_BMP(T_IO_Context * context)
&& Write_dword_le(file,header.Clr_Imprt)) && Write_dword_le(file,header.Clr_Imprt))
{ {
// Chez Bill, ils ont dit: "On va mettre les couleur dans l'ordre // Chez Bill, ils ont dit: "On va mettre les couleur dans l'ordre
// inverse, et pour faire chier, on va les mettre sur une échelle de // inverse, et pour faire chier, on va les mettre sur une échelle de
// 0 à 255 parce que le standard VGA c'est de 0 à 63 (logique!). Et // 0 à 255 parce que le standard VGA c'est de 0 à 63 (logique!). Et
// puis comme c'est pas assez débile, on va aussi y rajouter un octet // puis comme c'est pas assez débile, on va aussi y rajouter un octet
// toujours à 0 pour forcer les gens à s'acheter des gros disques // toujours à 0 pour forcer les gens à s'acheter des gros disques
// durs... Comme ça, ça fera passer la pillule lorsqu'on sortira // durs... Comme ça, ça fera passer la pillule lorsqu'on sortira
// Windows 95." ... // Windows 95." ...
for (index=0; index<256; index++) for (index=0; index<256; index++)
{ {
@ -3438,7 +3438,7 @@ void Save_BMP(T_IO_Context * context)
if (Write_bytes(file,local_palette,1024)) if (Write_bytes(file,local_palette,1024))
{ {
// ... Et Bill, il a dit: "OK les gars! Mais seulement si vous rangez // ... Et Bill, il a dit: "OK les gars! Mais seulement si vous rangez
// les pixels dans l'ordre inverse, mais que sur les Y quand-même // les pixels dans l'ordre inverse, mais que sur les Y quand-même
// parce que faut pas pousser." // parce que faut pas pousser."
for (y_pos=context->Height-1; ((y_pos>=0) && (!File_error)); y_pos--) for (y_pos=context->Height-1; ((y_pos>=0) && (!File_error)); y_pos--)
for (x_pos=0; x_pos<line_size; x_pos++) for (x_pos=0; x_pos<line_size; x_pos++)
@ -3882,20 +3882,20 @@ void Test_GIF(T_IO_Context * context, FILE * file)
// -- Lire un fichier au format GIF ----------------------------------------- // -- Lire un fichier au format GIF -----------------------------------------
// Définition de quelques variables globales au chargement du GIF87a // Définition de quelques variables globales au chargement du GIF87a
word GIF_nb_bits; // Nb de bits composants un code complet word GIF_nb_bits; // Nb de bits composants un code complet
word GIF_remainder_bits; // Nb de bits encore dispos dans GIF_last_byte word GIF_remainder_bits; // Nb de bits encore dispos dans GIF_last_byte
byte GIF_remainder_byte; // Nb d'octets avant le prochain bloc de Raster Data byte GIF_remainder_byte; // Nb d'octets avant le prochain bloc de Raster Data
word GIF_current_code; // Code traité (qui vient d'être lu en général) word GIF_current_code; // Code traité (qui vient d'être lu en général)
byte GIF_last_byte; // Octet de lecture des bits byte GIF_last_byte; // Octet de lecture des bits
word GIF_pos_X; // Coordonnées d'affichage de l'image word GIF_pos_X; // Coordonnées d'affichage de l'image
word GIF_pos_Y; word GIF_pos_Y;
word GIF_interlaced; // L'image est entrelacée word GIF_interlaced; // L'image est entrelacée
word GIF_finished_interlaced_image; // L'image entrelacée est finie de charger word GIF_finished_interlaced_image; // L'image entrelacée est finie de charger
word GIF_pass; // index de passe de l'image entrelacée word GIF_pass; // index de passe de l'image entrelacée
FILE *GIF_file; // L'handle du fichier FILE *GIF_file; // L'handle du fichier
// -- Lit le code à GIF_nb_bits suivant -- // -- Lit le code à GIF_nb_bits suivant --
word GIF_get_next_code(void) word GIF_get_next_code(void)
{ {
@ -3985,12 +3985,12 @@ void Load_GIF(T_IO_Context * context)
{ {
char signature[6]; char signature[6];
word * alphabet_stack; // Pile de décodage d'une chaîne word * alphabet_stack; // Pile de décodage d'une chaîne
word * alphabet_prefix; // Table des préfixes des codes word * alphabet_prefix; // Table des préfixes des codes
word * alphabet_suffix; // Table des suffixes des codes word * alphabet_suffix; // Table des suffixes des codes
word alphabet_free; // Position libre dans l'alphabet word alphabet_free; // Position libre dans l'alphabet
word alphabet_max; // Nombre d'entrées possibles dans l'alphabet word alphabet_max; // Nombre d'entrées possibles dans l'alphabet
word alphabet_stack_pos; // Position dans la pile de décodage d'un chaîne word alphabet_stack_pos; // Position dans la pile de décodage d'un chaîne
T_GIF_LSDB LSDB; T_GIF_LSDB LSDB;
T_GIF_IDB IDB; T_GIF_IDB IDB;
@ -3998,16 +3998,16 @@ void Load_GIF(T_IO_Context * context)
word nb_colors; // Nombre de couleurs dans l'image word nb_colors; // Nombre de couleurs dans l'image
word color_index; // index de traitement d'une couleur word color_index; // index de traitement d'une couleur
byte size_to_read; // Nombre de données à lire (divers) byte size_to_read; // Nombre de données à lire (divers)
byte block_identifier; // Code indicateur du type de bloc en cours byte block_identifier; // Code indicateur du type de bloc en cours
byte initial_nb_bits; // Nb de bits au début du traitement LZW byte initial_nb_bits; // Nb de bits au début du traitement LZW
word special_case=0; // Mémoire pour le cas spécial word special_case=0; // Mémoire pour le cas spécial
word old_code=0; // Code précédent word old_code=0; // Code précédent
word byte_read; // Sauvegarde du code en cours de lecture word byte_read; // Sauvegarde du code en cours de lecture
word value_clr; // Valeur <=> Clear tables word value_clr; // Valeur <=> Clear tables
word value_eof; // Valeur <=> End d'image word value_eof; // Valeur <=> End d'image
long file_size; long file_size;
int number_LID; // Nombre d'images trouvées dans le fichier int number_LID; // Nombre d'images trouvées dans le fichier
int current_layer = 0; int current_layer = 0;
int last_delay = 0; int last_delay = 0;
byte is_transparent = 0; byte is_transparent = 0;
@ -4034,7 +4034,7 @@ void Load_GIF(T_IO_Context * context)
(memcmp(signature,"GIF89a",6)==0) ) ) (memcmp(signature,"GIF89a",6)==0) ) )
{ {
// Allocation de mémoire pour les tables & piles de traitement: // Allocation de mémoire pour les tables & piles de traitement:
alphabet_stack =(word *)malloc(4096*sizeof(word)); alphabet_stack =(word *)malloc(4096*sizeof(word));
alphabet_prefix=(word *)malloc(4096*sizeof(word)); alphabet_prefix=(word *)malloc(4096*sizeof(word));
alphabet_suffix=(word *)malloc(4096*sizeof(word)); alphabet_suffix=(word *)malloc(4096*sizeof(word));
@ -4046,7 +4046,7 @@ void Load_GIF(T_IO_Context * context)
&& Read_byte(GIF_file,&(LSDB.Aspect)) && Read_byte(GIF_file,&(LSDB.Aspect))
) )
{ {
// Lecture du Logical Screen Descriptor Block réussie: // Lecture du Logical Screen Descriptor Block réussie:
Original_screen_X=LSDB.Width; Original_screen_X=LSDB.Width;
Original_screen_Y=LSDB.Height; Original_screen_Y=LSDB.Height;
@ -4102,7 +4102,7 @@ void Load_GIF(T_IO_Context * context)
switch(function_code) switch(function_code)
{ {
case 0xFE: // Comment Block Extension case 0xFE: // Comment Block Extension
// On récupère le premier commentaire non-vide, // On récupère le premier commentaire non-vide,
// on jette les autres. // on jette les autres.
if (context->Comment[0]=='\0') if (context->Comment[0]=='\0')
{ {
@ -4119,7 +4119,7 @@ void Load_GIF(T_IO_Context * context)
Read_byte(GIF_file,&size_to_read); Read_byte(GIF_file,&size_to_read);
break; break;
case 0xF9: // Graphics Control Extension case 0xF9: // Graphics Control Extension
// Prévu pour la transparence // Prévu pour la transparence
if ( Read_byte(GIF_file,&(GCE.Packed_fields)) if ( Read_byte(GIF_file,&(GCE.Packed_fields))
&& Read_word_le(GIF_file,&(GCE.Delay_time)) && Read_word_le(GIF_file,&(GCE.Delay_time))
&& Read_byte(GIF_file,&(GCE.Transparent_color))) && Read_byte(GIF_file,&(GCE.Transparent_color)))
@ -4303,7 +4303,7 @@ void Load_GIF(T_IO_Context * context)
{ {
// Palette locale dispo = (IDB.Indicator and $80) // Palette locale dispo = (IDB.Indicator and $80)
// Image entrelacée = (IDB.Indicator and $40) // Image entrelacée = (IDB.Indicator and $40)
// Ordre de classement = (IDB.Indicator and $20) // Ordre de classement = (IDB.Indicator and $20)
// Nombre de bits/pixel = (IDB.Indicator and $07)+1 (si palette locale dispo) // Nombre de bits/pixel = (IDB.Indicator and $07)+1 (si palette locale dispo)
@ -4408,7 +4408,7 @@ void Load_GIF(T_IO_Context * context)
alphabet_max =((1 << (++GIF_nb_bits))-1); alphabet_max =((1 << (++GIF_nb_bits))-1);
} }
} }
else // Code Clear rencontré else // Code Clear rencontré
{ {
GIF_nb_bits =initial_nb_bits + 1; GIF_nb_bits =initial_nb_bits + 1;
alphabet_max =((1 << GIF_nb_bits)-1); alphabet_max =((1 << GIF_nb_bits)-1);
@ -4423,7 +4423,7 @@ void Load_GIF(T_IO_Context * context)
File_error=2; File_error=2;
break; break;
} }
} // Code End-Of-Information ou erreur de fichier rencontré } // Code End-Of-Information ou erreur de fichier rencontré
if (File_error==2 && GIF_pos_X==0 && GIF_pos_Y==IDB.Image_height) if (File_error==2 && GIF_pos_X==0 && GIF_pos_Y==IDB.Image_height)
File_error=0; File_error=0;
/*Close_lecture();*/ /*Close_lecture();*/
@ -4463,7 +4463,7 @@ void Load_GIF(T_IO_Context * context)
early_exit: early_exit:
// Libération de la mémoire utilisée par les tables & piles de traitement: // Libération de la mémoire utilisée par les tables & piles de traitement:
free(alphabet_suffix); free(alphabet_suffix);
free(alphabet_prefix); free(alphabet_prefix);
free(alphabet_stack); free(alphabet_stack);
@ -4474,7 +4474,7 @@ void Load_GIF(T_IO_Context * context)
fclose(GIF_file); fclose(GIF_file);
} // Le fichier était ouvrable } // Le fichier était ouvrable
else else
File_error=1; File_error=1;
} }
@ -4482,8 +4482,8 @@ void Load_GIF(T_IO_Context * context)
// -- Sauver un fichier au format GIF --------------------------------------- // -- Sauver un fichier au format GIF ---------------------------------------
int GIF_stop; // "On peut arrêter la sauvegarde du fichier" int GIF_stop; // "On peut arrêter la sauvegarde du fichier"
byte GIF_buffer[256]; // buffer d'écriture de bloc de données compilées byte GIF_buffer[256]; // buffer d'écriture de bloc de données compilées
// -- Vider le buffer GIF dans le buffer KM -- // -- Vider le buffer GIF dans le buffer KM --
@ -4502,7 +4502,7 @@ void Load_GIF(T_IO_Context * context)
} }
} }
// -- Ecrit un code à GIF_nb_bits -- // -- Ecrit un code à GIF_nb_bits --
void GIF_set_code(word Code) void GIF_set_code(word Code)
{ {
@ -4520,9 +4520,9 @@ void Load_GIF(T_IO_Context * context)
nb_bits_processed +=current_nb_bits; nb_bits_processed +=current_nb_bits;
nb_bits_to_process-=current_nb_bits; nb_bits_to_process-=current_nb_bits;
if (GIF_remainder_bits==8) // Il ne reste plus de bits à coder sur l'octet courant if (GIF_remainder_bits==8) // Il ne reste plus de bits à coder sur l'octet courant
{ {
// Ecrire l'octet à balancer: // Ecrire l'octet à balancer:
GIF_buffer[++GIF_remainder_byte]=GIF_last_byte; GIF_buffer[++GIF_remainder_byte]=GIF_last_byte;
// Si on a atteint la fin du bloc de Raster Data // Si on a atteint la fin du bloc de Raster Data
@ -4559,23 +4559,23 @@ void Load_GIF(T_IO_Context * context)
void Save_GIF(T_IO_Context * context) void Save_GIF(T_IO_Context * context)
{ {
word * alphabet_prefix; // Table des préfixes des codes word * alphabet_prefix; // Table des préfixes des codes
word * alphabet_suffix; // Table des suffixes des codes word * alphabet_suffix; // Table des suffixes des codes
word * alphabet_daughter; // Table des chaînes filles (plus longues) word * alphabet_daughter; // Table des chaînes filles (plus longues)
word * alphabet_sister; // Table des chaînes soeurs (même longueur) word * alphabet_sister; // Table des chaînes soeurs (même longueur)
word alphabet_free; // Position libre dans l'alphabet word alphabet_free; // Position libre dans l'alphabet
word alphabet_max; // Nombre d'entrées possibles dans l'alphabet word alphabet_max; // Nombre d'entrées possibles dans l'alphabet
word start; // Code précédent (sert au linkage des chaînes) word start; // Code précédent (sert au linkage des chaînes)
int descend; // Booléen "On vient de descendre" int descend; // Booléen "On vient de descendre"
T_GIF_LSDB LSDB; T_GIF_LSDB LSDB;
T_GIF_IDB IDB; T_GIF_IDB IDB;
byte block_identifier; // Code indicateur du type de bloc en cours byte block_identifier; // Code indicateur du type de bloc en cours
word current_string; // Code de la chaîne en cours de traitement word current_string; // Code de la chaîne en cours de traitement
byte current_char; // Caractère à coder byte current_char; // Caractère à coder
word index; // index de recherche de chaîne word index; // index de recherche de chaîne
int current_layer; int current_layer;
word clear; // LZW clear code word clear; // LZW clear code
@ -4589,12 +4589,12 @@ void Save_GIF(T_IO_Context * context)
{ {
setvbuf(GIF_file, NULL, _IOFBF, 64*1024); setvbuf(GIF_file, NULL, _IOFBF, 64*1024);
// On écrit la signature du fichier // On écrit la signature du fichier
if (Write_bytes(GIF_file,"GIF89a",6)) if (Write_bytes(GIF_file,"GIF89a",6))
{ {
// La signature du fichier a été correctement écrite. // La signature du fichier a été correctement écrite.
// Allocation de mémoire pour les tables // Allocation de mémoire pour les tables
alphabet_prefix=(word *)malloc(4096*sizeof(word)); alphabet_prefix=(word *)malloc(4096*sizeof(word));
alphabet_suffix=(word *)malloc(4096*sizeof(word)); alphabet_suffix=(word *)malloc(4096*sizeof(word));
alphabet_daughter =(word *)malloc(4096*sizeof(word)); alphabet_daughter =(word *)malloc(4096*sizeof(word));
@ -4639,7 +4639,7 @@ void Save_GIF(T_IO_Context * context)
Write_byte(GIF_file,LSDB.Backcol) && Write_byte(GIF_file,LSDB.Backcol) &&
Write_byte(GIF_file,LSDB.Aspect) ) Write_byte(GIF_file,LSDB.Aspect) )
{ {
// Le LSDB a été correctement écrit. // Le LSDB a été correctement écrit.
int i; int i;
// On sauve la palette // On sauve la palette
for(i=0;i<256 && !File_error;i++) for(i=0;i<256 && !File_error;i++)
@ -4651,7 +4651,7 @@ void Save_GIF(T_IO_Context * context)
} }
if (!File_error) if (!File_error)
{ {
// La palette a été correctement écrite. // La palette a été correctement écrite.
// Ecriture de la transparence // Ecriture de la transparence
//Write_bytes(GIF_file,"\x21\xF9\x04\x01\x00\x00\xNN\x00",8); //Write_bytes(GIF_file,"\x21\xF9\x04\x01\x00\x00\xNN\x00",8);
@ -4797,9 +4797,9 @@ void Save_GIF(T_IO_Context * context)
IDB.Nb_bits_pixel++; IDB.Nb_bits_pixel++;
} }
// On va écrire un block indicateur d'IDB et l'IDB du fichier // On va écrire un block indicateur d'IDB et l'IDB du fichier
block_identifier=0x2C; block_identifier=0x2C;
IDB.Indicator=0x07; // Image non entrelacée, pas de palette locale. IDB.Indicator=0x07; // Image non entrelacée, pas de palette locale.
clear = 1 << IDB.Nb_bits_pixel; // Clear Code clear = 1 << IDB.Nb_bits_pixel; // Clear Code
eof = clear + 1; // End of Picture Code eof = clear + 1; // End of Picture Code
@ -4811,8 +4811,8 @@ void Save_GIF(T_IO_Context * context)
Write_byte(GIF_file,IDB.Indicator) && Write_byte(GIF_file,IDB.Indicator) &&
Write_byte(GIF_file,IDB.Nb_bits_pixel)) Write_byte(GIF_file,IDB.Nb_bits_pixel))
{ {
// Le block indicateur d'IDB et l'IDB ont étés correctements // Le block indicateur d'IDB et l'IDB ont étés correctements
// écrits. // écrits.
GIF_pos_X=IDB.Pos_X; GIF_pos_X=IDB.Pos_X;
GIF_pos_Y=IDB.Pos_Y; GIF_pos_Y=IDB.Pos_Y;
@ -4825,7 +4825,7 @@ void Save_GIF(T_IO_Context * context)
File_error=0; File_error=0;
GIF_stop=0; GIF_stop=0;
// Réintialisation de la table: // Réintialisation de la table:
alphabet_free=clear + 2; // 258 for 8bpp alphabet_free=clear + 2; // 258 for 8bpp
GIF_nb_bits =IDB.Nb_bits_pixel + 1; // 9 for 8 bpp GIF_nb_bits =IDB.Nb_bits_pixel + 1; // 9 for 8 bpp
alphabet_max =clear+clear-1; // 511 for 8bpp alphabet_max =clear+clear-1; // 511 for 8bpp
@ -4914,21 +4914,21 @@ void Save_GIF(T_IO_Context * context)
if (!File_error) if (!File_error)
{ {
// On écrit le code dans le fichier // On écrit le code dans le fichier
GIF_set_code(current_string); // Dernière portion d'image GIF_set_code(current_string); // Dernière portion d'image
// Cette dernière portion ne devrait pas poser de problèmes // Cette dernière portion ne devrait pas poser de problèmes
// du côté GIF_nb_bits puisque pour que GIF_nb_bits change de // du côté GIF_nb_bits puisque pour que GIF_nb_bits change de
// valeur, il faudrait que la table de chaîne soit remplie or // valeur, il faudrait que la table de chaîne soit remplie or
// c'est impossible puisqu'on traite une chaîne qui se trouve // c'est impossible puisqu'on traite une chaîne qui se trouve
// déjà dans la table, et qu'elle n'a rien d'inédit. Donc on // déjà dans la table, et qu'elle n'a rien d'inédit. Donc on
// ne devrait pas avoir à changer de taille, mais je laisse // ne devrait pas avoir à changer de taille, mais je laisse
// quand même en remarque tout ça, au cas où il subsisterait // quand même en remarque tout ça, au cas où il subsisterait
// des problèmes dans certains cas exceptionnels. // des problèmes dans certains cas exceptionnels.
// //
// Note: de toutes façons, ces lignes en commentaires ont étés // Note: de toutes façons, ces lignes en commentaires ont étés
// écrites par copier/coller du temps où la sauvegarde du // écrites par copier/coller du temps où la sauvegarde du
// GIF déconnait. Il y a donc fort à parier qu'elles ne // GIF déconnait. Il y a donc fort à parier qu'elles ne
// sont pas correctes. // sont pas correctes.
/* /*
@ -4939,7 +4939,7 @@ void Save_GIF(T_IO_Context * context)
// On balargue un Clear Code // On balargue un Clear Code
GIF_set_code(256); GIF_set_code(256);
// On réinitialise les données LZW // On réinitialise les données LZW
alphabet_free=258; alphabet_free=258;
GIF_nb_bits =9; GIF_nb_bits =9;
alphabet_max =511; alphabet_max =511;
@ -4960,15 +4960,15 @@ void Save_GIF(T_IO_Context * context)
GIF_last_byte=0; GIF_last_byte=0;
GIF_remainder_bits=0; GIF_remainder_bits=0;
} }
GIF_empty_buffer(); // On envoie les dernières données du buffer GIF dans le buffer KM GIF_empty_buffer(); // On envoie les dernières données du buffer GIF dans le buffer KM
// On écrit un \0 // On écrit un \0
if (! Write_byte(GIF_file,'\x00')) if (! Write_byte(GIF_file,'\x00'))
File_error=1; File_error=1;
} }
} // On a pu écrire l'IDB } // On a pu écrire l'IDB
else else
File_error=1; File_error=1;
} }
@ -5004,26 +5004,26 @@ void Save_GIF(T_IO_Context * context)
} }
} }
// On écrit un GIF TERMINATOR, exigé par SVGA et SEA. // On écrit un GIF TERMINATOR, exigé par SVGA et SEA.
if (! Write_byte(GIF_file,'\x3B')) if (! Write_byte(GIF_file,'\x3B'))
File_error=1; File_error=1;
} }
} // On a pu écrire la palette } // On a pu écrire la palette
else else
File_error=1; File_error=1;
} // On a pu écrire le LSDB } // On a pu écrire le LSDB
else else
File_error=1; File_error=1;
// Libération de la mémoire utilisée par les tables // Libération de la mémoire utilisée par les tables
free(alphabet_sister); free(alphabet_sister);
free(alphabet_daughter); free(alphabet_daughter);
free(alphabet_suffix); free(alphabet_suffix);
free(alphabet_prefix); free(alphabet_prefix);
} // On a pu écrire la signature du fichier } // On a pu écrire la signature du fichier
else else
File_error=1; File_error=1;
@ -5031,7 +5031,7 @@ void Save_GIF(T_IO_Context * context)
if (File_error) if (File_error)
Remove_file(context); Remove_file(context);
} // On a pu ouvrir le fichier en écriture } // On a pu ouvrir le fichier en écriture
else else
File_error=1; File_error=1;
@ -5044,21 +5044,21 @@ typedef struct
{ {
byte Manufacturer; // |_ Il font chier ces cons! Ils auraient pu byte Manufacturer; // |_ Il font chier ces cons! Ils auraient pu
byte Version; // | mettre une vraie signature! byte Version; // | mettre une vraie signature!
byte Compression; // L'image est-elle compressée? byte Compression; // L'image est-elle compressée?
byte Depth; // Nombre de bits pour coder un pixel (inutile puisqu'on se sert de Plane) byte Depth; // Nombre de bits pour coder un pixel (inutile puisqu'on se sert de Plane)
word X_min; // |_ Coin haut-gauche | word X_min; // |_ Coin haut-gauche |
word Y_min; // | de l'image |_ (Crétin!) word Y_min; // | de l'image |_ (Crétin!)
word X_max; // |_ Coin bas-droit | word X_max; // |_ Coin bas-droit |
word Y_max; // | de l'image | word Y_max; // | de l'image |
word X_dpi; // |_ Densité de |_ (Presque inutile parce que word X_dpi; // |_ Densité de |_ (Presque inutile parce que
word Y_dpi; // | l'image | aucun moniteur n'est pareil!) word Y_dpi; // | l'image | aucun moniteur n'est pareil!)
byte Palette_16c[48]; // Palette 16 coul (inutile pour 256c) (débile!) byte Palette_16c[48]; // Palette 16 coul (inutile pour 256c) (débile!)
byte Reserved; // Ca me plait ça aussi! byte Reserved; // Ca me plait ça aussi!
byte Plane; // 4 => 16c , 1 => 256c , ... byte Plane; // 4 => 16c , 1 => 256c , ...
word Bytes_per_plane_line;// Doit toujours être pair word Bytes_per_plane_line;// Doit toujours être pair
word Palette_info; // 1 => color , 2 => Gris (ignoré à partir de la version 4) word Palette_info; // 1 => color , 2 => Gris (ignoré à partir de la version 4)
word Screen_X; // |_ Dimensions de word Screen_X; // |_ Dimensions de
word Screen_Y; // | l'écran d'origine word Screen_Y; // | l'écran d'origine
byte Filler[54]; // Ca... J'adore! byte Filler[54]; // Ca... J'adore!
} T_PCX_Header; } T_PCX_Header;
@ -5091,7 +5091,7 @@ void Test_PCX(T_IO_Context * context, FILE * file)
Read_bytes(file,&(PCX_header.Filler),54) ) Read_bytes(file,&(PCX_header.Filler),54) )
{ {
// Vu que ce header a une signature de merde et peu significative, il // Vu que ce header a une signature de merde et peu significative, il
// va falloir que je teste différentes petites valeurs dont je connais // va falloir que je teste différentes petites valeurs dont je connais
// l'intervalle. Grrr! // l'intervalle. Grrr!
if ( (PCX_header.Manufacturer!=10) if ( (PCX_header.Manufacturer!=10)
|| (PCX_header.Compression>1) || (PCX_header.Compression>1)
@ -5110,7 +5110,7 @@ void Test_PCX(T_IO_Context * context, FILE * file)
// -- Lire un fichier au format PCX ----------------------------------------- // -- Lire un fichier au format PCX -----------------------------------------
// -- Afficher une ligne PCX codée sur 1 seul plan avec moins de 256 c. -- // -- Afficher une ligne PCX codée sur 1 seul plan avec moins de 256 c. --
static void Draw_PCX_line(T_IO_Context *context, const byte * buffer, short y_pos, byte depth) static void Draw_PCX_line(T_IO_Context *context, const byte * buffer, short y_pos, byte depth)
{ {
short x_pos; short x_pos;
@ -5143,7 +5143,7 @@ void Load_PCX(T_IO_Context * context)
FILE *file; FILE *file;
short line_size; short line_size;
short real_line_size; // width de l'image corrigée short real_line_size; // width de l'image corrigée
short width_read; short width_read;
short x_pos; short x_pos;
short y_pos; short y_pos;
@ -5194,7 +5194,7 @@ void Load_PCX(T_IO_Context * context)
{ {
if (File_error==0) if (File_error==0)
{ {
// On prépare la palette à accueillir les valeurs du fichier PCX // On prépare la palette à accueillir les valeurs du fichier PCX
if (Config.Clear_palette) if (Config.Clear_palette)
memset(context->Palette,0,sizeof(T_Palette)); memset(context->Palette,0,sizeof(T_Palette));
nb_colors=(dword)(1<<PCX_header.Plane)<<(PCX_header.Depth-1); nb_colors=(dword)(1<<PCX_header.Plane)<<(PCX_header.Depth-1);
@ -5258,17 +5258,17 @@ void Load_PCX(T_IO_Context * context)
} }
} }
// On se positionne à la fin du fichier - 769 octets pour voir s'il y // On se positionne à la fin du fichier - 769 octets pour voir s'il y
// a une palette. // a une palette.
if ( (PCX_header.Depth==8) && (PCX_header.Version>=5) && (file_size>(256*3+128)) ) if ( (PCX_header.Depth==8) && (PCX_header.Version>=5) && (file_size>(256*3+128)) )
{ {
fseek(file,file_size-((256*3)+1),SEEK_SET); fseek(file,file_size-((256*3)+1),SEEK_SET);
// On regarde s'il y a une palette après les données de l'image // On regarde s'il y a une palette après les données de l'image
if (Read_byte(file,&byte1)) if (Read_byte(file,&byte1))
if (byte1==12) // Lire la palette si c'est une image en 256 couleurs if (byte1==12) // Lire la palette si c'est une image en 256 couleurs
{ {
int index; int index;
// On lit la palette 256c que ces crétins ont foutue à la fin du fichier // On lit la palette 256c que ces crétins ont foutue à la fin du fichier
for(index=0;index<256;index++) for(index=0;index<256;index++)
if ( ! Read_byte(file,&(context->Palette[index].R)) if ( ! Read_byte(file,&(context->Palette[index].R))
|| ! Read_byte(file,&(context->Palette[index].G)) || ! Read_byte(file,&(context->Palette[index].G))
@ -5281,19 +5281,19 @@ void Load_PCX(T_IO_Context * context)
} }
} }
// Maintenant qu'on a lu la palette que ces crétins sont allés foutre // Maintenant qu'on a lu la palette que ces crétins sont allés foutre
// à la fin, on retourne juste après le header pour lire l'image. // à la fin, on retourne juste après le header pour lire l'image.
fseek(file,128,SEEK_SET); fseek(file,128,SEEK_SET);
if (!File_error) if (!File_error)
{ {
line_size=PCX_header.Bytes_per_plane_line*PCX_header.Plane; line_size=PCX_header.Bytes_per_plane_line*PCX_header.Plane;
real_line_size=(short)PCX_header.Bytes_per_plane_line<<3; real_line_size=(short)PCX_header.Bytes_per_plane_line<<3;
// On se sert de données ILBM car le dessin de ligne en moins de 256 // On se sert de données ILBM car le dessin de ligne en moins de 256
// couleurs se fait comme avec la structure ILBM. // couleurs se fait comme avec la structure ILBM.
buffer=(byte *)malloc(line_size); buffer=(byte *)malloc(line_size);
// Chargement de l'image // Chargement de l'image
if (PCX_header.Compression) // Image compressée if (PCX_header.Compression) // Image compressée
{ {
/*Init_lecture();*/ /*Init_lecture();*/
@ -5303,14 +5303,14 @@ void Load_PCX(T_IO_Context * context)
{ {
for (position=0; ((position<image_size) && (!File_error));) for (position=0; ((position<image_size) && (!File_error));)
{ {
// Lecture et décompression de la ligne // Lecture et décompression de la ligne
if(Read_byte(file,&byte1) !=1) File_error=2; if(Read_byte(file,&byte1) !=1) File_error=2;
if (!File_error) if (!File_error)
{ {
if ((byte1&0xC0)==0xC0) if ((byte1&0xC0)==0xC0)
{ {
byte1-=0xC0; // facteur de répétition byte1-=0xC0; // facteur de répétition
if(Read_byte(file,&byte2)!=1) File_error = 2; // octet à répéter if(Read_byte(file,&byte2)!=1) File_error = 2; // octet à répéter
if (!File_error) if (!File_error)
{ {
for (index=0; index<byte1; index++,position++) for (index=0; index<byte1; index++,position++)
@ -5332,7 +5332,7 @@ void Load_PCX(T_IO_Context * context)
} }
} }
} }
else // couleurs rangées par plans else // couleurs rangées par plans
{ {
for (y_pos=0; ((y_pos<context->Height) && (!File_error)); y_pos++) for (y_pos=0; ((y_pos<context->Height) && (!File_error)); y_pos++)
{ {
@ -5343,8 +5343,8 @@ void Load_PCX(T_IO_Context * context)
{ {
if ((byte1&0xC0)==0xC0) if ((byte1&0xC0)==0xC0)
{ {
byte1-=0xC0; // facteur de répétition byte1-=0xC0; // facteur de répétition
if(Read_byte(file,&byte2)!=1) File_error=2; // octet à répéter if(Read_byte(file,&byte2)!=1) File_error=2; // octet à répéter
if (!File_error) if (!File_error)
{ {
for (index=0; index<byte1; index++) for (index=0; index<byte1; index++)
@ -5370,7 +5370,7 @@ void Load_PCX(T_IO_Context * context)
/*Close_lecture();*/ /*Close_lecture();*/
} }
else // Image non compressée else // Image non compressée
{ {
for (y_pos=0;(y_pos<context->Height) && (!File_error);y_pos++) for (y_pos=0;(y_pos<context->Height) && (!File_error);y_pos++)
{ {
@ -5423,14 +5423,14 @@ void Load_PCX(T_IO_Context * context)
for (y_pos=0,position=0;(y_pos<context->Height) && (!File_error);) for (y_pos=0,position=0;(y_pos<context->Height) && (!File_error);)
{ {
// Lecture et décompression de la ligne // Lecture et décompression de la ligne
if(Read_byte(file,&byte1)!=1) File_error=2; if(Read_byte(file,&byte1)!=1) File_error=2;
if (!File_error) if (!File_error)
{ {
if ((byte1 & 0xC0)==0xC0) if ((byte1 & 0xC0)==0xC0)
{ {
byte1-=0xC0; // facteur de répétition byte1-=0xC0; // facteur de répétition
if(Read_byte(file,&byte2)!=1) File_error=2; // octet à répéter if(Read_byte(file,&byte2)!=1) File_error=2; // octet à répéter
if (!File_error) if (!File_error)
{ {
for (index=0; (index<byte1) && (!File_error); index++) for (index=0; (index<byte1) && (!File_error); index++)
@ -5546,7 +5546,7 @@ void Save_PCX(T_IO_Context * context)
{ {
pixel_read=Get_pixel(context, 0,y_pos); pixel_read=Get_pixel(context, 0,y_pos);
// Compression et écriture de la ligne // Compression et écriture de la ligne
for (x_pos=0; ((x_pos<line_size) && (!File_error)); ) for (x_pos=0; ((x_pos<line_size) && (!File_error)); )
{ {
x_pos++; x_pos++;
@ -5612,7 +5612,7 @@ void Test_SCx(T_IO_Context * context, FILE * file)
File_error=1; File_error=1;
// Ouverture du fichier // Ouverture du fichier
// Lecture et vérification de la signature // Lecture et vérification de la signature
if (Read_bytes(file,SCx_header.Filler1,4) if (Read_bytes(file,SCx_header.Filler1,4)
&& Read_word_le(file, &(SCx_header.Width)) && Read_word_le(file, &(SCx_header.Width))
&& Read_word_le(file, &(SCx_header.Height)) && Read_word_le(file, &(SCx_header.Height))
@ -5778,7 +5778,7 @@ void Save_SCx(T_IO_Context * context)
if (File_error) if (File_error)
Remove_file(context); Remove_file(context);
} }
else // Error d'écriture (disque plein ou protégé) else // Error d'écriture (disque plein ou protégé)
{ {
fclose(file); fclose(file);
Remove_file(context); Remove_file(context);
@ -6482,7 +6482,7 @@ void Save_PNG(T_IO_Context * context)
fclose(file); fclose(file);
} }
// S'il y a eu une erreur de sauvegarde, on ne va tout de même pas laisser // S'il y a eu une erreur de sauvegarde, on ne va tout de même pas laisser
// ce fichier pourri trainait... Ca fait pas propre. // ce fichier pourri trainait... Ca fait pas propre.
if (File_error) if (File_error)
Remove_file(context); Remove_file(context);

View File

@ -4,7 +4,7 @@
Copyright 2018 Thomas Bernard Copyright 2018 Thomas Bernard
Copyright 2014 Sergii Pylypenko Copyright 2014 Sergii Pylypenko
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2009 Franck Charlet Copyright 2009 Franck Charlet
Copyright 2008 Peter Gordon Copyright 2008 Peter Gordon
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
@ -72,17 +72,17 @@
#include "filesel.h" #include "filesel.h"
#define NORMAL_FILE_COLOR MC_Light // color du texte pour une ligne de #define NORMAL_FILE_COLOR MC_Light // color du texte pour une ligne de
// fichier non sélectionné // fichier non sélectionné
#define NORMAL_DIRECTORY_COLOR MC_Dark // color du texte pour une ligne de #define NORMAL_DIRECTORY_COLOR MC_Dark // color du texte pour une ligne de
// répertoire non sélectionné // répertoire non sélectionné
#define NORMAL_BACKGROUND_COLOR MC_Black // color du fond pour une ligne #define NORMAL_BACKGROUND_COLOR MC_Black // color du fond pour une ligne
// non sélectionnée // non sélectionnée
#define SELECTED_FILE_COLOR MC_White // color du texte pour une ligne de #define SELECTED_FILE_COLOR MC_White // color du texte pour une ligne de
// fichier sélectionnée // fichier sélectionnée
#define SELECTED_DIRECTORY_COLOR MC_Light // color du texte pour une ligne de #define SELECTED_DIRECTORY_COLOR MC_Light // color du texte pour une ligne de
// repértoire sélectionnée // repértoire sélectionnée
#define SELECTED_BACKGROUND_COLOR MC_Dark // color du fond pour une ligne #define SELECTED_BACKGROUND_COLOR MC_Dark // color du fond pour une ligne
// sélectionnée // sélectionnée
// -- Native fileselector for WIN32 // -- Native fileselector for WIN32
@ -158,8 +158,8 @@ static word Selector_filename_unicode[256];
// Conventions: // Conventions:
// //
// * Le fileselect modifie le répertoire courant. Ceci permet de n'avoir // * Le fileselect modifie le répertoire courant. Ceci permet de n'avoir
// qu'un findfirst dans le répertoire courant à faire: // qu'un findfirst dans le répertoire courant à faire:
void Recount_files(T_Fileselector *list) void Recount_files(T_Fileselector *list)
{ {
@ -202,9 +202,9 @@ void Recount_files(T_Fileselector *list)
} }
} }
// -- Destruction de la liste chaînée --------------------------------------- // -- Destruction de la liste chaînée ---------------------------------------
void Free_fileselector_list(T_Fileselector *list) void Free_fileselector_list(T_Fileselector *list)
// Cette procédure détruit la chaine des fichiers. Elle doit être appelée // Cette procédure détruit la chaine des fichiers. Elle doit être appelée
// avant de rappeler la fonction Read_list_of_files, ainsi qu'en fin de // avant de rappeler la fonction Read_list_of_files, ainsi qu'en fin de
// programme. // programme.
{ {
@ -213,11 +213,11 @@ void Free_fileselector_list(T_Fileselector *list)
while (list->First!=NULL) while (list->First!=NULL)
{ {
// On mémorise l'adresse du premier élément de la liste // On mémorise l'adresse du premier élément de la liste
temp_item =list->First; temp_item =list->First;
// On fait avancer la tête de la liste // On fait avancer la tête de la liste
list->First=list->First->Next; list->First=list->First->Next;
// Et on efface l'ancien premier élément de la liste // Et on efface l'ancien premier élément de la liste
free(temp_item->Unicode_full_name); free(temp_item->Unicode_full_name);
free(temp_item->Unicode_short_name); free(temp_item->Unicode_short_name);
free(temp_item); free(temp_item);
@ -282,7 +282,7 @@ word * Format_filename_unicode(const word * fname, word max_length, int type)
result[c]=fname[c]; result[c]=fname[c];
} }
// Ensuite on recopie la partie qui suit le point (si nécessaire): // Ensuite on recopie la partie qui suit le point (si nécessaire):
if (pos_last_dot != -1) if (pos_last_dot != -1)
{ {
for (c = pos_last_dot+1,other_cursor=max_length-4;fname[c]!='\0' && other_cursor < max_length-1;c++,other_cursor++) for (c = pos_last_dot+1,other_cursor=max_length-4;fname[c]!='\0' && other_cursor < max_length-1;c++,other_cursor++)
@ -363,7 +363,7 @@ char * Format_filename(const char * fname, word max_length, int type)
result[c]=fname[c]; result[c]=fname[c];
} }
// Ensuite on recopie la partie qui suit le point (si nécessaire): // Ensuite on recopie la partie qui suit le point (si nécessaire):
if (pos_last_dot != -1) if (pos_last_dot != -1)
{ {
for (c = pos_last_dot+1,other_cursor=max_length-4;fname[c]!='\0' && other_cursor < max_length-1;c++,other_cursor++) for (c = pos_last_dot+1,other_cursor=max_length-4;fname[c]!='\0' && other_cursor < max_length-1;c++,other_cursor++)
@ -376,7 +376,7 @@ char * Format_filename(const char * fname, word max_length, int type)
// -- Rajouter a la liste des elements de la liste un element --------------- // -- Rajouter a la liste des elements de la liste un element ---------------
T_Fileselector_item * Add_element_to_list(T_Fileselector *list, const char * full_name, const char *short_name, int type, byte icon) T_Fileselector_item * Add_element_to_list(T_Fileselector *list, const char * full_name, const char *short_name, int type, byte icon)
// Cette procedure ajoute a la liste chainee un fichier passé en argument. // Cette procedure ajoute a la liste chainee un fichier passé en argument.
{ {
// Working element // Working element
T_Fileselector_item * temp_item; T_Fileselector_item * temp_item;
@ -420,7 +420,7 @@ int Check_extension(const char *filename_ext, const char * filter)
if (filename_ext == NULL || filename_ext[0] == '\0') if (filename_ext == NULL || filename_ext[0] == '\0')
return (filter[0] == '\0' || filter[0] == ';'); return (filter[0] == '\0' || filter[0] == ';');
// Vérification caractère par caractère, case-insensitive. // Vérification caractère par caractère, case-insensitive.
for (c = 0; !(filter[c] == '\0' || filter[c] == ';'); c++) for (c = 0; !(filter[c] == '\0' || filter[c] == ';'); c++)
{ {
if (filter[c] != '?' && if (filter[c] != '?' &&
@ -530,8 +530,8 @@ static void Read_dir_callback(void * pdata, const char *file_name, const word *u
void Read_list_of_files(T_Fileselector *list, byte selected_format) void Read_list_of_files(T_Fileselector *list, byte selected_format)
// Cette procédure charge dans la liste chainée les fichiers dont l'extension // Cette procédure charge dans la liste chainée les fichiers dont l'extension
// correspond au format demandé. // correspond au format demandé.
{ {
struct Read_dir_pdata callback_data; struct Read_dir_pdata callback_data;
const char * current_path = NULL; const char * current_path = NULL;
@ -542,14 +542,14 @@ void Read_list_of_files(T_Fileselector *list, byte selected_format)
#endif #endif
callback_data.list = list; callback_data.list = list;
// Tout d'abord, on déduit du format demandé un filtre à utiliser: // Tout d'abord, on déduit du format demandé un filtre à utiliser:
callback_data.filter = Get_fileformat(selected_format)->Extensions; callback_data.filter = Get_fileformat(selected_format)->Extensions;
// Ensuite, on vide la liste actuelle: // Ensuite, on vide la liste actuelle:
Free_fileselector_list(list); Free_fileselector_list(list);
// Après effacement, il ne reste ni fichier ni répertoire dans la liste // Après effacement, il ne reste ni fichier ni répertoire dans la liste
// On lit tous les répertoires: // On lit tous les répertoires:
current_path = Get_current_directory(curdir, NULL, MAX_PATH_CHARACTERS); current_path = Get_current_directory(curdir, NULL, MAX_PATH_CHARACTERS);
For_each_directory_entry(current_path, &callback_data, Read_dir_callback); For_each_directory_entry(current_path, &callback_data, Read_dir_callback);
@ -686,10 +686,10 @@ void Read_list_of_drives(T_Fileselector *list, byte name_length)
{ {
if ( (1 << bit_index) & drive_bits ) if ( (1 << bit_index) & drive_bits )
{ {
// On a ce lecteur, il faut maintenant déterminer son type "physique". // On a ce lecteur, il faut maintenant déterminer son type "physique".
// pour profiter des jolies icones de X-man. // pour profiter des jolies icones de X-man.
char drive_path[]="A:\\"; char drive_path[]="A:\\";
// Cette API Windows est étrange, je dois m'y faire... // Cette API Windows est étrange, je dois m'y faire...
drive_path[0]='A'+bit_index; drive_path[0]='A'+bit_index;
switch (GetDriveTypeA(drive_path)) switch (GetDriveTypeA(drive_path))
{ {
@ -731,11 +731,11 @@ void Read_list_of_drives(T_Fileselector *list, byte name_length)
} }
#else #else
{ {
//Sous les différents unix, on va mettre //Sous les différents unix, on va mettre
// un disque dur qui pointera vers la racine, // un disque dur qui pointera vers la racine,
// et un autre vers le home directory de l'utilisateur. // et un autre vers le home directory de l'utilisateur.
// Ensuite on utilise read_file_system_list pour compléter // Ensuite on utilise read_file_system_list pour compléter
struct mount_entry* mount_points_list; struct mount_entry* mount_points_list;
struct mount_entry* next; struct mount_entry* next;
@ -797,15 +797,15 @@ void Read_list_of_drives(T_Fileselector *list, byte name_length)
#endif #endif
// -- Tri de la liste des fichiers et répertoires --------------------------- // -- Tri de la liste des fichiers et répertoires ---------------------------
void Sort_list_of_files(T_Fileselector *list) void Sort_list_of_files(T_Fileselector *list)
// Tri la liste chainée existante dans l'ordre suivant: // Tri la liste chainée existante dans l'ordre suivant:
// //
// * Les répertoires d'abord, dans l'ordre alphabétique de leur nom // * Les répertoires d'abord, dans l'ordre alphabétique de leur nom
// * Les fichiers ensuite, dans l'ordre alphabétique de leur nom // * Les fichiers ensuite, dans l'ordre alphabétique de leur nom
{ {
byte list_is_sorted; // Booléen "La liste est triée" byte list_is_sorted; // Booléen "La liste est triée"
byte need_swap; // Booléen "Il faut inverser les éléments" byte need_swap; // Booléen "Il faut inverser les éléments"
T_Fileselector_item * prev_item; T_Fileselector_item * prev_item;
T_Fileselector_item * current_item; T_Fileselector_item * current_item;
T_Fileselector_item * next_item; T_Fileselector_item * next_item;
@ -816,7 +816,7 @@ void Sort_list_of_files(T_Fileselector *list)
{ {
do do
{ {
// Par défaut, on considère que la liste est triée // Par défaut, on considère que la liste est triée
list_is_sorted=1; list_is_sorted=1;
current_item=list->First; current_item=list->First;
@ -827,7 +827,7 @@ void Sort_list_of_files(T_Fileselector *list)
// On commence par supposer qu'il n'y pas pas besoin d'inversion // On commence par supposer qu'il n'y pas pas besoin d'inversion
need_swap=0; need_swap=0;
// Ensuite, on vérifie si les deux éléments sont bien dans l'ordre ou // Ensuite, on vérifie si les deux éléments sont bien dans l'ordre ou
// non: // non:
// Drives go at the top of the list, and files go after them // Drives go at the top of the list, and files go after them
@ -846,39 +846,39 @@ void Sort_list_of_files(T_Fileselector *list)
if (need_swap) if (need_swap)
{ {
// Si les deux éléments nécessitent d'être inversé: // Si les deux éléments nécessitent d'être inversé:
// On les inverses: // On les inverses:
// On note avant tout les éléments qui encapsulent nos deux amis // On note avant tout les éléments qui encapsulent nos deux amis
prev_item =current_item->Previous; prev_item =current_item->Previous;
next_to_next_item=next_item->Next; next_to_next_item=next_item->Next;
// On permute le chaînage des deux éléments entree eux // On permute le chaînage des deux éléments entree eux
current_item->Next =next_to_next_item; current_item->Next =next_to_next_item;
current_item->Previous=next_item; current_item->Previous=next_item;
next_item->Next =current_item; next_item->Next =current_item;
next_item->Previous=prev_item; next_item->Previous=prev_item;
// On tente un chaînage des éléments encapsulant les compères: // On tente un chaînage des éléments encapsulant les compères:
if (prev_item!=NULL) if (prev_item!=NULL)
prev_item->Next=next_item; prev_item->Next=next_item;
if (next_to_next_item!=NULL) if (next_to_next_item!=NULL)
next_to_next_item->Previous=current_item; next_to_next_item->Previous=current_item;
// On fait bien attention à modifier la tête de liste en cas de besoin // On fait bien attention à modifier la tête de liste en cas de besoin
if (current_item==list->First) if (current_item==list->First)
list->First=next_item; list->First=next_item;
// Ensuite, on se prépare à étudier les éléments précédents: // Ensuite, on se prépare à étudier les éléments précédents:
current_item=prev_item; current_item=prev_item;
// Et on constate que la liste n'était pas encore génialement triée // Et on constate que la liste n'était pas encore génialement triée
list_is_sorted=0; list_is_sorted=0;
} }
else else
{ {
// Si les deux éléments sont dans l'ordre: // Si les deux éléments sont dans l'ordre:
// On passe aux suivants // On passe aux suivants
current_item=current_item->Next; current_item=current_item->Next;
@ -918,14 +918,14 @@ T_Fileselector_item * Get_item_by_index(T_Fileselector *list, short index)
} }
// -- Affichage des éléments de la liste de fichier / répertoire ------------ // -- Affichage des éléments de la liste de fichier / répertoire ------------
void Display_file_list(T_Fileselector *list, short offset_first,short selector_offset) void Display_file_list(T_Fileselector *list, short offset_first,short selector_offset)
// //
// offset_first = Décalage entre le premier fichier visible dans le // offset_first = Décalage entre le premier fichier visible dans le
// sélecteur et le premier fichier de la liste // sélecteur et le premier fichier de la liste
// //
// selector_offset = Décalage entre le premier fichier visible dans le // selector_offset = Décalage entre le premier fichier visible dans le
// sélecteur et le fichier sélectionné dans la liste // sélecteur et le fichier sélectionné dans la liste
// //
{ {
T_Fileselector_item * current_item; T_Fileselector_item * current_item;
@ -934,16 +934,16 @@ void Display_file_list(T_Fileselector *list, short offset_first,short selector_o
byte background_color; byte background_color;
// On vérifie s'il y a au moins 1 fichier dans la liste: // On vérifie s'il y a au moins 1 fichier dans la liste:
if (list->Nb_elements>0) if (list->Nb_elements>0)
{ {
// On commence par chercher à pointer sur le premier fichier visible: // On commence par chercher à pointer sur le premier fichier visible:
current_item = Get_item_by_index(list, offset_first); current_item = Get_item_by_index(list, offset_first);
// Pour chacun des 10 éléments inscriptibles à l'écran // Pour chacun des 10 éléments inscriptibles à l'écran
for (index=0;index<10;index++) for (index=0;index<10;index++)
{ {
// S'il est sélectionné: // S'il est sélectionné:
if (!selector_offset) if (!selector_offset)
{ {
// Si c'est un fichier // Si c'est un fichier
@ -965,7 +965,7 @@ void Display_file_list(T_Fileselector *list, short offset_first,short selector_o
background_color=NORMAL_BACKGROUND_COLOR; background_color=NORMAL_BACKGROUND_COLOR;
} }
// On affiche l'élément // On affiche l'élément
if (current_item->Icon != ICON_NONE) if (current_item->Icon != ICON_NONE)
{ {
// Name preceded by an icon // Name preceded by an icon
@ -981,7 +981,7 @@ void Display_file_list(T_Fileselector *list, short offset_first,short selector_o
Print_in_window(8,95+index*8,current_item->Short_name,text_color,background_color); Print_in_window(8,95+index*8,current_item->Short_name,text_color,background_color);
} }
// On passe à la ligne suivante // On passe à la ligne suivante
selector_offset--; selector_offset--;
current_item=current_item->Next; current_item=current_item->Next;
if (!current_item) if (!current_item)
@ -992,30 +992,30 @@ void Display_file_list(T_Fileselector *list, short offset_first,short selector_o
} }
// -- Récupérer le libellé d'un élément de la liste ------------------------- // -- Récupérer le libellé d'un élément de la liste -------------------------
static void Get_selected_item(T_Fileselector *list, short offset_first,short selector_offset,char * label,word * unicode_label,int *type) static void Get_selected_item(T_Fileselector *list, short offset_first,short selector_offset,char * label,word * unicode_label,int *type)
// //
// offset_first = Décalage entre le premier fichier visible dans le // offset_first = Décalage entre le premier fichier visible dans le
// sélecteur et le premier fichier de la liste // sélecteur et le premier fichier de la liste
// //
// selector_offset = Décalage entre le premier fichier visible dans le // selector_offset = Décalage entre le premier fichier visible dans le
// sélecteur et le fichier à récupérer // sélecteur et le fichier à récupérer
// //
// label = str de réception du libellé de l'élément // label = str de réception du libellé de l'élément
// //
// type = Récupération du type: 0 fichier, 1 repertoire, 2 lecteur. // type = Récupération du type: 0 fichier, 1 repertoire, 2 lecteur.
// Passer NULL si pas interessé. // Passer NULL si pas interessé.
{ {
T_Fileselector_item * current_item; T_Fileselector_item * current_item;
// On vérifie s'il y a au moins 1 fichier dans la liste: // On vérifie s'il y a au moins 1 fichier dans la liste:
if (list->Nb_elements>0) if (list->Nb_elements>0)
{ {
// On commence par chercher à pointer sur le premier fichier visible: // On commence par chercher à pointer sur le premier fichier visible:
// Ensuite, on saute autant d'éléments que le décalage demandé: // Ensuite, on saute autant d'éléments que le décalage demandé:
current_item = Get_item_by_index(list, offset_first + selector_offset); current_item = Get_item_by_index(list, offset_first + selector_offset);
// On recopie la chaîne // On recopie la chaîne
strcpy(label, current_item->Full_name); strcpy(label, current_item->Full_name);
if (unicode_label != NULL) if (unicode_label != NULL)
{ {
@ -1031,28 +1031,28 @@ static void Get_selected_item(T_Fileselector *list, short offset_first,short sel
} }
// ----------------- Déplacements dans la liste de fichiers ----------------- // ----------------- Déplacements dans la liste de fichiers -----------------
void Selector_scroll_down(short * offset_first,short * selector_offset) void Selector_scroll_down(short * offset_first,short * selector_offset)
// Fait scroller vers le bas le sélecteur de fichier... (si possible) // Fait scroller vers le bas le sélecteur de fichier... (si possible)
{ {
if ( ((*selector_offset)<9) if ( ((*selector_offset)<9)
&& ( (*selector_offset)+1 < Filelist.Nb_elements ) ) && ( (*selector_offset)+1 < Filelist.Nb_elements ) )
// Si la sélection peut descendre // Si la sélection peut descendre
Display_file_list(&Filelist, *offset_first,++(*selector_offset)); Display_file_list(&Filelist, *offset_first,++(*selector_offset));
else // Sinon, descendre la fenêtre (si possible) else // Sinon, descendre la fenêtre (si possible)
if ((*offset_first)+10<Filelist.Nb_elements) if ((*offset_first)+10<Filelist.Nb_elements)
Display_file_list(&Filelist, ++(*offset_first),*selector_offset); Display_file_list(&Filelist, ++(*offset_first),*selector_offset);
} }
void Selector_scroll_up(short * offset_first,short * selector_offset) void Selector_scroll_up(short * offset_first,short * selector_offset)
// Fait scroller vers le haut le sélecteur de fichier... (si possible) // Fait scroller vers le haut le sélecteur de fichier... (si possible)
{ {
if ((*selector_offset)>0) if ((*selector_offset)>0)
// Si la sélection peut monter // Si la sélection peut monter
Display_file_list(&Filelist, *offset_first,--(*selector_offset)); Display_file_list(&Filelist, *offset_first,--(*selector_offset));
else // Sinon, monter la fenêtre (si possible) else // Sinon, monter la fenêtre (si possible)
if ((*offset_first)>0) if ((*offset_first)>0)
Display_file_list(&Filelist, --(*offset_first),*selector_offset); Display_file_list(&Filelist, --(*offset_first),*selector_offset);
} }
@ -1129,9 +1129,9 @@ void Selector_home(short * offset_first,short * selector_offset)
short Compute_click_offset_in_fileselector(void) short Compute_click_offset_in_fileselector(void)
/* /*
Renvoie le décalage dans le sélecteur de fichier sur lequel on a clické. Renvoie le décalage dans le sélecteur de fichier sur lequel on a clické.
Renvoie le décalage du dernier fichier si on a clické au delà. Renvoie le décalage du dernier fichier si on a clické au delà.
Renvoie -1 si le sélecteur est vide. Renvoie -1 si le sélecteur est vide.
*/ */
{ {
short computed_offset; short computed_offset;
@ -1148,7 +1148,7 @@ void Display_bookmark(T_Dropdown_button * Button, int bookmark_number)
if (Config.Bookmark_directory[bookmark_number]) if (Config.Bookmark_directory[bookmark_number])
{ {
int label_size; int label_size;
// Libellé // Libellé
Print_in_window_limited(Button->Pos_X+3+10,Button->Pos_Y+2,Config.Bookmark_label[bookmark_number],8,MC_Black,MC_Light); Print_in_window_limited(Button->Pos_X+3+10,Button->Pos_Y+2,Config.Bookmark_label[bookmark_number],8,MC_Black,MC_Light);
label_size=strlen(Config.Bookmark_label[bookmark_number]); label_size=strlen(Config.Bookmark_label[bookmark_number]);
if (label_size<8) if (label_size<8)
@ -1163,7 +1163,7 @@ void Display_bookmark(T_Dropdown_button * Button, int bookmark_number)
} }
else else
{ {
// Libellé // Libellé
Print_in_window(Button->Pos_X+3+10,Button->Pos_Y+2,"--------",MC_Dark,MC_Light); Print_in_window(Button->Pos_X+3+10,Button->Pos_Y+2,"--------",MC_Dark,MC_Light);
// Menu apparait sur clic droit ou gauche // Menu apparait sur clic droit ou gauche
Button->Active_button=RIGHT_SIDE|LEFT_SIDE; Button->Active_button=RIGHT_SIDE|LEFT_SIDE;
@ -1181,8 +1181,8 @@ void Print_current_directory(void)
// //
{ {
char converted_name[MAX_PATH_CHARACTERS]; char converted_name[MAX_PATH_CHARACTERS];
int length; // length du répertoire courant int length; // length du répertoire courant
int index; // index de parcours de la chaine complète int index; // index de parcours de la chaine complète
strncpy(converted_name,Selector->Directory,sizeof(converted_name)); strncpy(converted_name,Selector->Directory,sizeof(converted_name));
converted_name[sizeof(converted_name)-1] = '\0'; converted_name[sizeof(converted_name)-1] = '\0';
@ -1288,7 +1288,7 @@ void Print_filename_in_fileselector(void)
Update_window_area(82,48,27*8,8); Update_window_area(82,48,27*8,8);
} }
int Selected_type; // Utilisé pour mémoriser le type d'entrée choisi int Selected_type; // Utilisé pour mémoriser le type d'entrée choisi
// dans le selecteur de fichier. // dans le selecteur de fichier.
void Prepare_and_display_filelist(short Position, short offset, T_Scroller_button * button) void Prepare_and_display_filelist(short Position, short offset, T_Scroller_button * button)
@ -1304,11 +1304,11 @@ void Prepare_and_display_filelist(short Position, short offset, T_Scroller_butto
Update_window_area(8-1,95-1,144+2,80+2); Update_window_area(8-1,95-1,144+2,80+2);
// On récupère le nom du schmilblick à "accéder" // On récupère le nom du schmilblick à "accéder"
Get_selected_item(&Filelist, Position,offset,Selector_filename,Selector_filename_unicode,&Selected_type); Get_selected_item(&Filelist, Position,offset,Selector_filename,Selector_filename_unicode,&Selected_type);
// On affiche le nouveau nom de fichier // On affiche le nouveau nom de fichier
Print_filename_in_fileselector(); Print_filename_in_fileselector();
// On affiche le nom du répertoire courant // On affiche le nom du répertoire courant
Print_current_directory(); Print_current_directory();
} }
@ -1352,14 +1352,14 @@ void Scroll_fileselector(T_Scroller_button * file_scroller)
strcpy(old_filename,Selector_filename); strcpy(old_filename,Selector_filename);
// On regarde si la liste a bougé // On regarde si la liste a bougé
if (file_scroller->Position!=Selector->Position) if (file_scroller->Position!=Selector->Position)
{ {
// Si c'est le cas, il faut mettre à jour la jauge // Si c'est le cas, il faut mettre à jour la jauge
file_scroller->Position=Selector->Position; file_scroller->Position=Selector->Position;
Window_draw_slider(file_scroller); Window_draw_slider(file_scroller);
} }
// On récupére le nom du schmilblick à "accéder" // On récupére le nom du schmilblick à "accéder"
Get_selected_item(&Filelist, Selector->Position,Selector->Offset,Selector_filename,Selector_filename_unicode,&Selected_type); Get_selected_item(&Filelist, Selector->Position,Selector->Offset,Selector_filename,Selector_filename_unicode,&Selected_type);
if (strcmp(old_filename,Selector_filename)) if (strcmp(old_filename,Selector_filename))
New_preview_is_needed=1; New_preview_is_needed=1;
@ -1513,7 +1513,7 @@ int Quicksearch_list(T_List_button * list, T_Fileselector * selector)
Locate_list_item(list, selected_item); Locate_list_item(list, selected_item);
Hide_cursor(); Hide_cursor();
// Mise à jour du scroller // Mise à jour du scroller
list->Scroller->Position=list->List_start; list->Scroller->Position=list->List_start;
Window_draw_slider(list->Scroller); Window_draw_slider(list->Scroller);
@ -1537,12 +1537,12 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
T_Dropdown_button * bookmark_dropdown[4]; T_Dropdown_button * bookmark_dropdown[4];
short temp; short temp;
unsigned int format; unsigned int format;
int dummy=0; // Sert à appeler SDL_GetKeyState int dummy=0; // Sert à appeler SDL_GetKeyState
byte save_or_load_image=0; byte save_or_load_image=0;
byte has_clicked_ok=0;// Indique si on a clické sur Load ou Save ou sur byte has_clicked_ok=0;// Indique si on a clické sur Load ou Save ou sur
//un bouton enclenchant Load ou Save juste après. //un bouton enclenchant Load ou Save juste après.
byte initial_back_color; // preview destroys it (how nice) byte initial_back_color; // preview destroys it (how nice)
char previous_directory[MAX_PATH_CHARACTERS]; // Répertoire d'où l'on vient après un CHDIR char previous_directory[MAX_PATH_CHARACTERS]; // Répertoire d'où l'on vient après un CHDIR
char save_filename[MAX_PATH_CHARACTERS]; char save_filename[MAX_PATH_CHARACTERS];
word save_filename_unicode[MAX_PATH_CHARACTERS]; word save_filename_unicode[MAX_PATH_CHARACTERS];
char initial_comment[COMMENT_SIZE+1]; char initial_comment[COMMENT_SIZE+1];
@ -1676,8 +1676,8 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
Highlight_file(Find_file_in_fileselector(&Filelist, context->File_name)); Highlight_file(Find_file_in_fileselector(&Filelist, context->File_name));
Prepare_and_display_filelist(Selector->Position,Selector->Offset,file_scroller); Prepare_and_display_filelist(Selector->Position,Selector->Offset,file_scroller);
// On initialise le nom de fichier à celui en cours et non pas celui sous // On initialise le nom de fichier à celui en cours et non pas celui sous
// la barre de sélection // la barre de sélection
strcpy(Selector_filename,context->File_name); strcpy(Selector_filename,context->File_name);
Unicode_strlcpy(Selector_filename_unicode, context->File_name_unicode, 256); Unicode_strlcpy(Selector_filename_unicode, context->File_name_unicode, 256);
// On affiche le nouveau nom de fichier // On affiche le nouveau nom de fichier
@ -1748,9 +1748,9 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
// On efface le repertoire (si on peut) // On efface le repertoire (si on peut)
temp=(!Remove_directory(Selector_filename)); temp=(!Remove_directory(Selector_filename));
if (temp) // temp indique si l'effacement s'est bien passé if (temp) // temp indique si l'effacement s'est bien passé
{ {
// On remonte si c'était le dernier élément de la liste // On remonte si c'était le dernier élément de la liste
if (Selector->Position+Selector->Offset==Filelist.Nb_elements-1) if (Selector->Position+Selector->Offset==Filelist.Nb_elements-1)
{ {
if (Selector->Position) if (Selector->Position)
@ -1759,7 +1759,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
if (Selector->Offset) if (Selector->Offset)
Selector->Offset--; Selector->Offset--;
} }
else // Si ce n'était pas le dernier, il faut faire gaffe à ce else // Si ce n'était pas le dernier, il faut faire gaffe à ce
{ // que ses copains d'en dessous ne remontent pas trop. { // que ses copains d'en dessous ne remontent pas trop.
if ( (Selector->Position) if ( (Selector->Position)
&& (Selector->Position+10==Filelist.Nb_elements) ) && (Selector->Position+10==Filelist.Nb_elements) )
@ -1787,14 +1787,14 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
{ {
if (temp!=Selector->Offset) if (temp!=Selector->Offset)
{ {
// On met à jour le décalage // On met à jour le décalage
Selector->Offset=temp; Selector->Offset=temp;
// On récupére le nom du schmilblick à "accéder" // On récupére le nom du schmilblick à "accéder"
Get_selected_item(&Filelist, Selector->Position,Selector->Offset,Selector_filename,Selector_filename_unicode,&Selected_type); Get_selected_item(&Filelist, Selector->Position,Selector->Offset,Selector_filename,Selector_filename_unicode,&Selected_type);
// On affiche le nouveau nom de fichier // On affiche le nouveau nom de fichier
Print_filename_in_fileselector(); Print_filename_in_fileselector();
// On affiche à nouveau la liste // On affiche à nouveau la liste
Display_file_list(&Filelist, Selector->Position,Selector->Offset); Display_file_list(&Filelist, Selector->Position,Selector->Offset);
// On vient de changer de nom de fichier, donc on doit s'appreter // On vient de changer de nom de fichier, donc on doit s'appreter
@ -1805,10 +1805,10 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
} }
else else
{ {
// En sauvegarde, si on a double-clické sur un répertoire, il // En sauvegarde, si on a double-clické sur un répertoire, il
// faut mettre le nom de fichier au nom du répertoire. Sinon, dans // faut mettre le nom de fichier au nom du répertoire. Sinon, dans
// certains cas, on risque de sauvegarder avec le nom du fichier // certains cas, on risque de sauvegarder avec le nom du fichier
// actuel au lieu de changer de répertoire. // actuel au lieu de changer de répertoire.
if (Selector->Position+Selector->Offset<Filelist.Nb_directories) if (Selector->Position+Selector->Offset<Filelist.Nb_directories)
Get_selected_item(&Filelist, Selector->Position,Selector->Offset,Selector_filename,Selector_filename_unicode,&Selected_type); Get_selected_item(&Filelist, Selector->Position,Selector->Offset,Selector_filename,Selector_filename_unicode,&Selected_type);
@ -1824,11 +1824,11 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
case 5 : // Scroller de fichiers case 5 : // Scroller de fichiers
Hide_cursor(); Hide_cursor();
Selector->Position=Window_attribute2; Selector->Position=Window_attribute2;
// On récupére le nom du schmilblick à "accéder" // On récupére le nom du schmilblick à "accéder"
Get_selected_item(&Filelist, Selector->Position,Selector->Offset,Selector_filename,Selector_filename_unicode,&Selected_type); Get_selected_item(&Filelist, Selector->Position,Selector->Offset,Selector_filename,Selector_filename_unicode,&Selected_type);
// On affiche le nouveau nom de fichier // On affiche le nouveau nom de fichier
Print_filename_in_fileselector(); Print_filename_in_fileselector();
// On affiche à nouveau la liste // On affiche à nouveau la liste
Display_file_list(&Filelist, Selector->Position,Selector->Offset); Display_file_list(&Filelist, Selector->Position,Selector->Offset);
Display_cursor(); Display_cursor();
New_preview_is_needed=1; New_preview_is_needed=1;
@ -1972,7 +1972,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
#if defined(WIN32) || defined(ENABLE_FILENAMES_ICONV) #if defined(WIN32) || defined(ENABLE_FILENAMES_ICONV)
Unicode_strlcpy(Selector_filename_unicode, filename_unicode, sizeof(Selector_filename_unicode)/sizeof(word)); Unicode_strlcpy(Selector_filename_unicode, filename_unicode, sizeof(Selector_filename_unicode)/sizeof(word));
#endif #endif
// On regarde s'il faut rajouter une extension. C'est-à-dire s'il // On regarde s'il faut rajouter une extension. C'est-à-dire s'il
// n'y a pas de '.' dans le nom du fichier. // n'y a pas de '.' dans le nom du fichier.
for(temp=0,dummy=0; ((Selector_filename[temp]) && (!dummy)); temp++) for(temp=0,dummy=0; ((Selector_filename[temp]) && (!dummy)); temp++)
if (Selector_filename[temp]=='.') if (Selector_filename[temp]=='.')
@ -2028,7 +2028,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
case 9 : // Volume Select case 9 : // Volume Select
Hide_cursor(); Hide_cursor();
// Comme on tombe sur un disque qu'on connait pas, on se place en // Comme on tombe sur un disque qu'on connait pas, on se place en
// début de liste: // début de liste:
Selector->Position=0; Selector->Position=0;
Selector->Offset=0; Selector->Offset=0;
// Affichage des premiers fichiers visibles: // Affichage des premiers fichiers visibles:
@ -2047,7 +2047,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
switch(Window_attribute2) switch(Window_attribute2)
{ {
case -1: // bouton lui-même: aller au répertoire mémorisé case -1: // bouton lui-même: aller au répertoire mémorisé
if (Config.Bookmark_directory[clicked_button-10]) if (Config.Bookmark_directory[clicked_button-10])
{ {
// backup the currently selected filename // backup the currently selected filename
@ -2087,7 +2087,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
case 1: // Rename case 1: // Rename
if (Config.Bookmark_directory[clicked_button-10]) if (Config.Bookmark_directory[clicked_button-10])
{ {
// On enlève les "..." avant l'édition // On enlève les "..." avant l'édition
char bookmark_label[8+1]; char bookmark_label[8+1];
strcpy(bookmark_label, Config.Bookmark_label[clicked_button-10]); strcpy(bookmark_label, Config.Bookmark_label[clicked_button-10]);
if (bookmark_label[7]==ELLIPSIS_CHARACTER) if (bookmark_label[7]==ELLIPSIS_CHARACTER)
@ -2174,10 +2174,10 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
break; break;
case SDLK_BACKSPACE : // Backspace case SDLK_BACKSPACE : // Backspace
Reset_quicksearch(); Reset_quicksearch();
// Si le choix ".." est bien en tête des propositions... // Si le choix ".." est bien en tête des propositions...
if (Filelist.Nb_elements && !strcmp(Filelist.First->Full_name,PARENT_DIR)) if (Filelist.Nb_elements && !strcmp(Filelist.First->Full_name,PARENT_DIR))
{ {
// On va dans le répertoire parent. // On va dans le répertoire parent.
strcpy(Selector_filename,PARENT_DIR); strcpy(Selector_filename,PARENT_DIR);
Selector_filename_unicode[0] = 0; Selector_filename_unicode[0] = 0;
Selected_type=1; Selected_type=1;
@ -2220,7 +2220,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
if (has_clicked_ok) if (has_clicked_ok)
{ {
// Si c'est un répertoire, on annule "has_clicked_ok" et on passe // Si c'est un répertoire, on annule "has_clicked_ok" et on passe
// dedans. // dedans.
if (Selected_type!=0) if (Selected_type!=0)
{ {
@ -2281,14 +2281,14 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
// Gestion du chrono et des previews // Gestion du chrono et des previews
if (New_preview_is_needed) if (New_preview_is_needed)
{ {
// On efface les infos de la preview précédente s'il y en a une // On efface les infos de la preview précédente s'il y en a une
// d'affichée // d'affichée
if (Timer_state==2) if (Timer_state==2)
{ {
Hide_cursor(); Hide_cursor();
// On efface le commentaire précédent // On efface le commentaire précédent
Window_rectangle(45,70,32*8,8,MC_Light); Window_rectangle(45,70,32*8,8,MC_Light);
// On nettoie la zone où va s'afficher la preview: // On nettoie la zone où va s'afficher la preview:
Window_rectangle(183,95,PREVIEW_WIDTH,PREVIEW_HEIGHT,MC_Light); Window_rectangle(183,95,PREVIEW_WIDTH,PREVIEW_HEIGHT,MC_Light);
// On efface les dimensions de l'image // On efface les dimensions de l'image
Window_rectangle(101,59,120,8,MC_Light); Window_rectangle(101,59,120,8,MC_Light);
@ -2302,15 +2302,15 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
Print_in_window(45,70,context->Comment,MC_Black,MC_Light); Print_in_window(45,70,context->Comment,MC_Black,MC_Light);
} }
Display_cursor(); Display_cursor();
// Un update pour couvrir les 4 zones: 3 libellés plus le commentaire // Un update pour couvrir les 4 zones: 3 libellés plus le commentaire
Update_window_area(45,48,256,30); Update_window_area(45,48,256,30);
// Zone de preview // Zone de preview
Update_window_area(183,95,PREVIEW_WIDTH,PREVIEW_HEIGHT); Update_window_area(183,95,PREVIEW_WIDTH,PREVIEW_HEIGHT);
} }
New_preview_is_needed=0; New_preview_is_needed=0;
Timer_state=0; // State du chrono = Attente d'un Xème de seconde Timer_state=0; // State du chrono = Attente d'un Xème de seconde
// On lit le temps de départ du chrono // On lit le temps de départ du chrono
Init_chrono(Config.Timer_delay); Init_chrono(Config.Timer_delay);
} }
@ -2337,7 +2337,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
} }
Timer_state=2; // On arrête le chrono Timer_state=2; // On arrête le chrono
} }
} }
while ( (!has_clicked_ok) && (clicked_button!=2) ); while ( (!has_clicked_ok) && (clicked_button!=2) );
@ -2358,7 +2358,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
} }
// On restaure les données de l'image qui ont certainement été modifiées // On restaure les données de l'image qui ont certainement été modifiées
// par la preview. // par la preview.
Back_color=initial_back_color; Back_color=initial_back_color;
if (Windows_open <= 1) if (Windows_open <= 1)

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
*/ */
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2008 Peter Gordon Copyright 2008 Peter Gordon
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
Copyright 2008 Franck Charlet Copyright 2008 Franck Charlet
@ -75,7 +75,7 @@ word * Shortcut(word shortcut_number)
return &(Config_Key[shortcut_number & 0xFF][0]); return &(Config_Key[shortcut_number & 0xFF][0]);
} }
// Nom de la touche actuallement assignée à un raccourci d'après son numéro // Nom de la touche actuallement assignée à un raccourci d'après son numéro
// de type 0x100+BOUTON_* ou SPECIAL_* // de type 0x100+BOUTON_* ou SPECIAL_*
const char * Keyboard_shortcut_value(word shortcut_number) const char * Keyboard_shortcut_value(word shortcut_number)
{ {
@ -153,7 +153,7 @@ void Window_set_shortcut(int action_id)
} }
} }
*/ */
config_index=order_index; // Comprends pas... ça devrait pas marcher config_index=order_index; // Comprends pas... ça devrait pas marcher
Open_window(302,131,"Keyboard shortcut"); Open_window(302,131,"Keyboard shortcut");
Window_set_normal_button(181,111,55,14,"Cancel",0,1,KEY_ESC); // 1 Window_set_normal_button(181,111,55,14,"Cancel",0,1,KEY_ESC); // 1
@ -304,10 +304,10 @@ void Remove_duplicate_shortcuts(void)
short Print_help(short x_pos, short y_pos, const char *line, char line_type, short link_position, short link_size) short Print_help(short x_pos, short y_pos, const char *line, char line_type, short link_position, short link_size)
{ {
short width; // Largeur physique d'une ligne de texte short width; // Largeur physique d'une ligne de texte
short x; // Indices d'affichage d'un caractère short x; // Indices d'affichage d'un caractère
short y; short y;
short x_position; // Parcours de remplissage du buffer de ligne short x_position; // Parcours de remplissage du buffer de ligne
short char_index; // Parcours des caractères d'une ligne short char_index; // Parcours des caractères d'une ligne
byte * char_pixel; byte * char_pixel;
short repeat_menu_x_factor; short repeat_menu_x_factor;
short repeat_menu_y_factor; short repeat_menu_y_factor;
@ -323,20 +323,20 @@ short Print_help(short x_pos, short y_pos, const char *line, char line_type, sho
if (line_type == 'T' || line_type == '-') if (line_type == 'T' || line_type == '-')
width = width*2; width = width*2;
// Pour chaque ligne dans la fenêtre: // Pour chaque ligne dans la fenêtre:
for (y=0;y<8;y++) for (y=0;y<8;y++)
{ {
x_position=0; x_position=0;
// On crée une nouvelle ligne à splotcher // On crée une nouvelle ligne à splotcher
for (char_index=0;char_index<width;char_index++) for (char_index=0;char_index<width;char_index++)
{ {
// Recherche du caractère dans les fontes de l'aide. // Recherche du caractère dans les fontes de l'aide.
// Ligne titre : Si l'indice est impair on dessine le quart de caractère // Ligne titre : Si l'indice est impair on dessine le quart de caractère
// qui va a gauche, sinon celui qui va a droite. // qui va a gauche, sinon celui qui va a droite.
if (line_type=='T') if (line_type=='T')
{ {
if (line[char_index/2]>'_' || line[char_index/2]<' ') if (line[char_index/2]>'_' || line[char_index/2]<' ')
char_pixel=&(Gfx->Help_font_norm['!'][0][0]); // Caractère pas géré char_pixel=&(Gfx->Help_font_norm['!'][0][0]); // Caractère pas géré
else if (char_index & 1) else if (char_index & 1)
char_pixel=&(Gfx->Help_font_t2[(unsigned char)(line[char_index/2])-' '][0][0]); char_pixel=&(Gfx->Help_font_t2[(unsigned char)(line[char_index/2])-' '][0][0]);
else else
@ -345,7 +345,7 @@ short Print_help(short x_pos, short y_pos, const char *line, char line_type, sho
else if (line_type=='-') else if (line_type=='-')
{ {
if (line[char_index/2]>'_' || line[char_index/2]<' ') if (line[char_index/2]>'_' || line[char_index/2]<' ')
char_pixel=&(Gfx->Help_font_norm['!'][0][0]); // Caractère pas géré char_pixel=&(Gfx->Help_font_norm['!'][0][0]); // Caractère pas géré
else if (char_index & 1) else if (char_index & 1)
char_pixel=&(Gfx->Help_font_t4[(unsigned char)(line[char_index/2])-' '][0][0]); char_pixel=&(Gfx->Help_font_t4[(unsigned char)(line[char_index/2])-' '][0][0]);
else else
@ -396,11 +396,11 @@ void Display_help(void)
const short x_pos=13; const short x_pos=13;
const short y_pos=19; const short y_pos=19;
char line_type; // N: Normale, T: Titre, S: Sous-titre char line_type; // N: Normale, T: Titre, S: Sous-titre
// -: Ligne inférieur de sous-titre // -: Ligne inférieur de sous-titre
const char * line; const char * line;
char buffer[45]; // buffer texte utilisé pour formater les noms de char buffer[45]; // buffer texte utilisé pour formater les noms de
// raccourcis clavier // raccourcis clavier
short link_position=0; // Position du premier caractère "variable" short link_position=0; // Position du premier caractère "variable"
short link_size=0; // Taille de la partie variable short link_size=0; // Taille de la partie variable
short width; short width;
@ -412,8 +412,8 @@ void Display_help(void)
Window_rectangle (x_pos, Window_rectangle (x_pos,
y_pos + line_index*8, y_pos + line_index*8,
44*6, 44*6,
// 44 = Nb max de char (+1 pour éviter les plantages en mode X // 44 = Nb max de char (+1 pour éviter les plantages en mode X
// causés par une largeur = 0) // causés par une largeur = 0)
(16 - line_index)*8, (16 - line_index)*8,
MC_Black); MC_Black);
break; break;
@ -421,7 +421,7 @@ void Display_help(void)
// On affiche la ligne // On affiche la ligne
line = Help_section[Current_help_section].Help_table[start_line + line_index].Text; line = Help_section[Current_help_section].Help_table[start_line + line_index].Text;
line_type = Help_section[Current_help_section].Help_table[start_line + line_index].Line_type; line_type = Help_section[Current_help_section].Help_table[start_line + line_index].Line_type;
// Si c'est une sous-ligne de titre, on utilise le texte de la ligne précédente // Si c'est une sous-ligne de titre, on utilise le texte de la ligne précédente
if (line_type == '-' && (start_line + line_index > 0)) if (line_type == '-' && (start_line + line_index > 0))
line = Help_section[Current_help_section].Help_table[start_line + line_index - 1].Text; line = Help_section[Current_help_section].Help_table[start_line + line_index - 1].Text;
else if (line_type == 'K') else if (line_type == 'K')
@ -494,8 +494,8 @@ void Button_Help(int btn)
} }
Window_help(-1, NULL); Window_help(-1, NULL);
} }
// Ouvre l'ecran d'aide. Passer -1 pour la section par défaut (ou derniere,) // Ouvre l'ecran d'aide. Passer -1 pour la section par défaut (ou derniere,)
// Ou un nombre de l'enumération BUTTON_NUMBERS pour l'aide contextuelle. // Ou un nombre de l'enumération BUTTON_NUMBERS pour l'aide contextuelle.
void Window_help(int section, const char *sub_section) void Window_help(int section, const char *sub_section)
{ {
short clicked_button; short clicked_button;
@ -523,7 +523,7 @@ void Window_help(int section, const char *sub_section)
Open_window(310,175,"Help / About..."); Open_window(310,175,"Help / About...");
// dessiner de la fenêtre où va défiler le texte // dessiner de la fenêtre où va défiler le texte
Window_display_frame_in(8,17,274,132); Window_display_frame_in(8,17,274,132);
Window_rectangle(9, 18, 272, 130, MC_Black); Window_rectangle(9, 18, 272, 130, MC_Black);
@ -568,7 +568,7 @@ void Window_help(int section, const char *sub_section)
case 'K': case 'K':
Window_set_shortcut(Help_section[Current_help_section].Help_table[Help_position+line].Line_parameter); Window_set_shortcut(Help_section[Current_help_section].Help_table[Help_position+line].Line_parameter);
break; break;
// Ici on peut gérer un cas 'lien hypertexte' // Ici on peut gérer un cas 'lien hypertexte'
default: default:
break; break;
} }
@ -599,7 +599,7 @@ void Window_help(int section, const char *sub_section)
} }
// Gestion des touches de déplacement dans la liste // Gestion des touches de déplacement dans la liste
switch (Key) switch (Key)
{ {
case SDLK_UP : // Haut case SDLK_UP : // Haut
@ -861,14 +861,14 @@ void Button_Stats(int btn)
Print_in_window(122,y,buffer,STATS_DATA_COLOR,MC_Black); Print_in_window(122,y,buffer,STATS_DATA_COLOR,MC_Black);
y+=8; y+=8;
// Affichage du nombre de couleur utilisé // Affichage du nombre de couleur utilisé
Print_in_window(18,y,"Colors used:",STATS_TITLE_COLOR,MC_Black); Print_in_window(18,y,"Colors used:",STATS_TITLE_COLOR,MC_Black);
memset(color_usage,0,sizeof(color_usage)); memset(color_usage,0,sizeof(color_usage));
sprintf(buffer,"%d",Count_used_colors(color_usage)); sprintf(buffer,"%d",Count_used_colors(color_usage));
Print_in_window(122,y,buffer,STATS_DATA_COLOR,MC_Black); Print_in_window(122,y,buffer,STATS_DATA_COLOR,MC_Black);
y+=16; y+=16;
// Affichage des dimensions de l'écran // Affichage des dimensions de l'écran
Print_in_window(10,y,"Resolution:",STATS_TITLE_COLOR,MC_Black); Print_in_window(10,y,"Resolution:",STATS_TITLE_COLOR,MC_Black);
sprintf(buffer,"%dx%d",Screen_width,Screen_height); sprintf(buffer,"%dx%d",Screen_width,Screen_height);
Print_in_window(106,y,buffer,STATS_DATA_COLOR,MC_Black); Print_in_window(106,y,buffer,STATS_DATA_COLOR,MC_Black);

View File

@ -53,7 +53,7 @@ void Window_set_shortcut(int action_id);
/// Print a line with the 'help' (6x8) font. /// Print a line with the 'help' (6x8) font.
short Print_help(short x_pos, short y_pos, const char *line, char line_type, short link_position, short link_size); short Print_help(short x_pos, short y_pos, const char *line, char line_type, short link_position, short link_size);
// Nom de la touche actuallement assignée à un raccourci d'après son numéro // Nom de la touche actuallement assignée à un raccourci d'après son numéro
// de type 0x100+BOUTON_* ou SPECIAL_* // de type 0x100+BOUTON_* ou SPECIAL_*
const char * Keyboard_shortcut_value(word shortcut_number); const char * Keyboard_shortcut_value(word shortcut_number);

View File

@ -766,7 +766,7 @@ T_Key_config ConfigKey[NB_SHORTCUTS] = {
"pixel in the picture into the", "pixel in the picture into the",
"foreground or background color.", "foreground or background color.",
true, true,
SDLK_BACKQUOTE, // `~ (Key sous le Esc - ² en AZERTY) SDLK_BACKQUOTE, // `~ (Key sous le Esc - ² en AZERTY)
0}, 0},
{82, {82,
"Swap foreground/background colors", "Swap foreground/background colors",
@ -1097,7 +1097,7 @@ T_Key_config ConfigKey[NB_SHORTCUTS] = {
"user-defined brush to its center.", "user-defined brush to its center.",
"", "",
true, true,
SDLK_KP5|MOD_CTRL, // Ctrl + 5 (pavé numérique) SDLK_KP5|MOD_CTRL, // Ctrl + 5 (pavé numérique)
0}, 0},
{113, {113,
"Top-left brush attachment point", "Top-left brush attachment point",
@ -1193,7 +1193,7 @@ T_Key_config ConfigKey[NB_SHORTCUTS] = {
"previous in the user-defined color", "previous in the user-defined color",
"series.", "series.",
true, true,
SDLK_MINUS, // "-_" (")°" en AZERTY SDLK_MINUS, // "-_" (")°" en AZERTY
0}, 0},
{128, {128,
"Next user-defined backcolor", "Next user-defined backcolor",
@ -1209,7 +1209,7 @@ T_Key_config ConfigKey[NB_SHORTCUTS] = {
"previous in the user-defined color", "previous in the user-defined color",
"series.", "series.",
true, true,
SDLK_MINUS|MOD_SHIFT, // Shift + "-_" (")°" en AZERTY SDLK_MINUS|MOD_SHIFT, // Shift + "-_" (")°" en AZERTY
0}, 0},
{121, {121,
"Shrink paintbrush", "Shrink paintbrush",
@ -1875,8 +1875,8 @@ word Ordering[NB_SHORTCUTS]=
0x200+BUTTON_AIRBRUSH, // Spray menu 0x200+BUTTON_AIRBRUSH, // Spray menu
0x100+BUTTON_FLOODFILL, // Floodfill 0x100+BUTTON_FLOODFILL, // Floodfill
0x200+BUTTON_FLOODFILL, // Replace color 0x200+BUTTON_FLOODFILL, // Replace color
0x100+BUTTON_CURVES, // Bézier's curves 0x100+BUTTON_CURVES, // Bézier's curves
0x200+BUTTON_CURVES, // Bézier's curve with 3 or 4 points 0x200+BUTTON_CURVES, // Bézier's curve with 3 or 4 points
0x100+BUTTON_RECTANGLES, // Empty rectangle 0x100+BUTTON_RECTANGLES, // Empty rectangle
0x100+BUTTON_FILLRECT, // Filled rectangle 0x100+BUTTON_FILLRECT, // Filled rectangle
0x100+BUTTON_CIRCLES, // Empty circle 0x100+BUTTON_CIRCLES, // Empty circle
@ -1921,8 +1921,8 @@ word Ordering[NB_SHORTCUTS]=
0x200+BUTTON_BRUSH, // Restore brush 0x200+BUTTON_BRUSH, // Restore brush
SPECIAL_FLIP_X, // Flip X SPECIAL_FLIP_X, // Flip X
SPECIAL_FLIP_Y, // Flip Y SPECIAL_FLIP_Y, // Flip Y
SPECIAL_ROTATE_90, // 90° brush rotation SPECIAL_ROTATE_90, // 90° brush rotation
SPECIAL_ROTATE_180, // 180° brush rotation SPECIAL_ROTATE_180, // 180° brush rotation
SPECIAL_STRETCH, // Stretch brush SPECIAL_STRETCH, // Stretch brush
SPECIAL_DISTORT, // Distort brush SPECIAL_DISTORT, // Distort brush
SPECIAL_OUTLINE, // Outline brush SPECIAL_OUTLINE, // Outline brush

View File

@ -2,7 +2,7 @@
*/ */
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2008 Peter Gordon Copyright 2008 Peter Gordon
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
Copyright 2009 Franck Charlet Copyright 2009 Franck Charlet
@ -265,8 +265,8 @@ byte Parse_skin(SDL_Surface * gui, T_Gui_skin *gfx)
int i,j; int i,j;
int cursor_x=0,cursor_y=0; int cursor_x=0,cursor_y=0;
byte color; byte color;
byte neutral_color; // color neutre utilisée pour délimiter les éléments GUI byte neutral_color; // color neutre utilisée pour délimiter les éléments GUI
int char_1=0; // Indices utilisés pour les 4 "fontes" qui composent les int char_1=0; // Indices utilisés pour les 4 "fontes" qui composent les
int char_2=0; // grands titres de l'aide. Chaque indice avance dans int char_2=0; // grands titres de l'aide. Chaque indice avance dans
int char_3=0; // l'une des fontes dans l'ordre : 1 2 int char_3=0; // l'une des fontes dans l'ordre : 1 2
int char_4=0; // 3 4 int char_4=0; // 3 4
@ -289,7 +289,7 @@ byte Parse_skin(SDL_Surface * gui, T_Gui_skin *gfx)
// Read the default palette // Read the default palette
Get_SDL_Palette(SDLPal, gfx->Default_palette); Get_SDL_Palette(SDLPal, gfx->Default_palette);
// Carré "noir" // Carré "noir"
gfx->Color[0] = Get_SDL_pixel_8(gui,cursor_x,cursor_y); gfx->Color[0] = Get_SDL_pixel_8(gui,cursor_x,cursor_y);
do do
{ {
@ -300,7 +300,7 @@ byte Parse_skin(SDL_Surface * gui, T_Gui_skin *gfx)
} }
color=Get_SDL_pixel_8(gui,cursor_x,cursor_y); color=Get_SDL_pixel_8(gui,cursor_x,cursor_y);
} while(color==gfx->Color[0]); } while(color==gfx->Color[0]);
// Carré "foncé" // Carré "foncé"
gfx->Color[1] = color; gfx->Color[1] = color;
do do
{ {
@ -311,7 +311,7 @@ byte Parse_skin(SDL_Surface * gui, T_Gui_skin *gfx)
} }
color=Get_SDL_pixel_8(gui,cursor_x,cursor_y); color=Get_SDL_pixel_8(gui,cursor_x,cursor_y);
} while(color==gfx->Color[1]); } while(color==gfx->Color[1]);
// Carré "clair" // Carré "clair"
gfx->Color[2] = color; gfx->Color[2] = color;
do do
{ {
@ -322,7 +322,7 @@ byte Parse_skin(SDL_Surface * gui, T_Gui_skin *gfx)
} }
color=Get_SDL_pixel_8(gui,cursor_x,cursor_y); color=Get_SDL_pixel_8(gui,cursor_x,cursor_y);
} while(color==gfx->Color[2]); } while(color==gfx->Color[2]);
// Carré "blanc" // Carré "blanc"
gfx->Color[3] = color; gfx->Color[3] = color;
do do
{ {
@ -333,7 +333,7 @@ byte Parse_skin(SDL_Surface * gui, T_Gui_skin *gfx)
} }
color=Get_SDL_pixel_8(gui,cursor_x,cursor_y); color=Get_SDL_pixel_8(gui,cursor_x,cursor_y);
} while(color==gfx->Color[3]); } while(color==gfx->Color[3]);
// Carré "transparent" // Carré "transparent"
gfx->Color_trans=color; gfx->Color_trans=color;
do do
{ {
@ -878,7 +878,7 @@ void Init_buttons(void)
0); 0);
} }
// Ici viennent les déclarations des boutons que l'on sait gérer // Ici viennent les déclarations des boutons que l'on sait gérer
Init_button(BUTTON_PAINTBRUSHES, Init_button(BUTTON_PAINTBRUSHES,
"Paintbrush choice ", "Paintbrush choice ",
@ -1241,7 +1241,7 @@ void Init_buttons(void)
Init_button(BUTTON_CHOOSE_COL, Init_button(BUTTON_CHOOSE_COL,
"Color #" , "Color #" ,
MENU_WIDTH+1,1, MENU_WIDTH+1,1,
1,32, // La largeur est mise à jour à chq chngmnt de mode 1,32, // La largeur est mise à jour à chq chngmnt de mode
BUTTON_SHAPE_NO_FRAME, BUTTON_SHAPE_NO_FRAME,
Button_Select_forecolor,Button_Select_backcolor, Button_Select_forecolor,Button_Select_backcolor,
1,1, 1,1,
@ -1430,9 +1430,9 @@ void Init_buttons(void)
// Initialisation des opérations: // Initialisation des opérations:
// Initialiseur d'une opération: // Initialiseur d'une opération:
void Init_operation(byte operation_number, void Init_operation(byte operation_number,
byte mouse_button, byte mouse_button,
@ -1450,17 +1450,17 @@ void Init_operation(byte operation_number,
} }
// Initiliseur de toutes les opérations: // Initiliseur de toutes les opérations:
void Init_operations(void) void Init_operations(void)
{ {
byte number; // Numéro de l'option en cours d'auto-initialisation byte number; // Numéro de l'option en cours d'auto-initialisation
byte Button; // Button souris en cours d'auto-initialisation byte Button; // Button souris en cours d'auto-initialisation
byte stack_index; // Taille de la pile en cours d'auto-initialisation byte stack_index; // Taille de la pile en cours d'auto-initialisation
#define HIDE_CURSOR 1 #define HIDE_CURSOR 1
#define FAST_MOUSE 1 #define FAST_MOUSE 1
// Auto-initialisation des opérations (vers des actions inoffensives) // Auto-initialisation des opérations (vers des actions inoffensives)
for (number=0;number<NB_OPERATIONS;number++) for (number=0;number<NB_OPERATIONS;number++)
for (Button=0;Button<3;Button++) for (Button=0;Button<3;Button++)
@ -1468,7 +1468,7 @@ void Init_operations(void)
Init_operation(number,Button,stack_index,Print_coordinates,0,FAST_MOUSE); Init_operation(number,Button,stack_index,Print_coordinates,0,FAST_MOUSE);
// Ici viennent les déclarations détaillées des opérations // Ici viennent les déclarations détaillées des opérations
Init_operation(OPERATION_CONTINUOUS_DRAW,1,0, Init_operation(OPERATION_CONTINUOUS_DRAW,1,0,
Freehand_mode1_1_0,HIDE_CURSOR,0); Freehand_mode1_1_0,HIDE_CURSOR,0);
Init_operation(OPERATION_CONTINUOUS_DRAW,1,2, Init_operation(OPERATION_CONTINUOUS_DRAW,1,2,
@ -1925,9 +1925,9 @@ void Init_operations(void)
//-- Définition des modes vidéo: -------------------------------------------- //-- Définition des modes vidéo: --------------------------------------------
// Définition d'un mode: // Définition d'un mode:
void Set_video_mode(short width, void Set_video_mode(short width,
short height, short height,
@ -1959,7 +1959,7 @@ void Set_video_mode(short width,
Nb_video_modes ++; Nb_video_modes ++;
} }
// Utilisé pour trier les modes retournés par SDL // Utilisé pour trier les modes retournés par SDL
int Compare_video_modes(const void *p1, const void *p2) int Compare_video_modes(const void *p1, const void *p2)
{ {
const T_Video_mode *mode1 = (const T_Video_mode *)p1; const T_Video_mode *mode1 = (const T_Video_mode *)p1;
@ -2123,7 +2123,7 @@ int Load_CFG(int reload_all)
&& (cfg_header.Version2== 0) && (cfg_header.Version2== 0)
&& (cfg_header.Beta1== 96)) && (cfg_header.Beta1== 96))
{ {
// Les touches (scancodes) sont à convertir) // Les touches (scancodes) sont à convertir)
key_conversion = 1; key_conversion = 1;
} }
// Version SDL jusqu'a 98% // Version SDL jusqu'a 98%
@ -2202,7 +2202,7 @@ int Load_CFG(int reload_all)
goto Erreur_lecture_config; goto Erreur_lecture_config;
} }
break; break;
case CHUNK_VIDEO_MODES: // Modes vidéo case CHUNK_VIDEO_MODES: // Modes vidéo
for (index=0; index<(long)(Chunk.Size/5); index++) for (index=0; index<(long)(Chunk.Size/5); index++)
{ {
if (!Read_byte(Handle, &cfg_video_mode.State) || if (!Read_byte(Handle, &cfg_video_mode.State) ||
@ -2220,9 +2220,9 @@ int Load_CFG(int reload_all)
if (Video_mode[index2].Width==cfg_video_mode.Width && if (Video_mode[index2].Width==cfg_video_mode.Width &&
Video_mode[index2].Height==cfg_video_mode.Height) Video_mode[index2].Height==cfg_video_mode.Height)
{ {
// On ne prend le paramètre utilisateur que si la résolution // On ne prend le paramètre utilisateur que si la résolution
// est effectivement supportée par SDL // est effectivement supportée par SDL
// Seules les deux petits bits sont récupérés, car les anciens fichiers // Seules les deux petits bits sont récupérés, car les anciens fichiers
// de configuration (DOS 96.5%) utilisaient d'autres bits. // de configuration (DOS 96.5%) utilisaient d'autres bits.
if (! (Video_mode[index2].State & 128)) if (! (Video_mode[index2].State & 128))
Video_mode[index2].State=cfg_video_mode.State&3; Video_mode[index2].State=cfg_video_mode.State&3;
@ -2283,7 +2283,7 @@ int Load_CFG(int reload_all)
goto Erreur_lecture_config; goto Erreur_lecture_config;
} }
break; break;
case CHUNK_GRADIENTS: // Infos sur les dégradés case CHUNK_GRADIENTS: // Infos sur les dégradés
// The gradients chunk is deprecated since the data // The gradients chunk is deprecated since the data
// is now loaded/saved in GIF and IFF formats. // is now loaded/saved in GIF and IFF formats.
// The chunk will be completely ignored. // The chunk will be completely ignored.
@ -2537,7 +2537,7 @@ int Save_CFG(void)
goto Erreur_sauvegarde_config; goto Erreur_sauvegarde_config;
} }
// D'abord compter les modes pour lesquels l'utilisateur a mis une préférence // D'abord compter les modes pour lesquels l'utilisateur a mis une préférence
modes_to_save=0; modes_to_save=0;
#if defined(__GP2X__) || defined (__WIZ__) || defined (__CAANOO__) #if defined(__GP2X__) || defined (__WIZ__) || defined (__CAANOO__)
index = 0; index = 0;
@ -2548,7 +2548,7 @@ int Save_CFG(void)
if (Video_mode[index].State==0 || Video_mode[index].State==2 || Video_mode[index].State==3) if (Video_mode[index].State==0 || Video_mode[index].State==2 || Video_mode[index].State==3)
modes_to_save++; modes_to_save++;
// Sauvegarde de l'état de chaque mode vidéo // Sauvegarde de l'état de chaque mode vidéo
Chunk.Number=CHUNK_VIDEO_MODES; Chunk.Number=CHUNK_VIDEO_MODES;
Chunk.Size=modes_to_save * 5; Chunk.Size=modes_to_save * 5;
@ -2573,7 +2573,7 @@ int Save_CFG(void)
goto Erreur_sauvegarde_config; goto Erreur_sauvegarde_config;
} }
// Ecriture des données du Shade (précédées du shade en cours) // Ecriture des données du Shade (précédées du shade en cours)
Chunk.Number=CHUNK_SHADE; Chunk.Number=CHUNK_SHADE;
Chunk.Size=8209; Chunk.Size=8209;
if (!Write_byte(Handle, Chunk.Number) || if (!Write_byte(Handle, Chunk.Number) ||
@ -2611,7 +2611,7 @@ int Save_CFG(void)
if (!Write_bytes(Handle, Stencil,256)) if (!Write_bytes(Handle, Stencil,256))
goto Erreur_sauvegarde_config; goto Erreur_sauvegarde_config;
// Sauvegarde des informations des dégradés // Sauvegarde des informations des dégradés
// The gradients chunk is deprecated since the data // The gradients chunk is deprecated since the data
// is now loaded/saved in GIF and IFF formats. // is now loaded/saved in GIF and IFF formats.
/* /*
@ -2644,7 +2644,7 @@ int Save_CFG(void)
if (!Write_byte(Handle, Smooth_matrix[index][index2])) if (!Write_byte(Handle, Smooth_matrix[index][index2]))
goto Erreur_sauvegarde_config; goto Erreur_sauvegarde_config;
// Sauvegarde des couleurs à exclure // Sauvegarde des couleurs à exclure
Chunk.Number=CHUNK_EXCLUDE_COLORS; Chunk.Number=CHUNK_EXCLUDE_COLORS;
Chunk.Size=256; Chunk.Size=256;
if (!Write_byte(Handle, Chunk.Number) || if (!Write_byte(Handle, Chunk.Number) ||
@ -2787,7 +2787,7 @@ Erreur_sauvegarde_config:
return ERROR_SAVING_CFG; return ERROR_SAVING_CFG;
} }
// (Ré)assigne toutes les valeurs de configuration par défaut // (Ré)assigne toutes les valeurs de configuration par défaut
void Set_config_defaults(void) void Set_config_defaults(void)
{ {
int index, index2; int index, index2;
@ -2820,7 +2820,7 @@ void Set_config_defaults(void)
for (index2=0; index2<512; index2++) for (index2=0; index2<512; index2++)
Shade_list[index].List[index2]=256; Shade_list[index].List[index2]=256;
} }
// Shade par défaut pour la palette standard // Shade par défaut pour la palette standard
for (index=0; index<7; index++) for (index=0; index<7; index++)
for (index2=0; index2<16; index2++) for (index2=0; index2<16; index2++)
Shade_list[0].List[index*17+index2]=index*16+index2+16; Shade_list[0].List[index*17+index2]=index*16+index2+16;

View File

@ -217,7 +217,7 @@ int Move_cursor_with_constraints()
Input_new_mouse_X=Screen_width-1; Input_new_mouse_X=Screen_width-1;
mouse_blocked=1; mouse_blocked=1;
} }
//Gestion "avancée" du curseur: interdire la descente du curseur dans le //Gestion "avancée" du curseur: interdire la descente du curseur dans le
//menu lorsqu'on est en train de travailler dans l'image //menu lorsqu'on est en train de travailler dans l'image
if (Operation_stack_size != 0) if (Operation_stack_size != 0)
{ {
@ -680,7 +680,7 @@ int Handle_joystick_press(SDL_JoyButtonEvent event)
} }
Key = (KEY_JOYBUTTON+event.button)|Key_modifiers(SDL_GetModState()); Key = (KEY_JOYBUTTON+event.button)|Key_modifiers(SDL_GetModState());
// TODO: systeme de répétition // TODO: systeme de répétition
return Move_cursor_with_constraints(); return Move_cursor_with_constraints();
} }
@ -830,7 +830,7 @@ int Directional_acceleration(int msec)
if (msec<initial_delay) if (msec<initial_delay)
return 1; return 1;
// After that, position over time is generally y = ax²+bx+c // After that, position over time is generally y = ax²+bx+c
// a = 1/accel_factor // a = 1/accel_factor
// b = 1/linear_factor // b = 1/linear_factor
// c = 1 // c = 1
@ -842,7 +842,7 @@ int Directional_acceleration(int msec)
int Get_input(int sleep_time) int Get_input(int sleep_time)
{ {
SDL_Event event; SDL_Event event;
int user_feedback_required = 0; // Flag qui indique si on doit arrêter de traiter les évènements ou si on peut enchainer int user_feedback_required = 0; // Flag qui indique si on doit arrêter de traiter les évènements ou si on peut enchainer
Color_cycling(); Color_cycling();
// Commit any pending screen update. // Commit any pending screen update.

View File

@ -3,7 +3,7 @@
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2018 Thomas Bernard Copyright 2018 Thomas Bernard
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
Copyright 2007 Adrien Destugues Copyright 2007 Adrien Destugues
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
@ -22,7 +22,7 @@
along with Grafx2; if not, see <http://www.gnu.org/licenses/> along with Grafx2; if not, see <http://www.gnu.org/licenses/>
*/ */
// Fonctions de lecture/ecriture file, gèrent les systèmes big-endian et // Fonctions de lecture/ecriture file, gèrent les systèmes big-endian et
// little-endian. // little-endian.
#include <SDL_endian.h> #include <SDL_endian.h>
@ -173,10 +173,10 @@ int Write_dword_be(FILE *file, dword dw)
return fwrite(&dw, 1, sizeof(dword), file) == sizeof(dword); return fwrite(&dw, 1, sizeof(dword), file) == sizeof(dword);
} }
// Détermine la position du dernier '/' ou '\\' dans une chaine, // Détermine la position du dernier '/' ou '\\' dans une chaine,
// typiquement pour séparer le nom de file d'un chemin. // typiquement pour séparer le nom de file d'un chemin.
// Attention, sous Windows, il faut s'attendre aux deux car // Attention, sous Windows, il faut s'attendre aux deux car
// par exemple un programme lancé sous GDB aura comme argv[0]: // par exemple un programme lancé sous GDB aura comme argv[0]:
// d:\Data\C\GFX2\grafx2/grafx2.exe // d:\Data\C\GFX2\grafx2/grafx2.exe
char * Find_last_separator(const char * str) char * Find_last_separator(const char * str)
{ {
@ -192,7 +192,7 @@ char * Find_last_separator(const char * str)
position = str; position = str;
return (char *)position; return (char *)position;
} }
// Récupère la partie "nom de file seul" d'un chemin // Récupère la partie "nom de file seul" d'un chemin
void Extract_filename(char *dest, const char *source) void Extract_filename(char *dest, const char *source)
{ {
const char * position = Find_last_separator(source); const char * position = Find_last_separator(source);
@ -202,7 +202,7 @@ void Extract_filename(char *dest, const char *source)
else else
strcpy(dest,source); strcpy(dest,source);
} }
// Récupère la partie "répertoire+/" d'un chemin. // Récupère la partie "répertoire+/" d'un chemin.
void Extract_path(char *dest, const char *source) void Extract_path(char *dest, const char *source)
{ {
char * position=NULL; char * position=NULL;
@ -315,8 +315,8 @@ int Position_last_dot_unicode(const word * fname)
} }
int File_exists(const char * fname) int File_exists(const char * fname)
// Détermine si un file passé en paramètre existe ou non dans le // Détermine si un file passé en paramètre existe ou non dans le
// répertoire courant. // répertoire courant.
{ {
#if defined(WIN32) #if defined(WIN32)
return (INVALID_FILE_ATTRIBUTES == GetFileAttributesA(fname)) ? 0 : 1; return (INVALID_FILE_ATTRIBUTES == GetFileAttributesA(fname)) ? 0 : 1;
@ -333,8 +333,8 @@ int File_exists(const char * fname)
} }
int Directory_exists(const char * directory) int Directory_exists(const char * directory)
// Détermine si un répertoire passé en paramètre existe ou non dans le // Détermine si un répertoire passé en paramètre existe ou non dans le
// répertoire courant. // répertoire courant.
{ {
#if defined(WIN32) #if defined(WIN32)
DWORD attr = GetFileAttributesA(directory); DWORD attr = GetFileAttributesA(directory);
@ -342,14 +342,14 @@ int Directory_exists(const char * directory)
return 0; return 0;
return (attr & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0; return (attr & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0;
#else #else
DIR* entry; // Structure de lecture des éléments DIR* entry; // Structure de lecture des éléments
if (strcmp(directory,PARENT_DIR)==0) if (strcmp(directory,PARENT_DIR)==0)
return 1; return 1;
else else
{ {
// On va chercher si le répertoire existe à l'aide d'un Opendir. S'il // On va chercher si le répertoire existe à l'aide d'un Opendir. S'il
// renvoie NULL c'est que le répertoire n'est pas accessible... // renvoie NULL c'est que le répertoire n'est pas accessible...
entry=opendir(directory); entry=opendir(directory);
if (entry==NULL) if (entry==NULL)
@ -450,13 +450,13 @@ void For_each_file(const char * directory_name, void Callback(const char *, cons
FindClose(h); FindClose(h);
} }
#else #else
// Pour scan de répertoire // Pour scan de répertoire
DIR* current_directory; //Répertoire courant DIR* current_directory; //Répertoire courant
struct dirent* entry; // Structure de lecture des éléments struct dirent* entry; // Structure de lecture des éléments
int filename_position; int filename_position;
strcpy(full_filename, directory_name); strcpy(full_filename, directory_name);
current_directory=opendir(directory_name); current_directory=opendir(directory_name);
if(current_directory == NULL) return; // Répertoire invalide ... if(current_directory == NULL) return; // Répertoire invalide ...
filename_position = strlen(full_filename); filename_position = strlen(full_filename);
#if defined(__AROS__) #if defined(__AROS__)
if (filename_position==0 || (strcmp(full_filename+filename_position-1,PATH_SEPARATOR) && strcmp(full_filename+filename_position-1,":"))) if (filename_position==0 || (strcmp(full_filename+filename_position-1,PATH_SEPARATOR) && strcmp(full_filename+filename_position-1,":")))

View File

@ -3,7 +3,7 @@
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2018 Thomas Bernard Copyright 2018 Thomas Bernard
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)

View File

@ -345,7 +345,7 @@ word Keysym_to_keycode(SDL_keysym keysym)
word key_code = 0; word key_code = 0;
word mod; word mod;
// On ignore shift, alt et control isolés. // On ignore shift, alt et control isolés.
if (keysym.sym == SDLK_RSHIFT || keysym.sym == SDLK_LSHIFT || if (keysym.sym == SDLK_RSHIFT || keysym.sym == SDLK_LSHIFT ||
keysym.sym == SDLK_RCTRL || keysym.sym == SDLK_LCTRL || keysym.sym == SDLK_RCTRL || keysym.sym == SDLK_LCTRL ||
keysym.sym == SDLK_RALT || keysym.sym == SDLK_LALT || keysym.sym == SDLK_RALT || keysym.sym == SDLK_LALT ||
@ -353,8 +353,8 @@ word Keysym_to_keycode(SDL_keysym keysym)
keysym.sym == SDLK_MODE) // AltGr keysym.sym == SDLK_MODE) // AltGr
return 0; return 0;
// Les touches qui n'ont qu'une valeur unicode (très rares) // Les touches qui n'ont qu'une valeur unicode (très rares)
// seront codées sur 11 bits, le 12e bit est mis à 1 (0x0800) // seront codées sur 11 bits, le 12e bit est mis à 1 (0x0800)
if (keysym.sym != 0) if (keysym.sym != 0)
key_code = keysym.sym; key_code = keysym.sym;
else if (keysym.scancode != 0) else if (keysym.scancode != 0)
@ -610,7 +610,7 @@ const char * Key_name(word key)
return buffer; return buffer;
} }
// Touches au libellé connu // Touches au libellé connu
for (index=0; index < (long)sizeof(key_labels)/(long)sizeof(T_key_label);index++) for (index=0; index < (long)sizeof(key_labels)/(long)sizeof(T_key_label);index++)
{ {
if (key == key_labels[index].keysym) if (key == key_labels[index].keysym)
@ -625,9 +625,9 @@ const char * Key_name(word key)
} }
// Obtient le caractère ANSI tapé, à partir d'un keysym. // Obtient le caractère ANSI tapé, à partir d'un keysym.
// (Valeur 32 à 255) // (Valeur 32 à 255)
// Renvoie 0 s'il n'y a pas de caractère associé (shift, backspace, etc) // Renvoie 0 s'il n'y a pas de caractère associé (shift, backspace, etc)
word Keysym_to_ANSI(SDL_keysym keysym) word Keysym_to_ANSI(SDL_keysym keysym)
{ {
// This part was removed from the MacOSX port, but I put it back for others // This part was removed from the MacOSX port, but I put it back for others
@ -667,61 +667,61 @@ word Keysym_to_ANSI(SDL_keysym keysym)
switch(keysym.unicode) switch(keysym.unicode)
{ {
case 0x8100: case 0x8100:
return '\xfc'; // ü return '\xfc'; // ü
case 0x1A20: case 0x1A20:
return '\xe9'; // é return '\xe9'; // é
case 0x201A: case 0x201A:
return '\xe8'; // è return '\xe8'; // è
case 0x9201: case 0x9201:
return '\xe2'; // â return '\xe2'; // â
case 0x1E20: case 0x1E20:
return '\xe4'; // ä return '\xe4'; // ä
case 0x2620: case 0x2620:
return '\xe0'; // à return '\xe0'; // à
case 0x2020: case 0x2020:
return '\xe5'; // å return '\xe5'; // å
case 0x2120: case 0x2120:
return '\xe7'; // ç return '\xe7'; // ç
case 0xC602: case 0xC602:
return '\xea'; // ê return '\xea'; // ê
case 0x3020: case 0x3020:
return '\xeb'; // ë return '\xeb'; // ë
case 0x6001: case 0x6001:
return '\xe8'; // è return '\xe8'; // è
case 0x3920: case 0x3920:
return '\xef'; // ï return '\xef'; // ï
case 0x5201: case 0x5201:
return '\xee'; // î return '\xee'; // î
case 0x8D00: case 0x8D00:
return '\xec'; // ì return '\xec'; // ì
case 0x1C20: case 0x1C20:
return '\xf4'; // ô return '\xf4'; // ô
case 0x1D20: case 0x1D20:
return '\xf6'; // ö return '\xf6'; // ö
case 0x2220: case 0x2220:
return '\xf2'; // ò return '\xf2'; // ò
case 0x1320: case 0x1320:
return '\xfb'; // û return '\xfb'; // û
case 0x1420: case 0x1420:
return '\xf9'; // ù return '\xf9'; // ù
case 0xDC02: case 0xDC02:
return '\xff'; // ÿ return '\xff'; // ÿ
case 0x5301: case 0x5301:
return '\xa3'; // £ return '\xa3'; // £
case 0xA000: case 0xA000:
return '\xe1'; // á return '\xe1'; // á
case 0xA100: case 0xA100:
return '\xed'; // í return '\xed'; // í
case 0xA200: case 0xA200:
return '\xf3'; // ó return '\xf3'; // ó
case 0xA300: case 0xA300:
return '\xfa'; // ú return '\xfa'; // ú
case 0xA400: case 0xA400:
return '\xf1'; // ñ return '\xf1'; // ñ
case 0xA700: case 0xA700:
return '\xba'; // º return '\xba'; // º
case 0xC600: case 0xC600:
return '\xe3'; // ã return '\xe3'; // ã
case 0x20AC: case 0x20AC:
return '\x80'; // Euro sign is 20AC in unicode, 80 in CP1252 return '\x80'; // Euro sign is 20AC in unicode, 80 in CP1252
} }
@ -745,6 +745,6 @@ word Keysym_to_ANSI(SDL_keysym keysym)
return keysym.unicode; return keysym.unicode;
} }
// Sinon c'est une touche spéciale, on retourne son scancode // Sinon c'est une touche spéciale, on retourne son scancode
return keysym.sym; return keysym.sym;
} }

View File

@ -2,7 +2,7 @@
*/ */
/* GFX2CRTC - libraw2crtc.c /* GFX2CRTC - libraw2crtc.c
* CloudStrife - 20080921 * CloudStrife - 20080921
* Diffusé sous licence libre CeCILL v2 * Diffusé sous licence libre CeCILL v2
* Voire LICENCE * Voire LICENCE
*/ */

View File

@ -2,7 +2,7 @@
*/ */
/* GFX2CRTC - libraw2crtc.h /* GFX2CRTC - libraw2crtc.h
* CloudStrife - 20080921 * CloudStrife - 20080921
* Diffusé sous licence libre CeCILL v2 * Diffusé sous licence libre CeCILL v2
* Voire LICENCE * Voire LICENCE
*/ */

View File

@ -2,7 +2,7 @@
*/ */
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2010 Alexander Filyanov Copyright 2010 Alexander Filyanov
Copyright 2009 Petter Lindquist Copyright 2009 Petter Lindquist
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
@ -125,7 +125,7 @@ void Set_pixel(T_IO_Context *context, short x_pos, short y_pos, byte color)
switch (context->Type) switch (context->Type)
{ {
// Chargement des pixels dans l'écran principal // Chargement des pixels dans l'écran principal
case CONTEXT_MAIN_IMAGE: case CONTEXT_MAIN_IMAGE:
Pixel_in_current_screen(x_pos,y_pos,color); Pixel_in_current_screen(x_pos,y_pos,color);
break; break;
@ -257,12 +257,12 @@ void Set_pixel_24b(T_IO_Context *context, short x_pos, short y_pos, byte r, byte
// Création d'une palette fake // Création d'une palette fake
void Set_palette_fake_24b(T_Palette palette) void Set_palette_fake_24b(T_Palette palette)
{ {
int color; int color;
// Génération de la palette // Génération de la palette
for (color=0;color<256;color++) for (color=0;color<256;color++)
{ {
palette[color].R=((color & 0xE0)>>5)<<5; palette[color].R=((color & 0xE0)>>5)<<5;
@ -318,13 +318,13 @@ void Pre_load(T_IO_Context *context, short width, short height, long file_size,
{ {
// Preview // Preview
case CONTEXT_PREVIEW: case CONTEXT_PREVIEW:
// Préparation du chargement d'une preview: // Préparation du chargement d'une preview:
context->Preview_bitmap=calloc(1, PREVIEW_WIDTH*PREVIEW_HEIGHT*Menu_factor_X*Menu_factor_Y); context->Preview_bitmap=calloc(1, PREVIEW_WIDTH*PREVIEW_HEIGHT*Menu_factor_X*Menu_factor_Y);
if (!context->Preview_bitmap) if (!context->Preview_bitmap)
File_error=1; File_error=1;
// Affichage des données "Image size:" // Affichage des données "Image size:"
memcpy(str, "VERY BIG!", 10); // default string memcpy(str, "VERY BIG!", 10); // default string
if (context->Original_width != 0) if (context->Original_width != 0)
{ {
@ -359,7 +359,7 @@ void Pre_load(T_IO_Context *context, short width, short height, long file_size,
} }
else else
{ {
// Le fichier fait plus de 100 Mega octets (cas très rare :)) // Le fichier fait plus de 100 Mega octets (cas très rare :))
memcpy(str,"LARGE!!",8); memcpy(str,"LARGE!!",8);
} }
Print_in_window(236,59,str,MC_Black,MC_Light); Print_in_window(236,59,str,MC_Black,MC_Light);
@ -370,10 +370,10 @@ void Pre_load(T_IO_Context *context, short width, short height, long file_size,
Print_in_window( 59,59,Get_fileformat(format)->Label,MC_Black,MC_Light); Print_in_window( 59,59,Get_fileformat(format)->Label,MC_Black,MC_Light);
} }
// On efface le commentaire précédent // On efface le commentaire précédent
Window_rectangle(45,70,32*8,8,MC_Light); Window_rectangle(45,70,32*8,8,MC_Light);
// Calcul des données nécessaires à l'affichage de la preview: // Calcul des données nécessaires à l'affichage de la preview:
if (ratio == PIXEL_WIDE && if (ratio == PIXEL_WIDE &&
Pixel_ratio != PIXEL_WIDE && Pixel_ratio != PIXEL_WIDE &&
Pixel_ratio != PIXEL_WIDE2) Pixel_ratio != PIXEL_WIDE2)
@ -398,10 +398,10 @@ void Pre_load(T_IO_Context *context, short width, short height, long file_size,
context->Preview_pos_X=Window_pos_X+183*Menu_factor_X; context->Preview_pos_X=Window_pos_X+183*Menu_factor_X;
context->Preview_pos_Y=Window_pos_Y+ 95*Menu_factor_Y; context->Preview_pos_Y=Window_pos_Y+ 95*Menu_factor_Y;
// On nettoie la zone où va s'afficher la preview: // On nettoie la zone où va s'afficher la preview:
Window_rectangle(183,95,PREVIEW_WIDTH,PREVIEW_HEIGHT,MC_Light); Window_rectangle(183,95,PREVIEW_WIDTH,PREVIEW_HEIGHT,MC_Light);
// Un update pour couvrir les 4 zones: 3 libellés plus le commentaire // Un update pour couvrir les 4 zones: 3 libellés plus le commentaire
Update_window_area(45,48,256,30); Update_window_area(45,48,256,30);
// Zone de preview // Zone de preview
Update_window_area(183,95,PREVIEW_WIDTH,PREVIEW_HEIGHT); Update_window_area(183,95,PREVIEW_WIDTH,PREVIEW_HEIGHT);
@ -411,9 +411,9 @@ void Pre_load(T_IO_Context *context, short width, short height, long file_size,
case CONTEXT_MAIN_IMAGE: case CONTEXT_MAIN_IMAGE:
if (Backup_new_image(1,width,height)) if (Backup_new_image(1,width,height))
{ {
// La nouvelle page a pu être allouée, elle est pour l'instant pleine // La nouvelle page a pu être allouée, elle est pour l'instant pleine
// de 0s. Elle fait Main_image_width de large. // de 0s. Elle fait Main_image_width de large.
// Normalement tout va bien, tout est sous contrôle... // Normalement tout va bien, tout est sous contrôle...
// Load into layer 0, by default. // Load into layer 0, by default.
context->Nb_layers=1; context->Nb_layers=1;
@ -428,7 +428,7 @@ void Pre_load(T_IO_Context *context, short width, short height, long file_size,
else else
{ {
// Afficher un message d'erreur // Afficher un message d'erreur
// Pour être sûr que ce soit lisible. // Pour être sûr que ce soit lisible.
Compute_optimal_menu_colors(context->Palette); Compute_optimal_menu_colors(context->Palette);
Message_out_of_memory(); Message_out_of_memory();
File_error=1; // 1 => On n'a pas perdu l'image courante File_error=1; // 1 => On n'a pas perdu l'image courante
@ -502,7 +502,7 @@ void Pre_load(T_IO_Context *context, short width, short height, long file_size,
} }
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// Gestion des lectures et écritures // // Gestion des lectures et écritures //
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
void Write_one_byte(FILE *file, byte b) void Write_one_byte(FILE *file, byte b)
@ -513,12 +513,12 @@ void Write_one_byte(FILE *file, byte b)
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// -------- Modifier la valeur du code d'erreur d'accès à un fichier -------- // -------- Modifier la valeur du code d'erreur d'accès à un fichier --------
// On n'est pas obligé d'utiliser cette fonction à chaque fois mais il est // On n'est pas obligé d'utiliser cette fonction à chaque fois mais il est
// important de l'utiliser dans les cas du type: // important de l'utiliser dans les cas du type:
// if (!File_error) *** else File_error=***; // if (!File_error) *** else File_error=***;
// En fait, dans le cas où l'on modifie File_error alors qu'elle contient // En fait, dans le cas où l'on modifie File_error alors qu'elle contient
// dèjà un code d'erreur. // dèjà un code d'erreur.
void Set_file_error(int value) void Set_file_error(int value)
{ {
if (File_error>=0) if (File_error>=0)
@ -530,7 +530,7 @@ void Set_file_error(int value)
void Load_image(T_IO_Context *context) void Load_image(T_IO_Context *context)
{ {
unsigned int index; // index de balayage des formats unsigned int index; // index de balayage des formats
const T_Format *format = &(File_formats[FORMAT_ALL_FILES+1]); // Format du fichier à charger const T_Format *format = &(File_formats[FORMAT_ALL_FILES+1]); // Format du fichier à charger
int i; int i;
byte old_cursor_shape; byte old_cursor_shape;
FILE * f; FILE * f;
@ -538,7 +538,7 @@ void Load_image(T_IO_Context *context)
// Not sure it's the best place... // Not sure it's the best place...
context->Color_cycles=0; context->Color_cycles=0;
// On place par défaut File_error à vrai au cas où on ne sache pas // On place par défaut File_error à vrai au cas où on ne sache pas
// charger le format du fichier: // charger le format du fichier:
File_error=1; File_error=1;
@ -559,8 +559,8 @@ void Load_image(T_IO_Context *context)
if (File_error) if (File_error)
{ {
// Sinon, on va devoir scanner les différents formats qu'on connait pour // Sinon, on va devoir scanner les différents formats qu'on connait pour
// savoir à quel format est le fichier: // savoir à quel format est le fichier:
for (index=0; index < Nb_known_formats(); index++) for (index=0; index < Nb_known_formats(); index++)
{ {
format = Get_fileformat(index); format = Get_fileformat(index);
@ -571,7 +571,7 @@ void Load_image(T_IO_Context *context)
fseek(f, 0, SEEK_SET); // rewind fseek(f, 0, SEEK_SET); // rewind
// On appelle le testeur du format: // On appelle le testeur du format:
format->Test(context, f); format->Test(context, f);
// On s'arrête si le fichier est au bon format: // On s'arrête si le fichier est au bon format:
if (File_error==0) if (File_error==0)
break; break;
} }
@ -593,8 +593,8 @@ void Load_image(T_IO_Context *context)
if (File_error) if (File_error)
{ {
// Sinon, l'appelant sera au courant de l'échec grace à File_error; // Sinon, l'appelant sera au courant de l'échec grace à File_error;
// et si on s'apprêtait à faire un chargement définitif de l'image (pas // et si on s'apprêtait à faire un chargement définitif de l'image (pas
// une preview), alors on flash l'utilisateur. // une preview), alors on flash l'utilisateur.
//if (Pixel_load_function!=Pixel_load_in_preview) //if (Pixel_load_function!=Pixel_load_in_preview)
// Error(0); // Error(0);
@ -602,12 +602,12 @@ void Load_image(T_IO_Context *context)
} }
} }
else else
// Si on a su déterminer avec succès le format du fichier: // Si on a su déterminer avec succès le format du fichier:
{ {
context->Format = format->Identifier; context->Format = format->Identifier;
// On peut charger le fichier: // On peut charger le fichier:
// Dans certains cas il est possible que le chargement plante // Dans certains cas il est possible que le chargement plante
// après avoir modifié la palette. TODO // après avoir modifié la palette. TODO
format->Load(context); format->Load(context);
} }
@ -754,7 +754,7 @@ void Load_image(T_IO_Context *context)
Main.backups->Pages->Filename_unicode[0] = 0; Main.backups->Pages->Filename_unicode[0] = 0;
} }
// On considère que l'image chargée n'est plus modifiée // On considère que l'image chargée n'est plus modifiée
Main.image_is_modified=0; Main.image_is_modified=0;
// Et on documente la variable Main_fileformat avec la valeur: // Et on documente la variable Main_fileformat avec la valeur:
Main.fileformat=format->Identifier; Main.fileformat=format->Identifier;
@ -801,15 +801,15 @@ void Load_image(T_IO_Context *context)
} }
else if (File_error!=1) else if (File_error!=1)
{ {
// On considère que l'image chargée est encore modifiée // On considère que l'image chargée est encore modifiée
Main.image_is_modified=1; Main.image_is_modified=1;
// Et on documente la variable Main_fileformat avec la valeur: // Et on documente la variable Main_fileformat avec la valeur:
Main.fileformat=format->Identifier; Main.fileformat=format->Identifier;
} }
else else
{ {
// Dans ce cas, on sait que l'image n'a pas changé, mais ses // Dans ce cas, on sait que l'image n'a pas changé, mais ses
// paramètres (dimension, palette, ...) si. Donc on les restaures. // paramètres (dimension, palette, ...) si. Donc on les restaures.
Download_infos_page_main(Main.backups->Pages); Download_infos_page_main(Main.backups->Pages);
} }
} }
@ -956,7 +956,7 @@ void Save_image(T_IO_Context *context)
{ {
const T_Format *format; const T_Format *format;
// On place par défaut File_error à vrai au cas où on ne sache pas // On place par défaut File_error à vrai au cas où on ne sache pas
// sauver le format du fichier: (Est-ce vraiment utile??? Je ne crois pas!) // sauver le format du fichier: (Est-ce vraiment utile??? Je ne crois pas!)
File_error=1; File_error=1;
@ -1204,7 +1204,7 @@ void Emergency_backup(const char *fname, byte *source, int width, int height, T_
return; return;
} }
// Ouf, sauvé // Ouf, sauvé
fclose(file); fclose(file);
} }

View File

@ -2,7 +2,7 @@
*/ */
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2009 Pasi Kallinen Copyright 2009 Pasi Kallinen
Copyright 2008 Peter Gordon Copyright 2008 Peter Gordon
Copyright 2008 Franck Charlet Copyright 2008 Franck Charlet
@ -97,7 +97,7 @@ extern char Program_version[]; // generated in pversion.c
static int setsize_width; static int setsize_width;
static int setsize_height; static int setsize_height;
//--- Affichage de la syntaxe, et de la liste des modes vidéos disponibles --- //--- Affichage de la syntaxe, et de la liste des modes vidéos disponibles ---
void Display_syntax(void) void Display_syntax(void)
{ {
int mode_index; int mode_index;
@ -152,8 +152,8 @@ void Error_function(int error_code, const char *filename, int line_number, const
if (error_code==0) if (error_code==0)
{ {
// L'erreur 0 n'est pas une vraie erreur, elle fait seulement un flash rouge de l'écran pour dire qu'il y a un problème. // L'erreur 0 n'est pas une vraie erreur, elle fait seulement un flash rouge de l'écran pour dire qu'il y a un problème.
// Toutes les autres erreurs déclenchent toujours une sortie en catastrophe du programme ! // Toutes les autres erreurs déclenchent toujours une sortie en catastrophe du programme !
memcpy(backup_palette, Get_current_palette(), sizeof(T_Palette)); memcpy(backup_palette, Get_current_palette(), sizeof(T_Palette));
memcpy(temp_palette, backup_palette, sizeof(T_Palette)); memcpy(temp_palette, backup_palette, sizeof(T_Palette));
for (index=0;index<=255;index++) for (index=0;index<=255;index++)
@ -444,10 +444,10 @@ int Analyze_command_line(int argc, char * argv[], char *main_filename, char *mai
} }
break; break;
default: default:
// 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
if (file_in_command_line > 1) if (file_in_command_line > 1)
{ {
// Il y a déjà 2 noms de fichiers et on vient d'en trouver un 3ème // Il y a déjà 2 noms de fichiers et on vient d'en trouver un 3ème
Error(ERROR_COMMAND_LINE); Error(ERROR_COMMAND_LINE);
Display_syntax(); Display_syntax();
exit(0); exit(0);
@ -534,9 +534,9 @@ int Init_program(int argc,char * argv[])
#endif #endif
#endif /* ENABLE_FILENAMES_ICONV */ #endif /* ENABLE_FILENAMES_ICONV */
// On crée dès maintenant les descripteurs des listes de pages pour la page // On crée dès maintenant les descripteurs des listes de pages pour la page
// principale et la page de brouillon afin que leurs champs ne soient pas // principale et la page de brouillon afin que leurs champs ne soient pas
// invalide lors des appels aux multiples fonctions manipulées à // invalide lors des appels aux multiples fonctions manipulées à
// l'initialisation du programme. // l'initialisation du programme.
Main.backups=(T_List_of_pages *)malloc(sizeof(T_List_of_pages)); Main.backups=(T_List_of_pages *)malloc(sizeof(T_List_of_pages));
Spare.backups=(T_List_of_pages *)malloc(sizeof(T_List_of_pages)); Spare.backups=(T_List_of_pages *)malloc(sizeof(T_List_of_pages));
@ -549,13 +549,13 @@ int Init_program(int argc,char * argv[])
Set_data_directory(program_directory,Data_directory); Set_data_directory(program_directory,Data_directory);
// Choose directory for settings (read/write) // Choose directory for settings (read/write)
Set_config_directory(program_directory,Config_directory); Set_config_directory(program_directory,Config_directory);
// On détermine le répertoire courant: // On détermine le répertoire courant:
Get_current_directory(Main.selector.Directory,Main.selector.Directory_unicode,MAX_PATH_CHARACTERS); Get_current_directory(Main.selector.Directory,Main.selector.Directory_unicode,MAX_PATH_CHARACTERS);
// On en profite pour le mémoriser dans le répertoire principal: // On en profite pour le mémoriser dans le répertoire principal:
strcpy(Initial_directory,Main.selector.Directory); strcpy(Initial_directory,Main.selector.Directory);
// On initialise les données sur le nom de fichier de l'image de brouillon: // On initialise les données sur le nom de fichier de l'image de brouillon:
strcpy(Spare.selector.Directory,Main.selector.Directory); strcpy(Spare.selector.Directory,Main.selector.Directory);
Main.fileformat=DEFAULT_FILEFORMAT; Main.fileformat=DEFAULT_FILEFORMAT;
@ -570,8 +570,8 @@ int Init_program(int argc,char * argv[])
// On initialise ce qu'il faut pour que les fileselects ne plantent pas: // On initialise ce qu'il faut pour que les fileselects ne plantent pas:
Main.selector.Position=0; // Au début, le fileselect est en haut de la liste des fichiers Main.selector.Position=0; // Au début, le fileselect est en haut de la liste des fichiers
Main.selector.Offset=0; // Au début, le fileselect est en haut de la liste des fichiers Main.selector.Offset=0; // Au début, le fileselect est en haut de la liste des fichiers
Main.selector.Format_filter=FORMAT_ALL_IMAGES; Main.selector.Format_filter=FORMAT_ALL_IMAGES;
Main.current_layer=0; Main.current_layer=0;
@ -640,26 +640,26 @@ int Init_program(int argc,char * argv[])
// Texte // Texte
Init_text(); Init_text();
// On initialise tous les modes vidéo // On initialise tous les modes vidéo
Set_all_video_modes(); Set_all_video_modes();
Pixel_ratio=PIXEL_SIMPLE; 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_is_required=0; Quit_is_required=0;
Quitting=0; Quitting=0;
// Données sur l'état du menu: // Données sur l'état du menu:
Menu_is_visible=1; Menu_is_visible=1;
// Données sur les couleurs et la palette: // Données sur les couleurs et la palette:
First_color_in_palette=0; First_color_in_palette=0;
// Données sur le curseur: // Données sur le curseur:
Cursor_shape=CURSOR_SHAPE_TARGET; Cursor_shape=CURSOR_SHAPE_TARGET;
Cursor_hidden=0; Cursor_hidden=0;
// Données sur le pinceau: // Données sur le pinceau:
Paintbrush_X=0; Paintbrush_X=0;
Paintbrush_Y=0; Paintbrush_Y=0;
Paintbrush_hidden=0; Paintbrush_hidden=0;
// On initialise tout ce qui concerne les opérations et les effets // On initialise tout ce qui concerne les opérations et les effets
Operation_stack_size=0; Operation_stack_size=0;
Selected_freehand_mode=OPERATION_CONTINUOUS_DRAW; Selected_freehand_mode=OPERATION_CONTINUOUS_DRAW;
Selected_line_mode =OPERATION_LINE; Selected_line_mode =OPERATION_LINE;
@ -677,10 +677,10 @@ int Init_program(int argc,char * argv[])
// On initialise les infos du mode smooth: // On initialise les infos du mode smooth:
Smooth_mode=0; Smooth_mode=0;
// On initialise les infos du mode shade: // On initialise les infos du mode shade:
Shade_mode=0; // Les autres infos du Shade sont chargées avec la config Shade_mode=0; // Les autres infos du Shade sont chargées avec la config
Quick_shade_mode=0; // idem Quick_shade_mode=0; // idem
// On initialise les infos sur les dégradés: // On initialise les infos sur les dégradés:
Gradient_pixel =Display_pixel; // Les autres infos sont chargées avec la config Gradient_pixel =Display_pixel; // Les autres infos sont chargées avec la config
// On initialise les infos de la grille: // On initialise les infos de la grille:
Snap_mode=0; Snap_mode=0;
Snap_width=8; Snap_width=8;
@ -688,13 +688,13 @@ int Init_program(int argc,char * argv[])
Snap_offset_X=0; Snap_offset_X=0;
Snap_offset_Y=0; Snap_offset_Y=0;
// On initialise les infos du mode Colorize: // On initialise les infos du mode Colorize:
Colorize_mode=0; // Mode colorize inactif par défaut Colorize_mode=0; // Mode colorize inactif par défaut
Colorize_opacity=50; // Une interpolation de 50% par défaut Colorize_opacity=50; // Une interpolation de 50% par défaut
Colorize_current_mode=0; // Par défaut, la méthode par interpolation Colorize_current_mode=0; // Par défaut, la méthode par interpolation
Compute_colorize_table(); Compute_colorize_table();
// On initialise les infos du mode Tiling: // On initialise les infos du mode Tiling:
Tiling_mode=0; // Pas besoin d'initialiser les décalages car ça se fait Tiling_mode=0; // Pas besoin d'initialiser les décalages car ça se fait
// en prenant une brosse (toujours mis à 0). // en prenant une brosse (toujours mis à 0).
// On initialise les infos du mode Mask: // On initialise les infos du mode Mask:
Mask_mode=0; Mask_mode=0;
@ -704,11 +704,11 @@ int Init_program(int argc,char * argv[])
Airbrush_delay=1; Airbrush_delay=1;
Airbrush_mono_flow=10; Airbrush_mono_flow=10;
memset(Airbrush_multi_flow,0,256); memset(Airbrush_multi_flow,0,256);
srand(time(NULL)); // On randomize un peu tout ça... srand(time(NULL)); // On randomize un peu tout ça...
// Initialisation des boutons // Initialisation des boutons
Init_buttons(); Init_buttons();
// Initialisation des opérations // Initialisation des opérations
Init_operations(); Init_operations();
// Initialize the brush container // Initialize the brush container
@ -741,7 +741,7 @@ int Init_program(int argc,char * argv[])
switch(Load_CFG(1)) switch(Load_CFG(1))
{ {
case ERROR_CFG_MISSING: case ERROR_CFG_MISSING:
// Pas un problème, on a les valeurs par défaut. // Pas un problème, on a les valeurs par défaut.
break; break;
case ERROR_CFG_CORRUPTED: case ERROR_CFG_CORRUPTED:
DEBUG("Corrupted CFG file.",0); DEBUG("Corrupted CFG file.",0);
@ -807,7 +807,7 @@ int Init_program(int argc,char * argv[])
Fore_color=Best_color_range(255,255,255,Config.Palette_cells_X*Config.Palette_cells_Y); Fore_color=Best_color_range(255,255,255,Config.Palette_cells_X*Config.Palette_cells_Y);
Back_color=Best_color_range(0,0,0,Config.Palette_cells_X*Config.Palette_cells_Y); Back_color=Best_color_range(0,0,0,Config.Palette_cells_X*Config.Palette_cells_Y);
// Allocation de mémoire pour la brosse // Allocation de mémoire pour la brosse
if (!(Brush =(byte *)malloc( 1* 1))) Error(ERROR_MEMORY); if (!(Brush =(byte *)malloc( 1* 1))) Error(ERROR_MEMORY);
if (!(Smear_brush =(byte *)malloc(MAX_PAINTBRUSH_SIZE*MAX_PAINTBRUSH_SIZE))) Error(ERROR_MEMORY); if (!(Smear_brush =(byte *)malloc(MAX_PAINTBRUSH_SIZE*MAX_PAINTBRUSH_SIZE))) Error(ERROR_MEMORY);
@ -848,13 +848,13 @@ int Init_program(int argc,char * argv[])
starting_image_mode = Config.Default_mode_layers ? starting_image_mode = Config.Default_mode_layers ?
IMAGE_MODE_LAYERED : IMAGE_MODE_ANIMATION; IMAGE_MODE_LAYERED : IMAGE_MODE_ANIMATION;
// 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 (Init_all_backup_lists(starting_image_mode , Screen_width, Screen_height)==0) if (Init_all_backup_lists(starting_image_mode , Screen_width, Screen_height)==0)
Error(ERROR_MEMORY); Error(ERROR_MEMORY);
// Update toolbars' visibility, now that the current image has a mode // Update toolbars' visibility, now that the current image has a mode
Check_menu_mode(); Check_menu_mode();
// Nettoyage de l'écran virtuel (les autres recevront celui-ci par copie) // Nettoyage de l'écran virtuel (les autres recevront celui-ci par copie)
memset(Main_screen,0,Main.image_width*Main.image_height); memset(Main_screen,0,Main.image_width*Main.image_height);
// If image size was specified on command line, set that now // If image size was specified on command line, set that now
@ -890,7 +890,7 @@ int Init_program(int argc,char * argv[])
Draw_menu_button(BUTTON_PAL_LEFT,BUTTON_RELEASED); Draw_menu_button(BUTTON_PAL_LEFT,BUTTON_RELEASED);
Draw_menu_button(BUTTON_PAL_RIGHT,BUTTON_RELEASED); Draw_menu_button(BUTTON_PAL_RIGHT,BUTTON_RELEASED);
// On affiche le curseur pour débuter correctement l'état du programme: // On affiche le curseur pour débuter correctement l'état du programme:
Display_cursor(); Display_cursor();
Spare.image_is_modified=0; Spare.image_is_modified=0;
@ -899,10 +899,10 @@ int Init_program(int argc,char * argv[])
// Gestionnaire de signaux, quand il ne reste plus aucun espoir // Gestionnaire de signaux, quand il ne reste plus aucun espoir
Init_sighandler(); Init_sighandler();
// Le programme débute en mode de dessin à la main // Le programme débute en mode de dessin à la main
Select_button(BUTTON_DRAW,LEFT_SIDE); Select_button(BUTTON_DRAW,LEFT_SIDE);
// On initialise la brosse initiale à 1 pixel blanc: // On initialise la brosse initiale à 1 pixel blanc:
Brush_width=1; Brush_width=1;
Brush_height=1; Brush_height=1;
for (temp=0;temp<256;temp++) for (temp=0;temp<256;temp++)
@ -919,7 +919,7 @@ int Init_program(int argc,char * argv[])
strcpy(Main.selector.Directory, main_directory); strcpy(Main.selector.Directory, main_directory);
} }
// Test de recuperation de fichiers sauvés // Test de recuperation de fichiers sauvés
switch (Check_recovery()) switch (Check_recovery())
{ {
T_IO_Context context; T_IO_Context context;
@ -1057,11 +1057,11 @@ void Program_shutdown(void)
// Remove the safety backups, this is normal exit // Remove the safety backups, this is normal exit
Delete_safety_backups(); Delete_safety_backups();
// On libère le buffer de gestion de lignes // On libère le buffer de gestion de lignes
free(Horizontal_line_buffer); free(Horizontal_line_buffer);
Horizontal_line_buffer = NULL; Horizontal_line_buffer = NULL;
// On libère le pinceau spécial // On libère le pinceau spécial
free(Paintbrush_sprite); free(Paintbrush_sprite);
Paintbrush_sprite = NULL; Paintbrush_sprite = NULL;
@ -1095,10 +1095,10 @@ void Program_shutdown(void)
Unicode_fonts = ufont; Unicode_fonts = ufont;
} }
// On prend bien soin de passer dans le répertoire initial: // On prend bien soin de passer dans le répertoire initial:
if (Change_directory(Initial_directory)==0) if (Change_directory(Initial_directory)==0)
{ {
// On sauvegarde les données dans le .CFG et dans le .INI // On sauvegarde les données dans le .CFG et dans le .INI
if (Config.Auto_save) if (Config.Auto_save)
{ {
return_code=Save_CFG(); return_code=Save_CFG();
@ -1143,7 +1143,7 @@ void Program_shutdown(void)
} }
// -------------------------- Procédure principale --------------------------- // -------------------------- Procédure principale ---------------------------
int main(int argc,char * argv[]) int main(int argc,char * argv[])
{ {

View File

@ -2,7 +2,7 @@
*/ */
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
Copyright 2008 Franck Charlet Copyright 2008 Franck Charlet
Copyright 2007 Adrien Destugues Copyright 2007 Adrien Destugues
@ -113,7 +113,7 @@ word Count_used_colors_screen_area(dword* usage, word start_x, word start_y,
usage[color]++; //Un point de plus pour cette couleur usage[color]++; //Un point de plus pour cette couleur
} }
} }
//On va maintenant compter dans la table les couleurs utilisées: //On va maintenant compter dans la table les couleurs utilisées:
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
{ {
if (usage[i]!=0) if (usage[i]!=0)
@ -136,7 +136,7 @@ word Count_used_colors_area(dword* usage, word start_x, word start_y,
// Init usage table // Init usage table
for (i = 0; i < 256; i++) usage[i]=0; for (i = 0; i < 256; i++) usage[i]=0;
// On parcourt l'écran courant pour compter les utilisations des couleurs // On parcourt l'écran courant pour compter les utilisations des couleurs
for (y = 0; y < height; y++) for (y = 0; y < height; y++)
{ {
for (x = 0; x < width; x++) for (x = 0; x < width; x++)
@ -147,7 +147,7 @@ word Count_used_colors_area(dword* usage, word start_x, word start_y,
} }
} }
//On va maintenant compter dans la table les couleurs utilisées: //On va maintenant compter dans la table les couleurs utilisées:
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
{ {
if (usage[i]!=0) if (usage[i]!=0)
@ -197,7 +197,7 @@ void Set_color(byte color, byte red, byte green, byte blue)
void Wait_end_of_click(void) void Wait_end_of_click(void)
{ {
// On désactive tous les raccourcis clavier // On désactive tous les raccourcis clavier
while(Mouse_K) while(Mouse_K)
Get_input(20); Get_input(20);
@ -233,7 +233,7 @@ void Clear_current_image(byte color)
} }
void Init_chrono(dword delay) void Init_chrono(dword delay)
// Démarrer le chrono // Démarrer le chrono
{ {
Timer_delay = delay; Timer_delay = delay;
Timer_start = SDL_GetTicks()/55; Timer_start = SDL_GetTicks()/55;
@ -265,7 +265,7 @@ void Copy_part_of_image_to_another(byte * source,word source_x,word source_y,wor
{ {
memcpy(edi,esi,width); memcpy(edi,esi,width);
// Passe à la ligne suivante // Passe à la ligne suivante
esi+=source_width; esi+=source_width;
edi+=destination_width; edi+=destination_width;
} }
@ -340,7 +340,7 @@ void Remap_general_lowlevel(byte * conversion_table,byte * in_buffer, byte *out_
void Copy_image_to_brush(short start_x,short start_y,short Brush_width,short Brush_height,word image_width) void Copy_image_to_brush(short start_x,short start_y,short Brush_width,short Brush_height,word image_width)
{ {
byte* src=start_y*image_width+start_x+Main.backups->Pages->Image[Main.current_layer].Pixels; //Adr départ image (ESI) byte* src=start_y*image_width+start_x+Main.backups->Pages->Image[Main.current_layer].Pixels; //Adr départ image (ESI)
byte* dest=Brush_original_pixels; //Adr dest brosse (EDI) byte* dest=Brush_original_pixels; //Adr dest brosse (EDI)
int dx; int dx;
@ -351,7 +351,7 @@ void Copy_image_to_brush(short start_x,short start_y,short Brush_width,short Bru
// On fait une copie de la ligne // On fait une copie de la ligne
memcpy(dest,src,Brush_width); memcpy(dest,src,Brush_width);
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width; src+=image_width;
dest+=Brush_width; dest+=Brush_width;
} }
@ -436,7 +436,7 @@ byte Effect_interpolated_colorize (word x,word y,byte color)
byte red_under=Main.palette[color_under].R; byte red_under=Main.palette[color_under].R;
byte red=Main.palette[color].R; byte red=Main.palette[color].R;
// On récupère les 3 composantes RVB // On récupère les 3 composantes RVB
// blue // blue
blue = (Factors_inv_table[blue] blue = (Factors_inv_table[blue]
@ -513,7 +513,7 @@ void Flip_Y_lowlevel(byte *src, short width, short height)
while(ESI < EDI) while(ESI < EDI)
{ {
// Il faut inverser les lignes pointées par ESI et // Il faut inverser les lignes pointées par ESI et
// EDI ("Brush_width" octets en tout) // EDI ("Brush_width" octets en tout)
for(cx = width;cx>0;cx--) for(cx = width;cx>0;cx--)
@ -526,9 +526,9 @@ void Flip_Y_lowlevel(byte *src, short width, short height)
} }
// On change de ligne : // On change de ligne :
// ESI pointe déjà sur le début de la ligne suivante // ESI pointe déjà sur le début de la ligne suivante
// EDI pointe sur la fin de la ligne en cours, il // EDI pointe sur la fin de la ligne en cours, il
// doit pointer sur le début de la précédente... // doit pointer sur le début de la précédente...
EDI -= 2 * width; // On recule de 2 lignes EDI -= 2 * width; // On recule de 2 lignes
} }
} }
@ -550,7 +550,7 @@ void Flip_X_lowlevel(byte *src, short width, short height)
line_start = ESI; line_start = ESI;
line_end = EDI; line_end = EDI;
// On échange par colonnes // On échange par colonnes
for(cx=height;cx>0;cx--) for(cx=height;cx>0;cx--)
{ {
tmp=*ESI; tmp=*ESI;
@ -562,16 +562,16 @@ void Flip_X_lowlevel(byte *src, short width, short height)
// On change de colonne // On change de colonne
// ESI > colonne suivante // ESI > colonne suivante
// EDI > colonne précédente // EDI > colonne précédente
ESI = line_start + 1; ESI = line_start + 1;
EDI = line_end - 1; EDI = line_end - 1;
} }
} }
// Rotate a pixel buffer 180º on itself. // Rotate a pixel buffer 180º on itself.
void Rotate_180_deg_lowlevel(byte *src, short width, short height) void Rotate_180_deg_lowlevel(byte *src, short width, short height)
{ {
// ESI pointe sur la partie supérieure de la brosse // ESI pointe sur la partie supérieure de la brosse
// EDI pointe sur la partie basse // EDI pointe sur la partie basse
byte* ESI = src; byte* ESI = src;
byte* EDI = src + height*width - 1; byte* EDI = src + height*width - 1;
@ -591,9 +591,9 @@ void Rotate_180_deg_lowlevel(byte *src, short width, short height)
while(ESI < EDI) while(ESI < EDI)
{ {
// On échange les deux lignes pointées par EDI et // On échange les deux lignes pointées par EDI et
// ESI (Brush_width octets) // ESI (Brush_width octets)
// En même temps, on échange les pixels, donc EDI // En même temps, on échange les pixels, donc EDI
// pointe sur la FIN de sa ligne // pointe sur la FIN de sa ligne
for(cx=width;cx>0;cx--) for(cx=width;cx>0;cx--)
@ -614,8 +614,8 @@ void Rescale(byte *src_buffer, short src_width, short src_height, byte *dst_buff
int x_pos_in_brush; // Position courante dans l'ancienne brosse int x_pos_in_brush; // Position courante dans l'ancienne brosse
int y_pos_in_brush; int y_pos_in_brush;
int initial_x_pos; // Position X de début de parcours de ligne int initial_x_pos; // Position X de début de parcours de ligne
int initial_y_pos; // Position Y de début de parcours de ligne int initial_y_pos; // Position Y de début de parcours de ligne
int delta_x, delta_y; int delta_x, delta_y;
@ -642,13 +642,13 @@ void Rescale(byte *src_buffer, short src_width, short src_height, byte *dst_buff
// Pour chaque ligne // Pour chaque ligne
for (line=0;line<dst_height;line++) for (line=0;line<dst_height;line++)
{ {
// On passe à la ligne de brosse suivante: // On passe à la ligne de brosse suivante:
y_pos_in_brush = initial_y_pos + line * delta_y / dst_height; y_pos_in_brush = initial_y_pos + line * delta_y / dst_height;
// Pour chaque colonne: // Pour chaque colonne:
for (column=0;column<dst_width;column++) for (column=0;column<dst_width;column++)
{ {
// On passe à la colonne de brosse suivante: // On passe à la colonne de brosse suivante:
x_pos_in_brush = initial_x_pos + column * delta_x / dst_width; x_pos_in_brush = initial_x_pos + column * delta_x / dst_width;
// On copie le pixel: // On copie le pixel:
dst_buffer[offset]=*(src_buffer + x_pos_in_brush + y_pos_in_brush * src_width); dst_buffer[offset]=*(src_buffer + x_pos_in_brush + y_pos_in_brush * src_width);
@ -663,7 +663,7 @@ void Scroll_picture(byte * main_src, byte * main_dest, short x_offset,short y_of
{ {
byte* src = main_src; //source de la copie byte* src = main_src; //source de la copie
byte* dest = main_dest + y_offset * Main.image_width + x_offset; byte* dest = main_dest + y_offset * Main.image_width + x_offset;
const word length = Main.image_width - x_offset; // Nombre de pixels à copier à droite const word length = Main.image_width - x_offset; // Nombre de pixels à copier à droite
word y; word y;
for(y = Main.image_height - y_offset;y>0;y--) for(y = Main.image_height - y_offset;y>0;y--)
{ {
@ -671,7 +671,7 @@ void Scroll_picture(byte * main_src, byte * main_dest, short x_offset,short y_of
memcpy(dest,src,length); memcpy(dest,src,length);
memcpy(dest - x_offset,src+length,x_offset); memcpy(dest - x_offset,src+length,x_offset);
// On passe à la ligne suivante // On passe à la ligne suivante
dest += Main.image_width; dest += Main.image_width;
src += Main.image_width; src += Main.image_width;
} }
@ -740,7 +740,7 @@ void Atari_Memory_free(unsigned long *stRam,unsigned long *ttRam){
*ttRam = Mxalloc(-1L,1); *ttRam = Mxalloc(-1L,1);
} }
#else #else
// Indique quelle est la mémoire disponible // Indique quelle est la mémoire disponible
unsigned long Memory_free(void) unsigned long Memory_free(void)
{ {
// Memory is no longer relevant. If there is ANY problem or doubt here, // Memory is no longer relevant. If there is ANY problem or doubt here,
@ -789,7 +789,7 @@ unsigned long Memory_free(void)
// Arrondir un nombre réel à la valeur entière la plus proche // Arrondir un nombre réel à la valeur entière la plus proche
// TODO : this should probably be replaced with round() from C99... // TODO : this should probably be replaced with round() from C99...
short Round(float value) short Round(float value)
{ {
@ -804,7 +804,7 @@ short Round(float value)
} }
// Arrondir le résultat d'une division à la valeur entière supérieure // Arrondir le résultat d'une division à la valeur entière supérieure
short Round_div_max(short numerator,short divisor) short Round_div_max(short numerator,short divisor)
{ {
if (!(numerator % divisor)) if (!(numerator % divisor))
@ -858,7 +858,7 @@ int Popcount_dword(dword x)
} }
// Fonction retournant le libellé d'une mode (ex: " 320x200") // Fonction retournant le libellé d'une mode (ex: " 320x200")
char * Mode_label(int mode) char * Mode_label(int mode)
{ {
static char str[24]; static char str[24];
@ -870,12 +870,12 @@ char * Mode_label(int mode)
} }
// Trouve un mode video à partir d'une chaine: soit "window", // Trouve un mode video à partir d'une chaine: soit "window",
// soit de la forme "320x200" // soit de la forme "320x200"
// Renvoie -1 si la chaine n'est pas convertible // Renvoie -1 si la chaine n'est pas convertible
int Convert_videomode_arg(const char *argument) int Convert_videomode_arg(const char *argument)
{ {
// Je suis paresseux alors je vais juste tester les libellés // Je suis paresseux alors je vais juste tester les libellés
int mode_index; int mode_index;
for (mode_index=0; mode_index<Nb_video_modes; mode_index++) for (mode_index=0; mode_index<Nb_video_modes; mode_index++)
// Attention les vieilles fonctions de lecture .ini mettent tout en MAJUSCULE. // Attention les vieilles fonctions de lecture .ini mettent tout en MAJUSCULE.

View File

@ -116,12 +116,12 @@ void Zoom_a_line(byte * original_line,byte * zoomed_line,word factor,word width)
void Copy_part_of_image_to_another(byte * source,word source_x,word source_y,word width,word height,word source_width,byte * dest,word dest_x,word dest_y,word destination_width); void Copy_part_of_image_to_another(byte * source,word source_x,word source_y,word width,word height,word source_width,byte * dest,word dest_x,word dest_y,word destination_width);
// -- Gestion du chrono -- // -- Gestion du chrono --
GFX2_GLOBAL byte Timer_state; // State du chrono: 0=Attente d'un Xème de seconde GFX2_GLOBAL byte Timer_state; // State du chrono: 0=Attente d'un Xème de seconde
// 1=Il faut afficher la preview // 1=Il faut afficher la preview
// 2=Plus de chrono à gerer pour l'instant // 2=Plus de chrono à gerer pour l'instant
GFX2_GLOBAL dword Timer_delay; // Nombre de 18.2ème de secondes demandés GFX2_GLOBAL dword Timer_delay; // Nombre de 18.2ème de secondes demandés
GFX2_GLOBAL dword Timer_start; // Heure de départ du chrono GFX2_GLOBAL dword Timer_start; // Heure de départ du chrono
GFX2_GLOBAL byte New_preview_is_needed; // Booléen "Il faut relancer le chrono de preview" GFX2_GLOBAL byte New_preview_is_needed; // Booléen "Il faut relancer le chrono de preview"
#if defined (__MINT__) #if defined (__MINT__)

View File

@ -3,7 +3,7 @@
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2018 Thomas Bernard Copyright 2018 Thomas Bernard
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2009 Petter Lindquist Copyright 2009 Petter Lindquist
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
Copyright 2008 Franck Charlet Copyright 2008 Franck Charlet
@ -198,7 +198,7 @@ void Load_GPL(T_IO_Context * context)
fclose(file); fclose(file);
} }
else else
// Si on n'a pas réussi à ouvrir le fichier, alors il y a eu une erreur // Si on n'a pas réussi à ouvrir le fichier, alors il y a eu une erreur
File_error=1; File_error=1;
} }
@ -250,7 +250,7 @@ void Load_PAL(T_IO_Context * context)
if ((file=Open_file_read(context))) if ((file=Open_file_read(context)))
{ {
long file_size = File_length_file(file); long file_size = File_length_file(file);
// Le fichier ne peut être au format PAL que si sa taille vaut 768 octets // Le fichier ne peut être au format PAL que si sa taille vaut 768 octets
if (file_size == sizeof(T_Palette)) if (file_size == sizeof(T_Palette))
{ {
T_Palette palette_64; T_Palette palette_64;
@ -324,7 +324,7 @@ void Load_PAL(T_IO_Context * context)
fclose(file); fclose(file);
} }
else else
// Si on n'a pas réussi à ouvrir le fichier, alors il y a eu une erreur // Si on n'a pas réussi à ouvrir le fichier, alors il y a eu une erreur
File_error=1; File_error=1;
} }
@ -399,9 +399,9 @@ void Test_PKM(T_IO_Context * context, FILE * file)
Read_bytes(file,&header.Palette,sizeof(T_Palette)) && Read_bytes(file,&header.Palette,sizeof(T_Palette)) &&
Read_word_le(file,&header.Jump)) Read_word_le(file,&header.Jump))
{ {
// On regarde s'il y a la signature PKM suivie de la méthode 0. // On regarde s'il y a la signature PKM suivie de la méthode 0.
// La constante "PKM" étant un chaîne, elle se termine toujours par 0. // La constante "PKM" étant un chaîne, elle se termine toujours par 0.
// Donc pas la peine de s'emm...er à regarder si la méthode est à 0. // Donc pas la peine de s'emm...er à regarder si la méthode est à 0.
if ( (!memcmp(&header,"PKM",4)) && header.Width && header.Height) if ( (!memcmp(&header,"PKM",4)) && header.Width && header.Height)
File_error=0; File_error=0;
} }
@ -476,7 +476,7 @@ void Load_PKM(T_IO_Context * context)
File_error=2; File_error=2;
break; break;
case 1 : // Dimensions de l'écran d'origine case 1 : // Dimensions de l'écran d'origine
if (Read_byte(file,&temp_byte)) if (Read_byte(file,&temp_byte))
{ {
if (temp_byte==4) if (temp_byte==4)
@ -547,7 +547,7 @@ void Load_PKM(T_IO_Context * context)
// Header size is 780 // Header size is 780
Taille_pack=(file_size)-780-header.Jump; Taille_pack=(file_size)-780-header.Jump;
// Boucle de décompression: // Boucle de décompression:
while ( (Compteur_de_pixels<image_size) && (Compteur_de_donnees_packees<Taille_pack) && (!File_error) ) while ( (Compteur_de_pixels<image_size) && (Compteur_de_donnees_packees<Taille_pack) && (!File_error) )
{ {
if(Read_byte(file, &temp_byte)!=1) if(Read_byte(file, &temp_byte)!=1)
@ -565,7 +565,7 @@ void Load_PKM(T_IO_Context * context)
Compteur_de_donnees_packees++; Compteur_de_donnees_packees++;
Compteur_de_pixels++; Compteur_de_pixels++;
} }
else // Sinon, On regarde si on va décompacter un... else // Sinon, On regarde si on va décompacter un...
{ // ... nombre de pixels tenant sur un byte { // ... nombre de pixels tenant sur un byte
if (temp_byte==header.Recog1) if (temp_byte==header.Recog1)
{ {
@ -631,10 +631,10 @@ void Load_PKM(T_IO_Context * context)
// On commence par compter l'utilisation de chaque couleurs // On commence par compter l'utilisation de chaque couleurs
Count_used_colors(Find_recon); Count_used_colors(Find_recon);
// Ensuite recog1 devient celle la moins utilisée de celles-ci // Ensuite recog1 devient celle la moins utilisée de celles-ci
*recog1=0; *recog1=0;
best=1; best=1;
NBest=INT_MAX; // Une même couleur ne pourra jamais être utilisée 1M de fois. NBest=INT_MAX; // Une même couleur ne pourra jamais être utilisée 1M de fois.
for (index=1;index<=255;index++) for (index=1;index<=255;index++)
if (Find_recon[index]<NBest) if (Find_recon[index]<NBest)
{ {
@ -643,7 +643,7 @@ void Load_PKM(T_IO_Context * context)
} }
*recog1=best; *recog1=best;
// Enfin recog2 devient la 2ème moins utilisée // Enfin recog2 devient la 2ème moins utilisée
*recog2=0; *recog2=0;
best=0; best=0;
NBest=INT_MAX; NBest=INT_MAX;
@ -706,7 +706,7 @@ void Save_PKM(T_IO_Context * context)
{ {
// Ecriture du commentaire // Ecriture du commentaire
// (Compteur_de_pixels est utilisé ici comme simple index de comptage) // (Compteur_de_pixels est utilisé ici comme simple index de comptage)
if (comment_size > 0) if (comment_size > 0)
{ {
Write_one_byte(file,0); Write_one_byte(file,0);
@ -714,7 +714,7 @@ void Save_PKM(T_IO_Context * context)
for (Compteur_de_pixels=0; Compteur_de_pixels<comment_size; Compteur_de_pixels++) for (Compteur_de_pixels=0; Compteur_de_pixels<comment_size; Compteur_de_pixels++)
Write_one_byte(file,context->Comment[Compteur_de_pixels]); Write_one_byte(file,context->Comment[Compteur_de_pixels]);
} }
// Ecriture des dimensions de l'écran // Ecriture des dimensions de l'écran
Write_one_byte(file,1); Write_one_byte(file,1);
Write_one_byte(file,4); Write_one_byte(file,4);
Write_one_byte(file,Screen_width&0xFF); Write_one_byte(file,Screen_width&0xFF);
@ -803,8 +803,8 @@ void Save_PKM(T_IO_Context * context)
File_error=1; File_error=1;
fclose(file); fclose(file);
} }
// S'il y a eu une erreur de sauvegarde, on ne va tout de même pas laisser // S'il y a eu une erreur de sauvegarde, on ne va tout de même pas laisser
// ce fichier pourri traîner... Ca fait pas propre. // ce fichier pourri traîner... Ca fait pas propre.
if (File_error) if (File_error)
Remove_file(context); Remove_file(context);
} }
@ -847,7 +847,7 @@ void Test_CEL(T_IO_Context * context, FILE * file)
Read_word_le(file,&header1.Height) ) Read_word_le(file,&header1.Height) )
{ {
// Vu que ce header n'a pas de signature, il va falloir tester la // Vu que ce header n'a pas de signature, il va falloir tester la
// cohérence de la dimension de l'image avec celle du fichier. // cohérence de la dimension de l'image avec celle du fichier.
size=file_size-4; size=file_size-4;
if ( (!size) || ( (((header1.Width+1)>>1)*header1.Height)!=size ) ) if ( (!size) || ( (((header1.Width+1)>>1)*header1.Height)!=size ) )
@ -929,7 +929,7 @@ void Load_CEL(T_IO_Context * context)
} }
else else
{ {
// On réessaye avec le nouveau format // On réessaye avec le nouveau format
fseek(file,0,SEEK_SET); fseek(file,0,SEEK_SET);
if (Read_bytes(file,header2.Signature,4) if (Read_bytes(file,header2.Signature,4)
@ -957,7 +957,7 @@ void Load_CEL(T_IO_Context * context)
if (!File_error) if (!File_error)
{ {
// Effacement du décalage // Effacement du décalage
for (y_pos=0;y_pos<header2.Y_offset;y_pos++) for (y_pos=0;y_pos<header2.Y_offset;y_pos++)
for (x_pos=0;x_pos<context->Width;x_pos++) for (x_pos=0;x_pos<context->Width;x_pos++)
Set_pixel(context, x_pos,y_pos,0); Set_pixel(context, x_pos,y_pos,0);
@ -1030,12 +1030,12 @@ void Save_CEL(T_IO_Context * context)
{ {
setvbuf(file, NULL, _IOFBF, 64*1024); setvbuf(file, NULL, _IOFBF, 64*1024);
// On regarde si des couleurs >16 sont utilisées dans l'image // On regarde si des couleurs >16 sont utilisées dans l'image
for (x_pos=16;((x_pos<256) && (!color_usage[x_pos]));x_pos++); for (x_pos=16;((x_pos<256) && (!color_usage[x_pos]));x_pos++);
if (x_pos==256) if (x_pos==256)
{ {
// Cas d'une image 16 couleurs (écriture à l'ancien format) // Cas d'une image 16 couleurs (écriture à l'ancien format)
header1.Width =context->Width; header1.Width =context->Width;
header1.Height=context->Height; header1.Height=context->Height;
@ -1066,9 +1066,9 @@ void Save_CEL(T_IO_Context * context)
} }
else else
{ {
// Cas d'une image 256 couleurs (écriture au nouveau format) // Cas d'une image 256 couleurs (écriture au nouveau format)
// Recherche du décalage // Recherche du décalage
for (y_pos=0;y_pos<context->Height;y_pos++) for (y_pos=0;y_pos<context->Height;y_pos++)
{ {
for (x_pos=0;x_pos<context->Width;x_pos++) for (x_pos=0;x_pos<context->Width;x_pos++)
@ -1157,7 +1157,7 @@ void Test_KCF(T_IO_Context * context, FILE * file)
if (!Read_byte(file,&header1.Palette[pal_index].color[color_index].Byte1) || if (!Read_byte(file,&header1.Palette[pal_index].color[color_index].Byte1) ||
!Read_byte(file,&header1.Palette[pal_index].color[color_index].Byte2)) !Read_byte(file,&header1.Palette[pal_index].color[color_index].Byte2))
File_error=1; File_error=1;
// On vérifie une propriété de la structure de palette: // On vérifie une propriété de la structure de palette:
for (pal_index=0;pal_index<10;pal_index++) for (pal_index=0;pal_index<10;pal_index++)
for (color_index=0;color_index<16;color_index++) for (color_index=0;color_index<16;color_index++)
if ((header1.Palette[pal_index].color[color_index].Byte2>>4)!=0) if ((header1.Palette[pal_index].color[color_index].Byte2>>4)!=0)
@ -1210,7 +1210,7 @@ void Load_KCF(T_IO_Context * context)
file_size=File_length_file(file); file_size=File_length_file(file);
if (file_size==320) if (file_size==320)
{ {
// Fichier KCF à l'ancien format // Fichier KCF à l'ancien format
for (pal_index=0;pal_index<10 && !File_error;pal_index++) for (pal_index=0;pal_index<10 && !File_error;pal_index++)
for (color_index=0;color_index<16 && !File_error;color_index++) for (color_index=0;color_index<16 && !File_error;color_index++)
if (!Read_byte(file,&header1.Palette[pal_index].color[color_index].Byte1) || if (!Read_byte(file,&header1.Palette[pal_index].color[color_index].Byte1) ||
@ -1332,12 +1332,12 @@ void Save_KCF(T_IO_Context * context)
setvbuf(file, NULL, _IOFBF, 64*1024); setvbuf(file, NULL, _IOFBF, 64*1024);
// Sauvegarde de la palette // Sauvegarde de la palette
// On regarde si des couleurs >16 sont utilisées dans l'image // On regarde si des couleurs >16 sont utilisées dans l'image
for (index=16;((index<256) && (!color_usage[index]));index++); for (index=16;((index<256) && (!color_usage[index]));index++);
if (index==256) if (index==256)
{ {
// Cas d'une image 16 couleurs (écriture à l'ancien format) // Cas d'une image 16 couleurs (écriture à l'ancien format)
for (pal_index=0;pal_index<10;pal_index++) for (pal_index=0;pal_index<10;pal_index++)
for (color_index=0;color_index<16;color_index++) for (color_index=0;color_index<16;color_index++)
@ -1356,7 +1356,7 @@ void Save_KCF(T_IO_Context * context)
} }
else else
{ {
// Cas d'une image 256 couleurs (écriture au nouveau format) // Cas d'une image 256 couleurs (écriture au nouveau format)
memcpy(header2.Signature,"KiSS",4); // Initialisation de la signature memcpy(header2.Signature,"KiSS",4); // Initialisation de la signature
header2.Kind=0x10; // Initialisation du type (PALette) header2.Kind=0x10; // Initialisation du type (PALette)
@ -1364,8 +1364,8 @@ void Save_KCF(T_IO_Context * context)
header2.Filler1=0; // Initialisation du filler 1 (?) header2.Filler1=0; // Initialisation du filler 1 (?)
header2.Width=256; // Initialisation du nombre de couleurs header2.Width=256; // Initialisation du nombre de couleurs
header2.Height=1; // Initialisation du nombre de palettes header2.Height=1; // Initialisation du nombre de palettes
header2.X_offset=0; // Initialisation du décalage X header2.X_offset=0; // Initialisation du décalage X
header2.Y_offset=0; // Initialisation du décalage Y header2.Y_offset=0; // Initialisation du décalage Y
for (index=0;index<16;index++) // Initialisation du filler 2 (?) for (index=0;index<16;index++) // Initialisation du filler 2 (?)
header2.Filler2[index]=0; header2.Filler2[index]=0;
@ -1407,9 +1407,9 @@ void Save_KCF(T_IO_Context * context)
void PI1_8b_to_16p(byte * src,byte * dest) void PI1_8b_to_16p(byte * src,byte * dest)
{ {
int i; // index du pixel à calculer int i; // index du pixel à calculer
word byte_mask; // Masque de decodage word byte_mask; // Masque de decodage
word w0,w1,w2,w3; // Les 4 words bien ordonnés de la source word w0,w1,w2,w3; // Les 4 words bien ordonnés de la source
byte_mask=0x8000; byte_mask=0x8000;
w0=(((word)src[0])<<8) | src[1]; w0=(((word)src[0])<<8) | src[1];
@ -1418,8 +1418,8 @@ void PI1_8b_to_16p(byte * src,byte * dest)
w3=(((word)src[6])<<8) | src[7]; w3=(((word)src[6])<<8) | src[7];
for (i=0;i<16;i++) for (i=0;i<16;i++)
{ {
// Pour décoder le pixel n°i, il faut traiter les 4 words sur leur bit // Pour décoder le pixel n°i, il faut traiter les 4 words sur leur bit
// correspondant à celui du masque // correspondant à celui du masque
dest[i]=((w0 & byte_mask)?0x01:0x00) | dest[i]=((w0 & byte_mask)?0x01:0x00) |
((w1 & byte_mask)?0x02:0x00) | ((w1 & byte_mask)?0x02:0x00) |
@ -1433,16 +1433,16 @@ void PI1_8b_to_16p(byte * src,byte * dest)
void PI1_16p_to_8b(byte * src,byte * dest) void PI1_16p_to_8b(byte * src,byte * dest)
{ {
int i; // index du pixel à calculer int i; // index du pixel à calculer
word byte_mask; // Masque de codage word byte_mask; // Masque de codage
word w0,w1,w2,w3; // Les 4 words bien ordonnés de la destination word w0,w1,w2,w3; // Les 4 words bien ordonnés de la destination
byte_mask=0x8000; byte_mask=0x8000;
w0=w1=w2=w3=0; w0=w1=w2=w3=0;
for (i=0;i<16;i++) for (i=0;i<16;i++)
{ {
// Pour coder le pixel n°i, il faut modifier les 4 words sur leur bit // Pour coder le pixel n°i, il faut modifier les 4 words sur leur bit
// correspondant à celui du masque // correspondant à celui du masque
w0|=(src[i] & 0x01)?byte_mask:0x00; w0|=(src[i] & 0x01)?byte_mask:0x00;
w1|=(src[i] & 0x02)?byte_mask:0x00; w1|=(src[i] & 0x02)?byte_mask:0x00;
@ -1464,11 +1464,11 @@ void PI1_16p_to_8b(byte * src,byte * dest)
void PI1_decode_palette(byte * src,byte * palette) void PI1_decode_palette(byte * src,byte * palette)
{ {
int i; // Numéro de la couleur traitée int i; // Numéro de la couleur traitée
int ip; // index dans la palette int ip; // index dans la palette
word w; // Word contenant le code word w; // Word contenant le code
// Schéma d'un word = // Schéma d'un word =
// //
// Low High // Low High
// VVVV RRRR | 0000 BBBB // VVVV RRRR | 0000 BBBB
@ -1502,11 +1502,11 @@ void PI1_decode_palette(byte * src,byte * palette)
void PI1_code_palette(byte * palette,byte * dest) void PI1_code_palette(byte * palette,byte * dest)
{ {
int i; // Numéro de la couleur traitée int i; // Numéro de la couleur traitée
int ip; // index dans la palette int ip; // index dans la palette
word w; // Word contenant le code word w; // Word contenant le code
// Schéma d'un word = // Schéma d'un word =
// //
// Low High // Low High
// VVVV RRRR | 0000 BBBB // VVVV RRRR | 0000 BBBB
@ -1608,16 +1608,16 @@ void PI1_save_ranges(T_IO_Context * context, byte * buffer, int size)
void Test_PI1(T_IO_Context * context, FILE * file) void Test_PI1(T_IO_Context * context, FILE * file)
{ {
int size; // Taille du fichier int size; // Taille du fichier
word resolution; // Résolution de l'image word resolution; // Résolution de l'image
(void)context; (void)context;
File_error=1; File_error=1;
// Vérification de la taille // Vérification de la taille
size=File_length_file(file); size=File_length_file(file);
if ((size==32034) || (size==32066)) if ((size==32034) || (size==32066))
{ {
// Lecture et vérification de la résolution // Lecture et vérification de la résolution
if (Read_word_le(file,&resolution)) if (Read_word_le(file,&resolution))
{ {
if (resolution==0x0000) if (resolution==0x0000)
@ -1639,7 +1639,7 @@ void Load_PI1(T_IO_Context * context)
File_error=0; File_error=0;
if ((file=Open_file_read(context))) if ((file=Open_file_read(context)))
{ {
// allocation d'un buffer mémoire // allocation d'un buffer mémoire
buffer=(byte *)malloc(32034); buffer=(byte *)malloc(32034);
if (buffer!=NULL) if (buffer!=NULL)
{ {
@ -1655,7 +1655,7 @@ void Load_PI1(T_IO_Context * context)
memset(context->Palette,0,sizeof(T_Palette)); memset(context->Palette,0,sizeof(T_Palette));
PI1_decode_palette(buffer+2,(byte *)context->Palette); PI1_decode_palette(buffer+2,(byte *)context->Palette);
// Chargement/décompression de l'image // Chargement/décompression de l'image
ptr=buffer+34; ptr=buffer+34;
for (y_pos=0;y_pos<200;y_pos++) for (y_pos=0;y_pos<200;y_pos++)
{ {
@ -1699,9 +1699,9 @@ void Save_PI1(T_IO_Context * context)
{ {
setvbuf(file, NULL, _IOFBF, 64*1024); setvbuf(file, NULL, _IOFBF, 64*1024);
// allocation d'un buffer mémoire // allocation d'un buffer mémoire
buffer=(byte *)malloc(32034); buffer=(byte *)malloc(32034);
// Codage de la résolution // Codage de la résolution
buffer[0]=0x00; buffer[0]=0x00;
buffer[1]=0x00; buffer[1]=0x00;
// Codage de la palette // Codage de la palette
@ -1730,13 +1730,13 @@ void Save_PI1(T_IO_Context * context)
{ {
fclose(file); fclose(file);
} }
else // Error d'écriture (disque plein ou protégé) else // Error d'écriture (disque plein ou protégé)
{ {
fclose(file); fclose(file);
Remove_file(context); Remove_file(context);
File_error=1; File_error=1;
} }
// Libération du buffer mémoire // Libération du buffer mémoire
free(buffer); free(buffer);
buffer = NULL; buffer = NULL;
} }
@ -1751,12 +1751,12 @@ void Save_PI1(T_IO_Context * context)
//////////////////////////////////// PC1 //////////////////////////////////// //////////////////////////////////// PC1 ////////////////////////////////////
//// DECOMPRESSION d'un buffer selon la méthode PACKBITS //// //// DECOMPRESSION d'un buffer selon la méthode PACKBITS ////
void PC1_uncompress_packbits(byte * src,byte * dest) void PC1_uncompress_packbits(byte * src,byte * dest)
{ {
int is,id; // Les indices de parcour des buffers int is,id; // Les indices de parcour des buffers
int n; // Octet de contrôle int n; // Octet de contrôle
for (is=id=0;id<32000;) for (is=id=0;id<32000;)
{ {
@ -1772,19 +1772,19 @@ void PC1_uncompress_packbits(byte * src,byte * dest)
} }
else else
{ {
// Recopier n+1 octets littéralement // Recopier n+1 octets littéralement
n=n+1; n=n+1;
for (;(n>0) && (id<32000);n--) for (;(n>0) && (id<32000);n--)
dest[id++]=src[is++]; dest[id++]=src[is++];
} }
// Contrôle des erreurs // Contrôle des erreurs
if (n>0) if (n>0)
File_error=1; File_error=1;
} }
} }
//// COMPRESSION d'un buffer selon la méthode PACKBITS //// //// COMPRESSION d'un buffer selon la méthode PACKBITS ////
void PC1_compress_packbits(byte * src,byte * dest,int source_size,int * dest_size) void PC1_compress_packbits(byte * src,byte * dest,int source_size,int * dest_size)
{ {
@ -1794,13 +1794,13 @@ void PC1_compress_packbits(byte * src,byte * dest,int source_size,int * dest_siz
{ {
int is = 0; // index dans la source int is = 0; // index dans la source
int id = 0; // index dans la destination int id = 0; // index dans la destination
int ir; // index de la répétition int ir; // index de la répétition
int n; // Taille des séquences int n; // Taille des séquences
int repet; // "Il y a répétition" int repet; // "Il y a répétition"
while(is<40) while(is<40)
{ {
// On recherche le 1er endroit où il y a répétition d'au moins 3 valeurs // On recherche le 1er endroit où il y a répétition d'au moins 3 valeurs
// identiques // identiques
repet=0; repet=0;
@ -1813,7 +1813,7 @@ void PC1_compress_packbits(byte * src,byte * dest,int source_size,int * dest_siz
} }
} }
// On code la partie sans répétitions // On code la partie sans répétitions
if (!repet || ir!=is) if (!repet || ir!=is)
{ {
n=(ir-is)+1; n=(ir-is)+1;
@ -1822,10 +1822,10 @@ void PC1_compress_packbits(byte * src,byte * dest,int source_size,int * dest_siz
dest[id++]=src[is++]; dest[id++]=src[is++];
} }
// On code la partie sans répétitions // On code la partie sans répétitions
if (repet) if (repet)
{ {
// On compte la quantité de fois qu'il faut répéter la valeur // On compte la quantité de fois qu'il faut répéter la valeur
for (ir+=3;ir<40;ir++) for (ir+=3;ir<40;ir++)
{ {
if (src[ir]!=src[is]) if (src[ir]!=src[is])
@ -1837,7 +1837,7 @@ void PC1_compress_packbits(byte * src,byte * dest,int source_size,int * dest_siz
is=ir; is=ir;
} }
} }
// On renseigne la taille du buffer compressé // On renseigne la taille du buffer compressé
*dest_size+=id; *dest_size+=id;
// Move for next 40-byte block // Move for next 40-byte block
src += 40; src += 40;
@ -1853,7 +1853,7 @@ void PC1_compress_packbits(byte * src,byte * dest,int source_size,int * dest_siz
void PC1_4bp_to_1line(byte * src0,byte * src1,byte * src2,byte * src3,byte * dest) void PC1_4bp_to_1line(byte * src0,byte * src1,byte * src2,byte * src3,byte * dest)
{ {
int i,j; // Compteurs int i,j; // Compteurs
int ip; // index du pixel à calculer int ip; // index du pixel à calculer
byte byte_mask; // Masque de decodage byte byte_mask; // Masque de decodage
byte b0,b1,b2,b3; // Les 4 octets des plans bits sources byte b0,b1,b2,b3; // Les 4 octets des plans bits sources
@ -1885,7 +1885,7 @@ void PC1_4bp_to_1line(byte * src0,byte * src1,byte * src2,byte * src3,byte * des
void PC1_1line_to_4bp(byte * src,byte * dst0,byte * dst1,byte * dst2,byte * dst3) void PC1_1line_to_4bp(byte * src,byte * dst0,byte * dst1,byte * dst2,byte * dst3)
{ {
int i,j; // Compteurs int i,j; // Compteurs
int ip; // index du pixel à calculer int ip; // index du pixel à calculer
byte byte_mask; // Masque de decodage byte byte_mask; // Masque de decodage
byte b0,b1,b2,b3; // Les 4 octets des plans bits sources byte b0,b1,b2,b3; // Les 4 octets des plans bits sources
@ -1917,16 +1917,16 @@ void PC1_1line_to_4bp(byte * src,byte * dst0,byte * dst1,byte * dst2,byte * dst3
void Test_PC1(T_IO_Context * context, FILE * file) void Test_PC1(T_IO_Context * context, FILE * file)
{ {
int size; // Taille du fichier int size; // Taille du fichier
word resolution; // Résolution de l'image word resolution; // Résolution de l'image
(void)context; (void)context;
File_error=1; File_error=1;
// Vérification de la taille // Vérification de la taille
size=File_length_file(file); size=File_length_file(file);
if ((size<=32066)) if ((size<=32066))
{ {
// Lecture et vérification de la résolution // Lecture et vérification de la résolution
if (Read_word_le(file,&resolution)) if (Read_word_le(file,&resolution))
{ {
if (resolution==0x0080) if (resolution==0x0080)
@ -1951,7 +1951,7 @@ void Load_PC1(T_IO_Context * context)
if ((file=Open_file_read(context))) if ((file=Open_file_read(context)))
{ {
size=File_length_file(file); size=File_length_file(file);
// allocation des buffers mémoire // allocation des buffers mémoire
buffercomp=(byte *)malloc(size); buffercomp=(byte *)malloc(size);
bufferdecomp=(byte *)malloc(32000); bufferdecomp=(byte *)malloc(32000);
if ( (buffercomp!=NULL) && (bufferdecomp!=NULL) ) if ( (buffercomp!=NULL) && (bufferdecomp!=NULL) )
@ -1968,14 +1968,14 @@ void Load_PC1(T_IO_Context * context)
memset(context->Palette,0,sizeof(T_Palette)); memset(context->Palette,0,sizeof(T_Palette));
PI1_decode_palette(buffercomp+2,(byte *)context->Palette); PI1_decode_palette(buffercomp+2,(byte *)context->Palette);
// Décompression du buffer // Décompression du buffer
PC1_uncompress_packbits(buffercomp+34,bufferdecomp); PC1_uncompress_packbits(buffercomp+34,bufferdecomp);
// Décodage de l'image // Décodage de l'image
ptr=bufferdecomp; ptr=bufferdecomp;
for (y_pos=0;y_pos<200;y_pos++) for (y_pos=0;y_pos<200;y_pos++)
{ {
// Décodage de la scanline // Décodage de la scanline
PC1_4bp_to_1line(ptr,ptr+40,ptr+80,ptr+120,pixels); PC1_4bp_to_1line(ptr,ptr+40,ptr+80,ptr+120,pixels);
ptr+=160; ptr+=160;
// Chargement de la ligne // Chargement de la ligne
@ -2025,10 +2025,10 @@ void Save_PC1(T_IO_Context * context)
{ {
setvbuf(file, NULL, _IOFBF, 64*1024); setvbuf(file, NULL, _IOFBF, 64*1024);
// Allocation des buffers mémoire // Allocation des buffers mémoire
bufferdecomp=(byte *)malloc(32000); bufferdecomp=(byte *)malloc(32000);
buffercomp =(byte *)malloc(64066); buffercomp =(byte *)malloc(64066);
// Codage de la résolution // Codage de la résolution
buffercomp[0]=0x80; buffercomp[0]=0x80;
buffercomp[1]=0x00; buffercomp[1]=0x00;
// Codage de la palette // Codage de la palette
@ -2060,13 +2060,13 @@ void Save_PC1(T_IO_Context * context)
{ {
fclose(file); fclose(file);
} }
else // Error d'écriture (disque plein ou protégé) else // Error d'écriture (disque plein ou protégé)
{ {
fclose(file); fclose(file);
Remove_file(context); Remove_file(context);
File_error=1; File_error=1;
} }
// Libération des buffers mémoire // Libération des buffers mémoire
free(bufferdecomp); free(bufferdecomp);
free(buffercomp); free(buffercomp);
buffercomp = bufferdecomp = NULL; buffercomp = bufferdecomp = NULL;
@ -2085,12 +2085,12 @@ void Save_PC1(T_IO_Context * context)
void Test_NEO(T_IO_Context * context, FILE * file) void Test_NEO(T_IO_Context * context, FILE * file)
{ {
int size; // Taille du fichier int size; // Taille du fichier
word resolution; // Résolution de l'image word resolution; // Résolution de l'image
(void)context; (void)context;
File_error=1; File_error=1;
// Vérification de la taille // Vérification de la taille
size=File_length_file(file); size=File_length_file(file);
if ((size==32128)) if ((size==32128))
{ {
@ -2101,7 +2101,7 @@ void Test_NEO(T_IO_Context * context, FILE * file)
File_error = 0; File_error = 0;
} }
// Lecture et vérification de la résolution // Lecture et vérification de la résolution
if (Read_word_le(file,&resolution)) if (Read_word_le(file,&resolution))
{ {
if (resolution==0 || resolution==1 || resolution==2) if (resolution==0 || resolution==1 || resolution==2)
@ -2121,7 +2121,7 @@ void Load_NEO(T_IO_Context * context)
File_error=0; File_error=0;
if ((file=Open_file_read(context))) if ((file=Open_file_read(context)))
{ {
// allocation d'un buffer mémoire // allocation d'un buffer mémoire
buffer=(byte *)malloc(32128); buffer=(byte *)malloc(32128);
if (buffer!=NULL) if (buffer!=NULL)
{ {
@ -2135,10 +2135,10 @@ void Load_NEO(T_IO_Context * context)
// Initialisation de la palette // Initialisation de la palette
if (Config.Clear_palette) if (Config.Clear_palette)
memset(context->Palette,0,sizeof(T_Palette)); memset(context->Palette,0,sizeof(T_Palette));
// on saute la résolution et le flag, chacun 2 bits // on saute la résolution et le flag, chacun 2 bits
PI1_decode_palette(buffer+4,(byte *)context->Palette); PI1_decode_palette(buffer+4,(byte *)context->Palette);
// Chargement/décompression de l'image // Chargement/décompression de l'image
ptr=buffer+128; ptr=buffer+128;
for (y_pos=0;y_pos<200;y_pos++) for (y_pos=0;y_pos<200;y_pos++)
{ {
@ -2179,9 +2179,9 @@ void Save_NEO(T_IO_Context * context)
{ {
setvbuf(file, NULL, _IOFBF, 64*1024); setvbuf(file, NULL, _IOFBF, 64*1024);
// allocation d'un buffer mémoire // allocation d'un buffer mémoire
buffer=(byte *)malloc(32128); buffer=(byte *)malloc(32128);
// Codage de la résolution // Codage de la résolution
buffer[0]=0x00; buffer[0]=0x00;
buffer[1]=0x00; buffer[1]=0x00;
buffer[2]=0x00; buffer[2]=0x00;
@ -2211,13 +2211,13 @@ void Save_NEO(T_IO_Context * context)
{ {
fclose(file); fclose(file);
} }
else // Error d'écriture (disque plein ou protégé) else // Error d'écriture (disque plein ou protégé)
{ {
fclose(file); fclose(file);
Remove_file(context); Remove_file(context);
File_error=1; File_error=1;
} }
// Libération du buffer mémoire // Libération du buffer mémoire
free(buffer); free(buffer);
buffer = NULL; buffer = NULL;
} }

View File

@ -1031,7 +1031,7 @@ void CS_Generate_color_table_and_palette(T_Cluster_set * cs,CT_Tree* tc,T_Compon
} }
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////// Méthodes de gestion des dégradés // ///////////////////////////////////////// Méthodes de gestion des dégradés //
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
void GS_Init(T_Gradient_set * ds,T_Cluster_set * cs) void GS_Init(T_Gradient_set * ds,T_Cluster_set * cs)
@ -1040,7 +1040,7 @@ void GS_Init(T_Gradient_set * ds,T_Cluster_set * cs)
ds->gradients[0].min=cs->clusters->data.pal.h; ds->gradients[0].min=cs->clusters->data.pal.h;
ds->gradients[0].max=cs->clusters->data.pal.h; ds->gradients[0].max=cs->clusters->data.pal.h;
ds->gradients[0].hue=cs->clusters->data.pal.h; ds->gradients[0].hue=cs->clusters->data.pal.h;
// Et hop : le 1er ensemble de dgrads est initialis // Et hop : le 1er ensemble de dégradés est initialisé
ds->nb=1; ds->nb=1;
} }
@ -1051,7 +1051,7 @@ T_Gradient_set * GS_New(T_Cluster_set * cs)
n=(T_Gradient_set *)malloc(sizeof(T_Gradient_set)); n=(T_Gradient_set *)malloc(sizeof(T_Gradient_set));
if (n!=NULL) if (n!=NULL)
{ {
// On recopie les paramètres demandés // On recopie les paramètres demandés
n->nb_max=cs->nb_max; n->nb_max=cs->nb_max;
// On tente d'allouer la table // On tente d'allouer la table
@ -1061,7 +1061,7 @@ T_Gradient_set * GS_New(T_Cluster_set * cs)
GS_Init(n,cs); GS_Init(n,cs);
else else
{ {
// Table impossible à allouer // Table impossible à allouer
free(n); free(n);
n=NULL; n=NULL;
} }
@ -1079,15 +1079,15 @@ void GS_Delete(T_Gradient_set * ds)
void GS_Generate(T_Gradient_set * ds,T_Cluster_set * cs) void GS_Generate(T_Gradient_set * ds,T_Cluster_set * cs)
{ {
int id; // Les indexs de parcours des ensembles int id; // Les indexs de parcours des ensembles
int best_gradient; // Meilleur dgrad int best_gradient; // Meilleur dégradé
int best_diff; // Meilleure diffrence de chrominance int best_diff; // Meilleure différence de chrominance
int diff; // difference de chrominance courante int diff; // difference de chrominance courante
T_Cluster * current = cs->clusters; T_Cluster * current = cs->clusters;
// Pour chacun des clusters … traiter // Pour chacun des clusters … traiter
do do
{ {
// On recherche le dgrad le plus proche de la chrominance du cluster // On recherche le dégradé le plus proche de la chrominance du cluster
best_gradient=-1; best_gradient=-1;
best_diff=99999999; best_diff=99999999;
for (id=0;id<ds->nb;id++) for (id=0;id<ds->nb;id++)
@ -1100,10 +1100,10 @@ void GS_Generate(T_Gradient_set * ds,T_Cluster_set * cs)
} }
} }
// Si on a trouv un dgrad dans lequel inclure le cluster // Si on a trouvé un dégradé dans lequel inclure le cluster
if (best_gradient!=-1) if (best_gradient!=-1)
{ {
// On met … jour le dgrad // On met à jour le dégradé
if (current->data.pal.h < ds->gradients[best_gradient].min) if (current->data.pal.h < ds->gradients[best_gradient].min)
ds->gradients[best_gradient].min=current->data.pal.h; ds->gradients[best_gradient].min=current->data.pal.h;
if (current->data.pal.h > ds->gradients[best_gradient].max) if (current->data.pal.h > ds->gradients[best_gradient].max)
@ -1116,7 +1116,7 @@ void GS_Generate(T_Gradient_set * ds,T_Cluster_set * cs)
} }
else else
{ {
// On cre un nouveau dgrad // On crée un nouveau dégradé
best_gradient=ds->nb; best_gradient=ds->nb;
ds->gradients[best_gradient].nb_colors=1; ds->gradients[best_gradient].nb_colors=1;
ds->gradients[best_gradient].min=current->data.pal.h; ds->gradients[best_gradient].min=current->data.pal.h;
@ -1254,9 +1254,9 @@ void Convert_24b_bitmap_to_256_Floyd_Steinberg(T_Bitmap256 dest,T_Bitmap24B sour
// On initialise les variables de parcours: // On initialise les variables de parcours:
current =source; // Le pixel dont on s'occupe current =source; // Le pixel dont on s'occupe
next =current+width; // Le pixel en dessous next =current+width; // Le pixel en dessous
c_plus1 =current+1; // Le pixel à droite c_plus1 =current+1; // Le pixel à droite
u_minus1=next-1; // Le pixel en bas à gauche u_minus1=next-1; // Le pixel en bas à gauche
u_plus1 =next+1; // Le pixel en bas à droite u_plus1 =next+1; // Le pixel en bas à droite
d =dest; d =dest;
// On parcours chaque pixel: // On parcours chaque pixel:
@ -1272,7 +1272,7 @@ void Convert_24b_bitmap_to_256_Floyd_Steinberg(T_Bitmap256 dest,T_Bitmap24B sour
// Cherche la couleur correspondant dans la palette et la range dans l'image de destination // Cherche la couleur correspondant dans la palette et la range dans l'image de destination
*d=CT_get(tc,red,green,blue); *d=CT_get(tc,red,green,blue);
// Puis on calcule pour chaque composante l'erreur dûe à l'approximation // Puis on calcule pour chaque composante l'erreur dûe à l'approximation
red-=palette[*d].R; red-=palette[*d].R;
green -=palette[*d].G; green -=palette[*d].G;
blue -=palette[*d].B; blue -=palette[*d].B;
@ -1289,7 +1289,7 @@ void Convert_24b_bitmap_to_256_Floyd_Steinberg(T_Bitmap256 dest,T_Bitmap24B sour
c_plus1->G=Modified_value(c_plus1->G,e_green ); c_plus1->G=Modified_value(c_plus1->G,e_green );
c_plus1->B=Modified_value(c_plus1->B,e_blue ); c_plus1->B=Modified_value(c_plus1->B,e_blue );
} }
// En bas à gauche: // En bas à gauche:
if (y_pos+1<height) if (y_pos+1<height)
{ {
e_red=(red*3)/16.0; e_red=(red*3)/16.0;
@ -1308,7 +1308,7 @@ void Convert_24b_bitmap_to_256_Floyd_Steinberg(T_Bitmap256 dest,T_Bitmap24B sour
next->R=Modified_value(next->R,e_red); next->R=Modified_value(next->R,e_red);
next->G=Modified_value(next->G,e_green ); next->G=Modified_value(next->G,e_green );
next->B=Modified_value(next->B,e_blue ); next->B=Modified_value(next->B,e_blue );
// En bas à droite: // En bas à droite:
if (x_pos+1<width) if (x_pos+1<width)
{ {
e_red=(red/16.0); e_red=(red/16.0);
@ -1427,7 +1427,7 @@ static const byte precision_24b[]=
int Convert_24b_bitmap_to_256(T_Bitmap256 dest,T_Bitmap24B source,int width,int height,T_Components * palette) int Convert_24b_bitmap_to_256(T_Bitmap256 dest,T_Bitmap24B source,int width,int height,T_Components * palette)
{ {
CT_Tree* table; // table de conversion CT_Tree* table; // table de conversion
int ip; // index de précision pour la conversion int ip; // index de précision pour la conversion
if (Try_Convert_to_256_Without_Loss(dest, source, width, height, palette) == 0) if (Try_Convert_to_256_Without_Loss(dest, source, width, height, palette) == 0)
return 0; return 0;
@ -1436,8 +1436,8 @@ int Convert_24b_bitmap_to_256(T_Bitmap256 dest,T_Bitmap24B source,int width,int
return Convert_24b_bitmap_to_256_fast(dest, source, width, height, palette); return Convert_24b_bitmap_to_256_fast(dest, source, width, height, palette);
#else #else
// On essaye d'obtenir une table de conversion qui loge en mémoire, avec la // On essaye d'obtenir une table de conversion qui loge en mémoire, avec la
// meilleure précision possible // meilleure précision possible
for (ip=0;ip<(10*3);ip+=3) for (ip=0;ip<(10*3);ip+=3)
{ {
table = Optimize_palette(source,width*height,palette, table = Optimize_palette(source,width*height,palette,

View File

@ -33,38 +33,38 @@
#include "struct.h" #include "struct.h"
#include "colorred.h" #include "colorred.h"
//////////////////////////////////////////////// Définition des types de base //////////////////////////////////////////////// Définition des types de base
typedef T_Components * T_Bitmap24B; typedef T_Components * T_Bitmap24B;
typedef byte * T_Bitmap256; typedef byte * T_Bitmap256;
///////////////////////////////////////// Définition d'une table d'occurences ///////////////////////////////////////// Définition d'une table d'occurences
typedef struct typedef struct
{ {
int nbb_r; // Nb de bits de précision sur les rouges int nbb_r; // Nb de bits de précision sur les rouges
int nbb_g; // Nb de bits de précision sur les verts int nbb_g; // Nb de bits de précision sur les verts
int nbb_b; // Nb de bits de précision sur les bleu int nbb_b; // Nb de bits de précision sur les bleu
int rng_r; // Nb de valeurs sur les rouges (= 1<<nbb_r) int rng_r; // Nb de valeurs sur les rouges (= 1<<nbb_r)
int rng_g; // Nb de valeurs sur les verts (= 1<<nbb_g) int rng_g; // Nb de valeurs sur les verts (= 1<<nbb_g)
int rng_b; // Nb de valeurs sur les bleus (= 1<<nbb_b) int rng_b; // Nb de valeurs sur les bleus (= 1<<nbb_b)
int dec_r; // Coefficient multiplicateur d'accès dans la table (= nbb_g+nbb_b) int dec_r; // Coefficient multiplicateur d'accès dans la table (= nbb_g+nbb_b)
int dec_g; // Coefficient multiplicateur d'accès dans la table (= nbb_b) int dec_g; // Coefficient multiplicateur d'accès dans la table (= nbb_b)
int dec_b; // Coefficient multiplicateur d'accès dans la table (= 0) int dec_b; // Coefficient multiplicateur d'accès dans la table (= 0)
int red_r; // Coefficient réducteur de traduction d'une couleur rouge (= 8-nbb_r) int red_r; // Coefficient réducteur de traduction d'une couleur rouge (= 8-nbb_r)
int red_g; // Coefficient réducteur de traduction d'une couleur verte (= 8-nbb_g) int red_g; // Coefficient réducteur de traduction d'une couleur verte (= 8-nbb_g)
int red_b; // Coefficient réducteur de traduction d'une couleur bleue (= 8-nbb_b) int red_b; // Coefficient réducteur de traduction d'une couleur bleue (= 8-nbb_b)
int * table; int * table;
} T_Occurrence_table; } T_Occurrence_table;
///////////////////////////////////////// Définition d'un ensemble de couleur ///////////////////////////////////////// Définition d'un ensemble de couleur
struct S_Cluster_CutData struct S_Cluster_CutData
{ {
@ -80,9 +80,9 @@ struct S_Cluster_CutData
struct S_Cluster_PalData struct S_Cluster_PalData
{ {
// information used while color reducing // information used while color reducing
byte r,g,b; // color synthétisant l'ensemble byte r,g,b; // color synthétisant l'ensemble
byte h; // Chrominance byte h; // Chrominance
byte l; // Luminosité byte l; // Luminosité
}; };
union U_Cluster_Data union U_Cluster_Data
@ -111,7 +111,7 @@ typedef struct S_Cluster
//////////////////////////////////////// Définition d'un ensemble de clusters //////////////////////////////////////// Définition d'un ensemble de clusters
typedef struct typedef struct
{ {
@ -122,25 +122,25 @@ typedef struct
///////////////////////////////////////////////////// Définition d'un dégradé ///////////////////////////////////////////////////// Définition d'un dégradé
typedef struct typedef struct
{ {
int nb_colors; // Nombre de couleurs dans le dégradé int nb_colors; // Nombre de couleurs dans le dégradé
float min; // Chrominance minimale du dégradé float min; // Chrominance minimale du dégradé
float max; // Chrominance maximale du dégradé float max; // Chrominance maximale du dégradé
float hue; // Chrominance moyenne du dégradé float hue; // Chrominance moyenne du dégradé
} T_Gradient; } T_Gradient;
///////////////////////////////////////// Définition d'un ensemble de dégradé ///////////////////////////////////////// Définition d'un ensemble de dégradé
typedef struct typedef struct
{ {
int nb; // Nombre de dégradés dans l'ensemble int nb; // Nombre de dégradés dans l'ensemble
int nb_max; // Nombre maximum de dégradés int nb_max; // Nombre maximum de dégradés
T_Gradient * gradients; // Les dégradés T_Gradient * gradients; // Les dégradés
} T_Gradient_set; } T_Gradient_set;
void RGB_to_HSL(int r, int g,int b, byte* h, byte*s, byte* l); void RGB_to_HSL(int r, int g,int b, byte* h, byte*s, byte* l);
@ -149,7 +149,7 @@ void HSL_to_RGB(byte h, byte s, byte l, byte* r, byte* g, byte* b);
long Perceptual_lightness(T_Components *color); long Perceptual_lightness(T_Components *color);
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
/////////////////////////////// Méthodes de gestion des tables d'occurence // /////////////////////////////// Méthodes de gestion des tables d'occurence //
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
void OT_init(T_Occurrence_table * t); void OT_init(T_Occurrence_table * t);
@ -162,7 +162,7 @@ void OT_count_occurrences(T_Occurrence_table * t,T_Bitmap24B image,int size);
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////// Méthodes de gestion des clusters // ///////////////////////////////////////// Méthodes de gestion des clusters //
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
void Cluster_pack(T_Cluster * c,const T_Occurrence_table * const to); void Cluster_pack(T_Cluster * c,const T_Occurrence_table * const to);
@ -172,7 +172,7 @@ void Cluster_compute_hue(T_Cluster * c,T_Occurrence_table * to);
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
//////////////////////////// Méthodes de gestion des ensembles de clusters // //////////////////////////// Méthodes de gestion des ensembles de clusters //
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
void CS_Init(T_Cluster_set * cs,T_Occurrence_table * to); void CS_Init(T_Cluster_set * cs,T_Occurrence_table * to);
@ -185,7 +185,7 @@ void CS_Compute_colors(T_Cluster_set * cs,T_Occurrence_table * to);
void CS_Generate_color_table_and_palette(T_Cluster_set * cs,CT_Tree* tc,T_Components * palette, T_Occurrence_table * to); void CS_Generate_color_table_and_palette(T_Cluster_set * cs,CT_Tree* tc,T_Components * palette, T_Occurrence_table * to);
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
//////////////////////////// Méthodes de gestion des ensembles de dégradés // //////////////////////////// Méthodes de gestion des ensembles de dégradés //
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
void GS_Init(T_Gradient_set * ds,T_Cluster_set * cs); void GS_Init(T_Gradient_set * ds,T_Cluster_set * cs);
@ -195,7 +195,7 @@ void GS_Generate(T_Gradient_set * ds,T_Cluster_set * cs);
// Convertie avec le plus de précision possible une image 24b en 256c // Convertie avec le plus de précision possible une image 24b en 256c
// Renvoie s'il y a eu une erreur ou pas.. // Renvoie s'il y a eu une erreur ou pas..
int Convert_24b_bitmap_to_256(T_Bitmap256 dest,T_Bitmap24B source,int width,int height,T_Components * palette); int Convert_24b_bitmap_to_256(T_Bitmap256 dest,T_Bitmap24B source,int width,int height,T_Components * palette);

File diff suppressed because it is too large Load Diff

View File

@ -165,7 +165,7 @@ T_Gradient_array *Dup_gradient(T_Page * page)
} }
void Download_infos_page_main(T_Page * page) void Download_infos_page_main(T_Page * page)
// Affiche la page à l'écran // Affiche la page à l'écran
{ {
//int factor_index; //int factor_index;
int size_is_modified; int size_is_modified;
@ -393,7 +393,7 @@ void Redraw_current_layer(void)
} }
void Upload_infos_page(T_Document * doc) void Upload_infos_page(T_Document * doc)
// Sauve l'écran courant dans la page // Sauve l'écran courant dans la page
{ {
if (doc->backups->Pages != NULL) if (doc->backups->Pages != NULL)
{ {
@ -428,7 +428,7 @@ void Update_FX_feedback(byte with_feedback)
void Clear_page(T_Page * page) void Clear_page(T_Page * page)
{ {
// On peut appeler cette fonction sur une page non allouée. // On peut appeler cette fonction sur une page non allouée.
int i; int i;
for (i=0; i<page->Nb_layers; i++) for (i=0; i<page->Nb_layers; i++)
{ {
@ -448,7 +448,7 @@ void Clear_page(T_Page * page)
page->Width=0; page->Width=0;
page->Height=0; page->Height=0;
// On ne se préoccupe pas de ce que deviens le reste des infos de l'image. // On ne se préoccupe pas de ce que deviens le reste des infos de l'image.
} }
void Copy_S_page(T_Page * dest,T_Page * source) void Copy_S_page(T_Page * dest,T_Page * source)
@ -473,8 +473,8 @@ void Init_list_of_pages(T_List_of_pages * list)
int Allocate_list_of_pages(T_List_of_pages * list) int Allocate_list_of_pages(T_List_of_pages * list)
{ {
// Important: la T_List_of_pages ne doit pas déjà désigner une liste de // Important: la T_List_of_pages ne doit pas déjà désigner une liste de
// pages allouée auquel cas celle-ci serait perdue. // pages allouée auquel cas celle-ci serait perdue.
T_Page * page; T_Page * page;
// On initialise chacune des nouvelles pages // On initialise chacune des nouvelles pages
@ -493,26 +493,26 @@ int Allocate_list_of_pages(T_List_of_pages * list)
if (!page->Gradients) if (!page->Gradients)
return 0; return 0;
return 1; // Succès return 1; // Succès
} }
void Backward_in_list_of_pages(T_List_of_pages * list) void Backward_in_list_of_pages(T_List_of_pages * list)
{ {
// Cette fonction fait l'équivalent d'un "Undo" dans la liste de pages. // Cette fonction fait l'équivalent d'un "Undo" dans la liste de pages.
// Elle effectue une sorte de ROL (Rotation Left) sur la liste: // Elle effectue une sorte de ROL (Rotation Left) sur la liste:
// +---+-+-+-+-+-+-+-+-+-+ | // +---+-+-+-+-+-+-+-+-+-+ |
// ¦0¦1¦2¦3¦4¦5¦6¦7¦8¦9¦A¦ | // ¦0¦1¦2¦3¦4¦5¦6¦7¦8¦9¦A¦ |
// +---+-+-+-+-+-+-+-+-+-+ | 0=page courante // +---+-+-+-+-+-+-+-+-+-+ | 0=page courante
// ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ |_ A=page la plus ancienne // ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ |_ A=page la plus ancienne
// v v v v v v v v v v v | 1=DerniÞre page (1er backup) // v v v v v v v v v v v | 1=DerniÞre page (1er backup)
// +---+-+-+-+-+-+-+-+-+-+ | // +---+-+-+-+-+-+-+-+-+-+ |
// ¦1¦2¦3¦4¦5¦6¦7¦8¦9¦A¦0¦ | // ¦1¦2¦3¦4¦5¦6¦7¦8¦9¦A¦0¦ |
// +---+-+-+-+-+-+-+-+-+-+ | // +---+-+-+-+-+-+-+-+-+-+ |
// Pour simuler un véritable Undo, l'appelant doit mettre la structure // Pour simuler un véritable Undo, l'appelant doit mettre la structure
// de page courante à jour avant l'appel, puis en réextraire les infos en // de page courante à jour avant l'appel, puis en réextraire les infos en
// sortie, ainsi que celles relatives à la plus récente page d'undo (1ère // sortie, ainsi que celles relatives à la plus récente page d'undo (1ère
// page de la liste). // page de la liste).
if (Last_backed_up_layers) if (Last_backed_up_layers)
@ -539,20 +539,20 @@ void Backward_in_list_of_pages(T_List_of_pages * list)
void Advance_in_list_of_pages(T_List_of_pages * list) void Advance_in_list_of_pages(T_List_of_pages * list)
{ {
// Cette fonction fait l'équivalent d'un "Redo" dans la liste de pages. // Cette fonction fait l'équivalent d'un "Redo" dans la liste de pages.
// Elle effectue une sorte de ROR (Rotation Right) sur la liste: // Elle effectue une sorte de ROR (Rotation Right) sur la liste:
// +-+-+-+-+-+-+-+-+-+-+-+ | // +-+-+-+-+-+-+-+-+-+-+-+ |
// |0|1|2|3|4|5|6|7|8|9|A| | // |0|1|2|3|4|5|6|7|8|9|A| |
// +-+-+-+-+-+-+-+-+-+-+-+ | 0=page courante // +-+-+-+-+-+-+-+-+-+-+-+ | 0=page courante
// | | | | | | | | | | | |_ A=page la plus ancienne // | | | | | | | | | | | |_ A=page la plus ancienne
// v v v v v v v v v v v | 1=Dernière page (1er backup) // v v v v v v v v v v v | 1=Dernière page (1er backup)
// +-+-+-+-+-+-+-+-+-+-+-+ | // +-+-+-+-+-+-+-+-+-+-+-+ |
// |A|0|1|2|3|4|5|6|7|8|9| | // |A|0|1|2|3|4|5|6|7|8|9| |
// +-+-+-+-+-+-+-+-+-+-+-+ | // +-+-+-+-+-+-+-+-+-+-+-+ |
// Pour simuler un véritable Redo, l'appelant doit mettre la structure // Pour simuler un véritable Redo, l'appelant doit mettre la structure
// de page courante à jour avant l'appel, puis en réextraire les infos en // de page courante à jour avant l'appel, puis en réextraire les infos en
// sortie, ainsi que celles relatives à la plus récente page d'undo (1ère // sortie, ainsi que celles relatives à la plus récente page d'undo (1ère
// page de la liste). // page de la liste).
if (Last_backed_up_layers) if (Last_backed_up_layers)
{ {
@ -651,15 +651,15 @@ void Change_page_number_of_list(T_List_of_pages * list,int number)
void Free_page_of_a_list(T_List_of_pages * list) void Free_page_of_a_list(T_List_of_pages * list)
{ {
// On ne peut pas détruire la page courante de la liste si après // On ne peut pas détruire la page courante de la liste si après
// destruction il ne reste pas encore au moins une page. // destruction il ne reste pas encore au moins une page.
if (list->List_size>1) if (list->List_size>1)
{ {
// On fait faire un undo à la liste, comme ça, la nouvelle page courante // On fait faire un undo à la liste, comme ça, la nouvelle page courante
// est la page précédente // est la page précédente
Backward_in_list_of_pages(Main.backups); Backward_in_list_of_pages(Main.backups);
// Puis on détruit la dernière page, qui est l'ancienne page courante // Puis on détruit la dernière page, qui est l'ancienne page courante
Free_last_page_of_list(list); Free_last_page_of_list(list);
} }
} }
@ -758,18 +758,18 @@ int Update_spare_buffers(int width, int height)
int Init_all_backup_lists(enum IMAGE_MODES image_mode, int width, int height) int Init_all_backup_lists(enum IMAGE_MODES image_mode, int width, int height)
{ {
// width et height correspondent à la dimension des images de départ. // width et height correspondent à la dimension des images de départ.
int i; int i;
if (! Allocate_list_of_pages(Main.backups) || if (! Allocate_list_of_pages(Main.backups) ||
! Allocate_list_of_pages(Spare.backups)) ! Allocate_list_of_pages(Spare.backups))
return 0; return 0;
// On a réussi à allouer deux listes de pages dont la taille correspond à // On a réussi à allouer deux listes de pages dont la taille correspond à
// celle demandée par l'utilisateur. // celle demandée par l'utilisateur.
// On crée un descripteur de page correspondant à la page principale // On crée un descripteur de page correspondant à la page principale
Upload_infos_page(&Main); Upload_infos_page(&Main);
// On y met les infos sur la dimension de démarrage // On y met les infos sur la dimension de démarrage
Main.backups->Pages->Width=width; Main.backups->Pages->Width=width;
Main.backups->Pages->Height=height; Main.backups->Pages->Height=height;
strcpy(Main.backups->Pages->File_directory,Main.selector.Directory); strcpy(Main.backups->Pages->File_directory,Main.selector.Directory);
@ -849,7 +849,7 @@ void Set_number_of_backups(int nb_backups)
Change_page_number_of_list(Main.backups,nb_backups+1); Change_page_number_of_list(Main.backups,nb_backups+1);
Change_page_number_of_list(Spare.backups,nb_backups+1); Change_page_number_of_list(Spare.backups,nb_backups+1);
// Le +1 vient du fait que dans chaque liste, en 1ère position on retrouve // Le +1 vient du fait que dans chaque liste, en 1ère position on retrouve
// les infos de la page courante sur le brouillon et la page principale. // les infos de la page courante sur le brouillon et la page principale.
// (nb_backups = Nombre de backups, sans compter les pages courantes) // (nb_backups = Nombre de backups, sans compter les pages courantes)
} }
@ -859,7 +859,7 @@ int Backup_new_image(int layers,int width,int height)
// Retourne 1 si une nouvelle page est disponible et 0 sinon // Retourne 1 si une nouvelle page est disponible et 0 sinon
T_Page * new_page; T_Page * new_page;
// On crée un descripteur pour la nouvelle page courante // On crée un descripteur pour la nouvelle page courante
new_page=New_page(layers); new_page=New_page(layers);
if (!new_page) if (!new_page)
{ {
@ -893,7 +893,7 @@ int Backup_with_new_dimensions(int width,int height)
T_Page * new_page; T_Page * new_page;
int i; int i;
// On crée un descripteur pour la nouvelle page courante // On crée un descripteur pour la nouvelle page courante
new_page=New_page(Main.backups->Pages->Nb_layers); new_page=New_page(Main.backups->Pages->Nb_layers);
if (!new_page) if (!new_page)
{ {
@ -1039,7 +1039,7 @@ int Backup_and_resize_the_spare(int width,int height)
int nb_layers; int nb_layers;
nb_layers=Spare.backups->Pages->Nb_layers; nb_layers=Spare.backups->Pages->Nb_layers;
// On crée un descripteur pour la nouvelle page de brouillon // On crée un descripteur pour la nouvelle page de brouillon
new_page=New_page(nb_layers); new_page=New_page(nb_layers);
if (!new_page) if (!new_page)
{ {
@ -1075,8 +1075,8 @@ int Backup_and_resize_the_spare(int width,int height)
} }
void Backup(void) void Backup(void)
// Sauve la page courante comme première page de backup et crée une nouvelle page // Sauve la page courante comme première page de backup et crée une nouvelle page
// pur continuer à dessiner. Utilisé par exemple pour le fill // pur continuer à dessiner. Utilisé par exemple pour le fill
{ {
Backup_layers(Main.current_layer); Backup_layers(Main.current_layer);
} }
@ -1091,7 +1091,7 @@ void Backup_layers(int layer)
return; // Already done. return; // Already done.
*/ */
// On remet à jour l'état des infos de la page courante (pour pouvoir les // On remet à jour l'état des infos de la page courante (pour pouvoir les
// retrouver plus tard) // retrouver plus tard)
Upload_infos_page(&Main); Upload_infos_page(&Main);
@ -1204,20 +1204,20 @@ void Undo(void)
Last_backed_up_layers=0; Last_backed_up_layers=0;
} }
// On remet à jour l'état des infos de la page courante (pour pouvoir les // On remet à jour l'état des infos de la page courante (pour pouvoir les
// retrouver plus tard) // retrouver plus tard)
Upload_infos_page(&Main); Upload_infos_page(&Main);
// On fait faire un undo à la liste des backups de la page principale // On fait faire un undo à la liste des backups de la page principale
Backward_in_list_of_pages(Main.backups); Backward_in_list_of_pages(Main.backups);
Update_buffers(Main.backups->Pages->Width, Main.backups->Pages->Height); Update_buffers(Main.backups->Pages->Width, Main.backups->Pages->Height);
// On extrait ensuite les infos sur la nouvelle page courante // On extrait ensuite les infos sur la nouvelle page courante
Download_infos_page_main(Main.backups->Pages); Download_infos_page_main(Main.backups->Pages);
// Note: le backup n'a pas obligatoirement les mêmes dimensions ni la même // Note: le backup n'a pas obligatoirement les mêmes dimensions ni la même
// palette que la page courante. Mais en temps normal, le backup // palette que la page courante. Mais en temps normal, le backup
// n'est pas utilisé à la suite d'un Undo. Donc ça ne devrait pas // n'est pas utilisé à la suite d'un Undo. Donc ça ne devrait pas
// poser de problèmes. // poser de problèmes.
Check_layers_limits(); Check_layers_limits();
Redraw_layered_image(); Redraw_layered_image();
@ -1237,20 +1237,20 @@ void Redo(void)
Free_page_of_a_list(Main.backups); Free_page_of_a_list(Main.backups);
Last_backed_up_layers=0; Last_backed_up_layers=0;
} }
// On remet à jour l'état des infos de la page courante (pour pouvoir les // On remet à jour l'état des infos de la page courante (pour pouvoir les
// retrouver plus tard) // retrouver plus tard)
Upload_infos_page(&Main); Upload_infos_page(&Main);
// On fait faire un redo à la liste des backups de la page principale // On fait faire un redo à la liste des backups de la page principale
Advance_in_list_of_pages(Main.backups); Advance_in_list_of_pages(Main.backups);
Update_buffers(Main.backups->Pages->Width, Main.backups->Pages->Height); Update_buffers(Main.backups->Pages->Width, Main.backups->Pages->Height);
// On extrait ensuite les infos sur la nouvelle page courante // On extrait ensuite les infos sur la nouvelle page courante
Download_infos_page_main(Main.backups->Pages); Download_infos_page_main(Main.backups->Pages);
// Note: le backup n'a pas obligatoirement les mêmes dimensions ni la même // Note: le backup n'a pas obligatoirement les mêmes dimensions ni la même
// palette que la page courante. Mais en temps normal, le backup // palette que la page courante. Mais en temps normal, le backup
// n'est pas utilisé à la suite d'un Redo. Donc ça ne devrait pas // n'est pas utilisé à la suite d'un Redo. Donc ça ne devrait pas
// poser de problèmes. // poser de problèmes.
Check_layers_limits(); Check_layers_limits();
Redraw_layered_image(); Redraw_layered_image();
@ -1262,15 +1262,15 @@ void Redo(void)
void Free_current_page(void) void Free_current_page(void)
{ {
// On détruit la page courante de la liste principale // On détruit la page courante de la liste principale
Free_page_of_a_list(Main.backups); Free_page_of_a_list(Main.backups);
// On extrait ensuite les infos sur la nouvelle page courante // On extrait ensuite les infos sur la nouvelle page courante
Download_infos_page_main(Main.backups->Pages); Download_infos_page_main(Main.backups->Pages);
// Note: le backup n'a pas obligatoirement les mêmes dimensions ni la même // Note: le backup n'a pas obligatoirement les mêmes dimensions ni la même
// palette que la page courante. Mais en temps normal, le backup // palette que la page courante. Mais en temps normal, le backup
// n'est pas utilisé à la suite d'une destruction de page. Donc ça ne // n'est pas utilisé à la suite d'une destruction de page. Donc ça ne
// devrait pas poser de problèmes. // devrait pas poser de problèmes.
Update_buffers(Main.backups->Pages->Width, Main.backups->Pages->Height); Update_buffers(Main.backups->Pages->Width, Main.backups->Pages->Height);
Check_layers_limits(); Check_layers_limits();

View File

@ -2,7 +2,7 @@
*/ */
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2007 Adrien Destugues Copyright 2007 Adrien Destugues
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)

View File

@ -57,9 +57,9 @@ int RGB_scale = 256; // 24bit
// Nombre de graduations pour une composante dans le mode actuel // Nombre de graduations pour une composante dans le mode actuel
int Color_count=256; int Color_count=256;
// Les composantes vont de 0 à (Color_count-1) // Les composantes vont de 0 à (Color_count-1)
int Color_max=255; int Color_max=255;
// Le demi-pas est une quantité que l'on ajoute à une composante // Le demi-pas est une quantité que l'on ajoute à une composante
// avant de faire un arrondi par division. // avant de faire un arrondi par division.
int Color_halfstep=0; int Color_halfstep=0;
@ -134,7 +134,7 @@ static int Add_encoded(int comp, int offset)
} }
// Définir les unités pour les graduations R G B ou H S V // Définir les unités pour les graduations R G B ou H S V
void Component_unit(int count) void Component_unit(int count)
{ {
Color_count = count; Color_count = count;
@ -200,7 +200,7 @@ void Set_blue(byte color, short new_color, T_Palette palette)
} }
void Format_component(byte value, char *str) void Format_component(byte value, char *str)
// Formate une chaine de 4 caractères+\0 : "nnn " // Formate une chaine de 4 caractères+\0 : "nnn "
{ {
Num2str(value,str,3); Num2str(value,str,3);
str[3]=' '; str[3]=' ';
@ -208,8 +208,8 @@ void Format_component(byte value, char *str)
} }
void Spread_colors(short start,short end,T_Palette palette) void Spread_colors(short start,short end,T_Palette palette)
// Modifie la palette pour obtenir un dégradé de couleur entre les deux bornes // Modifie la palette pour obtenir un dégradé de couleur entre les deux bornes
// passées en paramètre // passées en paramètre
{ {
short start_red; short start_red;
short start_green; short start_green;
@ -219,8 +219,8 @@ void Spread_colors(short start,short end,T_Palette palette)
short end_blue; short end_blue;
short index; short index;
// On vérifie qu'il y ait assez de couleurs entre le début et la fin pour // On vérifie qu'il y ait assez de couleurs entre le début et la fin pour
// pouvoir faire un dégradé: // pouvoir faire un dégradé:
if ( (start!=end) && (start+1!=end) ) if ( (start!=end) && (start+1!=end) )
{ {
start_red = Encode_component(palette[start].R); start_red = Encode_component(palette[start].R);
@ -358,7 +358,7 @@ void Remap_image_highlevel(byte * conversion_table)
Main.backups->Pages->Transparent_color = Main.backups->Pages->Transparent_color =
conversion_table[Main.backups->Pages->Transparent_color]; conversion_table[Main.backups->Pages->Transparent_color];
// On calcule les limites à l'écran de l'image // On calcule les limites à l'écran de l'image
if (Main.image_height>=Menu_Y_before_window) if (Main.image_height>=Menu_Y_before_window)
end_y=Menu_Y_before_window; end_y=Menu_Y_before_window;
else else
@ -390,19 +390,19 @@ void Remap_image_highlevel(byte * conversion_table)
end_y_mag=Main.image_height*Main.magnifier_factor; end_y_mag=Main.image_height*Main.magnifier_factor;
} }
// On doit maintenant faire la traduction à l'écran // On doit maintenant faire la traduction à l'écran
Remap_zone_highlevel(0,0,end_x,end_y,conversion_table); Remap_zone_highlevel(0,0,end_x,end_y,conversion_table);
if (Main.magnifier_mode) if (Main.magnifier_mode)
{ {
Remap_zone_highlevel(Main.separator_position,0,end_x_mag,end_y_mag,conversion_table); Remap_zone_highlevel(Main.separator_position,0,end_x_mag,end_y_mag,conversion_table);
// Il peut encore rester le bas de la barre de split à remapper si la // Il peut encore rester le bas de la barre de split à remapper si la
// partie zoomée ne descend pas jusqu'en bas... // partie zoomée ne descend pas jusqu'en bas...
Remap_zone_highlevel(Main.separator_position,end_y_mag, Remap_zone_highlevel(Main.separator_position,end_y_mag,
(Main.separator_position+(SEPARATOR_WIDTH*Menu_factor_X)), (Main.separator_position+(SEPARATOR_WIDTH*Menu_factor_X)),
Menu_Y_before_window,conversion_table); Menu_Y_before_window,conversion_table);
} }
// Remappe tous les fonds de fenetre (qui doivent contenir un bout d'écran) // Remappe tous les fonds de fenetre (qui doivent contenir un bout d'écran)
Remap_window_backgrounds(conversion_table, 0, Menu_Y_before_window); Remap_window_backgrounds(conversion_table, 0, Menu_Y_before_window);
} }
@ -424,12 +424,12 @@ void Swap(int with_remap,short block_1_start,short block_2_start,short block_siz
// On fait une copie de la table d'used des couleurs // On fait une copie de la table d'used des couleurs
memcpy(temp_usage, color_usage, sizeof(dword) * 256); memcpy(temp_usage, color_usage, sizeof(dword) * 256);
// On commence à initialiser la table de conversion à un état où elle ne // On commence à initialiser la table de conversion à un état où elle ne
// fera aucune conversion. // fera aucune conversion.
for (pos_1=0;pos_1<=255;pos_1++) for (pos_1=0;pos_1<=255;pos_1++)
conversion_table[pos_1]=pos_1; conversion_table[pos_1]=pos_1;
// On calcul les dernières couleurs de chaque bloc. // On calcul les dernières couleurs de chaque bloc.
end_1=block_1_start+block_size-1; end_1=block_1_start+block_size-1;
end_2=block_2_start+block_size-1; end_2=block_2_start+block_size-1;
@ -447,7 +447,7 @@ void Swap(int with_remap,short block_1_start,short block_2_start,short block_siz
palette[pos_1].G=temp_palette[pos_2].G; palette[pos_1].G=temp_palette[pos_2].G;
palette[pos_1].B=temp_palette[pos_2].B; palette[pos_1].B=temp_palette[pos_2].B;
// On gère la mise à jour de pos_2 // On gère la mise à jour de pos_2
if (pos_2==end_2) if (pos_2==end_2)
pos_2=block_1_start; pos_2=block_1_start;
else else
@ -457,7 +457,7 @@ void Swap(int with_remap,short block_1_start,short block_2_start,short block_siz
else else
if ((block_2_start<block_1_start) && (end_2>=block_1_start)) if ((block_2_start<block_1_start) && (end_2>=block_1_start))
{ {
// Le bloc destination déborde dans le bloc source. // Le bloc destination déborde dans le bloc source.
for (pos_1=block_2_start,pos_2=block_1_start;pos_1<=end_1;pos_1++) for (pos_1=block_2_start,pos_2=block_1_start;pos_1<=end_1;pos_1++)
{ {
@ -469,7 +469,7 @@ void Swap(int with_remap,short block_1_start,short block_2_start,short block_siz
palette[pos_1].G=temp_palette[pos_2].G; palette[pos_1].G=temp_palette[pos_2].G;
palette[pos_1].B=temp_palette[pos_2].B; palette[pos_1].B=temp_palette[pos_2].B;
// On gère la mise à jour de pos_2 // On gère la mise à jour de pos_2
if (pos_2==end_1) if (pos_2==end_1)
pos_2=block_2_start; pos_2=block_2_start;
else else
@ -487,7 +487,7 @@ void Swap(int with_remap,short block_1_start,short block_2_start,short block_siz
conversion_table[pos_2]=pos_1; conversion_table[pos_2]=pos_1;
// On intervertit le nombre d'used des couleurs pour garder une // On intervertit le nombre d'used des couleurs pour garder une
// cohérence lors d'un éventuel "Zap unused". // cohérence lors d'un éventuel "Zap unused".
SWAP_DWORDS(color_usage[pos_1], color_usage[pos_2]) SWAP_DWORDS(color_usage[pos_1], color_usage[pos_2])
// On fait un changement de teinte: // On fait un changement de teinte:
@ -522,7 +522,7 @@ void Set_nice_menu_colors(dword * color_usage,int not_picture)
for (index=0; index<256; index++) for (index=0; index<256; index++)
replace_table[index]=index; replace_table[index]=index;
// On recherche les 4 couleurs les moins utilisées dans l'image pour pouvoir // On recherche les 4 couleurs les moins utilisées dans l'image pour pouvoir
// les remplacer par les nouvelles couleurs. // les remplacer par les nouvelles couleurs.
for (index2=0; index2<4; index2++) for (index2=0; index2<4; index2++)
for (index=255; index>=0; index--) for (index=255; index>=0; index--)
@ -533,11 +533,11 @@ void Set_nice_menu_colors(dword * color_usage,int not_picture)
new_colors[index2]=index; new_colors[index2]=index;
} }
// On trie maintenant la table dans le sens décroissant. // On trie maintenant la table dans le sens décroissant.
// (Ce n'est pas indispensable, mais ça fera plus joli dans la palette). // (Ce n'est pas indispensable, mais ça fera plus joli dans la palette).
do do
{ {
color=0; // Booléen qui dit si le tri n'est pas terminé. color=0; // Booléen qui dit si le tri n'est pas terminé.
for (index=0; index<3; index++) for (index=0; index<3; index++)
{ {
if (new_colors[index]>new_colors[index+1]) if (new_colors[index]>new_colors[index+1])
@ -551,7 +551,7 @@ void Set_nice_menu_colors(dword * color_usage,int not_picture)
} while (color); } while (color);
// On sauvegarde dans rgb les teintes qu'on va remplacer et on met les // On sauvegarde dans rgb les teintes qu'on va remplacer et on met les
// couleurs du menu par défaut // couleurs du menu par défaut
for (index=0; index<4; index++) for (index=0; index<4; index++)
{ {
const T_Components * target_rgb; const T_Components * target_rgb;
@ -566,7 +566,7 @@ void Set_nice_menu_colors(dword * color_usage,int not_picture)
Main.palette[color].B=Round_palette_component(target_rgb->B); Main.palette[color].B=Round_palette_component(target_rgb->B);
} }
// Maintenant qu'on a placé notre nouvelle palette, on va chercher quelles // Maintenant qu'on a placé notre nouvelle palette, on va chercher quelles
// sont les couleurs qui peuvent remplacer les anciennes // sont les couleurs qui peuvent remplacer les anciennes
Hide_cursor(); Hide_cursor();
for (index=0; index<4; index++) for (index=0; index<4; index++)
@ -580,7 +580,7 @@ void Set_nice_menu_colors(dword * color_usage,int not_picture)
} }
else else
{ {
// On fait un changement des couleurs visibles à l'écran et dans l'image // On fait un changement des couleurs visibles à l'écran et dans l'image
Remap_image_highlevel(replace_table); Remap_image_highlevel(replace_table);
} }
Display_cursor(); Display_cursor();
@ -600,20 +600,20 @@ void Reduce_palette(short * used_colors,int nb_colors_asked,T_Palette palette,dw
dword used; dword used;
dword best_used; dword best_used;
// On commence par initialiser la table de conversion dans un état où // On commence par initialiser la table de conversion dans un état où
// aucune conversion ne sera effectuée. // aucune conversion ne sera effectuée.
for (color_1=0; color_1<=255; color_1++) for (color_1=0; color_1<=255; color_1++)
conversion_table[color_1]=color_1; conversion_table[color_1]=color_1;
// Si on ne connait pas encore le nombre de couleurs utilisées, on le // Si on ne connait pas encore le nombre de couleurs utilisées, on le
// calcule! (!!! La fonction appelée Efface puis Affiche le curseur !!!) // calcule! (!!! La fonction appelée Efface puis Affiche le curseur !!!)
if ((*used_colors)<0) if ((*used_colors)<0)
Update_color_count(used_colors,color_usage); Update_color_count(used_colors,color_usage);
Hide_cursor(); Hide_cursor();
// On tasse la palette vers le début parce qu'elle doit ressembler à // On tasse la palette vers le début parce qu'elle doit ressembler à
// du Gruyère (et comme Papouille il aime pas le fromage...) // du Gruyère (et comme Papouille il aime pas le fromage...)
// Pour cela, on va scruter la couleur color_1 et se servir de l'indice // Pour cela, on va scruter la couleur color_1 et se servir de l'indice
// color_2 comme position de destination. // color_2 comme position de destination.
@ -626,19 +626,19 @@ void Reduce_palette(short * used_colors,int nb_colors_asked,T_Palette palette,dw
palette[color_2].G=palette[color_1].G; palette[color_2].G=palette[color_1].G;
palette[color_2].B=palette[color_1].B; palette[color_2].B=palette[color_1].B;
// Ensuite, on met à jour le tableau d'occupation des couleurs. // Ensuite, on met à jour le tableau d'occupation des couleurs.
color_usage[color_2]=color_usage[color_1]; color_usage[color_2]=color_usage[color_1];
// On va maintenant s'occuper de la table de conversion: // On va maintenant s'occuper de la table de conversion:
conversion_table[color_1]=color_2; conversion_table[color_1]=color_2;
// Maintenant, la place désignée par color_2 est occupée, alors on // Maintenant, la place désignée par color_2 est occupée, alors on
// doit passer à un indice de destination suivant. // doit passer à un indice de destination suivant.
color_2++; color_2++;
} }
} }
// On met toutes les couleurs inutilisées en noir // On met toutes les couleurs inutilisées en noir
for (;color_2<256;color_2++) for (;color_2<256;color_2++)
{ {
palette[color_2].R=0; palette[color_2].R=0;
@ -647,14 +647,14 @@ void Reduce_palette(short * used_colors,int nb_colors_asked,T_Palette palette,dw
color_usage[color_2]=0; color_usage[color_2]=0;
} }
// Maintenant qu'on a une palette clean, on va boucler en réduisant // Maintenant qu'on a une palette clean, on va boucler en réduisant
// le nombre de couleurs jusqu'à ce qu'on atteigne le nombre désiré. // le nombre de couleurs jusqu'à ce qu'on atteigne le nombre désiré.
// (The stop condition is further down) // (The stop condition is further down)
while (1) while (1)
{ {
// Il s'agit de trouver les 2 couleurs qui se ressemblent le plus // Il s'agit de trouver les 2 couleurs qui se ressemblent le plus
// parmis celles qui sont utilisées (bien sûr) et de les remplacer par // parmis celles qui sont utilisées (bien sûr) et de les remplacer par
// une seule couleur qui est la moyenne pondérée de ces 2 couleurs // une seule couleur qui est la moyenne pondérée de ces 2 couleurs
// en fonction de leur utilisation dans l'image. // en fonction de leur utilisation dans l'image.
best_difference =26*255*26*255+55*255*255+19*255*19*255; best_difference =26*255*26*255+55*255*255+19*255*19*255;
@ -690,14 +690,14 @@ void Reduce_palette(short * used_colors,int nb_colors_asked,T_Palette palette,dw
if (best_difference!=0 && (*used_colors)<=nb_colors_asked) if (best_difference!=0 && (*used_colors)<=nb_colors_asked)
break; break;
// Maintenant qu'on les a trouvées, on va pouvoir mettre à jour nos // Maintenant qu'on les a trouvées, on va pouvoir mettre à jour nos
// données pour que le remplacement se fasse sans encombres. // données pour que le remplacement se fasse sans encombres.
// En somme, on va remplacer best_color_2 par best_color_1, // En somme, on va remplacer best_color_2 par best_color_1,
// mais attention, on ne remplace pas best_color_1 par // mais attention, on ne remplace pas best_color_1 par
// best_color_2 ! // best_color_2 !
// On met à jour la palette. // On met à jour la palette.
palette[best_color_1].R=Round_div((color_usage[best_color_1]*palette[best_color_1].R)+ palette[best_color_1].R=Round_div((color_usage[best_color_1]*palette[best_color_1].R)+
(color_usage[best_color_2]*palette[best_color_2].R), (color_usage[best_color_2]*palette[best_color_2].R),
best_used); best_used);
@ -708,78 +708,78 @@ void Reduce_palette(short * used_colors,int nb_colors_asked,T_Palette palette,dw
(color_usage[best_color_2]*palette[best_color_2].B), (color_usage[best_color_2]*palette[best_color_2].B),
best_used); best_used);
// On met à jour la table d'utilisation. // On met à jour la table d'utilisation.
color_usage[best_color_1]+=color_usage[best_color_2]; color_usage[best_color_1]+=color_usage[best_color_2];
color_usage[best_color_2]=0; color_usage[best_color_2]=0;
// On met à jour la table de conversion. // On met à jour la table de conversion.
for (color_1=0;color_1<=255;color_1++) for (color_1=0;color_1<=255;color_1++)
{ {
if (conversion_table[color_1]==best_color_2) if (conversion_table[color_1]==best_color_2)
{ {
// La color_1 avait déjà prévue de se faire remplacer par la // La color_1 avait déjà prévue de se faire remplacer par la
// couleur que l'on veut maintenant éliminer. On va maintenant // couleur que l'on veut maintenant éliminer. On va maintenant
// demander à ce que la color_1 se fasse remplacer par la // demander à ce que la color_1 se fasse remplacer par la
// best_color_1. // best_color_1.
conversion_table[color_1]=best_color_1; conversion_table[color_1]=best_color_1;
} }
} }
// Bon, maintenant que l'on a fait bouger nos petites choses concernants // Bon, maintenant que l'on a fait bouger nos petites choses concernants
// la couleur à éliminer, on va s'occuper de faire bouger les couleurs // la couleur à éliminer, on va s'occuper de faire bouger les couleurs
// situées après la couleur à éliminer pour qu'elles se déplaçent d'une // situées après la couleur à éliminer pour qu'elles se déplaçent d'une
// couleur en arrière. // couleur en arrière.
for (color_1=0;color_1<=255;color_1++) for (color_1=0;color_1<=255;color_1++)
{ {
// Commençons par nous occuper des tables d'utilisation et de la // Commençons par nous occuper des tables d'utilisation et de la
// palette. // palette.
if (color_1>best_color_2) if (color_1>best_color_2)
{ {
// La color_1 va scroller en arrière. // La color_1 va scroller en arrière.
// Donc on transfère son utilisation dans l'utilisation de la // Donc on transfère son utilisation dans l'utilisation de la
// couleur qui la précède. // couleur qui la précède.
color_usage[color_1-1]=color_usage[color_1]; color_usage[color_1-1]=color_usage[color_1];
// Et on transfère ses teintes dans les teintes de la couleur qui // Et on transfère ses teintes dans les teintes de la couleur qui
// la précède. // la précède.
palette[color_1-1].R=palette[color_1].R; palette[color_1-1].R=palette[color_1].R;
palette[color_1-1].G=palette[color_1].G; palette[color_1-1].G=palette[color_1].G;
palette[color_1-1].B=palette[color_1].B; palette[color_1-1].B=palette[color_1].B;
} }
// Une fois la palette et la table d'utilisation gérées, on peut // Une fois la palette et la table d'utilisation gérées, on peut
// s'occuper de notre table de conversion. // s'occuper de notre table de conversion.
if (conversion_table[color_1]>best_color_2) if (conversion_table[color_1]>best_color_2)
// La color_1 avait l'intention de se faire remplacer par une // La color_1 avait l'intention de se faire remplacer par une
// couleur que l'on va (ou que l'on a déjà) bouger en arrière. // couleur que l'on va (ou que l'on a déjà) bouger en arrière.
conversion_table[color_1]--; conversion_table[color_1]--;
} }
// On vient d'éjecter une couleur, donc on peut mettre à jour le nombre // On vient d'éjecter une couleur, donc on peut mettre à jour le nombre
// de couleurs utilisées. // de couleurs utilisées.
(*used_colors)--; (*used_colors)--;
// A la fin, on doit passer (dans la palette) les teintes du dernier // A la fin, on doit passer (dans la palette) les teintes du dernier
// élément de notre ensemble en noir. // élément de notre ensemble en noir.
palette[*used_colors].R=0; palette[*used_colors].R=0;
palette[*used_colors].G=0; palette[*used_colors].G=0;
palette[*used_colors].B=0; palette[*used_colors].B=0;
// Au passage, on va s'assurer que l'on a pas oublié de la mettre à une // Au passage, on va s'assurer que l'on a pas oublié de la mettre à une
// utilisation nulle. // utilisation nulle.
color_usage[*used_colors]=0; color_usage[*used_colors]=0;
// Après avoir éjecté une couleur, on le fait savoir à l'utilisateur par // Après avoir éjecté une couleur, on le fait savoir à l'utilisateur par
// l'intermédiaire du compteur de nombre utilisées. // l'intermédiaire du compteur de nombre utilisées.
Num2str(*used_colors,str,3); Num2str(*used_colors,str,3);
Print_in_window(COUNT_X,COUNT_Y,str,MC_Black,MC_Light); Print_in_window(COUNT_X,COUNT_Y,str,MC_Black,MC_Light);
} }
// Maintenant, tous ces calculs doivent êtres pris en compte dans la // Maintenant, tous ces calculs doivent êtres pris en compte dans la
// palette, l'image et à l'écran. // palette, l'image et à l'écran.
Remap_image_highlevel(conversion_table); // Et voila pour l'image et l'écran Remap_image_highlevel(conversion_table); // Et voila pour l'image et l'écran
Display_cursor(); Display_cursor();
} }
@ -849,10 +849,10 @@ void Draw_all_palette_sliders(T_Scroller_button * red_slider,
char str[5]; char str[5];
Hide_cursor(); Hide_cursor();
// Réaffichage des jauges: // Réaffichage des jauges:
if (start!=end) if (start!=end)
{ {
// Dans le cas d'un bloc, tout à 0. // Dans le cas d'un bloc, tout à 0.
red_slider->Position =Color_max; red_slider->Position =Color_max;
Window_draw_slider(red_slider); Window_draw_slider(red_slider);
Print_counter(NUMERIC_R_X,NUMERIC_Y,"\xb1 0",MC_Black,MC_Light); Print_counter(NUMERIC_R_X,NUMERIC_Y,"\xb1 0",MC_Black,MC_Light);
@ -1100,9 +1100,9 @@ void Button_Palette(int btn)
static short reduce_colors_number = 256; static short reduce_colors_number = 256;
short temp_color; // Variable pouvant reservir pour différents calculs intermédiaires short temp_color; // Variable pouvant reservir pour différents calculs intermédiaires
dword temp; dword temp;
byte color,click; // Variables pouvant reservir pour différents calculs intermédiaires byte color,click; // Variables pouvant reservir pour différents calculs intermédiaires
short clicked_button; short clicked_button;
word old_mouse_x; word old_mouse_x;
word old_mouse_y; word old_mouse_y;
@ -1251,7 +1251,7 @@ void Button_Palette(int btn)
Window_set_normal_button( 44,178,35,14,"Load" ,1,1,SDLK_l); // 26 Window_set_normal_button( 44,178,35,14,"Load" ,1,1,SDLK_l); // 26
Window_set_normal_button( 83,178,35,14,"Save" ,1,1,SDLK_s); // 27 Window_set_normal_button( 83,178,35,14,"Save" ,1,1,SDLK_s); // 27
// Dessin des petits effets spéciaux pour les boutons [+] et [-] // Dessin des petits effets spéciaux pour les boutons [+] et [-]
Draw_thingumajig(BUTTON_PLUS_X-5, BUTTON_PLUS_Y,MC_White,-1); Draw_thingumajig(BUTTON_PLUS_X-5, BUTTON_PLUS_Y,MC_White,-1);
Draw_thingumajig(BUTTON_MINUS_X+16,BUTTON_MINUS_Y,MC_Dark,+1); Draw_thingumajig(BUTTON_MINUS_X+16,BUTTON_MINUS_Y,MC_Dark,+1);
@ -1274,7 +1274,7 @@ void Button_Palette(int btn)
{ {
case 0 : // Nulle part case 0 : // Nulle part
break; break;
case -1 : // Hors de la fenêtre case -1 : // Hors de la fenêtre
case 1 : // palette case 1 : // palette
if ( (Mouse_X!=old_mouse_x) || (Mouse_Y!=old_mouse_y) || (Mouse_K!=old_mouse_k) ) if ( (Mouse_X!=old_mouse_x) || (Mouse_Y!=old_mouse_y) || (Mouse_K!=old_mouse_k) )
{ {
@ -1370,13 +1370,13 @@ void Button_Palette(int btn)
if ( (Fore_color!=temp_color) || (block_start!=block_end) ) if ( (Fore_color!=temp_color) || (block_start!=block_end) )
{ {
// La couleur en question est nouvelle ou elle annule un // La couleur en question est nouvelle ou elle annule un
// ancien bloc. Il faut donc sélectionner cette couleur comme // ancien bloc. Il faut donc sélectionner cette couleur comme
// unique couleur choisie. // unique couleur choisie.
Fore_color=first_color=last_color=block_start=block_end=temp_color; Fore_color=first_color=last_color=block_start=block_end=temp_color;
Tag_color_range(block_start,block_end); Tag_color_range(block_start,block_end);
// Affichage du n° de la couleur sélectionnée // Affichage du n° de la couleur sélectionnée
Window_rectangle(COLOR_X,COLOR_Y,56,7,MC_Light); Window_rectangle(COLOR_X,COLOR_Y,56,7,MC_Light);
Num2str(Fore_color,str,3); Num2str(Fore_color,str,3);
Print_in_window(COLOR_X,COLOR_Y,str,MC_Black,MC_Light); Print_in_window(COLOR_X,COLOR_Y,str,MC_Black,MC_Light);
@ -1398,22 +1398,22 @@ void Button_Palette(int btn)
// On maintient le click, on va donc tester si le curseur bouge // On maintient le click, on va donc tester si le curseur bouge
if (temp_color!=last_color) if (temp_color!=last_color)
{ {
// On commence par ordonner la 1ère et dernière couleur du bloc // On commence par ordonner la 1ère et dernière couleur du bloc
if (first_color<temp_color) if (first_color<temp_color)
{ {
block_start=first_color; block_start=first_color;
block_end=temp_color; block_end=temp_color;
// Affichage du n° de la couleur sélectionnée // Affichage du n° de la couleur sélectionnée
Num2str(block_start,str ,3); Num2str(block_start,str ,3);
Num2str(block_end ,str+4,3); Num2str(block_end ,str+4,3);
str[3]=26; // Flèche vers la droite str[3]=26; // Flèche vers la droite
Print_in_window(COLOR_X,COLOR_Y,str,MC_Black,MC_Light); Print_in_window(COLOR_X,COLOR_Y,str,MC_Black,MC_Light);
// Affichage des jauges // Affichage des jauges
Display_sliders(red_slider,green_slider,blue_slider,1,NULL); Display_sliders(red_slider,green_slider,blue_slider,1,NULL);
// Affichage dans le block de visu du bloc (dégradé) en cours // Affichage dans le block de visu du bloc (dégradé) en cours
Display_grad_block_in_window(FGCOLOR_DISPLAY_X,FGCOLOR_DISPLAY_Y,FGCOLOR_DISPLAY_W,FGCOLOR_DISPLAY_H,block_start,block_end); Display_grad_block_in_window(FGCOLOR_DISPLAY_X,FGCOLOR_DISPLAY_Y,FGCOLOR_DISPLAY_W,FGCOLOR_DISPLAY_H,block_start,block_end);
} }
else if (first_color>temp_color) else if (first_color>temp_color)
@ -1421,16 +1421,16 @@ void Button_Palette(int btn)
block_start=temp_color; block_start=temp_color;
block_end=first_color; block_end=first_color;
// Affichage du n° de la couleur sélectionnée // Affichage du n° de la couleur sélectionnée
Num2str(block_start,str ,3); Num2str(block_start,str ,3);
Num2str(block_end ,str+4,3); Num2str(block_end ,str+4,3);
str[3]=26; // Flèche vers la droite str[3]=26; // Flèche vers la droite
Print_in_window(COLOR_X,COLOR_Y,str,MC_Black,MC_Light); Print_in_window(COLOR_X,COLOR_Y,str,MC_Black,MC_Light);
// Affichage des jauges // Affichage des jauges
Display_sliders(red_slider,green_slider,blue_slider,1,NULL); Display_sliders(red_slider,green_slider,blue_slider,1,NULL);
// Affichage dans le block de visu du bloc (dégradé) en cours // Affichage dans le block de visu du bloc (dégradé) en cours
Display_grad_block_in_window(FGCOLOR_DISPLAY_X,FGCOLOR_DISPLAY_Y,FGCOLOR_DISPLAY_W,FGCOLOR_DISPLAY_H,block_start,block_end); Display_grad_block_in_window(FGCOLOR_DISPLAY_X,FGCOLOR_DISPLAY_Y,FGCOLOR_DISPLAY_W,FGCOLOR_DISPLAY_H,block_start,block_end);
} }
else else
@ -1438,7 +1438,7 @@ void Button_Palette(int btn)
block_start=block_end=first_color; block_start=block_end=first_color;
Window_rectangle(NUMERIC_R_X,NUMERIC_Y,72,7,MC_Light); Window_rectangle(NUMERIC_R_X,NUMERIC_Y,72,7,MC_Light);
// Affichage du n° de la couleur sélectionnée // Affichage du n° de la couleur sélectionnée
Window_rectangle(COLOR_X+24,COLOR_Y,32,7,MC_Light); Window_rectangle(COLOR_X+24,COLOR_Y,32,7,MC_Light);
Update_window_area(COLOR_X+24,COLOR_Y,32,7); Update_window_area(COLOR_X+24,COLOR_Y,32,7);
Num2str(Fore_color,str,3); Num2str(Fore_color,str,3);
@ -1520,7 +1520,7 @@ void Button_Palette(int btn)
if (red_slider->Position>Color_max) if (red_slider->Position>Color_max)
{ {
// Jauge dans les négatifs: // Jauge dans les négatifs:
Num2str(-(Color_max-red_slider->Position),str,4); Num2str(-(Color_max-red_slider->Position),str,4);
str[0]='-'; str[0]='-';
} }
@ -1601,7 +1601,7 @@ void Button_Palette(int btn)
if (green_slider->Position>Color_max) if (green_slider->Position>Color_max)
{ {
// Jauge dans les négatifs: // Jauge dans les négatifs:
Num2str(-(Color_max-green_slider->Position),str,4); Num2str(-(Color_max-green_slider->Position),str,4);
str[0]='-'; str[0]='-';
} }
@ -1682,7 +1682,7 @@ void Button_Palette(int btn)
if (blue_slider->Position>Color_max) if (blue_slider->Position>Color_max)
{ {
// Jauge dans les négatifs: // Jauge dans les négatifs:
Num2str(-(Color_max-blue_slider->Position),str,4); Num2str(-(Color_max-blue_slider->Position),str,4);
str[0]='-'; str[0]='-';
} }
@ -1778,7 +1778,7 @@ void Button_Palette(int btn)
} }
} }
Draw_all_palette_sliders(red_slider,green_slider,blue_slider,working_palette,block_start,block_end); Draw_all_palette_sliders(red_slider,green_slider,blue_slider,working_palette,block_start,block_end);
// On prépare la "modifiabilité" des nouvelles couleurs // On prépare la "modifiabilité" des nouvelles couleurs
Set_palette(working_palette); Set_palette(working_palette);
memcpy(temp_palette,working_palette,sizeof(T_Palette)); memcpy(temp_palette,working_palette,sizeof(T_Palette));
need_to_remap=1; need_to_remap=1;
@ -1797,7 +1797,7 @@ void Button_Palette(int btn)
Set_blue (i,temp_color,working_palette); Set_blue (i,temp_color,working_palette);
} }
Draw_all_palette_sliders(red_slider,green_slider,blue_slider,working_palette,block_start,block_end); Draw_all_palette_sliders(red_slider,green_slider,blue_slider,working_palette,block_start,block_end);
// On prépare la "modifiabilité" des nouvelles couleurs // On prépare la "modifiabilité" des nouvelles couleurs
Set_palette(working_palette); Set_palette(working_palette);
memcpy(temp_palette,working_palette,sizeof(T_Palette)); memcpy(temp_palette,working_palette,sizeof(T_Palette));
@ -1814,7 +1814,7 @@ void Button_Palette(int btn)
Palette_edit_step(); Palette_edit_step();
// On calcule le nombre de couleurs a swapper sans risquer de sortir // On calcule le nombre de couleurs a swapper sans risquer de sortir
// de la palette (La var. first_color est utilisée pour économiser 1 var; c'est tout) // de la palette (La var. first_color est utilisée pour économiser 1 var; c'est tout)
first_color=(temp_color+block_end-block_start<=255)?block_end+1-block_start:256-temp_color; first_color=(temp_color+block_end-block_start<=255)?block_end+1-block_start:256-temp_color;
if (clicked_button==8) // On ne fait de backup de l'image que si on if (clicked_button==8) // On ne fait de backup de l'image que si on
@ -1829,17 +1829,17 @@ void Button_Palette(int btn)
memcpy(temp_palette,working_palette,sizeof(T_Palette)); memcpy(temp_palette,working_palette,sizeof(T_Palette));
// On déplace le bloc vers les modifs: // On déplace le bloc vers les modifs:
last_color=block_end=temp_color+first_color-1; last_color=block_end=temp_color+first_color-1;
Fore_color=first_color=block_start=temp_color; Fore_color=first_color=block_start=temp_color;
// On raffiche le n° des bornes du bloc: // On raffiche le n° des bornes du bloc:
if (block_start!=block_end) if (block_start!=block_end)
{ {
// Cas d'un bloc multi-couleur // Cas d'un bloc multi-couleur
Num2str(block_start,str ,3); Num2str(block_start,str ,3);
Num2str(block_end ,str+4,3); Num2str(block_end ,str+4,3);
str[3]=26; // Flèche vers la droite str[3]=26; // Flèche vers la droite
// Affichage dans le block de visu du bloc (dégradé) en cours // Affichage dans le block de visu du bloc (dégradé) en cours
Display_grad_block_in_window(FGCOLOR_DISPLAY_X,FGCOLOR_DISPLAY_Y,FGCOLOR_DISPLAY_W,FGCOLOR_DISPLAY_H,block_start,block_end); Display_grad_block_in_window(FGCOLOR_DISPLAY_X,FGCOLOR_DISPLAY_Y,FGCOLOR_DISPLAY_W,FGCOLOR_DISPLAY_H,block_start,block_end);
} }
else else
@ -1884,17 +1884,17 @@ void Button_Palette(int btn)
((temp_color+block_end-block_start<=255)?block_end+1-block_start:256-temp_color)*3); ((temp_color+block_end-block_start<=255)?block_end+1-block_start:256-temp_color)*3);
memcpy(temp_palette,working_palette,sizeof(T_Palette)); memcpy(temp_palette,working_palette,sizeof(T_Palette));
Set_palette(working_palette); Set_palette(working_palette);
// On déplace le bloc vers les modifs: // On déplace le bloc vers les modifs:
last_color=block_end=((temp_color+block_end-block_start<=255)?(temp_color+block_end-block_start):255); last_color=block_end=((temp_color+block_end-block_start<=255)?(temp_color+block_end-block_start):255);
Fore_color=first_color=block_start=temp_color; Fore_color=first_color=block_start=temp_color;
// On raffiche le n° des bornes du bloc: // On raffiche le n° des bornes du bloc:
if (block_start!=block_end) if (block_start!=block_end)
{ {
// Cas d'un bloc multi-couleur // Cas d'un bloc multi-couleur
Num2str(block_start,str ,3); Num2str(block_start,str ,3);
Num2str(block_end ,str+4,3); Num2str(block_end ,str+4,3);
str[3]=26; // Flèche vers la droite str[3]=26; // Flèche vers la droite
// Affichage dans le block de visu du bloc (dégradé) en cours // Affichage dans le block de visu du bloc (dégradé) en cours
Display_grad_block_in_window(FGCOLOR_DISPLAY_X,FGCOLOR_DISPLAY_Y,FGCOLOR_DISPLAY_W,FGCOLOR_DISPLAY_H,block_start,block_end); Display_grad_block_in_window(FGCOLOR_DISPLAY_X,FGCOLOR_DISPLAY_Y,FGCOLOR_DISPLAY_W,FGCOLOR_DISPLAY_H,block_start,block_end);
} }
else else
@ -1938,7 +1938,7 @@ void Button_Palette(int btn)
} }
Draw_all_palette_sliders(red_slider,green_slider,blue_slider,working_palette,block_start,block_end); Draw_all_palette_sliders(red_slider,green_slider,blue_slider,working_palette,block_start,block_end);
// On prépare la "modifiabilité" des nouvelles couleurs // On prépare la "modifiabilité" des nouvelles couleurs
Set_palette(working_palette); Set_palette(working_palette);
@ -1985,7 +1985,7 @@ void Button_Palette(int btn)
memcpy(Main.palette, temp_palette, sizeof(T_Palette)); memcpy(Main.palette, temp_palette, sizeof(T_Palette));
} }
Set_palette(working_palette); // On définit la nouvelle palette Set_palette(working_palette); // On définit la nouvelle palette
Draw_all_palette_sliders(red_slider, green_slider, blue_slider, Draw_all_palette_sliders(red_slider, green_slider, blue_slider,
working_palette, block_start, block_end); working_palette, block_start, block_end);
memcpy(temp_palette, working_palette, sizeof(T_Palette)); memcpy(temp_palette, working_palette, sizeof(T_Palette));
@ -2098,7 +2098,7 @@ void Button_Palette(int btn)
// -- red -- // -- red --
if (red_slider->Position>Color_max) if (red_slider->Position>Color_max)
{ {
// Jauge dans les négatifs: // Jauge dans les négatifs:
Num2str(-(Color_max-red_slider->Position),str,4); Num2str(-(Color_max-red_slider->Position),str,4);
str[0]='-'; str[0]='-';
} }
@ -2119,7 +2119,7 @@ void Button_Palette(int btn)
// -- green -- // -- green --
if (green_slider->Position>Color_max) if (green_slider->Position>Color_max)
{ {
// Jauge dans les négatifs: // Jauge dans les négatifs:
Num2str(-(Color_max-green_slider->Position),str,4); Num2str(-(Color_max-green_slider->Position),str,4);
str[0]='-'; str[0]='-';
} }
@ -2140,7 +2140,7 @@ void Button_Palette(int btn)
// -- blue -- // -- blue --
if (blue_slider->Position>Color_max) if (blue_slider->Position>Color_max)
{ {
// Jauge dans les négatifs: // Jauge dans les négatifs:
Num2str(-(Color_max-blue_slider->Position),str,4); Num2str(-(Color_max-blue_slider->Position),str,4);
str[0]='-'; str[0]='-';
} }
@ -2224,7 +2224,7 @@ void Button_Palette(int btn)
// -- red -- // -- red --
if (red_slider->Position>Color_max) if (red_slider->Position>Color_max)
{ {
// Jauge dans les négatifs: // Jauge dans les négatifs:
Num2str(-(Color_max-red_slider->Position),str,4); Num2str(-(Color_max-red_slider->Position),str,4);
str[0]='-'; str[0]='-';
} }
@ -2245,7 +2245,7 @@ void Button_Palette(int btn)
// -- green -- // -- green --
if (green_slider->Position>Color_max) if (green_slider->Position>Color_max)
{ {
// Jauge dans les négatifs: // Jauge dans les négatifs:
Num2str(-(Color_max-green_slider->Position),str,4); Num2str(-(Color_max-green_slider->Position),str,4);
str[0]='-'; str[0]='-';
} }
@ -2266,7 +2266,7 @@ void Button_Palette(int btn)
// -- blue -- // -- blue --
if (blue_slider->Position>Color_max) if (blue_slider->Position>Color_max)
{ {
// Jauge dans les négatifs: // Jauge dans les négatifs:
Num2str(-(Color_max-blue_slider->Position),str,4); Num2str(-(Color_max-blue_slider->Position),str,4);
str[0]='-'; str[0]='-';
} }
@ -2302,7 +2302,7 @@ void Button_Palette(int btn)
} }
Draw_all_palette_sliders(red_slider,green_slider,blue_slider,working_palette,block_start,block_end); Draw_all_palette_sliders(red_slider,green_slider,blue_slider,working_palette,block_start,block_end);
Set_palette(working_palette); Set_palette(working_palette);
// On prépare la "modifiabilité" des nouvelles couleurs // On prépare la "modifiabilité" des nouvelles couleurs
memcpy(temp_palette,working_palette,sizeof(T_Palette)); memcpy(temp_palette,working_palette,sizeof(T_Palette));
need_to_remap=1; need_to_remap=1;
@ -2352,7 +2352,7 @@ void Button_Palette(int btn)
End_of_modification(); End_of_modification();
Palette_edit_step(); // Disable Undo Palette_edit_step(); // Disable Undo
} }
// On prépare la "modifiabilité" des nouvelles couleurs // On prépare la "modifiabilité" des nouvelles couleurs
Set_palette(working_palette); Set_palette(working_palette);
memcpy(temp_palette,working_palette,sizeof(T_Palette)); memcpy(temp_palette,working_palette,sizeof(T_Palette));
@ -2398,7 +2398,7 @@ void Button_Palette(int btn)
case 23 : // Sort palette case 23 : // Sort palette
{ {
byte h = 0, l = 0, s=0; byte h = 0, l = 0, s=0;
byte oh=0,ol=0,os=0; // Valeur pour la couleur précédente byte oh=0,ol=0,os=0; // Valeur pour la couleur précédente
int swap=1; int swap=1;
byte remap_table[256]; byte remap_table[256];
byte inverted_table[256]; byte inverted_table[256];
@ -2515,8 +2515,8 @@ void Button_Palette(int btn)
for (i=0;i<256;i++) for (i=0;i<256;i++)
inverted_table[remap_table[i]]=i; inverted_table[remap_table[i]]=i;
Remap_image_highlevel(inverted_table); Remap_image_highlevel(inverted_table);
// Maintenant, tous ces calculs doivent êtres pris en compte dans la // Maintenant, tous ces calculs doivent êtres pris en compte dans la
// palette, l'image et à l'écran. // palette, l'image et à l'écran.
Set_palette(working_palette); Set_palette(working_palette);
Palette_edit_step(); // Disable Undo Palette_edit_step(); // Disable Undo
@ -2565,7 +2565,7 @@ void Button_Palette(int btn)
Set_green (i,new_green,working_palette); Set_green (i,new_green,working_palette);
Set_blue (i,new_blue,working_palette); Set_blue (i,new_blue,working_palette);
} }
// On prépare la "modifiabilité" des nouvelles couleurs // On prépare la "modifiabilité" des nouvelles couleurs
Set_palette(working_palette); Set_palette(working_palette);
memcpy(temp_palette,working_palette,sizeof(T_Palette)); memcpy(temp_palette,working_palette,sizeof(T_Palette));
need_to_remap=1; need_to_remap=1;
@ -2590,7 +2590,7 @@ void Button_Palette(int btn)
Fore_color=first_color=last_color=block_start=block_end=selected_col; Fore_color=first_color=last_color=block_start=block_end=selected_col;
Tag_color_range(block_start,block_end); Tag_color_range(block_start,block_end);
// Affichage du n° de la couleur sélectionnée // Affichage du n° de la couleur sélectionnée
Window_rectangle(COLOR_X,COLOR_Y,56,7,MC_Light); Window_rectangle(COLOR_X,COLOR_Y,56,7,MC_Light);
Num2str(Fore_color,str,3); Num2str(Fore_color,str,3);
Print_in_window(COLOR_X,COLOR_Y,str,MC_Black,MC_Light); Print_in_window(COLOR_X,COLOR_Y,str,MC_Black,MC_Light);
@ -2634,7 +2634,7 @@ void Button_Palette(int btn)
{ {
if (Key) if (Key)
{ {
if (Is_shortcut(Key,SPECIAL_PREVIOUS_FORECOLOR)) // Décaler Forecolor vers la gauche if (Is_shortcut(Key,SPECIAL_PREVIOUS_FORECOLOR)) // Décaler Forecolor vers la gauche
{ {
if (block_start==block_end) if (block_start==block_end)
{ {
@ -2646,7 +2646,7 @@ void Button_Palette(int btn)
Draw_all_palette_sliders(red_slider,green_slider,blue_slider,working_palette,block_start,block_end); Draw_all_palette_sliders(red_slider,green_slider,blue_slider,working_palette,block_start,block_end);
Hide_cursor(); Hide_cursor();
Tag_color_range(block_start,block_end); Tag_color_range(block_start,block_end);
// Affichage du n° de la couleur sélectionnée // Affichage du n° de la couleur sélectionnée
Num2str(Fore_color,str,3); Num2str(Fore_color,str,3);
Print_in_window(COLOR_X,COLOR_Y,str,MC_Black,MC_Light); Print_in_window(COLOR_X,COLOR_Y,str,MC_Black,MC_Light);
// Affichage dans le block de visu de la couleur en cours // Affichage dans le block de visu de la couleur en cours
@ -2656,7 +2656,7 @@ void Button_Palette(int btn)
} }
Key=0; Key=0;
} }
else if (Is_shortcut(Key,SPECIAL_NEXT_FORECOLOR)) // Décaler Forecolor vers la droite else if (Is_shortcut(Key,SPECIAL_NEXT_FORECOLOR)) // Décaler Forecolor vers la droite
{ {
if (block_start==block_end) if (block_start==block_end)
{ {
@ -2668,7 +2668,7 @@ void Button_Palette(int btn)
Draw_all_palette_sliders(red_slider,green_slider,blue_slider,working_palette,block_start,block_end); Draw_all_palette_sliders(red_slider,green_slider,blue_slider,working_palette,block_start,block_end);
Hide_cursor(); Hide_cursor();
Tag_color_range(block_start,block_end); Tag_color_range(block_start,block_end);
// Affichage du n° de la couleur sélectionnée // Affichage du n° de la couleur sélectionnée
Num2str(Fore_color,str,3); Num2str(Fore_color,str,3);
Print_in_window(COLOR_X,COLOR_Y,str,MC_Black,MC_Light); Print_in_window(COLOR_X,COLOR_Y,str,MC_Black,MC_Light);
// Affichage dans le block de visu de la couleur en cours // Affichage dans le block de visu de la couleur en cours
@ -2703,7 +2703,7 @@ void Button_Palette(int btn)
Key=0; Key=0;
} }
else if (Key == SDLK_BACKSPACE) else if (Key == SDLK_BACKSPACE)
// Remise des couleurs du menu à l'état normal en essayant // Remise des couleurs du menu à l'état normal en essayant
// de ne pas trop modifier l'image. // de ne pas trop modifier l'image.
{ {
if (!image_is_backed_up) if (!image_is_backed_up)
@ -2731,7 +2731,7 @@ void Button_Palette(int btn)
} }
else if (Is_shortcut(Key,0x100+BUTTON_COLORPICKER)) else if (Is_shortcut(Key,0x100+BUTTON_COLORPICKER))
{ {
// Récupération d'une couleur derrière le menu // Récupération d'une couleur derrière le menu
Get_color_behind_window(&color,&click); Get_color_behind_window(&color,&click);
if (click) if (click)
{ {
@ -2754,7 +2754,7 @@ void Button_Palette(int btn)
Fore_color=first_color=last_color=block_start=block_end=color; Fore_color=first_color=last_color=block_start=block_end=color;
Tag_color_range(block_start,block_end); Tag_color_range(block_start,block_end);
// Affichage du n° de la couleur sélectionnée // Affichage du n° de la couleur sélectionnée
Window_rectangle(COLOR_X+24,COLOR_Y,32,7,MC_Light); Window_rectangle(COLOR_X+24,COLOR_Y,32,7,MC_Light);
Update_window_area(COLOR_X+24,COLOR_Y,32,7); Update_window_area(COLOR_X+24,COLOR_Y,32,7);
Num2str(Fore_color,str,3); Num2str(Fore_color,str,3);
@ -2845,7 +2845,7 @@ void Button_Palette(int btn)
Compute_optimal_menu_colors(Main.palette); Compute_optimal_menu_colors(Main.palette);
// La variable employée ici n'a pas vraiment de rapport avec son nom... // La variable employée ici n'a pas vraiment de rapport avec son nom...
need_to_remap=(Window_pos_Y+(Window_height*Menu_factor_Y)<Menu_Y_before_window); need_to_remap=(Window_pos_Y+(Window_height*Menu_factor_Y)<Menu_Y_before_window);
Close_window(); Close_window();
@ -2853,9 +2853,9 @@ void Button_Palette(int btn)
Reposition_palette(); Reposition_palette();
// On affiche les "ForeBack" car le menu n'est raffiché que si la fenêtre // On affiche les "ForeBack" car le menu n'est raffiché que si la fenêtre
// empiétait sur le menu. Mais si les couleurs on été modifiées, il faut // empiétait sur le menu. Mais si les couleurs on été modifiées, il faut
// rafficher tout le menu remappé. // rafficher tout le menu remappé.
if (need_to_remap) if (need_to_remap)
Display_menu(); Display_menu();

View File

@ -36,7 +36,7 @@
void Pixel_double (word x,word y,byte color) void Pixel_double (word x,word y,byte color)
/* Affiche un pixel de la color aux coords x;y à l'écran */ /* Affiche un pixel de la color aux coords x;y à l'écran */
{ {
*(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH)=color; *(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH)=color;
*(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH + 1)=color; *(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH + 1)=color;
@ -45,13 +45,13 @@ void Pixel_double (word x,word y,byte color)
} }
byte Read_pixel_double (word x,word y) byte Read_pixel_double (word x,word y)
/* On retourne la couleur du pixel aux coords données */ /* On retourne la couleur du pixel aux coords données */
{ {
return *( Screen_pixels + y * ZOOMY * VIDEO_LINE_WIDTH + x * ZOOMX); return *( Screen_pixels + y * ZOOMY * VIDEO_LINE_WIDTH + x * ZOOMX);
} }
void Block_double (word start_x,word start_y,word width,word height,byte color) void Block_double (word start_x,word start_y,word width,word height,byte color)
/* On affiche un rectangle de la couleur donnée */ /* On affiche un rectangle de la couleur donnée */
{ {
SDL_Rect rectangle; SDL_Rect rectangle;
rectangle.x=start_x*ZOOMX; rectangle.x=start_x*ZOOMX;
@ -62,10 +62,10 @@ void Block_double (word start_x,word start_y,word width,word height,byte color)
} }
void Display_part_of_screen_double (word width,word height,word image_width) void Display_part_of_screen_double (word width,word height,word image_width)
/* Afficher une partie de l'image telle quelle sur l'écran */ /* Afficher une partie de l'image telle quelle sur l'écran */
{ {
byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest)
byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src) byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
int y; int y;
int dy; int dy;
@ -82,7 +82,7 @@ void Display_part_of_screen_double (word width,word height,word image_width)
// On double la ligne qu'on vient de copier // On double la ligne qu'on vient de copier
memcpy(dest-width*ZOOMX+VIDEO_LINE_WIDTH,dest-width*ZOOMX,width*ZOOMX); memcpy(dest-width*ZOOMX+VIDEO_LINE_WIDTH,dest-width*ZOOMX,width*ZOOMX);
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width-width; src+=image_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
} }
@ -90,10 +90,10 @@ void Display_part_of_screen_double (word width,word height,word image_width)
} }
void Pixel_preview_normal_double (word x,word y,byte color) void Pixel_preview_normal_double (word x,word y,byte color)
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image /* 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) * dans l'écran, en mode normal (pas en mode loupe)
* Note: si on modifie cette procédure, il faudra penser à faire également * Note: si on modifie cette procédure, il faudra penser à faire également
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */ * la modif dans la procédure Pixel_Preview_Loupe_SDL. */
{ {
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0) // if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
Pixel_double(x-Main.offset_X,y-Main.offset_Y,color); Pixel_double(x-Main.offset_X,y-Main.offset_Y,color);
@ -101,10 +101,10 @@ void Pixel_preview_normal_double (word x,word y,byte color)
void Pixel_preview_magnifier_double (word x,word y,byte color) void Pixel_preview_magnifier_double (word x,word y,byte color)
{ {
// Affiche le pixel dans la partie non zoomée // Affiche le pixel dans la partie non zoomée
Pixel_double(x-Main.offset_X,y-Main.offset_Y,color); Pixel_double(x-Main.offset_X,y-Main.offset_Y,color);
// Regarde si on doit aussi l'afficher dans la partie zoomée // Regarde si on doit aussi l'afficher dans la partie zoomée
if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom
&& x >= Limit_left_zoom && x <= Limit_visible_right_zoom) && x >= Limit_left_zoom && x <= Limit_visible_right_zoom)
{ {
@ -114,7 +114,7 @@ void Pixel_preview_magnifier_double (word x,word y,byte color)
if (Menu_Y - y_zoom < Main.magnifier_factor) if (Menu_Y - y_zoom < Main.magnifier_factor)
// On ne doit dessiner qu'un morceau du pixel // On ne doit dessiner qu'un morceau du pixel
// sinon on dépasse sur le menu // sinon on dépasse sur le menu
height = Menu_Y - y_zoom; height = Menu_Y - y_zoom;
else else
height = Main.magnifier_factor; height = Main.magnifier_factor;
@ -150,7 +150,7 @@ void Vertical_XOR_line_double(word x_pos,word y_pos,word height)
void Display_brush_color_double(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_color_double(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
@ -163,7 +163,7 @@ void Display_brush_color_double(word x_pos,word y_pos,word x_offset,word y_offse
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*(dest+VIDEO_LINE_WIDTH+1) = *(dest+VIDEO_LINE_WIDTH) = *(dest+1) = *dest = *src; *(dest+VIDEO_LINE_WIDTH+1) = *(dest+VIDEO_LINE_WIDTH) = *(dest+1) = *dest = *src;
@ -174,7 +174,7 @@ void Display_brush_color_double(word x_pos,word y_pos,word x_offset,word y_offse
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -186,8 +186,8 @@ void Display_brush_mono_double(word x_pos, word y_pos,
byte transp_color, byte color, word brush_width) byte transp_color, byte color, word brush_width)
/* On affiche la brosse en monochrome */ /* On affiche la brosse en monochrome */
{ {
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
// l'écran // l'écran
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
// la brosse // la brosse
int x,y; int x,y;
@ -206,7 +206,7 @@ void Display_brush_mono_double(word x_pos, word y_pos,
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=brush_width-width; src+=brush_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
} }
@ -215,8 +215,8 @@ void Display_brush_mono_double(word x_pos, word y_pos,
void Clear_brush_double(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width) void Clear_brush_double(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width)
{ {
byte* dest=Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest)
byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src) byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src)
int y; int y;
int x; int x;
(void)x_offset; // unused (void)x_offset; // unused
@ -236,17 +236,17 @@ void Clear_brush_double(word x_pos,word y_pos,word x_offset,word y_offset,word w
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width-width; src+=image_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
} }
Update_rect(x_pos,y_pos,width,height); Update_rect(x_pos,y_pos,width,height);
} }
// Affiche une brosse (arbitraire) à l'écran // Affiche une brosse (arbitraire) à l'écran
void Display_brush_double(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_double(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = brush + y_offset * brush_width + x_offset; byte* src = brush + y_offset * brush_width + x_offset;
@ -259,7 +259,7 @@ void Display_brush_double(byte * brush, word x_pos,word y_pos,word x_offset,word
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*(dest+VIDEO_LINE_WIDTH+1)=*(dest+VIDEO_LINE_WIDTH)=*(dest+1)=*dest=*src; *(dest+VIDEO_LINE_WIDTH+1)=*(dest+VIDEO_LINE_WIDTH)=*(dest+1)=*dest=*src;
@ -269,7 +269,7 @@ void Display_brush_double(byte * brush, word x_pos,word y_pos,word x_offset,word
src++; dest+=ZOOMX; src++; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -277,7 +277,7 @@ void Display_brush_double(byte * brush, word x_pos,word y_pos,word x_offset,word
void Remap_screen_double(word x_pos,word y_pos,word width,word height,byte * conversion_table) void Remap_screen_double(word x_pos,word y_pos,word width,word height,byte * conversion_table)
{ {
// dest = coords a l'écran // dest = coords a l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
int x,y; int x,y;
@ -300,7 +300,7 @@ void Remap_screen_double(word x_pos,word y_pos,word width,word height,byte * con
void Display_line_on_screen_fast_double(word x_pos,word y_pos,word width,byte * line) void Display_line_on_screen_fast_double(word x_pos,word y_pos,word width,byte * line)
/* On affiche toute une ligne de pixels telle quelle. */ /* On affiche toute une ligne de pixels telle quelle. */
/* Utilisée si le buffer contient déja des pixel doublés. */ /* Utilisée si le buffer contient déja des pixel doublés. */
{ {
memcpy(Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH,line,width*ZOOMX); memcpy(Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH,line,width*ZOOMX);
memcpy(Screen_pixels+x_pos*ZOOMX+(y_pos*ZOOMY+1)*VIDEO_LINE_WIDTH,line,width*ZOOMX); memcpy(Screen_pixels+x_pos*ZOOMX+(y_pos*ZOOMY+1)*VIDEO_LINE_WIDTH,line,width*ZOOMX);
@ -322,8 +322,8 @@ void Display_line_on_screen_double(word x_pos,word y_pos,word width,byte * line)
void Display_transparent_mono_line_on_screen_double( void Display_transparent_mono_line_on_screen_double(
word x_pos, word y_pos, word width, byte* line, word x_pos, word y_pos, word width, byte* line,
byte transp_color, byte color) byte transp_color, byte color)
// Affiche une ligne à l'écran avec une couleur + transparence. // Affiche une ligne à l'écran avec une couleur + transparence.
// Utilisé par les brosses en mode zoom // Utilisé par les brosses en mode zoom
{ {
byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX; byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX;
int x; int x;
@ -345,31 +345,31 @@ void Read_line_screen_double(word x_pos,word y_pos,word width,byte * line)
} }
void Display_part_of_screen_scaled_double( void Display_part_of_screen_scaled_double(
word width, // width non zoomée word width, // width non zoomée
word height, // height zoomée word height, // height zoomée
word image_width,byte * buffer) word image_width,byte * buffer)
{ {
byte* src = Main_screen + Main.magnifier_offset_Y * image_width byte* src = Main_screen + Main.magnifier_offset_Y * image_width
+ Main.magnifier_offset_X; + Main.magnifier_offset_X;
int y = 0; // Ligne en cours de traitement int y = 0; // Ligne en cours de traitement
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1) while(1)
{ {
int x; int x;
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width); Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);
// On l'affiche Facteur fois, sur des lignes consécutives // On l'affiche Facteur fois, sur des lignes consécutives
x = Main.magnifier_factor; x = Main.magnifier_factor;
// Pour chaque ligne // Pour chaque ligne
do{ do{
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_line_on_screen_fast_double( Display_line_on_screen_fast_double(
Main.X_zoom, y, width*Main.magnifier_factor, Main.X_zoom, y, width*Main.magnifier_factor,
buffer buffer
); );
// On passe à la suivante // On passe à la suivante
y++; y++;
if(y==height) if(y==height)
{ {
@ -386,12 +386,12 @@ void Display_part_of_screen_scaled_double(
// ATTENTION on n'arrive jamais ici ! // ATTENTION on n'arrive jamais ici !
} }
// Affiche une partie de la brosse couleur zoomée // Affiche une partie de la brosse couleur zoomée
void Display_brush_color_zoom_double(word x_pos,word y_pos, void Display_brush_color_zoom_double(word x_pos,word y_pos,
word x_offset,word y_offset, word x_offset,word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos,byte transp_color, word end_y_pos,byte transp_color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer) byte * buffer)
{ {
byte* src = Brush+y_offset*brush_width + x_offset; byte* src = Brush+y_offset*brush_width + x_offset;
@ -402,7 +402,7 @@ void Display_brush_color_zoom_double(word x_pos,word y_pos,
while(1) while(1)
{ {
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche facteur fois la ligne zoomée // On affiche facteur fois la ligne zoomée
for(bx=Main.magnifier_factor;bx>0;bx--) for(bx=Main.magnifier_factor;bx>0;bx--)
{ {
Display_transparent_line_on_screen_wide(x_pos,y*ZOOMY,width*Main.magnifier_factor,buffer,transp_color); Display_transparent_line_on_screen_wide(x_pos,y*ZOOMY,width*Main.magnifier_factor,buffer,transp_color);
@ -420,10 +420,10 @@ void Display_brush_color_zoom_double(word x_pos,word y_pos,
void Display_brush_mono_zoom_double(word x_pos, word y_pos, void Display_brush_mono_zoom_double(word x_pos, word y_pos,
word x_offset, word y_offset, word x_offset, word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos, word end_y_pos,
byte transp_color, byte color, byte transp_color, byte color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer byte * buffer
) )
@ -431,29 +431,29 @@ void Display_brush_mono_zoom_double(word x_pos, word y_pos,
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
int y=y_pos*ZOOMY; int y=y_pos*ZOOMY;
//Pour chaque ligne à zoomer : //Pour chaque ligne à zoomer :
while(1) while(1)
{ {
int bx; int bx;
// src = Ligne originale // src = Ligne originale
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche la ligne Facteur fois à l'écran (sur des // On affiche la ligne Facteur fois à l'écran (sur des
// lignes consécutives) // lignes consécutives)
bx = Main.magnifier_factor*ZOOMY; bx = Main.magnifier_factor*ZOOMY;
// Pour chaque ligne écran // Pour chaque ligne écran
do do
{ {
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_transparent_mono_line_on_screen_double( Display_transparent_mono_line_on_screen_double(
x_pos, y, width * Main.magnifier_factor, x_pos, y, width * Main.magnifier_factor,
buffer, transp_color, color buffer, transp_color, color
); );
// On passe à la ligne suivante // On passe à la ligne suivante
y++; y++;
// On vérifie qu'on est pas à la ligne finale // On vérifie qu'on est pas à la ligne finale
if(y == end_y_pos*ZOOMY) if(y == end_y_pos*ZOOMY)
{ {
Redraw_grid( x_pos, y_pos, Redraw_grid( x_pos, y_pos,
@ -466,7 +466,7 @@ void Display_brush_mono_zoom_double(word x_pos, word y_pos,
} }
while (bx > 0); while (bx > 0);
// Passage à la ligne suivante dans la brosse aussi // Passage à la ligne suivante dans la brosse aussi
src+=brush_width; src+=brush_width;
} }
} }
@ -474,13 +474,13 @@ void Display_brush_mono_zoom_double(word x_pos, word y_pos,
void Clear_brush_scaled_double(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer) void Clear_brush_scaled_double(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer)
{ {
// En fait on va recopier l'image non zoomée dans la partie zoomée ! // En fait on va recopier l'image non zoomée dans la partie zoomée !
byte* src = Main_screen + y_offset * image_width + x_offset; byte* src = Main_screen + y_offset * image_width + x_offset;
int y = y_pos; int y = y_pos;
int bx; int bx;
(void)transp_color; // unused (void)transp_color; // unused
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1){ while(1){
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width); Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);

View File

@ -35,7 +35,7 @@
void Pixel_quad (word x,word y,byte color) void Pixel_quad (word x,word y,byte color)
/* Affiche un pixel de la color aux coords x;y à l'écran */ /* Affiche un pixel de la color aux coords x;y à l'écran */
{ {
*(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH)=color; *(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH)=color;
*(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH + 1)=color; *(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH + 1)=color;
@ -56,13 +56,13 @@ void Pixel_quad (word x,word y,byte color)
} }
byte Read_pixel_quad (word x,word y) byte Read_pixel_quad (word x,word y)
/* On retourne la couleur du pixel aux coords données */ /* On retourne la couleur du pixel aux coords données */
{ {
return *( Screen_pixels + y * ZOOMY * VIDEO_LINE_WIDTH + x * ZOOMX); return *( Screen_pixels + y * ZOOMY * VIDEO_LINE_WIDTH + x * ZOOMX);
} }
void Block_quad (word start_x,word start_y,word width,word height,byte color) void Block_quad (word start_x,word start_y,word width,word height,byte color)
/* On affiche un rectangle de la couleur donnée */ /* On affiche un rectangle de la couleur donnée */
{ {
SDL_Rect rectangle; SDL_Rect rectangle;
rectangle.x=start_x*ZOOMX; rectangle.x=start_x*ZOOMX;
@ -73,10 +73,10 @@ void Block_quad (word start_x,word start_y,word width,word height,byte color)
} }
void Display_part_of_screen_quad (word width,word height,word image_width) void Display_part_of_screen_quad (word width,word height,word image_width)
/* Afficher une partie de l'image telle quelle sur l'écran */ /* Afficher une partie de l'image telle quelle sur l'écran */
{ {
byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest)
byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src) byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
int y; int y;
int dy; int dy;
@ -97,7 +97,7 @@ void Display_part_of_screen_quad (word width,word height,word image_width)
// On la quadruple // On la quadruple
memcpy(dest-width*ZOOMX+3*VIDEO_LINE_WIDTH,dest-width*ZOOMX,width*ZOOMX); memcpy(dest-width*ZOOMX+3*VIDEO_LINE_WIDTH,dest-width*ZOOMX,width*ZOOMX);
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width-width; src+=image_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
} }
@ -105,10 +105,10 @@ void Display_part_of_screen_quad (word width,word height,word image_width)
} }
void Pixel_preview_normal_quad (word x,word y,byte color) void Pixel_preview_normal_quad (word x,word y,byte color)
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image /* 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) * dans l'écran, en mode normal (pas en mode loupe)
* Note: si on modifie cette procédure, il faudra penser à faire également * Note: si on modifie cette procédure, il faudra penser à faire également
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */ * la modif dans la procédure Pixel_Preview_Loupe_SDL. */
{ {
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0) // if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
Pixel_quad(x-Main.offset_X,y-Main.offset_Y,color); Pixel_quad(x-Main.offset_X,y-Main.offset_Y,color);
@ -116,10 +116,10 @@ void Pixel_preview_normal_quad (word x,word y,byte color)
void Pixel_preview_magnifier_quad (word x,word y,byte color) void Pixel_preview_magnifier_quad (word x,word y,byte color)
{ {
// Affiche le pixel dans la partie non zoomée // Affiche le pixel dans la partie non zoomée
Pixel_quad(x-Main.offset_X,y-Main.offset_Y,color); Pixel_quad(x-Main.offset_X,y-Main.offset_Y,color);
// Regarde si on doit aussi l'afficher dans la partie zoomée // Regarde si on doit aussi l'afficher dans la partie zoomée
if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom
&& x >= Limit_left_zoom && x <= Limit_visible_right_zoom) && x >= Limit_left_zoom && x <= Limit_visible_right_zoom)
{ {
@ -129,7 +129,7 @@ void Pixel_preview_magnifier_quad (word x,word y,byte color)
if (Menu_Y - y_zoom < Main.magnifier_factor) if (Menu_Y - y_zoom < Main.magnifier_factor)
// On ne doit dessiner qu'un morceau du pixel // On ne doit dessiner qu'un morceau du pixel
// sinon on dépasse sur le menu // sinon on dépasse sur le menu
height = Menu_Y - y_zoom; height = Menu_Y - y_zoom;
else else
height = Main.magnifier_factor; height = Main.magnifier_factor;
@ -165,7 +165,7 @@ void Vertical_XOR_line_quad(word x_pos,word y_pos,word height)
void Display_brush_color_quad(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_color_quad(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
@ -178,7 +178,7 @@ void Display_brush_color_quad(word x_pos,word y_pos,word x_offset,word y_offset,
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*(dest+3*VIDEO_LINE_WIDTH+3) = *(dest+3*VIDEO_LINE_WIDTH+2) = *(dest+3*VIDEO_LINE_WIDTH+1) = *(dest+3*VIDEO_LINE_WIDTH) = *(dest+2*VIDEO_LINE_WIDTH+3) = *(dest+2*VIDEO_LINE_WIDTH+2) = *(dest+2*VIDEO_LINE_WIDTH+1) = *(dest+2*VIDEO_LINE_WIDTH) = *(dest+VIDEO_LINE_WIDTH+3) = *(dest+VIDEO_LINE_WIDTH+2) = *(dest+VIDEO_LINE_WIDTH+1) = *(dest+VIDEO_LINE_WIDTH) = *(dest+3) = *(dest+2) = *(dest+1) = *dest = *src; *(dest+3*VIDEO_LINE_WIDTH+3) = *(dest+3*VIDEO_LINE_WIDTH+2) = *(dest+3*VIDEO_LINE_WIDTH+1) = *(dest+3*VIDEO_LINE_WIDTH) = *(dest+2*VIDEO_LINE_WIDTH+3) = *(dest+2*VIDEO_LINE_WIDTH+2) = *(dest+2*VIDEO_LINE_WIDTH+1) = *(dest+2*VIDEO_LINE_WIDTH) = *(dest+VIDEO_LINE_WIDTH+3) = *(dest+VIDEO_LINE_WIDTH+2) = *(dest+VIDEO_LINE_WIDTH+1) = *(dest+VIDEO_LINE_WIDTH) = *(dest+3) = *(dest+2) = *(dest+1) = *dest = *src;
@ -189,7 +189,7 @@ void Display_brush_color_quad(word x_pos,word y_pos,word x_offset,word y_offset,
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -201,8 +201,8 @@ void Display_brush_mono_quad(word x_pos, word y_pos,
byte transp_color, byte color, word brush_width) byte transp_color, byte color, word brush_width)
/* On affiche la brosse en monochrome */ /* On affiche la brosse en monochrome */
{ {
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
// l'écran // l'écran
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
// la brosse // la brosse
int x,y; int x,y;
@ -221,7 +221,7 @@ void Display_brush_mono_quad(word x_pos, word y_pos,
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=brush_width-width; src+=brush_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
} }
@ -230,8 +230,8 @@ void Display_brush_mono_quad(word x_pos, word y_pos,
void Clear_brush_quad(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width) void Clear_brush_quad(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width)
{ {
byte* dest=Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest)
byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src) byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src)
int y; int y;
int x; int x;
(void)x_offset; // unused (void)x_offset; // unused
@ -251,17 +251,17 @@ void Clear_brush_quad(word x_pos,word y_pos,word x_offset,word y_offset,word wid
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width-width; src+=image_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
} }
Update_rect(x_pos,y_pos,width,height); Update_rect(x_pos,y_pos,width,height);
} }
// Affiche une brosse (arbitraire) à l'écran // Affiche une brosse (arbitraire) à l'écran
void Display_brush_quad(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_quad(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = brush + y_offset * brush_width + x_offset; byte* src = brush + y_offset * brush_width + x_offset;
@ -274,7 +274,7 @@ void Display_brush_quad(byte * brush, word x_pos,word y_pos,word x_offset,word y
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*(dest+3*VIDEO_LINE_WIDTH+3)=*(dest+3*VIDEO_LINE_WIDTH+2)=*(dest+3*VIDEO_LINE_WIDTH+1)=*(dest+3*VIDEO_LINE_WIDTH)=*(dest+2*VIDEO_LINE_WIDTH+3)=*(dest+2*VIDEO_LINE_WIDTH+2)=*(dest+2*VIDEO_LINE_WIDTH+1)=*(dest+2*VIDEO_LINE_WIDTH)=*(dest+VIDEO_LINE_WIDTH+3)=*(dest+VIDEO_LINE_WIDTH+2)=*(dest+VIDEO_LINE_WIDTH+1)=*(dest+VIDEO_LINE_WIDTH)=*(dest+3)=*(dest+2)=*(dest+1)=*dest=*src; *(dest+3*VIDEO_LINE_WIDTH+3)=*(dest+3*VIDEO_LINE_WIDTH+2)=*(dest+3*VIDEO_LINE_WIDTH+1)=*(dest+3*VIDEO_LINE_WIDTH)=*(dest+2*VIDEO_LINE_WIDTH+3)=*(dest+2*VIDEO_LINE_WIDTH+2)=*(dest+2*VIDEO_LINE_WIDTH+1)=*(dest+2*VIDEO_LINE_WIDTH)=*(dest+VIDEO_LINE_WIDTH+3)=*(dest+VIDEO_LINE_WIDTH+2)=*(dest+VIDEO_LINE_WIDTH+1)=*(dest+VIDEO_LINE_WIDTH)=*(dest+3)=*(dest+2)=*(dest+1)=*dest=*src;
@ -284,7 +284,7 @@ void Display_brush_quad(byte * brush, word x_pos,word y_pos,word x_offset,word y
src++; dest+=ZOOMX; src++; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -292,7 +292,7 @@ void Display_brush_quad(byte * brush, word x_pos,word y_pos,word x_offset,word y
void Remap_screen_quad(word x_pos,word y_pos,word width,word height,byte * conversion_table) void Remap_screen_quad(word x_pos,word y_pos,word width,word height,byte * conversion_table)
{ {
// dest = coords a l'écran // dest = coords a l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
int x,y; int x,y;
@ -315,7 +315,7 @@ void Remap_screen_quad(word x_pos,word y_pos,word width,word height,byte * conve
void Display_line_on_screen_fast_quad(word x_pos,word y_pos,word width,byte * line) void Display_line_on_screen_fast_quad(word x_pos,word y_pos,word width,byte * line)
/* On affiche toute une ligne de pixels telle quelle. */ /* On affiche toute une ligne de pixels telle quelle. */
/* Utilisée si le buffer contient déja des pixel doublés. */ /* Utilisée si le buffer contient déja des pixel doublés. */
{ {
memcpy(Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH,line,width*ZOOMX); memcpy(Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH,line,width*ZOOMX);
memcpy(Screen_pixels+x_pos*ZOOMX+(y_pos*ZOOMY+1)*VIDEO_LINE_WIDTH,line,width*ZOOMX); memcpy(Screen_pixels+x_pos*ZOOMX+(y_pos*ZOOMY+1)*VIDEO_LINE_WIDTH,line,width*ZOOMX);
@ -339,8 +339,8 @@ void Display_line_on_screen_quad(word x_pos,word y_pos,word width,byte * line)
void Display_transparent_mono_line_on_screen_quad( void Display_transparent_mono_line_on_screen_quad(
word x_pos, word y_pos, word width, byte* line, word x_pos, word y_pos, word width, byte* line,
byte transp_color, byte color) byte transp_color, byte color)
// Affiche une ligne à l'écran avec une couleur + transparence. // Affiche une ligne à l'écran avec une couleur + transparence.
// Utilisé par les brosses en mode zoom // Utilisé par les brosses en mode zoom
{ {
byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX; byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX;
int x; int x;
@ -362,31 +362,31 @@ void Read_line_screen_quad(word x_pos,word y_pos,word width,byte * line)
} }
void Display_part_of_screen_scaled_quad( void Display_part_of_screen_scaled_quad(
word width, // width non zoomée word width, // width non zoomée
word height, // height zoomée word height, // height zoomée
word image_width,byte * buffer) word image_width,byte * buffer)
{ {
byte* src = Main_screen + Main.magnifier_offset_Y * image_width byte* src = Main_screen + Main.magnifier_offset_Y * image_width
+ Main.magnifier_offset_X; + Main.magnifier_offset_X;
int y = 0; // Ligne en cours de traitement int y = 0; // Ligne en cours de traitement
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1) while(1)
{ {
int x; int x;
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width); Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);
// On l'affiche Facteur fois, sur des lignes consécutives // On l'affiche Facteur fois, sur des lignes consécutives
x = Main.magnifier_factor/**ZOOMY*/; x = Main.magnifier_factor/**ZOOMY*/;
// Pour chaque ligne // Pour chaque ligne
do{ do{
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_line_on_screen_fast_quad( Display_line_on_screen_fast_quad(
Main.X_zoom, y, width*Main.magnifier_factor, Main.X_zoom, y, width*Main.magnifier_factor,
buffer buffer
); );
// On passe à la suivante // On passe à la suivante
y++; y++;
if(y==height/**ZOOMY*/) if(y==height/**ZOOMY*/)
{ {
@ -403,12 +403,12 @@ void Display_part_of_screen_scaled_quad(
// ATTENTION on n'arrive jamais ici ! // ATTENTION on n'arrive jamais ici !
} }
// Affiche une partie de la brosse couleur zoomée // Affiche une partie de la brosse couleur zoomée
void Display_brush_color_zoom_quad(word x_pos,word y_pos, void Display_brush_color_zoom_quad(word x_pos,word y_pos,
word x_offset,word y_offset, word x_offset,word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos,byte transp_color, word end_y_pos,byte transp_color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer) byte * buffer)
{ {
byte* src = Brush+y_offset*brush_width + x_offset; byte* src = Brush+y_offset*brush_width + x_offset;
@ -419,7 +419,7 @@ void Display_brush_color_zoom_quad(word x_pos,word y_pos,
while(1) while(1)
{ {
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche facteur fois la ligne zoomée // On affiche facteur fois la ligne zoomée
for(bx=Main.magnifier_factor;bx>0;bx--) for(bx=Main.magnifier_factor;bx>0;bx--)
{ {
byte* line_src = buffer; byte* line_src = buffer;
@ -454,10 +454,10 @@ void Display_brush_color_zoom_quad(word x_pos,word y_pos,
void Display_brush_mono_zoom_quad(word x_pos, word y_pos, void Display_brush_mono_zoom_quad(word x_pos, word y_pos,
word x_offset, word y_offset, word x_offset, word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos, word end_y_pos,
byte transp_color, byte color, byte transp_color, byte color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer byte * buffer
) )
@ -465,29 +465,29 @@ void Display_brush_mono_zoom_quad(word x_pos, word y_pos,
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
int y=y_pos*ZOOMY; int y=y_pos*ZOOMY;
//Pour chaque ligne à zoomer : //Pour chaque ligne à zoomer :
while(1) while(1)
{ {
int bx; int bx;
// src = Ligne originale // src = Ligne originale
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche la ligne Facteur fois à l'écran (sur des // On affiche la ligne Facteur fois à l'écran (sur des
// lignes consécutives) // lignes consécutives)
bx = Main.magnifier_factor*ZOOMY; bx = Main.magnifier_factor*ZOOMY;
// Pour chaque ligne écran // Pour chaque ligne écran
do do
{ {
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_transparent_mono_line_on_screen_quad( Display_transparent_mono_line_on_screen_quad(
x_pos, y, width * Main.magnifier_factor, x_pos, y, width * Main.magnifier_factor,
buffer, transp_color, color buffer, transp_color, color
); );
// On passe à la ligne suivante // On passe à la ligne suivante
y++; y++;
// On vérifie qu'on est pas à la ligne finale // On vérifie qu'on est pas à la ligne finale
if(y == end_y_pos*ZOOMY) if(y == end_y_pos*ZOOMY)
{ {
Redraw_grid( x_pos, y_pos, Redraw_grid( x_pos, y_pos,
@ -500,7 +500,7 @@ void Display_brush_mono_zoom_quad(word x_pos, word y_pos,
} }
while (bx > 0); while (bx > 0);
// Passage à la ligne suivante dans la brosse aussi // Passage à la ligne suivante dans la brosse aussi
src+=brush_width; src+=brush_width;
} }
} }
@ -508,13 +508,13 @@ void Display_brush_mono_zoom_quad(word x_pos, word y_pos,
void Clear_brush_scaled_quad(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer) void Clear_brush_scaled_quad(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer)
{ {
// En fait on va recopier l'image non zoomée dans la partie zoomée ! // En fait on va recopier l'image non zoomée dans la partie zoomée !
byte* src = Main_screen + y_offset * image_width + x_offset; byte* src = Main_screen + y_offset * image_width + x_offset;
int y = y_pos; int y = y_pos;
int bx; int bx;
(void)transp_color; // unused (void)transp_color; // unused
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1){ while(1){
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width); Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);

View File

@ -32,19 +32,19 @@
void Pixel_simple (word x,word y,byte color) void Pixel_simple (word x,word y,byte color)
/* Affiche un pixel de la color aux coords x;y à l'écran */ /* Affiche un pixel de la color aux coords x;y à l'écran */
{ {
*(Screen_pixels + x + y * VIDEO_LINE_WIDTH)=color; *(Screen_pixels + x + y * VIDEO_LINE_WIDTH)=color;
} }
byte Read_pixel_simple (word x,word y) byte Read_pixel_simple (word x,word y)
/* On retourne la couleur du pixel aux coords données */ /* On retourne la couleur du pixel aux coords données */
{ {
return *( Screen_pixels + y * VIDEO_LINE_WIDTH + x ); return *( Screen_pixels + y * VIDEO_LINE_WIDTH + x );
} }
void Block_simple (word start_x,word start_y,word width,word height,byte color) void Block_simple (word start_x,word start_y,word width,word height,byte color)
/* On affiche un rectangle de la couleur donnée */ /* On affiche un rectangle de la couleur donnée */
{ {
SDL_Rect rectangle; SDL_Rect rectangle;
rectangle.x=start_x; rectangle.x=start_x;
@ -55,10 +55,10 @@ void Block_simple (word start_x,word start_y,word width,word height,byte color)
} }
void Display_part_of_screen_simple (word width,word height,word image_width) void Display_part_of_screen_simple (word width,word height,word image_width)
/* Afficher une partie de l'image telle quelle sur l'écran */ /* Afficher une partie de l'image telle quelle sur l'écran */
{ {
byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest)
byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src) byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
int y; int y;
for(y=height;y!=0;y--) for(y=height;y!=0;y--)
@ -67,7 +67,7 @@ void Display_part_of_screen_simple (word width,word height,word image_width)
// On fait une copie de la ligne // On fait une copie de la ligne
memcpy(dest,src,width); memcpy(dest,src,width);
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width; src+=image_width;
dest+=VIDEO_LINE_WIDTH; dest+=VIDEO_LINE_WIDTH;
} }
@ -75,10 +75,10 @@ void Display_part_of_screen_simple (word width,word height,word image_width)
} }
void Pixel_preview_normal_simple (word x,word y,byte color) void Pixel_preview_normal_simple (word x,word y,byte color)
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image /* 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) * dans l'écran, en mode normal (pas en mode loupe)
* Note: si on modifie cette procédure, il faudra penser à faire également * Note: si on modifie cette procédure, il faudra penser à faire également
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */ * la modif dans la procédure Pixel_Preview_Loupe_SDL. */
{ {
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0) // if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
Pixel_simple(x-Main.offset_X,y-Main.offset_Y,color); Pixel_simple(x-Main.offset_X,y-Main.offset_Y,color);
@ -86,10 +86,10 @@ void Pixel_preview_normal_simple (word x,word y,byte color)
void Pixel_preview_magnifier_simple (word x,word y,byte color) void Pixel_preview_magnifier_simple (word x,word y,byte color)
{ {
// Affiche le pixel dans la partie non zoomée // Affiche le pixel dans la partie non zoomée
Pixel_simple(x-Main.offset_X,y-Main.offset_Y,color); Pixel_simple(x-Main.offset_X,y-Main.offset_Y,color);
// Regarde si on doit aussi l'afficher dans la partie zoomée // Regarde si on doit aussi l'afficher dans la partie zoomée
if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom
&& x >= Limit_left_zoom && x <= Limit_visible_right_zoom) && x >= Limit_left_zoom && x <= Limit_visible_right_zoom)
{ {
@ -99,7 +99,7 @@ void Pixel_preview_magnifier_simple (word x,word y,byte color)
if (Menu_Y - y_zoom < Main.magnifier_factor) if (Menu_Y - y_zoom < Main.magnifier_factor)
// On ne doit dessiner qu'un morceau du pixel // On ne doit dessiner qu'un morceau du pixel
// sinon on dépasse sur le menu // sinon on dépasse sur le menu
height = Menu_Y - y_zoom; height = Menu_Y - y_zoom;
else else
height = Main.magnifier_factor; height = Main.magnifier_factor;
@ -135,7 +135,7 @@ void Vertical_XOR_line_simple(word x_pos,word y_pos,word height)
void Display_brush_color_simple(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_color_simple(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos * VIDEO_LINE_WIDTH + x_pos; byte* dest = Screen_pixels + y_pos * VIDEO_LINE_WIDTH + x_pos;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
@ -148,7 +148,7 @@ void Display_brush_color_simple(word x_pos,word y_pos,word x_offset,word y_offse
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*dest = *src; *dest = *src;
@ -158,7 +158,7 @@ void Display_brush_color_simple(word x_pos,word y_pos,word x_offset,word y_offse
src++; dest++; src++; dest++;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH - width; dest = dest + VIDEO_LINE_WIDTH - width;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -170,8 +170,8 @@ void Display_brush_mono_simple(word x_pos, word y_pos,
byte transp_color, byte color, word brush_width) byte transp_color, byte color, word brush_width)
/* On affiche la brosse en monochrome */ /* On affiche la brosse en monochrome */
{ {
byte* dest=y_pos*VIDEO_LINE_WIDTH+x_pos+Screen_pixels; // dest = adr Destination à byte* dest=y_pos*VIDEO_LINE_WIDTH+x_pos+Screen_pixels; // dest = adr Destination à
// l'écran // l'écran
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
// la brosse // la brosse
int x,y; int x,y;
@ -190,7 +190,7 @@ void Display_brush_mono_simple(word x_pos, word y_pos,
dest++; dest++;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=brush_width-width; src+=brush_width-width;
dest+=VIDEO_LINE_WIDTH-width; dest+=VIDEO_LINE_WIDTH-width;
} }
@ -199,8 +199,8 @@ void Display_brush_mono_simple(word x_pos, word y_pos,
void Clear_brush_simple(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width) void Clear_brush_simple(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width)
{ {
byte* dest=Screen_pixels+x_pos+y_pos*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels+x_pos+y_pos*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest)
byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src) byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src)
int y; int y;
(void)x_offset; // unused (void)x_offset; // unused
(void)y_offset; // unused (void)y_offset; // unused
@ -212,17 +212,17 @@ void Clear_brush_simple(word x_pos,word y_pos,word x_offset,word y_offset,word w
// On fait une copie de la ligne // On fait une copie de la ligne
memcpy(dest,src,width); memcpy(dest,src,width);
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width; src+=image_width;
dest+=VIDEO_LINE_WIDTH; dest+=VIDEO_LINE_WIDTH;
} }
Update_rect(x_pos,y_pos,width,height); Update_rect(x_pos,y_pos,width,height);
} }
// Affiche une brosse (arbitraire) à l'écran // Affiche une brosse (arbitraire) à l'écran
void Display_brush_simple(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_simple(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos * VIDEO_LINE_WIDTH + x_pos; byte* dest = Screen_pixels + y_pos * VIDEO_LINE_WIDTH + x_pos;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = brush + y_offset * brush_width + x_offset; byte* src = brush + y_offset * brush_width + x_offset;
@ -235,7 +235,7 @@ void Display_brush_simple(byte * brush, word x_pos,word y_pos,word x_offset,word
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*dest = *src; *dest = *src;
@ -245,7 +245,7 @@ void Display_brush_simple(byte * brush, word x_pos,word y_pos,word x_offset,word
src++; dest++; src++; dest++;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH - width; dest = dest + VIDEO_LINE_WIDTH - width;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -253,7 +253,7 @@ void Display_brush_simple(byte * brush, word x_pos,word y_pos,word x_offset,word
void Remap_screen_simple(word x_pos,word y_pos,word width,word height,byte * conversion_table) void Remap_screen_simple(word x_pos,word y_pos,word width,word height,byte * conversion_table)
{ {
// dest = coords a l'écran // dest = coords a l'écran
byte* dest = Screen_pixels + y_pos * VIDEO_LINE_WIDTH + x_pos; byte* dest = Screen_pixels + y_pos * VIDEO_LINE_WIDTH + x_pos;
int x,y; int x,y;
@ -274,7 +274,7 @@ void Remap_screen_simple(word x_pos,word y_pos,word width,word height,byte * con
} }
void Display_line_on_screen_simple(word x_pos,word y_pos,word width,byte * line) void Display_line_on_screen_simple(word x_pos,word y_pos,word width,byte * line)
/* On affiche toute une ligne de pixels. Utilisé pour les textes. */ /* On affiche toute une ligne de pixels. Utilisé pour les textes. */
{ {
memcpy(Screen_pixels+x_pos+y_pos*VIDEO_LINE_WIDTH,line,width); memcpy(Screen_pixels+x_pos+y_pos*VIDEO_LINE_WIDTH,line,width);
} }
@ -282,8 +282,8 @@ void Display_line_on_screen_simple(word x_pos,word y_pos,word width,byte * line)
void Display_transparent_mono_line_on_screen_simple( void Display_transparent_mono_line_on_screen_simple(
word x_pos, word y_pos, word width, byte* line, word x_pos, word y_pos, word width, byte* line,
byte transp_color, byte color) byte transp_color, byte color)
// Affiche une ligne à l'écran avec une couleur + transparence. // Affiche une ligne à l'écran avec une couleur + transparence.
// Utilisé par les brosses en mode zoom // Utilisé par les brosses en mode zoom
{ {
byte* dest = Screen_pixels+ y_pos * VIDEO_LINE_WIDTH + x_pos; byte* dest = Screen_pixels+ y_pos * VIDEO_LINE_WIDTH + x_pos;
int x; int x;
@ -303,31 +303,31 @@ void Read_line_screen_simple(word x_pos,word y_pos,word width,byte * line)
} }
void Display_part_of_screen_scaled_simple( void Display_part_of_screen_scaled_simple(
word width, // width non zoomée word width, // width non zoomée
word height, // height zoomée word height, // height zoomée
word image_width,byte * buffer) word image_width,byte * buffer)
{ {
byte* src = Main_screen + Main.magnifier_offset_Y * image_width byte* src = Main_screen + Main.magnifier_offset_Y * image_width
+ Main.magnifier_offset_X; + Main.magnifier_offset_X;
int y = 0; // Ligne en cours de traitement int y = 0; // Ligne en cours de traitement
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1) while(1)
{ {
int x; int x;
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On l'affiche Facteur fois, sur des lignes consécutives // On l'affiche Facteur fois, sur des lignes consécutives
x = Main.magnifier_factor; x = Main.magnifier_factor;
// Pour chaque ligne // Pour chaque ligne
do{ do{
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_line_on_screen_simple( Display_line_on_screen_simple(
Main.X_zoom, y, width*Main.magnifier_factor, Main.X_zoom, y, width*Main.magnifier_factor,
buffer buffer
); );
// On passe à la suivante // On passe à la suivante
y++; y++;
if(y==height) if(y==height)
{ {
@ -361,12 +361,12 @@ void Display_transparent_line_on_screen_simple(word x_pos,word y_pos,word width,
} }
} }
// Affiche une partie de la brosse couleur zoomée // Affiche une partie de la brosse couleur zoomée
void Display_brush_color_zoom_simple(word x_pos,word y_pos, void Display_brush_color_zoom_simple(word x_pos,word y_pos,
word x_offset,word y_offset, word x_offset,word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos,byte transp_color, word end_y_pos,byte transp_color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer) byte * buffer)
{ {
byte* src = Brush+y_offset*brush_width + x_offset; byte* src = Brush+y_offset*brush_width + x_offset;
@ -377,7 +377,7 @@ void Display_brush_color_zoom_simple(word x_pos,word y_pos,
while(1) while(1)
{ {
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche facteur fois la ligne zoomée // On affiche facteur fois la ligne zoomée
for(bx=Main.magnifier_factor;bx>0;bx--) for(bx=Main.magnifier_factor;bx>0;bx--)
{ {
Display_transparent_line_on_screen_simple(x_pos,y,width*Main.magnifier_factor,buffer,transp_color); Display_transparent_line_on_screen_simple(x_pos,y,width*Main.magnifier_factor,buffer,transp_color);
@ -394,10 +394,10 @@ void Display_brush_color_zoom_simple(word x_pos,word y_pos,
void Display_brush_mono_zoom_simple(word x_pos, word y_pos, void Display_brush_mono_zoom_simple(word x_pos, word y_pos,
word x_offset, word y_offset, word x_offset, word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos, word end_y_pos,
byte transp_color, byte color, byte transp_color, byte color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer byte * buffer
) )
@ -405,29 +405,29 @@ void Display_brush_mono_zoom_simple(word x_pos, word y_pos,
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
int y=y_pos; int y=y_pos;
//Pour chaque ligne à zoomer : //Pour chaque ligne à zoomer :
while(1) while(1)
{ {
int bx; int bx;
// src = Ligne originale // src = Ligne originale
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche la ligne Facteur fois à l'écran (sur des // On affiche la ligne Facteur fois à l'écran (sur des
// lignes consécutives) // lignes consécutives)
bx = Main.magnifier_factor; bx = Main.magnifier_factor;
// Pour chaque ligne écran // Pour chaque ligne écran
do do
{ {
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_transparent_mono_line_on_screen_simple( Display_transparent_mono_line_on_screen_simple(
x_pos, y, width * Main.magnifier_factor, x_pos, y, width * Main.magnifier_factor,
buffer, transp_color, color buffer, transp_color, color
); );
// On passe à la ligne suivante // On passe à la ligne suivante
y++; y++;
// On vérifie qu'on est pas à la ligne finale // On vérifie qu'on est pas à la ligne finale
if(y == end_y_pos) if(y == end_y_pos)
{ {
Redraw_grid( x_pos, y_pos, Redraw_grid( x_pos, y_pos,
@ -440,20 +440,20 @@ void Display_brush_mono_zoom_simple(word x_pos, word y_pos,
} }
while (bx > 0); while (bx > 0);
// Passage à la ligne suivante dans la brosse aussi // Passage à la ligne suivante dans la brosse aussi
src+=brush_width; src+=brush_width;
} }
} }
void Clear_brush_scaled_simple(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer) void Clear_brush_scaled_simple(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer)
{ {
// En fait on va recopier l'image non zoomée dans la partie zoomée ! // En fait on va recopier l'image non zoomée dans la partie zoomée !
byte* src = Main_screen + y_offset * image_width + x_offset; byte* src = Main_screen + y_offset * image_width + x_offset;
int y = y_pos; int y = y_pos;
int bx; int bx;
(void)transp_color; // unused (void)transp_color; // unused
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1){ while(1){
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);

View File

@ -36,20 +36,20 @@
void Pixel_tall (word x,word y,byte color) void Pixel_tall (word x,word y,byte color)
/* Affiche un pixel de la color aux coords x;y à l'écran */ /* Affiche un pixel de la color aux coords x;y à l'écran */
{ {
*(Screen_pixels + x + y*ZOOMY*VIDEO_LINE_WIDTH)=color; *(Screen_pixels + x + y*ZOOMY*VIDEO_LINE_WIDTH)=color;
*(Screen_pixels + x + (y*ZOOMY+1)*VIDEO_LINE_WIDTH)=color; *(Screen_pixels + x + (y*ZOOMY+1)*VIDEO_LINE_WIDTH)=color;
} }
byte Read_pixel_tall (word x,word y) byte Read_pixel_tall (word x,word y)
/* On retourne la couleur du pixel aux coords données */ /* On retourne la couleur du pixel aux coords données */
{ {
return *( Screen_pixels + y*ZOOMY*VIDEO_LINE_WIDTH + x ); return *( Screen_pixels + y*ZOOMY*VIDEO_LINE_WIDTH + x );
} }
void Block_tall (word start_x,word start_y,word width,word height,byte color) void Block_tall (word start_x,word start_y,word width,word height,byte color)
/* On affiche un rectangle de la couleur donnée */ /* On affiche un rectangle de la couleur donnée */
{ {
SDL_Rect rectangle; SDL_Rect rectangle;
rectangle.x=start_x; rectangle.x=start_x;
@ -60,10 +60,10 @@ void Block_tall (word start_x,word start_y,word width,word height,byte color)
} }
void Display_part_of_screen_tall (word width,word height,word image_width) void Display_part_of_screen_tall (word width,word height,word image_width)
/* Afficher une partie de l'image telle quelle sur l'écran */ /* Afficher une partie de l'image telle quelle sur l'écran */
{ {
byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest)
byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src) byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
int y; int y;
for(y=height;y!=0;y--) for(y=height;y!=0;y--)
@ -74,7 +74,7 @@ void Display_part_of_screen_tall (word width,word height,word image_width)
dest+=VIDEO_LINE_WIDTH; dest+=VIDEO_LINE_WIDTH;
memcpy(dest,src,width); memcpy(dest,src,width);
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width; src+=image_width;
dest+=VIDEO_LINE_WIDTH; dest+=VIDEO_LINE_WIDTH;
} }
@ -82,10 +82,10 @@ void Display_part_of_screen_tall (word width,word height,word image_width)
} }
void Pixel_preview_normal_tall (word x,word y,byte color) void Pixel_preview_normal_tall (word x,word y,byte color)
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image /* 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) * dans l'écran, en mode normal (pas en mode loupe)
* Note: si on modifie cette procédure, il faudra penser à faire également * Note: si on modifie cette procédure, il faudra penser à faire également
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */ * la modif dans la procédure Pixel_Preview_Loupe_SDL. */
{ {
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0) // if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
Pixel_tall(x-Main.offset_X,y-Main.offset_Y,color); Pixel_tall(x-Main.offset_X,y-Main.offset_Y,color);
@ -93,10 +93,10 @@ void Pixel_preview_normal_tall (word x,word y,byte color)
void Pixel_preview_magnifier_tall (word x,word y,byte color) void Pixel_preview_magnifier_tall (word x,word y,byte color)
{ {
// Affiche le pixel dans la partie non zoomée // Affiche le pixel dans la partie non zoomée
Pixel_tall(x-Main.offset_X,y-Main.offset_Y,color); Pixel_tall(x-Main.offset_X,y-Main.offset_Y,color);
// Regarde si on doit aussi l'afficher dans la partie zoomée // Regarde si on doit aussi l'afficher dans la partie zoomée
if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom
&& x >= Limit_left_zoom && x <= Limit_visible_right_zoom) && x >= Limit_left_zoom && x <= Limit_visible_right_zoom)
{ {
@ -106,7 +106,7 @@ void Pixel_preview_magnifier_tall (word x,word y,byte color)
if (Menu_Y - y_zoom < Main.magnifier_factor) if (Menu_Y - y_zoom < Main.magnifier_factor)
// On ne doit dessiner qu'un morceau du pixel // On ne doit dessiner qu'un morceau du pixel
// sinon on dépasse sur le menu // sinon on dépasse sur le menu
height = Menu_Y - y_zoom; height = Menu_Y - y_zoom;
else else
height = Main.magnifier_factor; height = Main.magnifier_factor;
@ -146,7 +146,7 @@ void Vertical_XOR_line_tall(word x_pos,word y_pos,word height)
void Display_brush_color_tall(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_color_tall(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos*ZOOMY*VIDEO_LINE_WIDTH + x_pos; byte* dest = Screen_pixels + y_pos*ZOOMY*VIDEO_LINE_WIDTH + x_pos;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
@ -159,7 +159,7 @@ void Display_brush_color_tall(word x_pos,word y_pos,word x_offset,word y_offset,
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*dest = *src; *dest = *src;
@ -170,7 +170,7 @@ void Display_brush_color_tall(word x_pos,word y_pos,word x_offset,word y_offset,
src++; dest++; src++; dest++;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + ZOOMY*VIDEO_LINE_WIDTH - width; dest = dest + ZOOMY*VIDEO_LINE_WIDTH - width;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -182,8 +182,8 @@ void Display_brush_mono_tall(word x_pos, word y_pos,
byte transp_color, byte color, word brush_width) byte transp_color, byte color, word brush_width)
/* On affiche la brosse en monochrome */ /* On affiche la brosse en monochrome */
{ {
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos+Screen_pixels; // dest = adr Destination à byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos+Screen_pixels; // dest = adr Destination à
// l'écran // l'écran
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
// la brosse // la brosse
int x,y; int x,y;
@ -205,7 +205,7 @@ void Display_brush_mono_tall(word x_pos, word y_pos,
dest++; dest++;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=brush_width-width; src+=brush_width-width;
dest+=ZOOMY*VIDEO_LINE_WIDTH-width; dest+=ZOOMY*VIDEO_LINE_WIDTH-width;
} }
@ -214,8 +214,8 @@ void Display_brush_mono_tall(word x_pos, word y_pos,
void Clear_brush_tall(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width) void Clear_brush_tall(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width)
{ {
byte* dest=Screen_pixels+x_pos+y_pos*ZOOMY*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels+x_pos+y_pos*ZOOMY*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest)
byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src) byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src)
int y; int y;
(void)x_offset; // unused (void)x_offset; // unused
(void)y_offset; // unused (void)y_offset; // unused
@ -229,17 +229,17 @@ void Clear_brush_tall(word x_pos,word y_pos,word x_offset,word y_offset,word wid
dest+=VIDEO_LINE_WIDTH; dest+=VIDEO_LINE_WIDTH;
memcpy(dest,src,width); memcpy(dest,src,width);
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width; src+=image_width;
dest+=VIDEO_LINE_WIDTH; dest+=VIDEO_LINE_WIDTH;
} }
Update_rect(x_pos,y_pos,width,height); Update_rect(x_pos,y_pos,width,height);
} }
// Affiche une brosse (arbitraire) à l'écran // Affiche une brosse (arbitraire) à l'écran
void Display_brush_tall(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_tall(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos*ZOOMY*VIDEO_LINE_WIDTH + x_pos; byte* dest = Screen_pixels + y_pos*ZOOMY*VIDEO_LINE_WIDTH + x_pos;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = brush + y_offset * brush_width + x_offset; byte* src = brush + y_offset * brush_width + x_offset;
@ -252,7 +252,7 @@ void Display_brush_tall(byte * brush, word x_pos,word y_pos,word x_offset,word y
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*dest = *src; *dest = *src;
@ -263,7 +263,7 @@ void Display_brush_tall(byte * brush, word x_pos,word y_pos,word x_offset,word y
src++; dest++; src++; dest++;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width; dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -271,7 +271,7 @@ void Display_brush_tall(byte * brush, word x_pos,word y_pos,word x_offset,word y
void Remap_screen_tall(word x_pos,word y_pos,word width,word height,byte * conversion_table) void Remap_screen_tall(word x_pos,word y_pos,word width,word height,byte * conversion_table)
{ {
// dest = coords a l'écran // dest = coords a l'écran
byte* dest = Screen_pixels + y_pos*ZOOMY*VIDEO_LINE_WIDTH + x_pos; byte* dest = Screen_pixels + y_pos*ZOOMY*VIDEO_LINE_WIDTH + x_pos;
int x,y; int x,y;
@ -292,7 +292,7 @@ void Remap_screen_tall(word x_pos,word y_pos,word width,word height,byte * conve
} }
void Display_line_on_screen_tall(word x_pos,word y_pos,word width,byte * line) void Display_line_on_screen_tall(word x_pos,word y_pos,word width,byte * line)
/* On affiche toute une ligne de pixels. Utilisé pour les textes. */ /* On affiche toute une ligne de pixels. Utilisé pour les textes. */
{ {
memcpy(Screen_pixels+x_pos+y_pos*ZOOMY*VIDEO_LINE_WIDTH,line,width); memcpy(Screen_pixels+x_pos+y_pos*ZOOMY*VIDEO_LINE_WIDTH,line,width);
memcpy(Screen_pixels+x_pos+(y_pos*ZOOMY+1)*VIDEO_LINE_WIDTH,line,width); memcpy(Screen_pixels+x_pos+(y_pos*ZOOMY+1)*VIDEO_LINE_WIDTH,line,width);
@ -304,31 +304,31 @@ void Read_line_screen_tall(word x_pos,word y_pos,word width,byte * line)
} }
void Display_part_of_screen_scaled_tall( void Display_part_of_screen_scaled_tall(
word width, // width non zoomée word width, // width non zoomée
word height, // height zoomée word height, // height zoomée
word image_width,byte * buffer) word image_width,byte * buffer)
{ {
byte* src = Main_screen + Main.magnifier_offset_Y * image_width byte* src = Main_screen + Main.magnifier_offset_Y * image_width
+ Main.magnifier_offset_X; + Main.magnifier_offset_X;
int y = 0; // Ligne en cours de traitement int y = 0; // Ligne en cours de traitement
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1) while(1)
{ {
int x; int x;
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On l'affiche Facteur fois, sur des lignes consécutives // On l'affiche Facteur fois, sur des lignes consécutives
x = Main.magnifier_factor*ZOOMY; x = Main.magnifier_factor*ZOOMY;
// Pour chaque ligne // Pour chaque ligne
do{ do{
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_line_on_screen_simple( Display_line_on_screen_simple(
Main.X_zoom, y, width*Main.magnifier_factor, Main.X_zoom, y, width*Main.magnifier_factor,
buffer buffer
); );
// On passe à la suivante // On passe à la suivante
y++; y++;
if(y==height*ZOOMY) if(y==height*ZOOMY)
{ {
@ -345,12 +345,12 @@ void Display_part_of_screen_scaled_tall(
// ATTENTION on n'arrive jamais ici ! // ATTENTION on n'arrive jamais ici !
} }
// Affiche une partie de la brosse couleur zoomée // Affiche une partie de la brosse couleur zoomée
void Display_brush_color_zoom_tall(word x_pos,word y_pos, void Display_brush_color_zoom_tall(word x_pos,word y_pos,
word x_offset,word y_offset, word x_offset,word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos,byte transp_color, word end_y_pos,byte transp_color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer) byte * buffer)
{ {
byte* src = Brush+y_offset*brush_width + x_offset; byte* src = Brush+y_offset*brush_width + x_offset;
@ -361,7 +361,7 @@ void Display_brush_color_zoom_tall(word x_pos,word y_pos,
while(1) while(1)
{ {
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche facteur fois la ligne zoomée // On affiche facteur fois la ligne zoomée
for(bx=Main.magnifier_factor;bx>0;bx--) for(bx=Main.magnifier_factor;bx>0;bx--)
{ {
Display_transparent_line_on_screen_simple(x_pos,y*ZOOMY,width*Main.magnifier_factor,buffer,transp_color); Display_transparent_line_on_screen_simple(x_pos,y*ZOOMY,width*Main.magnifier_factor,buffer,transp_color);
@ -379,10 +379,10 @@ void Display_brush_color_zoom_tall(word x_pos,word y_pos,
void Display_brush_mono_zoom_tall(word x_pos, word y_pos, void Display_brush_mono_zoom_tall(word x_pos, word y_pos,
word x_offset, word y_offset, word x_offset, word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos, word end_y_pos,
byte transp_color, byte color, byte transp_color, byte color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer byte * buffer
) )
@ -390,29 +390,29 @@ void Display_brush_mono_zoom_tall(word x_pos, word y_pos,
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
int y=y_pos*ZOOMY; int y=y_pos*ZOOMY;
//Pour chaque ligne à zoomer : //Pour chaque ligne à zoomer :
while(1) while(1)
{ {
int bx; int bx;
// src = Ligne originale // src = Ligne originale
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche la ligne Facteur fois à l'écran (sur des // On affiche la ligne Facteur fois à l'écran (sur des
// lignes consécutives) // lignes consécutives)
bx = Main.magnifier_factor*ZOOMY; bx = Main.magnifier_factor*ZOOMY;
// Pour chaque ligne écran // Pour chaque ligne écran
do do
{ {
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_transparent_mono_line_on_screen_simple( Display_transparent_mono_line_on_screen_simple(
x_pos, y, width * Main.magnifier_factor, x_pos, y, width * Main.magnifier_factor,
buffer, transp_color, color buffer, transp_color, color
); );
// On passe à la ligne suivante // On passe à la ligne suivante
y++; y++;
// On vérifie qu'on est pas à la ligne finale // On vérifie qu'on est pas à la ligne finale
if(y == end_y_pos*ZOOMY) if(y == end_y_pos*ZOOMY)
{ {
Redraw_grid( x_pos, y_pos, Redraw_grid( x_pos, y_pos,
@ -425,20 +425,20 @@ void Display_brush_mono_zoom_tall(word x_pos, word y_pos,
} }
while (bx > 0); while (bx > 0);
// Passage à la ligne suivante dans la brosse aussi // Passage à la ligne suivante dans la brosse aussi
src+=brush_width; src+=brush_width;
} }
} }
void Clear_brush_scaled_tall(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer) void Clear_brush_scaled_tall(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer)
{ {
// En fait on va recopier l'image non zoomée dans la partie zoomée ! // En fait on va recopier l'image non zoomée dans la partie zoomée !
byte* src = Main_screen + y_offset * image_width + x_offset; byte* src = Main_screen + y_offset * image_width + x_offset;
int y = y_pos; int y = y_pos;
int bx; int bx;
(void)transp_color; // unused (void)transp_color; // unused
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1){ while(1){
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);

View File

@ -35,7 +35,7 @@
void Pixel_tall2 (word x,word y,byte color) void Pixel_tall2 (word x,word y,byte color)
/* Affiche un pixel de la color aux coords x;y à l'écran */ /* Affiche un pixel de la color aux coords x;y à l'écran */
{ {
*(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH)=color; *(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH)=color;
*(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH + 1)=color; *(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH + 1)=color;
@ -48,13 +48,13 @@ void Pixel_tall2 (word x,word y,byte color)
} }
byte Read_pixel_tall2 (word x,word y) byte Read_pixel_tall2 (word x,word y)
/* On retourne la couleur du pixel aux coords données */ /* On retourne la couleur du pixel aux coords données */
{ {
return *( Screen_pixels + y * ZOOMY * VIDEO_LINE_WIDTH + x * ZOOMX); return *( Screen_pixels + y * ZOOMY * VIDEO_LINE_WIDTH + x * ZOOMX);
} }
void Block_tall2 (word start_x,word start_y,word width,word height,byte color) void Block_tall2 (word start_x,word start_y,word width,word height,byte color)
/* On affiche un rectangle de la couleur donnée */ /* On affiche un rectangle de la couleur donnée */
{ {
SDL_Rect rectangle; SDL_Rect rectangle;
rectangle.x=start_x*ZOOMX; rectangle.x=start_x*ZOOMX;
@ -65,10 +65,10 @@ void Block_tall2 (word start_x,word start_y,word width,word height,byte color)
} }
void Display_part_of_screen_tall2 (word width,word height,word image_width) void Display_part_of_screen_tall2 (word width,word height,word image_width)
/* Afficher une partie de l'image telle quelle sur l'écran */ /* Afficher une partie de l'image telle quelle sur l'écran */
{ {
byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest)
byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src) byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
int y; int y;
int dy; int dy;
@ -89,7 +89,7 @@ void Display_part_of_screen_tall2 (word width,word height,word image_width)
// On la quadruple // On la quadruple
memcpy(dest-width*ZOOMX+3*VIDEO_LINE_WIDTH,dest-width*ZOOMX,width*ZOOMX); memcpy(dest-width*ZOOMX+3*VIDEO_LINE_WIDTH,dest-width*ZOOMX,width*ZOOMX);
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width-width; src+=image_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
} }
@ -97,10 +97,10 @@ void Display_part_of_screen_tall2 (word width,word height,word image_width)
} }
void Pixel_preview_normal_tall2 (word x,word y,byte color) void Pixel_preview_normal_tall2 (word x,word y,byte color)
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image /* 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) * dans l'écran, en mode normal (pas en mode loupe)
* Note: si on modifie cette procédure, il faudra penser à faire également * Note: si on modifie cette procédure, il faudra penser à faire également
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */ * la modif dans la procédure Pixel_Preview_Loupe_SDL. */
{ {
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0) // if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
Pixel_tall2(x-Main.offset_X,y-Main.offset_Y,color); Pixel_tall2(x-Main.offset_X,y-Main.offset_Y,color);
@ -108,10 +108,10 @@ void Pixel_preview_normal_tall2 (word x,word y,byte color)
void Pixel_preview_magnifier_tall2 (word x,word y,byte color) void Pixel_preview_magnifier_tall2 (word x,word y,byte color)
{ {
// Affiche le pixel dans la partie non zoomée // Affiche le pixel dans la partie non zoomée
Pixel_tall2(x-Main.offset_X,y-Main.offset_Y,color); Pixel_tall2(x-Main.offset_X,y-Main.offset_Y,color);
// Regarde si on doit aussi l'afficher dans la partie zoomée // Regarde si on doit aussi l'afficher dans la partie zoomée
if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom
&& x >= Limit_left_zoom && x <= Limit_visible_right_zoom) && x >= Limit_left_zoom && x <= Limit_visible_right_zoom)
{ {
@ -121,7 +121,7 @@ void Pixel_preview_magnifier_tall2 (word x,word y,byte color)
if (Menu_Y - y_zoom < Main.magnifier_factor) if (Menu_Y - y_zoom < Main.magnifier_factor)
// On ne doit dessiner qu'un morceau du pixel // On ne doit dessiner qu'un morceau du pixel
// sinon on dépasse sur le menu // sinon on dépasse sur le menu
height = Menu_Y - y_zoom; height = Menu_Y - y_zoom;
else else
height = Main.magnifier_factor; height = Main.magnifier_factor;
@ -157,7 +157,7 @@ void Vertical_XOR_line_tall2(word x_pos,word y_pos,word height)
void Display_brush_color_tall2(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_color_tall2(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
@ -170,7 +170,7 @@ void Display_brush_color_tall2(word x_pos,word y_pos,word x_offset,word y_offset
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*(dest+3*VIDEO_LINE_WIDTH+1) = *(dest+3*VIDEO_LINE_WIDTH) = *(dest+2*VIDEO_LINE_WIDTH+1) = *(dest+2*VIDEO_LINE_WIDTH) = *(dest+VIDEO_LINE_WIDTH+1) = *(dest+VIDEO_LINE_WIDTH) = *(dest+1) = *dest = *src; *(dest+3*VIDEO_LINE_WIDTH+1) = *(dest+3*VIDEO_LINE_WIDTH) = *(dest+2*VIDEO_LINE_WIDTH+1) = *(dest+2*VIDEO_LINE_WIDTH) = *(dest+VIDEO_LINE_WIDTH+1) = *(dest+VIDEO_LINE_WIDTH) = *(dest+1) = *dest = *src;
@ -181,7 +181,7 @@ void Display_brush_color_tall2(word x_pos,word y_pos,word x_offset,word y_offset
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -193,8 +193,8 @@ void Display_brush_mono_tall2(word x_pos, word y_pos,
byte transp_color, byte color, word brush_width) byte transp_color, byte color, word brush_width)
/* On affiche la brosse en monochrome */ /* On affiche la brosse en monochrome */
{ {
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
// l'écran // l'écran
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
// la brosse // la brosse
int x,y; int x,y;
@ -213,7 +213,7 @@ void Display_brush_mono_tall2(word x_pos, word y_pos,
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=brush_width-width; src+=brush_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
} }
@ -222,8 +222,8 @@ void Display_brush_mono_tall2(word x_pos, word y_pos,
void Clear_brush_tall2(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width) void Clear_brush_tall2(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width)
{ {
byte* dest=Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest)
byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src) byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src)
int y; int y;
int x; int x;
(void)x_offset; // unused (void)x_offset; // unused
@ -243,17 +243,17 @@ void Clear_brush_tall2(word x_pos,word y_pos,word x_offset,word y_offset,word wi
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width-width; src+=image_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
} }
Update_rect(x_pos,y_pos,width,height); Update_rect(x_pos,y_pos,width,height);
} }
// Affiche une brosse (arbitraire) à l'écran // Affiche une brosse (arbitraire) à l'écran
void Display_brush_tall2(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_tall2(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = brush + y_offset * brush_width + x_offset; byte* src = brush + y_offset * brush_width + x_offset;
@ -266,7 +266,7 @@ void Display_brush_tall2(byte * brush, word x_pos,word y_pos,word x_offset,word
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*(dest+3*VIDEO_LINE_WIDTH+1)=*(dest+3*VIDEO_LINE_WIDTH)=*(dest+2*VIDEO_LINE_WIDTH+1)=*(dest+2*VIDEO_LINE_WIDTH)=*(dest+VIDEO_LINE_WIDTH+1)=*(dest+VIDEO_LINE_WIDTH)=*(dest+1)=*(dest)=*src; *(dest+3*VIDEO_LINE_WIDTH+1)=*(dest+3*VIDEO_LINE_WIDTH)=*(dest+2*VIDEO_LINE_WIDTH+1)=*(dest+2*VIDEO_LINE_WIDTH)=*(dest+VIDEO_LINE_WIDTH+1)=*(dest+VIDEO_LINE_WIDTH)=*(dest+1)=*(dest)=*src;
@ -276,7 +276,7 @@ void Display_brush_tall2(byte * brush, word x_pos,word y_pos,word x_offset,word
src++; dest+=ZOOMX; src++; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -284,7 +284,7 @@ void Display_brush_tall2(byte * brush, word x_pos,word y_pos,word x_offset,word
void Remap_screen_tall2(word x_pos,word y_pos,word width,word height,byte * conversion_table) void Remap_screen_tall2(word x_pos,word y_pos,word width,word height,byte * conversion_table)
{ {
// dest = coords a l'écran // dest = coords a l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
int x,y; int x,y;
@ -307,7 +307,7 @@ void Remap_screen_tall2(word x_pos,word y_pos,word width,word height,byte * conv
void Display_line_on_screen_fast_tall2(word x_pos,word y_pos,word width,byte * line) void Display_line_on_screen_fast_tall2(word x_pos,word y_pos,word width,byte * line)
/* On affiche toute une ligne de pixels telle quelle. */ /* On affiche toute une ligne de pixels telle quelle. */
/* Utilisée si le buffer contient déja des pixel doublés. */ /* Utilisée si le buffer contient déja des pixel doublés. */
{ {
memcpy(Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH,line,width*ZOOMX); memcpy(Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH,line,width*ZOOMX);
memcpy(Screen_pixels+x_pos*ZOOMX+(y_pos*ZOOMY+1)*VIDEO_LINE_WIDTH,line,width*ZOOMX); memcpy(Screen_pixels+x_pos*ZOOMX+(y_pos*ZOOMY+1)*VIDEO_LINE_WIDTH,line,width*ZOOMX);
@ -331,8 +331,8 @@ void Display_line_on_screen_tall2(word x_pos,word y_pos,word width,byte * line)
void Display_transparent_mono_line_on_screen_tall2( void Display_transparent_mono_line_on_screen_tall2(
word x_pos, word y_pos, word width, byte* line, word x_pos, word y_pos, word width, byte* line,
byte transp_color, byte color) byte transp_color, byte color)
// Affiche une ligne à l'écran avec une couleur + transparence. // Affiche une ligne à l'écran avec une couleur + transparence.
// Utilisé par les brosses en mode zoom // Utilisé par les brosses en mode zoom
{ {
byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX; byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX;
int x; int x;
@ -354,31 +354,31 @@ void Read_line_screen_tall2(word x_pos,word y_pos,word width,byte * line)
} }
void Display_part_of_screen_scaled_tall2( void Display_part_of_screen_scaled_tall2(
word width, // width non zoomée word width, // width non zoomée
word height, // height zoomée word height, // height zoomée
word image_width,byte * buffer) word image_width,byte * buffer)
{ {
byte* src = Main_screen + Main.magnifier_offset_Y * image_width byte* src = Main_screen + Main.magnifier_offset_Y * image_width
+ Main.magnifier_offset_X; + Main.magnifier_offset_X;
int y = 0; // Ligne en cours de traitement int y = 0; // Ligne en cours de traitement
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1) while(1)
{ {
int x; int x;
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width); Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);
// On l'affiche Facteur fois, sur des lignes consécutives // On l'affiche Facteur fois, sur des lignes consécutives
x = Main.magnifier_factor/**ZOOMY*/; x = Main.magnifier_factor/**ZOOMY*/;
// Pour chaque ligne // Pour chaque ligne
do{ do{
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_line_on_screen_fast_tall2( Display_line_on_screen_fast_tall2(
Main.X_zoom, y, width*Main.magnifier_factor, Main.X_zoom, y, width*Main.magnifier_factor,
buffer buffer
); );
// On passe à la suivante // On passe à la suivante
y++; y++;
if(y==height/**ZOOMY*/) if(y==height/**ZOOMY*/)
{ {
@ -395,12 +395,12 @@ void Display_part_of_screen_scaled_tall2(
// ATTENTION on n'arrive jamais ici ! // ATTENTION on n'arrive jamais ici !
} }
// Affiche une partie de la brosse couleur zoomée // Affiche une partie de la brosse couleur zoomée
void Display_brush_color_zoom_tall2(word x_pos,word y_pos, void Display_brush_color_zoom_tall2(word x_pos,word y_pos,
word x_offset,word y_offset, word x_offset,word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos,byte transp_color, word end_y_pos,byte transp_color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer) byte * buffer)
{ {
byte* src = Brush+y_offset*brush_width + x_offset; byte* src = Brush+y_offset*brush_width + x_offset;
@ -411,7 +411,7 @@ void Display_brush_color_zoom_tall2(word x_pos,word y_pos,
while(1) while(1)
{ {
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche facteur fois la ligne zoomée // On affiche facteur fois la ligne zoomée
for(bx=Main.magnifier_factor;bx>0;bx--) for(bx=Main.magnifier_factor;bx>0;bx--)
{ {
byte* line_src = buffer; byte* line_src = buffer;
@ -446,10 +446,10 @@ void Display_brush_color_zoom_tall2(word x_pos,word y_pos,
void Display_brush_mono_zoom_tall2(word x_pos, word y_pos, void Display_brush_mono_zoom_tall2(word x_pos, word y_pos,
word x_offset, word y_offset, word x_offset, word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos, word end_y_pos,
byte transp_color, byte color, byte transp_color, byte color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer byte * buffer
) )
@ -457,29 +457,29 @@ void Display_brush_mono_zoom_tall2(word x_pos, word y_pos,
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
int y=y_pos*ZOOMY; int y=y_pos*ZOOMY;
//Pour chaque ligne à zoomer : //Pour chaque ligne à zoomer :
while(1) while(1)
{ {
int bx; int bx;
// src = Ligne originale // src = Ligne originale
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche la ligne Facteur fois à l'écran (sur des // On affiche la ligne Facteur fois à l'écran (sur des
// lignes consécutives) // lignes consécutives)
bx = Main.magnifier_factor*ZOOMY; bx = Main.magnifier_factor*ZOOMY;
// Pour chaque ligne écran // Pour chaque ligne écran
do do
{ {
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_transparent_mono_line_on_screen_tall2( Display_transparent_mono_line_on_screen_tall2(
x_pos, y, width * Main.magnifier_factor, x_pos, y, width * Main.magnifier_factor,
buffer, transp_color, color buffer, transp_color, color
); );
// On passe à la ligne suivante // On passe à la ligne suivante
y++; y++;
// On vérifie qu'on est pas à la ligne finale // On vérifie qu'on est pas à la ligne finale
if(y == end_y_pos*ZOOMY) if(y == end_y_pos*ZOOMY)
{ {
Redraw_grid( x_pos, y_pos, Redraw_grid( x_pos, y_pos,
@ -492,7 +492,7 @@ void Display_brush_mono_zoom_tall2(word x_pos, word y_pos,
} }
while (bx > 0); while (bx > 0);
// Passage à la ligne suivante dans la brosse aussi // Passage à la ligne suivante dans la brosse aussi
src+=brush_width; src+=brush_width;
} }
} }
@ -500,13 +500,13 @@ void Display_brush_mono_zoom_tall2(word x_pos, word y_pos,
void Clear_brush_scaled_tall2(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer) void Clear_brush_scaled_tall2(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer)
{ {
// En fait on va recopier l'image non zoomée dans la partie zoomée ! // En fait on va recopier l'image non zoomée dans la partie zoomée !
byte* src = Main_screen + y_offset * image_width + x_offset; byte* src = Main_screen + y_offset * image_width + x_offset;
int y = y_pos; int y = y_pos;
int bx; int bx;
(void)transp_color; // unused (void)transp_color; // unused
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1){ while(1){
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width); Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);

View File

@ -35,7 +35,7 @@
void Pixel_tall3 (word x,word y,byte color) void Pixel_tall3 (word x,word y,byte color)
/* Affiche un pixel de la color aux coords x;y à l'écran */ /* Affiche un pixel de la color aux coords x;y à l'écran */
{ {
*(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH)=color; *(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH)=color;
*(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH + 1)=color; *(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH + 1)=color;
@ -52,13 +52,13 @@ void Pixel_tall3 (word x,word y,byte color)
} }
byte Read_pixel_tall3 (word x,word y) byte Read_pixel_tall3 (word x,word y)
/* On retourne la couleur du pixel aux coords données */ /* On retourne la couleur du pixel aux coords données */
{ {
return *( Screen_pixels + y * ZOOMY * VIDEO_LINE_WIDTH + x * ZOOMX); return *( Screen_pixels + y * ZOOMY * VIDEO_LINE_WIDTH + x * ZOOMX);
} }
void Block_tall3 (word start_x,word start_y,word width,word height,byte color) void Block_tall3 (word start_x,word start_y,word width,word height,byte color)
/* On affiche un rectangle de la couleur donnée */ /* On affiche un rectangle de la couleur donnée */
{ {
SDL_Rect rectangle; SDL_Rect rectangle;
rectangle.x=start_x*ZOOMX; rectangle.x=start_x*ZOOMX;
@ -69,10 +69,10 @@ void Block_tall3 (word start_x,word start_y,word width,word height,byte color)
} }
void Display_part_of_screen_tall3 (word width,word height,word image_width) void Display_part_of_screen_tall3 (word width,word height,word image_width)
/* Afficher une partie de l'image telle quelle sur l'écran */ /* Afficher une partie de l'image telle quelle sur l'écran */
{ {
byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest)
byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src) byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
int y; int y;
int dy; int dy;
@ -93,7 +93,7 @@ void Display_part_of_screen_tall3 (word width,word height,word image_width)
// On la quadruple // On la quadruple
memcpy(dest-width*ZOOMX+3*VIDEO_LINE_WIDTH,dest-width*ZOOMX,width*ZOOMX); memcpy(dest-width*ZOOMX+3*VIDEO_LINE_WIDTH,dest-width*ZOOMX,width*ZOOMX);
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width-width; src+=image_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
} }
@ -101,10 +101,10 @@ void Display_part_of_screen_tall3 (word width,word height,word image_width)
} }
void Pixel_preview_normal_tall3 (word x,word y,byte color) void Pixel_preview_normal_tall3 (word x,word y,byte color)
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image /* 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) * dans l'écran, en mode normal (pas en mode loupe)
* Note: si on modifie cette procédure, il faudra penser à faire également * Note: si on modifie cette procédure, il faudra penser à faire également
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */ * la modif dans la procédure Pixel_Preview_Loupe_SDL. */
{ {
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0) // if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
Pixel_tall3(x-Main.offset_X,y-Main.offset_Y,color); Pixel_tall3(x-Main.offset_X,y-Main.offset_Y,color);
@ -112,10 +112,10 @@ void Pixel_preview_normal_tall3 (word x,word y,byte color)
void Pixel_preview_magnifier_tall3 (word x,word y,byte color) void Pixel_preview_magnifier_tall3 (word x,word y,byte color)
{ {
// Affiche le pixel dans la partie non zoomée // Affiche le pixel dans la partie non zoomée
Pixel_tall3(x-Main.offset_X,y-Main.offset_Y,color); Pixel_tall3(x-Main.offset_X,y-Main.offset_Y,color);
// Regarde si on doit aussi l'afficher dans la partie zoomée // Regarde si on doit aussi l'afficher dans la partie zoomée
if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom
&& x >= Limit_left_zoom && x <= Limit_visible_right_zoom) && x >= Limit_left_zoom && x <= Limit_visible_right_zoom)
{ {
@ -125,7 +125,7 @@ void Pixel_preview_magnifier_tall3 (word x,word y,byte color)
if (Menu_Y - y_zoom < Main.magnifier_factor) if (Menu_Y - y_zoom < Main.magnifier_factor)
// On ne doit dessiner qu'un morceau du pixel // On ne doit dessiner qu'un morceau du pixel
// sinon on dépasse sur le menu // sinon on dépasse sur le menu
height = Menu_Y - y_zoom; height = Menu_Y - y_zoom;
else else
height = Main.magnifier_factor; height = Main.magnifier_factor;
@ -161,7 +161,7 @@ void Vertical_XOR_line_tall3(word x_pos,word y_pos,word height)
void Display_brush_color_tall3(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_color_tall3(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
@ -174,7 +174,7 @@ void Display_brush_color_tall3(word x_pos,word y_pos,word x_offset,word y_offset
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*(dest+3*VIDEO_LINE_WIDTH+2) =*(dest+3*VIDEO_LINE_WIDTH+1) = *(dest+3*VIDEO_LINE_WIDTH) = *(dest+2*VIDEO_LINE_WIDTH+2) =*(dest+2*VIDEO_LINE_WIDTH+1) = *(dest+2*VIDEO_LINE_WIDTH) = *(dest+VIDEO_LINE_WIDTH+2) =*(dest+VIDEO_LINE_WIDTH+1) = *(dest+VIDEO_LINE_WIDTH) = *(dest+2) =*(dest+1) = *dest = *src; *(dest+3*VIDEO_LINE_WIDTH+2) =*(dest+3*VIDEO_LINE_WIDTH+1) = *(dest+3*VIDEO_LINE_WIDTH) = *(dest+2*VIDEO_LINE_WIDTH+2) =*(dest+2*VIDEO_LINE_WIDTH+1) = *(dest+2*VIDEO_LINE_WIDTH) = *(dest+VIDEO_LINE_WIDTH+2) =*(dest+VIDEO_LINE_WIDTH+1) = *(dest+VIDEO_LINE_WIDTH) = *(dest+2) =*(dest+1) = *dest = *src;
@ -185,7 +185,7 @@ void Display_brush_color_tall3(word x_pos,word y_pos,word x_offset,word y_offset
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -197,8 +197,8 @@ void Display_brush_mono_tall3(word x_pos, word y_pos,
byte transp_color, byte color, word brush_width) byte transp_color, byte color, word brush_width)
/* On affiche la brosse en monochrome */ /* On affiche la brosse en monochrome */
{ {
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
// l'écran // l'écran
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
// la brosse // la brosse
int x,y; int x,y;
@ -217,7 +217,7 @@ void Display_brush_mono_tall3(word x_pos, word y_pos,
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=brush_width-width; src+=brush_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
} }
@ -226,8 +226,8 @@ void Display_brush_mono_tall3(word x_pos, word y_pos,
void Clear_brush_tall3(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width) void Clear_brush_tall3(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width)
{ {
byte* dest=Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest)
byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src) byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src)
int y; int y;
int x; int x;
(void)x_offset; // unused (void)x_offset; // unused
@ -247,17 +247,17 @@ void Clear_brush_tall3(word x_pos,word y_pos,word x_offset,word y_offset,word wi
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width-width; src+=image_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
} }
Update_rect(x_pos,y_pos,width,height); Update_rect(x_pos,y_pos,width,height);
} }
// Affiche une brosse (arbitraire) à l'écran // Affiche une brosse (arbitraire) à l'écran
void Display_brush_tall3(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_tall3(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = brush + y_offset * brush_width + x_offset; byte* src = brush + y_offset * brush_width + x_offset;
@ -270,7 +270,7 @@ void Display_brush_tall3(byte * brush, word x_pos,word y_pos,word x_offset,word
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*(dest+3*VIDEO_LINE_WIDTH+2)=*(dest+3*VIDEO_LINE_WIDTH+1)=*(dest+3*VIDEO_LINE_WIDTH)=*(dest+2*VIDEO_LINE_WIDTH+2)=*(dest+2*VIDEO_LINE_WIDTH+1)=*(dest+2*VIDEO_LINE_WIDTH)=*(dest+VIDEO_LINE_WIDTH+2)=*(dest+VIDEO_LINE_WIDTH+1)=*(dest+VIDEO_LINE_WIDTH)=*(dest+2)=*(dest+1)=*(dest)=*src; *(dest+3*VIDEO_LINE_WIDTH+2)=*(dest+3*VIDEO_LINE_WIDTH+1)=*(dest+3*VIDEO_LINE_WIDTH)=*(dest+2*VIDEO_LINE_WIDTH+2)=*(dest+2*VIDEO_LINE_WIDTH+1)=*(dest+2*VIDEO_LINE_WIDTH)=*(dest+VIDEO_LINE_WIDTH+2)=*(dest+VIDEO_LINE_WIDTH+1)=*(dest+VIDEO_LINE_WIDTH)=*(dest+2)=*(dest+1)=*(dest)=*src;
@ -280,7 +280,7 @@ void Display_brush_tall3(byte * brush, word x_pos,word y_pos,word x_offset,word
src++; dest+=ZOOMX; src++; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -288,7 +288,7 @@ void Display_brush_tall3(byte * brush, word x_pos,word y_pos,word x_offset,word
void Remap_screen_tall3(word x_pos,word y_pos,word width,word height,byte * conversion_table) void Remap_screen_tall3(word x_pos,word y_pos,word width,word height,byte * conversion_table)
{ {
// dest = coords a l'écran // dest = coords a l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
int x,y; int x,y;
@ -311,7 +311,7 @@ void Remap_screen_tall3(word x_pos,word y_pos,word width,word height,byte * conv
void Display_line_on_screen_fast_tall3(word x_pos,word y_pos,word width,byte * line) void Display_line_on_screen_fast_tall3(word x_pos,word y_pos,word width,byte * line)
/* On affiche toute une ligne de pixels telle quelle. */ /* On affiche toute une ligne de pixels telle quelle. */
/* Utilisée si le buffer contient déja des pixel doublés. */ /* Utilisée si le buffer contient déja des pixel doublés. */
{ {
memcpy(Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH,line,width*ZOOMX); memcpy(Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH,line,width*ZOOMX);
memcpy(Screen_pixels+x_pos*ZOOMX+(y_pos*ZOOMY+1)*VIDEO_LINE_WIDTH,line,width*ZOOMX); memcpy(Screen_pixels+x_pos*ZOOMX+(y_pos*ZOOMY+1)*VIDEO_LINE_WIDTH,line,width*ZOOMX);
@ -335,8 +335,8 @@ void Display_line_on_screen_tall3(word x_pos,word y_pos,word width,byte * line)
void Display_transparent_mono_line_on_screen_tall3( void Display_transparent_mono_line_on_screen_tall3(
word x_pos, word y_pos, word width, byte* line, word x_pos, word y_pos, word width, byte* line,
byte transp_color, byte color) byte transp_color, byte color)
// Affiche une ligne à l'écran avec une couleur + transparence. // Affiche une ligne à l'écran avec une couleur + transparence.
// Utilisé par les brosses en mode zoom // Utilisé par les brosses en mode zoom
{ {
byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX; byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX;
int x; int x;
@ -358,31 +358,31 @@ void Read_line_screen_tall3(word x_pos,word y_pos,word width,byte * line)
} }
void Display_part_of_screen_scaled_tall3( void Display_part_of_screen_scaled_tall3(
word width, // width non zoomée word width, // width non zoomée
word height, // height zoomée word height, // height zoomée
word image_width,byte * buffer) word image_width,byte * buffer)
{ {
byte* src = Main_screen + Main.magnifier_offset_Y * image_width byte* src = Main_screen + Main.magnifier_offset_Y * image_width
+ Main.magnifier_offset_X; + Main.magnifier_offset_X;
int y = 0; // Ligne en cours de traitement int y = 0; // Ligne en cours de traitement
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1) while(1)
{ {
int x; int x;
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width); Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);
// On l'affiche Facteur fois, sur des lignes consécutives // On l'affiche Facteur fois, sur des lignes consécutives
x = Main.magnifier_factor/**ZOOMY*/; x = Main.magnifier_factor/**ZOOMY*/;
// Pour chaque ligne // Pour chaque ligne
do{ do{
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_line_on_screen_fast_tall3( Display_line_on_screen_fast_tall3(
Main.X_zoom, y, width*Main.magnifier_factor, Main.X_zoom, y, width*Main.magnifier_factor,
buffer buffer
); );
// On passe à la suivante // On passe à la suivante
y++; y++;
if(y==height/**ZOOMY*/) if(y==height/**ZOOMY*/)
{ {
@ -399,12 +399,12 @@ void Display_part_of_screen_scaled_tall3(
// ATTENTION on n'arrive jamais ici ! // ATTENTION on n'arrive jamais ici !
} }
// Affiche une partie de la brosse couleur zoomée // Affiche une partie de la brosse couleur zoomée
void Display_brush_color_zoom_tall3(word x_pos,word y_pos, void Display_brush_color_zoom_tall3(word x_pos,word y_pos,
word x_offset,word y_offset, word x_offset,word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos,byte transp_color, word end_y_pos,byte transp_color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer) byte * buffer)
{ {
byte* src = Brush+y_offset*brush_width + x_offset; byte* src = Brush+y_offset*brush_width + x_offset;
@ -415,7 +415,7 @@ void Display_brush_color_zoom_tall3(word x_pos,word y_pos,
while(1) while(1)
{ {
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche facteur fois la ligne zoomée // On affiche facteur fois la ligne zoomée
for(bx=Main.magnifier_factor;bx>0;bx--) for(bx=Main.magnifier_factor;bx>0;bx--)
{ {
byte* line_src = buffer; byte* line_src = buffer;
@ -450,10 +450,10 @@ void Display_brush_color_zoom_tall3(word x_pos,word y_pos,
void Display_brush_mono_zoom_tall3(word x_pos, word y_pos, void Display_brush_mono_zoom_tall3(word x_pos, word y_pos,
word x_offset, word y_offset, word x_offset, word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos, word end_y_pos,
byte transp_color, byte color, byte transp_color, byte color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer byte * buffer
) )
@ -461,29 +461,29 @@ void Display_brush_mono_zoom_tall3(word x_pos, word y_pos,
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
int y=y_pos*ZOOMY; int y=y_pos*ZOOMY;
//Pour chaque ligne à zoomer : //Pour chaque ligne à zoomer :
while(1) while(1)
{ {
int bx; int bx;
// src = Ligne originale // src = Ligne originale
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche la ligne Facteur fois à l'écran (sur des // On affiche la ligne Facteur fois à l'écran (sur des
// lignes consécutives) // lignes consécutives)
bx = Main.magnifier_factor*ZOOMY; bx = Main.magnifier_factor*ZOOMY;
// Pour chaque ligne écran // Pour chaque ligne écran
do do
{ {
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_transparent_mono_line_on_screen_tall3( Display_transparent_mono_line_on_screen_tall3(
x_pos, y, width * Main.magnifier_factor, x_pos, y, width * Main.magnifier_factor,
buffer, transp_color, color buffer, transp_color, color
); );
// On passe à la ligne suivante // On passe à la ligne suivante
y++; y++;
// On vérifie qu'on est pas à la ligne finale // On vérifie qu'on est pas à la ligne finale
if(y == end_y_pos*ZOOMY) if(y == end_y_pos*ZOOMY)
{ {
Redraw_grid( x_pos, y_pos, Redraw_grid( x_pos, y_pos,
@ -496,7 +496,7 @@ void Display_brush_mono_zoom_tall3(word x_pos, word y_pos,
} }
while (bx > 0); while (bx > 0);
// Passage à la ligne suivante dans la brosse aussi // Passage à la ligne suivante dans la brosse aussi
src+=brush_width; src+=brush_width;
} }
} }
@ -504,13 +504,13 @@ void Display_brush_mono_zoom_tall3(word x_pos, word y_pos,
void Clear_brush_scaled_tall3(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer) void Clear_brush_scaled_tall3(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer)
{ {
// En fait on va recopier l'image non zoomée dans la partie zoomée ! // En fait on va recopier l'image non zoomée dans la partie zoomée !
byte* src = Main_screen + y_offset * image_width + x_offset; byte* src = Main_screen + y_offset * image_width + x_offset;
int y = y_pos; int y = y_pos;
int bx; int bx;
(void)transp_color; // unused (void)transp_color; // unused
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1){ while(1){
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width); Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);

View File

@ -35,7 +35,7 @@
void Pixel_triple (word x,word y,byte color) void Pixel_triple (word x,word y,byte color)
/* Affiche un pixel de la color aux coords x;y à l'écran */ /* Affiche un pixel de la color aux coords x;y à l'écran */
{ {
*(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH)=color; *(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH)=color;
*(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH + 1)=color; *(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH + 1)=color;
@ -49,13 +49,13 @@ void Pixel_triple (word x,word y,byte color)
} }
byte Read_pixel_triple (word x,word y) byte Read_pixel_triple (word x,word y)
/* On retourne la couleur du pixel aux coords données */ /* On retourne la couleur du pixel aux coords données */
{ {
return *( Screen_pixels + y * ZOOMY * VIDEO_LINE_WIDTH + x * ZOOMX); return *( Screen_pixels + y * ZOOMY * VIDEO_LINE_WIDTH + x * ZOOMX);
} }
void Block_triple (word start_x,word start_y,word width,word height,byte color) void Block_triple (word start_x,word start_y,word width,word height,byte color)
/* On affiche un rectangle de la couleur donnée */ /* On affiche un rectangle de la couleur donnée */
{ {
SDL_Rect rectangle; SDL_Rect rectangle;
rectangle.x=start_x*ZOOMX; rectangle.x=start_x*ZOOMX;
@ -66,10 +66,10 @@ void Block_triple (word start_x,word start_y,word width,word height,byte color)
} }
void Display_part_of_screen_triple (word width,word height,word image_width) void Display_part_of_screen_triple (word width,word height,word image_width)
/* Afficher une partie de l'image telle quelle sur l'écran */ /* Afficher une partie de l'image telle quelle sur l'écran */
{ {
byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest)
byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src) byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
int y; int y;
int dy; int dy;
@ -88,7 +88,7 @@ void Display_part_of_screen_triple (word width,word height,word image_width)
// On la triple // On la triple
memcpy(dest-width*ZOOMX+2*VIDEO_LINE_WIDTH,dest-width*ZOOMX,width*ZOOMX); memcpy(dest-width*ZOOMX+2*VIDEO_LINE_WIDTH,dest-width*ZOOMX,width*ZOOMX);
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width-width; src+=image_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
} }
@ -96,10 +96,10 @@ void Display_part_of_screen_triple (word width,word height,word image_width)
} }
void Pixel_preview_normal_triple (word x,word y,byte color) void Pixel_preview_normal_triple (word x,word y,byte color)
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image /* 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) * dans l'écran, en mode normal (pas en mode loupe)
* Note: si on modifie cette procédure, il faudra penser à faire également * Note: si on modifie cette procédure, il faudra penser à faire également
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */ * la modif dans la procédure Pixel_Preview_Loupe_SDL. */
{ {
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0) // if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
Pixel_triple(x-Main.offset_X,y-Main.offset_Y,color); Pixel_triple(x-Main.offset_X,y-Main.offset_Y,color);
@ -107,10 +107,10 @@ void Pixel_preview_normal_triple (word x,word y,byte color)
void Pixel_preview_magnifier_triple (word x,word y,byte color) void Pixel_preview_magnifier_triple (word x,word y,byte color)
{ {
// Affiche le pixel dans la partie non zoomée // Affiche le pixel dans la partie non zoomée
Pixel_triple(x-Main.offset_X,y-Main.offset_Y,color); Pixel_triple(x-Main.offset_X,y-Main.offset_Y,color);
// Regarde si on doit aussi l'afficher dans la partie zoomée // Regarde si on doit aussi l'afficher dans la partie zoomée
if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom
&& x >= Limit_left_zoom && x <= Limit_visible_right_zoom) && x >= Limit_left_zoom && x <= Limit_visible_right_zoom)
{ {
@ -120,7 +120,7 @@ void Pixel_preview_magnifier_triple (word x,word y,byte color)
if (Menu_Y - y_zoom < Main.magnifier_factor) if (Menu_Y - y_zoom < Main.magnifier_factor)
// On ne doit dessiner qu'un morceau du pixel // On ne doit dessiner qu'un morceau du pixel
// sinon on dépasse sur le menu // sinon on dépasse sur le menu
height = Menu_Y - y_zoom; height = Menu_Y - y_zoom;
else else
height = Main.magnifier_factor; height = Main.magnifier_factor;
@ -156,7 +156,7 @@ void Vertical_XOR_line_triple(word x_pos,word y_pos,word height)
void Display_brush_color_triple(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_color_triple(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
@ -169,7 +169,7 @@ void Display_brush_color_triple(word x_pos,word y_pos,word x_offset,word y_offse
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*(dest+2*VIDEO_LINE_WIDTH+2) = *(dest+2*VIDEO_LINE_WIDTH+1) = *(dest+2*VIDEO_LINE_WIDTH) = *(dest+VIDEO_LINE_WIDTH+2) = *(dest+VIDEO_LINE_WIDTH+1) = *(dest+VIDEO_LINE_WIDTH) = *(dest+2) = *(dest+1) = *dest = *src; *(dest+2*VIDEO_LINE_WIDTH+2) = *(dest+2*VIDEO_LINE_WIDTH+1) = *(dest+2*VIDEO_LINE_WIDTH) = *(dest+VIDEO_LINE_WIDTH+2) = *(dest+VIDEO_LINE_WIDTH+1) = *(dest+VIDEO_LINE_WIDTH) = *(dest+2) = *(dest+1) = *dest = *src;
@ -180,7 +180,7 @@ void Display_brush_color_triple(word x_pos,word y_pos,word x_offset,word y_offse
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -192,8 +192,8 @@ void Display_brush_mono_triple(word x_pos, word y_pos,
byte transp_color, byte color, word brush_width) byte transp_color, byte color, word brush_width)
/* On affiche la brosse en monochrome */ /* On affiche la brosse en monochrome */
{ {
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
// l'écran // l'écran
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
// la brosse // la brosse
int x,y; int x,y;
@ -212,7 +212,7 @@ void Display_brush_mono_triple(word x_pos, word y_pos,
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=brush_width-width; src+=brush_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
} }
@ -221,8 +221,8 @@ void Display_brush_mono_triple(word x_pos, word y_pos,
void Clear_brush_triple(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width) void Clear_brush_triple(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width)
{ {
byte* dest=Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest)
byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src) byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src)
int y; int y;
int x; int x;
(void)x_offset; // unused (void)x_offset; // unused
@ -242,17 +242,17 @@ void Clear_brush_triple(word x_pos,word y_pos,word x_offset,word y_offset,word w
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width-width; src+=image_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
} }
Update_rect(x_pos,y_pos,width,height); Update_rect(x_pos,y_pos,width,height);
} }
// Affiche une brosse (arbitraire) à l'écran // Affiche une brosse (arbitraire) à l'écran
void Display_brush_triple(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_triple(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = brush + y_offset * brush_width + x_offset; byte* src = brush + y_offset * brush_width + x_offset;
@ -265,7 +265,7 @@ void Display_brush_triple(byte * brush, word x_pos,word y_pos,word x_offset,word
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*(dest+2*VIDEO_LINE_WIDTH+2)=*(dest+2*VIDEO_LINE_WIDTH+1)=*(dest+2*VIDEO_LINE_WIDTH)=*(dest+VIDEO_LINE_WIDTH+2)=*(dest+VIDEO_LINE_WIDTH+1)=*(dest+VIDEO_LINE_WIDTH)=*(dest+2)=*(dest+1)=*dest=*src; *(dest+2*VIDEO_LINE_WIDTH+2)=*(dest+2*VIDEO_LINE_WIDTH+1)=*(dest+2*VIDEO_LINE_WIDTH)=*(dest+VIDEO_LINE_WIDTH+2)=*(dest+VIDEO_LINE_WIDTH+1)=*(dest+VIDEO_LINE_WIDTH)=*(dest+2)=*(dest+1)=*dest=*src;
@ -275,7 +275,7 @@ void Display_brush_triple(byte * brush, word x_pos,word y_pos,word x_offset,word
src++; dest+=ZOOMX; src++; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -283,7 +283,7 @@ void Display_brush_triple(byte * brush, word x_pos,word y_pos,word x_offset,word
void Remap_screen_triple(word x_pos,word y_pos,word width,word height,byte * conversion_table) void Remap_screen_triple(word x_pos,word y_pos,word width,word height,byte * conversion_table)
{ {
// dest = coords a l'écran // dest = coords a l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
int x,y; int x,y;
@ -306,7 +306,7 @@ void Remap_screen_triple(word x_pos,word y_pos,word width,word height,byte * con
void Display_line_on_screen_fast_triple(word x_pos,word y_pos,word width,byte * line) void Display_line_on_screen_fast_triple(word x_pos,word y_pos,word width,byte * line)
/* On affiche toute une ligne de pixels telle quelle. */ /* On affiche toute une ligne de pixels telle quelle. */
/* Utilisée si le buffer contient déja des pixel doublés. */ /* Utilisée si le buffer contient déja des pixel doublés. */
{ {
memcpy(Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH,line,width*ZOOMX); memcpy(Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH,line,width*ZOOMX);
memcpy(Screen_pixels+x_pos*ZOOMX+(y_pos*ZOOMY+1)*VIDEO_LINE_WIDTH,line,width*ZOOMX); memcpy(Screen_pixels+x_pos*ZOOMX+(y_pos*ZOOMY+1)*VIDEO_LINE_WIDTH,line,width*ZOOMX);
@ -329,8 +329,8 @@ void Display_line_on_screen_triple(word x_pos,word y_pos,word width,byte * line)
void Display_transparent_mono_line_on_screen_triple( void Display_transparent_mono_line_on_screen_triple(
word x_pos, word y_pos, word width, byte* line, word x_pos, word y_pos, word width, byte* line,
byte transp_color, byte color) byte transp_color, byte color)
// Affiche une ligne à l'écran avec une couleur + transparence. // Affiche une ligne à l'écran avec une couleur + transparence.
// Utilisé par les brosses en mode zoom // Utilisé par les brosses en mode zoom
{ {
byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX; byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX;
int x; int x;
@ -352,31 +352,31 @@ void Read_line_screen_triple(word x_pos,word y_pos,word width,byte * line)
} }
void Display_part_of_screen_scaled_triple( void Display_part_of_screen_scaled_triple(
word width, // width non zoomée word width, // width non zoomée
word height, // height zoomée word height, // height zoomée
word image_width,byte * buffer) word image_width,byte * buffer)
{ {
byte* src = Main_screen + Main.magnifier_offset_Y * image_width byte* src = Main_screen + Main.magnifier_offset_Y * image_width
+ Main.magnifier_offset_X; + Main.magnifier_offset_X;
int y = 0; // Ligne en cours de traitement int y = 0; // Ligne en cours de traitement
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1) while(1)
{ {
int x; int x;
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width); Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);
// On l'affiche Facteur fois, sur des lignes consécutives // On l'affiche Facteur fois, sur des lignes consécutives
x = Main.magnifier_factor/**ZOOMY*/; x = Main.magnifier_factor/**ZOOMY*/;
// Pour chaque ligne // Pour chaque ligne
do{ do{
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_line_on_screen_fast_triple( Display_line_on_screen_fast_triple(
Main.X_zoom, y, width*Main.magnifier_factor, Main.X_zoom, y, width*Main.magnifier_factor,
buffer buffer
); );
// On passe à la suivante // On passe à la suivante
y++; y++;
if(y==height/**ZOOMY*/) if(y==height/**ZOOMY*/)
{ {
@ -393,12 +393,12 @@ void Display_part_of_screen_scaled_triple(
// ATTENTION on n'arrive jamais ici ! // ATTENTION on n'arrive jamais ici !
} }
// Affiche une partie de la brosse couleur zoomée // Affiche une partie de la brosse couleur zoomée
void Display_brush_color_zoom_triple(word x_pos,word y_pos, void Display_brush_color_zoom_triple(word x_pos,word y_pos,
word x_offset,word y_offset, word x_offset,word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos,byte transp_color, word end_y_pos,byte transp_color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer) byte * buffer)
{ {
byte* src = Brush+y_offset*brush_width + x_offset; byte* src = Brush+y_offset*brush_width + x_offset;
@ -409,7 +409,7 @@ void Display_brush_color_zoom_triple(word x_pos,word y_pos,
while(1) while(1)
{ {
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche facteur fois la ligne zoomée // On affiche facteur fois la ligne zoomée
for(bx=Main.magnifier_factor;bx>0;bx--) for(bx=Main.magnifier_factor;bx>0;bx--)
{ {
byte* line_src = buffer; byte* line_src = buffer;
@ -442,10 +442,10 @@ void Display_brush_color_zoom_triple(word x_pos,word y_pos,
void Display_brush_mono_zoom_triple(word x_pos, word y_pos, void Display_brush_mono_zoom_triple(word x_pos, word y_pos,
word x_offset, word y_offset, word x_offset, word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos, word end_y_pos,
byte transp_color, byte color, byte transp_color, byte color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer byte * buffer
) )
@ -453,29 +453,29 @@ void Display_brush_mono_zoom_triple(word x_pos, word y_pos,
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
int y=y_pos*ZOOMY; int y=y_pos*ZOOMY;
//Pour chaque ligne à zoomer : //Pour chaque ligne à zoomer :
while(1) while(1)
{ {
int bx; int bx;
// src = Ligne originale // src = Ligne originale
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche la ligne Facteur fois à l'écran (sur des // On affiche la ligne Facteur fois à l'écran (sur des
// lignes consécutives) // lignes consécutives)
bx = Main.magnifier_factor*ZOOMY; bx = Main.magnifier_factor*ZOOMY;
// Pour chaque ligne écran // Pour chaque ligne écran
do do
{ {
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_transparent_mono_line_on_screen_triple( Display_transparent_mono_line_on_screen_triple(
x_pos, y, width * Main.magnifier_factor, x_pos, y, width * Main.magnifier_factor,
buffer, transp_color, color buffer, transp_color, color
); );
// On passe à la ligne suivante // On passe à la ligne suivante
y++; y++;
// On vérifie qu'on est pas à la ligne finale // On vérifie qu'on est pas à la ligne finale
if(y == end_y_pos*ZOOMY) if(y == end_y_pos*ZOOMY)
{ {
Redraw_grid( x_pos, y_pos, Redraw_grid( x_pos, y_pos,
@ -488,7 +488,7 @@ void Display_brush_mono_zoom_triple(word x_pos, word y_pos,
} }
while (bx > 0); while (bx > 0);
// Passage à la ligne suivante dans la brosse aussi // Passage à la ligne suivante dans la brosse aussi
src+=brush_width; src+=brush_width;
} }
} }
@ -496,13 +496,13 @@ void Display_brush_mono_zoom_triple(word x_pos, word y_pos,
void Clear_brush_scaled_triple(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer) void Clear_brush_scaled_triple(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer)
{ {
// En fait on va recopier l'image non zoomée dans la partie zoomée ! // En fait on va recopier l'image non zoomée dans la partie zoomée !
byte* src = Main_screen + y_offset * image_width + x_offset; byte* src = Main_screen + y_offset * image_width + x_offset;
int y = y_pos; int y = y_pos;
int bx; int bx;
(void)transp_color; // unused (void)transp_color; // unused
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1){ while(1){
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width); Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);

View File

@ -35,20 +35,20 @@
void Pixel_wide (word x,word y,byte color) void Pixel_wide (word x,word y,byte color)
/* Affiche un pixel de la color aux coords x;y à l'écran */ /* Affiche un pixel de la color aux coords x;y à l'écran */
{ {
*(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH)=color; *(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH)=color;
*(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH + 1)=color; *(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH + 1)=color;
} }
byte Read_pixel_wide (word x,word y) byte Read_pixel_wide (word x,word y)
/* On retourne la couleur du pixel aux coords données */ /* On retourne la couleur du pixel aux coords données */
{ {
return *( Screen_pixels + y * ZOOMY * VIDEO_LINE_WIDTH + x * ZOOMX); return *( Screen_pixels + y * ZOOMY * VIDEO_LINE_WIDTH + x * ZOOMX);
} }
void Block_wide (word start_x,word start_y,word width,word height,byte color) void Block_wide (word start_x,word start_y,word width,word height,byte color)
/* On affiche un rectangle de la couleur donnée */ /* On affiche un rectangle de la couleur donnée */
{ {
SDL_Rect rectangle; SDL_Rect rectangle;
rectangle.x=start_x*ZOOMX; rectangle.x=start_x*ZOOMX;
@ -59,10 +59,10 @@ void Block_wide (word start_x,word start_y,word width,word height,byte color)
} }
void Display_part_of_screen_wide (word width,word height,word image_width) void Display_part_of_screen_wide (word width,word height,word image_width)
/* Afficher une partie de l'image telle quelle sur l'écran */ /* Afficher une partie de l'image telle quelle sur l'écran */
{ {
byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest)
byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src) byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
int y; int y;
int dy; int dy;
@ -77,7 +77,7 @@ void Display_part_of_screen_wide (word width,word height,word image_width)
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width-width; src+=image_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
} }
@ -85,10 +85,10 @@ void Display_part_of_screen_wide (word width,word height,word image_width)
} }
void Pixel_preview_normal_wide (word x,word y,byte color) void Pixel_preview_normal_wide (word x,word y,byte color)
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image /* 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) * dans l'écran, en mode normal (pas en mode loupe)
* Note: si on modifie cette procédure, il faudra penser à faire également * Note: si on modifie cette procédure, il faudra penser à faire également
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */ * la modif dans la procédure Pixel_Preview_Loupe_SDL. */
{ {
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0) // if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
Pixel_wide(x-Main.offset_X,y-Main.offset_Y,color); Pixel_wide(x-Main.offset_X,y-Main.offset_Y,color);
@ -96,10 +96,10 @@ void Pixel_preview_normal_wide (word x,word y,byte color)
void Pixel_preview_magnifier_wide (word x,word y,byte color) void Pixel_preview_magnifier_wide (word x,word y,byte color)
{ {
// Affiche le pixel dans la partie non zoomée // Affiche le pixel dans la partie non zoomée
Pixel_wide(x-Main.offset_X,y-Main.offset_Y,color); Pixel_wide(x-Main.offset_X,y-Main.offset_Y,color);
// Regarde si on doit aussi l'afficher dans la partie zoomée // Regarde si on doit aussi l'afficher dans la partie zoomée
if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom
&& x >= Limit_left_zoom && x <= Limit_visible_right_zoom) && x >= Limit_left_zoom && x <= Limit_visible_right_zoom)
{ {
@ -109,7 +109,7 @@ void Pixel_preview_magnifier_wide (word x,word y,byte color)
if (Menu_Y - y_zoom < Main.magnifier_factor) if (Menu_Y - y_zoom < Main.magnifier_factor)
// On ne doit dessiner qu'un morceau du pixel // On ne doit dessiner qu'un morceau du pixel
// sinon on dépasse sur le menu // sinon on dépasse sur le menu
height = Menu_Y - y_zoom; height = Menu_Y - y_zoom;
else else
height = Main.magnifier_factor; height = Main.magnifier_factor;
@ -145,7 +145,7 @@ void Vertical_XOR_line_wide(word x_pos,word y_pos,word height)
void Display_brush_color_wide(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_color_wide(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
@ -158,7 +158,7 @@ void Display_brush_color_wide(word x_pos,word y_pos,word x_offset,word y_offset,
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*(dest+1) = *dest = *src; *(dest+1) = *dest = *src;
@ -169,7 +169,7 @@ void Display_brush_color_wide(word x_pos,word y_pos,word x_offset,word y_offset,
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -181,8 +181,8 @@ void Display_brush_mono_wide(word x_pos, word y_pos,
byte transp_color, byte color, word brush_width) byte transp_color, byte color, word brush_width)
/* On affiche la brosse en monochrome */ /* On affiche la brosse en monochrome */
{ {
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
// l'écran // l'écran
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
// la brosse // la brosse
int x,y; int x,y;
@ -201,7 +201,7 @@ void Display_brush_mono_wide(word x_pos, word y_pos,
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=brush_width-width; src+=brush_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
} }
@ -210,8 +210,8 @@ void Display_brush_mono_wide(word x_pos, word y_pos,
void Clear_brush_wide(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width) void Clear_brush_wide(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width)
{ {
byte* dest=Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest)
byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src) byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src)
int y; int y;
int x; int x;
(void)x_offset; // unused (void)x_offset; // unused
@ -231,17 +231,17 @@ void Clear_brush_wide(word x_pos,word y_pos,word x_offset,word y_offset,word wid
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width-width; src+=image_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
} }
Update_rect(x_pos,y_pos,width,height); Update_rect(x_pos,y_pos,width,height);
} }
// Affiche une brosse (arbitraire) à l'écran // Affiche une brosse (arbitraire) à l'écran
void Display_brush_wide(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_wide(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = brush + y_offset * brush_width + x_offset; byte* src = brush + y_offset * brush_width + x_offset;
@ -254,7 +254,7 @@ void Display_brush_wide(byte * brush, word x_pos,word y_pos,word x_offset,word y
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*(dest+1) = *dest = *src; *(dest+1) = *dest = *src;
@ -264,7 +264,7 @@ void Display_brush_wide(byte * brush, word x_pos,word y_pos,word x_offset,word y
src++; dest+=ZOOMX; src++; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -272,7 +272,7 @@ void Display_brush_wide(byte * brush, word x_pos,word y_pos,word x_offset,word y
void Remap_screen_wide(word x_pos,word y_pos,word width,word height,byte * conversion_table) void Remap_screen_wide(word x_pos,word y_pos,word width,word height,byte * conversion_table)
{ {
// dest = coords a l'écran // dest = coords a l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
int x,y; int x,y;
@ -294,7 +294,7 @@ void Remap_screen_wide(word x_pos,word y_pos,word width,word height,byte * conve
void Display_line_on_screen_fast_wide(word x_pos,word y_pos,word width,byte * line) void Display_line_on_screen_fast_wide(word x_pos,word y_pos,word width,byte * line)
/* On affiche toute une ligne de pixels telle quelle. */ /* On affiche toute une ligne de pixels telle quelle. */
/* Utilisée si le buffer contient déja des pixel doublés. */ /* Utilisée si le buffer contient déja des pixel doublés. */
{ {
memcpy(Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH,line,width*ZOOMX); memcpy(Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH,line,width*ZOOMX);
} }
@ -315,8 +315,8 @@ void Display_line_on_screen_wide(word x_pos,word y_pos,word width,byte * line)
void Display_transparent_mono_line_on_screen_wide( void Display_transparent_mono_line_on_screen_wide(
word x_pos, word y_pos, word width, byte* line, word x_pos, word y_pos, word width, byte* line,
byte transp_color, byte color) byte transp_color, byte color)
// Affiche une ligne à l'écran avec une couleur + transparence. // Affiche une ligne à l'écran avec une couleur + transparence.
// Utilisé par les brosses en mode zoom // Utilisé par les brosses en mode zoom
{ {
byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX; byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX;
int x; int x;
@ -338,31 +338,31 @@ void Read_line_screen_wide(word x_pos,word y_pos,word width,byte * line)
} }
void Display_part_of_screen_scaled_wide( void Display_part_of_screen_scaled_wide(
word width, // width non zoomée word width, // width non zoomée
word height, // height zoomée word height, // height zoomée
word image_width,byte * buffer) word image_width,byte * buffer)
{ {
byte* src = Main_screen + Main.magnifier_offset_Y * image_width byte* src = Main_screen + Main.magnifier_offset_Y * image_width
+ Main.magnifier_offset_X; + Main.magnifier_offset_X;
int y = 0; // Ligne en cours de traitement int y = 0; // Ligne en cours de traitement
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1) while(1)
{ {
int x; int x;
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width); Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);
// On l'affiche Facteur fois, sur des lignes consécutives // On l'affiche Facteur fois, sur des lignes consécutives
x = Main.magnifier_factor; x = Main.magnifier_factor;
// Pour chaque ligne // Pour chaque ligne
do{ do{
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_line_on_screen_fast_wide( Display_line_on_screen_fast_wide(
Main.X_zoom, y, width*Main.magnifier_factor, Main.X_zoom, y, width*Main.magnifier_factor,
buffer buffer
); );
// On passe à la suivante // On passe à la suivante
y++; y++;
if(y==height) if(y==height)
{ {
@ -397,12 +397,12 @@ void Display_transparent_line_on_screen_wide(word x_pos,word y_pos,word width,by
} }
} }
// Affiche une partie de la brosse couleur zoomée // Affiche une partie de la brosse couleur zoomée
void Display_brush_color_zoom_wide(word x_pos,word y_pos, void Display_brush_color_zoom_wide(word x_pos,word y_pos,
word x_offset,word y_offset, word x_offset,word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos,byte transp_color, word end_y_pos,byte transp_color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer) byte * buffer)
{ {
byte* src = Brush+y_offset*brush_width + x_offset; byte* src = Brush+y_offset*brush_width + x_offset;
@ -413,7 +413,7 @@ void Display_brush_color_zoom_wide(word x_pos,word y_pos,
while(1) while(1)
{ {
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche facteur fois la ligne zoomée // On affiche facteur fois la ligne zoomée
for(bx=Main.magnifier_factor;bx>0;bx--) for(bx=Main.magnifier_factor;bx>0;bx--)
{ {
Display_transparent_line_on_screen_wide(x_pos,y*ZOOMY,width*Main.magnifier_factor,buffer,transp_color); Display_transparent_line_on_screen_wide(x_pos,y*ZOOMY,width*Main.magnifier_factor,buffer,transp_color);
@ -430,10 +430,10 @@ void Display_brush_color_zoom_wide(word x_pos,word y_pos,
void Display_brush_mono_zoom_wide(word x_pos, word y_pos, void Display_brush_mono_zoom_wide(word x_pos, word y_pos,
word x_offset, word y_offset, word x_offset, word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos, word end_y_pos,
byte transp_color, byte color, byte transp_color, byte color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer byte * buffer
) )
@ -441,29 +441,29 @@ void Display_brush_mono_zoom_wide(word x_pos, word y_pos,
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
int y=y_pos*ZOOMY; int y=y_pos*ZOOMY;
//Pour chaque ligne à zoomer : //Pour chaque ligne à zoomer :
while(1) while(1)
{ {
int bx; int bx;
// src = Ligne originale // src = Ligne originale
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche la ligne Facteur fois à l'écran (sur des // On affiche la ligne Facteur fois à l'écran (sur des
// lignes consécutives) // lignes consécutives)
bx = Main.magnifier_factor*ZOOMY; bx = Main.magnifier_factor*ZOOMY;
// Pour chaque ligne écran // Pour chaque ligne écran
do do
{ {
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_transparent_mono_line_on_screen_wide( Display_transparent_mono_line_on_screen_wide(
x_pos, y, width * Main.magnifier_factor, x_pos, y, width * Main.magnifier_factor,
buffer, transp_color, color buffer, transp_color, color
); );
// On passe à la ligne suivante // On passe à la ligne suivante
y++; y++;
// On vérifie qu'on est pas à la ligne finale // On vérifie qu'on est pas à la ligne finale
if(y == end_y_pos*ZOOMY) if(y == end_y_pos*ZOOMY)
{ {
Redraw_grid( x_pos, y_pos, Redraw_grid( x_pos, y_pos,
@ -476,20 +476,20 @@ void Display_brush_mono_zoom_wide(word x_pos, word y_pos,
} }
while (bx > 0); while (bx > 0);
// Passage à la ligne suivante dans la brosse aussi // Passage à la ligne suivante dans la brosse aussi
src+=brush_width; src+=brush_width;
} }
} }
void Clear_brush_scaled_wide(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer) void Clear_brush_scaled_wide(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer)
{ {
// En fait on va recopier l'image non zoomée dans la partie zoomée ! // En fait on va recopier l'image non zoomée dans la partie zoomée !
byte* src = Main_screen + y_offset * image_width + x_offset; byte* src = Main_screen + y_offset * image_width + x_offset;
int y = y_pos; int y = y_pos;
int bx; int bx;
(void)transp_color; // unused (void)transp_color; // unused
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1){ while(1){
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width); Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);

View File

@ -35,7 +35,7 @@
void Pixel_wide2 (word x,word y,byte color) void Pixel_wide2 (word x,word y,byte color)
/* Affiche un pixel de la color aux coords x;y à l'écran */ /* Affiche un pixel de la color aux coords x;y à l'écran */
{ {
*(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH)=color; *(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH)=color;
*(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH + 1)=color; *(Screen_pixels + x * ZOOMX + y*ZOOMY * VIDEO_LINE_WIDTH + 1)=color;
@ -48,13 +48,13 @@ void Pixel_wide2 (word x,word y,byte color)
} }
byte Read_pixel_wide2 (word x,word y) byte Read_pixel_wide2 (word x,word y)
/* On retourne la couleur du pixel aux coords données */ /* On retourne la couleur du pixel aux coords données */
{ {
return *( Screen_pixels + y * ZOOMY * VIDEO_LINE_WIDTH + x * ZOOMX); return *( Screen_pixels + y * ZOOMY * VIDEO_LINE_WIDTH + x * ZOOMX);
} }
void Block_wide2 (word start_x,word start_y,word width,word height,byte color) void Block_wide2 (word start_x,word start_y,word width,word height,byte color)
/* On affiche un rectangle de la couleur donnée */ /* On affiche un rectangle de la couleur donnée */
{ {
SDL_Rect rectangle; SDL_Rect rectangle;
rectangle.x=start_x*ZOOMX; rectangle.x=start_x*ZOOMX;
@ -65,10 +65,10 @@ void Block_wide2 (word start_x,word start_y,word width,word height,byte color)
} }
void Display_part_of_screen_wide2 (word width,word height,word image_width) void Display_part_of_screen_wide2 (word width,word height,word image_width)
/* Afficher une partie de l'image telle quelle sur l'écran */ /* Afficher une partie de l'image telle quelle sur l'écran */
{ {
byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels; //On va se mettre en 0,0 dans l'écran (dest)
byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src) byte* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
int y; int y;
int dy; int dy;
@ -85,7 +85,7 @@ void Display_part_of_screen_wide2 (word width,word height,word image_width)
// On double la ligne qu'on vient de copier // On double la ligne qu'on vient de copier
memcpy(dest-width*ZOOMX+VIDEO_LINE_WIDTH,dest-width*ZOOMX,width*ZOOMX); memcpy(dest-width*ZOOMX+VIDEO_LINE_WIDTH,dest-width*ZOOMX,width*ZOOMX);
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width-width; src+=image_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
} }
@ -93,10 +93,10 @@ void Display_part_of_screen_wide2 (word width,word height,word image_width)
} }
void Pixel_preview_normal_wide2 (word x,word y,byte color) void Pixel_preview_normal_wide2 (word x,word y,byte color)
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image /* 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) * dans l'écran, en mode normal (pas en mode loupe)
* Note: si on modifie cette procédure, il faudra penser à faire également * Note: si on modifie cette procédure, il faudra penser à faire également
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */ * la modif dans la procédure Pixel_Preview_Loupe_SDL. */
{ {
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0) // if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
Pixel_wide2(x-Main.offset_X,y-Main.offset_Y,color); Pixel_wide2(x-Main.offset_X,y-Main.offset_Y,color);
@ -104,10 +104,10 @@ void Pixel_preview_normal_wide2 (word x,word y,byte color)
void Pixel_preview_magnifier_wide2 (word x,word y,byte color) void Pixel_preview_magnifier_wide2 (word x,word y,byte color)
{ {
// Affiche le pixel dans la partie non zoomée // Affiche le pixel dans la partie non zoomée
Pixel_wide2(x-Main.offset_X,y-Main.offset_Y,color); Pixel_wide2(x-Main.offset_X,y-Main.offset_Y,color);
// Regarde si on doit aussi l'afficher dans la partie zoomée // Regarde si on doit aussi l'afficher dans la partie zoomée
if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom if (y >= Limit_top_zoom && y <= Limit_visible_bottom_zoom
&& x >= Limit_left_zoom && x <= Limit_visible_right_zoom) && x >= Limit_left_zoom && x <= Limit_visible_right_zoom)
{ {
@ -117,7 +117,7 @@ void Pixel_preview_magnifier_wide2 (word x,word y,byte color)
if (Menu_Y - y_zoom < Main.magnifier_factor) if (Menu_Y - y_zoom < Main.magnifier_factor)
// On ne doit dessiner qu'un morceau du pixel // On ne doit dessiner qu'un morceau du pixel
// sinon on dépasse sur le menu // sinon on dépasse sur le menu
height = Menu_Y - y_zoom; height = Menu_Y - y_zoom;
else else
height = Main.magnifier_factor; height = Main.magnifier_factor;
@ -153,7 +153,7 @@ void Vertical_XOR_line_wide2(word x_pos,word y_pos,word height)
void Display_brush_color_wide2(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_color_wide2(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
@ -166,7 +166,7 @@ void Display_brush_color_wide2(word x_pos,word y_pos,word x_offset,word y_offset
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*(dest+VIDEO_LINE_WIDTH+3) = *(dest+VIDEO_LINE_WIDTH+2) = *(dest+VIDEO_LINE_WIDTH+1) = *(dest+VIDEO_LINE_WIDTH) = *(dest+3) = *(dest+2) = *(dest+1) = *dest = *src; *(dest+VIDEO_LINE_WIDTH+3) = *(dest+VIDEO_LINE_WIDTH+2) = *(dest+VIDEO_LINE_WIDTH+1) = *(dest+VIDEO_LINE_WIDTH) = *(dest+3) = *(dest+2) = *(dest+1) = *dest = *src;
@ -177,7 +177,7 @@ void Display_brush_color_wide2(word x_pos,word y_pos,word x_offset,word y_offset
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -189,8 +189,8 @@ void Display_brush_mono_wide2(word x_pos, word y_pos,
byte transp_color, byte color, word brush_width) byte transp_color, byte color, word brush_width)
/* On affiche la brosse en monochrome */ /* On affiche la brosse en monochrome */
{ {
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
// l'écran // l'écran
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
// la brosse // la brosse
int x,y; int x,y;
@ -209,7 +209,7 @@ void Display_brush_mono_wide2(word x_pos, word y_pos,
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=brush_width-width; src+=brush_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
} }
@ -218,8 +218,8 @@ void Display_brush_mono_wide2(word x_pos, word y_pos,
void Clear_brush_wide2(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width) void Clear_brush_wide2(word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word image_width)
{ {
byte* dest=Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest) byte* dest=Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH; //On va se mettre en 0,0 dans l'écran (dest)
byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src) byte* src = ( y_pos + Main.offset_Y ) * image_width + x_pos + Main.offset_X + Main_screen; //Coords de départ ds la source (src)
int y; int y;
int x; int x;
(void)x_offset; // unused (void)x_offset; // unused
@ -239,17 +239,17 @@ void Clear_brush_wide2(word x_pos,word y_pos,word x_offset,word y_offset,word wi
dest+=ZOOMX; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
src+=image_width-width; src+=image_width-width;
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX; dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
} }
Update_rect(x_pos,y_pos,width,height); Update_rect(x_pos,y_pos,width,height);
} }
// Affiche une brosse (arbitraire) à l'écran // Affiche une brosse (arbitraire) à l'écran
void Display_brush_wide2(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width) void Display_brush_wide2(byte * brush, word x_pos,word y_pos,word x_offset,word y_offset,word width,word height,byte transp_color,word brush_width)
{ {
// dest = Position à l'écran // dest = Position à l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
// src = Position dans la brosse // src = Position dans la brosse
byte* src = brush + y_offset * brush_width + x_offset; byte* src = brush + y_offset * brush_width + x_offset;
@ -262,7 +262,7 @@ void Display_brush_wide2(byte * brush, word x_pos,word y_pos,word x_offset,word
// Pour chaque pixel // Pour chaque pixel
for(x = width;x > 0; x--) for(x = width;x > 0; x--)
{ {
// On vérifie que ce n'est pas la transparence // On vérifie que ce n'est pas la transparence
if(*src != transp_color) if(*src != transp_color)
{ {
*(dest+VIDEO_LINE_WIDTH+3)=*(dest+VIDEO_LINE_WIDTH+2)=*(dest+VIDEO_LINE_WIDTH+1)=*(dest+VIDEO_LINE_WIDTH)=*(dest+3)=*(dest+2)=*(dest+1)=*dest=*src; *(dest+VIDEO_LINE_WIDTH+3)=*(dest+VIDEO_LINE_WIDTH+2)=*(dest+VIDEO_LINE_WIDTH+1)=*(dest+VIDEO_LINE_WIDTH)=*(dest+3)=*(dest+2)=*(dest+1)=*dest=*src;
@ -272,7 +272,7 @@ void Display_brush_wide2(byte * brush, word x_pos,word y_pos,word x_offset,word
src++; dest+=ZOOMX; src++; dest+=ZOOMX;
} }
// On passe à la ligne suivante // On passe à la ligne suivante
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX; dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
src = src + brush_width - width; src = src + brush_width - width;
} }
@ -280,7 +280,7 @@ void Display_brush_wide2(byte * brush, word x_pos,word y_pos,word x_offset,word
void Remap_screen_wide2(word x_pos,word y_pos,word width,word height,byte * conversion_table) void Remap_screen_wide2(word x_pos,word y_pos,word width,word height,byte * conversion_table)
{ {
// dest = coords a l'écran // dest = coords a l'écran
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX; byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
int x,y; int x,y;
@ -303,7 +303,7 @@ void Remap_screen_wide2(word x_pos,word y_pos,word width,word height,byte * conv
void Display_line_on_screen_fast_wide2(word x_pos,word y_pos,word width,byte * line) void Display_line_on_screen_fast_wide2(word x_pos,word y_pos,word width,byte * line)
/* On affiche toute une ligne de pixels telle quelle. */ /* On affiche toute une ligne de pixels telle quelle. */
/* Utilisée si le buffer contient déja des pixel doublés. */ /* Utilisée si le buffer contient déja des pixel doublés. */
{ {
memcpy(Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH,line,width*ZOOMX); memcpy(Screen_pixels+x_pos*ZOOMX+y_pos*ZOOMY*VIDEO_LINE_WIDTH,line,width*ZOOMX);
memcpy(Screen_pixels+x_pos*ZOOMX+(y_pos*ZOOMY+1)*VIDEO_LINE_WIDTH,line,width*ZOOMX); memcpy(Screen_pixels+x_pos*ZOOMX+(y_pos*ZOOMY+1)*VIDEO_LINE_WIDTH,line,width*ZOOMX);
@ -325,8 +325,8 @@ void Display_line_on_screen_wide2(word x_pos,word y_pos,word width,byte * line)
void Display_transparent_mono_line_on_screen_wide2( void Display_transparent_mono_line_on_screen_wide2(
word x_pos, word y_pos, word width, byte* line, word x_pos, word y_pos, word width, byte* line,
byte transp_color, byte color) byte transp_color, byte color)
// Affiche une ligne à l'écran avec une couleur + transparence. // Affiche une ligne à l'écran avec une couleur + transparence.
// Utilisé par les brosses en mode zoom // Utilisé par les brosses en mode zoom
{ {
byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX; byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX;
int x; int x;
@ -348,31 +348,31 @@ void Read_line_screen_wide2(word x_pos,word y_pos,word width,byte * line)
} }
void Display_part_of_screen_scaled_wide2( void Display_part_of_screen_scaled_wide2(
word width, // width non zoomée word width, // width non zoomée
word height, // height zoomée word height, // height zoomée
word image_width,byte * buffer) word image_width,byte * buffer)
{ {
byte* src = Main_screen + Main.magnifier_offset_Y * image_width byte* src = Main_screen + Main.magnifier_offset_Y * image_width
+ Main.magnifier_offset_X; + Main.magnifier_offset_X;
int y = 0; // Ligne en cours de traitement int y = 0; // Ligne en cours de traitement
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1) while(1)
{ {
int x; int x;
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width); Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);
// On l'affiche Facteur fois, sur des lignes consécutives // On l'affiche Facteur fois, sur des lignes consécutives
x = Main.magnifier_factor/**ZOOMY*/; x = Main.magnifier_factor/**ZOOMY*/;
// Pour chaque ligne // Pour chaque ligne
do{ do{
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_line_on_screen_fast_wide2( Display_line_on_screen_fast_wide2(
Main.X_zoom, y, width*Main.magnifier_factor, Main.X_zoom, y, width*Main.magnifier_factor,
buffer buffer
); );
// On passe à la suivante // On passe à la suivante
y++; y++;
if(y==height/**ZOOMY*/) if(y==height/**ZOOMY*/)
{ {
@ -389,12 +389,12 @@ void Display_part_of_screen_scaled_wide2(
// ATTENTION on n'arrive jamais ici ! // ATTENTION on n'arrive jamais ici !
} }
// Affiche une partie de la brosse couleur zoomée // Affiche une partie de la brosse couleur zoomée
void Display_brush_color_zoom_wide2(word x_pos,word y_pos, void Display_brush_color_zoom_wide2(word x_pos,word y_pos,
word x_offset,word y_offset, word x_offset,word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos,byte transp_color, word end_y_pos,byte transp_color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer) byte * buffer)
{ {
byte* src = Brush+y_offset*brush_width + x_offset; byte* src = Brush+y_offset*brush_width + x_offset;
@ -405,7 +405,7 @@ void Display_brush_color_zoom_wide2(word x_pos,word y_pos,
while(1) while(1)
{ {
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche facteur fois la ligne zoomée // On affiche facteur fois la ligne zoomée
for(bx=Main.magnifier_factor;bx>0;bx--) for(bx=Main.magnifier_factor;bx>0;bx--)
{ {
byte* line_src = buffer; byte* line_src = buffer;
@ -436,10 +436,10 @@ void Display_brush_color_zoom_wide2(word x_pos,word y_pos,
void Display_brush_mono_zoom_wide2(word x_pos, word y_pos, void Display_brush_mono_zoom_wide2(word x_pos, word y_pos,
word x_offset, word y_offset, word x_offset, word y_offset,
word width, // width non zoomée word width, // width non zoomée
word end_y_pos, word end_y_pos,
byte transp_color, byte color, byte transp_color, byte color,
word brush_width, // width réelle de la brosse word brush_width, // width réelle de la brosse
byte * buffer byte * buffer
) )
@ -447,29 +447,29 @@ void Display_brush_mono_zoom_wide2(word x_pos, word y_pos,
byte* src = Brush + y_offset * brush_width + x_offset; byte* src = Brush + y_offset * brush_width + x_offset;
int y=y_pos*ZOOMY; int y=y_pos*ZOOMY;
//Pour chaque ligne à zoomer : //Pour chaque ligne à zoomer :
while(1) while(1)
{ {
int bx; int bx;
// src = Ligne originale // src = Ligne originale
// On éclate la ligne // On éclate la ligne
Zoom_a_line(src,buffer,Main.magnifier_factor,width); Zoom_a_line(src,buffer,Main.magnifier_factor,width);
// On affiche la ligne Facteur fois à l'écran (sur des // On affiche la ligne Facteur fois à l'écran (sur des
// lignes consécutives) // lignes consécutives)
bx = Main.magnifier_factor*ZOOMY; bx = Main.magnifier_factor*ZOOMY;
// Pour chaque ligne écran // Pour chaque ligne écran
do do
{ {
// On affiche la ligne zoomée // On affiche la ligne zoomée
Display_transparent_mono_line_on_screen_wide2( Display_transparent_mono_line_on_screen_wide2(
x_pos, y, width * Main.magnifier_factor, x_pos, y, width * Main.magnifier_factor,
buffer, transp_color, color buffer, transp_color, color
); );
// On passe à la ligne suivante // On passe à la ligne suivante
y++; y++;
// On vérifie qu'on est pas à la ligne finale // On vérifie qu'on est pas à la ligne finale
if(y == end_y_pos*ZOOMY) if(y == end_y_pos*ZOOMY)
{ {
Redraw_grid( x_pos, y_pos, Redraw_grid( x_pos, y_pos,
@ -482,7 +482,7 @@ void Display_brush_mono_zoom_wide2(word x_pos, word y_pos,
} }
while (bx > 0); while (bx > 0);
// Passage à la ligne suivante dans la brosse aussi // Passage à la ligne suivante dans la brosse aussi
src+=brush_width; src+=brush_width;
} }
} }
@ -490,13 +490,13 @@ void Display_brush_mono_zoom_wide2(word x_pos, word y_pos,
void Clear_brush_scaled_wide2(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer) void Clear_brush_scaled_wide2(word x_pos,word y_pos,word x_offset,word y_offset,word width,word end_y_pos,byte transp_color,word image_width,byte * buffer)
{ {
// En fait on va recopier l'image non zoomée dans la partie zoomée ! // En fait on va recopier l'image non zoomée dans la partie zoomée !
byte* src = Main_screen + y_offset * image_width + x_offset; byte* src = Main_screen + y_offset * image_width + x_offset;
int y = y_pos; int y = y_pos;
int bx; int bx;
(void)transp_color; // unused (void)transp_color; // unused
// Pour chaque ligne à zoomer // Pour chaque ligne à zoomer
while(1){ while(1){
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width); Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);

View File

@ -2,7 +2,7 @@
*/ */
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2008 Peter Gordon Copyright 2008 Peter Gordon
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
Copyright 2007 Adrien Destugues Copyright 2007 Adrien Destugues
@ -55,7 +55,7 @@ void Load_INI_clear_string(char * str, byte keep_comments)
{ {
equal_found=1; equal_found=1;
index++; index++;
// On enleve les espaces après le '=' // On enleve les espaces après le '='
while (str[index]==' ' || str[index]=='\t') while (str[index]==' ' || str[index]=='\t')
memmove(str+index,str+index+1,strlen(str+index)); memmove(str+index,str+index+1,strlen(str+index));
} }
@ -78,7 +78,7 @@ void Load_INI_clear_string(char * str, byte keep_comments)
{ {
if (!equal_found) if (!equal_found)
{ {
// Passage en majuscule d'un caractère: // Passage en majuscule d'un caractère:
#ifndef GCWZERO //this causes gcw to crash #ifndef GCWZERO //this causes gcw to crash
str[index]=toupper((int)str[index]); str[index]=toupper((int)str[index]);
#endif #endif
@ -86,7 +86,7 @@ void Load_INI_clear_string(char * str, byte keep_comments)
index++; index++;
} }
} }
// On enlève les espaces avant la fin de chaine // On enlève les espaces avant la fin de chaine
while (index>0 && (str[index-1]==' ' || str[index-1]=='\t')) while (index>0 && (str[index-1]==' ' || str[index-1]=='\t'))
{ {
index--; index--;
@ -101,22 +101,22 @@ int Load_INI_seek_pattern(char * buffer,char * pattern)
int buffer_index; int buffer_index;
int pattern_index; int pattern_index;
// A partir de chaque lettre de la chaîne buffer // A partir de chaque lettre de la chaîne buffer
for (buffer_index=0;buffer[buffer_index]!='\0';buffer_index++) for (buffer_index=0;buffer[buffer_index]!='\0';buffer_index++)
{ {
// On regarde si la chaîne pattern est équivalente à la position courante // On regarde si la chaîne pattern est équivalente à la position courante
// de la chaîne buffer: // de la chaîne buffer:
for (pattern_index=0;(pattern[pattern_index]!='\0') && (buffer[buffer_index+pattern_index]==pattern[pattern_index]);pattern_index++); for (pattern_index=0;(pattern[pattern_index]!='\0') && (buffer[buffer_index+pattern_index]==pattern[pattern_index]);pattern_index++);
// Si on a trouvé la chaîne pattern dans la chaîne buffer, on renvoie la // Si on a trouvé la chaîne pattern dans la chaîne buffer, on renvoie la
// position à laquelle on l'a trouvée (+1 pour que si on la trouve au // position à laquelle on l'a trouvée (+1 pour que si on la trouve au
// début ça ne renvoie pas la même chose que si on ne l'avait pas // début ça ne renvoie pas la même chose que si on ne l'avait pas
// trouvée): // trouvée):
if (pattern[pattern_index]=='\0') if (pattern[pattern_index]=='\0')
return (buffer_index+1); return (buffer_index+1);
} }
// Si on ne l'a pas trouvée, on renvoie 0: // Si on ne l'a pas trouvée, on renvoie 0:
return 0; return 0;
} }
@ -128,11 +128,11 @@ int Load_INI_reach_group(FILE * file,char * buffer,char * group)
char * group_upper; char * group_upper;
char * upper_buffer; char * upper_buffer;
// On alloue les zones de mémoire: // On alloue les zones de mémoire:
group_upper=(char *)malloc(1024); group_upper=(char *)malloc(1024);
upper_buffer=(char *)malloc(1024); upper_buffer=(char *)malloc(1024);
// On commence par se faire une version majuscule du groupe à rechercher: // On commence par se faire une version majuscule du groupe à rechercher:
strcpy(group_upper,group); strcpy(group_upper,group);
Load_INI_clear_string(group_upper, 0); Load_INI_clear_string(group_upper, 0);
@ -153,7 +153,7 @@ int Load_INI_reach_group(FILE * file,char * buffer,char * group)
strcpy(upper_buffer,buffer); strcpy(upper_buffer,buffer);
Load_INI_clear_string(upper_buffer, 0); Load_INI_clear_string(upper_buffer, 0);
// On compare la chaîne avec le groupe recherché: // On compare la chaîne avec le groupe recherché:
stop_seek=Load_INI_seek_pattern(upper_buffer,group_upper); stop_seek=Load_INI_seek_pattern(upper_buffer,group_upper);
} }
while (!stop_seek); while (!stop_seek);
@ -178,11 +178,11 @@ int Load_INI_get_string(FILE * file,char * buffer,char * option_name,char * retu
char * upper_buffer; char * upper_buffer;
int buffer_index; int buffer_index;
// On alloue les zones de mémoire: // On alloue les zones de mémoire:
option_upper=(char *)malloc(1024); option_upper=(char *)malloc(1024);
upper_buffer=(char *)malloc(1024); upper_buffer=(char *)malloc(1024);
// On commence par se faire une version majuscule de l'option à rechercher: // On commence par se faire une version majuscule de l'option à rechercher:
strcpy(option_upper,option_name); strcpy(option_upper,option_name);
Load_INI_clear_string(option_upper, 0); Load_INI_clear_string(option_upper, 0);
@ -203,13 +203,13 @@ int Load_INI_get_string(FILE * file,char * buffer,char * option_name,char * retu
strcpy(upper_buffer,buffer); strcpy(upper_buffer,buffer);
Load_INI_clear_string(upper_buffer, raw_text); Load_INI_clear_string(upper_buffer, raw_text);
// On compare la chaîne avec l'option recherchée: // On compare la chaîne avec l'option recherchée:
stop_seek=Load_INI_seek_pattern(upper_buffer,option_upper); stop_seek=Load_INI_seek_pattern(upper_buffer,option_upper);
// Si on l'a trouvée: // Si on l'a trouvée:
if (stop_seek) if (stop_seek)
{ {
// On se positionne juste après la chaîne "=" // On se positionne juste après la chaîne "="
buffer_index=Load_INI_seek_pattern(upper_buffer,"="); buffer_index=Load_INI_seek_pattern(upper_buffer,"=");
strcpy(return_code, upper_buffer + buffer_index); strcpy(return_code, upper_buffer + buffer_index);
@ -358,11 +358,11 @@ int Load_INI_get_values(FILE * file,char * buffer,char * option_name,int nb_expe
int buffer_index; int buffer_index;
int nb_values; int nb_values;
// On alloue les zones de mémoire: // On alloue les zones de mémoire:
option_upper=(char *)malloc(1024); option_upper=(char *)malloc(1024);
upper_buffer=(char *)malloc(1024); upper_buffer=(char *)malloc(1024);
// On commence par se faire une version majuscule de l'option à rechercher: // On commence par se faire une version majuscule de l'option à rechercher:
strcpy(option_upper,option_name); strcpy(option_upper,option_name);
Load_INI_clear_string(option_upper, 0); Load_INI_clear_string(option_upper, 0);
@ -383,15 +383,15 @@ int Load_INI_get_values(FILE * file,char * buffer,char * option_name,int nb_expe
strcpy(upper_buffer,buffer); strcpy(upper_buffer,buffer);
Load_INI_clear_string(upper_buffer, 0); Load_INI_clear_string(upper_buffer, 0);
// On compare la chaîne avec l'option recherchée: // On compare la chaîne avec l'option recherchée:
stop_seek=Load_INI_seek_pattern(upper_buffer,option_upper); stop_seek=Load_INI_seek_pattern(upper_buffer,option_upper);
// Si on l'a trouvée: // Si on l'a trouvée:
if (stop_seek) if (stop_seek)
{ {
nb_values=0; nb_values=0;
// On se positionne juste après la chaîne "=" // On se positionne juste après la chaîne "="
buffer_index=Load_INI_seek_pattern(upper_buffer,"="); buffer_index=Load_INI_seek_pattern(upper_buffer,"=");
// Tant qu'on a pas atteint la fin de la ligne // Tant qu'on a pas atteint la fin de la ligne
@ -451,7 +451,7 @@ int Load_INI(T_Config * conf)
#endif #endif
// On alloue les zones de mémoire: // On alloue les zones de mémoire:
buffer=(char *)malloc(1024); buffer=(char *)malloc(1024);
filename=(char *)malloc(256); filename=(char *)malloc(256);
@ -722,7 +722,7 @@ int Load_INI(T_Config * conf)
goto Erreur_ERREUR_INI_CORROMPU; goto Erreur_ERREUR_INI_CORROMPU;
conf->Auto_nb_used=values[0]; conf->Auto_nb_used=values[0];
// Optionnel, le mode video par défaut (à partir de beta 97.0%) // Optionnel, le mode video par défaut (à partir de beta 97.0%)
conf->Default_resolution=0; conf->Default_resolution=0;
if (!Load_INI_get_string (file,buffer,"Default_video_mode",value_label, 0)) if (!Load_INI_get_string (file,buffer,"Default_video_mode",value_label, 0))
{ {
@ -731,7 +731,7 @@ int Load_INI(T_Config * conf)
conf->Default_resolution=mode; conf->Default_resolution=mode;
} }
// Optionnel, les dimensions de la fenêtre (à partir de beta 97.0%) // Optionnel, les dimensions de la fenêtre (à partir de beta 97.0%)
// Do that only if the first mode is actually windowed (not the case on gp2x for example) // Do that only if the first mode is actually windowed (not the case on gp2x for example)
if(Video_mode[0].Fullscreen==0) if(Video_mode[0].Fullscreen==0)
{ {
@ -747,7 +747,7 @@ int Load_INI(T_Config * conf)
} }
conf->Mouse_merge_movement=100; conf->Mouse_merge_movement=100;
// Optionnel, paramètre pour grouper les mouvements souris (>98.0%) // Optionnel, paramètre pour grouper les mouvements souris (>98.0%)
if (!Load_INI_get_values (file,buffer,"Merge_movement",1,values)) if (!Load_INI_get_values (file,buffer,"Merge_movement",1,values))
{ {
if ((values[0]<0) || (values[0]>1000)) if ((values[0]<0) || (values[0]>1000))

View File

@ -23,7 +23,7 @@
*/ */
/************************************************************************ /************************************************************************
* * * *
* READLINE (procédure permettant de saisir une chaîne de caractères) * * READLINE (procédure permettant de saisir une chaîne de caractères) *
* * * *
************************************************************************/ ************************************************************************/
@ -100,11 +100,11 @@ static void Insert_character(char * str, char letter, int position)
for (;letter!='\0';position++) for (;letter!='\0';position++)
{ {
// On mémorise le caractère qui se trouve en "position" // On mémorise le caractère qui se trouve en "position"
temp_char=str[position]; temp_char=str[position];
// On splotch la lettre à insérer // On splotch la lettre à insérer
str[position]=letter; str[position]=letter;
// On place le caractère mémorisé dans "letter" comme nouvelle lettre à insérer // On place le caractère mémorisé dans "letter" comme nouvelle lettre à insérer
letter=temp_char; letter=temp_char;
} }
// On termine la chaine // On termine la chaine
@ -185,11 +185,11 @@ static int Valid_character(word c, int input_type)
break; break;
case INPUT_TYPE_FILENAME: case INPUT_TYPE_FILENAME:
{ {
// On regarde si la touche est autorisée // On regarde si la touche est autorisée
// Sous Linux: Seul le / est strictement interdit, mais beaucoup // Sous Linux: Seul le / est strictement interdit, mais beaucoup
// d'autres poseront des problèmes au shell, alors on évite. // d'autres poseront des problèmes au shell, alors on évite.
// Sous Windows : c'est moins grave car le fopen() échouerait de toutes façons. // Sous Windows : c'est moins grave car le fopen() échouerait de toutes façons.
// AmigaOS4: Pas de ':' car utilisé pour les volumes. // AmigaOS4: Pas de ':' car utilisé pour les volumes.
#if defined(__WIN32__) #if defined(__WIN32__)
char forbidden_char[] = {'/', '|', '?', '*', '<', '>', ':', '\\'}; char forbidden_char[] = {'/', '|', '?', '*', '<', '>', ':', '\\'};
#elif defined (__amigaos4__) || defined(__AROS__) #elif defined (__amigaos4__) || defined(__AROS__)
@ -418,17 +418,17 @@ bye:
* Enhanced super scanf deluxe pro plus giga mieux :-) * * Enhanced super scanf deluxe pro plus giga mieux :-) *
****************************************************************************/ ****************************************************************************/
byte Readline(word x_pos,word y_pos,char * str,byte visible_size,byte input_type) byte Readline(word x_pos,word y_pos,char * str,byte visible_size,byte input_type)
// Paramètres: // Paramètres:
// x_pos, y_pos : Coordonnées de la saisie dans la fenêtre // x_pos, y_pos : Coordonnées de la saisie dans la fenêtre
// str : Chaîne recevant la saisie (et contenant éventuellement une valeur initiale) // str : Chaîne recevant la saisie (et contenant éventuellement une valeur initiale)
// max_size : Nombre de caractères logeant dans la zone de saisie // max_size : Nombre de caractères logeant dans la zone de saisie
// input_type : 0=Chaîne, 1=Nombre, 2=Nom de fichier // input_type : 0=Chaîne, 1=Nombre, 2=Nom de fichier
// Sortie: // Sortie:
// 0: Sortie par annulation (Esc.) / 1: sortie par acceptation (Return) // 0: Sortie par annulation (Esc.) / 1: sortie par acceptation (Return)
{ {
byte max_size; byte max_size;
// Grosse astuce pour les noms de fichiers: La taille affichée est différente // Grosse astuce pour les noms de fichiers: La taille affichée est différente
// de la taille maximum gérée. // de la taille maximum gérée.
if (input_type == INPUT_TYPE_FILENAME) if (input_type == INPUT_TYPE_FILENAME)
max_size = 255; max_size = 255;
else else
@ -445,10 +445,10 @@ byte Readline_ex(word x_pos,word y_pos,char * str,byte visible_size,byte max_siz
} }
byte Readline_ex_unicode(word x_pos,word y_pos,char * str,word * str_unicode,byte visible_size,byte max_size, byte input_type, byte decimal_places) byte Readline_ex_unicode(word x_pos,word y_pos,char * str,word * str_unicode,byte visible_size,byte max_size, byte input_type, byte decimal_places)
// Paramètres: // Paramètres:
// x_pos, y_pos : Coordonnées de la saisie dans la fenêtre // x_pos, y_pos : Coordonnées de la saisie dans la fenêtre
// str : Chaîne recevant la saisie (et contenant éventuellement une valeur initiale) // str : Chaîne recevant la saisie (et contenant éventuellement une valeur initiale)
// max_size : Nombre de caractères logeant dans la zone de saisie // max_size : Nombre de caractères logeant dans la zone de saisie
// input_type : 0=String, 1=Unsigned int, 2=Filename 3=Signed Double // input_type : 0=String, 1=Unsigned int, 2=Filename 3=Signed Double
// decimal_places: Number of decimal places for a double // decimal_places: Number of decimal places for a double
// Sortie: // Sortie:
@ -463,7 +463,7 @@ byte Readline_ex_unicode(word x_pos,word y_pos,char * str,word * str_unicode,byt
word input_key=0; word input_key=0;
word window_x=Window_pos_X; word window_x=Window_pos_X;
word window_y=Window_pos_Y; word window_y=Window_pos_Y;
byte offset=0; // index du premier caractère affiché byte offset=0; // index du premier caractère affiché
// Virtual keyboard // Virtual keyboard
byte use_virtual_keyboard=0; byte use_virtual_keyboard=0;
@ -482,11 +482,11 @@ byte Readline_ex_unicode(word x_pos,word y_pos,char * str,word * str_unicode,byt
'!','?','^','&','#','$' '!','?','^','&','#','$'
}; };
// Si on a commencé à editer par un clic-droit, on vide la chaine. // Si on a commencé à editer par un clic-droit, on vide la chaine.
if (Mouse_K==RIGHT_SIDE) if (Mouse_K==RIGHT_SIDE)
str[0]='\0'; str[0]='\0';
else if (input_type==INPUT_TYPE_INTEGER && str[0]!='\0') else if (input_type==INPUT_TYPE_INTEGER && str[0]!='\0')
snprintf(str,10,"%d",atoi(str)); // On tasse la chaine à gauche snprintf(str,10,"%d",atoi(str)); // On tasse la chaine à gauche
else if (input_type==INPUT_TYPE_DECIMAL) else if (input_type==INPUT_TYPE_DECIMAL)
{ {
// Nothing. The caller should have used Sprint_double, with min_positions // Nothing. The caller should have used Sprint_double, with min_positions
@ -615,11 +615,11 @@ byte Readline_ex_unicode(word x_pos,word y_pos,char * str,word * str_unicode,byt
#endif #endif
Hide_cursor(); Hide_cursor();
// Effacement de la chaîne // Effacement de la chaîne
Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR); Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR);
Update_window_area(x_pos,y_pos,visible_size<<3,8); Update_window_area(x_pos,y_pos,visible_size<<3,8);
// Mise à jour des variables se rapportant à la chaîne en fonction de la chaîne initiale // Mise à jour des variables se rapportant à la chaîne en fonction de la chaîne initiale
strcpy(initial_string,str); strcpy(initial_string,str);
if (str_unicode != NULL) if (str_unicode != NULL)
{ {
@ -784,7 +784,7 @@ byte Readline_ex_unicode(word x_pos,word y_pos,char * str,word * str_unicode,byt
Remove_character(str,position); Remove_character(str,position);
size--; size--;
// Effacement de la chaîne // Effacement de la chaîne
Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR); Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR);
goto affichage; goto affichage;
} }
@ -792,7 +792,7 @@ byte Readline_ex_unicode(word x_pos,word y_pos,char * str,word * str_unicode,byt
case SDLK_LEFT : // Gauche case SDLK_LEFT : // Gauche
if (position>0) if (position>0)
{ {
// Effacement de la chaîne // Effacement de la chaîne
if (position==size) if (position==size)
Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR); Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR);
position--; position--;
@ -823,7 +823,7 @@ byte Readline_ex_unicode(word x_pos,word y_pos,char * str,word * str_unicode,byt
case SDLK_HOME : // Home case SDLK_HOME : // Home
if (position) if (position)
{ {
// Effacement de la chaîne // Effacement de la chaîne
if (position==size) if (position==size)
Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR); Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR);
position = 0; position = 0;
@ -852,7 +852,7 @@ byte Readline_ex_unicode(word x_pos,word y_pos,char * str,word * str_unicode,byt
else else
Remove_character(str,position); Remove_character(str,position);
size--; size--;
// Effacement de la chaîne // Effacement de la chaîne
Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR); Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR);
goto affichage; goto affichage;
} }
@ -862,7 +862,7 @@ byte Readline_ex_unicode(word x_pos,word y_pos,char * str,word * str_unicode,byt
if (str_unicode != NULL) if (str_unicode != NULL)
str_unicode[0] = 0; str_unicode[0] = 0;
position=offset=0; position=offset=0;
// Effacement de la chaîne // Effacement de la chaîne
Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR); Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR);
goto affichage; goto affichage;
case SDLK_RETURN : case SDLK_RETURN :
@ -882,18 +882,18 @@ byte Readline_ex_unicode(word x_pos,word y_pos,char * str,word * str_unicode,byt
default : default :
if (size<max_size) if (size<max_size)
{ {
// Si la touche était autorisée... // Si la touche était autorisée...
byte is_authorized = Valid_character(input_key, input_type); byte is_authorized = Valid_character(input_key, input_type);
if (is_authorized == 1 || (is_authorized == 2 && position == 0 && str[position] != '-')) if (is_authorized == 1 || (is_authorized == 2 && position == 0 && str[position] != '-'))
{ {
// ... alors on l'insère ... // ... alors on l'insère ...
if (str_unicode != NULL) if (str_unicode != NULL)
Insert_character_unicode(str_unicode,input_key,position/*,size*/); Insert_character_unicode(str_unicode,input_key,position/*,size*/);
else else
Insert_character(str,input_key,position/*,size*/); Insert_character(str,input_key,position/*,size*/);
// ce qui augmente la taille de la chaine // ce qui augmente la taille de la chaine
size++; size++;
// et qui risque de déplacer le curseur vers la droite // et qui risque de déplacer le curseur vers la droite
if (size<max_size) if (size<max_size)
{ {
position++; position++;
@ -959,7 +959,7 @@ affichage:
Input_sticky_control=0; Input_sticky_control=0;
} }
#endif // defined(__ANDROID__) #endif // defined(__ANDROID__)
// Effacement de la chaîne // Effacement de la chaîne
Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR); Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR);
// On raffiche la chaine correctement // On raffiche la chaine correctement
if (input_type==INPUT_TYPE_INTEGER) if (input_type==INPUT_TYPE_INTEGER)

View File

@ -2,7 +2,7 @@
*/ */
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2008 Peter Gordon Copyright 2008 Peter Gordon
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
Copyright 2007 Adrien Destugues Copyright 2007 Adrien Destugues
@ -40,11 +40,11 @@ int Save_INI_reach_group(FILE * old_file,FILE * new_file,char * buffer,char * gr
char * group_upper; char * group_upper;
char * upper_buffer; char * upper_buffer;
// On alloue les zones de mémoire: // On alloue les zones de mémoire:
group_upper =(char *)malloc(1024); group_upper =(char *)malloc(1024);
upper_buffer=(char *)malloc(1024); upper_buffer=(char *)malloc(1024);
// On commence par se faire une version majuscule du groupe à rechercher: // On commence par se faire une version majuscule du groupe à rechercher:
strcpy(group_upper,group); strcpy(group_upper,group);
Load_INI_clear_string(group_upper, 0); Load_INI_clear_string(group_upper, 0);
@ -63,7 +63,7 @@ int Save_INI_reach_group(FILE * old_file,FILE * new_file,char * buffer,char * gr
strcpy(upper_buffer,buffer); strcpy(upper_buffer,buffer);
Load_INI_clear_string(upper_buffer, 0); Load_INI_clear_string(upper_buffer, 0);
// On compare la chaîne avec le groupe recherché: // On compare la chaîne avec le groupe recherché:
stop_seek=Load_INI_seek_pattern(upper_buffer,group_upper); stop_seek=Load_INI_seek_pattern(upper_buffer,group_upper);
if (fprintf(new_file,"%s",buffer)<0) if (fprintf(new_file,"%s",buffer)<0)
{ {
@ -126,16 +126,16 @@ void Save_INI_set_value(char * dest,char * source,int nb_values_to_set,int * val
for (;source[source_index]==' ';source_index++) for (;source[source_index]==' ';source_index++)
dest[source_index]=source[source_index]; dest[source_index]=source[source_index];
// Pour l'instant, la source et la destination en sont au même point: // Pour l'instant, la source et la destination en sont au même point:
dest_index=source_index; dest_index=source_index;
// Puis pour chaque valeur à recopier: // Puis pour chaque valeur à recopier:
for (value_index=0;value_index<nb_values_to_set;value_index++) for (value_index=0;value_index<nb_values_to_set;value_index++)
{ {
// Dans la destination, on écrit la valeur: // Dans la destination, on écrit la valeur:
if (litteral) if (litteral)
{ {
// La valeur doit être écrite sous la forme Yes/No // La valeur doit être écrite sous la forme Yes/No
if (values[value_index]) if (values[value_index])
{ {
@ -154,22 +154,22 @@ void Save_INI_set_value(char * dest,char * source,int nb_values_to_set,int * val
} }
else else
{ {
// La valeur doit être écrite sous forme numérique // La valeur doit être écrite sous forme numérique
if (source[source_index]=='$') if (source[source_index]=='$')
{ {
// On va écrire la valeur sous forme hexadécimale: // On va écrire la valeur sous forme hexadécimale:
// On commence par inscrire le symbole '$': // On commence par inscrire le symbole '$':
dest[dest_index]='$'; dest[dest_index]='$';
// Puis on y concatène la valeur: // Puis on y concatène la valeur:
sprintf(dest+dest_index+1,"%x",values[value_index]); sprintf(dest+dest_index+1,"%x",values[value_index]);
dest_index+=strlen(dest+dest_index); dest_index+=strlen(dest+dest_index);
} }
else else
{ {
// On va écrire la valeur sous forme décimale: // On va écrire la valeur sous forme décimale:
sprintf(dest+dest_index,"%d",values[value_index]); sprintf(dest+dest_index,"%d",values[value_index]);
dest_index+=strlen(dest+dest_index); dest_index+=strlen(dest+dest_index);
@ -181,16 +181,16 @@ void Save_INI_set_value(char * dest,char * source,int nb_values_to_set,int * val
if (value_index!=(nb_values_to_set-1)) if (value_index!=(nb_values_to_set-1))
{ {
// Il reste d'autres valeurs à écrire // Il reste d'autres valeurs à écrire
// On recopie tous les caractères de la source jusqu'au suivant qui // On recopie tous les caractères de la source jusqu'au suivant qui
// désigne une valeur: // désigne une valeur:
for (;(!Save_INI_char_in_value_alphabet(source[source_index])) && (source[source_index]!='\0');source_index++,dest_index++) for (;(!Save_INI_char_in_value_alphabet(source[source_index])) && (source[source_index]!='\0');source_index++,dest_index++)
dest[dest_index]=source[source_index]; dest[dest_index]=source[source_index];
} }
else else
{ {
// C'est la dernière valeur à initialiser // C'est la dernière valeur à initialiser
// On recopie toute la fin de la ligne: // On recopie toute la fin de la ligne:
for (;source[source_index]!='\0';source_index++,dest_index++) for (;source[source_index]!='\0';source_index++,dest_index++)
@ -219,10 +219,10 @@ void Save_INI_set_string(char * dest,char * source,char * value)
for (;source[source_index]==' ';source_index++) for (;source[source_index]==' ';source_index++)
dest[source_index]=source[source_index]; dest[source_index]=source[source_index];
// Pour l'instant, la source et la destination en sont au même point: // Pour l'instant, la source et la destination en sont au même point:
dest_index=source_index; dest_index=source_index;
// Dans la destination, on écrit la valeur: // Dans la destination, on écrit la valeur:
strcpy(dest+dest_index,value); strcpy(dest+dest_index,value);
dest_index+=strlen(value); dest_index+=strlen(value);
@ -245,7 +245,7 @@ int Save_INI_set_strings(FILE * old_file,FILE * new_file,char * buffer,char * op
char * result_buffer; char * result_buffer;
//int buffer_index; //int buffer_index;
// On alloue les zones de mémoire: // On alloue les zones de mémoire:
option_upper=(char *)malloc(1024); option_upper=(char *)malloc(1024);
upper_buffer=(char *)malloc(1024); upper_buffer=(char *)malloc(1024);
result_buffer=(char *)malloc(1024); result_buffer=(char *)malloc(1024);
@ -254,7 +254,7 @@ int Save_INI_set_strings(FILE * old_file,FILE * new_file,char * buffer,char * op
if (value == NULL) if (value == NULL)
value=""; value="";
// On commence par se faire une version majuscule de l'option à rechercher: // On commence par se faire une version majuscule de l'option à rechercher:
strcpy(option_upper,option_name); strcpy(option_upper,option_name);
Load_INI_clear_string(option_upper, 0); Load_INI_clear_string(option_upper, 0);
@ -274,12 +274,12 @@ int Save_INI_set_strings(FILE * old_file,FILE * new_file,char * buffer,char * op
strcpy(upper_buffer,buffer); strcpy(upper_buffer,buffer);
Load_INI_clear_string(upper_buffer, 0); Load_INI_clear_string(upper_buffer, 0);
// On compare la chaîne avec l'option recherchée: // On compare la chaîne avec l'option recherchée:
stop_seek=Load_INI_seek_pattern(upper_buffer,option_upper); stop_seek=Load_INI_seek_pattern(upper_buffer,option_upper);
if (stop_seek) if (stop_seek)
{ {
// On l'a trouvée: // On l'a trouvée:
Save_INI_set_string(result_buffer,buffer,value); Save_INI_set_string(result_buffer,buffer,value);
if (fprintf(new_file,"%s",result_buffer)<0) if (fprintf(new_file,"%s",result_buffer)<0)
@ -292,7 +292,7 @@ int Save_INI_set_strings(FILE * old_file,FILE * new_file,char * buffer,char * op
} }
else else
{ {
// On l'a pas trouvée: // On l'a pas trouvée:
if (fprintf(new_file,"%s",buffer)<0) if (fprintf(new_file,"%s",buffer)<0)
{ {
@ -320,12 +320,12 @@ int Save_INI_set_values(FILE * old_file,FILE * new_file,char * buffer,char * opt
char * result_buffer; char * result_buffer;
//int buffer_index; //int buffer_index;
// On alloue les zones de mémoire: // On alloue les zones de mémoire:
option_upper=(char *)malloc(1024); option_upper=(char *)malloc(1024);
upper_buffer=(char *)malloc(1024); upper_buffer=(char *)malloc(1024);
result_buffer=(char *)malloc(1024); result_buffer=(char *)malloc(1024);
// On commence par se faire une version majuscule de l'option à rechercher: // On commence par se faire une version majuscule de l'option à rechercher:
strcpy(option_upper,option_name); strcpy(option_upper,option_name);
Load_INI_clear_string(option_upper, 0); Load_INI_clear_string(option_upper, 0);
@ -346,12 +346,12 @@ int Save_INI_set_values(FILE * old_file,FILE * new_file,char * buffer,char * opt
strcpy(upper_buffer,buffer); strcpy(upper_buffer,buffer);
Load_INI_clear_string(upper_buffer, 0); Load_INI_clear_string(upper_buffer, 0);
// On compare la chaîne avec l'option recherchée: // On compare la chaîne avec l'option recherchée:
stop_seek=Load_INI_seek_pattern(upper_buffer,option_upper); stop_seek=Load_INI_seek_pattern(upper_buffer,option_upper);
if (stop_seek) if (stop_seek)
{ {
// On l'a trouvée: // On l'a trouvée:
Save_INI_set_value(result_buffer,buffer,nb_values_to_set,values,litteral); Save_INI_set_value(result_buffer,buffer,nb_values_to_set,values,litteral);
if (fprintf(new_file,"%s",result_buffer)<0) if (fprintf(new_file,"%s",result_buffer)<0)
@ -364,7 +364,7 @@ int Save_INI_set_values(FILE * old_file,FILE * new_file,char * buffer,char * opt
} }
else else
{ {
// On l'a pas trouvée: // On l'a pas trouvée:
if (fprintf(new_file,"%s",buffer)<0) if (fprintf(new_file,"%s",buffer)<0)
{ {
@ -407,14 +407,14 @@ int Save_INI(T_Config * conf)
int ini_file_exists; int ini_file_exists;
int index; int index;
// On alloue les zones de mémoire: // On alloue les zones de mémoire:
buffer=(char *)malloc(1024); buffer=(char *)malloc(1024);
// On calcule les noms des fichiers qu'on manipule: // On calcule les noms des fichiers qu'on manipule:
strcpy(filename,Config_directory); strcpy(filename,Config_directory);
strcat(filename,INI_FILENAME); strcat(filename,INI_FILENAME);
// On vérifie si le fichier INI existe // On vérifie si le fichier INI existe
if ((ini_file_exists = File_exists(filename))) if ((ini_file_exists = File_exists(filename)))
{ {
strcpy(temp_filename,Config_directory); strcpy(temp_filename,Config_directory);
@ -428,7 +428,7 @@ int Save_INI(T_Config * conf)
goto Erreur_ERREUR_SAUVEGARDE_INI; goto Erreur_ERREUR_SAUVEGARDE_INI;
} }
} }
// On récupère un fichier INI "propre" à partir de gfx2def.ini // On récupère un fichier INI "propre" à partir de gfx2def.ini
strcpy(ref_ini_file,Data_directory); strcpy(ref_ini_file,Data_directory);
strcat(ref_ini_file,INIDEF_FILENAME); strcat(ref_ini_file,INIDEF_FILENAME);
old_file=fopen(ref_ini_file,"rb"); old_file=fopen(ref_ini_file,"rb");

View File

@ -3,7 +3,7 @@
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2014 Sergii Pylypenko Copyright 2014 Sergii Pylypenko
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
Copyright 2008 Franck Charlet Copyright 2008 Franck Charlet
Copyright 2007 Adrien Destugues Copyright 2007 Adrien Destugues

View File

@ -3,7 +3,7 @@
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2014 Sergii Pylypenko Copyright 2014 Sergii Pylypenko
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2008 Peter Gordon Copyright 2008 Peter Gordon
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
Copyright 2008 Franck Charlet Copyright 2008 Franck Charlet
@ -239,15 +239,15 @@ void Set_config_directory(const char * program_dir, char * config_dir)
strcat(config_dir,Config_SubDir); strcat(config_dir,Config_SubDir);
if (Directory_exists(config_dir)) if (Directory_exists(config_dir))
{ {
// Répertoire trouvé, ok // Répertoire trouvé, ok
strcat(config_dir,PATH_SEPARATOR); strcat(config_dir,PATH_SEPARATOR);
} }
else else
{ {
// Tentative de création // Tentative de création
if (!Create_ConfigDirectory(config_dir)) if (!Create_ConfigDirectory(config_dir))
{ {
// Réussi // Réussi
strcat(config_dir,PATH_SEPARATOR); strcat(config_dir,PATH_SEPARATOR);
} }
else else

View File

@ -2,7 +2,7 @@
*/ */
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2008 Peter Gordon Copyright 2008 Peter Gordon
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
Copyright 2008 Franck Charlet Copyright 2008 Franck Charlet

View File

@ -110,7 +110,7 @@ void Shade_draw_grad_ranges(void)
{ {
// On regarde quel shade on va afficher en preview // On regarde quel shade on va afficher en preview
shade_processed=((y_pos-start_y)*nb_shades)/y_size; shade_processed=((y_pos-start_y)*nb_shades)/y_size;
// Si ce n'est pas le shade précédemment traité on calcule ses infos // Si ce n'est pas le shade précédemment traité on calcule ses infos
if (shade_processed>shade_processed_old) if (shade_processed>shade_processed_old)
{ {
// On commence par sauter tous les vides jusqu'au prochain shade // On commence par sauter tous les vides jusqu'au prochain shade
@ -161,7 +161,7 @@ void Tag_shades(word selection_start,word selection_end)
x_pos=Window_pos_X+(Menu_factor_X*((column<<2)+8)); x_pos=Window_pos_X+(Menu_factor_X*((column<<2)+8));
y_pos=Window_pos_Y+(Menu_factor_Y*((line*7)+131)); y_pos=Window_pos_Y+(Menu_factor_Y*((line*7)+131));
// On regarde si la case est "disablée" // On regarde si la case est "disablée"
if (Shade_list[Shade_current].List[position]&0x8000) if (Shade_list[Shade_current].List[position]&0x8000)
{ {
if ((position>=selection_start) && (position<=selection_end)) if ((position>=selection_start) && (position<=selection_end))
@ -172,7 +172,7 @@ void Tag_shades(word selection_start,word selection_end)
else else
Block(x_pos,y_pos,Menu_factor_X<<2,Menu_factor_Y<<1,MC_White); Block(x_pos,y_pos,Menu_factor_X<<2,Menu_factor_Y<<1,MC_White);
} }
else // "enablée" else // "enablée"
{ {
if ((position>=selection_start) && (position<=selection_end)) if ((position>=selection_start) && (position<=selection_end))
Block(x_pos,y_pos,Menu_factor_X<<2,Menu_factor_Y<<1,MC_Black); Block(x_pos,y_pos,Menu_factor_X<<2,Menu_factor_Y<<1,MC_Black);
@ -294,8 +294,8 @@ void Insert_shade(byte first_color, byte last_color, word selection_start)
first_color=temp; first_color=temp;
} }
// Avant d'insérer quoi que ce soit, on efface les éventuelles couleurs que // Avant d'insérer quoi que ce soit, on efface les éventuelles couleurs que
// l'on va réinsérer: // l'on va réinsérer:
limit=512-selection_start; limit=512-selection_start;
for (cursor=0; cursor<512; cursor++) for (cursor=0; cursor<512; cursor++)
{ {
@ -305,7 +305,7 @@ void Insert_shade(byte first_color, byte last_color, word selection_start)
&& ((Shade_list[Shade_current].List[cursor]&0xFF)==temp) ) && ((Shade_list[Shade_current].List[cursor]&0xFF)==temp) )
Shade_list[Shade_current].List[cursor]=(Shade_list[Shade_current].List[cursor]&0x8000)|0x0100; Shade_list[Shade_current].List[cursor]=(Shade_list[Shade_current].List[cursor]&0x8000)|0x0100;
} }
// Voilà... Maintenant on peut y aller peinard. // Voilà... Maintenant on peut y aller peinard.
temp=1+last_color-first_color; temp=1+last_color-first_color;
limit=selection_start+temp; limit=selection_start+temp;
@ -383,7 +383,7 @@ void Swap_shade(short block_1_start,short block_2_start,short block_size)
temp_shade=(word *)malloc(512*sizeof(word)); temp_shade=(word *)malloc(512*sizeof(word));
memcpy(temp_shade,Shade_list[Shade_current].List,512*sizeof(word)); memcpy(temp_shade,Shade_list[Shade_current].List,512*sizeof(word));
// On calcul les dernières couleurs de chaque bloc. // On calcul les dernières couleurs de chaque bloc.
end_1=block_1_start+block_size-1; end_1=block_1_start+block_size-1;
end_2=block_2_start+block_size-1; end_2=block_2_start+block_size-1;
@ -394,7 +394,7 @@ void Swap_shade(short block_1_start,short block_2_start,short block_size)
{ {
// Il faut transformer la case pos_1 en pos_2: // Il faut transformer la case pos_1 en pos_2:
Shade_list[Shade_current].List[pos_1]=temp_shade[pos_2]; Shade_list[Shade_current].List[pos_1]=temp_shade[pos_2];
// On gère la mise à jour de pos_2 // On gère la mise à jour de pos_2
if (pos_2==end_2) if (pos_2==end_2)
pos_2=block_1_start; pos_2=block_1_start;
else else
@ -404,12 +404,12 @@ void Swap_shade(short block_1_start,short block_2_start,short block_size)
else else
if ((block_2_start<block_1_start) && (end_2>=block_1_start)) if ((block_2_start<block_1_start) && (end_2>=block_1_start))
{ {
// Le bloc destination déborde dans le bloc source. // Le bloc destination déborde dans le bloc source.
for (pos_1=block_2_start,pos_2=block_1_start;pos_1<=end_1;pos_1++) for (pos_1=block_2_start,pos_2=block_1_start;pos_1<=end_1;pos_1++)
{ {
// Il faut transformer la couleur pos_1 en pos_2: // Il faut transformer la couleur pos_1 en pos_2:
Shade_list[Shade_current].List[pos_1]=temp_shade[pos_2]; Shade_list[Shade_current].List[pos_1]=temp_shade[pos_2];
// On gère la mise à jour de pos_2 // On gère la mise à jour de pos_2
if (pos_2==end_1) if (pos_2==end_1)
pos_2=block_2_start; pos_2=block_2_start;
else else
@ -421,7 +421,7 @@ void Swap_shade(short block_1_start,short block_2_start,short block_size)
// Le bloc source et le bloc destination sont distincts. // Le bloc source et le bloc destination sont distincts.
for (pos_1=block_1_start,pos_2=block_2_start;pos_1<=end_1;pos_1++,pos_2++) for (pos_1=block_1_start,pos_2=block_2_start;pos_1<=end_1;pos_1++,pos_2++)
{ {
// On échange les cases // On échange les cases
temp =Shade_list[Shade_current].List[pos_1]; temp =Shade_list[Shade_current].List[pos_1];
Shade_list[Shade_current].List[pos_1]=Shade_list[Shade_current].List[pos_2]; Shade_list[Shade_current].List[pos_1]=Shade_list[Shade_current].List[pos_2];
Shade_list[Shade_current].List[pos_2]=temp; Shade_list[Shade_current].List[pos_2]=temp;
@ -434,9 +434,9 @@ void Swap_shade(short block_1_start,short block_2_start,short block_size)
int Menu_shade(void) int Menu_shade(void)
{ {
short clicked_button; // Numéro du bouton sur lequel l'utilisateur a clické short clicked_button; // Numéro du bouton sur lequel l'utilisateur a clické
char str[4]; // str d'affichage du n° de shade actif et du Pas char str[4]; // str d'affichage du n° de shade actif et du Pas
word old_mouse_x, old_mouse_x2; // Mémo. de l'ancienne pos. du curseur word old_mouse_x, old_mouse_x2; // Mémo. de l'ancienne pos. du curseur
word old_mouse_y, old_mouse_y2; word old_mouse_y, old_mouse_y2;
byte old_mouse_k, old_mouse_k2; byte old_mouse_k, old_mouse_k2;
byte temp_color; // Variables de gestion des clicks dans la palette byte temp_color; // Variables de gestion des clicks dans la palette
@ -458,52 +458,52 @@ int Menu_shade(void)
undo_buffer =(word *)malloc(512*sizeof(word)); undo_buffer =(word *)malloc(512*sizeof(word));
temp_ptr=(word *)malloc(512*sizeof(word)); temp_ptr=(word *)malloc(512*sizeof(word));
// Ouverture de la fenêtre du menu // Ouverture de la fenêtre du menu
Open_window(310,190,"Shade"); Open_window(310,190,"Shade");
// Déclaration & tracé du bouton de palette // Déclaration & tracé du bouton de palette
Window_set_palette_button(5,16); // 1 Window_set_palette_button(5,16); // 1
// Déclaration & tracé du scroller de sélection du n° de dégradé // Déclaration & tracé du scroller de sélection du n° de dégradé
Window_set_scroller_button(192,17,84,8,1,Shade_current); // 2 Window_set_scroller_button(192,17,84,8,1,Shade_current); // 2
// Déclaration & tracé de la zone de définition des dégradés // Déclaration & tracé de la zone de définition des dégradés
Window_set_special_button(8,127,256,53,0); // 3 Window_set_special_button(8,127,256,53,0); // 3
// Déclaration & tracé des boutons de sortie // Déclaration & tracé des boutons de sortie
Window_set_normal_button(207,17,51,14,"Cancel",0,1,KEY_ESC); // 4 Window_set_normal_button(207,17,51,14,"Cancel",0,1,KEY_ESC); // 4
Window_set_normal_button(261,17,43,14,"OK" ,0,1,SDLK_RETURN); // 5 Window_set_normal_button(261,17,43,14,"OK" ,0,1,SDLK_RETURN); // 5
// Déclaration & tracé des boutons de copie de shade // Déclaration & tracé des boutons de copie de shade
Window_set_normal_button(206,87,27,14,"Cpy" ,1,1,SDLK_c); // 6 Window_set_normal_button(206,87,27,14,"Cpy" ,1,1,SDLK_c); // 6
Window_set_normal_button(234,87,43,14,"Paste" ,1,1,SDLK_p); // 7 Window_set_normal_button(234,87,43,14,"Paste" ,1,1,SDLK_p); // 7
// On tagge le bloc // On tagge le bloc
Tag_color_range(Fore_color,Fore_color); Tag_color_range(Fore_color,Fore_color);
// Tracé d'un cadre creux autour du bloc dégradé // Tracé d'un cadre creux autour du bloc dégradé
Window_display_frame_in(171,26,18,66); Window_display_frame_in(171,26,18,66);
Window_rectangle(172,27,16,64,MC_Black); Window_rectangle(172,27,16,64,MC_Black);
// Tracé d'un cadre creux autour de tous les dégradés // Tracé d'un cadre creux autour de tous les dégradés
Window_display_frame_in(223,34,66,50); Window_display_frame_in(223,34,66,50);
Shade_draw_grad_ranges(); Shade_draw_grad_ranges();
// Tracé d'un cadre autour de la zone de définition de dégradés // Tracé d'un cadre autour de la zone de définition de dégradés
Window_display_frame(5,124,262,61); Window_display_frame(5,124,262,61);
Display_all_shade(first_color,last_color,selection_start,selection_end); Display_all_shade(first_color,last_color,selection_start,selection_end);
// Déclaration & tracé des boutons d'édition de shade // Déclaration & tracé des boutons d'édition de shade
Window_set_normal_button( 6,107,27,14,"Ins" ,0,1,SDLK_INSERT); // 8 Window_set_normal_button( 6,107,27,14,"Ins" ,0,1,SDLK_INSERT); // 8
Window_set_normal_button( 38,107,27,14,"Del" ,0,1,SDLK_DELETE); // 9 Window_set_normal_button( 38,107,27,14,"Del" ,0,1,SDLK_DELETE); // 9
Window_set_normal_button( 66,107,43,14,"Blank",1,1,SDLK_b); // 10 Window_set_normal_button( 66,107,43,14,"Blank",1,1,SDLK_b); // 10
Window_set_normal_button(110,107,27,14,"Inv" ,1,1,SDLK_i); // 11 Window_set_normal_button(110,107,27,14,"Inv" ,1,1,SDLK_i); // 11
Window_set_normal_button(138,107,27,14,"Swp" ,1,1,SDLK_s); // 12 Window_set_normal_button(138,107,27,14,"Swp" ,1,1,SDLK_s); // 12
// Déclaration & tracé des boutons de taggage // Déclaration & tracé des boutons de taggage
Print_in_window(268,123,"Disbl"/*"Dsabl"*/,MC_Dark,MC_Light); Print_in_window(268,123,"Disbl"/*"Dsabl"*/,MC_Dark,MC_Light);
Window_set_normal_button(274,133,27,14,"Set" ,0,1,SDLK_F1); // 13 Window_set_normal_button(274,133,27,14,"Set" ,0,1,SDLK_F1); // 13
Window_set_normal_button(274,148,27,14,"Clr" ,0,1,SDLK_F2); // 14 Window_set_normal_button(274,148,27,14,"Clr" ,0,1,SDLK_F2); // 14
// Déclaration & tracé de la zone de saisie du pas // Déclaration & tracé de la zone de saisie du pas
Print_in_window(272,165,"Step",MC_Dark,MC_Light); Print_in_window(272,165,"Step",MC_Dark,MC_Light);
input_button = Window_set_input_button(274,174,3); // 15 input_button = Window_set_input_button(274,174,3); // 15
Num2str(Shade_list[Shade_current].Step,str,3); Num2str(Shade_list[Shade_current].Step,str,3);
@ -517,7 +517,7 @@ int Menu_shade(void)
// Button Mode // Button Mode
Window_set_normal_button(244,107,60,14,"",0,1,SDLK_TAB); // 18 Window_set_normal_button(244,107,60,14,"",0,1,SDLK_TAB); // 18
// Affichage du n° de shade actif // Affichage du n° de shade actif
Num2str(Shade_current+1,str,1); Num2str(Shade_current+1,str,1);
Print_in_window(210,55,str,MC_Black,MC_Light); Print_in_window(210,55,str,MC_Black,MC_Light);
@ -550,11 +550,11 @@ int Menu_shade(void)
if (!old_mouse_k) if (!old_mouse_k)
{ // On vient de clicker { // On vient de clicker
// On met à jour l'intervalle du Shade // On met à jour l'intervalle du Shade
first_color=last_color=temp_color; first_color=last_color=temp_color;
// On tagge le bloc // On tagge le bloc
Tag_color_range(first_color,last_color); Tag_color_range(first_color,last_color);
// Tracé du bloc dégradé: // Tracé du bloc dégradé:
Display_grad_block_in_window(172,27,16,64,first_color,last_color); Display_grad_block_in_window(172,27,16,64,first_color,last_color);
} }
else else
@ -577,7 +577,7 @@ int Menu_shade(void)
} }
} }
// On affiche le numéro de la couleur sélectionnée // On affiche le numéro de la couleur sélectionnée
Display_selected_color(first_color,last_color); Display_selected_color(first_color,last_color);
Display_cursor(); Display_cursor();
@ -587,20 +587,20 @@ int Menu_shade(void)
case 2 : // Gestion du changement de Shade (scroller) case 2 : // Gestion du changement de Shade (scroller)
Hide_cursor(); Hide_cursor();
Shade_current=Window_attribute2; Shade_current=Window_attribute2;
// Affichade du n° de shade actif // Affichade du n° de shade actif
Num2str(Shade_current+1,str,1); Num2str(Shade_current+1,str,1);
Print_in_window(210,55,str,MC_Black,MC_Light); Print_in_window(210,55,str,MC_Black,MC_Light);
// Affichade du Pas // Affichade du Pas
Num2str(Shade_list[Shade_current].Step,str,3); Num2str(Shade_list[Shade_current].Step,str,3);
Print_in_window(276,176,str,MC_Black,MC_Light); Print_in_window(276,176,str,MC_Black,MC_Light);
// Tracé du bloc dégradé: // Tracé du bloc dégradé:
Display_all_shade(first_color,last_color,selection_start,selection_end); Display_all_shade(first_color,last_color,selection_start,selection_end);
Display_cursor(); Display_cursor();
// On place le nouveau shade dans le buffer du Undo // On place le nouveau shade dans le buffer du Undo
memcpy(undo_buffer,Shade_list[Shade_current].List,512*sizeof(word)); memcpy(undo_buffer,Shade_list[Shade_current].List,512*sizeof(word));
break; break;
case 3 : // Gestion de la zone de définition de shades case 3 : // Gestion de la zone de définition de shades
if (((((Mouse_Y-Window_pos_Y)/Menu_factor_Y)-127)%7)<4) if (((((Mouse_Y-Window_pos_Y)/Menu_factor_Y)-127)%7)<4)
if ( (Mouse_X!=old_mouse_x2) || (Mouse_Y!=old_mouse_y2) || (Mouse_K!=old_mouse_k2) ) if ( (Mouse_X!=old_mouse_x2) || (Mouse_Y!=old_mouse_y2) || (Mouse_K!=old_mouse_k2) )
{ {
@ -645,12 +645,12 @@ int Menu_shade(void)
else else
temp=first_color-last_color; temp=first_color-last_color;
if (selection_start==selection_end) // Une couleur sélectionnée if (selection_start==selection_end) // Une couleur sélectionnée
{ {
if (Window_attribute1==2) if (Window_attribute1==2)
Remove_shade(selection_start,selection_start+temp); Remove_shade(selection_start,selection_start+temp);
} }
else // Un bloc sélectionné else // Un bloc sélectionné
{ {
Remove_shade(selection_start,selection_end); Remove_shade(selection_start,selection_end);
@ -677,7 +677,7 @@ int Menu_shade(void)
} }
Insert_shade(first_color,last_color,selection_start); Insert_shade(first_color,last_color,selection_start);
// On sélectionne la position juste après ce qu'on vient d'insérer // On sélectionne la position juste après ce qu'on vient d'insérer
selection_start+=temp+1; selection_start+=temp+1;
if (selection_start>=512) if (selection_start>=512)
selection_start=511; selection_start=511;
@ -782,7 +782,7 @@ int Menu_shade(void)
// On place le shade dans le buffer du Undo // On place le shade dans le buffer du Undo
memcpy(undo_buffer,Shade_list[Shade_current].List,512*sizeof(word)); memcpy(undo_buffer,Shade_list[Shade_current].List,512*sizeof(word));
// Et on le modifie // Et on le modifie
// On échange le bloc avec sa destination // On échange le bloc avec sa destination
if (selection_start<=selection_end) if (selection_start<=selection_end)
{ {
temp=(temp_cell+selection_end-selection_start<512)?selection_end+1-selection_start:512-temp_cell; temp=(temp_cell+selection_end-selection_start<512)?selection_end+1-selection_start:512-temp_cell;
@ -793,7 +793,7 @@ int Menu_shade(void)
temp=(temp_cell+selection_start-selection_end<512)?selection_start+1-selection_end:512-temp_cell; temp=(temp_cell+selection_start-selection_end<512)?selection_start+1-selection_end:512-temp_cell;
Swap_shade(selection_end,temp_cell,temp); Swap_shade(selection_end,temp_cell,temp);
} }
// On place la sélection sur la nouvelle position du bloc // On place la sélection sur la nouvelle position du bloc
selection_start=temp_cell; selection_start=temp_cell;
selection_end=selection_start+temp-1; selection_end=selection_start+temp-1;
// Et on raffiche tout // Et on raffiche tout
@ -883,8 +883,8 @@ int Menu_shade(void)
if (!Mouse_K) if (!Mouse_K)
switch (Key) switch (Key)
{ {
case SDLK_LEFTBRACKET : // Décaler couleur dans palette vers la gauche case SDLK_LEFTBRACKET : // Décaler couleur dans palette vers la gauche
case SDLK_RIGHTBRACKET : // Décaler couleur dans palette vers la droite case SDLK_RIGHTBRACKET : // Décaler couleur dans palette vers la droite
if (first_color==last_color) if (first_color==last_color)
{ {
if (Key==SDLK_LEFTBRACKET) if (Key==SDLK_LEFTBRACKET)
@ -902,7 +902,7 @@ int Menu_shade(void)
Block(Window_pos_X+(Menu_factor_X*172), Block(Window_pos_X+(Menu_factor_X*172),
Window_pos_Y+(Menu_factor_Y*27), Window_pos_Y+(Menu_factor_Y*27),
Menu_factor_X<<4,Menu_factor_Y*64,first_color); Menu_factor_X<<4,Menu_factor_Y*64,first_color);
// On affiche le numéro de la couleur sélectionnée // On affiche le numéro de la couleur sélectionnée
Display_selected_color(first_color,last_color); Display_selected_color(first_color,last_color);
Display_cursor(); Display_cursor();
} }
@ -957,7 +957,7 @@ int Menu_shade(void)
Key=0; Key=0;
break; break;
case SDLK_BACKQUOTE : // Récupération d'une couleur derrière le menu case SDLK_BACKQUOTE : // Récupération d'une couleur derrière le menu
case SDLK_COMMA : case SDLK_COMMA :
Get_color_behind_window(&color,&click); Get_color_behind_window(&color,&click);
if (click) if (click)
@ -965,14 +965,14 @@ int Menu_shade(void)
Hide_cursor(); Hide_cursor();
temp_color=color; temp_color=color;
// On met à jour l'intervalle du Shade // On met à jour l'intervalle du Shade
first_color=last_color=temp_color; first_color=last_color=temp_color;
// On tagge le bloc // On tagge le bloc
Tag_color_range(first_color,last_color); Tag_color_range(first_color,last_color);
// Tracé du bloc dégradé: // Tracé du bloc dégradé:
Display_grad_block_in_window(172,27,16,64,first_color,last_color); Display_grad_block_in_window(172,27,16,64,first_color,last_color);
// On affiche le numéro de la couleur sélectionnée // On affiche le numéro de la couleur sélectionnée
Display_selected_color(first_color,last_color); Display_selected_color(first_color,last_color);
Display_cursor(); Display_cursor();
@ -1004,11 +1004,11 @@ int Menu_shade(void)
/// @return true if user clicked ok, false if he cancelled /// @return true if user clicked ok, false if he cancelled
int Shade_settings_menu(void) int Shade_settings_menu(void)
{ {
T_Shade * initial_shade_list; // Anciennes données des shades T_Shade * initial_shade_list; // Anciennes données des shades
byte old_shade; // old n° de shade actif byte old_shade; // old n° de shade actif
int return_code; int return_code;
// Backup des anciennes données // Backup des anciennes données
initial_shade_list=(T_Shade *)malloc(sizeof(Shade_list)); initial_shade_list=(T_Shade *)malloc(sizeof(Shade_list));
memcpy(initial_shade_list,Shade_list,sizeof(Shade_list)); memcpy(initial_shade_list,Shade_list,sizeof(Shade_list));
old_shade=Shade_current; old_shade=Shade_current;
@ -1052,7 +1052,7 @@ void Button_Quick_shade_menu(void)
int temp; int temp;
char str[4]; char str[4];
byte step_backup=Quick_shade_step; // Backup des byte step_backup=Quick_shade_step; // Backup des
byte loop_backup=Quick_shade_loop; // anciennes données byte loop_backup=Quick_shade_loop; // anciennes données
T_Special_button * step_button; T_Special_button * step_button;
Open_window(142,56,"Quick-shade"); Open_window(142,56,"Quick-shade");
@ -1062,7 +1062,7 @@ void Button_Quick_shade_menu(void)
Window_set_normal_button(76,18,60,14,"",0,1,SDLK_TAB); // 3 Window_set_normal_button(76,18,60,14,"",0,1,SDLK_TAB); // 3
Display_shade_mode(83,21,Quick_shade_loop); Display_shade_mode(83,21,Quick_shade_loop);
// Déclaration & tracé de la zone de saisie du pas // Déclaration & tracé de la zone de saisie du pas
Print_in_window(5,21,"Step",MC_Dark,MC_Light); Print_in_window(5,21,"Step",MC_Dark,MC_Light);
step_button = Window_set_input_button(40,19,3); // 4 step_button = Window_set_input_button(40,19,3); // 4
Num2str(Quick_shade_step,str,3); Num2str(Quick_shade_step,str,3);
@ -1121,7 +1121,7 @@ void Button_Quick_shade_menu(void)
} }
else // OK else // OK
{ {
// Si avant de rentrer dans le menu on n'était pas en mode Quick-Shade // Si avant de rentrer dans le menu on n'était pas en mode Quick-Shade
if (!Quick_shade_mode) if (!Quick_shade_mode)
Button_Quick_shade_mode(); // => On y passe (cool!) Button_Quick_shade_mode(); // => On y passe (cool!)
} }

View File

@ -35,7 +35,7 @@
//---------------------- Modifier le pinceau spécial ------------------------- //---------------------- Modifier le pinceau spécial -------------------------
void Set_paintbrush_size(int width, int height) void Set_paintbrush_size(int width, int height)
{ {
@ -295,7 +295,7 @@ void Special_previous_user_backcolor(void)
Display_cursor(); Display_cursor();
} }
// ------------------- Scroller l'écran (pas en mode loupe) ------------------ // ------------------- Scroller l'écran (pas en mode loupe) ------------------
void Scroll_screen(short delta_x,short delta_y) void Scroll_screen(short delta_x,short delta_y)
{ {
short temp_x_offset; short temp_x_offset;
@ -329,7 +329,7 @@ void Scroll_screen(short delta_x,short delta_y)
} }
// ---------------------- Scroller la fenêtre de la loupe -------------------- // ---------------------- Scroller la fenêtre de la loupe --------------------
void Scroll_magnifier(short delta_x,short delta_y) void Scroll_magnifier(short delta_x,short delta_y)
{ {
short temp_x_offset; short temp_x_offset;
@ -358,7 +358,7 @@ void Scroll_magnifier(short delta_x,short delta_y)
} }
// -------------- Changer le Zoom (grâce aux touches [+] et [-]) ------------- // -------------- Changer le Zoom (grâce aux touches [+] et [-]) -------------
void Zoom(short delta) void Zoom(short delta)
{ {
short index; short index;

View File

@ -3,7 +3,7 @@
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2014 Sergii Pylypenko Copyright 2014 Sergii Pylypenko
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
Copyright 2007 Adrien Destugues Copyright 2007 Adrien Destugues
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud) Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
@ -386,11 +386,11 @@ typedef struct
} T_Config; } T_Config;
// Structures utilisées pour les descriptions de pages et de liste de pages. // Structures utilisées pour les descriptions de pages et de liste de pages.
// Lorsqu'on gèrera les animations, il faudra aussi des listes de listes de // Lorsqu'on gèrera les animations, il faudra aussi des listes de listes de
// pages. // pages.
// Ces structures sont manipulées à travers des fonctions de gestion du // Ces structures sont manipulées à travers des fonctions de gestion du
// backup dans "graph.c". // backup dans "graph.c".
typedef struct T_Image typedef struct T_Image

View File

@ -3,7 +3,7 @@
/* Grafx2 - The Ultimate 256-color bitmap paint program /* Grafx2 - The Ultimate 256-color bitmap paint program
Copyright 2014 Sergii Pylypenko Copyright 2014 Sergii Pylypenko
Copyright 2011 Pawel Góralski Copyright 2011 Pawel Góralski
Copyright 2008 Yves Rizoud Copyright 2008 Yves Rizoud
Copyright 2008 Franck Charlet Copyright 2008 Franck Charlet
Copyright 2008 Adrien Destugues Copyright 2008 Adrien Destugues
@ -23,7 +23,7 @@
along with Grafx2; if not, see <http://www.gnu.org/licenses/> along with Grafx2; if not, see <http://www.gnu.org/licenses/>
*/ */
// Pour désactiver le support TrueType, définir NOTTF // Pour désactiver le support TrueType, définir NOTTF
// To disable TrueType support, define NOTTF // To disable TrueType support, define NOTTF
#include <string.h> #include <string.h>
@ -77,15 +77,15 @@ typedef struct T_Font
int Is_bitmap; int Is_bitmap;
char Label[22]; char Label[22];
// Liste chainée simple // Liste chainée simple
struct T_Font * Next; struct T_Font * Next;
struct T_Font * Previous; struct T_Font * Previous;
} T_Font; } T_Font;
// Liste chainée des polices de texte // Liste chainée des polices de texte
T_Font * font_list_start; T_Font * font_list_start;
int Nb_fonts; int Nb_fonts;
// Inspiré par Allegro // Inspiré par Allegro
#define EXTID(a,b,c) ((((a)&255)<<16) | (((b)&255)<<8) | (((c)&255))) #define EXTID(a,b,c) ((((a)&255)<<16) | (((b)&255)<<8) | (((c)&255)))
#define EXTID4(a,b,c,d) ((((a)&255)<<24) | (((b)&255)<<16) | (((c)&255)<<8) | (((d)&255))) #define EXTID4(a,b,c,d) ((((a)&255)<<24) | (((b)&255)<<16) | (((c)&255)<<8) | (((d)&255)))
@ -98,14 +98,14 @@ int Compare_fonts(T_Font * font_1, T_Font * font_2)
return strcmp(font_1->Label, font_2->Label); return strcmp(font_1->Label, font_2->Label);
} }
// Ajout d'une fonte à la liste. // Ajout d'une fonte à la liste.
static void Add_font(const char *name, const char * font_name) static void Add_font(const char *name, const char * font_name)
{ {
T_Font * font; T_Font * font;
int size=strlen(name)+1; int size=strlen(name)+1;
int index; int index;
// Détermination du type: // Détermination du type:
#if defined(__macosx__) #if defined(__macosx__)
char strFontName[512]; char strFontName[512];
@ -211,7 +211,7 @@ static void Add_font(const char *name, const char * font_name)
searched_font=font_list_start; searched_font=font_list_start;
while (searched_font->Next && (compare=Compare_fonts(font, searched_font->Next))>0) while (searched_font->Next && (compare=Compare_fonts(font, searched_font->Next))>0)
searched_font=searched_font->Next; searched_font=searched_font->Next;
// Après searched_font // Après searched_font
if (compare==0 && strcmp(font->Name, searched_font->Next->Name)==0) if (compare==0 && strcmp(font->Name, searched_font->Next->Name)==0)
{ {
// Doublon // Doublon
@ -227,7 +227,7 @@ static void Add_font(const char *name, const char * font_name)
} }
// Trouve le nom d'une fonte par son numéro // Trouve le nom d'une fonte par son numéro
char * Font_name(int index) char * Font_name(int index)
{ {
T_Font *font = font_list_start; T_Font *font = font_list_start;
@ -239,7 +239,7 @@ char * Font_name(int index)
} }
// Trouve le libellé d'affichage d'une fonte par son numéro // Trouve le libellé d'affichage d'une fonte par son numéro
// Renvoie un pointeur sur un buffer statique de 20 caracteres. // Renvoie un pointeur sur un buffer statique de 20 caracteres.
char * Font_label(int index) char * Font_label(int index)
{ {
@ -255,13 +255,13 @@ char * Font_label(int index)
while (index--) while (index--)
font = font->Next; font = font->Next;
// Libellé // Libellé
strcpy(label, font->Label); strcpy(label, font->Label);
return label; return label;
} }
// Vérifie si une fonte donnée est TrueType // Vérifie si une fonte donnée est TrueType
int TrueType_font(int index) int TrueType_font(int index)
{ {
T_Font *font = font_list_start; T_Font *font = font_list_start;
@ -274,7 +274,7 @@ int TrueType_font(int index)
// Initialisation à faire une fois au début du programme // Initialisation à faire une fois au début du programme
void Init_text(void) void Init_text(void)
{ {
char directory_name[MAX_PATH_CHARACTERS]; char directory_name[MAX_PATH_CHARACTERS];
@ -286,7 +286,7 @@ void Init_text(void)
// Initialisation des fontes // Initialisation des fontes
font_list_start = NULL; font_list_start = NULL;
Nb_fonts=0; Nb_fonts=0;
// Parcours du répertoire "fonts" // Parcours du répertoire "fonts"
snprintf(directory_name, sizeof(directory_name), "%s%s", Data_directory,FONTS_SUBDIRECTORY); snprintf(directory_name, sizeof(directory_name), "%s%s", Data_directory,FONTS_SUBDIRECTORY);
For_each_file(directory_name, Add_font); For_each_file(directory_name, Add_font);
// fonts subdirectory in Config_directory // fonts subdirectory in Config_directory
@ -294,7 +294,7 @@ void Init_text(void)
For_each_file(directory_name, Add_font); For_each_file(directory_name, Add_font);
#if defined(__WIN32__) #if defined(__WIN32__)
// Parcours du répertoire systeme windows "fonts" // Parcours du répertoire systeme windows "fonts"
#ifndef NOTTF #ifndef NOTTF
{ {
char * WindowsPath=getenv("windir"); char * WindowsPath=getenv("windir");
@ -306,7 +306,7 @@ void Init_text(void)
} }
#endif #endif
#elif defined(__macosx__) #elif defined(__macosx__)
// Récupération de la liste des fonts avec fontconfig // Récupération de la liste des fonts avec fontconfig
#ifndef NOTTF #ifndef NOTTF
@ -375,7 +375,7 @@ void Init_text(void)
#endif #endif
} }
// Informe si texte.c a été compilé avec l'option de support TrueType ou pas. // Informe si texte.c a été compilé avec l'option de support TrueType ou pas.
int TrueType_is_supported() int TrueType_is_supported()
{ {
#ifdef NOTTF #ifdef NOTTF
@ -662,8 +662,8 @@ byte *Render_text_SFont(const char *str, int font_number, int *width, int *heigh
return new_brush; return new_brush;
} }
// Crée une brosse à partir des paramètres de texte demandés. // Crée une brosse à partir des paramètres de texte demandés.
// Si cela réussit, la fonction place les dimensions dans width et height, // Si cela réussit, la fonction place les dimensions dans width et height,
// et retourne l'adresse du bloc d'octets. // et retourne l'adresse du bloc d'octets.
byte *Render_text(const char *str, int font_number, int size, int antialias, int bold, int italic, int *width, int *height, T_Palette palette) byte *Render_text(const char *str, int font_number, int size, int antialias, int bold, int italic, int *width, int *height, T_Palette palette)
{ {

View File

@ -355,13 +355,13 @@ void Button_Transform_menu(int btn)
break; break;
case 2 : // Flip X case 2 : // Flip X
case 3 : // Flip Y case 3 : // Flip Y
case 6 : // 180° Rotation case 6 : // 180° Rotation
new_width=Main.image_width; new_width=Main.image_width;
new_height=Main.image_height; new_height=Main.image_height;
break; break;
case 4 : // -90° Rotation case 4 : // -90° Rotation
case 5 : // +90° Rotation case 5 : // +90° Rotation
new_width=Main.image_height; new_width=Main.image_height;
new_height=Main.image_width; new_height=Main.image_width;
@ -398,19 +398,19 @@ void Button_Transform_menu(int btn)
Flip_Y_lowlevel(Main.backups->Pages->Image[i].Pixels, Main.image_width, Main.image_height); Flip_Y_lowlevel(Main.backups->Pages->Image[i].Pixels, Main.image_width, Main.image_height);
} }
break; break;
case 4 : // -90° Rotation case 4 : // -90° Rotation
for (i=0; i<Main.backups->Pages->Nb_layers; i++) for (i=0; i<Main.backups->Pages->Nb_layers; i++)
{ {
Rotate_270_deg_lowlevel(Main.backups->Pages->Next->Image[i].Pixels, Main.backups->Pages->Image[i].Pixels, old_width, old_height); Rotate_270_deg_lowlevel(Main.backups->Pages->Next->Image[i].Pixels, Main.backups->Pages->Image[i].Pixels, old_width, old_height);
} }
break; break;
case 5 : // +90° Rotation case 5 : // +90° Rotation
for (i=0; i<Main.backups->Pages->Nb_layers; i++) for (i=0; i<Main.backups->Pages->Nb_layers; i++)
{ {
Rotate_90_deg_lowlevel(Main.backups->Pages->Next->Image[i].Pixels, Main.backups->Pages->Image[i].Pixels, old_width, old_height); Rotate_90_deg_lowlevel(Main.backups->Pages->Next->Image[i].Pixels, Main.backups->Pages->Image[i].Pixels, old_width, old_height);
} }
break; break;
case 6 : // 180° Rotation case 6 : // 180° Rotation
for (i=0; i<Main.backups->Pages->Nb_layers; i++) for (i=0; i<Main.backups->Pages->Nb_layers; i++)
{ {
memcpy(Main.backups->Pages->Image[i].Pixels,Main.backups->Pages->Next->Image[i].Pixels,Main.image_width*Main.image_height); memcpy(Main.backups->Pages->Image[i].Pixels,Main.backups->Pages->Next->Image[i].Pixels,Main.image_width*Main.image_height);

View File

@ -62,9 +62,9 @@ T_Menu_Bar Menu_bars[MENUBAR_COUNT] =
/// Width of one layer button, in pixels before scaling /// Width of one layer button, in pixels before scaling
word Layer_button_width = 1; word Layer_button_width = 1;
// L'encapsulation tente une percée...ou un dernier combat. // L'encapsulation tente une percée...ou un dernier combat.
// Nombre de cellules réel dans la palette du menu // Nombre de cellules réel dans la palette du menu
word Menu_cells_X; word Menu_cells_X;
word Palette_cells_X() word Palette_cells_X()
{ {
@ -90,42 +90,42 @@ void Pixel_in_menu_and_skin(word bar, word x, word y, byte color)
Menu_bars[bar].Skin[2][y*Menu_bars[bar].Skin_width + x] = color; Menu_bars[bar].Skin[2][y*Menu_bars[bar].Skin_width + x] = color;
} }
// Affichage d'un pixel dans la fenêtre (la fenêtre doit être visible) // Affichage d'un pixel dans la fenêtre (la fenêtre doit être visible)
void Pixel_in_window(word x,word y,byte color) void Pixel_in_window(word x,word y,byte color)
{ {
Block((x*Menu_factor_X)+Window_pos_X,(y*Menu_factor_Y)+Window_pos_Y,Menu_factor_X,Menu_factor_Y,color); Block((x*Menu_factor_X)+Window_pos_X,(y*Menu_factor_Y)+Window_pos_Y,Menu_factor_X,Menu_factor_Y,color);
} }
// Affichage d'un rectangle dans la fenêtre (la fenêtre doit être visible) // Affichage d'un rectangle dans la fenêtre (la fenêtre doit être visible)
void Window_rectangle(word x_pos,word y_pos,word width,word height,byte color) void Window_rectangle(word x_pos,word y_pos,word width,word height,byte color)
{ {
Block((x_pos*Menu_factor_X)+Window_pos_X,(y_pos*Menu_factor_Y)+Window_pos_Y,width*Menu_factor_X,height*Menu_factor_Y,color); Block((x_pos*Menu_factor_X)+Window_pos_X,(y_pos*Menu_factor_Y)+Window_pos_Y,width*Menu_factor_X,height*Menu_factor_Y,color);
} }
// -- Affichages de différents cadres dans une fenêtre ----------------------- // -- Affichages de différents cadres dans une fenêtre -----------------------
// -- Frame général avec couleurs paramètrables -- // -- Frame général avec couleurs paramètrables --
void Window_display_frame_generic(word x_pos,word y_pos,word width,word height, void Window_display_frame_generic(word x_pos,word y_pos,word width,word height,
byte color_tl,byte color_br,byte color_s,byte color_tlc,byte color_brc) byte color_tl,byte color_br,byte color_s,byte color_tlc,byte color_brc)
// Paramètres de couleurs: // Paramètres de couleurs:
// color_tl =Bords Haut et Gauche // color_tl =Bords Haut et Gauche
// color_br =Bords Bas et Droite // color_br =Bords Bas et Droite
// color_s =Coins Haut-Droite et Bas-Gauche // color_s =Coins Haut-Droite et Bas-Gauche
// color_tlc=Coin Haut-Gauche // color_tlc=Coin Haut-Gauche
// color_brc=Coin Bas-Droite // color_brc=Coin Bas-Droite
{ {
// Bord haut (sans les extrémités) // Bord haut (sans les extrémités)
Window_rectangle(x_pos+1,y_pos,width-2,1,color_tl); Window_rectangle(x_pos+1,y_pos,width-2,1,color_tl);
// Bord bas (sans les extrémités) // Bord bas (sans les extrémités)
Window_rectangle(x_pos+1,y_pos+height-1,width-2,1,color_br); Window_rectangle(x_pos+1,y_pos+height-1,width-2,1,color_br);
// Bord gauche (sans les extrémités) // Bord gauche (sans les extrémités)
Window_rectangle(x_pos, y_pos+1,1,height-2,color_tl); Window_rectangle(x_pos, y_pos+1,1,height-2,color_tl);
// Bord droite (sans les extrémités) // Bord droite (sans les extrémités)
Window_rectangle(x_pos+width-1,y_pos+1,1,height-2,color_br); Window_rectangle(x_pos+width-1,y_pos+1,1,height-2,color_br);
// Coin haut gauche // Coin haut gauche
@ -145,21 +145,21 @@ void Window_display_frame_mono(word x_pos,word y_pos,word width,word height,byte
Window_display_frame_generic(x_pos,y_pos,width,height,color,color,color,color,color); Window_display_frame_generic(x_pos,y_pos,width,height,color,color,color,color,color);
} }
// -- Frame creux: foncé en haut-gauche et clair en bas-droite -- // -- Frame creux: foncé en haut-gauche et clair en bas-droite --
void Window_display_frame_in(word x_pos,word y_pos,word width,word height) void Window_display_frame_in(word x_pos,word y_pos,word width,word height)
{ {
Window_display_frame_generic(x_pos,y_pos,width,height,MC_Dark,MC_White,MC_Light,MC_Dark,MC_White); Window_display_frame_generic(x_pos,y_pos,width,height,MC_Dark,MC_White,MC_Light,MC_Dark,MC_White);
} }
// -- Frame bombé: clair en haut-gauche et foncé en bas-droite -- // -- Frame bombé: clair en haut-gauche et foncé en bas-droite --
void Window_display_frame_out(word x_pos,word y_pos,word width,word height) void Window_display_frame_out(word x_pos,word y_pos,word width,word height)
{ {
Window_display_frame_generic(x_pos,y_pos,width,height,MC_White,MC_Dark,MC_Light,MC_White,MC_Dark); Window_display_frame_generic(x_pos,y_pos,width,height,MC_White,MC_Dark,MC_Light,MC_White,MC_Dark);
} }
// -- Frame de séparation: un cadre bombé dans un cadre creux (3D!!!) -- // -- Frame de séparation: un cadre bombé dans un cadre creux (3D!!!) --
void Window_display_frame(word x_pos,word y_pos,word width,word height) void Window_display_frame(word x_pos,word y_pos,word width,word height)
{ {
@ -168,7 +168,7 @@ void Window_display_frame(word x_pos,word y_pos,word width,word height)
} }
//-- 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 --
@ -438,19 +438,19 @@ void Change_palette_cells()
{ {
Menu_palette_cell_width = ((Screen_width/Menu_factor_X)-(MENU_WIDTH+2)) / Menu_cells_X; Menu_palette_cell_width = ((Screen_width/Menu_factor_X)-(MENU_WIDTH+2)) / Menu_cells_X;
// Si ça tient, c'est bon. Sinon, on retente avec une colonne de moins // Si ça tient, c'est bon. Sinon, on retente avec une colonne de moins
if (Menu_palette_cell_width>2) if (Menu_palette_cell_width>2)
break; break;
Menu_cells_X--; Menu_cells_X--;
} }
// Cale First_color_in_palette sur un multiple du nombre de cellules (arrondi inférieur) // Cale First_color_in_palette sur un multiple du nombre de cellules (arrondi inférieur)
if (Config.Palette_vertical) if (Config.Palette_vertical)
First_color_in_palette=First_color_in_palette/Menu_cells_X*Menu_cells_X; First_color_in_palette=First_color_in_palette/Menu_cells_X*Menu_cells_X;
else else
First_color_in_palette=First_color_in_palette/Menu_cells_Y*Menu_cells_Y; First_color_in_palette=First_color_in_palette/Menu_cells_Y*Menu_cells_Y;
// Si le nombre de cellules a beaucoup augmenté et qu'on était près de // Si le nombre de cellules a beaucoup augmenté et qu'on était près de
// la fin, il faut reculer First_color_in_palette pour montrer plein // la fin, il faut reculer First_color_in_palette pour montrer plein
// de couleurs. // de couleurs.
if ((int)First_color_in_palette+(Menu_cells_Y)*Menu_cells_X*2>=256) if ((int)First_color_in_palette+(Menu_cells_Y)*Menu_cells_X*2>=256)
@ -461,17 +461,17 @@ void Change_palette_cells()
First_color_in_palette=255/Menu_cells_Y*Menu_cells_Y-(Menu_cells_X-1)*Menu_cells_Y; First_color_in_palette=255/Menu_cells_Y*Menu_cells_Y-(Menu_cells_X-1)*Menu_cells_Y;
} }
// Mise à jour de la taille du bouton dans le menu. C'est pour pas que // Mise à jour de la taille du bouton dans le menu. C'est pour pas que
// la bordure noire soit active. // la bordure noire soit active.
Buttons_Pool[BUTTON_CHOOSE_COL].Width=(Menu_palette_cell_width*Menu_cells_X)-1; Buttons_Pool[BUTTON_CHOOSE_COL].Width=(Menu_palette_cell_width*Menu_cells_X)-1;
Buttons_Pool[BUTTON_CHOOSE_COL].Height=(MENU_HEIGHT-9)/Menu_cells_Y*Menu_cells_Y-1; Buttons_Pool[BUTTON_CHOOSE_COL].Height=(MENU_HEIGHT-9)/Menu_cells_Y*Menu_cells_Y-1;
} }
// Retrouve la couleur sur laquelle pointe le curseur souris. // Retrouve la couleur sur laquelle pointe le curseur souris.
// Cette fonction suppose qu'on a déja vérifié que le curseur est dans // Cette fonction suppose qu'on a déja vérifié que le curseur est dans
// la zone rectangulaire du BUTTON_CHOOSE_COL // la zone rectangulaire du BUTTON_CHOOSE_COL
// La fonction renvoie -1 si on est "trop à gauche" (pas possible) // La fonction renvoie -1 si on est "trop à gauche" (pas possible)
// ou après la couleur 255 (Ce qui peut arriver si la palette est affichée // ou après la couleur 255 (Ce qui peut arriver si la palette est affichée
// avec un nombre de lignes qui n'est pas une puissance de deux.) // avec un nombre de lignes qui n'est pas une puissance de deux.)
int Pick_color_in_palette() int Pick_color_in_palette()
{ {
@ -870,7 +870,7 @@ static const byte * Get_font_character_pixel(unsigned int c)
} }
} }
// -- 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,const char * str,byte text_color,byte background_color) void Print_general(short x,short y,const char * str,byte text_color,byte background_color)
{ {
@ -889,7 +889,7 @@ void Print_general(short x,short y,const char * str,byte text_color,byte backgro
real_x=0; // Position dans le buffer real_x=0; // Position dans le buffer
for (index=0;str[index]!='\0';index++) for (index=0;str[index]!='\0';index++)
{ {
// Pointeur sur le premier pixel du caractère // Pointeur sur le premier pixel du caractère
font_pixel=Menu_font+((unsigned char)str[index]<<6); font_pixel=Menu_font+((unsigned char)str[index]<<6);
for (x_pos=0;x_pos<8;x_pos+=1) for (x_pos=0;x_pos<8;x_pos+=1)
for (repeat_menu_x_factor=0;repeat_menu_x_factor<Menu_factor_X*Pixel_width;repeat_menu_x_factor++) for (repeat_menu_x_factor=0;repeat_menu_x_factor<Menu_factor_X*Pixel_width;repeat_menu_x_factor++)
@ -1093,11 +1093,11 @@ void Print_filename(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_counter(short x,short y,const char * str,byte text_color,byte background_color) void Print_counter(short x,short y,const char * str,byte text_color,byte background_color)
{ {
// 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) | \
@ -1554,10 +1554,10 @@ void Display_paintbrush_in_menu(void)
Draw_menu_button(BUTTON_PAINTBRUSHES,BUTTON_RELEASED); Draw_menu_button(BUTTON_PAINTBRUSHES,BUTTON_RELEASED);
} }
// -- Dessiner un pinceau prédéfini dans la fenêtre -- // -- Dessiner un pinceau prédéfini dans la fenêtre --
void Display_paintbrush_in_window(word x,word y,int number) void Display_paintbrush_in_window(word x,word y,int number)
// Pinceau = 0..NB_PAINTBRUSH_SPRITES-1 : Pinceau prédéfini // Pinceau = 0..NB_PAINTBRUSH_SPRITES-1 : Pinceau prédéfini
{ {
word x_pos; word x_pos;
word y_pos; word y_pos;
@ -1588,7 +1588,7 @@ void Display_paintbrush_in_window(word x,word y,int number)
if (Paintbrush[number].Sprite[y_pos][x_pos]) if (Paintbrush[number].Sprite[y_pos][x_pos])
Block(origin_x+window_x_pos*x_size,origin_y+window_y_pos*y_size,x_size,y_size,MC_Black); Block(origin_x+window_x_pos*x_size,origin_y+window_y_pos*y_size,x_size,y_size,MC_Black);
// On n'utilise pas Pixel_in_window() car on ne dessine pas // On n'utilise pas Pixel_in_window() car on ne dessine pas
// forcément avec la même taille de pixel. // forcément avec la même taille de pixel.
Update_rect( ToWinX(origin_x), ToWinY(origin_y), Update_rect( ToWinX(origin_x), ToWinY(origin_y),
ToWinL(Paintbrush[number].Width), ToWinL(Paintbrush[number].Width),
@ -1611,7 +1611,7 @@ void Draw_thingumajig(word x,word y, byte color, short direction)
Pixel_in_window(x,y+5,color); Pixel_in_window(x,y+5,color);
} }
// -- Dessiner un bloc de couleurs dégradé verticalement // -- Dessiner un bloc de couleurs dégradé verticalement
void Display_grad_block_in_window(word x_pos,word y_pos,word width,word height,word block_start,word block_end) void Display_grad_block_in_window(word x_pos,word y_pos,word width,word height,word block_start,word block_end)
{ {
@ -1641,7 +1641,7 @@ void Display_grad_block_in_window(word x_pos,word y_pos,word width,word height,w
// -- Dessiner un petit sprite représentant le type d'un drive -- // -- Dessiner un petit sprite représentant le type d'un drive --
void Window_display_icon_sprite(word x_pos,word y_pos,byte type) void Window_display_icon_sprite(word x_pos,word y_pos,byte type)
{ {
@ -1657,15 +1657,15 @@ void Window_display_icon_sprite(word x_pos,word y_pos,byte type)
void Display_menu_palette_avoiding_window(byte * table) void Display_menu_palette_avoiding_window(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!
word color,real_color; word color,real_color;
word start_x,start_y; word start_x,start_y;
word end_x,end_y; word end_x,end_y;
word width; word width;
word height; word height;
word corner_x=Window_pos_X+Window_width*Menu_factor_X; // |_ Coin bas-droit word corner_x=Window_pos_X+Window_width*Menu_factor_X; // |_ Coin bas-droit
word corner_y=Window_pos_Y+Window_height*Menu_factor_Y; // | de la fenêtre +1 word corner_y=Window_pos_Y+Window_height*Menu_factor_Y; // | de la fenêtre +1
if (Config.Separate_colors) if (Config.Separate_colors)
{ {
@ -1687,8 +1687,8 @@ void Display_menu_palette_avoiding_window(byte * table)
end_x=start_x+width; end_x=start_x+width;
end_y=start_y+height; end_y=start_y+height;
// 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 ( (start_y>=corner_y) || (end_x<=Window_pos_X) || (start_x>=corner_x) ) if ( (start_y>=corner_y) || (end_x<=Window_pos_X) || (start_x>=corner_x) )
Block(start_x,start_y,width,height,real_color); Block(start_x,start_y,width,height,real_color);
else else
@ -1742,12 +1742,12 @@ void Display_menu_palette_avoiding_window(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 x_pos; short x_pos;
short y_pos; short y_pos;
short relative_x; // besoin d'une variable signée short relative_x; // besoin d'une variable signée
short relative_y; // besoin d'une variable signée short relative_y; // besoin d'une variable signée
// Attention aux unités // Attention aux unités
relative_x = ((short)start_x - (short)Window_pos_X); relative_x = ((short)start_x - (short)Window_pos_X);
relative_y = ((short)start_y - (short)Window_pos_Y); relative_y = ((short)start_y - (short)Window_pos_Y);
@ -1761,15 +1761,15 @@ void Display_menu_palette_avoiding_window(byte * table)
Update_rect(MENU_WIDTH*Menu_factor_X,Menu_Y_before_window,Screen_width-(MENU_WIDTH*Menu_factor_X),(Menu_height-11)*Menu_factor_Y); Update_rect(MENU_WIDTH*Menu_factor_X,Menu_Y_before_window,Screen_width-(MENU_WIDTH*Menu_factor_X),(Menu_height-11)*Menu_factor_Y);
} }
// -------- Calcul des bornes de la partie d'image visible à l'écran --------- // -------- Calcul des bornes de la partie d'image visible à l'écran ---------
void Compute_limits(void) void Compute_limits(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 (Main.magnifier_mode) if (Main.magnifier_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 --
Limit_top =Main.offset_Y; Limit_top =Main.offset_Y;
Limit_left=Main.offset_X; Limit_left=Main.offset_X;
Limit_visible_bottom =Limit_top+Menu_Y-1; Limit_visible_bottom =Limit_top+Menu_Y-1;
@ -1785,7 +1785,7 @@ void Compute_limits(void)
else else
Limit_right=Limit_visible_right; Limit_right=Limit_visible_right;
// -- Calcul des limites de la partie zoomée de l'image -- // -- Calcul des limites de la partie zoomée de l'image --
Limit_top_zoom =Main.magnifier_offset_Y; Limit_top_zoom =Main.magnifier_offset_Y;
Limit_left_zoom=Main.magnifier_offset_X; Limit_left_zoom=Main.magnifier_offset_X;
Limit_visible_bottom_zoom =Limit_top_zoom+Main.magnifier_height-1; Limit_visible_bottom_zoom =Limit_top_zoom+Main.magnifier_height-1;
@ -1822,7 +1822,7 @@ void Compute_limits(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 Compute_paintbrush_coordinates(void) void Compute_paintbrush_coordinates(void)
{ {
if ((Main.magnifier_mode) && (Mouse_X>=Main.X_zoom)) if ((Main.magnifier_mode) && (Mouse_X>=Main.X_zoom))
@ -1900,7 +1900,7 @@ void Display_image_limits(void)
bottom_is_visible =Main.image_height<Menu_Y; bottom_is_visible =Main.image_height<Menu_Y;
// On vérifie que la limite à droite est visible: // On vérifie que la limite à droite est visible:
if (right_is_visible) if (right_is_visible)
{ {
start=Limit_top; start=Limit_top;
@ -1910,7 +1910,7 @@ void Display_image_limits(void)
if (bottom_is_visible) if (bottom_is_visible)
end++; end++;
// 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.
old_zoom_limit=Limit_right_zoom; old_zoom_limit=Limit_right_zoom;
Limit_right_zoom=Limit_visible_right_zoom; Limit_right_zoom=Limit_visible_right_zoom;
@ -1923,14 +1923,14 @@ void Display_image_limits(void)
Limit_right_zoom=old_zoom_limit; Limit_right_zoom=old_zoom_limit;
} }
// On vérifie que la limite en bas est visible: // On vérifie que la limite en bas est visible:
if (bottom_is_visible) if (bottom_is_visible)
{ {
start=Limit_left; start=Limit_left;
end=(Limit_right<Main.image_width)? end=(Limit_right<Main.image_width)?
Limit_right:Main.image_width; Limit_right:Main.image_width;
// On étend également les limites en bas (comme pour la limite droit) // On étend également les limites en bas (comme pour la limite droit)
old_zoom_limit=Limit_bottom_zoom; old_zoom_limit=Limit_bottom_zoom;
Limit_bottom_zoom=Limit_visible_bottom_zoom; Limit_bottom_zoom=Limit_visible_bottom_zoom;
@ -1946,7 +1946,7 @@ void Display_image_limits(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 Position_screen_according_to_zoom(void) void Position_screen_according_to_zoom(void)
{ {
@ -2022,7 +2022,7 @@ void Position_screen_according_to_position(int target_x, int target_y)
} }
// - 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 Compute_separator_data(void) void Compute_separator_data(void)
{ {
//short temp; //short temp;
@ -2031,13 +2031,13 @@ void Compute_separator_data(void)
Main.X_zoom=Screen_width-(((Screen_width+(Main.magnifier_factor>>1)-theoric_X)/Main.magnifier_factor)*Main.magnifier_factor); Main.X_zoom=Screen_width-(((Screen_width+(Main.magnifier_factor>>1)-theoric_X)/Main.magnifier_factor)*Main.magnifier_factor);
Main.separator_position=Main.X_zoom-(Menu_factor_X*SEPARATOR_WIDTH); Main.separator_position=Main.X_zoom-(Menu_factor_X*SEPARATOR_WIDTH);
// Correction en cas de débordement sur la gauche // Correction en cas de débordement sur la gauche
while (Main.separator_position*(Main.magnifier_factor+1)<Screen_width-(Menu_factor_X*SEPARATOR_WIDTH)) while (Main.separator_position*(Main.magnifier_factor+1)<Screen_width-(Menu_factor_X*SEPARATOR_WIDTH))
{ {
Main.separator_position+=Main.magnifier_factor; Main.separator_position+=Main.magnifier_factor;
Main.X_zoom+=Main.magnifier_factor; Main.X_zoom+=Main.magnifier_factor;
} }
// Correction en cas de débordement sur la droite // Correction en cas de débordement sur la droite
theoric_X=Screen_width-((NB_ZOOMED_PIXELS_MIN-1)*Main.magnifier_factor); theoric_X=Screen_width-((NB_ZOOMED_PIXELS_MIN-1)*Main.magnifier_factor);
while (Main.X_zoom>=theoric_X) while (Main.X_zoom>=theoric_X)
{ {
@ -2051,7 +2051,7 @@ void Compute_separator_data(void)
// -------------------- Calcul des information de la loupe ------------------- // -------------------- Calcul des information de la loupe -------------------
void Compute_magnifier_data(void) void Compute_magnifier_data(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.
*/ */
{ {
Compute_separator_data(); Compute_separator_data();
@ -2159,31 +2159,31 @@ void Copy_view_to_spare(void)
if (Main.image_width!=Spare.image_width || Main.image_height!=Spare.image_height) if (Main.image_width!=Spare.image_width || Main.image_height!=Spare.image_height)
return; return;
// Copie des décalages de la fenêtre principale (non zoomée) de l'image // Copie des décalages de la fenêtre principale (non zoomée) de l'image
Spare.offset_X=Main.offset_X; Spare.offset_X=Main.offset_X;
Spare.offset_Y=Main.offset_Y; Spare.offset_Y=Main.offset_Y;
// Copie du booléen "Mode loupe" de l'image // Copie du booléen "Mode loupe" de l'image
Spare.magnifier_mode=Main.magnifier_mode; Spare.magnifier_mode=Main.magnifier_mode;
// Copie du facteur de zoom du brouillon // Copie du facteur de zoom du brouillon
Spare.magnifier_factor=Main.magnifier_factor; Spare.magnifier_factor=Main.magnifier_factor;
// Copie des dimensions de la fenêtre de zoom // Copie des dimensions de la fenêtre de zoom
Spare.magnifier_width=Main.magnifier_width; Spare.magnifier_width=Main.magnifier_width;
Spare.magnifier_height=Main.magnifier_height; Spare.magnifier_height=Main.magnifier_height;
// Copie des décalages de la fenêtre de zoom // Copie des décalages de la fenêtre de zoom
Spare.magnifier_offset_X=Main.magnifier_offset_X; Spare.magnifier_offset_X=Main.magnifier_offset_X;
Spare.magnifier_offset_Y=Main.magnifier_offset_Y; Spare.magnifier_offset_Y=Main.magnifier_offset_Y;
// Copie des données du split du zoom // Copie des données du split du zoom
Spare.separator_position=Main.separator_position; Spare.separator_position=Main.separator_position;
Spare.X_zoom=Main.X_zoom; Spare.X_zoom=Main.X_zoom;
Spare.separator_proportion=Main.separator_proportion; Spare.separator_proportion=Main.separator_proportion;
} }
// -- 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 Display_separator(void) void Display_separator(void)
@ -2207,11 +2207,11 @@ void Display_separator(void)
Block(Main.separator_position+Menu_factor_X,Menu_factor_Y, Block(Main.separator_position+Menu_factor_X,Menu_factor_Y,
Menu_factor_X,(Menu_Y-(Menu_factor_Y<<1)),MC_White); Menu_factor_X,(Menu_Y-(Menu_factor_Y<<1)),MC_White);
// Bord droite (gris foncé) // Bord droite (gris foncé)
Block(Main.X_zoom-(Menu_factor_X<<1),Menu_factor_Y, Block(Main.X_zoom-(Menu_factor_X<<1),Menu_factor_Y,
Menu_factor_X,(Menu_Y-(Menu_factor_Y<<1)),MC_Dark); Menu_factor_X,(Menu_Y-(Menu_factor_Y<<1)),MC_Dark);
// Bord bas (gris foncé) // Bord bas (gris foncé)
Block(Main.separator_position+(Menu_factor_X<<1),Menu_Y-Menu_factor_Y, Block(Main.separator_position+(Menu_factor_X<<1),Menu_Y-Menu_factor_Y,
(SEPARATOR_WIDTH-3)*Menu_factor_X,Menu_factor_Y,MC_Dark); (SEPARATOR_WIDTH-3)*Menu_factor_X,Menu_factor_Y,MC_Dark);
@ -2222,7 +2222,7 @@ void Display_separator(void)
Block(Main.X_zoom-(Menu_factor_X<<1),0, Block(Main.X_zoom-(Menu_factor_X<<1),0,
Menu_factor_X,Menu_factor_Y,MC_Light); Menu_factor_X,Menu_factor_Y,MC_Light);
Update_rect(Main.separator_position,0,SEPARATOR_WIDTH*Menu_factor_X,Menu_Y); // On réaffiche toute la partie à gauche du split, ce qui permet d'effacer son ancienne position Update_rect(Main.separator_position,0,SEPARATOR_WIDTH*Menu_factor_X,Menu_Y); // On réaffiche toute la partie à gauche du split, ce qui permet d'effacer son ancienne position
} }
@ -2230,7 +2230,7 @@ void Display_separator(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 Horizontal_XOR_line_zoom(short x_pos, short y_pos, short width) void Horizontal_XOR_line_zoom(short x_pos, short y_pos, short width)
{ {
@ -2247,7 +2247,7 @@ void Horizontal_XOR_line_zoom(short x_pos, short y_pos, short width)
} }
// -- Afficher une barre verticale XOR zoomée // -- Afficher une barre verticale XOR zoomée
void Vertical_XOR_line_zoom(short x_pos, short y_pos, short height) void Vertical_XOR_line_zoom(short x_pos, short y_pos, short height)
{ {
@ -2281,7 +2281,7 @@ void Display_cursor(void)
float cos_a,sin_a; float cos_a,sin_a;
short x1,y1,x2,y2,x3,y3,x4,y4; short x1,y1,x2,y2,x3,y3,x4,y4;
// Si le curseur est dans le menu ou sur la barre de split, on affiche toujours une flèche. // Si le curseur est dans le menu ou sur la barre de split, on affiche toujours une flèche.
if ( ( (Mouse_Y<Menu_Y) if ( ( (Mouse_Y<Menu_Y)
&& ( (!Main.magnifier_mode) || (Mouse_X<Main.separator_position) || (Mouse_X>=Main.X_zoom) ) ) && ( (!Main.magnifier_mode) || (Mouse_X<Main.separator_position) || (Mouse_X>=Main.X_zoom) ) )
|| (Windows_open) || (Cursor_shape==CURSOR_SHAPE_HOURGLASS) ) || (Windows_open) || (Cursor_shape==CURSOR_SHAPE_HOURGLASS) )
@ -2365,7 +2365,7 @@ void Display_cursor(void)
if (end_y<3) if (end_y<3)
Vertical_XOR_line (Mouse_X,Mouse_Y+3,3-end_y); Vertical_XOR_line (Mouse_X,Mouse_Y+3,3-end_y);
// Petites barres aux extrémités // Petites barres aux extrémités
start_x=(!Mouse_X); start_x=(!Mouse_X);
start_y=(!Mouse_Y); start_y=(!Mouse_Y);
@ -2464,7 +2464,7 @@ void Display_cursor(void)
} }
break; break;
case CURSOR_SHAPE_XOR_RECTANGLE : case CURSOR_SHAPE_XOR_RECTANGLE :
// !!! 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
start_x=(Mouse_X-3); start_x=(Mouse_X-3);
@ -2573,7 +2573,7 @@ void Display_cursor(void)
void Hide_cursor(void) void Hide_cursor(void)
{ {
byte shape; byte shape;
int start_x; // int car sont parfois négatifs ! (quand on dessine sur un bord) int start_x; // int car sont parfois négatifs ! (quand on dessine sur un bord)
int start_y; int start_y;
short end_x; short end_x;
short end_y; short end_y;
@ -2762,7 +2762,7 @@ void Hide_cursor(void)
break; break;
case CURSOR_SHAPE_XOR_RECTANGLE : case CURSOR_SHAPE_XOR_RECTANGLE :
// !!! 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
start_x=(Mouse_X-3); start_x=(Mouse_X-3);
@ -2878,7 +2878,7 @@ void Display_all_screen(void)
word width; word width;
word height; word height;
// ---/\/\/\ Partie non zoomée: /\/\/\--- // ---/\/\/\ Partie non zoomée: /\/\/\---
if (Main.magnifier_mode) if (Main.magnifier_mode)
{ {
if (Main.image_width<Main.separator_position) if (Main.image_width<Main.separator_position)
@ -2899,7 +2899,7 @@ void Display_all_screen(void)
height=Menu_Y; height=Menu_Y;
Display_screen(width,height,Main.image_width); Display_screen(width,height,Main.image_width);
// 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 (Main.magnifier_mode) if (Main.magnifier_mode)
{ {
if (Main.image_width<Main.separator_position && Main.image_width < Screen_width) if (Main.image_width<Main.separator_position && Main.image_width < Screen_width)
@ -2913,7 +2913,7 @@ void Display_all_screen(void)
if (Main.image_height<Menu_Y) if (Main.image_height<Menu_Y)
Block(0,Main.image_height,width,(Menu_Y-height),Main.backups->Pages->Transparent_color); Block(0,Main.image_height,width,(Menu_Y-height),Main.backups->Pages->Transparent_color);
// ---/\/\/\ Partie zoomée: /\/\/\--- // ---/\/\/\ Partie zoomée: /\/\/\---
if (Main.magnifier_mode) if (Main.magnifier_mode)
{ {
// Affichage de la barre de split // Affichage de la barre de split
@ -2925,7 +2925,7 @@ void Display_all_screen(void)
else else
width=Main.magnifier_width; width=Main.magnifier_width;
// Calcul du nombre de lignes visibles de l'image zoomée // Calcul du nombre de lignes visibles de l'image zoomée
if (Main.image_height<Main.magnifier_height) if (Main.image_height<Main.magnifier_height)
height=Main.image_height*Main.magnifier_factor; height=Main.image_height*Main.magnifier_factor;
else if (Main.image_height<Main.magnifier_offset_Y+Main.magnifier_height) else if (Main.image_height<Main.magnifier_offset_Y+Main.magnifier_height)
@ -2936,7 +2936,7 @@ void Display_all_screen(void)
Display_zoomed_screen(width,height,Main.image_width,Horizontal_line_buffer); Display_zoomed_screen(width,height,Main.image_width,Horizontal_line_buffer);
// Effacement de la partie non-image dans la partie zoomée: // Effacement de la partie non-image dans la partie zoomée:
if (Main.image_width<Main.magnifier_width) if (Main.image_width<Main.magnifier_width)
Block(Main.X_zoom+(Main.image_width*Main.magnifier_factor),0, Block(Main.X_zoom+(Main.image_width*Main.magnifier_factor),0,
(Main.magnifier_width-Main.image_width)*Main.magnifier_factor, (Main.magnifier_width-Main.image_width)*Main.magnifier_factor,
@ -2948,7 +2948,7 @@ void Display_all_screen(void)
// ---/\/\/\ Affichage des limites /\/\/\--- // ---/\/\/\ Affichage des limites /\/\/\---
if (Config.Display_image_limits) if (Config.Display_image_limits)
Display_image_limits(); Display_image_limits();
Update_rect(0,0,Screen_width,Menu_Y); // 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 ? Update_rect(0,0,Screen_width,Menu_Y); // 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 ?
} }
@ -3156,7 +3156,7 @@ static byte Old_trans;
void Remap_pixel(byte * pixel) void Remap_pixel(byte * pixel)
{ {
if (*pixel==Old_light) // On commence par tester le Gris clair if (*pixel==Old_light) // On commence par tester le Gris clair
*pixel=MC_Light; // qui est pas mal utilisé. *pixel=MC_Light; // qui est pas mal utilisé.
else else
{ {
if (*pixel==Old_black) // Puis le Noir... if (*pixel==Old_black) // Puis le Noir...
@ -3191,7 +3191,7 @@ void Remap_screen_after_menu_colors_change(void)
if ( (MC_Light!=Old_light) || (MC_Dark!=Old_dark) || (MC_White!=Old_white) || (MC_Black !=Old_black ) if ( (MC_Light!=Old_light) || (MC_Dark!=Old_dark) || (MC_White!=Old_white) || (MC_Black !=Old_black )
|| (MC_Trans!=Old_trans) ) || (MC_Trans!=Old_trans) )
{ {
// Création de la table de conversion // Création de la table de conversion
for (index=0; index<256; index++) for (index=0; index<256; index++)
conversion_table[index]=index; conversion_table[index]=index;
@ -3200,7 +3200,7 @@ void Remap_screen_after_menu_colors_change(void)
conversion_table[Old_light]=MC_Light; conversion_table[Old_light]=MC_Light;
conversion_table[Old_white]=MC_White; conversion_table[Old_white]=MC_White;
// Remappage de l'écran // Remappage de l'écran
// remap only screen pixels covered by a window or the menu // remap only screen pixels covered by a window or the menu
for (pos_y = 0; pos_y < Screen_height; pos_y++) for (pos_y = 0; pos_y < Screen_height; pos_y++)
@ -3231,11 +3231,11 @@ void Remap_screen_after_menu_colors_change(void)
if (Menu_is_visible_before_window) if (Menu_is_visible_before_window)
{ {
/* /*
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
Display_menu_palette_avoiding_window(conversion_table); Display_menu_palette_avoiding_window(conversion_table);
} }
Clear_border(MC_Black); Clear_border(MC_Black);
@ -3369,7 +3369,7 @@ void Compute_optimal_menu_colors(T_Components * palette)
&& Round_palette_component(palette[i].B)/tolerence==Gfx->Default_palette[Gfx->Color[0]].B/tolerence) && Round_palette_component(palette[i].B)/tolerence==Gfx->Default_palette[Gfx->Color[0]].B/tolerence)
{ {
MC_Black=i; MC_Black=i;
// On cherche une couleur de transparence différente des 4 autres. // On cherche une couleur de transparence différente des 4 autres.
for (MC_Trans=0; ((MC_Trans==MC_Black) || (MC_Trans==MC_Dark) || for (MC_Trans=0; ((MC_Trans==MC_Black) || (MC_Trans==MC_Dark) ||
(MC_Trans==MC_Light) || (MC_Trans==MC_White)); MC_Trans++); (MC_Trans==MC_Light) || (MC_Trans==MC_White)); MC_Trans++);
// Easy case // Easy case
@ -3419,7 +3419,7 @@ void Compute_optimal_menu_colors(T_Components * palette)
&& Round_palette_component(palette[i].B)/tolerence==cpc_colors[0].B/tolerence) && Round_palette_component(palette[i].B)/tolerence==cpc_colors[0].B/tolerence)
{ {
MC_Black=i; MC_Black=i;
// On cherche une couleur de transparence différente des 4 autres. // On cherche une couleur de transparence différente des 4 autres.
for (MC_Trans=0; ((MC_Trans==MC_Black) || (MC_Trans==MC_Dark) || for (MC_Trans=0; ((MC_Trans==MC_Black) || (MC_Trans==MC_Dark) ||
(MC_Trans==MC_Light) || (MC_Trans==MC_White)); MC_Trans++); (MC_Trans==MC_Light) || (MC_Trans==MC_White)); MC_Trans++);
// Easy case // Easy case
@ -3510,16 +3510,16 @@ void Compute_optimal_menu_colors(T_Components * palette)
// SWAP_BYTES(MC_Light, MC_Dark) // SWAP_BYTES(MC_Light, MC_Dark)
//} //}
// Si deux des couleurs choisies ont le même index, c'est destructif car // Si deux des couleurs choisies ont le même index, c'est destructif car
// on fait ensuite un remap de l'image. Donc on évite ce problème (un // on fait ensuite un remap de l'image. Donc on évite ce problème (un
// peu brutalement) // peu brutalement)
// On commence par déplacer les gris, comme ça on a plus de chances de garder au moins // On commence par déplacer les gris, comme ça on a plus de chances de garder au moins
// le blanc et le noir // le blanc et le noir
//while (MC_Dark == MC_Light || MC_Dark == MC_White || MC_Black == MC_Dark || Same_color(palette, MC_Dark, MC_White)) MC_Dark--; //while (MC_Dark == MC_Light || MC_Dark == MC_White || MC_Black == MC_Dark || Same_color(palette, MC_Dark, MC_White)) MC_Dark--;
//while (MC_White == MC_Light || MC_Dark == MC_Light || MC_Black == MC_Light || Same_color(palette, MC_Light, MC_Black)) MC_Light--; //while (MC_White == MC_Light || MC_Dark == MC_Light || MC_Black == MC_Light || Same_color(palette, MC_Light, MC_Black)) MC_Light--;
//while (MC_White == MC_Light || MC_Dark == MC_White || MC_Black == MC_White) MC_White--; //while (MC_White == MC_Light || MC_Dark == MC_White || MC_Black == MC_White) MC_White--;
// On cherche une couleur de transparence différente des 4 autres. // On cherche une couleur de transparence différente des 4 autres.
for (MC_Trans=0; ((MC_Trans==MC_Black) || (MC_Trans==MC_Dark) || for (MC_Trans=0; ((MC_Trans==MC_Black) || (MC_Trans==MC_Dark) ||
(MC_Trans==MC_Light) || (MC_Trans==MC_White)); MC_Trans++); (MC_Trans==MC_Light) || (MC_Trans==MC_White)); MC_Trans++);