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:
parent
6731a57999
commit
92facef46d
@ -2,7 +2,7 @@
|
||||
#
|
||||
# Copyright 2018 Thomas Bernard
|
||||
# Copyright 2012 Franck Charlet
|
||||
# Copyright 2011 Pawel Góralski
|
||||
# Copyright 2011 Pawel Góralski
|
||||
# Copyright 2009 Per Olofsson
|
||||
# Copyright 2008 Peter Gordon
|
||||
# Copyright 2008-2010 Yves Rizoud
|
||||
|
||||
136
src/brush.c
136
src/brush.c
@ -42,8 +42,8 @@ static byte * Brush_rotate_buffer;
|
||||
static int Brush_rotate_width;
|
||||
static int Brush_rotate_height;
|
||||
|
||||
// Calcul de redimensionnement du pinceau pour éviter les débordements de
|
||||
// l'écran et de l'image
|
||||
// Calcul de redimensionnement du pinceau pour éviter les débordements de
|
||||
// l'écran et de l'image
|
||||
void Compute_clipped_dimensions(short * x,short * y,short * width,short * height)
|
||||
{
|
||||
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
|
||||
// de l'écran zoomé et de l'image --
|
||||
// -- Calcul de redimensionnement du pinceau pour éviter les débordements
|
||||
// de l'écran zoomé et de l'image --
|
||||
|
||||
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)
|
||||
void Display_paintbrush(short x,short y,byte color)
|
||||
// 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
|
||||
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
|
||||
short width; // width dans l'écran selon laquelle on affiche la
|
||||
short width; // width dans l'écran selon laquelle on affiche la
|
||||
// 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
|
||||
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
|
||||
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
|
||||
byte * temp;
|
||||
|
||||
@ -256,19 +256,19 @@ void Display_paintbrush(short x,short y,byte color)
|
||||
/// Draw the paintbrush in the image buffer
|
||||
void Draw_paintbrush(short x,short y,byte color)
|
||||
// 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
|
||||
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
|
||||
short width; // width dans l'écran selon laquelle on affiche la
|
||||
short width; // width dans l'écran selon laquelle on affiche la
|
||||
// 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
|
||||
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
|
||||
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
|
||||
short x_pos; // Position X (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
|
||||
short counter_y; // Position Y (dans la brosse/pinceau) en cours
|
||||
// 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
|
||||
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
|
||||
byte temp_color; // color de la brosse en cours d'affichage
|
||||
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)
|
||||
// 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
|
||||
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
|
||||
short width; // width dans l'écran selon laquelle on affiche la
|
||||
short width; // width dans l'écran selon laquelle on affiche la
|
||||
// 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
|
||||
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
|
||||
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
|
||||
//short x_pos; // Position X (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))
|
||||
{
|
||||
// On met les décalages du tiling à 0 pour eviter toute incohérence.
|
||||
// Si par hasard on voulait les mettre à
|
||||
// On met les décalages du tiling à 0 pour eviter toute incohérence.
|
||||
// Si par hasard on voulait les mettre à
|
||||
// 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_Y=0;
|
||||
|
||||
@ -922,7 +922,7 @@ void Remap_brush(void)
|
||||
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++)
|
||||
Brush_colormap[color]=0;
|
||||
|
||||
@ -931,18 +931,18 @@ void Remap_brush(void)
|
||||
for (x_pos=0;x_pos<Brush_width;x_pos++)
|
||||
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
|
||||
// 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
|
||||
// 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
|
||||
// ainsi on ne s'embêtera pas à la recalculer
|
||||
Brush_colormap[Back_color]=0;
|
||||
|
||||
// On va maintenant se servir de la table comme table de
|
||||
// conversion: pour chaque indice, la table donne une couleur de
|
||||
// remplacement.
|
||||
// Note : Seules les couleurs utilisées on besoin d'êtres recalculées: les
|
||||
// autres ne seront jamais consultées dans la nouvelle table de
|
||||
// Note : Seules les couleurs utilisées on besoin d'êtres recalculées: les
|
||||
// autres ne seront jamais consultées dans la nouvelle table de
|
||||
// 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++)
|
||||
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);
|
||||
}
|
||||
|
||||
// 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
|
||||
// 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
|
||||
// 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.
|
||||
// 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
|
||||
// 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
|
||||
// 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.
|
||||
Brush_colormap[Back_color]=Back_color;
|
||||
|
||||
// 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.
|
||||
Remap_general_lowlevel(Brush_colormap,Brush_original_pixels,Brush,Brush_width,Brush_height,Brush_width);
|
||||
|
||||
@ -996,7 +996,7 @@ void Outline_brush(void)
|
||||
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);
|
||||
|
||||
// On copie la brosse courante dans la nouvelle
|
||||
@ -1005,7 +1005,7 @@ void Outline_brush(void)
|
||||
Brush, // Destination
|
||||
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)
|
||||
{
|
||||
// 1er balayage (horizontal)
|
||||
@ -1028,12 +1028,12 @@ void Outline_brush(void)
|
||||
state=1;
|
||||
}
|
||||
}
|
||||
// Cas du dernier pixel à droite de la ligne
|
||||
// Cas du dernier pixel à droite de la ligne
|
||||
if (state != 0)
|
||||
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++)
|
||||
{
|
||||
state=0;
|
||||
@ -1069,7 +1069,7 @@ void Outline_brush(void)
|
||||
Brush_offset_X=(Brush_width>>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)
|
||||
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++)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
// On clippe ces bornes à l'écran:
|
||||
// On clippe ces bornes à l'écran:
|
||||
if (start_x<Limit_left)
|
||||
start_x=Limit_left;
|
||||
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))
|
||||
{
|
||||
// On met les décalages du tiling à 0 pour eviter toute incohérence.
|
||||
// Si par hasard on voulait les mettre à
|
||||
// On met les décalages du tiling à 0 pour eviter toute incohérence.
|
||||
// Si par hasard on voulait les mettre à
|
||||
// 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_Y=0;
|
||||
|
||||
@ -1260,7 +1260,7 @@ void Capture_brush_with_lasso(int vertices, short * points,short clear)
|
||||
points[0],points[1],
|
||||
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:
|
||||
for (y_pos=start_y;y_pos<=end_y;y_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_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_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;
|
||||
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_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 (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]))
|
||||
{
|
||||
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
|
||||
{
|
||||
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_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;
|
||||
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_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 (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]))
|
||||
{
|
||||
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
|
||||
{
|
||||
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_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[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++)
|
||||
{
|
||||
ScanY_X[0][y]=NAN ;
|
||||
@ -1947,7 +1947,7 @@ void Rotate_brush(float angle)
|
||||
float cos_a=cos(angle);
|
||||
float sin_a=sin(angle);
|
||||
|
||||
// Calcul des coordonnées des 4 coins:
|
||||
// Calcul des coordonnées des 4 coins:
|
||||
// 1 2
|
||||
// 3 4
|
||||
|
||||
@ -1978,7 +1978,7 @@ void Rotate_brush(float angle)
|
||||
Error(0);
|
||||
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,
|
||||
x1,y1, offset, 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[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++)
|
||||
{
|
||||
ScanY_X[0][y]=NAN;
|
||||
@ -2086,7 +2086,7 @@ void Rotate_brush_preview(float angle)
|
||||
float sin_a=sin(angle);
|
||||
int offset=0;
|
||||
|
||||
// Calcul des coordonnées des 4 coins:
|
||||
// Calcul des coordonnées des 4 coins:
|
||||
// 1 2
|
||||
// 3 4
|
||||
|
||||
@ -2110,7 +2110,7 @@ void Rotate_brush_preview(float angle)
|
||||
x4+=Brush_rotation_center_X;
|
||||
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,
|
||||
x1, y1, offset, offset,
|
||||
x2, y2, Brush_rotate_width-offset-1, offset,
|
||||
|
||||
202
src/brush_ops.c
202
src/brush_ops.c
@ -47,20 +47,20 @@ void Return_to_draw_mode(void)
|
||||
{
|
||||
|
||||
// Comme l'enclenchement du bouton efface le curseur, il faut l'afficher au
|
||||
// préalable:
|
||||
// préalable:
|
||||
Display_cursor();
|
||||
if (Mouse_K)
|
||||
Wait_end_of_click();
|
||||
// !!! 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)
|
||||
{
|
||||
// On se place en mode Dessin discontinu à la main
|
||||
// On se place en mode Dessin discontinu à la main
|
||||
while (Current_operation!=OPERATION_DISCONTINUOUS_DRAW)
|
||||
Select_button(BUTTON_DRAW,RIGHT_SIDE);
|
||||
}
|
||||
// Maintenant, il faut réeffacer le curseur parce qu'il sera raffiché en fin
|
||||
// d'appel à cette action:
|
||||
// Maintenant, il faut réeffacer le curseur parce qu'il sera raffiché en fin
|
||||
// d'appel à cette action:
|
||||
Hide_cursor();
|
||||
|
||||
// On passe en brosse couleur:
|
||||
@ -76,40 +76,40 @@ void Return_to_draw_mode(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
|
||||
// Taille_Pile : 0
|
||||
//
|
||||
// Souris effacée: Oui
|
||||
// Souris effacée: Oui
|
||||
|
||||
{
|
||||
|
||||
// On passe en mode loupe
|
||||
Main.magnifier_mode=1;
|
||||
|
||||
// La fonction d'affichage dans la partie image est désormais un affichage
|
||||
// spécial loupe.
|
||||
// La fonction d'affichage dans la partie image est désormais un affichage
|
||||
// spécial loupe.
|
||||
Pixel_preview=Pixel_preview_magnifier;
|
||||
|
||||
// On calcule l'origine de la loupe
|
||||
Main.magnifier_offset_X=Mouse_X-(Main.magnifier_width>>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_Y+=Main.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();
|
||||
Compute_limits();
|
||||
Display_all_screen();
|
||||
|
||||
// Repositionner le curseur en fonction des coordonnées visibles
|
||||
// Repositionner le curseur en fonction des coordonnées visibles
|
||||
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);
|
||||
Display_cursor();
|
||||
Wait_end_of_click();
|
||||
@ -121,11 +121,11 @@ void Magnifier_12_0(void)
|
||||
|
||||
void Colorpicker_12_0(void)
|
||||
//
|
||||
// Opération : OPERATION_COLORPICK
|
||||
// Opération : OPERATION_COLORPICK
|
||||
// Click Souris: 1 ou 2
|
||||
// Taille_Pile : 0
|
||||
//
|
||||
// Souris effacée: Oui
|
||||
// Souris effacée: Oui
|
||||
//
|
||||
{
|
||||
Init_start_operation();
|
||||
@ -144,11 +144,11 @@ void Colorpicker_12_0(void)
|
||||
|
||||
void Colorpicker_1_1(void)
|
||||
//
|
||||
// Opération : OPERATION_COLORPICK
|
||||
// Opération : OPERATION_COLORPICK
|
||||
// Click Souris: 1
|
||||
// Taille_Pile : 1
|
||||
//
|
||||
// Souris effacée: Non
|
||||
// Souris effacée: Non
|
||||
//
|
||||
{
|
||||
char str[4];
|
||||
@ -186,11 +186,11 @@ void Colorpicker_1_1(void)
|
||||
|
||||
void Colorpicker_2_1(void)
|
||||
//
|
||||
// Opération : OPERATION_COLORPICK
|
||||
// Opération : OPERATION_COLORPICK
|
||||
// Click Souris: 2
|
||||
// Taille_Pile : 1
|
||||
//
|
||||
// Souris effacée: Non
|
||||
// Souris effacée: Non
|
||||
//
|
||||
{
|
||||
char str[4];
|
||||
@ -229,11 +229,11 @@ void Colorpicker_2_1(void)
|
||||
|
||||
void Colorpicker_0_1(void)
|
||||
//
|
||||
// Opération : OPERATION_COLORPICK
|
||||
// Opération : OPERATION_COLORPICK
|
||||
// Click Souris: 0
|
||||
// Taille_Pile : 1
|
||||
//
|
||||
// Souris effacée: Oui
|
||||
// Souris effacée: Oui
|
||||
//
|
||||
{
|
||||
short click;
|
||||
@ -287,11 +287,11 @@ byte Rightclick_colorpick(byte cursor_visible)
|
||||
|
||||
void Rightclick_colorpick_2_1(void)
|
||||
//
|
||||
// Opération : OPERATION_RMB_COLORPICK
|
||||
// Opération : OPERATION_RMB_COLORPICK
|
||||
// Click Souris: 2
|
||||
// Taille_Pile : 1
|
||||
//
|
||||
// Souris effacée: Non
|
||||
// Souris effacée: Non
|
||||
//
|
||||
{
|
||||
char str[4];
|
||||
@ -323,11 +323,11 @@ void Rightclick_colorpick_2_1(void)
|
||||
|
||||
void Rightclick_colorpick_0_1(void)
|
||||
//
|
||||
// Opération : OPERATION_RMB_COLORPICK
|
||||
// Opération : OPERATION_RMB_COLORPICK
|
||||
// Click Souris: 0
|
||||
// Taille_Pile : 1
|
||||
//
|
||||
// Souris effacée: Non
|
||||
// Souris effacée: Non
|
||||
//
|
||||
{
|
||||
short dummy;
|
||||
@ -356,31 +356,31 @@ void Rightclick_colorpick_0_1(void)
|
||||
|
||||
void Brush_12_0(void)
|
||||
//
|
||||
// Opération : OPERATION_GRAB_BRUSH
|
||||
// Opération : OPERATION_GRAB_BRUSH
|
||||
// Click Souris: 1 ou 2
|
||||
// Taille_Pile : 0
|
||||
//
|
||||
// Souris effacée: Oui
|
||||
// Souris effacée: Oui
|
||||
//
|
||||
{
|
||||
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);
|
||||
// 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();
|
||||
}
|
||||
else
|
||||
Operation_push(0);
|
||||
|
||||
// On laisse une trace du curseur pour que l'utilisateur puisse visualiser
|
||||
// où demarre sa brosse:
|
||||
// où demarre sa brosse:
|
||||
Display_cursor();
|
||||
|
||||
Operation_push(Paintbrush_X); // Début X
|
||||
Operation_push(Paintbrush_Y); // Début Y
|
||||
Operation_push(Paintbrush_X); // Dernière position X
|
||||
Operation_push(Paintbrush_Y); // Dernière position Y
|
||||
Operation_push(Paintbrush_X); // Début X
|
||||
Operation_push(Paintbrush_Y); // Début Y
|
||||
Operation_push(Paintbrush_X); // Dernière position X
|
||||
Operation_push(Paintbrush_Y); // Dernière position Y
|
||||
|
||||
if ((Config.Coords_rel) && (Menu_is_visible))
|
||||
Print_in_menu("\035: 1 \022: 1",0);
|
||||
@ -389,11 +389,11 @@ void Brush_12_0(void)
|
||||
|
||||
void Brush_12_5(void)
|
||||
//
|
||||
// Opération : OPERATION_GRAB_BRUSH
|
||||
// Opération : OPERATION_GRAB_BRUSH
|
||||
// Click Souris: 1 ou 2
|
||||
// Taille_Pile : 5
|
||||
//
|
||||
// Souris effacée: Non
|
||||
// Souris effacée: Non
|
||||
//
|
||||
{
|
||||
char str[5];
|
||||
@ -435,11 +435,11 @@ void Brush_12_5(void)
|
||||
|
||||
void Brush_0_5(void)
|
||||
//
|
||||
// Opération : OPERATION_GRAB_BRUSH
|
||||
// Opération : OPERATION_GRAB_BRUSH
|
||||
// Click Souris: 0
|
||||
// Taille_Pile : 5
|
||||
//
|
||||
// Souris effacée: Oui
|
||||
// Souris effacée: Oui
|
||||
//
|
||||
{
|
||||
short start_x;
|
||||
@ -448,7 +448,7 @@ void Brush_0_5(void)
|
||||
short old_paintbrush_y;
|
||||
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.
|
||||
|
||||
Operation_stack_size-=2;
|
||||
@ -461,7 +461,7 @@ void Brush_0_5(void)
|
||||
old_paintbrush_y=Paintbrush_Y;
|
||||
Paintbrush_X=start_x;
|
||||
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_Y=old_paintbrush_y;
|
||||
@ -500,11 +500,11 @@ void Brush_0_5(void)
|
||||
|
||||
|
||||
void Polybrush_12_8(void)
|
||||
// Opération : OPERATION_POLYBRUSH
|
||||
// Opération : OPERATION_POLYBRUSH
|
||||
// Click Souris: 1 ou 2
|
||||
// Taille_Pile : 8
|
||||
//
|
||||
// Souris effacée: Non
|
||||
// Souris effacée: Non
|
||||
{
|
||||
short click;
|
||||
short end_y;
|
||||
@ -528,13 +528,13 @@ void Polybrush_12_8(void)
|
||||
if (((start_x!=Paintbrush_X) || (start_y!=Paintbrush_Y)) &&
|
||||
(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)
|
||||
|
||||
Hide_cursor();
|
||||
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,Paintbrush_X,Paintbrush_Y,0);
|
||||
|
||||
@ -563,13 +563,13 @@ void Polybrush_12_8(void)
|
||||
Hide_cursor();
|
||||
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,Paintbrush_X,Paintbrush_Y,0);
|
||||
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_y);
|
||||
Operation_push(Paintbrush_X);
|
||||
@ -588,7 +588,7 @@ void Polybrush_12_8(void)
|
||||
}
|
||||
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(&initial_y);
|
||||
@ -607,8 +607,8 @@ void Polybrush_12_8(void)
|
||||
if (click==RIGHT_SIDE)
|
||||
End_of_modification();
|
||||
|
||||
// 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.
|
||||
// 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.
|
||||
Display_all_screen();
|
||||
|
||||
Paintbrush_hidden=0;
|
||||
@ -630,27 +630,27 @@ void Polybrush_12_8(void)
|
||||
|
||||
void Stretch_brush_12_0(void)
|
||||
//
|
||||
// Opération : OPERATION_STRETCH_BRUSH
|
||||
// Opération : OPERATION_STRETCH_BRUSH
|
||||
// Click Souris: 1 ou 2
|
||||
// Taille_Pile : 0
|
||||
//
|
||||
// Souris effacée: Oui
|
||||
// Souris effacée: Oui
|
||||
//
|
||||
{
|
||||
Init_start_operation();
|
||||
if (Mouse_K==LEFT_SIDE)
|
||||
{
|
||||
// On laisse une trace du curseur pour que l'utilisateur puisse visualiser
|
||||
// où demarre sa brosse:
|
||||
// où demarre sa brosse:
|
||||
Display_cursor();
|
||||
|
||||
Operation_push(Paintbrush_X); // Dernier calcul X
|
||||
Operation_push(Paintbrush_Y); // Dernier calcul Y
|
||||
Operation_push(Paintbrush_X); // Début X
|
||||
Operation_push(Paintbrush_Y); // Début Y
|
||||
Operation_push(Paintbrush_X); // Dernière position X
|
||||
Operation_push(Paintbrush_Y); // Dernière position Y
|
||||
Operation_push(1); // State précédent
|
||||
Operation_push(Paintbrush_X); // Début X
|
||||
Operation_push(Paintbrush_Y); // Début Y
|
||||
Operation_push(Paintbrush_X); // Dernière position X
|
||||
Operation_push(Paintbrush_Y); // Dernière position Y
|
||||
Operation_push(1); // State précédent
|
||||
|
||||
if ((Config.Coords_rel) && (Menu_is_visible))
|
||||
Print_in_menu("\035: 1 \022: 1",0);
|
||||
@ -666,11 +666,11 @@ void Stretch_brush_12_0(void)
|
||||
|
||||
void Stretch_brush_1_7(void)
|
||||
//
|
||||
// Opération : OPERATION_STRETCH_BRUSH
|
||||
// Opération : OPERATION_STRETCH_BRUSH
|
||||
// Click Souris: 1
|
||||
// Taille_Pile : 7
|
||||
//
|
||||
// Souris effacée: Non
|
||||
// Souris effacée: Non
|
||||
//
|
||||
{
|
||||
char str[5];
|
||||
@ -756,11 +756,11 @@ void Stretch_brush_1_7(void)
|
||||
|
||||
void Stretch_brush_0_7(void)
|
||||
//
|
||||
// Opération : OPERATION_STRETCH_BRUSH
|
||||
// Opération : OPERATION_STRETCH_BRUSH
|
||||
// Click Souris: 0
|
||||
// Taille_Pile : 7
|
||||
//
|
||||
// Souris effacée: Non
|
||||
// Souris effacée: Non
|
||||
//
|
||||
{
|
||||
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
|
||||
// à 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)
|
||||
{
|
||||
size_change=1;
|
||||
@ -817,15 +817,15 @@ void Stretch_brush_0_7(void)
|
||||
width=start_x+Brush_width-1;
|
||||
height=start_y+(Brush_height<<1)-1;
|
||||
break;
|
||||
case 'h': // Moitié
|
||||
case 'h': // Moitié
|
||||
width=(Brush_width>1)?start_x+(Brush_width>>1)-1:1;
|
||||
height=(Brush_height>1)?start_y+(Brush_height>>1)-1:1;
|
||||
break;
|
||||
case 'X': // Moitié X
|
||||
case 'X': // Moitié X
|
||||
width=(Brush_width>1)?start_x+(Brush_width>>1)-1:1;
|
||||
height=start_y+Brush_height-1;
|
||||
break;
|
||||
case 'Y': // Moitié Y
|
||||
case 'Y': // Moitié Y
|
||||
width=start_x+Brush_width-1;
|
||||
height=(Brush_height>1)?start_y+(Brush_height>>1)-1:1;
|
||||
break;
|
||||
@ -872,11 +872,11 @@ void Stretch_brush_0_7(void)
|
||||
|
||||
void Stretch_brush_2_7(void)
|
||||
//
|
||||
// Opération : OPERATION_STRETCH_BRUSH
|
||||
// Opération : OPERATION_STRETCH_BRUSH
|
||||
// Click Souris: 2
|
||||
// Taille_Pile : 7
|
||||
//
|
||||
// Souris effacée: Oui
|
||||
// Souris effacée: Oui
|
||||
//
|
||||
{
|
||||
short computed_x;
|
||||
@ -894,7 +894,7 @@ void Stretch_brush_2_7(void)
|
||||
// On efface la preview de la brosse (et la croix)
|
||||
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);
|
||||
|
||||
Return_to_draw_mode();
|
||||
@ -906,11 +906,11 @@ void Stretch_brush_2_7(void)
|
||||
|
||||
void Rotate_brush_12_0(void)
|
||||
//
|
||||
// Opération : OPERATION_ROTATE_BRUSH
|
||||
// Opération : OPERATION_ROTATE_BRUSH
|
||||
// Click Souris: 1 ou 2
|
||||
// Taille_Pile : 0
|
||||
//
|
||||
// Souris effacée: Oui
|
||||
// Souris effacée: Oui
|
||||
//
|
||||
{
|
||||
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_Y=Paintbrush_Y;
|
||||
Brush_rotation_center_is_defined=1;
|
||||
Operation_push(Paintbrush_X); // Dernière position calculée X
|
||||
Operation_push(Paintbrush_Y); // Dernière position calculée Y
|
||||
Operation_push(Paintbrush_X); // Dernière position X
|
||||
Operation_push(Paintbrush_Y); // Dernière position Y
|
||||
Operation_push(1); // State précédent
|
||||
Operation_push(Paintbrush_X); // Dernière position calculée X
|
||||
Operation_push(Paintbrush_Y); // Dernière position calculée Y
|
||||
Operation_push(Paintbrush_X); // Dernière position X
|
||||
Operation_push(Paintbrush_Y); // Dernière position Y
|
||||
Operation_push(1); // State précédent
|
||||
|
||||
if ((Config.Coords_rel) && (Menu_is_visible))
|
||||
Print_in_menu("Angle: 0\xb0 ",0);
|
||||
@ -931,7 +931,7 @@ void Rotate_brush_12_0(void)
|
||||
else
|
||||
{
|
||||
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)
|
||||
//
|
||||
// Opération : OPERATION_ROTATE_BRUSH
|
||||
// Opération : OPERATION_ROTATE_BRUSH
|
||||
// Click Souris: 1
|
||||
// Taille_Pile : 5
|
||||
//
|
||||
// Souris effacée: Non
|
||||
// Souris effacée: Non
|
||||
//
|
||||
{
|
||||
char str[4];
|
||||
@ -958,7 +958,7 @@ void Rotate_brush_1_5(void)
|
||||
Operation_pop(&old_y);
|
||||
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_y = Paintbrush_Y;
|
||||
if(SDL_GetModState() & KMOD_SHIFT)
|
||||
@ -1006,11 +1006,11 @@ void Rotate_brush_1_5(void)
|
||||
|
||||
void Rotate_brush_0_5(void)
|
||||
//
|
||||
// Opération : OPERATION_ROTATE_BRUSH
|
||||
// Opération : OPERATION_ROTATE_BRUSH
|
||||
// Click Souris: 0
|
||||
// Taille_Pile : 5
|
||||
//
|
||||
// Souris effacée: Non
|
||||
// Souris effacée: Non
|
||||
//
|
||||
{
|
||||
char str[4];
|
||||
@ -1029,7 +1029,7 @@ void Rotate_brush_0_5(void)
|
||||
Operation_pop(&old_y);
|
||||
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_y = Paintbrush_Y;
|
||||
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
|
||||
// à 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)
|
||||
{
|
||||
angle_change=1;
|
||||
@ -1106,11 +1106,11 @@ void Rotate_brush_0_5(void)
|
||||
|
||||
void Rotate_brush_2_5(void)
|
||||
//
|
||||
// Opération : OPERATION_ROTATE_BRUSH
|
||||
// Opération : OPERATION_ROTATE_BRUSH
|
||||
// Click Souris: 2
|
||||
// Taille_Pile : 5
|
||||
//
|
||||
// Souris effacée: Oui
|
||||
// Souris effacée: Oui
|
||||
//
|
||||
{
|
||||
short computed_x;
|
||||
@ -1126,7 +1126,7 @@ void Rotate_brush_2_5(void)
|
||||
Operation_pop(&computed_y);
|
||||
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)
|
||||
&& (Brush_rotation_center_Y==computed_y) )
|
||||
angle=0.0;
|
||||
@ -1138,7 +1138,7 @@ void Rotate_brush_2_5(void)
|
||||
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);
|
||||
|
||||
Return_to_draw_mode();
|
||||
@ -1161,11 +1161,11 @@ void Draw_stretch_spot(short x_pos, short y_pos)
|
||||
|
||||
void Distort_brush_0_0(void)
|
||||
//
|
||||
// Opération : OPERATION_DISTORT_BRUSH
|
||||
// Opération : OPERATION_DISTORT_BRUSH
|
||||
// Click Souris: 0
|
||||
// Taille_Pile : 0
|
||||
//
|
||||
// Souris effacée: Non
|
||||
// Souris effacée: Non
|
||||
//
|
||||
{
|
||||
if ( Menu_is_visible )
|
||||
@ -1176,11 +1176,11 @@ void Distort_brush_0_0(void)
|
||||
|
||||
void Distort_brush_1_0(void)
|
||||
//
|
||||
// Opération : OPERATION_DISTORT_BRUSH
|
||||
// Opération : OPERATION_DISTORT_BRUSH
|
||||
// Click Souris: 1
|
||||
// Taille_Pile : 0
|
||||
//
|
||||
// Souris effacée: Non
|
||||
// Souris effacée: Non
|
||||
//
|
||||
{
|
||||
short x_pos, y_pos;
|
||||
@ -1235,11 +1235,11 @@ void Distort_brush_1_0(void)
|
||||
|
||||
void Distort_brush_1_8(void)
|
||||
//
|
||||
// Opération : OPERATION_DISTORT_BRUSH
|
||||
// Opération : OPERATION_DISTORT_BRUSH
|
||||
// Click Souris: 1
|
||||
// Taille_Pile : 8
|
||||
//
|
||||
// Souris effacée: No
|
||||
// Souris effacée: No
|
||||
//
|
||||
{
|
||||
// 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)
|
||||
//
|
||||
// Opération : OPERATION_DISTORT_BRUSH
|
||||
// Opération : OPERATION_DISTORT_BRUSH
|
||||
// Click Souris: 1
|
||||
// Taille_Pile : 9
|
||||
//
|
||||
// Souris effacée: No
|
||||
// Souris effacée: No
|
||||
//
|
||||
{
|
||||
short i;
|
||||
@ -1339,11 +1339,11 @@ void Distort_brush_1_9(void)
|
||||
}
|
||||
void Distort_brush_0_9(void)
|
||||
//
|
||||
// Opération : OPERATION_DISTORT_BRUSH
|
||||
// Opération : OPERATION_DISTORT_BRUSH
|
||||
// Click Souris: 0
|
||||
// Taille_Pile : 9
|
||||
//
|
||||
// Souris effacée: No
|
||||
// Souris effacée: No
|
||||
//
|
||||
{
|
||||
short selected_corner;
|
||||
@ -1353,11 +1353,11 @@ void Distort_brush_0_9(void)
|
||||
|
||||
void Distort_brush_2_0(void)
|
||||
//
|
||||
// Opération : OPERATION_DISTORT_BRUSH
|
||||
// Opération : OPERATION_DISTORT_BRUSH
|
||||
// Click Souris: 2
|
||||
// Taille_Pile : 0
|
||||
//
|
||||
// Souris effacée: Oui
|
||||
// Souris effacée: Oui
|
||||
//
|
||||
{
|
||||
Paintbrush_hidden=0;
|
||||
@ -1372,11 +1372,11 @@ void Distort_brush_2_0(void)
|
||||
|
||||
void Distort_brush_2_8(void)
|
||||
//
|
||||
// Opération : OPERATION_DISTORT_BRUSH
|
||||
// Opération : OPERATION_DISTORT_BRUSH
|
||||
// Click Souris: 2
|
||||
// Taille_Pile : 8
|
||||
//
|
||||
// Souris effacée: Oui
|
||||
// Souris effacée: Oui
|
||||
//
|
||||
{
|
||||
short i;
|
||||
|
||||
186
src/buttons.c
186
src/buttons.c
@ -2,7 +2,7 @@
|
||||
*/
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2008 Yves Rizoud
|
||||
Copyright 2007-2017 Adrien Destugues (PulkoMandy)
|
||||
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
|
||||
@ -234,7 +234,7 @@ void Change_paintbrush_shape(byte shape)
|
||||
Paintbrush_shape=PAINTBRUSH_SHAPE_NONE;
|
||||
break;
|
||||
// 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();
|
||||
}
|
||||
|
||||
// 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.
|
||||
// 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.
|
||||
if (Main.offset_Y+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)
|
||||
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 ?");
|
||||
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
|
||||
@ -656,14 +656,14 @@ byte Button_Quit_local_function(void)
|
||||
Display_cursor();
|
||||
|
||||
if (!File_error)
|
||||
// L'ayant sauvée avec succès,
|
||||
// L'ayant sauvée avec succès,
|
||||
return 1; // On peut quitter
|
||||
else
|
||||
// Il y a eu une erreur lors de la sauvegarde,
|
||||
return 0; // On ne peut donc pas quitter
|
||||
}
|
||||
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
|
||||
case 3 : return 1; // Quitter
|
||||
}
|
||||
@ -680,7 +680,7 @@ void Button_Quit(int btn)
|
||||
if (Spare.image_is_modified)
|
||||
{
|
||||
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())
|
||||
Quitting=1;
|
||||
}
|
||||
@ -698,7 +698,7 @@ void Button_Quit(int btn)
|
||||
}
|
||||
|
||||
|
||||
//---------------------------- Effacer l'écran -------------------------------
|
||||
//---------------------------- Effacer l'écran -------------------------------
|
||||
void Button_Clear(int btn)
|
||||
{
|
||||
Hide_cursor();
|
||||
@ -730,7 +730,7 @@ void Button_Clear_with_backcolor(int btn)
|
||||
}
|
||||
|
||||
|
||||
//------------------------------- Paramètres ---------------------------------
|
||||
//------------------------------- Paramètres ---------------------------------
|
||||
|
||||
#define SETTING_PER_PAGE 11
|
||||
#define SETTING_PAGES 5
|
||||
@ -1197,11 +1197,11 @@ void Button_Settings(int btn)
|
||||
Close_window();
|
||||
Unselect_button(btn);
|
||||
// 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_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);
|
||||
}
|
||||
|
||||
@ -1526,7 +1526,7 @@ void Button_Skins(int btn)
|
||||
Close_window();
|
||||
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();
|
||||
// Redraw all buttons, to ensure all specific sprites are in place.
|
||||
// This is necessary for multi-state buttons, for example Freehand.
|
||||
@ -1578,7 +1578,7 @@ void Button_Page(int btn)
|
||||
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++);
|
||||
//Change.magnifier_factor(factor_index,0);
|
||||
Compute_magnifier_data();
|
||||
@ -1633,7 +1633,7 @@ void Copy_image_only(void)
|
||||
|
||||
// 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.
|
||||
*/
|
||||
/*
|
||||
@ -2056,7 +2056,7 @@ void Button_Resolution(int btn)
|
||||
// Si l'utilisateur s'est servi du bouton droit de la souris:
|
||||
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;
|
||||
Num2str(chosen_width,str,4);
|
||||
Window_input_content(input_width_button,str);
|
||||
@ -2080,10 +2080,10 @@ void Button_Resolution(int btn)
|
||||
chosen_pixel=Window_attribute2;
|
||||
break;
|
||||
|
||||
default: // Boutons de tag des états des modes
|
||||
default: // Boutons de tag des états des modes
|
||||
temp=list_start+clicked_button-8;
|
||||
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
|
||||
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
|
||||
{
|
||||
if (Window_attribute1==LEFT_SIDE)
|
||||
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)
|
||||
{
|
||||
case SDLK_UP : // Haut
|
||||
@ -2197,7 +2197,7 @@ void Button_Resolution(int btn)
|
||||
Video_mode[selected_mode].Fullscreen,
|
||||
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;
|
||||
Init_mode_video(
|
||||
Video_mode[Current_resolution].Width,
|
||||
@ -2245,12 +2245,12 @@ void Button_Safety_resolution(int btn)
|
||||
Display_all_screen();
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
//------------------ Gestion des boutons de dessin à la main -----------------
|
||||
//------------------ Gestion des boutons de dessin à la main -----------------
|
||||
|
||||
void Button_Draw(int btn)
|
||||
{
|
||||
@ -2420,21 +2420,21 @@ void Button_Circle_switch_mode(int btn)
|
||||
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)
|
||||
{
|
||||
short line;
|
||||
|
||||
// On commence par afficher les 2 côtés qui constituent le dégradé de base:
|
||||
// Côté gauche (noir)
|
||||
// On commence par afficher les 2 côtés qui constituent le dégradé de base:
|
||||
// Côté gauche (noir)
|
||||
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);
|
||||
|
||||
switch(technique)
|
||||
{
|
||||
case 1 : // Dégradé de trames simples
|
||||
// Au centre, on place 10 lignes tramées simplement
|
||||
case 1 : // Dégradé de trames simples
|
||||
// Au centre, on place 10 lignes tramées simplement
|
||||
for (line=2;line<2+10;line++)
|
||||
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);
|
||||
}
|
||||
break;
|
||||
case 2 : // Dégradé de trames étendues
|
||||
// Au centre, on place 10 lignes tramées de façon compliquée
|
||||
case 2 : // Dégradé de trames étendues
|
||||
// Au centre, on place 10 lignes tramées de façon compliquée
|
||||
for (line=2;line<2+10;line++)
|
||||
if (line&1)
|
||||
{
|
||||
@ -2487,20 +2487,20 @@ void Load_gradient_data(int index)
|
||||
|
||||
switch(Main.backups->Pages->Gradients->Range[index].Technique)
|
||||
{
|
||||
case 0 : // Degradé de base
|
||||
case 0 : // Degradé de base
|
||||
Gradient_function=Gradient_basic;
|
||||
break;
|
||||
case 1 : // Dégradé de trames simples
|
||||
case 1 : // Dégradé de trames simples
|
||||
Gradient_function=Gradient_dithered;
|
||||
break;
|
||||
case 2 : // Dégradé de trames étendues
|
||||
case 2 : // Dégradé de trames étendues
|
||||
Gradient_function=Gradient_extra_dithered;
|
||||
}
|
||||
}
|
||||
|
||||
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 end_x;
|
||||
short end_y;
|
||||
@ -2584,7 +2584,7 @@ void Button_Gradients(int btn)
|
||||
Num2str(Current_gradient+1,str,2);
|
||||
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);
|
||||
// On affiche la preview
|
||||
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
|
||||
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;
|
||||
Window_draw_slider(mix_scroller);
|
||||
|
||||
@ -2660,11 +2660,11 @@ void Button_Gradients(int btn)
|
||||
{
|
||||
// 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;
|
||||
// On tagge le bloc
|
||||
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);
|
||||
}
|
||||
else
|
||||
@ -2672,7 +2672,7 @@ void Button_Gradients(int btn)
|
||||
// On maintient le click, on va donc tester si le curseur bouge
|
||||
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)
|
||||
{
|
||||
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;
|
||||
// On tagge le bloc
|
||||
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);
|
||||
last_color=temp_color;
|
||||
}
|
||||
@ -2695,14 +2695,14 @@ void Button_Gradients(int btn)
|
||||
Display_cursor();
|
||||
}
|
||||
break;
|
||||
case 2 : // Nouvel indice de dégradé
|
||||
case 2 : // Nouvel indice de dégradé
|
||||
// Nouvel indice dans Window_attribute2
|
||||
Current_gradient=Window_attribute2;
|
||||
changed_gradient_index=1;
|
||||
break;
|
||||
case 3 : // Nouveau mélange de dégradé
|
||||
case 3 : // Nouveau mélange de dégradé
|
||||
Hide_cursor();
|
||||
// Nouvel mélange dans Window_attribute2
|
||||
// Nouvel mélange dans Window_attribute2
|
||||
Main.backups->Pages->Gradients->Range[Current_gradient].Mix=Window_attribute2;
|
||||
// On affiche la nouvelle preview
|
||||
Draw_gradient_preview(8,128,108,14,Current_gradient);
|
||||
@ -2744,7 +2744,7 @@ void Button_Gradients(int btn)
|
||||
if (!Mouse_K)
|
||||
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 :
|
||||
Get_color_behind_window(&color,&click);
|
||||
if (click)
|
||||
@ -2752,11 +2752,11 @@ void Button_Gradients(int btn)
|
||||
Hide_cursor();
|
||||
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;
|
||||
// On tagge le bloc
|
||||
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);
|
||||
Display_cursor();
|
||||
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)
|
||||
{
|
||||
@ -3073,7 +3073,7 @@ void Button_Brush_monochrome(int btn)
|
||||
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_Y 4
|
||||
int Best_video_mode(void)
|
||||
@ -3083,11 +3083,11 @@ int Best_video_mode(void)
|
||||
short temp_x,temp_y;
|
||||
int mode;
|
||||
|
||||
// Si mode fenêtre, on reste dans ce mode.
|
||||
// Si mode fenêtre, on reste dans ce mode.
|
||||
if (Current_resolution == 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))
|
||||
Original_screen_X=Main.image_width;
|
||||
else
|
||||
@ -3223,7 +3223,7 @@ void Load_picture(enum CONTEXT_TYPE type)
|
||||
Select_button(BUTTON_DRAW,LEFT_SIDE);
|
||||
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)
|
||||
Select_button(BUTTON_DRAW,RIGHT_SIDE);
|
||||
}
|
||||
@ -3312,7 +3312,7 @@ void Load_picture(enum CONTEXT_TYPE type)
|
||||
void Button_Load(int 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
|
||||
Upload_infos_page(&Main);
|
||||
|
||||
@ -3327,7 +3327,7 @@ void Button_Reload(int btn)
|
||||
int new_mode;
|
||||
|
||||
(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
|
||||
Upload_infos_page(&Main);
|
||||
|
||||
@ -3437,10 +3437,10 @@ static void Backup_existing_file(const char * filename)
|
||||
File_error=0;
|
||||
|
||||
// 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))
|
||||
{
|
||||
// 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))
|
||||
&& (remove(new_filename)!=0))
|
||||
File_error=1;
|
||||
@ -3673,7 +3673,7 @@ void Button_Brush(int btn)
|
||||
void Button_Unselect_brush(int 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);
|
||||
}
|
||||
|
||||
@ -3712,7 +3712,7 @@ void Button_Lasso(int btn)
|
||||
void Button_Unselect_lasso(int 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);
|
||||
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) ) )
|
||||
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)
|
||||
{
|
||||
Start_operation_stack(Operation_before_interrupt);
|
||||
@ -3799,32 +3799,32 @@ void Button_Magnify(int btn)
|
||||
Start_operation_stack(OPERATION_MAGNIFY);
|
||||
}
|
||||
else
|
||||
{ /* 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 */
|
||||
{ /* 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 */
|
||||
/* qui s'en charge... */
|
||||
// On passe en mode loupe
|
||||
Main.magnifier_mode=1;
|
||||
|
||||
// La fonction d'affichage dans la partie image est désormais un affichage
|
||||
// spécial loupe.
|
||||
// La fonction d'affichage dans la partie image est désormais un affichage
|
||||
// spécial loupe.
|
||||
Pixel_preview=Pixel_preview_magnifier;
|
||||
|
||||
// On calcule l'origine de la loupe
|
||||
Main.magnifier_offset_X=Mouse_X-(Main.magnifier_width>>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_Y+=Main.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();
|
||||
Compute_limits();
|
||||
Display_all_screen();
|
||||
|
||||
// Repositionner le curseur en fonction des coordonnées visibles
|
||||
// Repositionner le curseur en fonction des coordonnées visibles
|
||||
Compute_paintbrush_coordinates();
|
||||
}
|
||||
}
|
||||
@ -3887,12 +3887,12 @@ void Button_Unselect_magnifier(int btn)
|
||||
Main.magnifier_mode=0;
|
||||
|
||||
|
||||
// --> Recalculer le décalage de l'écran lorsqu'on sort de la loupe <--
|
||||
// Centrage "brut" de lécran par rapport à la loupe
|
||||
// --> Recalculer le décalage de l'écran lorsqu'on sort de 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_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)
|
||||
Main.offset_X=Main.image_width-Screen_width;
|
||||
if (Main.offset_X<0)
|
||||
@ -3903,19 +3903,19 @@ void Button_Unselect_magnifier(int btn)
|
||||
if (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;
|
||||
|
||||
// Calculer les bornes visibles dans l'écran
|
||||
// Calculer les bornes visibles dans l'écran
|
||||
Compute_limits();
|
||||
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();
|
||||
|
||||
Old_MX = -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);
|
||||
}
|
||||
|
||||
@ -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,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(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
|
||||
@ -3966,7 +3966,7 @@ void Button_Brush_FX(int btn)
|
||||
Print_in_window( 20,102,"Brush",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)
|
||||
{
|
||||
Pixel_in_window( 88+index, 92,MC_Dark);
|
||||
@ -4013,7 +4013,7 @@ void Button_Brush_FX(int btn)
|
||||
Close_window();
|
||||
Unselect_button(btn);
|
||||
|
||||
// Gestion du bouton clické
|
||||
// Gestion du bouton clické
|
||||
switch (clicked_button)
|
||||
{
|
||||
case 2 : // Flip X
|
||||
@ -4026,10 +4026,10 @@ void Button_Brush_FX(int btn)
|
||||
// Remap according to the last used remap table
|
||||
Remap_general_lowlevel(Brush_colormap,Brush_original_pixels,Brush,Brush_width,Brush_height,Brush_width);
|
||||
break;
|
||||
case 4 : // 90° Rotation
|
||||
case 4 : // 90° Rotation
|
||||
Rotate_90_deg();
|
||||
break;
|
||||
case 5 : // 180° Rotation
|
||||
case 5 : // 180° Rotation
|
||||
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);
|
||||
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)
|
||||
{
|
||||
@ -4220,11 +4220,11 @@ void Button_Airbrush_menu(int btn)
|
||||
Window_display_frame(173,56,45,86);
|
||||
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++)
|
||||
if (Airbrush_multi_flow[index])
|
||||
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);
|
||||
Refresh_airbrush_settings(selected_color,0);
|
||||
|
||||
@ -4269,7 +4269,7 @@ void Button_Airbrush_menu(int btn)
|
||||
Hide_cursor();
|
||||
Stencil_tag_color(selected_color,(Airbrush_multi_flow[selected_color])?MC_Black:MC_Light);
|
||||
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);
|
||||
if (Mouse_K==2)
|
||||
Airbrush_multi_flow[selected_color]=0;
|
||||
@ -4277,7 +4277,7 @@ void Button_Airbrush_menu(int btn)
|
||||
if (Airbrush_multi_flow[selected_color]==0)
|
||||
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);
|
||||
Refresh_airbrush_settings(selected_color,1);
|
||||
Display_cursor();
|
||||
@ -4333,7 +4333,7 @@ void Button_Airbrush_menu(int btn)
|
||||
Display_cursor();
|
||||
break;
|
||||
|
||||
case 9 : // ÷2
|
||||
case 9 : // ÷2
|
||||
for (index=0; index<256; index++)
|
||||
{
|
||||
if (Airbrush_multi_flow[index]>1)
|
||||
@ -4346,11 +4346,11 @@ void Button_Airbrush_menu(int btn)
|
||||
|
||||
case 10 : // Clear
|
||||
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);
|
||||
// On efface les anciens 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_update_color(selected_color);
|
||||
break;
|
||||
@ -4427,7 +4427,7 @@ void Button_Airbrush_menu(int btn)
|
||||
if (!Mouse_K)
|
||||
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 :
|
||||
Get_color_behind_window(&color,&click);
|
||||
if (click)
|
||||
@ -4435,7 +4435,7 @@ void Button_Airbrush_menu(int btn)
|
||||
Hide_cursor();
|
||||
Stencil_tag_color(selected_color,(Airbrush_multi_flow[selected_color])?MC_Black:MC_Light);
|
||||
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;
|
||||
if (click==2)
|
||||
Airbrush_multi_flow[selected_color]=0;
|
||||
@ -4443,7 +4443,7 @@ void Button_Airbrush_menu(int btn)
|
||||
if (Airbrush_multi_flow[selected_color]==0)
|
||||
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);
|
||||
Refresh_airbrush_settings(selected_color,1);
|
||||
Display_cursor();
|
||||
@ -4471,9 +4471,9 @@ void Button_Airbrush_menu(int btn)
|
||||
Close_window();
|
||||
|
||||
/*
|
||||
// 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
|
||||
// spray même si on a clické sur Cancel (idem pour OK (un peu plus bas)).
|
||||
// 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
|
||||
// spray même si on a clické sur Cancel (idem pour OK (un peu plus bas)).
|
||||
if (clicked_button==1) // Cancel
|
||||
{
|
||||
if (Current_operation!=OPERATION_AIRBRUSH)
|
||||
@ -5284,7 +5284,7 @@ void Button_Text(int btn)
|
||||
Select_button(BUTTON_DRAW,LEFT_SIDE);
|
||||
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)
|
||||
Select_button(BUTTON_DRAW,RIGHT_SIDE);
|
||||
}
|
||||
|
||||
@ -105,7 +105,7 @@ void Button_Brush_monochrome(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.
|
||||
@ -168,7 +168,7 @@ void Button_Airbrush(int);
|
||||
*/
|
||||
void Button_Airbrush_menu(int);
|
||||
|
||||
// Courbes de Bézier
|
||||
// Courbes de Bézier
|
||||
|
||||
/*!
|
||||
Callback for the curves button left click.
|
||||
@ -204,7 +204,7 @@ void Button_Filled_rectangle(int);
|
||||
*/
|
||||
void Button_Text(int);
|
||||
|
||||
// Boutons relatifs aux dégradés
|
||||
// Boutons relatifs aux dégradés
|
||||
|
||||
/*!
|
||||
Callback for the gradation button.
|
||||
@ -463,7 +463,7 @@ void Button_Lasso(int);
|
||||
*/
|
||||
void Button_Unselect_lasso(int);
|
||||
|
||||
// Button relatifs à la pipette
|
||||
// Button relatifs à la pipette
|
||||
|
||||
/*!
|
||||
Starts the color picking operation.
|
||||
@ -497,14 +497,14 @@ void Button_Magnify_menu(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.
|
||||
*/
|
||||
void Button_Brush_FX(int);
|
||||
|
||||
// Boutons relatifs aux différentes pages
|
||||
// Boutons relatifs aux différentes pages
|
||||
|
||||
/*!
|
||||
Swap main and spare drawing pages.
|
||||
@ -526,7 +526,7 @@ void Copy_image_only(void);
|
||||
*/
|
||||
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.
|
||||
@ -560,7 +560,7 @@ void Button_Save(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.
|
||||
@ -572,7 +572,7 @@ void Button_Settings(int);
|
||||
*/
|
||||
void Button_Skins(int);
|
||||
|
||||
// Annulation de la dernière modification
|
||||
// Annulation de la dernière modification
|
||||
|
||||
/*!
|
||||
Undo the last modification to the picture.
|
||||
|
||||
@ -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( 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);
|
||||
}
|
||||
else
|
||||
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++)
|
||||
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)
|
||||
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 :
|
||||
Get_color_behind_window(&color,&click);
|
||||
if (click)
|
||||
@ -682,7 +682,7 @@ void Button_Smooth_menu(void)
|
||||
if (clicked_button==2) // OK
|
||||
{
|
||||
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();
|
||||
}
|
||||
|
||||
@ -754,9 +754,9 @@ void Button_Colorize_mode(void)
|
||||
|
||||
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
|
||||
Print_in_window(4,37," ",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,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)
|
||||
{
|
||||
case 0 : // Méthode interpolée
|
||||
case 0 : // Méthode interpolée
|
||||
y_pos=37;
|
||||
break;
|
||||
case 1 : // Méthode additive
|
||||
case 1 : // Méthode additive
|
||||
y_pos=57;
|
||||
break;
|
||||
case 2 : // Méthode soustractive
|
||||
case 2 : // Méthode soustractive
|
||||
y_pos=74;
|
||||
break;
|
||||
case 3 : // Méthode alpha
|
||||
case 3 : // Méthode alpha
|
||||
y_pos=91;
|
||||
}
|
||||
Print_in_window(4,y_pos,"\020",MC_Black,MC_Light);
|
||||
@ -825,7 +825,7 @@ void Button_Colorize_menu(void)
|
||||
|
||||
switch(clicked_button)
|
||||
{
|
||||
case 1: // Zone de saisie de l'opacité
|
||||
case 1: // Zone de saisie de l'opacité
|
||||
Num2str(chosen_opacity,str,3);
|
||||
Readline(89,23,str,3,INPUT_TYPE_INTEGER);
|
||||
chosen_opacity=atoi(str);
|
||||
@ -861,7 +861,7 @@ void Button_Colorize_menu(void)
|
||||
Colorize_opacity =chosen_opacity;
|
||||
Colorize_current_mode=selected_mode;
|
||||
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();
|
||||
}
|
||||
|
||||
@ -917,12 +917,12 @@ void Button_Tiling_menu(void)
|
||||
{
|
||||
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);
|
||||
Readline(93,23,str,4,INPUT_TYPE_INTEGER);
|
||||
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)
|
||||
{
|
||||
chosen_offset_x=Brush_width-1;
|
||||
@ -932,12 +932,12 @@ void Button_Tiling_menu(void)
|
||||
Display_cursor();
|
||||
}
|
||||
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);
|
||||
Readline(93,37,str,4,INPUT_TYPE_INTEGER);
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
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,
|
||||
Menu_factor_X*Window_special_button_list->Width,
|
||||
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
|
||||
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
|
||||
for (y_pos=0; y_pos<y_size; y_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]);
|
||||
}
|
||||
|
||||
// Rafraichit toute la zone correspondant à la trame zoomee.
|
||||
// Rafraichit toute la zone correspondant à la trame zoomee.
|
||||
void Update_sieve_area(short x, short 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;
|
||||
T_Normal_button * button_bg_color;
|
||||
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_height=Sieve_height;
|
||||
byte old_sieve[16][16];
|
||||
@ -1201,10 +1201,10 @@ void Button_Sieve_menu(void)
|
||||
temp=MC_White;
|
||||
else
|
||||
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),
|
||||
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);
|
||||
Display_cursor();
|
||||
// Maj de la case seule
|
||||
@ -1269,7 +1269,7 @@ void Button_Sieve_menu(void)
|
||||
Change_paintbrush_shape(PAINTBRUSH_SHAPE_COLOR_BRUSH);
|
||||
break;
|
||||
|
||||
case 8 : // Réduire hauteur
|
||||
case 8 : // Réduire hauteur
|
||||
if (Sieve_height>1)
|
||||
{
|
||||
Hide_cursor();
|
||||
@ -1297,7 +1297,7 @@ void Button_Sieve_menu(void)
|
||||
}
|
||||
break;
|
||||
|
||||
case 10 : // Réduire largeur
|
||||
case 10 : // Réduire largeur
|
||||
if (Sieve_width>1)
|
||||
{
|
||||
Hide_cursor();
|
||||
@ -1325,7 +1325,7 @@ void Button_Sieve_menu(void)
|
||||
}
|
||||
break;
|
||||
|
||||
case 12 : // Toggle octets insérés
|
||||
case 12 : // Toggle octets insérés
|
||||
Hide_cursor();
|
||||
default_bg_color=!default_bg_color;
|
||||
Window_rectangle(button_bg_color->Pos_X+2,
|
||||
@ -1396,7 +1396,7 @@ void Button_Sieve_menu(void)
|
||||
Update_sieve_area(origin_x, origin_y);
|
||||
break;
|
||||
|
||||
default : // Boutons de trames prédéfinies
|
||||
default : // Boutons de trames prédéfinies
|
||||
Hide_cursor();
|
||||
Copy_preset_sieve(clicked_button-17);
|
||||
Draw_sieve_scaled(origin_x,origin_y);
|
||||
|
||||
@ -85,7 +85,7 @@
|
||||
// Character to show a left arrow, used when editing long strings. It's present in ::Gfx->System_font
|
||||
#define LEFT_TRIANGLE_CHARACTER 17
|
||||
/// Character to display in menus for an ellipsis.
|
||||
//#define ELLIPSIS_CHARACTER '…'
|
||||
//#define ELLIPSIS_CHARACTER '…'
|
||||
#define ELLIPSIS_CHARACTER '\x85'
|
||||
#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.
|
||||
|
||||
212
src/engine.c
212
src/engine.c
@ -53,7 +53,7 @@ short Old_MY = -1;
|
||||
|
||||
//---------- 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 Quick_shade_mode_before_cancel;
|
||||
@ -374,11 +374,11 @@ void Unselect_button(int btn_number)
|
||||
{
|
||||
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;
|
||||
// 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);
|
||||
// On appelle le désenclenchement particulier au bouton:
|
||||
// On appelle le désenclenchement particulier au bouton:
|
||||
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);
|
||||
}
|
||||
|
||||
// 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;
|
||||
|
||||
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;
|
||||
|
||||
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))
|
||||
// Pour chaque bouton:
|
||||
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) &&
|
||||
(Buttons_Pool[b].Family==FAMILY_INTERRUPTION) &&
|
||||
( (b!=BUTTON_MAGNIFIER) ||
|
||||
((b==BUTTON_MAGNIFIER) && (!Main.magnifier_mode)) )
|
||||
)
|
||||
// Alors on désenclenche le bouton
|
||||
// Alors on désenclenche le bouton
|
||||
Unselect_button(b);
|
||||
break;
|
||||
|
||||
default:
|
||||
// On désenclenche D'ABORD les interruptions
|
||||
// On désenclenche D'ABORD les interruptions
|
||||
// Pour chaque bouton:
|
||||
for (b=0; b<NB_BUTTONS; b++)
|
||||
// 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)
|
||||
// Et que ce n'est pas la loupe, ou alors qu'on n'est pas en mode loupe
|
||||
&& (!(Main.magnifier_mode && (b==BUTTON_MAGNIFIER))) )
|
||||
// Alors on désenclenche le bouton
|
||||
// Alors on désenclenche le bouton
|
||||
Unselect_button(b);
|
||||
// Right-clicking on Adjust opens a menu, so in this case we skip
|
||||
// the unselection of all "Tool" buttons.
|
||||
@ -462,17 +462,17 @@ void Select_button(int btn_number,byte click)
|
||||
break;
|
||||
// Pour chaque bouton:
|
||||
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)
|
||||
&& (Buttons_Pool[b].Family==family) )
|
||||
// Alors on désenclenche le bouton
|
||||
// Alors on désenclenche le bouton
|
||||
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;
|
||||
|
||||
// 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);
|
||||
|
||||
Display_cursor();
|
||||
@ -480,7 +480,7 @@ void Select_button(int btn_number,byte click)
|
||||
if ((click==1 && !Buttons_Pool[btn_number].Left_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();
|
||||
}
|
||||
|
||||
@ -641,10 +641,10 @@ void Layer_preview_off(int * preview_is_visible)
|
||||
void Main_handler(void)
|
||||
{
|
||||
static byte temp_color;
|
||||
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
|
||||
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 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
|
||||
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
|
||||
byte temp;
|
||||
byte effect_modified;
|
||||
byte action;
|
||||
@ -769,7 +769,7 @@ void Main_handler(void)
|
||||
Special_previous_backcolor();
|
||||
action++;
|
||||
break;
|
||||
case SPECIAL_SMALLER_PAINTBRUSH: // Rétrécir le pinceau
|
||||
case SPECIAL_SMALLER_PAINTBRUSH: // Rétrécir le pinceau
|
||||
Smaller_paintbrush();
|
||||
action++;
|
||||
break;
|
||||
@ -922,13 +922,13 @@ void Main_handler(void)
|
||||
Display_cursor();
|
||||
action++;
|
||||
break;
|
||||
case SPECIAL_ROTATE_90 : // 90° brush rotation
|
||||
case SPECIAL_ROTATE_90 : // 90° brush rotation
|
||||
Hide_cursor();
|
||||
Rotate_90_deg();
|
||||
Display_cursor();
|
||||
action++;
|
||||
break;
|
||||
case SPECIAL_ROTATE_180 : // 180° brush rotation
|
||||
case SPECIAL_ROTATE_180 : // 180° brush rotation
|
||||
Hide_cursor();
|
||||
Rotate_180_deg_lowlevel(Brush_original_pixels, Brush_width, Brush_height);
|
||||
// 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
|
||||
// conséquence.
|
||||
// Si on a modifié un effet, il faut rafficher le bouton des effets en
|
||||
// conséquence.
|
||||
if (effect_modified)
|
||||
{
|
||||
Hide_cursor();
|
||||
@ -1433,7 +1433,7 @@ void Main_handler(void)
|
||||
{
|
||||
if (Menu_is_visible)
|
||||
{
|
||||
// On nettoie les coordonnées
|
||||
// On nettoie les coordonnées
|
||||
Hide_cursor();
|
||||
|
||||
/*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
|
||||
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)
|
||||
{
|
||||
@ -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)
|
||||
// Lors de l'appel à cette procédure, la souris doit être affichée.
|
||||
// En sortie de cette procedure, la souris est effacée.
|
||||
// Lors de l'appel à cette procédure, la souris doit être affichée.
|
||||
// En sortie de cette procedure, la souris est effacée.
|
||||
{
|
||||
//word i,j;
|
||||
size_t title_length;
|
||||
@ -1605,20 +1605,20 @@ void Open_window(word width,word height, const char * title)
|
||||
Window_width=width;
|
||||
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_Y=(Screen_height-(height*Menu_factor_Y))>>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);
|
||||
|
||||
// Fenêtre grise
|
||||
// Fenêtre grise
|
||||
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
|
||||
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);
|
||||
}
|
||||
|
||||
// Initialisation des listes de boutons de la fenêtre
|
||||
// Initialisation des listes de boutons de la fenêtre
|
||||
Window_normal_button_list =NULL;
|
||||
Window_palette_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)
|
||||
// Lors de l'appel à cette procedure, la souris doit être affichée.
|
||||
// En sortie de cette procedure, la souris est effacée.
|
||||
// Lors de l'appel à cette procedure, la souris doit être affichée.
|
||||
// En sortie de cette procedure, la souris est effacée.
|
||||
{
|
||||
T_Normal_button * temp1;
|
||||
T_Palette_button * temp2;
|
||||
@ -1717,7 +1717,7 @@ void Close_window(void)
|
||||
|
||||
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);
|
||||
Update_window_area(0,0,Window_width,Window_height);
|
||||
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
|
||||
void Window_draw_normal_bouton(word x_pos,word y_pos,word width,word height,
|
||||
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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
// -- 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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
word color;
|
||||
@ -1811,7 +1811,7 @@ void Window_draw_palette_bouton(word x_pos,word y_pos)
|
||||
|
||||
|
||||
// -------------------- 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)
|
||||
{
|
||||
word origin_x;
|
||||
@ -1861,10 +1861,10 @@ void Tag_color_range(byte start,byte 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);
|
||||
|
||||
// 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_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++)
|
||||
@ -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+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++)
|
||||
{
|
||||
Window_rectangle(Window_palette_button_list->Pos_X+3+((index>>4)*10),
|
||||
Window_palette_button_list->Pos_Y+3+((index&15)* 5),
|
||||
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),
|
||||
Window_palette_button_list->Pos_Y+5+((index&15)* 5),
|
||||
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)
|
||||
{
|
||||
@ -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)
|
||||
{
|
||||
@ -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
|
||||
T_Normal_button * Window_set_normal_button(word x_pos, word y_pos,
|
||||
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);
|
||||
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
|
||||
T_Normal_button * Window_set_repeatable_button(word x_pos, word y_pos,
|
||||
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;
|
||||
}
|
||||
|
||||
// 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
|
||||
// de la fenêtre (comprise).
|
||||
// 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
|
||||
// de la fenêtre (comprise).
|
||||
void Window_dropdown_add_item(T_Dropdown_button * dropdown, word btn_number, const char *label)
|
||||
{
|
||||
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;
|
||||
if (last)
|
||||
{
|
||||
// On cherche le dernier élément
|
||||
// On cherche le dernier élément
|
||||
for (;last->Next;last=last->Next)
|
||||
;
|
||||
last->Next=temp;
|
||||
@ -2289,12 +2289,12 @@ void Window_redraw_list(T_List_button * list)
|
||||
//----------------------- Ouverture d'un pop-up -----------------------
|
||||
|
||||
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.
|
||||
// En sortie de cette procedure, la souris est effacée.
|
||||
// Lors de l'appel à cette procédure, la souris doit être affiché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, ...
|
||||
// Les différences sont surtout graphiques :
|
||||
// -Possibilité de préciser la position XY
|
||||
// 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 :
|
||||
// -Possibilité de préciser la position XY
|
||||
// -Pas de titre
|
||||
// -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_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);
|
||||
|
||||
/*
|
||||
// Fenêtre grise
|
||||
// Fenêtre grise
|
||||
Window_rectangle(1,1,width-2,height-2,MC_Light);
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
// Initialisation des listes de boutons de la fenêtre
|
||||
// Initialisation des listes de boutons de la fenêtre
|
||||
Window_normal_button_list =NULL;
|
||||
Window_palette_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)
|
||||
// Lors de l'appel à cette procedure, la souris doit être affichée.
|
||||
// En sortie de cette procedure, la souris est effacée.
|
||||
// Lors de l'appel à cette procedure, la souris doit être affichée.
|
||||
// En sortie de cette procedure, la souris est effacée.
|
||||
{
|
||||
T_Normal_button * temp1;
|
||||
T_Palette_button * temp2;
|
||||
@ -2398,7 +2398,7 @@ void Close_popup(void)
|
||||
|
||||
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);
|
||||
Update_window_area(0,0,Window_width,Window_height);
|
||||
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)
|
||||
{
|
||||
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
|
||||
// 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 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)
|
||||
{
|
||||
short old_x=-1;
|
||||
short old_y=-1;
|
||||
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;
|
||||
char str[25];
|
||||
byte cursor_was_hidden;
|
||||
@ -2547,7 +2547,7 @@ void Get_color_behind_window(byte * color, byte * click)
|
||||
Cursor_shape=CURSOR_SHAPE_COLORPICKER;
|
||||
b=Paintbrush_hidden;
|
||||
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)
|
||||
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);
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
short new_x=Mouse_X-dx;
|
||||
@ -2711,19 +2711,19 @@ void Move_window(short dx, short dy)
|
||||
Menu_Y=a;
|
||||
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);
|
||||
|
||||
// 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);
|
||||
|
||||
// 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);
|
||||
|
||||
// Raffichage de la fenêtre
|
||||
// Raffichage de la fenêtre
|
||||
Restore_background(&buffer, new_x, new_y, Window_width, Window_height);
|
||||
|
||||
// Mise à jour du rectangle englobant
|
||||
// Mise à jour du rectangle englobant
|
||||
Update_rect(
|
||||
(new_x>Window_pos_X)?Window_pos_X:new_x,
|
||||
(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;
|
||||
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_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);
|
||||
// Frame fonce et blanc
|
||||
Window_display_frame_out(1,0,button->Dropdown_width-1,box_height);
|
||||
// Ombre portée
|
||||
// Ombre portée
|
||||
if (SHADOW_BOTTOM)
|
||||
{
|
||||
Window_rectangle(SHADOW_RIGHT,
|
||||
@ -2815,7 +2815,7 @@ T_Dropdown_choice * Dropdown_activate(T_Dropdown_button *button, short off_x, sh
|
||||
while (1)
|
||||
{
|
||||
old_selected_index = selected_index;
|
||||
// Fenêtre grise
|
||||
// Fenêtre grise
|
||||
Window_rectangle(2,1,button->Dropdown_width-3,box_height-2,MC_Light);
|
||||
// Affichage des items
|
||||
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
|
||||
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)?
|
||||
(((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
|
||||
// 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)
|
||||
{
|
||||
while(1)
|
||||
@ -3146,7 +3146,7 @@ short Window_get_button_shortcut(void)
|
||||
else
|
||||
Window_attribute1=LEFT_SIDE;
|
||||
|
||||
// On fait une première recherche
|
||||
// On fait une première recherche
|
||||
temp=Window_normal_button_list;
|
||||
while (temp!=NULL)
|
||||
{
|
||||
@ -3178,9 +3178,9 @@ short Window_get_button_shortcut(void)
|
||||
temp2=temp2->Next;
|
||||
}
|
||||
|
||||
// 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>
|
||||
// n'était pas appuyé.
|
||||
// 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>
|
||||
// n'était pas appuyé.
|
||||
if (Window_attribute1==RIGHT_SIDE)
|
||||
{
|
||||
temp=Window_normal_button_list;
|
||||
@ -3350,7 +3350,7 @@ short Window_clicked_button(void)
|
||||
{
|
||||
list->List_start=list->List_start+list->Cursor_position;
|
||||
list->Cursor_position=0;
|
||||
// Mise à jour du scroller
|
||||
// Mise à jour du scroller
|
||||
list->Scroller->Position=list->List_start;
|
||||
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->Cursor_position=(list->Scroller->Nb_visibles-1);
|
||||
// Mise à jour du scroller
|
||||
// Mise à jour du scroller
|
||||
list->Scroller->Position=list->List_start;
|
||||
Window_draw_slider(list->Scroller);
|
||||
}
|
||||
@ -3387,7 +3387,7 @@ short Window_clicked_button(void)
|
||||
Hide_cursor();
|
||||
list->Cursor_position=0;
|
||||
list->List_start=0;
|
||||
// Mise à jour du scroller
|
||||
// Mise à jour du scroller
|
||||
list->Scroller->Position=list->List_start;
|
||||
Window_draw_slider(list->Scroller);
|
||||
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->Cursor_position=(list->Scroller->Nb_visibles-1);
|
||||
// Mise à jour du scroller
|
||||
// Mise à jour du scroller
|
||||
list->Scroller->Position=list->List_start;
|
||||
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;
|
||||
}
|
||||
// Mise à jour du scroller
|
||||
// Mise à jour du scroller
|
||||
list->Scroller->Position=list->List_start;
|
||||
Window_draw_slider(list->Scroller);
|
||||
}
|
||||
@ -3462,7 +3462,7 @@ short Window_clicked_button(void)
|
||||
{
|
||||
list->List_start=0;
|
||||
}
|
||||
// Mise à jour du scroller
|
||||
// Mise à jour du scroller
|
||||
list->Scroller->Position=list->List_start;
|
||||
Window_draw_slider(list->Scroller);
|
||||
}
|
||||
@ -3481,10 +3481,10 @@ short Window_clicked_button(void)
|
||||
else
|
||||
list->List_start=0;
|
||||
list->Cursor_position-=list->List_start;
|
||||
// On affiche à nouveau la liste
|
||||
// On affiche à nouveau la liste
|
||||
Hide_cursor();
|
||||
Window_redraw_list(list);
|
||||
// Mise à jour du scroller
|
||||
// Mise à jour du scroller
|
||||
list->Scroller->Position=list->List_start;
|
||||
Window_draw_slider(list->Scroller);
|
||||
Display_cursor();
|
||||
@ -3498,10 +3498,10 @@ short Window_clicked_button(void)
|
||||
list->List_start=list->Scroller->Nb_elements-list->Scroller->Nb_visibles;
|
||||
}
|
||||
list->Cursor_position-=list->List_start;
|
||||
// On affiche à nouveau la liste
|
||||
// On affiche à nouveau la liste
|
||||
Hide_cursor();
|
||||
Window_redraw_list(list);
|
||||
// Mise à jour du scroller
|
||||
// Mise à jour du scroller
|
||||
list->Scroller->Position=list->List_start;
|
||||
Window_draw_slider(list->Scroller);
|
||||
Display_cursor();
|
||||
@ -3515,8 +3515,8 @@ short Window_clicked_button(void)
|
||||
}
|
||||
|
||||
|
||||
// Fonction qui sert à remapper les parties sauvegardées derriere les
|
||||
// fenetres ouvertes. C'est utilisé par exemple par la fenetre de palette
|
||||
// Fonction qui sert à remapper les parties sauvegardées derriere les
|
||||
// fenetres ouvertes. C'est utilisé par exemple par la fenetre de palette
|
||||
// Qui remappe des couleurs, afin de propager les changements.
|
||||
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();
|
||||
}
|
||||
|
||||
// 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.
|
||||
// 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.
|
||||
if (Main.offset_Y+Screen_height>Main.image_height)
|
||||
{
|
||||
if (Screen_height>Main.image_height)
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2018 Thomas Bernard
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2009 Petter Lindquist
|
||||
Copyright 2008 Yves Rizoud
|
||||
Copyright 2008 Franck Charlet
|
||||
@ -89,7 +89,7 @@ void Test_IMG(T_IO_Context * context, FILE * file)
|
||||
(void)context;
|
||||
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)
|
||||
&& Read_word_le(file,&(IMG_header.Width))
|
||||
&& Read_word_le(file,&(IMG_header.Height))
|
||||
@ -206,7 +206,7 @@ void Save_IMG(T_IO_Context * context)
|
||||
if (File_error)
|
||||
Remove_file(context);
|
||||
}
|
||||
else // Error d'écriture (disque plein ou protégé)
|
||||
else // Error d'écriture (disque plein ou protégé)
|
||||
{
|
||||
fclose(file);
|
||||
Remove_file(context);
|
||||
@ -272,10 +272,10 @@ void Test_IFF(FILE * IFF_file, const char *sub_type)
|
||||
|
||||
if (! Read_dword_be(IFF_file, &dummy))
|
||||
break;
|
||||
// On aurait pu vérifier que ce long est égal à la taille
|
||||
// du fichier - 8, mais ça aurait interdit de charger des
|
||||
// fichiers tronqués (et déjà que c'est chiant de perdre
|
||||
// une partie du fichier il faut quand même pouvoir en
|
||||
// On aurait pu vérifier que ce long est égal à la taille
|
||||
// du fichier - 8, mais ça aurait interdit de charger des
|
||||
// fichiers tronqués (et déjà que c'est chiant de perdre
|
||||
// une partie du fichier il faut quand même pouvoir en
|
||||
// garder un peu... Sinon, moi je pleure :'( !!! )
|
||||
if (! Read_bytes(IFF_file,format,4))
|
||||
break;
|
||||
@ -367,12 +367,12 @@ int IFF_Skip_section(FILE * file)
|
||||
// ------------------------- Attendre une 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];
|
||||
|
||||
if (! Read_bytes(file,section_read,4))
|
||||
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))
|
||||
return 0;
|
||||
@ -382,7 +382,7 @@ byte IFF_Wait_for(FILE * file, const char * expected_section)
|
||||
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
|
||||
|
||||
///
|
||||
@ -2061,11 +2061,11 @@ void Load_IFF(T_IO_Context * context)
|
||||
|
||||
switch (IFF_list_size)
|
||||
{
|
||||
case 0 : // Première couleur
|
||||
case 0 : // Première couleur
|
||||
IFF_color_list[0]=color;
|
||||
IFF_list_size=1;
|
||||
break;
|
||||
case 1 : // Deuxième couleur
|
||||
case 1 : // Deuxième couleur
|
||||
last_color=IFF_color_list[0];
|
||||
IFF_repetition_mode=(last_color==color);
|
||||
IFF_color_list[1]=color;
|
||||
@ -2074,7 +2074,7 @@ void Load_IFF(T_IO_Context * context)
|
||||
default: // Couleurs suivantes
|
||||
last_color =IFF_color_list[IFF_list_size-1];
|
||||
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) )
|
||||
// On conserve le mode...
|
||||
@ -2095,7 +2095,7 @@ void Load_IFF(T_IO_Context * context)
|
||||
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...
|
||||
{
|
||||
@ -2154,7 +2154,7 @@ void Save_IFF(T_IO_Context * context)
|
||||
setvbuf(IFF_file, NULL, _IOFBF, 64*1024);
|
||||
|
||||
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)
|
||||
Write_bytes(IFF_file,"ILBM",4);
|
||||
@ -2246,7 +2246,7 @@ void Save_IFF(T_IO_Context * context)
|
||||
|
||||
body_offset = ftell(IFF_file);
|
||||
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)
|
||||
{
|
||||
@ -3121,7 +3121,7 @@ static void Load_BMP_Pixels(T_IO_Context * context, FILE * file, unsigned int co
|
||||
x_pos+=a;
|
||||
y_pos-=b;
|
||||
break;
|
||||
default: // Nouvelle série
|
||||
default: // Nouvelle série
|
||||
while (b)
|
||||
{
|
||||
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;
|
||||
y_pos-=b;
|
||||
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++)
|
||||
{
|
||||
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);
|
||||
}
|
||||
// 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) )
|
||||
{
|
||||
byte dummy;
|
||||
@ -3421,11 +3421,11 @@ void Save_BMP(T_IO_Context * context)
|
||||
&& Write_dword_le(file,header.Clr_Imprt))
|
||||
{
|
||||
// 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
|
||||
// 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
|
||||
// toujours à 0 pour forcer les gens à s'acheter des gros disques
|
||||
// durs... Comme ça, ça fera passer la pillule lorsqu'on sortira
|
||||
// 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
|
||||
// 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
|
||||
// durs... Comme ça, ça fera passer la pillule lorsqu'on sortira
|
||||
// Windows 95." ...
|
||||
for (index=0; index<256; index++)
|
||||
{
|
||||
@ -3438,7 +3438,7 @@ void Save_BMP(T_IO_Context * context)
|
||||
if (Write_bytes(file,local_palette,1024))
|
||||
{
|
||||
// ... 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."
|
||||
for (y_pos=context->Height-1; ((y_pos>=0) && (!File_error)); y_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 -----------------------------------------
|
||||
|
||||
// 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_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
|
||||
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
|
||||
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_interlaced; // L'image est entrelacée
|
||||
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_interlaced; // L'image est entrelacée
|
||||
word GIF_finished_interlaced_image; // L'image entrelacée est finie de charger
|
||||
word GIF_pass; // index de passe de l'image entrelacée
|
||||
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)
|
||||
{
|
||||
@ -3985,12 +3985,12 @@ void Load_GIF(T_IO_Context * context)
|
||||
{
|
||||
char signature[6];
|
||||
|
||||
word * alphabet_stack; // Pile de décodage d'une chaîne
|
||||
word * alphabet_prefix; // Table des préfixes des codes
|
||||
word * alphabet_stack; // Pile de décodage d'une chaîne
|
||||
word * alphabet_prefix; // Table des préfixes des codes
|
||||
word * alphabet_suffix; // Table des suffixes des codes
|
||||
word alphabet_free; // Position libre 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_max; // Nombre d'entrées possibles dans l'alphabet
|
||||
word alphabet_stack_pos; // Position dans la pile de décodage d'un chaîne
|
||||
|
||||
T_GIF_LSDB LSDB;
|
||||
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 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 initial_nb_bits; // Nb de bits au début du traitement LZW
|
||||
word special_case=0; // Mémoire pour le cas spécial
|
||||
word old_code=0; // Code précédent
|
||||
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 old_code=0; // Code précédent
|
||||
word byte_read; // Sauvegarde du code en cours de lecture
|
||||
word value_clr; // Valeur <=> Clear tables
|
||||
word value_eof; // Valeur <=> End d'image
|
||||
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 last_delay = 0;
|
||||
byte is_transparent = 0;
|
||||
@ -4034,7 +4034,7 @@ void Load_GIF(T_IO_Context * context)
|
||||
(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_prefix=(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))
|
||||
)
|
||||
{
|
||||
// Lecture du Logical Screen Descriptor Block réussie:
|
||||
// Lecture du Logical Screen Descriptor Block réussie:
|
||||
|
||||
Original_screen_X=LSDB.Width;
|
||||
Original_screen_Y=LSDB.Height;
|
||||
@ -4102,7 +4102,7 @@ void Load_GIF(T_IO_Context * context)
|
||||
switch(function_code)
|
||||
{
|
||||
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.
|
||||
if (context->Comment[0]=='\0')
|
||||
{
|
||||
@ -4119,7 +4119,7 @@ void Load_GIF(T_IO_Context * context)
|
||||
Read_byte(GIF_file,&size_to_read);
|
||||
break;
|
||||
case 0xF9: // Graphics Control Extension
|
||||
// Prévu pour la transparence
|
||||
// Prévu pour la transparence
|
||||
if ( Read_byte(GIF_file,&(GCE.Packed_fields))
|
||||
&& Read_word_le(GIF_file,&(GCE.Delay_time))
|
||||
&& 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)
|
||||
// Image entrelacée = (IDB.Indicator and $40)
|
||||
// Image entrelacée = (IDB.Indicator and $40)
|
||||
// Ordre de classement = (IDB.Indicator and $20)
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
else // Code Clear rencontré
|
||||
else // Code Clear rencontré
|
||||
{
|
||||
GIF_nb_bits =initial_nb_bits + 1;
|
||||
alphabet_max =((1 << GIF_nb_bits)-1);
|
||||
@ -4423,7 +4423,7 @@ void Load_GIF(T_IO_Context * context)
|
||||
File_error=2;
|
||||
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)
|
||||
File_error=0;
|
||||
/*Close_lecture();*/
|
||||
@ -4463,7 +4463,7 @@ void Load_GIF(T_IO_Context * context)
|
||||
|
||||
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_prefix);
|
||||
free(alphabet_stack);
|
||||
@ -4474,7 +4474,7 @@ void Load_GIF(T_IO_Context * context)
|
||||
|
||||
fclose(GIF_file);
|
||||
|
||||
} // Le fichier était ouvrable
|
||||
} // Le fichier était ouvrable
|
||||
else
|
||||
File_error=1;
|
||||
}
|
||||
@ -4482,8 +4482,8 @@ void Load_GIF(T_IO_Context * context)
|
||||
|
||||
// -- Sauver un fichier au format GIF ---------------------------------------
|
||||
|
||||
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
|
||||
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
|
||||
|
||||
// -- 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)
|
||||
{
|
||||
@ -4520,9 +4520,9 @@ void Load_GIF(T_IO_Context * context)
|
||||
nb_bits_processed +=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;
|
||||
|
||||
// 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)
|
||||
{
|
||||
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_daughter; // Table des chaînes filles (plus longues)
|
||||
word * alphabet_sister; // Table des chaînes soeurs (même longueur)
|
||||
word * alphabet_daughter; // Table des chaînes filles (plus longues)
|
||||
word * alphabet_sister; // Table des chaînes soeurs (même longueur)
|
||||
word alphabet_free; // Position libre 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)
|
||||
int descend; // Booléen "On vient de descendre"
|
||||
word alphabet_max; // Nombre d'entrées possibles dans l'alphabet
|
||||
word start; // Code précédent (sert au linkage des chaînes)
|
||||
int descend; // Booléen "On vient de descendre"
|
||||
|
||||
T_GIF_LSDB LSDB;
|
||||
T_GIF_IDB IDB;
|
||||
|
||||
|
||||
byte block_identifier; // Code indicateur du type de bloc en cours
|
||||
word current_string; // Code de la chaîne en cours de traitement
|
||||
byte current_char; // Caractère à coder
|
||||
word index; // index de recherche de chaîne
|
||||
word current_string; // Code de la chaîne en cours de traitement
|
||||
byte current_char; // Caractère à coder
|
||||
word index; // index de recherche de chaîne
|
||||
int current_layer;
|
||||
|
||||
word clear; // LZW clear code
|
||||
@ -4589,12 +4589,12 @@ void Save_GIF(T_IO_Context * context)
|
||||
{
|
||||
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))
|
||||
{
|
||||
// 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_suffix=(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.Aspect) )
|
||||
{
|
||||
// Le LSDB a été correctement écrit.
|
||||
// Le LSDB a été correctement écrit.
|
||||
int i;
|
||||
// On sauve la palette
|
||||
for(i=0;i<256 && !File_error;i++)
|
||||
@ -4651,7 +4651,7 @@ void Save_GIF(T_IO_Context * context)
|
||||
}
|
||||
if (!File_error)
|
||||
{
|
||||
// La palette a été correctement écrite.
|
||||
// La palette a été correctement écrite.
|
||||
|
||||
// Ecriture de la transparence
|
||||
//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++;
|
||||
}
|
||||
|
||||
// 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;
|
||||
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
|
||||
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.Nb_bits_pixel))
|
||||
{
|
||||
// Le block indicateur d'IDB et l'IDB ont étés correctements
|
||||
// écrits.
|
||||
// Le block indicateur d'IDB et l'IDB ont étés correctements
|
||||
// écrits.
|
||||
|
||||
GIF_pos_X=IDB.Pos_X;
|
||||
GIF_pos_Y=IDB.Pos_Y;
|
||||
@ -4825,7 +4825,7 @@ void Save_GIF(T_IO_Context * context)
|
||||
File_error=0;
|
||||
GIF_stop=0;
|
||||
|
||||
// Réintialisation de la table:
|
||||
// Réintialisation de la table:
|
||||
alphabet_free=clear + 2; // 258 for 8bpp
|
||||
GIF_nb_bits =IDB.Nb_bits_pixel + 1; // 9 for 8 bpp
|
||||
alphabet_max =clear+clear-1; // 511 for 8bpp
|
||||
@ -4914,21 +4914,21 @@ void Save_GIF(T_IO_Context * context)
|
||||
|
||||
if (!File_error)
|
||||
{
|
||||
// On écrit le code dans le fichier
|
||||
GIF_set_code(current_string); // Dernière portion d'image
|
||||
// On écrit le code dans le fichier
|
||||
GIF_set_code(current_string); // Dernière portion d'image
|
||||
|
||||
// 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
|
||||
// valeur, il faudrait que la table de chaîne soit remplie or
|
||||
// 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
|
||||
// ne devrait pas avoir à changer de taille, mais je laisse
|
||||
// quand même en remarque tout ça, au cas où il subsisterait
|
||||
// des problèmes dans certains cas exceptionnels.
|
||||
// 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
|
||||
// valeur, il faudrait que la table de chaîne soit remplie or
|
||||
// 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
|
||||
// ne devrait pas avoir à changer de taille, mais je laisse
|
||||
// quand même en remarque tout ça, au cas où il subsisterait
|
||||
// des problèmes dans certains cas exceptionnels.
|
||||
//
|
||||
// Note: de toutes façons, ces lignes en commentaires ont étés
|
||||
// écrites par copier/coller du temps où la sauvegarde du
|
||||
// GIF déconnait. Il y a donc fort à parier qu'elles ne
|
||||
// Note: de toutes façons, ces lignes en commentaires ont étés
|
||||
// écrites par copier/coller du temps où la sauvegarde du
|
||||
// GIF déconnait. Il y a donc fort à parier qu'elles ne
|
||||
// sont pas correctes.
|
||||
|
||||
/*
|
||||
@ -4939,7 +4939,7 @@ void Save_GIF(T_IO_Context * context)
|
||||
// On balargue un Clear Code
|
||||
GIF_set_code(256);
|
||||
|
||||
// On réinitialise les données LZW
|
||||
// On réinitialise les données LZW
|
||||
alphabet_free=258;
|
||||
GIF_nb_bits =9;
|
||||
alphabet_max =511;
|
||||
@ -4960,15 +4960,15 @@ void Save_GIF(T_IO_Context * context)
|
||||
GIF_last_byte=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'))
|
||||
File_error=1;
|
||||
|
||||
}
|
||||
|
||||
} // On a pu écrire l'IDB
|
||||
} // On a pu écrire l'IDB
|
||||
else
|
||||
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'))
|
||||
File_error=1;
|
||||
}
|
||||
|
||||
} // On a pu écrire la palette
|
||||
} // On a pu écrire la palette
|
||||
else
|
||||
File_error=1;
|
||||
|
||||
} // On a pu écrire le LSDB
|
||||
} // On a pu écrire le LSDB
|
||||
else
|
||||
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_daughter);
|
||||
free(alphabet_suffix);
|
||||
free(alphabet_prefix);
|
||||
|
||||
} // On a pu écrire la signature du fichier
|
||||
} // On a pu écrire la signature du fichier
|
||||
else
|
||||
File_error=1;
|
||||
|
||||
@ -5031,7 +5031,7 @@ void Save_GIF(T_IO_Context * context)
|
||||
if (File_error)
|
||||
Remove_file(context);
|
||||
|
||||
} // On a pu ouvrir le fichier en écriture
|
||||
} // On a pu ouvrir le fichier en écriture
|
||||
else
|
||||
File_error=1;
|
||||
|
||||
@ -5044,21 +5044,21 @@ typedef struct
|
||||
{
|
||||
byte Manufacturer; // |_ Il font chier ces cons! Ils auraient pu
|
||||
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)
|
||||
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 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!)
|
||||
byte Palette_16c[48]; // Palette 16 coul (inutile pour 256c) (débile!)
|
||||
byte Reserved; // Ca me plait ça aussi!
|
||||
byte Palette_16c[48]; // Palette 16 coul (inutile pour 256c) (débile!)
|
||||
byte Reserved; // Ca me plait ça aussi!
|
||||
byte Plane; // 4 => 16c , 1 => 256c , ...
|
||||
word Bytes_per_plane_line;// Doit toujours être pair
|
||||
word Palette_info; // 1 => color , 2 => Gris (ignoré à partir de la version 4)
|
||||
word Bytes_per_plane_line;// Doit toujours être pair
|
||||
word Palette_info; // 1 => color , 2 => Gris (ignoré à partir de la version 4)
|
||||
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!
|
||||
} T_PCX_Header;
|
||||
|
||||
@ -5091,7 +5091,7 @@ void Test_PCX(T_IO_Context * context, FILE * file)
|
||||
Read_bytes(file,&(PCX_header.Filler),54) )
|
||||
{
|
||||
// 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!
|
||||
if ( (PCX_header.Manufacturer!=10)
|
||||
|| (PCX_header.Compression>1)
|
||||
@ -5110,7 +5110,7 @@ void Test_PCX(T_IO_Context * context, FILE * file)
|
||||
|
||||
// -- 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)
|
||||
{
|
||||
short x_pos;
|
||||
@ -5143,7 +5143,7 @@ void Load_PCX(T_IO_Context * context)
|
||||
FILE *file;
|
||||
|
||||
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 x_pos;
|
||||
short y_pos;
|
||||
@ -5194,7 +5194,7 @@ void Load_PCX(T_IO_Context * context)
|
||||
{
|
||||
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)
|
||||
memset(context->Palette,0,sizeof(T_Palette));
|
||||
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.
|
||||
if ( (PCX_header.Depth==8) && (PCX_header.Version>=5) && (file_size>(256*3+128)) )
|
||||
{
|
||||
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 (byte1==12) // Lire la palette si c'est une image en 256 couleurs
|
||||
{
|
||||
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++)
|
||||
if ( ! Read_byte(file,&(context->Palette[index].R))
|
||||
|| ! 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
|
||||
// à la fin, on retourne juste après le header pour lire l'image.
|
||||
// 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.
|
||||
fseek(file,128,SEEK_SET);
|
||||
if (!File_error)
|
||||
{
|
||||
line_size=PCX_header.Bytes_per_plane_line*PCX_header.Plane;
|
||||
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.
|
||||
buffer=(byte *)malloc(line_size);
|
||||
|
||||
// Chargement de l'image
|
||||
if (PCX_header.Compression) // Image compressée
|
||||
if (PCX_header.Compression) // Image compressée
|
||||
{
|
||||
/*Init_lecture();*/
|
||||
|
||||
@ -5303,14 +5303,14 @@ void Load_PCX(T_IO_Context * context)
|
||||
{
|
||||
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 (!File_error)
|
||||
{
|
||||
if ((byte1&0xC0)==0xC0)
|
||||
{
|
||||
byte1-=0xC0; // facteur de répétition
|
||||
if(Read_byte(file,&byte2)!=1) File_error = 2; // octet à répéter
|
||||
byte1-=0xC0; // facteur de répétition
|
||||
if(Read_byte(file,&byte2)!=1) File_error = 2; // octet à répéter
|
||||
if (!File_error)
|
||||
{
|
||||
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++)
|
||||
{
|
||||
@ -5343,8 +5343,8 @@ void Load_PCX(T_IO_Context * context)
|
||||
{
|
||||
if ((byte1&0xC0)==0xC0)
|
||||
{
|
||||
byte1-=0xC0; // facteur de répétition
|
||||
if(Read_byte(file,&byte2)!=1) File_error=2; // octet à répéter
|
||||
byte1-=0xC0; // facteur de répétition
|
||||
if(Read_byte(file,&byte2)!=1) File_error=2; // octet à répéter
|
||||
if (!File_error)
|
||||
{
|
||||
for (index=0; index<byte1; index++)
|
||||
@ -5370,7 +5370,7 @@ void Load_PCX(T_IO_Context * context)
|
||||
|
||||
/*Close_lecture();*/
|
||||
}
|
||||
else // Image non compressée
|
||||
else // Image non compressée
|
||||
{
|
||||
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);)
|
||||
{
|
||||
// Lecture et décompression de la ligne
|
||||
// Lecture et décompression de la ligne
|
||||
if(Read_byte(file,&byte1)!=1) File_error=2;
|
||||
if (!File_error)
|
||||
{
|
||||
if ((byte1 & 0xC0)==0xC0)
|
||||
{
|
||||
byte1-=0xC0; // facteur de répétition
|
||||
if(Read_byte(file,&byte2)!=1) File_error=2; // octet à répéter
|
||||
byte1-=0xC0; // facteur de répétition
|
||||
if(Read_byte(file,&byte2)!=1) File_error=2; // octet à répéter
|
||||
if (!File_error)
|
||||
{
|
||||
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);
|
||||
|
||||
// Compression et écriture de la ligne
|
||||
// Compression et écriture de la ligne
|
||||
for (x_pos=0; ((x_pos<line_size) && (!File_error)); )
|
||||
{
|
||||
x_pos++;
|
||||
@ -5612,7 +5612,7 @@ void Test_SCx(T_IO_Context * context, FILE * file)
|
||||
File_error=1;
|
||||
|
||||
// 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)
|
||||
&& Read_word_le(file, &(SCx_header.Width))
|
||||
&& Read_word_le(file, &(SCx_header.Height))
|
||||
@ -5778,7 +5778,7 @@ void Save_SCx(T_IO_Context * context)
|
||||
if (File_error)
|
||||
Remove_file(context);
|
||||
}
|
||||
else // Error d'écriture (disque plein ou protégé)
|
||||
else // Error d'écriture (disque plein ou protégé)
|
||||
{
|
||||
fclose(file);
|
||||
Remove_file(context);
|
||||
@ -6482,7 +6482,7 @@ void Save_PNG(T_IO_Context * context)
|
||||
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.
|
||||
if (File_error)
|
||||
Remove_file(context);
|
||||
|
||||
240
src/filesel.c
240
src/filesel.c
@ -4,7 +4,7 @@
|
||||
|
||||
Copyright 2018 Thomas Bernard
|
||||
Copyright 2014 Sergii Pylypenko
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2009 Franck Charlet
|
||||
Copyright 2008 Peter Gordon
|
||||
Copyright 2008 Yves Rizoud
|
||||
@ -72,17 +72,17 @@
|
||||
#include "filesel.h"
|
||||
|
||||
#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
|
||||
// répertoire non sélectionné
|
||||
// répertoire non sélectionné
|
||||
#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
|
||||
// fichier sélectionnée
|
||||
// fichier sélectionnée
|
||||
#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
|
||||
// sélectionnée
|
||||
// sélectionnée
|
||||
|
||||
// -- Native fileselector for WIN32
|
||||
|
||||
@ -158,8 +158,8 @@ static word Selector_filename_unicode[256];
|
||||
|
||||
// Conventions:
|
||||
//
|
||||
// * Le fileselect modifie le répertoire courant. Ceci permet de n'avoir
|
||||
// qu'un findfirst dans le répertoire courant à faire:
|
||||
// * Le fileselect modifie le répertoire courant. Ceci permet de n'avoir
|
||||
// qu'un findfirst dans le répertoire courant à faire:
|
||||
|
||||
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)
|
||||
// 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
|
||||
// programme.
|
||||
{
|
||||
@ -213,11 +213,11 @@ void Free_fileselector_list(T_Fileselector *list)
|
||||
|
||||
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;
|
||||
// On fait avancer la tête de la liste
|
||||
// On fait avancer la tête de la liste
|
||||
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_short_name);
|
||||
free(temp_item);
|
||||
@ -282,7 +282,7 @@ word * Format_filename_unicode(const word * fname, word max_length, int type)
|
||||
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)
|
||||
{
|
||||
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];
|
||||
}
|
||||
|
||||
// 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)
|
||||
{
|
||||
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 ---------------
|
||||
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
|
||||
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')
|
||||
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++)
|
||||
{
|
||||
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)
|
||||
// Cette procédure charge dans la liste chainée les fichiers dont l'extension
|
||||
// correspond au format demandé.
|
||||
// Cette procédure charge dans la liste chainée les fichiers dont l'extension
|
||||
// correspond au format demandé.
|
||||
{
|
||||
struct Read_dir_pdata callback_data;
|
||||
const char * current_path = NULL;
|
||||
@ -542,14 +542,14 @@ void Read_list_of_files(T_Fileselector *list, byte selected_format)
|
||||
#endif
|
||||
|
||||
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;
|
||||
|
||||
// Ensuite, on vide la liste actuelle:
|
||||
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);
|
||||
|
||||
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 )
|
||||
{
|
||||
// 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.
|
||||
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;
|
||||
switch (GetDriveTypeA(drive_path))
|
||||
{
|
||||
@ -731,11 +731,11 @@ void Read_list_of_drives(T_Fileselector *list, byte name_length)
|
||||
}
|
||||
#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,
|
||||
// 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* next;
|
||||
@ -797,15 +797,15 @@ void Read_list_of_drives(T_Fileselector *list, byte name_length)
|
||||
#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)
|
||||
// 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 fichiers ensuite, 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
|
||||
{
|
||||
byte list_is_sorted; // Booléen "La liste est triée"
|
||||
byte need_swap; // Booléen "Il faut inverser les éléments"
|
||||
byte list_is_sorted; // Booléen "La liste est triée"
|
||||
byte need_swap; // Booléen "Il faut inverser les éléments"
|
||||
T_Fileselector_item * prev_item;
|
||||
T_Fileselector_item * current_item;
|
||||
T_Fileselector_item * next_item;
|
||||
@ -816,7 +816,7 @@ void Sort_list_of_files(T_Fileselector *list)
|
||||
{
|
||||
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;
|
||||
|
||||
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
|
||||
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:
|
||||
|
||||
// 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)
|
||||
{
|
||||
// Si les deux éléments nécessitent d'être inversé:
|
||||
// Si les deux éléments nécessitent d'être inversé:
|
||||
|
||||
// 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;
|
||||
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->Previous=next_item;
|
||||
next_item->Next =current_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)
|
||||
prev_item->Next=next_item;
|
||||
if (next_to_next_item!=NULL)
|
||||
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)
|
||||
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;
|
||||
|
||||
// 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;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Si les deux éléments sont dans l'ordre:
|
||||
// Si les deux éléments sont dans l'ordre:
|
||||
|
||||
// On passe aux suivants
|
||||
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)
|
||||
//
|
||||
// offset_first = Décalage entre le premier fichier visible dans le
|
||||
// sélecteur et le premier fichier de la liste
|
||||
// offset_first = Décalage entre le premier fichier visible dans le
|
||||
// sélecteur et le premier fichier de la liste
|
||||
//
|
||||
// selector_offset = Décalage entre le premier fichier visible dans le
|
||||
// sélecteur et le fichier sélectionné dans la liste
|
||||
// selector_offset = Décalage entre le premier fichier visible dans le
|
||||
// sélecteur et le fichier sélectionné dans la liste
|
||||
//
|
||||
{
|
||||
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;
|
||||
|
||||
|
||||
// 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)
|
||||
{
|
||||
// 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);
|
||||
|
||||
// Pour chacun des 10 éléments inscriptibles à l'écran
|
||||
// Pour chacun des 10 éléments inscriptibles à l'écran
|
||||
for (index=0;index<10;index++)
|
||||
{
|
||||
// S'il est sélectionné:
|
||||
// S'il est sélectionné:
|
||||
if (!selector_offset)
|
||||
{
|
||||
// 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;
|
||||
}
|
||||
|
||||
// On affiche l'élément
|
||||
// On affiche l'élément
|
||||
if (current_item->Icon != ICON_NONE)
|
||||
{
|
||||
// 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);
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
selector_offset--;
|
||||
current_item=current_item->Next;
|
||||
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)
|
||||
//
|
||||
// offset_first = Décalage entre le premier fichier visible dans le
|
||||
// sélecteur et le premier fichier de la liste
|
||||
// offset_first = Décalage entre le premier fichier visible dans le
|
||||
// sélecteur et le premier fichier de la liste
|
||||
//
|
||||
// selector_offset = Décalage entre le premier fichier visible dans le
|
||||
// sélecteur et le fichier à récupérer
|
||||
// selector_offset = Décalage entre le premier fichier visible dans le
|
||||
// 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.
|
||||
// Passer NULL si pas interessé.
|
||||
// type = Récupération du type: 0 fichier, 1 repertoire, 2 lecteur.
|
||||
// Passer NULL si pas interessé.
|
||||
{
|
||||
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)
|
||||
{
|
||||
// On commence par chercher à pointer sur le premier fichier visible:
|
||||
// Ensuite, on saute autant d'éléments que le décalage demandé:
|
||||
// On commence par chercher à pointer sur le premier fichier visible:
|
||||
// Ensuite, on saute autant d'éléments que le décalage demandé:
|
||||
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);
|
||||
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)
|
||||
// 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)
|
||||
&& ( (*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));
|
||||
else // Sinon, descendre la fenêtre (si possible)
|
||||
else // Sinon, descendre la fenêtre (si possible)
|
||||
if ((*offset_first)+10<Filelist.Nb_elements)
|
||||
Display_file_list(&Filelist, ++(*offset_first),*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)
|
||||
// Si la sélection peut monter
|
||||
// Si la sélection peut monter
|
||||
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)
|
||||
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)
|
||||
/*
|
||||
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 -1 si le sélecteur est vide.
|
||||
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 -1 si le sélecteur est vide.
|
||||
*/
|
||||
{
|
||||
short computed_offset;
|
||||
@ -1148,7 +1148,7 @@ void Display_bookmark(T_Dropdown_button * Button, int bookmark_number)
|
||||
if (Config.Bookmark_directory[bookmark_number])
|
||||
{
|
||||
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);
|
||||
label_size=strlen(Config.Bookmark_label[bookmark_number]);
|
||||
if (label_size<8)
|
||||
@ -1163,7 +1163,7 @@ void Display_bookmark(T_Dropdown_button * Button, int bookmark_number)
|
||||
}
|
||||
else
|
||||
{
|
||||
// Libellé
|
||||
// Libellé
|
||||
Print_in_window(Button->Pos_X+3+10,Button->Pos_Y+2,"--------",MC_Dark,MC_Light);
|
||||
// Menu apparait sur clic droit ou gauche
|
||||
Button->Active_button=RIGHT_SIDE|LEFT_SIDE;
|
||||
@ -1181,8 +1181,8 @@ void Print_current_directory(void)
|
||||
//
|
||||
{
|
||||
char converted_name[MAX_PATH_CHARACTERS];
|
||||
int length; // length du répertoire courant
|
||||
int index; // index de parcours de la chaine complète
|
||||
int length; // length du répertoire courant
|
||||
int index; // index de parcours de la chaine complète
|
||||
|
||||
strncpy(converted_name,Selector->Directory,sizeof(converted_name));
|
||||
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);
|
||||
}
|
||||
|
||||
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.
|
||||
|
||||
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);
|
||||
|
||||
// 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);
|
||||
// On affiche le nouveau nom de fichier
|
||||
Print_filename_in_fileselector();
|
||||
// On affiche le nom du répertoire courant
|
||||
// On affiche le nom du répertoire courant
|
||||
Print_current_directory();
|
||||
}
|
||||
|
||||
@ -1352,14 +1352,14 @@ void Scroll_fileselector(T_Scroller_button * file_scroller)
|
||||
|
||||
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)
|
||||
{
|
||||
// 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;
|
||||
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);
|
||||
if (strcmp(old_filename,Selector_filename))
|
||||
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);
|
||||
|
||||
Hide_cursor();
|
||||
// Mise à jour du scroller
|
||||
// Mise à jour du scroller
|
||||
list->Scroller->Position=list->List_start;
|
||||
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];
|
||||
short temp;
|
||||
unsigned int format;
|
||||
int dummy=0; // Sert à appeler SDL_GetKeyState
|
||||
int dummy=0; // Sert à appeler SDL_GetKeyState
|
||||
byte save_or_load_image=0;
|
||||
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.
|
||||
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.
|
||||
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];
|
||||
word save_filename_unicode[MAX_PATH_CHARACTERS];
|
||||
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));
|
||||
Prepare_and_display_filelist(Selector->Position,Selector->Offset,file_scroller);
|
||||
|
||||
// On initialise le nom de fichier à celui en cours et non pas celui sous
|
||||
// la barre de sélection
|
||||
// On initialise le nom de fichier à celui en cours et non pas celui sous
|
||||
// la barre de sélection
|
||||
strcpy(Selector_filename,context->File_name);
|
||||
Unicode_strlcpy(Selector_filename_unicode, context->File_name_unicode, 256);
|
||||
// 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)
|
||||
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)
|
||||
@ -1759,7 +1759,7 @@ byte Button_Load_or_Save(T_Selector_settings *settings, byte load, T_IO_Context
|
||||
if (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.
|
||||
if ( (Selector->Position)
|
||||
&& (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)
|
||||
{
|
||||
// On met à jour le décalage
|
||||
// On met à jour le décalage
|
||||
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);
|
||||
// On affiche le nouveau nom de fichier
|
||||
Print_filename_in_fileselector();
|
||||
// On affiche à nouveau la liste
|
||||
// On affiche à nouveau la liste
|
||||
Display_file_list(&Filelist, Selector->Position,Selector->Offset);
|
||||
|
||||
// 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
|
||||
{
|
||||
// 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
|
||||
// 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
|
||||
// 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)
|
||||
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
|
||||
Hide_cursor();
|
||||
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);
|
||||
// On affiche le nouveau nom de fichier
|
||||
Print_filename_in_fileselector();
|
||||
// On affiche à nouveau la liste
|
||||
// On affiche à nouveau la liste
|
||||
Display_file_list(&Filelist, Selector->Position,Selector->Offset);
|
||||
Display_cursor();
|
||||
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)
|
||||
Unicode_strlcpy(Selector_filename_unicode, filename_unicode, sizeof(Selector_filename_unicode)/sizeof(word));
|
||||
#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.
|
||||
for(temp=0,dummy=0; ((Selector_filename[temp]) && (!dummy)); 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
|
||||
Hide_cursor();
|
||||
// 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->Offset=0;
|
||||
// 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)
|
||||
{
|
||||
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])
|
||||
{
|
||||
// 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
|
||||
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];
|
||||
strcpy(bookmark_label, Config.Bookmark_label[clicked_button-10]);
|
||||
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;
|
||||
case SDLK_BACKSPACE : // Backspace
|
||||
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))
|
||||
{
|
||||
// On va dans le répertoire parent.
|
||||
// On va dans le répertoire parent.
|
||||
strcpy(Selector_filename,PARENT_DIR);
|
||||
Selector_filename_unicode[0] = 0;
|
||||
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)
|
||||
{
|
||||
// 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.
|
||||
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
|
||||
if (New_preview_is_needed)
|
||||
{
|
||||
// On efface les infos de la preview précédente s'il y en a une
|
||||
// d'affichée
|
||||
// On efface les infos de la preview précédente s'il y en a une
|
||||
// d'affichée
|
||||
if (Timer_state==2)
|
||||
{
|
||||
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);
|
||||
// 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);
|
||||
// On efface les dimensions de l'image
|
||||
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);
|
||||
}
|
||||
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);
|
||||
// Zone de preview
|
||||
Update_window_area(183,95,PREVIEW_WIDTH,PREVIEW_HEIGHT);
|
||||
}
|
||||
|
||||
New_preview_is_needed=0;
|
||||
Timer_state=0; // State du chrono = Attente d'un Xème de seconde
|
||||
// On lit le temps de départ du chrono
|
||||
Timer_state=0; // State du chrono = Attente d'un Xème de seconde
|
||||
// On lit le temps de départ du chrono
|
||||
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) );
|
||||
@ -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.
|
||||
Back_color=initial_back_color;
|
||||
if (Windows_open <= 1)
|
||||
|
||||
344
src/graph.c
344
src/graph.c
File diff suppressed because it is too large
Load Diff
48
src/help.c
48
src/help.c
@ -2,7 +2,7 @@
|
||||
*/
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2008 Peter Gordon
|
||||
Copyright 2008 Yves Rizoud
|
||||
Copyright 2008 Franck Charlet
|
||||
@ -75,7 +75,7 @@ word * Shortcut(word shortcut_number)
|
||||
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_*
|
||||
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");
|
||||
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 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 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;
|
||||
short repeat_menu_x_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 == '-')
|
||||
width = width*2;
|
||||
|
||||
// Pour chaque ligne dans la fenêtre:
|
||||
// Pour chaque ligne dans la fenêtre:
|
||||
for (y=0;y<8;y++)
|
||||
{
|
||||
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++)
|
||||
{
|
||||
// Recherche du caractère dans les fontes de l'aide.
|
||||
// Ligne titre : Si l'indice est impair on dessine le quart de caractère
|
||||
// Recherche du caractère dans les fontes de l'aide.
|
||||
// Ligne titre : Si l'indice est impair on dessine le quart de caractère
|
||||
// qui va a gauche, sinon celui qui va a droite.
|
||||
if (line_type=='T')
|
||||
{
|
||||
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)
|
||||
char_pixel=&(Gfx->Help_font_t2[(unsigned char)(line[char_index/2])-' '][0][0]);
|
||||
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=='-')
|
||||
{
|
||||
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)
|
||||
char_pixel=&(Gfx->Help_font_t4[(unsigned char)(line[char_index/2])-' '][0][0]);
|
||||
else
|
||||
@ -396,11 +396,11 @@ void Display_help(void)
|
||||
const short x_pos=13;
|
||||
const short y_pos=19;
|
||||
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;
|
||||
char buffer[45]; // buffer texte utilisé pour formater les noms de
|
||||
char buffer[45]; // buffer texte utilisé pour formater les noms de
|
||||
// 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 width;
|
||||
|
||||
@ -412,8 +412,8 @@ void Display_help(void)
|
||||
Window_rectangle (x_pos,
|
||||
y_pos + line_index*8,
|
||||
44*6,
|
||||
// 44 = Nb max de char (+1 pour éviter les plantages en mode X
|
||||
// causés par une largeur = 0)
|
||||
// 44 = Nb max de char (+1 pour éviter les plantages en mode X
|
||||
// causés par une largeur = 0)
|
||||
(16 - line_index)*8,
|
||||
MC_Black);
|
||||
break;
|
||||
@ -421,7 +421,7 @@ void Display_help(void)
|
||||
// On affiche la ligne
|
||||
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;
|
||||
// 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))
|
||||
line = Help_section[Current_help_section].Help_table[start_line + line_index - 1].Text;
|
||||
else if (line_type == 'K')
|
||||
@ -494,8 +494,8 @@ void Button_Help(int btn)
|
||||
}
|
||||
Window_help(-1, NULL);
|
||||
}
|
||||
// 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.
|
||||
// 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.
|
||||
void Window_help(int section, const char *sub_section)
|
||||
{
|
||||
short clicked_button;
|
||||
@ -523,7 +523,7 @@ void Window_help(int section, const char *sub_section)
|
||||
|
||||
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_rectangle(9, 18, 272, 130, MC_Black);
|
||||
|
||||
@ -568,7 +568,7 @@ void Window_help(int section, const char *sub_section)
|
||||
case 'K':
|
||||
Window_set_shortcut(Help_section[Current_help_section].Help_table[Help_position+line].Line_parameter);
|
||||
break;
|
||||
// Ici on peut gérer un cas 'lien hypertexte'
|
||||
// Ici on peut gérer un cas 'lien hypertexte'
|
||||
default:
|
||||
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)
|
||||
{
|
||||
case SDLK_UP : // Haut
|
||||
@ -861,14 +861,14 @@ void Button_Stats(int btn)
|
||||
Print_in_window(122,y,buffer,STATS_DATA_COLOR,MC_Black);
|
||||
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);
|
||||
memset(color_usage,0,sizeof(color_usage));
|
||||
sprintf(buffer,"%d",Count_used_colors(color_usage));
|
||||
Print_in_window(122,y,buffer,STATS_DATA_COLOR,MC_Black);
|
||||
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);
|
||||
sprintf(buffer,"%dx%d",Screen_width,Screen_height);
|
||||
Print_in_window(106,y,buffer,STATS_DATA_COLOR,MC_Black);
|
||||
|
||||
@ -53,7 +53,7 @@ void Window_set_shortcut(int action_id);
|
||||
/// 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);
|
||||
|
||||
// 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_*
|
||||
const char * Keyboard_shortcut_value(word shortcut_number);
|
||||
|
||||
|
||||
@ -766,7 +766,7 @@ T_Key_config ConfigKey[NB_SHORTCUTS] = {
|
||||
"pixel in the picture into the",
|
||||
"foreground or background color.",
|
||||
true,
|
||||
SDLK_BACKQUOTE, // `~ (Key sous le Esc - ² en AZERTY)
|
||||
SDLK_BACKQUOTE, // `~ (Key sous le Esc - ² en AZERTY)
|
||||
0},
|
||||
{82,
|
||||
"Swap foreground/background colors",
|
||||
@ -1097,7 +1097,7 @@ T_Key_config ConfigKey[NB_SHORTCUTS] = {
|
||||
"user-defined brush to its center.",
|
||||
"",
|
||||
true,
|
||||
SDLK_KP5|MOD_CTRL, // Ctrl + 5 (pavé numérique)
|
||||
SDLK_KP5|MOD_CTRL, // Ctrl + 5 (pavé numérique)
|
||||
0},
|
||||
{113,
|
||||
"Top-left brush attachment point",
|
||||
@ -1193,7 +1193,7 @@ T_Key_config ConfigKey[NB_SHORTCUTS] = {
|
||||
"previous in the user-defined color",
|
||||
"series.",
|
||||
true,
|
||||
SDLK_MINUS, // "-_" (")°" en AZERTY
|
||||
SDLK_MINUS, // "-_" (")°" en AZERTY
|
||||
0},
|
||||
{128,
|
||||
"Next user-defined backcolor",
|
||||
@ -1209,7 +1209,7 @@ T_Key_config ConfigKey[NB_SHORTCUTS] = {
|
||||
"previous in the user-defined color",
|
||||
"series.",
|
||||
true,
|
||||
SDLK_MINUS|MOD_SHIFT, // Shift + "-_" (")°" en AZERTY
|
||||
SDLK_MINUS|MOD_SHIFT, // Shift + "-_" (")°" en AZERTY
|
||||
0},
|
||||
{121,
|
||||
"Shrink paintbrush",
|
||||
@ -1875,8 +1875,8 @@ word Ordering[NB_SHORTCUTS]=
|
||||
0x200+BUTTON_AIRBRUSH, // Spray menu
|
||||
0x100+BUTTON_FLOODFILL, // Floodfill
|
||||
0x200+BUTTON_FLOODFILL, // Replace color
|
||||
0x100+BUTTON_CURVES, // Bézier's curves
|
||||
0x200+BUTTON_CURVES, // Bézier's curve with 3 or 4 points
|
||||
0x100+BUTTON_CURVES, // Bézier's curves
|
||||
0x200+BUTTON_CURVES, // Bézier's curve with 3 or 4 points
|
||||
0x100+BUTTON_RECTANGLES, // Empty rectangle
|
||||
0x100+BUTTON_FILLRECT, // Filled rectangle
|
||||
0x100+BUTTON_CIRCLES, // Empty circle
|
||||
@ -1921,8 +1921,8 @@ word Ordering[NB_SHORTCUTS]=
|
||||
0x200+BUTTON_BRUSH, // Restore brush
|
||||
SPECIAL_FLIP_X, // Flip X
|
||||
SPECIAL_FLIP_Y, // Flip Y
|
||||
SPECIAL_ROTATE_90, // 90° brush rotation
|
||||
SPECIAL_ROTATE_180, // 180° brush rotation
|
||||
SPECIAL_ROTATE_90, // 90° brush rotation
|
||||
SPECIAL_ROTATE_180, // 180° brush rotation
|
||||
SPECIAL_STRETCH, // Stretch brush
|
||||
SPECIAL_DISTORT, // Distort brush
|
||||
SPECIAL_OUTLINE, // Outline brush
|
||||
|
||||
64
src/init.c
64
src/init.c
@ -2,7 +2,7 @@
|
||||
*/
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2008 Peter Gordon
|
||||
Copyright 2008 Yves Rizoud
|
||||
Copyright 2009 Franck Charlet
|
||||
@ -265,8 +265,8 @@ byte Parse_skin(SDL_Surface * gui, T_Gui_skin *gfx)
|
||||
int i,j;
|
||||
int cursor_x=0,cursor_y=0;
|
||||
byte color;
|
||||
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
|
||||
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_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_4=0; // 3 4
|
||||
@ -289,7 +289,7 @@ byte Parse_skin(SDL_Surface * gui, T_Gui_skin *gfx)
|
||||
// Read the 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);
|
||||
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);
|
||||
} while(color==gfx->Color[0]);
|
||||
// Carré "foncé"
|
||||
// Carré "foncé"
|
||||
gfx->Color[1] = color;
|
||||
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);
|
||||
} while(color==gfx->Color[1]);
|
||||
// Carré "clair"
|
||||
// Carré "clair"
|
||||
gfx->Color[2] = color;
|
||||
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);
|
||||
} while(color==gfx->Color[2]);
|
||||
// Carré "blanc"
|
||||
// Carré "blanc"
|
||||
gfx->Color[3] = color;
|
||||
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);
|
||||
} while(color==gfx->Color[3]);
|
||||
// Carré "transparent"
|
||||
// Carré "transparent"
|
||||
gfx->Color_trans=color;
|
||||
do
|
||||
{
|
||||
@ -878,7 +878,7 @@ void Init_buttons(void)
|
||||
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,
|
||||
"Paintbrush choice ",
|
||||
@ -1241,7 +1241,7 @@ void Init_buttons(void)
|
||||
Init_button(BUTTON_CHOOSE_COL,
|
||||
"Color #" ,
|
||||
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_Select_forecolor,Button_Select_backcolor,
|
||||
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,
|
||||
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)
|
||||
{
|
||||
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 stack_index; // Taille de la pile en cours d'auto-initialisation
|
||||
#define HIDE_CURSOR 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 (Button=0;Button<3;Button++)
|
||||
@ -1468,7 +1468,7 @@ void Init_operations(void)
|
||||
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,
|
||||
Freehand_mode1_1_0,HIDE_CURSOR,0);
|
||||
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,
|
||||
short height,
|
||||
@ -1959,7 +1959,7 @@ void Set_video_mode(short width,
|
||||
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)
|
||||
{
|
||||
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.Beta1== 96))
|
||||
{
|
||||
// Les touches (scancodes) sont à convertir)
|
||||
// Les touches (scancodes) sont à convertir)
|
||||
key_conversion = 1;
|
||||
}
|
||||
// Version SDL jusqu'a 98%
|
||||
@ -2202,7 +2202,7 @@ int Load_CFG(int reload_all)
|
||||
goto Erreur_lecture_config;
|
||||
}
|
||||
break;
|
||||
case CHUNK_VIDEO_MODES: // Modes vidéo
|
||||
case CHUNK_VIDEO_MODES: // Modes vidéo
|
||||
for (index=0; index<(long)(Chunk.Size/5); index++)
|
||||
{
|
||||
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 &&
|
||||
Video_mode[index2].Height==cfg_video_mode.Height)
|
||||
{
|
||||
// On ne prend le paramètre utilisateur que si la résolution
|
||||
// est effectivement supportée par SDL
|
||||
// Seules les deux petits bits sont récupérés, car les anciens fichiers
|
||||
// On ne prend le paramètre utilisateur que si la résolution
|
||||
// est effectivement supportée par SDL
|
||||
// Seules les deux petits bits sont récupérés, car les anciens fichiers
|
||||
// de configuration (DOS 96.5%) utilisaient d'autres bits.
|
||||
if (! (Video_mode[index2].State & 128))
|
||||
Video_mode[index2].State=cfg_video_mode.State&3;
|
||||
@ -2283,7 +2283,7 @@ int Load_CFG(int reload_all)
|
||||
goto Erreur_lecture_config;
|
||||
}
|
||||
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
|
||||
// is now loaded/saved in GIF and IFF formats.
|
||||
// The chunk will be completely ignored.
|
||||
@ -2537,7 +2537,7 @@ int Save_CFG(void)
|
||||
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;
|
||||
#if defined(__GP2X__) || defined (__WIZ__) || defined (__CAANOO__)
|
||||
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)
|
||||
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.Size=modes_to_save * 5;
|
||||
|
||||
@ -2573,7 +2573,7 @@ int Save_CFG(void)
|
||||
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.Size=8209;
|
||||
if (!Write_byte(Handle, Chunk.Number) ||
|
||||
@ -2611,7 +2611,7 @@ int Save_CFG(void)
|
||||
if (!Write_bytes(Handle, Stencil,256))
|
||||
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
|
||||
// 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]))
|
||||
goto Erreur_sauvegarde_config;
|
||||
|
||||
// Sauvegarde des couleurs à exclure
|
||||
// Sauvegarde des couleurs à exclure
|
||||
Chunk.Number=CHUNK_EXCLUDE_COLORS;
|
||||
Chunk.Size=256;
|
||||
if (!Write_byte(Handle, Chunk.Number) ||
|
||||
@ -2787,7 +2787,7 @@ Erreur_sauvegarde_config:
|
||||
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)
|
||||
{
|
||||
int index, index2;
|
||||
@ -2820,7 +2820,7 @@ void Set_config_defaults(void)
|
||||
for (index2=0; index2<512; index2++)
|
||||
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 (index2=0; index2<16; index2++)
|
||||
Shade_list[0].List[index*17+index2]=index*16+index2+16;
|
||||
|
||||
@ -217,7 +217,7 @@ int Move_cursor_with_constraints()
|
||||
Input_new_mouse_X=Screen_width-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
|
||||
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());
|
||||
// TODO: systeme de répétition
|
||||
// TODO: systeme de répétition
|
||||
|
||||
return Move_cursor_with_constraints();
|
||||
}
|
||||
@ -830,7 +830,7 @@ int Directional_acceleration(int msec)
|
||||
if (msec<initial_delay)
|
||||
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
|
||||
// b = 1/linear_factor
|
||||
// c = 1
|
||||
@ -842,7 +842,7 @@ int Directional_acceleration(int msec)
|
||||
int Get_input(int sleep_time)
|
||||
{
|
||||
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();
|
||||
// Commit any pending screen update.
|
||||
|
||||
36
src/io.c
36
src/io.c
@ -3,7 +3,7 @@
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2018 Thomas Bernard
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2008 Yves Rizoud
|
||||
Copyright 2007 Adrien Destugues
|
||||
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
|
||||
@ -22,7 +22,7 @@
|
||||
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.
|
||||
|
||||
#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);
|
||||
}
|
||||
|
||||
// Détermine la position du dernier '/' ou '\\' dans une chaine,
|
||||
// typiquement pour séparer le nom de file d'un chemin.
|
||||
// Détermine la position du dernier '/' ou '\\' dans une chaine,
|
||||
// typiquement pour séparer le nom de file d'un chemin.
|
||||
// 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
|
||||
char * Find_last_separator(const char * str)
|
||||
{
|
||||
@ -192,7 +192,7 @@ char * Find_last_separator(const char * str)
|
||||
position = str;
|
||||
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)
|
||||
{
|
||||
const char * position = Find_last_separator(source);
|
||||
@ -202,7 +202,7 @@ void Extract_filename(char *dest, const char *source)
|
||||
else
|
||||
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)
|
||||
{
|
||||
char * position=NULL;
|
||||
@ -315,8 +315,8 @@ int Position_last_dot_unicode(const word * fname)
|
||||
}
|
||||
|
||||
int File_exists(const char * fname)
|
||||
// Détermine si un file passé en paramètre existe ou non dans le
|
||||
// répertoire courant.
|
||||
// Détermine si un file passé en paramètre existe ou non dans le
|
||||
// répertoire courant.
|
||||
{
|
||||
#if defined(WIN32)
|
||||
return (INVALID_FILE_ATTRIBUTES == GetFileAttributesA(fname)) ? 0 : 1;
|
||||
@ -333,8 +333,8 @@ int File_exists(const char * fname)
|
||||
}
|
||||
|
||||
int Directory_exists(const char * directory)
|
||||
// Détermine si un répertoire passé en paramètre existe ou non dans le
|
||||
// répertoire courant.
|
||||
// Détermine si un répertoire passé en paramètre existe ou non dans le
|
||||
// répertoire courant.
|
||||
{
|
||||
#if defined(WIN32)
|
||||
DWORD attr = GetFileAttributesA(directory);
|
||||
@ -342,14 +342,14 @@ int Directory_exists(const char * directory)
|
||||
return 0;
|
||||
return (attr & FILE_ATTRIBUTE_DIRECTORY) ? 1 : 0;
|
||||
#else
|
||||
DIR* entry; // Structure de lecture des éléments
|
||||
DIR* entry; // Structure de lecture des éléments
|
||||
|
||||
if (strcmp(directory,PARENT_DIR)==0)
|
||||
return 1;
|
||||
else
|
||||
{
|
||||
// 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...
|
||||
// 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...
|
||||
|
||||
entry=opendir(directory);
|
||||
if (entry==NULL)
|
||||
@ -450,13 +450,13 @@ void For_each_file(const char * directory_name, void Callback(const char *, cons
|
||||
FindClose(h);
|
||||
}
|
||||
#else
|
||||
// Pour scan de répertoire
|
||||
DIR* current_directory; //Répertoire courant
|
||||
struct dirent* entry; // Structure de lecture des éléments
|
||||
// Pour scan de répertoire
|
||||
DIR* current_directory; //Répertoire courant
|
||||
struct dirent* entry; // Structure de lecture des éléments
|
||||
int filename_position;
|
||||
strcpy(full_filename, 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);
|
||||
#if defined(__AROS__)
|
||||
if (filename_position==0 || (strcmp(full_filename+filename_position-1,PATH_SEPARATOR) && strcmp(full_filename+filename_position-1,":")))
|
||||
|
||||
2
src/io.h
2
src/io.h
@ -3,7 +3,7 @@
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2018 Thomas Bernard
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2008 Yves Rizoud
|
||||
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
|
||||
|
||||
|
||||
@ -345,7 +345,7 @@ word Keysym_to_keycode(SDL_keysym keysym)
|
||||
word key_code = 0;
|
||||
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 ||
|
||||
keysym.sym == SDLK_RCTRL || keysym.sym == SDLK_LCTRL ||
|
||||
keysym.sym == SDLK_RALT || keysym.sym == SDLK_LALT ||
|
||||
@ -353,8 +353,8 @@ word Keysym_to_keycode(SDL_keysym keysym)
|
||||
keysym.sym == SDLK_MODE) // AltGr
|
||||
return 0;
|
||||
|
||||
// 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)
|
||||
// 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)
|
||||
if (keysym.sym != 0)
|
||||
key_code = keysym.sym;
|
||||
else if (keysym.scancode != 0)
|
||||
@ -610,7 +610,7 @@ const char * Key_name(word key)
|
||||
return buffer;
|
||||
}
|
||||
|
||||
// Touches au libellé connu
|
||||
// Touches au libellé connu
|
||||
for (index=0; index < (long)sizeof(key_labels)/(long)sizeof(T_key_label);index++)
|
||||
{
|
||||
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.
|
||||
// (Valeur 32 à 255)
|
||||
// Renvoie 0 s'il n'y a pas de caractère associé (shift, backspace, etc)
|
||||
// Obtient le caractère ANSI tapé, à partir d'un keysym.
|
||||
// (Valeur 32 à 255)
|
||||
// Renvoie 0 s'il n'y a pas de caractère associé (shift, backspace, etc)
|
||||
word Keysym_to_ANSI(SDL_keysym keysym)
|
||||
{
|
||||
// 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)
|
||||
{
|
||||
case 0x8100:
|
||||
return '\xfc'; // ü
|
||||
return '\xfc'; // ü
|
||||
case 0x1A20:
|
||||
return '\xe9'; // é
|
||||
return '\xe9'; // é
|
||||
case 0x201A:
|
||||
return '\xe8'; // è
|
||||
return '\xe8'; // è
|
||||
case 0x9201:
|
||||
return '\xe2'; // â
|
||||
return '\xe2'; // â
|
||||
case 0x1E20:
|
||||
return '\xe4'; // ä
|
||||
return '\xe4'; // ä
|
||||
case 0x2620:
|
||||
return '\xe0'; // à
|
||||
return '\xe0'; // à
|
||||
case 0x2020:
|
||||
return '\xe5'; // å
|
||||
return '\xe5'; // å
|
||||
case 0x2120:
|
||||
return '\xe7'; // ç
|
||||
return '\xe7'; // ç
|
||||
case 0xC602:
|
||||
return '\xea'; // ê
|
||||
return '\xea'; // ê
|
||||
case 0x3020:
|
||||
return '\xeb'; // ë
|
||||
return '\xeb'; // ë
|
||||
case 0x6001:
|
||||
return '\xe8'; // è
|
||||
return '\xe8'; // è
|
||||
case 0x3920:
|
||||
return '\xef'; // ï
|
||||
return '\xef'; // ï
|
||||
case 0x5201:
|
||||
return '\xee'; // î
|
||||
return '\xee'; // î
|
||||
case 0x8D00:
|
||||
return '\xec'; // ì
|
||||
return '\xec'; // ì
|
||||
case 0x1C20:
|
||||
return '\xf4'; // ô
|
||||
return '\xf4'; // ô
|
||||
case 0x1D20:
|
||||
return '\xf6'; // ö
|
||||
return '\xf6'; // ö
|
||||
case 0x2220:
|
||||
return '\xf2'; // ò
|
||||
return '\xf2'; // ò
|
||||
case 0x1320:
|
||||
return '\xfb'; // û
|
||||
return '\xfb'; // û
|
||||
case 0x1420:
|
||||
return '\xf9'; // ù
|
||||
return '\xf9'; // ù
|
||||
case 0xDC02:
|
||||
return '\xff'; // ÿ
|
||||
return '\xff'; // ÿ
|
||||
case 0x5301:
|
||||
return '\xa3'; // £
|
||||
return '\xa3'; // £
|
||||
case 0xA000:
|
||||
return '\xe1'; // á
|
||||
return '\xe1'; // á
|
||||
case 0xA100:
|
||||
return '\xed'; // í
|
||||
return '\xed'; // í
|
||||
case 0xA200:
|
||||
return '\xf3'; // ó
|
||||
return '\xf3'; // ó
|
||||
case 0xA300:
|
||||
return '\xfa'; // ú
|
||||
return '\xfa'; // ú
|
||||
case 0xA400:
|
||||
return '\xf1'; // ñ
|
||||
return '\xf1'; // ñ
|
||||
case 0xA700:
|
||||
return '\xba'; // º
|
||||
return '\xba'; // º
|
||||
case 0xC600:
|
||||
return '\xe3'; // ã
|
||||
return '\xe3'; // ã
|
||||
case 0x20AC:
|
||||
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;
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
*/
|
||||
/* GFX2CRTC - libraw2crtc.c
|
||||
* CloudStrife - 20080921
|
||||
* Diffusé sous licence libre CeCILL v2
|
||||
* Diffusé sous licence libre CeCILL v2
|
||||
* Voire LICENCE
|
||||
*/
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
*/
|
||||
/* GFX2CRTC - libraw2crtc.h
|
||||
* CloudStrife - 20080921
|
||||
* Diffusé sous licence libre CeCILL v2
|
||||
* Diffusé sous licence libre CeCILL v2
|
||||
* Voire LICENCE
|
||||
*/
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
*/
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2010 Alexander Filyanov
|
||||
Copyright 2009 Petter Lindquist
|
||||
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)
|
||||
{
|
||||
// Chargement des pixels dans l'écran principal
|
||||
// Chargement des pixels dans l'écran principal
|
||||
case CONTEXT_MAIN_IMAGE:
|
||||
Pixel_in_current_screen(x_pos,y_pos,color);
|
||||
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)
|
||||
{
|
||||
int color;
|
||||
|
||||
// Génération de la palette
|
||||
// Génération de la palette
|
||||
for (color=0;color<256;color++)
|
||||
{
|
||||
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
|
||||
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);
|
||||
if (!context->Preview_bitmap)
|
||||
File_error=1;
|
||||
|
||||
// Affichage des données "Image size:"
|
||||
// Affichage des données "Image size:"
|
||||
memcpy(str, "VERY BIG!", 10); // default string
|
||||
if (context->Original_width != 0)
|
||||
{
|
||||
@ -359,7 +359,7 @@ void Pre_load(T_IO_Context *context, short width, short height, long file_size,
|
||||
}
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
// On efface le commentaire précédent
|
||||
// On efface le commentaire précédent
|
||||
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 &&
|
||||
Pixel_ratio != PIXEL_WIDE &&
|
||||
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_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);
|
||||
|
||||
// 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);
|
||||
// Zone de preview
|
||||
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:
|
||||
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.
|
||||
// Normalement tout va bien, tout est sous contrôle...
|
||||
// Normalement tout va bien, tout est sous contrôle...
|
||||
|
||||
// Load into layer 0, by default.
|
||||
context->Nb_layers=1;
|
||||
@ -428,7 +428,7 @@ void Pre_load(T_IO_Context *context, short width, short height, long file_size,
|
||||
else
|
||||
{
|
||||
// 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);
|
||||
Message_out_of_memory();
|
||||
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)
|
||||
@ -513,12 +513,12 @@ void Write_one_byte(FILE *file, byte b)
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// -------- 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
|
||||
// -------- 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
|
||||
// important de l'utiliser dans les cas du type:
|
||||
// if (!File_error) *** else File_error=***;
|
||||
// En fait, dans le cas où l'on modifie File_error alors qu'elle contient
|
||||
// dèjà un code d'erreur.
|
||||
// En fait, dans le cas où l'on modifie File_error alors qu'elle contient
|
||||
// dèjà un code d'erreur.
|
||||
void Set_file_error(int value)
|
||||
{
|
||||
if (File_error>=0)
|
||||
@ -530,7 +530,7 @@ void Set_file_error(int value)
|
||||
void Load_image(T_IO_Context *context)
|
||||
{
|
||||
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;
|
||||
byte old_cursor_shape;
|
||||
FILE * f;
|
||||
@ -538,7 +538,7 @@ void Load_image(T_IO_Context *context)
|
||||
// Not sure it's the best place...
|
||||
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:
|
||||
File_error=1;
|
||||
|
||||
@ -559,8 +559,8 @@ void Load_image(T_IO_Context *context)
|
||||
|
||||
if (File_error)
|
||||
{
|
||||
// Sinon, on va devoir scanner les différents formats qu'on connait pour
|
||||
// savoir à quel format est le fichier:
|
||||
// Sinon, on va devoir scanner les différents formats qu'on connait pour
|
||||
// savoir à quel format est le fichier:
|
||||
for (index=0; index < Nb_known_formats(); index++)
|
||||
{
|
||||
format = Get_fileformat(index);
|
||||
@ -571,7 +571,7 @@ void Load_image(T_IO_Context *context)
|
||||
fseek(f, 0, SEEK_SET); // rewind
|
||||
// On appelle le testeur du format:
|
||||
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)
|
||||
break;
|
||||
}
|
||||
@ -593,8 +593,8 @@ void Load_image(T_IO_Context *context)
|
||||
|
||||
if (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
|
||||
// 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
|
||||
// une preview), alors on flash l'utilisateur.
|
||||
//if (Pixel_load_function!=Pixel_load_in_preview)
|
||||
// Error(0);
|
||||
@ -602,12 +602,12 @@ void Load_image(T_IO_Context *context)
|
||||
}
|
||||
}
|
||||
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;
|
||||
// On peut charger le fichier:
|
||||
// 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);
|
||||
}
|
||||
|
||||
@ -754,7 +754,7 @@ void Load_image(T_IO_Context *context)
|
||||
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;
|
||||
// Et on documente la variable Main_fileformat avec la valeur:
|
||||
Main.fileformat=format->Identifier;
|
||||
@ -801,15 +801,15 @@ void Load_image(T_IO_Context *context)
|
||||
}
|
||||
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;
|
||||
// Et on documente la variable Main_fileformat avec la valeur:
|
||||
Main.fileformat=format->Identifier;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Dans ce cas, on sait que l'image n'a pas changé, mais ses
|
||||
// paramètres (dimension, palette, ...) si. Donc on les restaures.
|
||||
// Dans ce cas, on sait que l'image n'a pas changé, mais ses
|
||||
// paramètres (dimension, palette, ...) si. Donc on les restaures.
|
||||
Download_infos_page_main(Main.backups->Pages);
|
||||
}
|
||||
}
|
||||
@ -956,7 +956,7 @@ void Save_image(T_IO_Context *context)
|
||||
{
|
||||
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!)
|
||||
File_error=1;
|
||||
|
||||
@ -1204,7 +1204,7 @@ void Emergency_backup(const char *fname, byte *source, int width, int height, T_
|
||||
return;
|
||||
}
|
||||
|
||||
// Ouf, sauvé
|
||||
// Ouf, sauvé
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
|
||||
88
src/main.c
88
src/main.c
@ -2,7 +2,7 @@
|
||||
*/
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2009 Pasi Kallinen
|
||||
Copyright 2008 Peter Gordon
|
||||
Copyright 2008 Franck Charlet
|
||||
@ -97,7 +97,7 @@ extern char Program_version[]; // generated in pversion.c
|
||||
static int setsize_width;
|
||||
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)
|
||||
{
|
||||
int mode_index;
|
||||
@ -152,8 +152,8 @@ void Error_function(int error_code, const char *filename, int line_number, const
|
||||
|
||||
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.
|
||||
// Toutes les autres erreurs déclenchent toujours une sortie en catastrophe du programme !
|
||||
// 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 !
|
||||
memcpy(backup_palette, Get_current_palette(), sizeof(T_Palette));
|
||||
memcpy(temp_palette, backup_palette, sizeof(T_Palette));
|
||||
for (index=0;index<=255;index++)
|
||||
@ -444,10 +444,10 @@ int Analyze_command_line(int argc, char * argv[], char *main_filename, char *mai
|
||||
}
|
||||
break;
|
||||
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)
|
||||
{
|
||||
// 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);
|
||||
Display_syntax();
|
||||
exit(0);
|
||||
@ -534,9 +534,9 @@ int Init_program(int argc,char * argv[])
|
||||
#endif
|
||||
#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
|
||||
// invalide lors des appels aux multiples fonctions manipulées à
|
||||
// invalide lors des appels aux multiples fonctions manipulées à
|
||||
// l'initialisation du programme.
|
||||
Main.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);
|
||||
// Choose directory for settings (read/write)
|
||||
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);
|
||||
|
||||
// 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);
|
||||
|
||||
// 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);
|
||||
|
||||
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:
|
||||
|
||||
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.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.Format_filter=FORMAT_ALL_IMAGES;
|
||||
|
||||
Main.current_layer=0;
|
||||
@ -640,26 +640,26 @@ int Init_program(int argc,char * argv[])
|
||||
// Texte
|
||||
Init_text();
|
||||
|
||||
// On initialise tous les modes vidéo
|
||||
// On initialise tous les modes vidéo
|
||||
Set_all_video_modes();
|
||||
Pixel_ratio=PIXEL_SIMPLE;
|
||||
// On initialise les données sur l'état du programme:
|
||||
// Donnée sur la sortie du programme:
|
||||
// On initialise les données sur l'état du programme:
|
||||
// Donnée sur la sortie du programme:
|
||||
Quit_is_required=0;
|
||||
Quitting=0;
|
||||
// Données sur l'état du menu:
|
||||
// Données sur l'état du menu:
|
||||
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;
|
||||
// Données sur le curseur:
|
||||
// Données sur le curseur:
|
||||
Cursor_shape=CURSOR_SHAPE_TARGET;
|
||||
Cursor_hidden=0;
|
||||
// Données sur le pinceau:
|
||||
// Données sur le pinceau:
|
||||
Paintbrush_X=0;
|
||||
Paintbrush_Y=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;
|
||||
Selected_freehand_mode=OPERATION_CONTINUOUS_DRAW;
|
||||
Selected_line_mode =OPERATION_LINE;
|
||||
@ -677,10 +677,10 @@ int Init_program(int argc,char * argv[])
|
||||
// On initialise les infos du mode smooth:
|
||||
Smooth_mode=0;
|
||||
// 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
|
||||
// On initialise les infos sur les dégradés:
|
||||
Gradient_pixel =Display_pixel; // Les autres infos sont chargées avec la config
|
||||
// On initialise les infos sur les dégradés:
|
||||
Gradient_pixel =Display_pixel; // Les autres infos sont chargées avec la config
|
||||
// On initialise les infos de la grille:
|
||||
Snap_mode=0;
|
||||
Snap_width=8;
|
||||
@ -688,13 +688,13 @@ int Init_program(int argc,char * argv[])
|
||||
Snap_offset_X=0;
|
||||
Snap_offset_Y=0;
|
||||
// On initialise les infos du mode Colorize:
|
||||
Colorize_mode=0; // Mode colorize inactif 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_mode=0; // Mode colorize inactif 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
|
||||
Compute_colorize_table();
|
||||
// On initialise les infos du mode Tiling:
|
||||
Tiling_mode=0; // Pas besoin d'initialiser les décalages car ça se fait
|
||||
// en prenant une brosse (toujours mis à 0).
|
||||
Tiling_mode=0; // Pas besoin d'initialiser les décalages car ça se fait
|
||||
// en prenant une brosse (toujours mis à 0).
|
||||
// On initialise les infos du mode Mask:
|
||||
Mask_mode=0;
|
||||
|
||||
@ -704,11 +704,11 @@ int Init_program(int argc,char * argv[])
|
||||
Airbrush_delay=1;
|
||||
Airbrush_mono_flow=10;
|
||||
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
|
||||
Init_buttons();
|
||||
// Initialisation des opérations
|
||||
// Initialisation des opérations
|
||||
Init_operations();
|
||||
|
||||
// Initialize the brush container
|
||||
@ -741,7 +741,7 @@ int Init_program(int argc,char * argv[])
|
||||
switch(Load_CFG(1))
|
||||
{
|
||||
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;
|
||||
case ERROR_CFG_CORRUPTED:
|
||||
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);
|
||||
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 (!(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 ?
|
||||
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)
|
||||
Error(ERROR_MEMORY);
|
||||
// Update toolbars' visibility, now that the current image has a 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);
|
||||
|
||||
// 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_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();
|
||||
|
||||
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
|
||||
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);
|
||||
|
||||
// On initialise la brosse initiale à 1 pixel blanc:
|
||||
// On initialise la brosse initiale à 1 pixel blanc:
|
||||
Brush_width=1;
|
||||
Brush_height=1;
|
||||
for (temp=0;temp<256;temp++)
|
||||
@ -919,7 +919,7 @@ int Init_program(int argc,char * argv[])
|
||||
strcpy(Main.selector.Directory, main_directory);
|
||||
}
|
||||
|
||||
// Test de recuperation de fichiers sauvés
|
||||
// Test de recuperation de fichiers sauvés
|
||||
switch (Check_recovery())
|
||||
{
|
||||
T_IO_Context context;
|
||||
@ -1057,11 +1057,11 @@ void Program_shutdown(void)
|
||||
// Remove the safety backups, this is normal exit
|
||||
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);
|
||||
Horizontal_line_buffer = NULL;
|
||||
|
||||
// On libère le pinceau spécial
|
||||
// On libère le pinceau spécial
|
||||
free(Paintbrush_sprite);
|
||||
Paintbrush_sprite = NULL;
|
||||
|
||||
@ -1095,10 +1095,10 @@ void Program_shutdown(void)
|
||||
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)
|
||||
{
|
||||
// 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)
|
||||
{
|
||||
return_code=Save_CFG();
|
||||
@ -1143,7 +1143,7 @@ void Program_shutdown(void)
|
||||
}
|
||||
|
||||
|
||||
// -------------------------- Procédure principale ---------------------------
|
||||
// -------------------------- Procédure principale ---------------------------
|
||||
int main(int argc,char * argv[])
|
||||
{
|
||||
|
||||
|
||||
62
src/misc.c
62
src/misc.c
@ -2,7 +2,7 @@
|
||||
*/
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2008 Yves Rizoud
|
||||
Copyright 2008 Franck Charlet
|
||||
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
|
||||
}
|
||||
}
|
||||
//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++)
|
||||
{
|
||||
if (usage[i]!=0)
|
||||
@ -136,7 +136,7 @@ word Count_used_colors_area(dword* usage, word start_x, word start_y,
|
||||
// Init usage table
|
||||
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 (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++)
|
||||
{
|
||||
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)
|
||||
{
|
||||
// On désactive tous les raccourcis clavier
|
||||
// On désactive tous les raccourcis clavier
|
||||
|
||||
while(Mouse_K)
|
||||
Get_input(20);
|
||||
@ -233,7 +233,7 @@ void Clear_current_image(byte color)
|
||||
}
|
||||
|
||||
void Init_chrono(dword delay)
|
||||
// Démarrer le chrono
|
||||
// Démarrer le chrono
|
||||
{
|
||||
Timer_delay = delay;
|
||||
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);
|
||||
|
||||
// Passe à la ligne suivante
|
||||
// Passe à la ligne suivante
|
||||
esi+=source_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)
|
||||
{
|
||||
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)
|
||||
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
|
||||
memcpy(dest,src,Brush_width);
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=image_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=Main.palette[color].R;
|
||||
|
||||
// On récupère les 3 composantes RVB
|
||||
// On récupère les 3 composantes RVB
|
||||
|
||||
// blue
|
||||
blue = (Factors_inv_table[blue]
|
||||
@ -513,7 +513,7 @@ void Flip_Y_lowlevel(byte *src, short width, short height)
|
||||
|
||||
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)
|
||||
|
||||
for(cx = width;cx>0;cx--)
|
||||
@ -526,9 +526,9 @@ void Flip_Y_lowlevel(byte *src, short width, short height)
|
||||
}
|
||||
|
||||
// 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
|
||||
// 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
|
||||
}
|
||||
}
|
||||
@ -550,7 +550,7 @@ void Flip_X_lowlevel(byte *src, short width, short height)
|
||||
line_start = ESI;
|
||||
line_end = EDI;
|
||||
|
||||
// On échange par colonnes
|
||||
// On échange par colonnes
|
||||
for(cx=height;cx>0;cx--)
|
||||
{
|
||||
tmp=*ESI;
|
||||
@ -562,16 +562,16 @@ void Flip_X_lowlevel(byte *src, short width, short height)
|
||||
|
||||
// On change de colonne
|
||||
// ESI > colonne suivante
|
||||
// EDI > colonne précédente
|
||||
// EDI > colonne précédente
|
||||
ESI = line_start + 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)
|
||||
{
|
||||
// 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
|
||||
byte* ESI = src;
|
||||
byte* EDI = src + height*width - 1;
|
||||
@ -591,9 +591,9 @@ void Rotate_180_deg_lowlevel(byte *src, short width, short height)
|
||||
|
||||
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)
|
||||
// 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
|
||||
|
||||
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 y_pos_in_brush;
|
||||
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_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 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
|
||||
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;
|
||||
|
||||
// Pour chaque colonne:
|
||||
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;
|
||||
// On copie le pixel:
|
||||
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* 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;
|
||||
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 - x_offset,src+length,x_offset);
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest += 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);
|
||||
}
|
||||
#else
|
||||
// Indique quelle est la mémoire disponible
|
||||
// Indique quelle est la mémoire disponible
|
||||
unsigned long Memory_free(void)
|
||||
{
|
||||
// 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...
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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"
|
||||
// Renvoie -1 si la chaine n'est pas convertible
|
||||
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;
|
||||
for (mode_index=0; mode_index<Nb_video_modes; mode_index++)
|
||||
// Attention les vieilles fonctions de lecture .ini mettent tout en MAJUSCULE.
|
||||
|
||||
10
src/misc.h
10
src/misc.h
@ -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);
|
||||
|
||||
// -- 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
|
||||
// 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_start; // Heure de départ du chrono
|
||||
GFX2_GLOBAL byte New_preview_is_needed; // Booléen "Il faut relancer le chrono de preview"
|
||||
// 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_start; // Heure de départ du chrono
|
||||
GFX2_GLOBAL byte New_preview_is_needed; // Booléen "Il faut relancer le chrono de preview"
|
||||
|
||||
|
||||
#if defined (__MINT__)
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2018 Thomas Bernard
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2009 Petter Lindquist
|
||||
Copyright 2008 Yves Rizoud
|
||||
Copyright 2008 Franck Charlet
|
||||
@ -198,7 +198,7 @@ void Load_GPL(T_IO_Context * context)
|
||||
fclose(file);
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
@ -250,7 +250,7 @@ void Load_PAL(T_IO_Context * context)
|
||||
if ((file=Open_file_read(context)))
|
||||
{
|
||||
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))
|
||||
{
|
||||
T_Palette palette_64;
|
||||
@ -324,7 +324,7 @@ void Load_PAL(T_IO_Context * context)
|
||||
fclose(file);
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
@ -399,9 +399,9 @@ void Test_PKM(T_IO_Context * context, FILE * file)
|
||||
Read_bytes(file,&header.Palette,sizeof(T_Palette)) &&
|
||||
Read_word_le(file,&header.Jump))
|
||||
{
|
||||
// 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.
|
||||
// Donc pas la peine de s'emm...er à regarder si la méthode est à 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.
|
||||
// Donc pas la peine de s'emm...er à regarder si la méthode est à 0.
|
||||
if ( (!memcmp(&header,"PKM",4)) && header.Width && header.Height)
|
||||
File_error=0;
|
||||
}
|
||||
@ -476,7 +476,7 @@ void Load_PKM(T_IO_Context * context)
|
||||
File_error=2;
|
||||
break;
|
||||
|
||||
case 1 : // Dimensions de l'écran d'origine
|
||||
case 1 : // Dimensions de l'écran d'origine
|
||||
if (Read_byte(file,&temp_byte))
|
||||
{
|
||||
if (temp_byte==4)
|
||||
@ -547,7 +547,7 @@ void Load_PKM(T_IO_Context * context)
|
||||
// Header size is 780
|
||||
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) )
|
||||
{
|
||||
if(Read_byte(file, &temp_byte)!=1)
|
||||
@ -565,7 +565,7 @@ void Load_PKM(T_IO_Context * context)
|
||||
Compteur_de_donnees_packees++;
|
||||
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
|
||||
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
|
||||
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;
|
||||
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++)
|
||||
if (Find_recon[index]<NBest)
|
||||
{
|
||||
@ -643,7 +643,7 @@ void Load_PKM(T_IO_Context * context)
|
||||
}
|
||||
*recog1=best;
|
||||
|
||||
// Enfin recog2 devient la 2ème moins utilisée
|
||||
// Enfin recog2 devient la 2ème moins utilisée
|
||||
*recog2=0;
|
||||
best=0;
|
||||
NBest=INT_MAX;
|
||||
@ -706,7 +706,7 @@ void Save_PKM(T_IO_Context * context)
|
||||
{
|
||||
|
||||
// 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)
|
||||
{
|
||||
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++)
|
||||
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,4);
|
||||
Write_one_byte(file,Screen_width&0xFF);
|
||||
@ -803,8 +803,8 @@ void Save_PKM(T_IO_Context * context)
|
||||
File_error=1;
|
||||
fclose(file);
|
||||
}
|
||||
// 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.
|
||||
// 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.
|
||||
if (File_error)
|
||||
Remove_file(context);
|
||||
}
|
||||
@ -847,7 +847,7 @@ void Test_CEL(T_IO_Context * context, FILE * file)
|
||||
Read_word_le(file,&header1.Height) )
|
||||
{
|
||||
// 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;
|
||||
if ( (!size) || ( (((header1.Width+1)>>1)*header1.Height)!=size ) )
|
||||
@ -929,7 +929,7 @@ void Load_CEL(T_IO_Context * context)
|
||||
}
|
||||
else
|
||||
{
|
||||
// On réessaye avec le nouveau format
|
||||
// On réessaye avec le nouveau format
|
||||
|
||||
fseek(file,0,SEEK_SET);
|
||||
if (Read_bytes(file,header2.Signature,4)
|
||||
@ -957,7 +957,7 @@ void Load_CEL(T_IO_Context * context)
|
||||
|
||||
if (!File_error)
|
||||
{
|
||||
// Effacement du décalage
|
||||
// Effacement du décalage
|
||||
for (y_pos=0;y_pos<header2.Y_offset;y_pos++)
|
||||
for (x_pos=0;x_pos<context->Width;x_pos++)
|
||||
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);
|
||||
|
||||
// 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++);
|
||||
|
||||
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.Height=context->Height;
|
||||
@ -1066,9 +1066,9 @@ void Save_CEL(T_IO_Context * context)
|
||||
}
|
||||
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 (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) ||
|
||||
!Read_byte(file,&header1.Palette[pal_index].color[color_index].Byte2))
|
||||
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 (color_index=0;color_index<16;color_index++)
|
||||
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);
|
||||
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 (color_index=0;color_index<16 && !File_error;color_index++)
|
||||
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);
|
||||
// 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++);
|
||||
|
||||
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 (color_index=0;color_index<16;color_index++)
|
||||
@ -1356,7 +1356,7 @@ void Save_KCF(T_IO_Context * context)
|
||||
}
|
||||
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
|
||||
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.Width=256; // Initialisation du nombre de couleurs
|
||||
header2.Height=1; // Initialisation du nombre de palettes
|
||||
header2.X_offset=0; // Initialisation du décalage X
|
||||
header2.Y_offset=0; // Initialisation du décalage Y
|
||||
header2.X_offset=0; // Initialisation du décalage X
|
||||
header2.Y_offset=0; // Initialisation du décalage Y
|
||||
for (index=0;index<16;index++) // Initialisation du filler 2 (?)
|
||||
header2.Filler2[index]=0;
|
||||
|
||||
@ -1407,9 +1407,9 @@ void Save_KCF(T_IO_Context * context)
|
||||
|
||||
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 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;
|
||||
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];
|
||||
for (i=0;i<16;i++)
|
||||
{
|
||||
// Pour décoder le pixel n°i, il faut traiter les 4 words sur leur bit
|
||||
// correspondant à celui du masque
|
||||
// Pour décoder le pixel n°i, il faut traiter les 4 words sur leur bit
|
||||
// correspondant à celui du masque
|
||||
|
||||
dest[i]=((w0 & byte_mask)?0x01: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)
|
||||
{
|
||||
int i; // index du pixel à calculer
|
||||
int i; // index du pixel à calculer
|
||||
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;
|
||||
w0=w1=w2=w3=0;
|
||||
for (i=0;i<16;i++)
|
||||
{
|
||||
// Pour coder le pixel n°i, il faut modifier les 4 words sur leur bit
|
||||
// correspondant à celui du masque
|
||||
// Pour coder le pixel n°i, il faut modifier les 4 words sur leur bit
|
||||
// correspondant à celui du masque
|
||||
|
||||
w0|=(src[i] & 0x01)?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)
|
||||
{
|
||||
int i; // Numéro de la couleur traitée
|
||||
int i; // Numéro de la couleur traitée
|
||||
int ip; // index dans la palette
|
||||
word w; // Word contenant le code
|
||||
|
||||
// Schéma d'un word =
|
||||
// Schéma d'un word =
|
||||
//
|
||||
// Low High
|
||||
// VVVV RRRR | 0000 BBBB
|
||||
@ -1502,11 +1502,11 @@ void PI1_decode_palette(byte * src,byte * palette)
|
||||
|
||||
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
|
||||
word w; // Word contenant le code
|
||||
|
||||
// Schéma d'un word =
|
||||
// Schéma d'un word =
|
||||
//
|
||||
// Low High
|
||||
// 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)
|
||||
{
|
||||
int size; // Taille du fichier
|
||||
word resolution; // Résolution de l'image
|
||||
word resolution; // Résolution de l'image
|
||||
|
||||
(void)context;
|
||||
File_error=1;
|
||||
|
||||
// Vérification de la taille
|
||||
// Vérification de la taille
|
||||
size=File_length_file(file);
|
||||
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 (resolution==0x0000)
|
||||
@ -1639,7 +1639,7 @@ void Load_PI1(T_IO_Context * context)
|
||||
File_error=0;
|
||||
if ((file=Open_file_read(context)))
|
||||
{
|
||||
// allocation d'un buffer mémoire
|
||||
// allocation d'un buffer mémoire
|
||||
buffer=(byte *)malloc(32034);
|
||||
if (buffer!=NULL)
|
||||
{
|
||||
@ -1655,7 +1655,7 @@ void Load_PI1(T_IO_Context * context)
|
||||
memset(context->Palette,0,sizeof(T_Palette));
|
||||
PI1_decode_palette(buffer+2,(byte *)context->Palette);
|
||||
|
||||
// Chargement/décompression de l'image
|
||||
// Chargement/décompression de l'image
|
||||
ptr=buffer+34;
|
||||
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);
|
||||
|
||||
// allocation d'un buffer mémoire
|
||||
// allocation d'un buffer mémoire
|
||||
buffer=(byte *)malloc(32034);
|
||||
// Codage de la résolution
|
||||
// Codage de la résolution
|
||||
buffer[0]=0x00;
|
||||
buffer[1]=0x00;
|
||||
// Codage de la palette
|
||||
@ -1730,13 +1730,13 @@ void Save_PI1(T_IO_Context * context)
|
||||
{
|
||||
fclose(file);
|
||||
}
|
||||
else // Error d'écriture (disque plein ou protégé)
|
||||
else // Error d'écriture (disque plein ou protégé)
|
||||
{
|
||||
fclose(file);
|
||||
Remove_file(context);
|
||||
File_error=1;
|
||||
}
|
||||
// Libération du buffer mémoire
|
||||
// Libération du buffer mémoire
|
||||
free(buffer);
|
||||
buffer = NULL;
|
||||
}
|
||||
@ -1751,12 +1751,12 @@ void Save_PI1(T_IO_Context * context)
|
||||
|
||||
//////////////////////////////////// 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)
|
||||
{
|
||||
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;)
|
||||
{
|
||||
@ -1772,19 +1772,19 @@ void PC1_uncompress_packbits(byte * src,byte * dest)
|
||||
}
|
||||
else
|
||||
{
|
||||
// Recopier n+1 octets littéralement
|
||||
// Recopier n+1 octets littéralement
|
||||
n=n+1;
|
||||
for (;(n>0) && (id<32000);n--)
|
||||
dest[id++]=src[is++];
|
||||
}
|
||||
|
||||
// Contrôle des erreurs
|
||||
// Contrôle des erreurs
|
||||
if (n>0)
|
||||
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)
|
||||
{
|
||||
@ -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 id = 0; // index dans la destination
|
||||
int ir; // index de la répétition
|
||||
int n; // Taille des séquences
|
||||
int repet; // "Il y a répétition"
|
||||
int ir; // index de la répétition
|
||||
int n; // Taille des séquences
|
||||
int repet; // "Il y a répétition"
|
||||
|
||||
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
|
||||
|
||||
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)
|
||||
{
|
||||
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++];
|
||||
}
|
||||
|
||||
// On code la partie sans répétitions
|
||||
// On code la partie sans répétitions
|
||||
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++)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
// On renseigne la taille du buffer compressé
|
||||
// On renseigne la taille du buffer compressé
|
||||
*dest_size+=id;
|
||||
// Move for next 40-byte block
|
||||
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)
|
||||
{
|
||||
int i,j; // Compteurs
|
||||
int ip; // index du pixel à calculer
|
||||
int ip; // index du pixel à calculer
|
||||
byte byte_mask; // Masque de decodage
|
||||
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)
|
||||
{
|
||||
int i,j; // Compteurs
|
||||
int ip; // index du pixel à calculer
|
||||
int ip; // index du pixel à calculer
|
||||
byte byte_mask; // Masque de decodage
|
||||
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)
|
||||
{
|
||||
int size; // Taille du fichier
|
||||
word resolution; // Résolution de l'image
|
||||
word resolution; // Résolution de l'image
|
||||
|
||||
(void)context;
|
||||
File_error=1;
|
||||
|
||||
// Vérification de la taille
|
||||
// Vérification de la taille
|
||||
size=File_length_file(file);
|
||||
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 (resolution==0x0080)
|
||||
@ -1951,7 +1951,7 @@ void Load_PC1(T_IO_Context * context)
|
||||
if ((file=Open_file_read(context)))
|
||||
{
|
||||
size=File_length_file(file);
|
||||
// allocation des buffers mémoire
|
||||
// allocation des buffers mémoire
|
||||
buffercomp=(byte *)malloc(size);
|
||||
bufferdecomp=(byte *)malloc(32000);
|
||||
if ( (buffercomp!=NULL) && (bufferdecomp!=NULL) )
|
||||
@ -1968,14 +1968,14 @@ void Load_PC1(T_IO_Context * context)
|
||||
memset(context->Palette,0,sizeof(T_Palette));
|
||||
PI1_decode_palette(buffercomp+2,(byte *)context->Palette);
|
||||
|
||||
// Décompression du buffer
|
||||
// Décompression du buffer
|
||||
PC1_uncompress_packbits(buffercomp+34,bufferdecomp);
|
||||
|
||||
// Décodage de l'image
|
||||
// Décodage de l'image
|
||||
ptr=bufferdecomp;
|
||||
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);
|
||||
ptr+=160;
|
||||
// Chargement de la ligne
|
||||
@ -2025,10 +2025,10 @@ void Save_PC1(T_IO_Context * context)
|
||||
{
|
||||
setvbuf(file, NULL, _IOFBF, 64*1024);
|
||||
|
||||
// Allocation des buffers mémoire
|
||||
// Allocation des buffers mémoire
|
||||
bufferdecomp=(byte *)malloc(32000);
|
||||
buffercomp =(byte *)malloc(64066);
|
||||
// Codage de la résolution
|
||||
// Codage de la résolution
|
||||
buffercomp[0]=0x80;
|
||||
buffercomp[1]=0x00;
|
||||
// Codage de la palette
|
||||
@ -2060,13 +2060,13 @@ void Save_PC1(T_IO_Context * context)
|
||||
{
|
||||
fclose(file);
|
||||
}
|
||||
else // Error d'écriture (disque plein ou protégé)
|
||||
else // Error d'écriture (disque plein ou protégé)
|
||||
{
|
||||
fclose(file);
|
||||
Remove_file(context);
|
||||
File_error=1;
|
||||
}
|
||||
// Libération des buffers mémoire
|
||||
// Libération des buffers mémoire
|
||||
free(bufferdecomp);
|
||||
free(buffercomp);
|
||||
buffercomp = bufferdecomp = NULL;
|
||||
@ -2085,12 +2085,12 @@ void Save_PC1(T_IO_Context * context)
|
||||
void Test_NEO(T_IO_Context * context, FILE * file)
|
||||
{
|
||||
int size; // Taille du fichier
|
||||
word resolution; // Résolution de l'image
|
||||
word resolution; // Résolution de l'image
|
||||
|
||||
(void)context;
|
||||
File_error=1;
|
||||
|
||||
// Vérification de la taille
|
||||
// Vérification de la taille
|
||||
size=File_length_file(file);
|
||||
if ((size==32128))
|
||||
{
|
||||
@ -2101,7 +2101,7 @@ void Test_NEO(T_IO_Context * context, FILE * file)
|
||||
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 (resolution==0 || resolution==1 || resolution==2)
|
||||
@ -2121,7 +2121,7 @@ void Load_NEO(T_IO_Context * context)
|
||||
File_error=0;
|
||||
if ((file=Open_file_read(context)))
|
||||
{
|
||||
// allocation d'un buffer mémoire
|
||||
// allocation d'un buffer mémoire
|
||||
buffer=(byte *)malloc(32128);
|
||||
if (buffer!=NULL)
|
||||
{
|
||||
@ -2135,10 +2135,10 @@ void Load_NEO(T_IO_Context * context)
|
||||
// Initialisation de la palette
|
||||
if (Config.Clear_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);
|
||||
|
||||
// Chargement/décompression de l'image
|
||||
// Chargement/décompression de l'image
|
||||
ptr=buffer+128;
|
||||
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);
|
||||
|
||||
// allocation d'un buffer mémoire
|
||||
// allocation d'un buffer mémoire
|
||||
buffer=(byte *)malloc(32128);
|
||||
// Codage de la résolution
|
||||
// Codage de la résolution
|
||||
buffer[0]=0x00;
|
||||
buffer[1]=0x00;
|
||||
buffer[2]=0x00;
|
||||
@ -2211,13 +2211,13 @@ void Save_NEO(T_IO_Context * context)
|
||||
{
|
||||
fclose(file);
|
||||
}
|
||||
else // Error d'écriture (disque plein ou protégé)
|
||||
else // Error d'écriture (disque plein ou protégé)
|
||||
{
|
||||
fclose(file);
|
||||
Remove_file(context);
|
||||
File_error=1;
|
||||
}
|
||||
// Libération du buffer mémoire
|
||||
// Libération du buffer mémoire
|
||||
free(buffer);
|
||||
buffer = NULL;
|
||||
}
|
||||
|
||||
40
src/op_c.c
40
src/op_c.c
@ -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)
|
||||
@ -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].max=cs->clusters->data.pal.h;
|
||||
ds->gradients[0].hue=cs->clusters->data.pal.h;
|
||||
// Et hop : le 1er ensemble de d‚grad‚s est initialis‚
|
||||
// Et hop : le 1er ensemble de dégradés est initialisé
|
||||
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));
|
||||
if (n!=NULL)
|
||||
{
|
||||
// On recopie les paramètres demandés
|
||||
// On recopie les paramètres demandés
|
||||
n->nb_max=cs->nb_max;
|
||||
|
||||
// On tente d'allouer la table
|
||||
@ -1061,7 +1061,7 @@ T_Gradient_set * GS_New(T_Cluster_set * cs)
|
||||
GS_Init(n,cs);
|
||||
else
|
||||
{
|
||||
// Table impossible à allouer
|
||||
// Table impossible à allouer
|
||||
free(n);
|
||||
n=NULL;
|
||||
}
|
||||
@ -1079,15 +1079,15 @@ void GS_Delete(T_Gradient_set * ds)
|
||||
void GS_Generate(T_Gradient_set * ds,T_Cluster_set * cs)
|
||||
{
|
||||
int id; // Les indexs de parcours des ensembles
|
||||
int best_gradient; // Meilleur d‚grad‚
|
||||
int best_diff; // Meilleure diff‚rence de chrominance
|
||||
int best_gradient; // Meilleur dégradé
|
||||
int best_diff; // Meilleure différence de chrominance
|
||||
int diff; // difference de chrominance courante
|
||||
T_Cluster * current = cs->clusters;
|
||||
|
||||
// Pour chacun des clusters … traiter
|
||||
// Pour chacun des clusters … traiter
|
||||
do
|
||||
{
|
||||
// On recherche le d‚grad‚ 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_diff=99999999;
|
||||
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 d‚grad‚ dans lequel inclure le cluster
|
||||
// Si on a trouvé un dégradé dans lequel inclure le cluster
|
||||
if (best_gradient!=-1)
|
||||
{
|
||||
// On met … jour le d‚grad‚
|
||||
// On met à jour le dégradé
|
||||
if (current->data.pal.h < ds->gradients[best_gradient].min)
|
||||
ds->gradients[best_gradient].min=current->data.pal.h;
|
||||
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
|
||||
{
|
||||
// On cr‚e un nouveau d‚grad‚
|
||||
// On crée un nouveau dégradé
|
||||
best_gradient=ds->nb;
|
||||
ds->gradients[best_gradient].nb_colors=1;
|
||||
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:
|
||||
current =source; // Le pixel dont on s'occupe
|
||||
next =current+width; // Le pixel en dessous
|
||||
c_plus1 =current+1; // Le pixel à droite
|
||||
u_minus1=next-1; // Le pixel en bas à gauche
|
||||
u_plus1 =next+1; // Le pixel en bas à droite
|
||||
c_plus1 =current+1; // Le pixel à droite
|
||||
u_minus1=next-1; // Le pixel en bas à gauche
|
||||
u_plus1 =next+1; // Le pixel en bas à droite
|
||||
d =dest;
|
||||
|
||||
// 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
|
||||
*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;
|
||||
green -=palette[*d].G;
|
||||
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->B=Modified_value(c_plus1->B,e_blue );
|
||||
}
|
||||
// En bas à gauche:
|
||||
// En bas à gauche:
|
||||
if (y_pos+1<height)
|
||||
{
|
||||
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->G=Modified_value(next->G,e_green );
|
||||
next->B=Modified_value(next->B,e_blue );
|
||||
// En bas à droite:
|
||||
// En bas à droite:
|
||||
if (x_pos+1<width)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
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);
|
||||
|
||||
#else
|
||||
// On essaye d'obtenir une table de conversion qui loge en mémoire, avec la
|
||||
// meilleure précision possible
|
||||
// On essaye d'obtenir une table de conversion qui loge en mémoire, avec la
|
||||
// meilleure précision possible
|
||||
for (ip=0;ip<(10*3);ip+=3)
|
||||
{
|
||||
table = Optimize_palette(source,width*height,palette,
|
||||
|
||||
58
src/op_c.h
58
src/op_c.h
@ -33,38 +33,38 @@
|
||||
#include "struct.h"
|
||||
#include "colorred.h"
|
||||
|
||||
//////////////////////////////////////////////// Définition des types de base
|
||||
//////////////////////////////////////////////// Définition des types de base
|
||||
|
||||
typedef T_Components * T_Bitmap24B;
|
||||
typedef byte * T_Bitmap256;
|
||||
|
||||
|
||||
///////////////////////////////////////// Définition d'une table d'occurences
|
||||
///////////////////////////////////////// Définition d'une table d'occurences
|
||||
|
||||
typedef struct
|
||||
{
|
||||
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_b; // Nb de bits de précision sur les bleu
|
||||
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_b; // Nb de bits de précision sur les bleu
|
||||
|
||||
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_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_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_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_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_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_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_b; // Coefficient réducteur de traduction d'une couleur bleue (= 8-nbb_b)
|
||||
|
||||
int * table;
|
||||
} T_Occurrence_table;
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////// Définition d'un ensemble de couleur
|
||||
///////////////////////////////////////// Définition d'un ensemble de couleur
|
||||
|
||||
struct S_Cluster_CutData
|
||||
{
|
||||
@ -80,9 +80,9 @@ struct S_Cluster_CutData
|
||||
struct S_Cluster_PalData
|
||||
{
|
||||
// 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 l; // Luminosité
|
||||
byte l; // Luminosité
|
||||
};
|
||||
|
||||
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
|
||||
{
|
||||
@ -122,25 +122,25 @@ typedef struct
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////////////////// Définition d'un dégradé
|
||||
///////////////////////////////////////////////////// Définition d'un dégradé
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int nb_colors; // Nombre de couleurs dans le dégradé
|
||||
float min; // Chrominance minimale du dégradé
|
||||
float max; // Chrominance maximale du dégradé
|
||||
float hue; // Chrominance moyenne du dégradé
|
||||
int nb_colors; // Nombre de couleurs dans le dégradé
|
||||
float min; // Chrominance minimale du dégradé
|
||||
float max; // Chrominance maximale du dégradé
|
||||
float hue; // Chrominance moyenne du dégradé
|
||||
} T_Gradient;
|
||||
|
||||
|
||||
|
||||
///////////////////////////////////////// Définition d'un ensemble de dégradé
|
||||
///////////////////////////////////////// Définition d'un ensemble de dégradé
|
||||
|
||||
typedef struct
|
||||
{
|
||||
int nb; // Nombre de dégradés dans l'ensemble
|
||||
int nb_max; // Nombre maximum de dégradés
|
||||
T_Gradient * gradients; // Les dégradés
|
||||
int nb; // Nombre de dégradés dans l'ensemble
|
||||
int nb_max; // Nombre maximum de dégradés
|
||||
T_Gradient * gradients; // Les dégradés
|
||||
} T_Gradient_set;
|
||||
|
||||
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);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////// Méthodes de gestion des tables d'occurence //
|
||||
/////////////////////////////// Méthodes de gestion des tables d'occurence //
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
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);
|
||||
@ -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);
|
||||
@ -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);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////// 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);
|
||||
@ -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..
|
||||
int Convert_24b_bitmap_to_256(T_Bitmap256 dest,T_Bitmap24B source,int width,int height,T_Components * palette);
|
||||
|
||||
|
||||
554
src/operatio.c
554
src/operatio.c
File diff suppressed because it is too large
Load Diff
100
src/pages.c
100
src/pages.c
@ -165,7 +165,7 @@ T_Gradient_array *Dup_gradient(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 size_is_modified;
|
||||
@ -393,7 +393,7 @@ void Redraw_current_layer(void)
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
@ -428,7 +428,7 @@ void Update_FX_feedback(byte with_feedback)
|
||||
|
||||
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;
|
||||
for (i=0; i<page->Nb_layers; i++)
|
||||
{
|
||||
@ -448,7 +448,7 @@ void Clear_page(T_Page * page)
|
||||
|
||||
page->Width=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)
|
||||
@ -473,8 +473,8 @@ void Init_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
|
||||
// pages allouée auquel cas celle-ci serait perdue.
|
||||
// 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.
|
||||
T_Page * page;
|
||||
|
||||
// On initialise chacune des nouvelles pages
|
||||
@ -493,26 +493,26 @@ int Allocate_list_of_pages(T_List_of_pages * list)
|
||||
if (!page->Gradients)
|
||||
return 0;
|
||||
|
||||
return 1; // Succès
|
||||
return 1; // Succès
|
||||
}
|
||||
|
||||
|
||||
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:
|
||||
// +---+-+-+-+-+-+-+-+-+-+ |
|
||||
// ¦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
|
||||
// ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ |_ A=page la plus ancienne
|
||||
// v v v v v v v v v v v | 1=DerniÞre page (1er backup)
|
||||
// ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ |_ A=page la plus ancienne
|
||||
// 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
|
||||
// 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
|
||||
// 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
|
||||
// sortie, ainsi que celles relatives à la plus récente page d'undo (1ère
|
||||
// page de la liste).
|
||||
|
||||
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)
|
||||
{
|
||||
// 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:
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+ |
|
||||
// |0|1|2|3|4|5|6|7|8|9|A| |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+ | 0=page courante
|
||||
// | | | | | | | | | | | |_ 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| |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+ |
|
||||
|
||||
// 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
|
||||
// sortie, ainsi que celles relatives à la plus récente page d'undo (1ère
|
||||
// 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
|
||||
// sortie, ainsi que celles relatives à la plus récente page d'undo (1ère
|
||||
// page de la liste).
|
||||
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)
|
||||
{
|
||||
// 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.
|
||||
if (list->List_size>1)
|
||||
{
|
||||
// On fait faire un undo à la liste, comme ça, la nouvelle page courante
|
||||
// est la page précédente
|
||||
// On fait faire un undo à la liste, comme ça, la nouvelle page courante
|
||||
// est la page précédente
|
||||
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);
|
||||
}
|
||||
}
|
||||
@ -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)
|
||||
{
|
||||
// width et height correspondent à la dimension des images de départ.
|
||||
// width et height correspondent à la dimension des images de départ.
|
||||
int i;
|
||||
|
||||
if (! Allocate_list_of_pages(Main.backups) ||
|
||||
! Allocate_list_of_pages(Spare.backups))
|
||||
return 0;
|
||||
// On a réussi à allouer deux listes de pages dont la taille correspond à
|
||||
// celle demandée par l'utilisateur.
|
||||
// On a réussi à allouer deux listes de pages dont la taille correspond à
|
||||
// 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);
|
||||
// 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->Height=height;
|
||||
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(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.
|
||||
// (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
|
||||
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);
|
||||
if (!new_page)
|
||||
{
|
||||
@ -893,7 +893,7 @@ int Backup_with_new_dimensions(int width,int height)
|
||||
T_Page * new_page;
|
||||
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);
|
||||
if (!new_page)
|
||||
{
|
||||
@ -1039,7 +1039,7 @@ int Backup_and_resize_the_spare(int width,int height)
|
||||
int 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);
|
||||
if (!new_page)
|
||||
{
|
||||
@ -1075,8 +1075,8 @@ int Backup_and_resize_the_spare(int width,int height)
|
||||
}
|
||||
|
||||
void Backup(void)
|
||||
// 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
|
||||
// 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
|
||||
{
|
||||
Backup_layers(Main.current_layer);
|
||||
}
|
||||
@ -1091,7 +1091,7 @@ void Backup_layers(int layer)
|
||||
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)
|
||||
Upload_infos_page(&Main);
|
||||
|
||||
@ -1204,20 +1204,20 @@ void Undo(void)
|
||||
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)
|
||||
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);
|
||||
|
||||
Update_buffers(Main.backups->Pages->Width, Main.backups->Pages->Height);
|
||||
|
||||
// On extrait ensuite les infos sur la nouvelle page courante
|
||||
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
|
||||
// n'est pas utilisé à la suite d'un Undo. Donc ça ne devrait pas
|
||||
// poser de problèmes.
|
||||
// n'est pas utilisé à la suite d'un Undo. Donc ça ne devrait pas
|
||||
// poser de problèmes.
|
||||
|
||||
Check_layers_limits();
|
||||
Redraw_layered_image();
|
||||
@ -1237,20 +1237,20 @@ void Redo(void)
|
||||
Free_page_of_a_list(Main.backups);
|
||||
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)
|
||||
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);
|
||||
|
||||
Update_buffers(Main.backups->Pages->Width, Main.backups->Pages->Height);
|
||||
|
||||
// On extrait ensuite les infos sur la nouvelle page courante
|
||||
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
|
||||
// n'est pas utilisé à la suite d'un Redo. Donc ça ne devrait pas
|
||||
// poser de problèmes.
|
||||
// n'est pas utilisé à la suite d'un Redo. Donc ça ne devrait pas
|
||||
// poser de problèmes.
|
||||
|
||||
Check_layers_limits();
|
||||
Redraw_layered_image();
|
||||
@ -1262,15 +1262,15 @@ void Redo(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);
|
||||
|
||||
// On extrait ensuite les infos sur la nouvelle page courante
|
||||
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
|
||||
// n'est pas utilisé à la suite d'une destruction de page. Donc ça ne
|
||||
// devrait pas poser de problèmes.
|
||||
// n'est pas utilisé à la suite d'une destruction de page. Donc ça ne
|
||||
// devrait pas poser de problèmes.
|
||||
|
||||
Update_buffers(Main.backups->Pages->Width, Main.backups->Pages->Height);
|
||||
Check_layers_limits();
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
*/
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2007 Adrien Destugues
|
||||
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
|
||||
|
||||
|
||||
248
src/palette.c
248
src/palette.c
@ -57,9 +57,9 @@ int RGB_scale = 256; // 24bit
|
||||
|
||||
// Nombre de graduations pour une composante dans le mode actuel
|
||||
int Color_count=256;
|
||||
// Les composantes vont de 0 à (Color_count-1)
|
||||
// Les composantes vont de 0 à (Color_count-1)
|
||||
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.
|
||||
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)
|
||||
{
|
||||
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)
|
||||
// Formate une chaine de 4 caractères+\0 : "nnn "
|
||||
// Formate une chaine de 4 caractères+\0 : "nnn "
|
||||
{
|
||||
Num2str(value,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)
|
||||
// Modifie la palette pour obtenir un dégradé de couleur entre les deux bornes
|
||||
// passées en paramètre
|
||||
// Modifie la palette pour obtenir un dégradé de couleur entre les deux bornes
|
||||
// passées en paramètre
|
||||
{
|
||||
short start_red;
|
||||
short start_green;
|
||||
@ -219,8 +219,8 @@ void Spread_colors(short start,short end,T_Palette palette)
|
||||
short end_blue;
|
||||
short index;
|
||||
|
||||
// On vérifie qu'il y ait assez de couleurs entre le début et la fin pour
|
||||
// pouvoir faire un dégradé:
|
||||
// On vérifie qu'il y ait assez de couleurs entre le début et la fin pour
|
||||
// pouvoir faire un dégradé:
|
||||
if ( (start!=end) && (start+1!=end) )
|
||||
{
|
||||
start_red = Encode_component(palette[start].R);
|
||||
@ -358,7 +358,7 @@ void Remap_image_highlevel(byte * 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)
|
||||
end_y=Menu_Y_before_window;
|
||||
else
|
||||
@ -390,19 +390,19 @@ void Remap_image_highlevel(byte * conversion_table)
|
||||
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);
|
||||
|
||||
if (Main.magnifier_mode)
|
||||
{
|
||||
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
|
||||
// partie zoomée ne descend pas jusqu'en bas...
|
||||
// Il peut encore rester le bas de la barre de split à remapper si la
|
||||
// partie zoomée ne descend pas jusqu'en bas...
|
||||
Remap_zone_highlevel(Main.separator_position,end_y_mag,
|
||||
(Main.separator_position+(SEPARATOR_WIDTH*Menu_factor_X)),
|
||||
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);
|
||||
}
|
||||
|
||||
@ -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
|
||||
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.
|
||||
for (pos_1=0;pos_1<=255;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_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].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)
|
||||
pos_2=block_1_start;
|
||||
else
|
||||
@ -457,7 +457,7 @@ void Swap(int with_remap,short block_1_start,short block_2_start,short block_siz
|
||||
else
|
||||
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++)
|
||||
{
|
||||
@ -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].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)
|
||||
pos_2=block_2_start;
|
||||
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;
|
||||
|
||||
// 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])
|
||||
|
||||
// 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++)
|
||||
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.
|
||||
for (index2=0; index2<4; index2++)
|
||||
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;
|
||||
}
|
||||
|
||||
// On trie maintenant la table dans le sens décroissant.
|
||||
// (Ce n'est pas indispensable, mais ça fera plus joli dans la palette).
|
||||
// On trie maintenant la table dans le sens décroissant.
|
||||
// (Ce n'est pas indispensable, mais ça fera plus joli dans la palette).
|
||||
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++)
|
||||
{
|
||||
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);
|
||||
|
||||
// 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++)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
// 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
|
||||
Hide_cursor();
|
||||
for (index=0; index<4; index++)
|
||||
@ -580,7 +580,7 @@ void Set_nice_menu_colors(dword * color_usage,int not_picture)
|
||||
}
|
||||
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);
|
||||
}
|
||||
Display_cursor();
|
||||
@ -600,20 +600,20 @@ void Reduce_palette(short * used_colors,int nb_colors_asked,T_Palette palette,dw
|
||||
dword used;
|
||||
dword best_used;
|
||||
|
||||
// On commence par initialiser la table de conversion dans un état où
|
||||
// aucune conversion ne sera effectuée.
|
||||
// On commence par initialiser la table de conversion dans un état où
|
||||
// aucune conversion ne sera effectuée.
|
||||
for (color_1=0; color_1<=255; color_1++)
|
||||
conversion_table[color_1]=color_1;
|
||||
|
||||
// Si on ne connait pas encore le nombre de couleurs utilisées, on le
|
||||
// calcule! (!!! La fonction appelée Efface puis Affiche le curseur !!!)
|
||||
// Si on ne connait pas encore le nombre de couleurs utilisées, on le
|
||||
// calcule! (!!! La fonction appelée Efface puis Affiche le curseur !!!)
|
||||
if ((*used_colors)<0)
|
||||
Update_color_count(used_colors,color_usage);
|
||||
|
||||
Hide_cursor();
|
||||
|
||||
// On tasse la palette vers le début parce qu'elle doit ressembler à
|
||||
// du Gruyère (et comme Papouille il aime pas le fromage...)
|
||||
// On tasse la palette vers le début parce qu'elle doit ressembler à
|
||||
// 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
|
||||
// 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].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];
|
||||
|
||||
// On va maintenant s'occuper de la table de conversion:
|
||||
conversion_table[color_1]=color_2;
|
||||
|
||||
// Maintenant, la place désignée par color_2 est occupée, alors on
|
||||
// doit passer à un indice de destination suivant.
|
||||
// Maintenant, la place désignée par color_2 est occupée, alors on
|
||||
// doit passer à un indice de destination suivant.
|
||||
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++)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
// 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é.
|
||||
// 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é.
|
||||
// (The stop condition is further down)
|
||||
while (1)
|
||||
{
|
||||
// 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
|
||||
// une seule couleur qui est la moyenne pondérée de ces 2 couleurs
|
||||
// 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
|
||||
// en fonction de leur utilisation dans l'image.
|
||||
|
||||
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)
|
||||
break;
|
||||
|
||||
// Maintenant qu'on les a trouvées, on va pouvoir mettre à jour nos
|
||||
// données pour que le remplacement se fasse sans encombres.
|
||||
// Maintenant qu'on les a trouvées, on va pouvoir mettre à jour nos
|
||||
// données pour que le remplacement se fasse sans encombres.
|
||||
|
||||
// En somme, on va remplacer best_color_2 par best_color_1,
|
||||
// mais attention, on ne remplace pas best_color_1 par
|
||||
// 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)+
|
||||
(color_usage[best_color_2]*palette[best_color_2].R),
|
||||
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),
|
||||
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_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++)
|
||||
{
|
||||
if (conversion_table[color_1]==best_color_2)
|
||||
{
|
||||
// La color_1 avait déjà prévue de se faire remplacer par la
|
||||
// couleur que l'on veut maintenant éliminer. On va maintenant
|
||||
// demander à ce que la color_1 se fasse 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
|
||||
// demander à ce que la color_1 se fasse remplacer par la
|
||||
// best_color_1.
|
||||
conversion_table[color_1]=best_color_1;
|
||||
}
|
||||
}
|
||||
|
||||
// Bon, maintenant que l'on a fait bouger nos petites choses concernants
|
||||
// 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
|
||||
// couleur en arrière.
|
||||
// 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
|
||||
// couleur en arrière.
|
||||
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.
|
||||
|
||||
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
|
||||
// couleur qui la précède.
|
||||
// Donc on transfère son utilisation dans l'utilisation de la
|
||||
// couleur qui la précède.
|
||||
color_usage[color_1-1]=color_usage[color_1];
|
||||
|
||||
// Et on transfère ses teintes dans les teintes de la couleur qui
|
||||
// la précède.
|
||||
// Et on transfère ses teintes dans les teintes de la couleur qui
|
||||
// la précède.
|
||||
palette[color_1-1].R=palette[color_1].R;
|
||||
palette[color_1-1].G=palette[color_1].G;
|
||||
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.
|
||||
if (conversion_table[color_1]>best_color_2)
|
||||
// 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]--;
|
||||
}
|
||||
|
||||
// On vient d'éjecter une couleur, donc on peut mettre à jour le nombre
|
||||
// de couleurs utilisées.
|
||||
// On vient d'éjecter une couleur, donc on peut mettre à jour le nombre
|
||||
// de couleurs utilisées.
|
||||
(*used_colors)--;
|
||||
|
||||
// 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].G=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.
|
||||
color_usage[*used_colors]=0;
|
||||
|
||||
// Après avoir éjecté une couleur, on le fait savoir à l'utilisateur par
|
||||
// l'intermédiaire du compteur de nombre utilisées.
|
||||
// Après avoir éjecté une couleur, on le fait savoir à l'utilisateur par
|
||||
// l'intermédiaire du compteur de nombre utilisées.
|
||||
Num2str(*used_colors,str,3);
|
||||
Print_in_window(COUNT_X,COUNT_Y,str,MC_Black,MC_Light);
|
||||
}
|
||||
|
||||
// Maintenant, tous ces calculs doivent êtres pris en compte dans la
|
||||
// palette, l'image et à l'écran.
|
||||
Remap_image_highlevel(conversion_table); // Et voila pour l'image et l'écran
|
||||
// Maintenant, tous ces calculs doivent êtres pris en compte dans la
|
||||
// palette, l'image et à l'écran.
|
||||
Remap_image_highlevel(conversion_table); // Et voila pour l'image et l'écran
|
||||
Display_cursor();
|
||||
}
|
||||
|
||||
@ -849,10 +849,10 @@ void Draw_all_palette_sliders(T_Scroller_button * red_slider,
|
||||
char str[5];
|
||||
|
||||
Hide_cursor();
|
||||
// Réaffichage des jauges:
|
||||
// Réaffichage des jauges:
|
||||
if (start!=end)
|
||||
{
|
||||
// Dans le cas d'un bloc, tout à 0.
|
||||
// Dans le cas d'un bloc, tout à 0.
|
||||
red_slider->Position =Color_max;
|
||||
Window_draw_slider(red_slider);
|
||||
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;
|
||||
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;
|
||||
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;
|
||||
word old_mouse_x;
|
||||
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( 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_MINUS_X+16,BUTTON_MINUS_Y,MC_Dark,+1);
|
||||
|
||||
@ -1274,7 +1274,7 @@ void Button_Palette(int btn)
|
||||
{
|
||||
case 0 : // Nulle part
|
||||
break;
|
||||
case -1 : // Hors de la fenêtre
|
||||
case -1 : // Hors de la fenêtre
|
||||
case 1 : // palette
|
||||
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) )
|
||||
{
|
||||
// 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.
|
||||
|
||||
Fore_color=first_color=last_color=block_start=block_end=temp_color;
|
||||
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);
|
||||
Num2str(Fore_color,str,3);
|
||||
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
|
||||
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)
|
||||
{
|
||||
block_start=first_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_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);
|
||||
|
||||
// Affichage des jauges
|
||||
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);
|
||||
}
|
||||
else if (first_color>temp_color)
|
||||
@ -1421,16 +1421,16 @@ void Button_Palette(int btn)
|
||||
block_start=temp_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_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);
|
||||
|
||||
// Affichage des jauges
|
||||
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);
|
||||
}
|
||||
else
|
||||
@ -1438,7 +1438,7 @@ void Button_Palette(int btn)
|
||||
block_start=block_end=first_color;
|
||||
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);
|
||||
Update_window_area(COLOR_X+24,COLOR_Y,32,7);
|
||||
Num2str(Fore_color,str,3);
|
||||
@ -1520,7 +1520,7 @@ void Button_Palette(int btn)
|
||||
|
||||
if (red_slider->Position>Color_max)
|
||||
{
|
||||
// Jauge dans les négatifs:
|
||||
// Jauge dans les négatifs:
|
||||
Num2str(-(Color_max-red_slider->Position),str,4);
|
||||
str[0]='-';
|
||||
}
|
||||
@ -1601,7 +1601,7 @@ void Button_Palette(int btn)
|
||||
|
||||
if (green_slider->Position>Color_max)
|
||||
{
|
||||
// Jauge dans les négatifs:
|
||||
// Jauge dans les négatifs:
|
||||
Num2str(-(Color_max-green_slider->Position),str,4);
|
||||
str[0]='-';
|
||||
}
|
||||
@ -1682,7 +1682,7 @@ void Button_Palette(int btn)
|
||||
|
||||
if (blue_slider->Position>Color_max)
|
||||
{
|
||||
// Jauge dans les négatifs:
|
||||
// Jauge dans les négatifs:
|
||||
Num2str(-(Color_max-blue_slider->Position),str,4);
|
||||
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);
|
||||
// On prépare la "modifiabilité" des nouvelles couleurs
|
||||
// On prépare la "modifiabilité" des nouvelles couleurs
|
||||
Set_palette(working_palette);
|
||||
memcpy(temp_palette,working_palette,sizeof(T_Palette));
|
||||
need_to_remap=1;
|
||||
@ -1797,7 +1797,7 @@ void Button_Palette(int btn)
|
||||
Set_blue (i,temp_color,working_palette);
|
||||
}
|
||||
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);
|
||||
memcpy(temp_palette,working_palette,sizeof(T_Palette));
|
||||
|
||||
@ -1814,7 +1814,7 @@ void Button_Palette(int btn)
|
||||
Palette_edit_step();
|
||||
|
||||
// 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;
|
||||
|
||||
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));
|
||||
|
||||
// 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;
|
||||
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)
|
||||
{
|
||||
// Cas d'un bloc multi-couleur
|
||||
Num2str(block_start,str ,3);
|
||||
Num2str(block_end ,str+4,3);
|
||||
str[3]=26; // Flèche vers la droite
|
||||
// Affichage dans le block de visu du bloc (dégradé) en cours
|
||||
str[3]=26; // Flèche vers la droite
|
||||
// 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);
|
||||
}
|
||||
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);
|
||||
memcpy(temp_palette,working_palette,sizeof(T_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);
|
||||
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)
|
||||
{
|
||||
// Cas d'un bloc multi-couleur
|
||||
Num2str(block_start,str ,3);
|
||||
Num2str(block_end ,str+4,3);
|
||||
str[3]=26; // Flèche vers la droite
|
||||
// Affichage dans le block de visu du bloc (dégradé) en cours
|
||||
str[3]=26; // Flèche vers la droite
|
||||
// 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);
|
||||
}
|
||||
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);
|
||||
// On prépare la "modifiabilité" des nouvelles couleurs
|
||||
// On prépare la "modifiabilité" des nouvelles couleurs
|
||||
|
||||
Set_palette(working_palette);
|
||||
|
||||
@ -1985,7 +1985,7 @@ void Button_Palette(int btn)
|
||||
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,
|
||||
working_palette, block_start, block_end);
|
||||
memcpy(temp_palette, working_palette, sizeof(T_Palette));
|
||||
@ -2098,7 +2098,7 @@ void Button_Palette(int btn)
|
||||
// -- red --
|
||||
if (red_slider->Position>Color_max)
|
||||
{
|
||||
// Jauge dans les négatifs:
|
||||
// Jauge dans les négatifs:
|
||||
Num2str(-(Color_max-red_slider->Position),str,4);
|
||||
str[0]='-';
|
||||
}
|
||||
@ -2119,7 +2119,7 @@ void Button_Palette(int btn)
|
||||
// -- green --
|
||||
if (green_slider->Position>Color_max)
|
||||
{
|
||||
// Jauge dans les négatifs:
|
||||
// Jauge dans les négatifs:
|
||||
Num2str(-(Color_max-green_slider->Position),str,4);
|
||||
str[0]='-';
|
||||
}
|
||||
@ -2140,7 +2140,7 @@ void Button_Palette(int btn)
|
||||
// -- blue --
|
||||
if (blue_slider->Position>Color_max)
|
||||
{
|
||||
// Jauge dans les négatifs:
|
||||
// Jauge dans les négatifs:
|
||||
Num2str(-(Color_max-blue_slider->Position),str,4);
|
||||
str[0]='-';
|
||||
}
|
||||
@ -2224,7 +2224,7 @@ void Button_Palette(int btn)
|
||||
// -- red --
|
||||
if (red_slider->Position>Color_max)
|
||||
{
|
||||
// Jauge dans les négatifs:
|
||||
// Jauge dans les négatifs:
|
||||
Num2str(-(Color_max-red_slider->Position),str,4);
|
||||
str[0]='-';
|
||||
}
|
||||
@ -2245,7 +2245,7 @@ void Button_Palette(int btn)
|
||||
// -- green --
|
||||
if (green_slider->Position>Color_max)
|
||||
{
|
||||
// Jauge dans les négatifs:
|
||||
// Jauge dans les négatifs:
|
||||
Num2str(-(Color_max-green_slider->Position),str,4);
|
||||
str[0]='-';
|
||||
}
|
||||
@ -2266,7 +2266,7 @@ void Button_Palette(int btn)
|
||||
// -- blue --
|
||||
if (blue_slider->Position>Color_max)
|
||||
{
|
||||
// Jauge dans les négatifs:
|
||||
// Jauge dans les négatifs:
|
||||
Num2str(-(Color_max-blue_slider->Position),str,4);
|
||||
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);
|
||||
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));
|
||||
|
||||
need_to_remap=1;
|
||||
@ -2352,7 +2352,7 @@ void Button_Palette(int btn)
|
||||
End_of_modification();
|
||||
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);
|
||||
memcpy(temp_palette,working_palette,sizeof(T_Palette));
|
||||
|
||||
@ -2398,7 +2398,7 @@ void Button_Palette(int btn)
|
||||
case 23 : // Sort palette
|
||||
{
|
||||
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;
|
||||
byte remap_table[256];
|
||||
byte inverted_table[256];
|
||||
@ -2515,8 +2515,8 @@ void Button_Palette(int btn)
|
||||
for (i=0;i<256;i++)
|
||||
inverted_table[remap_table[i]]=i;
|
||||
Remap_image_highlevel(inverted_table);
|
||||
// Maintenant, tous ces calculs doivent êtres pris en compte dans la
|
||||
// palette, l'image et à l'écran.
|
||||
// Maintenant, tous ces calculs doivent êtres pris en compte dans la
|
||||
// palette, l'image et à l'écran.
|
||||
Set_palette(working_palette);
|
||||
Palette_edit_step(); // Disable Undo
|
||||
|
||||
@ -2565,7 +2565,7 @@ void Button_Palette(int btn)
|
||||
Set_green (i,new_green,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);
|
||||
memcpy(temp_palette,working_palette,sizeof(T_Palette));
|
||||
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;
|
||||
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);
|
||||
Num2str(Fore_color,str,3);
|
||||
Print_in_window(COLOR_X,COLOR_Y,str,MC_Black,MC_Light);
|
||||
@ -2634,7 +2634,7 @@ void Button_Palette(int btn)
|
||||
{
|
||||
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)
|
||||
{
|
||||
@ -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);
|
||||
Hide_cursor();
|
||||
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);
|
||||
Print_in_window(COLOR_X,COLOR_Y,str,MC_Black,MC_Light);
|
||||
// Affichage dans le block de visu de la couleur en cours
|
||||
@ -2656,7 +2656,7 @@ void Button_Palette(int btn)
|
||||
}
|
||||
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)
|
||||
{
|
||||
@ -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);
|
||||
Hide_cursor();
|
||||
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);
|
||||
Print_in_window(COLOR_X,COLOR_Y,str,MC_Black,MC_Light);
|
||||
// Affichage dans le block de visu de la couleur en cours
|
||||
@ -2703,7 +2703,7 @@ void Button_Palette(int btn)
|
||||
Key=0;
|
||||
}
|
||||
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.
|
||||
{
|
||||
if (!image_is_backed_up)
|
||||
@ -2731,7 +2731,7 @@ void Button_Palette(int btn)
|
||||
}
|
||||
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);
|
||||
if (click)
|
||||
{
|
||||
@ -2754,7 +2754,7 @@ void Button_Palette(int btn)
|
||||
Fore_color=first_color=last_color=block_start=block_end=color;
|
||||
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);
|
||||
Update_window_area(COLOR_X+24,COLOR_Y,32,7);
|
||||
Num2str(Fore_color,str,3);
|
||||
@ -2845,7 +2845,7 @@ void Button_Palette(int btn)
|
||||
|
||||
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);
|
||||
|
||||
Close_window();
|
||||
@ -2853,9 +2853,9 @@ void Button_Palette(int btn)
|
||||
|
||||
Reposition_palette();
|
||||
|
||||
// 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
|
||||
// rafficher tout le menu remappé.
|
||||
// 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
|
||||
// rafficher tout le menu remappé.
|
||||
if (need_to_remap)
|
||||
Display_menu();
|
||||
|
||||
|
||||
110
src/pxdouble.c
110
src/pxdouble.c
@ -36,7 +36,7 @@
|
||||
|
||||
|
||||
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 + 1)=color;
|
||||
@ -45,13 +45,13 @@ void Pixel_double (word x,word y,byte color)
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
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)
|
||||
/* 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* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
|
||||
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)
|
||||
int y;
|
||||
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
|
||||
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;
|
||||
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)
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
{
|
||||
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
|
||||
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)
|
||||
{
|
||||
// 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);
|
||||
|
||||
// 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
|
||||
&& 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)
|
||||
// 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;
|
||||
else
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
|
||||
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)
|
||||
/* On affiche la brosse en monochrome */
|
||||
{
|
||||
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
|
||||
// l'écran
|
||||
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
|
||||
// l'écran
|
||||
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
|
||||
// la brosse
|
||||
int x,y;
|
||||
@ -206,7 +206,7 @@ void Display_brush_mono_double(word x_pos, word y_pos,
|
||||
dest+=ZOOMX;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=brush_width-width;
|
||||
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)
|
||||
{
|
||||
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* 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)
|
||||
int y;
|
||||
int x;
|
||||
(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=image_width-width;
|
||||
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
|
||||
}
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
|
||||
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)
|
||||
{
|
||||
// dest = coords a l'écran
|
||||
// dest = coords a l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
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)
|
||||
/* 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+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(
|
||||
word x_pos, word y_pos, word width, byte* line,
|
||||
byte transp_color, byte color)
|
||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||
// Utilisé par les brosses en mode zoom
|
||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||
// Utilisé par les brosses en mode zoom
|
||||
{
|
||||
byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX;
|
||||
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(
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word image_width,byte * buffer)
|
||||
{
|
||||
byte* src = Main_screen + Main.magnifier_offset_Y * image_width
|
||||
+ Main.magnifier_offset_X;
|
||||
int y = 0; // Ligne en cours de traitement
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1)
|
||||
{
|
||||
int x;
|
||||
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
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;
|
||||
// Pour chaque ligne
|
||||
do{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_line_on_screen_fast_double(
|
||||
Main.X_zoom, y, width*Main.magnifier_factor,
|
||||
buffer
|
||||
);
|
||||
// On passe à la suivante
|
||||
// On passe à la suivante
|
||||
y++;
|
||||
if(y==height)
|
||||
{
|
||||
@ -386,12 +386,12 @@ void Display_part_of_screen_scaled_double(
|
||||
// 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,
|
||||
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 brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
byte * buffer)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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--)
|
||||
{
|
||||
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,
|
||||
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, byte color,
|
||||
word brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
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;
|
||||
int y=y_pos*ZOOMY;
|
||||
|
||||
//Pour chaque ligne à zoomer :
|
||||
//Pour chaque ligne à zoomer :
|
||||
while(1)
|
||||
{
|
||||
int bx;
|
||||
// src = Ligne originale
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor,width);
|
||||
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
bx = Main.magnifier_factor*ZOOMY;
|
||||
|
||||
// Pour chaque ligne écran
|
||||
// Pour chaque ligne écran
|
||||
do
|
||||
{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_transparent_mono_line_on_screen_double(
|
||||
x_pos, y, width * Main.magnifier_factor,
|
||||
buffer, transp_color, color
|
||||
);
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
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)
|
||||
{
|
||||
|
||||
// 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;
|
||||
int y = y_pos;
|
||||
int bx;
|
||||
(void)transp_color; // unused
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1){
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);
|
||||
|
||||
|
||||
110
src/pxquad.c
110
src/pxquad.c
@ -35,7 +35,7 @@
|
||||
|
||||
|
||||
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 + 1)=color;
|
||||
@ -56,13 +56,13 @@ void Pixel_quad (word x,word y,byte color)
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
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)
|
||||
/* 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* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
|
||||
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)
|
||||
int y;
|
||||
int dy;
|
||||
|
||||
@ -97,7 +97,7 @@ void Display_part_of_screen_quad (word width,word height,word image_width)
|
||||
// On la quadruple
|
||||
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;
|
||||
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)
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
{
|
||||
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
|
||||
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)
|
||||
{
|
||||
// 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);
|
||||
|
||||
// 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
|
||||
&& 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)
|
||||
// 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;
|
||||
else
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
|
||||
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)
|
||||
/* On affiche la brosse en monochrome */
|
||||
{
|
||||
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
|
||||
// l'écran
|
||||
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
|
||||
// l'écran
|
||||
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
|
||||
// la brosse
|
||||
int x,y;
|
||||
@ -221,7 +221,7 @@ void Display_brush_mono_quad(word x_pos, word y_pos,
|
||||
dest+=ZOOMX;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=brush_width-width;
|
||||
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)
|
||||
{
|
||||
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* 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)
|
||||
int y;
|
||||
int x;
|
||||
(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=image_width-width;
|
||||
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
|
||||
}
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
|
||||
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)
|
||||
{
|
||||
// dest = coords a l'écran
|
||||
// dest = coords a l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
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)
|
||||
/* 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+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(
|
||||
word x_pos, word y_pos, word width, byte* line,
|
||||
byte transp_color, byte color)
|
||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||
// Utilisé par les brosses en mode zoom
|
||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||
// Utilisé par les brosses en mode zoom
|
||||
{
|
||||
byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX;
|
||||
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(
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word image_width,byte * buffer)
|
||||
{
|
||||
byte* src = Main_screen + Main.magnifier_offset_Y * image_width
|
||||
+ Main.magnifier_offset_X;
|
||||
int y = 0; // Ligne en cours de traitement
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1)
|
||||
{
|
||||
int x;
|
||||
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
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*/;
|
||||
// Pour chaque ligne
|
||||
do{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_line_on_screen_fast_quad(
|
||||
Main.X_zoom, y, width*Main.magnifier_factor,
|
||||
buffer
|
||||
);
|
||||
// On passe à la suivante
|
||||
// On passe à la suivante
|
||||
y++;
|
||||
if(y==height/**ZOOMY*/)
|
||||
{
|
||||
@ -403,12 +403,12 @@ void Display_part_of_screen_scaled_quad(
|
||||
// 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,
|
||||
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 brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
byte * buffer)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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--)
|
||||
{
|
||||
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,
|
||||
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, byte color,
|
||||
word brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
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;
|
||||
int y=y_pos*ZOOMY;
|
||||
|
||||
//Pour chaque ligne à zoomer :
|
||||
//Pour chaque ligne à zoomer :
|
||||
while(1)
|
||||
{
|
||||
int bx;
|
||||
// src = Ligne originale
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor,width);
|
||||
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
bx = Main.magnifier_factor*ZOOMY;
|
||||
|
||||
// Pour chaque ligne écran
|
||||
// Pour chaque ligne écran
|
||||
do
|
||||
{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_transparent_mono_line_on_screen_quad(
|
||||
x_pos, y, width * Main.magnifier_factor,
|
||||
buffer, transp_color, color
|
||||
);
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
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)
|
||||
{
|
||||
|
||||
// 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;
|
||||
int y = y_pos;
|
||||
int bx;
|
||||
(void)transp_color; // unused
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1){
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);
|
||||
|
||||
|
||||
110
src/pxsimple.c
110
src/pxsimple.c
@ -32,19 +32,19 @@
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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 );
|
||||
}
|
||||
|
||||
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;
|
||||
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)
|
||||
/* 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* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
|
||||
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)
|
||||
int 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
|
||||
memcpy(dest,src,width);
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=image_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)
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
{
|
||||
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
|
||||
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)
|
||||
{
|
||||
// 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);
|
||||
|
||||
// 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
|
||||
&& 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)
|
||||
// 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;
|
||||
else
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos * VIDEO_LINE_WIDTH + x_pos;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*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++;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_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)
|
||||
/* On affiche la brosse en monochrome */
|
||||
{
|
||||
byte* dest=y_pos*VIDEO_LINE_WIDTH+x_pos+Screen_pixels; // dest = adr Destination à
|
||||
// l'écran
|
||||
byte* dest=y_pos*VIDEO_LINE_WIDTH+x_pos+Screen_pixels; // dest = adr Destination à
|
||||
// l'écran
|
||||
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
|
||||
// la brosse
|
||||
int x,y;
|
||||
@ -190,7 +190,7 @@ void Display_brush_mono_simple(word x_pos, word y_pos,
|
||||
dest++;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=brush_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)
|
||||
{
|
||||
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* 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)
|
||||
int y;
|
||||
(void)x_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
|
||||
memcpy(dest,src,width);
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=image_width;
|
||||
dest+=VIDEO_LINE_WIDTH;
|
||||
}
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos * VIDEO_LINE_WIDTH + x_pos;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*dest = *src;
|
||||
@ -245,7 +245,7 @@ void Display_brush_simple(byte * brush, word x_pos,word y_pos,word x_offset,word
|
||||
src++; dest++;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_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)
|
||||
{
|
||||
// dest = coords a l'écran
|
||||
// dest = coords a l'écran
|
||||
byte* dest = Screen_pixels + y_pos * VIDEO_LINE_WIDTH + x_pos;
|
||||
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)
|
||||
/* 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);
|
||||
}
|
||||
@ -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(
|
||||
word x_pos, word y_pos, word width, byte* line,
|
||||
byte transp_color, byte color)
|
||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||
// Utilisé par les brosses en mode zoom
|
||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||
// Utilisé par les brosses en mode zoom
|
||||
{
|
||||
byte* dest = Screen_pixels+ y_pos * VIDEO_LINE_WIDTH + x_pos;
|
||||
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(
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word image_width,byte * buffer)
|
||||
{
|
||||
byte* src = Main_screen + Main.magnifier_offset_Y * image_width
|
||||
+ Main.magnifier_offset_X;
|
||||
int y = 0; // Ligne en cours de traitement
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1)
|
||||
{
|
||||
int x;
|
||||
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
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;
|
||||
// Pour chaque ligne
|
||||
do{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_line_on_screen_simple(
|
||||
Main.X_zoom, y, width*Main.magnifier_factor,
|
||||
buffer
|
||||
);
|
||||
// On passe à la suivante
|
||||
// On passe à la suivante
|
||||
y++;
|
||||
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,
|
||||
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 brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
byte * buffer)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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--)
|
||||
{
|
||||
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,
|
||||
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, byte color,
|
||||
word brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
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;
|
||||
int y=y_pos;
|
||||
|
||||
//Pour chaque ligne à zoomer :
|
||||
//Pour chaque ligne à zoomer :
|
||||
while(1)
|
||||
{
|
||||
int bx;
|
||||
// src = Ligne originale
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor,width);
|
||||
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
bx = Main.magnifier_factor;
|
||||
|
||||
// Pour chaque ligne écran
|
||||
// Pour chaque ligne écran
|
||||
do
|
||||
{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_transparent_mono_line_on_screen_simple(
|
||||
x_pos, y, width * Main.magnifier_factor,
|
||||
buffer, transp_color, color
|
||||
);
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
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)
|
||||
{
|
||||
// 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;
|
||||
int y = y_pos;
|
||||
int bx;
|
||||
(void)transp_color; // unused
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1){
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor,width);
|
||||
|
||||
|
||||
106
src/pxtall.c
106
src/pxtall.c
@ -36,20 +36,20 @@
|
||||
|
||||
|
||||
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+1)*VIDEO_LINE_WIDTH)=color;
|
||||
}
|
||||
|
||||
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 );
|
||||
}
|
||||
|
||||
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;
|
||||
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)
|
||||
/* 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* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
|
||||
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)
|
||||
int 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;
|
||||
memcpy(dest,src,width);
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=image_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)
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
{
|
||||
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
|
||||
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)
|
||||
{
|
||||
// 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);
|
||||
|
||||
// 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
|
||||
&& 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)
|
||||
// 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;
|
||||
else
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos*ZOOMY*VIDEO_LINE_WIDTH + x_pos;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*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++;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + ZOOMY*VIDEO_LINE_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)
|
||||
/* On affiche la brosse en monochrome */
|
||||
{
|
||||
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos+Screen_pixels; // dest = adr Destination à
|
||||
// l'écran
|
||||
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos+Screen_pixels; // dest = adr Destination à
|
||||
// l'écran
|
||||
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
|
||||
// la brosse
|
||||
int x,y;
|
||||
@ -205,7 +205,7 @@ void Display_brush_mono_tall(word x_pos, word y_pos,
|
||||
dest++;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=brush_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)
|
||||
{
|
||||
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* 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)
|
||||
int y;
|
||||
(void)x_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;
|
||||
memcpy(dest,src,width);
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=image_width;
|
||||
dest+=VIDEO_LINE_WIDTH;
|
||||
}
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos*ZOOMY*VIDEO_LINE_WIDTH + x_pos;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*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++;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - 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)
|
||||
{
|
||||
// dest = coords a l'écran
|
||||
// dest = coords a l'écran
|
||||
byte* dest = Screen_pixels + y_pos*ZOOMY*VIDEO_LINE_WIDTH + x_pos;
|
||||
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)
|
||||
/* 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+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(
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word image_width,byte * buffer)
|
||||
{
|
||||
byte* src = Main_screen + Main.magnifier_offset_Y * image_width
|
||||
+ Main.magnifier_offset_X;
|
||||
int y = 0; // Ligne en cours de traitement
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1)
|
||||
{
|
||||
int x;
|
||||
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
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;
|
||||
// Pour chaque ligne
|
||||
do{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_line_on_screen_simple(
|
||||
Main.X_zoom, y, width*Main.magnifier_factor,
|
||||
buffer
|
||||
);
|
||||
// On passe à la suivante
|
||||
// On passe à la suivante
|
||||
y++;
|
||||
if(y==height*ZOOMY)
|
||||
{
|
||||
@ -345,12 +345,12 @@ void Display_part_of_screen_scaled_tall(
|
||||
// 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,
|
||||
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 brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
byte * buffer)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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--)
|
||||
{
|
||||
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,
|
||||
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, byte color,
|
||||
word brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
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;
|
||||
int y=y_pos*ZOOMY;
|
||||
|
||||
//Pour chaque ligne à zoomer :
|
||||
//Pour chaque ligne à zoomer :
|
||||
while(1)
|
||||
{
|
||||
int bx;
|
||||
// src = Ligne originale
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor,width);
|
||||
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
bx = Main.magnifier_factor*ZOOMY;
|
||||
|
||||
// Pour chaque ligne écran
|
||||
// Pour chaque ligne écran
|
||||
do
|
||||
{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_transparent_mono_line_on_screen_simple(
|
||||
x_pos, y, width * Main.magnifier_factor,
|
||||
buffer, transp_color, color
|
||||
);
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
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)
|
||||
{
|
||||
// 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;
|
||||
int y = y_pos;
|
||||
int bx;
|
||||
(void)transp_color; // unused
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1){
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor,width);
|
||||
|
||||
|
||||
110
src/pxtall2.c
110
src/pxtall2.c
@ -35,7 +35,7 @@
|
||||
|
||||
|
||||
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 + 1)=color;
|
||||
@ -48,13 +48,13 @@ void Pixel_tall2 (word x,word y,byte color)
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
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)
|
||||
/* 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* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
|
||||
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)
|
||||
int y;
|
||||
int dy;
|
||||
|
||||
@ -89,7 +89,7 @@ void Display_part_of_screen_tall2 (word width,word height,word image_width)
|
||||
// On la quadruple
|
||||
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;
|
||||
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)
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
{
|
||||
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
|
||||
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)
|
||||
{
|
||||
// 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);
|
||||
|
||||
// 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
|
||||
&& 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)
|
||||
// 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;
|
||||
else
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
|
||||
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)
|
||||
/* On affiche la brosse en monochrome */
|
||||
{
|
||||
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
|
||||
// l'écran
|
||||
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
|
||||
// l'écran
|
||||
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
|
||||
// la brosse
|
||||
int x,y;
|
||||
@ -213,7 +213,7 @@ void Display_brush_mono_tall2(word x_pos, word y_pos,
|
||||
dest+=ZOOMX;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=brush_width-width;
|
||||
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)
|
||||
{
|
||||
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* 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)
|
||||
int y;
|
||||
int x;
|
||||
(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=image_width-width;
|
||||
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
|
||||
}
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
|
||||
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)
|
||||
{
|
||||
// dest = coords a l'écran
|
||||
// dest = coords a l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
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)
|
||||
/* 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+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(
|
||||
word x_pos, word y_pos, word width, byte* line,
|
||||
byte transp_color, byte color)
|
||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||
// Utilisé par les brosses en mode zoom
|
||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||
// Utilisé par les brosses en mode zoom
|
||||
{
|
||||
byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX;
|
||||
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(
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word image_width,byte * buffer)
|
||||
{
|
||||
byte* src = Main_screen + Main.magnifier_offset_Y * image_width
|
||||
+ Main.magnifier_offset_X;
|
||||
int y = 0; // Ligne en cours de traitement
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1)
|
||||
{
|
||||
int x;
|
||||
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
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*/;
|
||||
// Pour chaque ligne
|
||||
do{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_line_on_screen_fast_tall2(
|
||||
Main.X_zoom, y, width*Main.magnifier_factor,
|
||||
buffer
|
||||
);
|
||||
// On passe à la suivante
|
||||
// On passe à la suivante
|
||||
y++;
|
||||
if(y==height/**ZOOMY*/)
|
||||
{
|
||||
@ -395,12 +395,12 @@ void Display_part_of_screen_scaled_tall2(
|
||||
// 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,
|
||||
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 brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
byte * buffer)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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--)
|
||||
{
|
||||
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,
|
||||
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, byte color,
|
||||
word brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
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;
|
||||
int y=y_pos*ZOOMY;
|
||||
|
||||
//Pour chaque ligne à zoomer :
|
||||
//Pour chaque ligne à zoomer :
|
||||
while(1)
|
||||
{
|
||||
int bx;
|
||||
// src = Ligne originale
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor,width);
|
||||
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
bx = Main.magnifier_factor*ZOOMY;
|
||||
|
||||
// Pour chaque ligne écran
|
||||
// Pour chaque ligne écran
|
||||
do
|
||||
{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_transparent_mono_line_on_screen_tall2(
|
||||
x_pos, y, width * Main.magnifier_factor,
|
||||
buffer, transp_color, color
|
||||
);
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
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)
|
||||
{
|
||||
|
||||
// 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;
|
||||
int y = y_pos;
|
||||
int bx;
|
||||
(void)transp_color; // unused
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1){
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);
|
||||
|
||||
|
||||
110
src/pxtall3.c
110
src/pxtall3.c
@ -35,7 +35,7 @@
|
||||
|
||||
|
||||
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 + 1)=color;
|
||||
@ -52,13 +52,13 @@ void Pixel_tall3 (word x,word y,byte color)
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
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)
|
||||
/* 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* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
|
||||
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)
|
||||
int y;
|
||||
int dy;
|
||||
|
||||
@ -93,7 +93,7 @@ void Display_part_of_screen_tall3 (word width,word height,word image_width)
|
||||
// On la quadruple
|
||||
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;
|
||||
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)
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
{
|
||||
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
|
||||
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)
|
||||
{
|
||||
// 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);
|
||||
|
||||
// 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
|
||||
&& 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)
|
||||
// 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;
|
||||
else
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
|
||||
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)
|
||||
/* On affiche la brosse en monochrome */
|
||||
{
|
||||
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
|
||||
// l'écran
|
||||
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
|
||||
// l'écran
|
||||
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
|
||||
// la brosse
|
||||
int x,y;
|
||||
@ -217,7 +217,7 @@ void Display_brush_mono_tall3(word x_pos, word y_pos,
|
||||
dest+=ZOOMX;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=brush_width-width;
|
||||
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)
|
||||
{
|
||||
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* 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)
|
||||
int y;
|
||||
int x;
|
||||
(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=image_width-width;
|
||||
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
|
||||
}
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
|
||||
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)
|
||||
{
|
||||
// dest = coords a l'écran
|
||||
// dest = coords a l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
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)
|
||||
/* 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+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(
|
||||
word x_pos, word y_pos, word width, byte* line,
|
||||
byte transp_color, byte color)
|
||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||
// Utilisé par les brosses en mode zoom
|
||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||
// Utilisé par les brosses en mode zoom
|
||||
{
|
||||
byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX;
|
||||
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(
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word image_width,byte * buffer)
|
||||
{
|
||||
byte* src = Main_screen + Main.magnifier_offset_Y * image_width
|
||||
+ Main.magnifier_offset_X;
|
||||
int y = 0; // Ligne en cours de traitement
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1)
|
||||
{
|
||||
int x;
|
||||
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
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*/;
|
||||
// Pour chaque ligne
|
||||
do{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_line_on_screen_fast_tall3(
|
||||
Main.X_zoom, y, width*Main.magnifier_factor,
|
||||
buffer
|
||||
);
|
||||
// On passe à la suivante
|
||||
// On passe à la suivante
|
||||
y++;
|
||||
if(y==height/**ZOOMY*/)
|
||||
{
|
||||
@ -399,12 +399,12 @@ void Display_part_of_screen_scaled_tall3(
|
||||
// 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,
|
||||
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 brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
byte * buffer)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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--)
|
||||
{
|
||||
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,
|
||||
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, byte color,
|
||||
word brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
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;
|
||||
int y=y_pos*ZOOMY;
|
||||
|
||||
//Pour chaque ligne à zoomer :
|
||||
//Pour chaque ligne à zoomer :
|
||||
while(1)
|
||||
{
|
||||
int bx;
|
||||
// src = Ligne originale
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor,width);
|
||||
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
bx = Main.magnifier_factor*ZOOMY;
|
||||
|
||||
// Pour chaque ligne écran
|
||||
// Pour chaque ligne écran
|
||||
do
|
||||
{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_transparent_mono_line_on_screen_tall3(
|
||||
x_pos, y, width * Main.magnifier_factor,
|
||||
buffer, transp_color, color
|
||||
);
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
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)
|
||||
{
|
||||
|
||||
// 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;
|
||||
int y = y_pos;
|
||||
int bx;
|
||||
(void)transp_color; // unused
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1){
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);
|
||||
|
||||
|
||||
110
src/pxtriple.c
110
src/pxtriple.c
@ -35,7 +35,7 @@
|
||||
|
||||
|
||||
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 + 1)=color;
|
||||
@ -49,13 +49,13 @@ void Pixel_triple (word x,word y,byte color)
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
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)
|
||||
/* 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* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
|
||||
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)
|
||||
int y;
|
||||
int dy;
|
||||
|
||||
@ -88,7 +88,7 @@ void Display_part_of_screen_triple (word width,word height,word image_width)
|
||||
// On la triple
|
||||
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;
|
||||
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)
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
{
|
||||
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
|
||||
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)
|
||||
{
|
||||
// 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);
|
||||
|
||||
// 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
|
||||
&& 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)
|
||||
// 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;
|
||||
else
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
|
||||
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)
|
||||
/* On affiche la brosse en monochrome */
|
||||
{
|
||||
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
|
||||
// l'écran
|
||||
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
|
||||
// l'écran
|
||||
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
|
||||
// la brosse
|
||||
int x,y;
|
||||
@ -212,7 +212,7 @@ void Display_brush_mono_triple(word x_pos, word y_pos,
|
||||
dest+=ZOOMX;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=brush_width-width;
|
||||
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)
|
||||
{
|
||||
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* 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)
|
||||
int y;
|
||||
int x;
|
||||
(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=image_width-width;
|
||||
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
|
||||
}
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
|
||||
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)
|
||||
{
|
||||
// dest = coords a l'écran
|
||||
// dest = coords a l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
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)
|
||||
/* 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+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(
|
||||
word x_pos, word y_pos, word width, byte* line,
|
||||
byte transp_color, byte color)
|
||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||
// Utilisé par les brosses en mode zoom
|
||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||
// Utilisé par les brosses en mode zoom
|
||||
{
|
||||
byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX;
|
||||
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(
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word image_width,byte * buffer)
|
||||
{
|
||||
byte* src = Main_screen + Main.magnifier_offset_Y * image_width
|
||||
+ Main.magnifier_offset_X;
|
||||
int y = 0; // Ligne en cours de traitement
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1)
|
||||
{
|
||||
int x;
|
||||
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
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*/;
|
||||
// Pour chaque ligne
|
||||
do{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_line_on_screen_fast_triple(
|
||||
Main.X_zoom, y, width*Main.magnifier_factor,
|
||||
buffer
|
||||
);
|
||||
// On passe à la suivante
|
||||
// On passe à la suivante
|
||||
y++;
|
||||
if(y==height/**ZOOMY*/)
|
||||
{
|
||||
@ -393,12 +393,12 @@ void Display_part_of_screen_scaled_triple(
|
||||
// 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,
|
||||
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 brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
byte * buffer)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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--)
|
||||
{
|
||||
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,
|
||||
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, byte color,
|
||||
word brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
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;
|
||||
int y=y_pos*ZOOMY;
|
||||
|
||||
//Pour chaque ligne à zoomer :
|
||||
//Pour chaque ligne à zoomer :
|
||||
while(1)
|
||||
{
|
||||
int bx;
|
||||
// src = Ligne originale
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor,width);
|
||||
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
bx = Main.magnifier_factor*ZOOMY;
|
||||
|
||||
// Pour chaque ligne écran
|
||||
// Pour chaque ligne écran
|
||||
do
|
||||
{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_transparent_mono_line_on_screen_triple(
|
||||
x_pos, y, width * Main.magnifier_factor,
|
||||
buffer, transp_color, color
|
||||
);
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
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)
|
||||
{
|
||||
|
||||
// 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;
|
||||
int y = y_pos;
|
||||
int bx;
|
||||
(void)transp_color; // unused
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1){
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);
|
||||
|
||||
|
||||
110
src/pxwide.c
110
src/pxwide.c
@ -35,20 +35,20 @@
|
||||
|
||||
|
||||
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 + 1)=color;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
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)
|
||||
/* 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* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
|
||||
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)
|
||||
int y;
|
||||
int dy;
|
||||
|
||||
@ -77,7 +77,7 @@ void Display_part_of_screen_wide (word width,word height,word image_width)
|
||||
dest+=ZOOMX;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=image_width-width;
|
||||
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)
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
{
|
||||
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
|
||||
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)
|
||||
{
|
||||
// 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);
|
||||
|
||||
// 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
|
||||
&& 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)
|
||||
// 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;
|
||||
else
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
|
||||
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)
|
||||
/* On affiche la brosse en monochrome */
|
||||
{
|
||||
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
|
||||
// l'écran
|
||||
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
|
||||
// l'écran
|
||||
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
|
||||
// la brosse
|
||||
int x,y;
|
||||
@ -201,7 +201,7 @@ void Display_brush_mono_wide(word x_pos, word y_pos,
|
||||
dest+=ZOOMX;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=brush_width-width;
|
||||
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)
|
||||
{
|
||||
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* 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)
|
||||
int y;
|
||||
int x;
|
||||
(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=image_width-width;
|
||||
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
|
||||
}
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
|
||||
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)
|
||||
{
|
||||
// dest = coords a l'écran
|
||||
// dest = coords a l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
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)
|
||||
/* 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);
|
||||
}
|
||||
@ -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(
|
||||
word x_pos, word y_pos, word width, byte* line,
|
||||
byte transp_color, byte color)
|
||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||
// Utilisé par les brosses en mode zoom
|
||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||
// Utilisé par les brosses en mode zoom
|
||||
{
|
||||
byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX;
|
||||
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(
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word image_width,byte * buffer)
|
||||
{
|
||||
byte* src = Main_screen + Main.magnifier_offset_Y * image_width
|
||||
+ Main.magnifier_offset_X;
|
||||
int y = 0; // Ligne en cours de traitement
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1)
|
||||
{
|
||||
int x;
|
||||
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
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;
|
||||
// Pour chaque ligne
|
||||
do{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_line_on_screen_fast_wide(
|
||||
Main.X_zoom, y, width*Main.magnifier_factor,
|
||||
buffer
|
||||
);
|
||||
// On passe à la suivante
|
||||
// On passe à la suivante
|
||||
y++;
|
||||
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,
|
||||
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 brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
byte * buffer)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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--)
|
||||
{
|
||||
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,
|
||||
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, byte color,
|
||||
word brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
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;
|
||||
int y=y_pos*ZOOMY;
|
||||
|
||||
//Pour chaque ligne à zoomer :
|
||||
//Pour chaque ligne à zoomer :
|
||||
while(1)
|
||||
{
|
||||
int bx;
|
||||
// src = Ligne originale
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor,width);
|
||||
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
bx = Main.magnifier_factor*ZOOMY;
|
||||
|
||||
// Pour chaque ligne écran
|
||||
// Pour chaque ligne écran
|
||||
do
|
||||
{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_transparent_mono_line_on_screen_wide(
|
||||
x_pos, y, width * Main.magnifier_factor,
|
||||
buffer, transp_color, color
|
||||
);
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
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)
|
||||
{
|
||||
// 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;
|
||||
int y = y_pos;
|
||||
int bx;
|
||||
(void)transp_color; // unused
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1){
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);
|
||||
|
||||
|
||||
110
src/pxwide2.c
110
src/pxwide2.c
@ -35,7 +35,7 @@
|
||||
|
||||
|
||||
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 + 1)=color;
|
||||
@ -48,13 +48,13 @@ void Pixel_wide2 (word x,word y,byte color)
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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;
|
||||
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)
|
||||
/* 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* src=Main.offset_Y*image_width+Main.offset_X+Main_screen; //Coords de départ ds la source (src)
|
||||
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)
|
||||
int y;
|
||||
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
|
||||
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;
|
||||
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)
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
/* Affichage d'un pixel dans l'écran, par rapport au décalage de l'image
|
||||
* dans l'écran, en mode normal (pas en mode loupe)
|
||||
* Note: si on modifie cette procédure, il faudra penser à faire également
|
||||
* la modif dans la procédure Pixel_Preview_Loupe_SDL. */
|
||||
{
|
||||
// if(x-Main.offset_X >= 0 && y - Main.offset_Y >= 0)
|
||||
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)
|
||||
{
|
||||
// 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);
|
||||
|
||||
// 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
|
||||
&& 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)
|
||||
// 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;
|
||||
else
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
|
||||
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)
|
||||
/* On affiche la brosse en monochrome */
|
||||
{
|
||||
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
|
||||
// l'écran
|
||||
byte* dest=y_pos*ZOOMY*VIDEO_LINE_WIDTH+x_pos*ZOOMX+Screen_pixels; // dest = adr destination à
|
||||
// l'écran
|
||||
byte* src=brush_width*y_offset+x_offset+Brush; // src = adr ds
|
||||
// la brosse
|
||||
int x,y;
|
||||
@ -209,7 +209,7 @@ void Display_brush_mono_wide2(word x_pos, word y_pos,
|
||||
dest+=ZOOMX;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=brush_width-width;
|
||||
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)
|
||||
{
|
||||
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* 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)
|
||||
int y;
|
||||
int x;
|
||||
(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
src+=image_width-width;
|
||||
dest+=VIDEO_LINE_WIDTH*ZOOMY-width*ZOOMX;
|
||||
}
|
||||
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)
|
||||
{
|
||||
// dest = Position à l'écran
|
||||
// dest = Position à l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
// src = Position dans la brosse
|
||||
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
|
||||
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)
|
||||
{
|
||||
*(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;
|
||||
}
|
||||
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
dest = dest + VIDEO_LINE_WIDTH*ZOOMY - width*ZOOMX;
|
||||
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)
|
||||
{
|
||||
// dest = coords a l'écran
|
||||
// dest = coords a l'écran
|
||||
byte* dest = Screen_pixels + y_pos * ZOOMY * VIDEO_LINE_WIDTH + x_pos * ZOOMX;
|
||||
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)
|
||||
/* 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+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(
|
||||
word x_pos, word y_pos, word width, byte* line,
|
||||
byte transp_color, byte color)
|
||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||
// Utilisé par les brosses en mode zoom
|
||||
// Affiche une ligne à l'écran avec une couleur + transparence.
|
||||
// Utilisé par les brosses en mode zoom
|
||||
{
|
||||
byte* dest = Screen_pixels+ y_pos*VIDEO_LINE_WIDTH + x_pos*ZOOMX;
|
||||
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(
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word width, // width non zoomée
|
||||
word height, // height zoomée
|
||||
word image_width,byte * buffer)
|
||||
{
|
||||
byte* src = Main_screen + Main.magnifier_offset_Y * image_width
|
||||
+ Main.magnifier_offset_X;
|
||||
int y = 0; // Ligne en cours de traitement
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1)
|
||||
{
|
||||
int x;
|
||||
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
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*/;
|
||||
// Pour chaque ligne
|
||||
do{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_line_on_screen_fast_wide2(
|
||||
Main.X_zoom, y, width*Main.magnifier_factor,
|
||||
buffer
|
||||
);
|
||||
// On passe à la suivante
|
||||
// On passe à la suivante
|
||||
y++;
|
||||
if(y==height/**ZOOMY*/)
|
||||
{
|
||||
@ -389,12 +389,12 @@ void Display_part_of_screen_scaled_wide2(
|
||||
// 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,
|
||||
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 brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
byte * buffer)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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--)
|
||||
{
|
||||
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,
|
||||
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, byte color,
|
||||
word brush_width, // width réelle de la brosse
|
||||
word brush_width, // width réelle de la brosse
|
||||
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;
|
||||
int y=y_pos*ZOOMY;
|
||||
|
||||
//Pour chaque ligne à zoomer :
|
||||
//Pour chaque ligne à zoomer :
|
||||
while(1)
|
||||
{
|
||||
int bx;
|
||||
// src = Ligne originale
|
||||
// On éclate la ligne
|
||||
// On éclate la ligne
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor,width);
|
||||
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
// On affiche la ligne Facteur fois à l'écran (sur des
|
||||
// lignes consécutives)
|
||||
bx = Main.magnifier_factor*ZOOMY;
|
||||
|
||||
// Pour chaque ligne écran
|
||||
// Pour chaque ligne écran
|
||||
do
|
||||
{
|
||||
// On affiche la ligne zoomée
|
||||
// On affiche la ligne zoomée
|
||||
Display_transparent_mono_line_on_screen_wide2(
|
||||
x_pos, y, width * Main.magnifier_factor,
|
||||
buffer, transp_color, color
|
||||
);
|
||||
// On passe à la ligne suivante
|
||||
// On passe à la ligne suivante
|
||||
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)
|
||||
{
|
||||
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);
|
||||
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
// Passage à la ligne suivante dans la brosse aussi
|
||||
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)
|
||||
{
|
||||
|
||||
// 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;
|
||||
int y = y_pos;
|
||||
int bx;
|
||||
(void)transp_color; // unused
|
||||
|
||||
// Pour chaque ligne à zoomer
|
||||
// Pour chaque ligne à zoomer
|
||||
while(1){
|
||||
Zoom_a_line(src,buffer,Main.magnifier_factor*ZOOMX,width);
|
||||
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
*/
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2008 Peter Gordon
|
||||
Copyright 2008 Yves Rizoud
|
||||
Copyright 2007 Adrien Destugues
|
||||
@ -55,7 +55,7 @@ void Load_INI_clear_string(char * str, byte keep_comments)
|
||||
{
|
||||
equal_found=1;
|
||||
index++;
|
||||
// On enleve les espaces après le '='
|
||||
// On enleve les espaces après le '='
|
||||
while (str[index]==' ' || str[index]=='\t')
|
||||
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)
|
||||
{
|
||||
// Passage en majuscule d'un caractère:
|
||||
// Passage en majuscule d'un caractère:
|
||||
#ifndef GCWZERO //this causes gcw to crash
|
||||
str[index]=toupper((int)str[index]);
|
||||
#endif
|
||||
@ -86,7 +86,7 @@ void Load_INI_clear_string(char * str, byte keep_comments)
|
||||
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'))
|
||||
{
|
||||
index--;
|
||||
@ -101,22 +101,22 @@ int Load_INI_seek_pattern(char * buffer,char * pattern)
|
||||
int buffer_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++)
|
||||
{
|
||||
// On regarde si la chaîne pattern est équivalente à la position courante
|
||||
// de la chaîne buffer:
|
||||
// On regarde si la chaîne pattern est équivalente à la position courante
|
||||
// de la chaîne buffer:
|
||||
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
|
||||
// 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
|
||||
// trouvée):
|
||||
// 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
|
||||
// début ça ne renvoie pas la même chose que si on ne l'avait pas
|
||||
// trouvée):
|
||||
if (pattern[pattern_index]=='\0')
|
||||
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;
|
||||
}
|
||||
|
||||
@ -128,11 +128,11 @@ int Load_INI_reach_group(FILE * file,char * buffer,char * group)
|
||||
char * group_upper;
|
||||
char * upper_buffer;
|
||||
|
||||
// On alloue les zones de mémoire:
|
||||
// On alloue les zones de mémoire:
|
||||
group_upper=(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);
|
||||
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);
|
||||
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);
|
||||
}
|
||||
while (!stop_seek);
|
||||
@ -178,11 +178,11 @@ int Load_INI_get_string(FILE * file,char * buffer,char * option_name,char * retu
|
||||
char * upper_buffer;
|
||||
int buffer_index;
|
||||
|
||||
// On alloue les zones de mémoire:
|
||||
// On alloue les zones de mémoire:
|
||||
option_upper=(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);
|
||||
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);
|
||||
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);
|
||||
|
||||
// Si on l'a trouvée:
|
||||
// Si on l'a trouvée:
|
||||
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,"=");
|
||||
|
||||
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 nb_values;
|
||||
|
||||
// On alloue les zones de mémoire:
|
||||
// On alloue les zones de mémoire:
|
||||
option_upper=(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);
|
||||
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);
|
||||
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);
|
||||
|
||||
// Si on l'a trouvée:
|
||||
// Si on l'a trouvée:
|
||||
if (stop_seek)
|
||||
{
|
||||
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,"=");
|
||||
|
||||
// Tant qu'on a pas atteint la fin de la ligne
|
||||
@ -451,7 +451,7 @@ int Load_INI(T_Config * conf)
|
||||
#endif
|
||||
|
||||
|
||||
// On alloue les zones de mémoire:
|
||||
// On alloue les zones de mémoire:
|
||||
buffer=(char *)malloc(1024);
|
||||
filename=(char *)malloc(256);
|
||||
|
||||
@ -722,7 +722,7 @@ int Load_INI(T_Config * conf)
|
||||
goto Erreur_ERREUR_INI_CORROMPU;
|
||||
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;
|
||||
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;
|
||||
}
|
||||
|
||||
// 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)
|
||||
if(Video_mode[0].Fullscreen==0)
|
||||
{
|
||||
@ -747,7 +747,7 @@ int Load_INI(T_Config * conf)
|
||||
}
|
||||
|
||||
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 ((values[0]<0) || (values[0]>1000))
|
||||
|
||||
@ -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++)
|
||||
{
|
||||
// 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];
|
||||
// On splotch la lettre à insérer
|
||||
// On splotch la lettre à insérer
|
||||
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;
|
||||
}
|
||||
// On termine la chaine
|
||||
@ -185,11 +185,11 @@ static int Valid_character(word c, int input_type)
|
||||
break;
|
||||
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
|
||||
// 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.
|
||||
// AmigaOS4: Pas de ':' car utilisé pour les volumes.
|
||||
// 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.
|
||||
// AmigaOS4: Pas de ':' car utilisé pour les volumes.
|
||||
#if defined(__WIN32__)
|
||||
char forbidden_char[] = {'/', '|', '?', '*', '<', '>', ':', '\\'};
|
||||
#elif defined (__amigaos4__) || defined(__AROS__)
|
||||
@ -418,17 +418,17 @@ bye:
|
||||
* Enhanced super scanf deluxe pro plus giga mieux :-) *
|
||||
****************************************************************************/
|
||||
byte Readline(word x_pos,word y_pos,char * str,byte visible_size,byte input_type)
|
||||
// Paramètres:
|
||||
// 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)
|
||||
// max_size : Nombre de caractères logeant dans la zone de saisie
|
||||
// input_type : 0=Chaîne, 1=Nombre, 2=Nom de fichier
|
||||
// Paramètres:
|
||||
// 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)
|
||||
// max_size : Nombre de caractères logeant dans la zone de saisie
|
||||
// input_type : 0=Chaîne, 1=Nombre, 2=Nom de fichier
|
||||
// Sortie:
|
||||
// 0: Sortie par annulation (Esc.) / 1: sortie par acceptation (Return)
|
||||
{
|
||||
byte max_size;
|
||||
// Grosse astuce pour les noms de fichiers: La taille affichée est différente
|
||||
// de la taille maximum gérée.
|
||||
// Grosse astuce pour les noms de fichiers: La taille affichée est différente
|
||||
// de la taille maximum gérée.
|
||||
if (input_type == INPUT_TYPE_FILENAME)
|
||||
max_size = 255;
|
||||
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)
|
||||
// Paramètres:
|
||||
// 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)
|
||||
// max_size : Nombre de caractères logeant dans la zone de saisie
|
||||
// Paramètres:
|
||||
// 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)
|
||||
// max_size : Nombre de caractères logeant dans la zone de saisie
|
||||
// input_type : 0=String, 1=Unsigned int, 2=Filename 3=Signed Double
|
||||
// decimal_places: Number of decimal places for a double
|
||||
// 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 window_x=Window_pos_X;
|
||||
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
|
||||
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)
|
||||
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)
|
||||
{
|
||||
// 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
|
||||
Hide_cursor();
|
||||
|
||||
// Effacement de la chaîne
|
||||
// Effacement de la chaîne
|
||||
Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR);
|
||||
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);
|
||||
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);
|
||||
size--;
|
||||
|
||||
// Effacement de la chaîne
|
||||
// Effacement de la chaîne
|
||||
Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR);
|
||||
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
|
||||
if (position>0)
|
||||
{
|
||||
// Effacement de la chaîne
|
||||
// Effacement de la chaîne
|
||||
if (position==size)
|
||||
Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR);
|
||||
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
|
||||
if (position)
|
||||
{
|
||||
// Effacement de la chaîne
|
||||
// Effacement de la chaîne
|
||||
if (position==size)
|
||||
Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR);
|
||||
position = 0;
|
||||
@ -852,7 +852,7 @@ byte Readline_ex_unicode(word x_pos,word y_pos,char * str,word * str_unicode,byt
|
||||
else
|
||||
Remove_character(str,position);
|
||||
size--;
|
||||
// Effacement de la chaîne
|
||||
// Effacement de la chaîne
|
||||
Window_rectangle(x_pos,y_pos,visible_size<<3,8,BACKGROUND_COLOR);
|
||||
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)
|
||||
str_unicode[0] = 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);
|
||||
goto affichage;
|
||||
case SDLK_RETURN :
|
||||
@ -882,18 +882,18 @@ byte Readline_ex_unicode(word x_pos,word y_pos,char * str,word * str_unicode,byt
|
||||
default :
|
||||
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);
|
||||
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)
|
||||
Insert_character_unicode(str_unicode,input_key,position/*,size*/);
|
||||
else
|
||||
Insert_character(str,input_key,position/*,size*/);
|
||||
// ce qui augmente la taille de la chaine
|
||||
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)
|
||||
{
|
||||
position++;
|
||||
@ -959,7 +959,7 @@ affichage:
|
||||
Input_sticky_control=0;
|
||||
}
|
||||
#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);
|
||||
// On raffiche la chaine correctement
|
||||
if (input_type==INPUT_TYPE_INTEGER)
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
*/
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2008 Peter Gordon
|
||||
Copyright 2008 Yves Rizoud
|
||||
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 * upper_buffer;
|
||||
|
||||
// On alloue les zones de mémoire:
|
||||
// On alloue les zones de mémoire:
|
||||
group_upper =(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);
|
||||
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);
|
||||
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);
|
||||
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++)
|
||||
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;
|
||||
|
||||
// Puis pour chaque valeur à recopier:
|
||||
// Puis pour chaque valeur à recopier:
|
||||
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)
|
||||
{
|
||||
// La valeur doit être écrite sous la forme Yes/No
|
||||
// La valeur doit être écrite sous la forme Yes/No
|
||||
|
||||
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
|
||||
{
|
||||
// La valeur doit être écrite sous forme numérique
|
||||
// La valeur doit être écrite sous forme numérique
|
||||
|
||||
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 '$':
|
||||
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]);
|
||||
dest_index+=strlen(dest+dest_index);
|
||||
}
|
||||
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]);
|
||||
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))
|
||||
{
|
||||
// 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
|
||||
// désigne une valeur:
|
||||
// On recopie tous les caractères de la source jusqu'au suivant qui
|
||||
// désigne une valeur:
|
||||
for (;(!Save_INI_char_in_value_alphabet(source[source_index])) && (source[source_index]!='\0');source_index++,dest_index++)
|
||||
dest[dest_index]=source[source_index];
|
||||
}
|
||||
else
|
||||
{
|
||||
// C'est la dernière valeur à initialiser
|
||||
// C'est la dernière valeur à initialiser
|
||||
|
||||
// On recopie toute la fin de la ligne:
|
||||
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++)
|
||||
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;
|
||||
|
||||
// Dans la destination, on écrit la valeur:
|
||||
// Dans la destination, on écrit la valeur:
|
||||
strcpy(dest+dest_index,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;
|
||||
//int buffer_index;
|
||||
|
||||
// On alloue les zones de mémoire:
|
||||
// On alloue les zones de mémoire:
|
||||
option_upper=(char *)malloc(1024);
|
||||
upper_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)
|
||||
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);
|
||||
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);
|
||||
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);
|
||||
|
||||
if (stop_seek)
|
||||
{
|
||||
// On l'a trouvée:
|
||||
// On l'a trouvée:
|
||||
|
||||
Save_INI_set_string(result_buffer,buffer,value);
|
||||
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
|
||||
{
|
||||
// On l'a pas trouvée:
|
||||
// On l'a pas trouvée:
|
||||
|
||||
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;
|
||||
//int buffer_index;
|
||||
|
||||
// On alloue les zones de mémoire:
|
||||
// On alloue les zones de mémoire:
|
||||
option_upper=(char *)malloc(1024);
|
||||
upper_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);
|
||||
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);
|
||||
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);
|
||||
|
||||
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);
|
||||
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
|
||||
{
|
||||
// On l'a pas trouvée:
|
||||
// On l'a pas trouvée:
|
||||
|
||||
if (fprintf(new_file,"%s",buffer)<0)
|
||||
{
|
||||
@ -407,14 +407,14 @@ int Save_INI(T_Config * conf)
|
||||
int ini_file_exists;
|
||||
int index;
|
||||
|
||||
// On alloue les zones de mémoire:
|
||||
// On alloue les zones de mémoire:
|
||||
buffer=(char *)malloc(1024);
|
||||
|
||||
// On calcule les noms des fichiers qu'on manipule:
|
||||
strcpy(filename,Config_directory);
|
||||
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)))
|
||||
{
|
||||
strcpy(temp_filename,Config_directory);
|
||||
@ -428,7 +428,7 @@ int Save_INI(T_Config * conf)
|
||||
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);
|
||||
strcat(ref_ini_file,INIDEF_FILENAME);
|
||||
old_file=fopen(ref_ini_file,"rb");
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2014 Sergii Pylypenko
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2008 Yves Rizoud
|
||||
Copyright 2008 Franck Charlet
|
||||
Copyright 2007 Adrien Destugues
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2014 Sergii Pylypenko
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2008 Peter Gordon
|
||||
Copyright 2008 Yves Rizoud
|
||||
Copyright 2008 Franck Charlet
|
||||
@ -239,15 +239,15 @@ void Set_config_directory(const char * program_dir, char * config_dir)
|
||||
strcat(config_dir,Config_SubDir);
|
||||
if (Directory_exists(config_dir))
|
||||
{
|
||||
// Répertoire trouvé, ok
|
||||
// Répertoire trouvé, ok
|
||||
strcat(config_dir,PATH_SEPARATOR);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Tentative de création
|
||||
// Tentative de création
|
||||
if (!Create_ConfigDirectory(config_dir))
|
||||
{
|
||||
// Réussi
|
||||
// Réussi
|
||||
strcat(config_dir,PATH_SEPARATOR);
|
||||
}
|
||||
else
|
||||
|
||||
@ -2,7 +2,7 @@
|
||||
*/
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2008 Peter Gordon
|
||||
Copyright 2008 Yves Rizoud
|
||||
Copyright 2008 Franck Charlet
|
||||
|
||||
102
src/shade.c
102
src/shade.c
@ -110,7 +110,7 @@ void Shade_draw_grad_ranges(void)
|
||||
{
|
||||
// On regarde quel shade on va afficher en preview
|
||||
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)
|
||||
{
|
||||
// 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));
|
||||
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 ((position>=selection_start) && (position<=selection_end))
|
||||
@ -172,7 +172,7 @@ void Tag_shades(word selection_start,word selection_end)
|
||||
else
|
||||
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))
|
||||
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;
|
||||
}
|
||||
|
||||
// Avant d'insérer quoi que ce soit, on efface les éventuelles couleurs que
|
||||
// l'on va réinsérer:
|
||||
// Avant d'insérer quoi que ce soit, on efface les éventuelles couleurs que
|
||||
// l'on va réinsérer:
|
||||
limit=512-selection_start;
|
||||
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]=(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;
|
||||
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));
|
||||
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_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:
|
||||
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)
|
||||
pos_2=block_1_start;
|
||||
else
|
||||
@ -404,12 +404,12 @@ void Swap_shade(short block_1_start,short block_2_start,short block_size)
|
||||
else
|
||||
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++)
|
||||
{
|
||||
// Il faut transformer la couleur pos_1 en 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)
|
||||
pos_2=block_2_start;
|
||||
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.
|
||||
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];
|
||||
Shade_list[Shade_current].List[pos_1]=Shade_list[Shade_current].List[pos_2];
|
||||
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)
|
||||
{
|
||||
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
|
||||
word old_mouse_x, old_mouse_x2; // Mémo. de l'ancienne pos. du curseur
|
||||
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
|
||||
word old_mouse_x, old_mouse_x2; // Mémo. de l'ancienne pos. du curseur
|
||||
word old_mouse_y, old_mouse_y2;
|
||||
byte old_mouse_k, old_mouse_k2;
|
||||
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));
|
||||
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");
|
||||
|
||||
// Déclaration & tracé du bouton de palette
|
||||
// Déclaration & tracé du bouton de palette
|
||||
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
|
||||
|
||||
// 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
|
||||
|
||||
// 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(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(234,87,43,14,"Paste" ,1,1,SDLK_p); // 7
|
||||
|
||||
// On tagge le bloc
|
||||
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_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);
|
||||
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);
|
||||
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( 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(110,107,27,14,"Inv" ,1,1,SDLK_i); // 11
|
||||
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);
|
||||
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
|
||||
|
||||
// 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);
|
||||
input_button = Window_set_input_button(274,174,3); // 15
|
||||
Num2str(Shade_list[Shade_current].Step,str,3);
|
||||
@ -517,7 +517,7 @@ int Menu_shade(void)
|
||||
// Button Mode
|
||||
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);
|
||||
Print_in_window(210,55,str,MC_Black,MC_Light);
|
||||
|
||||
@ -550,11 +550,11 @@ int Menu_shade(void)
|
||||
if (!old_mouse_k)
|
||||
{ // On vient de clicker
|
||||
|
||||
// On met à jour l'intervalle du Shade
|
||||
// On met à jour l'intervalle du Shade
|
||||
first_color=last_color=temp_color;
|
||||
// On tagge le bloc
|
||||
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);
|
||||
}
|
||||
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_cursor();
|
||||
@ -587,20 +587,20 @@ int Menu_shade(void)
|
||||
case 2 : // Gestion du changement de Shade (scroller)
|
||||
Hide_cursor();
|
||||
Shade_current=Window_attribute2;
|
||||
// Affichade du n° de shade actif
|
||||
// Affichade du n° de shade actif
|
||||
Num2str(Shade_current+1,str,1);
|
||||
Print_in_window(210,55,str,MC_Black,MC_Light);
|
||||
// Affichade du Pas
|
||||
Num2str(Shade_list[Shade_current].Step,str,3);
|
||||
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_cursor();
|
||||
// On place le nouveau shade dans le buffer du Undo
|
||||
memcpy(undo_buffer,Shade_list[Shade_current].List,512*sizeof(word));
|
||||
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_X!=old_mouse_x2) || (Mouse_Y!=old_mouse_y2) || (Mouse_K!=old_mouse_k2) )
|
||||
{
|
||||
@ -645,12 +645,12 @@ int Menu_shade(void)
|
||||
else
|
||||
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)
|
||||
Remove_shade(selection_start,selection_start+temp);
|
||||
}
|
||||
else // Un bloc sélectionné
|
||||
else // Un bloc sélectionné
|
||||
{
|
||||
Remove_shade(selection_start,selection_end);
|
||||
|
||||
@ -677,7 +677,7 @@ int Menu_shade(void)
|
||||
}
|
||||
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;
|
||||
if (selection_start>=512)
|
||||
selection_start=511;
|
||||
@ -782,7 +782,7 @@ int Menu_shade(void)
|
||||
// On place le shade dans le buffer du Undo
|
||||
memcpy(undo_buffer,Shade_list[Shade_current].List,512*sizeof(word));
|
||||
// Et on le modifie
|
||||
// On échange le bloc avec sa destination
|
||||
// On échange le bloc avec sa destination
|
||||
if (selection_start<=selection_end)
|
||||
{
|
||||
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;
|
||||
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_end=selection_start+temp-1;
|
||||
// Et on raffiche tout
|
||||
@ -883,8 +883,8 @@ int Menu_shade(void)
|
||||
if (!Mouse_K)
|
||||
switch (Key)
|
||||
{
|
||||
case SDLK_LEFTBRACKET : // Décaler couleur dans palette vers la gauche
|
||||
case SDLK_RIGHTBRACKET : // Décaler couleur dans palette vers la droite
|
||||
case SDLK_LEFTBRACKET : // Décaler couleur dans palette vers la gauche
|
||||
case SDLK_RIGHTBRACKET : // Décaler couleur dans palette vers la droite
|
||||
if (first_color==last_color)
|
||||
{
|
||||
if (Key==SDLK_LEFTBRACKET)
|
||||
@ -902,7 +902,7 @@ int Menu_shade(void)
|
||||
Block(Window_pos_X+(Menu_factor_X*172),
|
||||
Window_pos_Y+(Menu_factor_Y*27),
|
||||
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_cursor();
|
||||
}
|
||||
@ -957,7 +957,7 @@ int Menu_shade(void)
|
||||
Key=0;
|
||||
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 :
|
||||
Get_color_behind_window(&color,&click);
|
||||
if (click)
|
||||
@ -965,14 +965,14 @@ int Menu_shade(void)
|
||||
Hide_cursor();
|
||||
temp_color=color;
|
||||
|
||||
// On met à jour l'intervalle du Shade
|
||||
// On met à jour l'intervalle du Shade
|
||||
first_color=last_color=temp_color;
|
||||
// On tagge le bloc
|
||||
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);
|
||||
|
||||
// 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_cursor();
|
||||
@ -1004,11 +1004,11 @@ int Menu_shade(void)
|
||||
/// @return true if user clicked ok, false if he cancelled
|
||||
int Shade_settings_menu(void)
|
||||
{
|
||||
T_Shade * initial_shade_list; // Anciennes données des shades
|
||||
byte old_shade; // old n° de shade actif
|
||||
T_Shade * initial_shade_list; // Anciennes données des shades
|
||||
byte old_shade; // old n° de shade actif
|
||||
int return_code;
|
||||
|
||||
// Backup des anciennes données
|
||||
// Backup des anciennes données
|
||||
initial_shade_list=(T_Shade *)malloc(sizeof(Shade_list));
|
||||
memcpy(initial_shade_list,Shade_list,sizeof(Shade_list));
|
||||
old_shade=Shade_current;
|
||||
@ -1052,7 +1052,7 @@ void Button_Quick_shade_menu(void)
|
||||
int temp;
|
||||
char str[4];
|
||||
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;
|
||||
|
||||
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
|
||||
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);
|
||||
step_button = Window_set_input_button(40,19,3); // 4
|
||||
Num2str(Quick_shade_step,str,3);
|
||||
@ -1121,7 +1121,7 @@ void Button_Quick_shade_menu(void)
|
||||
}
|
||||
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)
|
||||
Button_Quick_shade_mode(); // => On y passe (cool!)
|
||||
}
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
|
||||
|
||||
|
||||
//---------------------- Modifier le pinceau spécial -------------------------
|
||||
//---------------------- Modifier le pinceau spécial -------------------------
|
||||
|
||||
void Set_paintbrush_size(int width, int height)
|
||||
{
|
||||
@ -295,7 +295,7 @@ void Special_previous_user_backcolor(void)
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
short index;
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2014 Sergii Pylypenko
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2008 Yves Rizoud
|
||||
Copyright 2007 Adrien Destugues
|
||||
Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
|
||||
@ -386,11 +386,11 @@ typedef struct
|
||||
|
||||
} T_Config;
|
||||
|
||||
// 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
|
||||
// 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
|
||||
// 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".
|
||||
|
||||
typedef struct T_Image
|
||||
|
||||
38
src/text.c
38
src/text.c
@ -3,7 +3,7 @@
|
||||
/* Grafx2 - The Ultimate 256-color bitmap paint program
|
||||
|
||||
Copyright 2014 Sergii Pylypenko
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2011 Pawel Góralski
|
||||
Copyright 2008 Yves Rizoud
|
||||
Copyright 2008 Franck Charlet
|
||||
Copyright 2008 Adrien Destugues
|
||||
@ -23,7 +23,7 @@
|
||||
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
|
||||
|
||||
#include <string.h>
|
||||
@ -77,15 +77,15 @@ typedef struct T_Font
|
||||
int Is_bitmap;
|
||||
char Label[22];
|
||||
|
||||
// Liste chainée simple
|
||||
// Liste chainée simple
|
||||
struct T_Font * Next;
|
||||
struct T_Font * Previous;
|
||||
} T_Font;
|
||||
// Liste chainée des polices de texte
|
||||
// Liste chainée des polices de texte
|
||||
T_Font * font_list_start;
|
||||
int Nb_fonts;
|
||||
|
||||
// Inspiré par Allegro
|
||||
// Inspiré par Allegro
|
||||
#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)))
|
||||
|
||||
@ -98,14 +98,14 @@ int Compare_fonts(T_Font * font_1, T_Font * font_2)
|
||||
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)
|
||||
{
|
||||
T_Font * font;
|
||||
int size=strlen(name)+1;
|
||||
int index;
|
||||
|
||||
// Détermination du type:
|
||||
// Détermination du type:
|
||||
|
||||
#if defined(__macosx__)
|
||||
char strFontName[512];
|
||||
@ -211,7 +211,7 @@ static void Add_font(const char *name, const char * font_name)
|
||||
searched_font=font_list_start;
|
||||
while (searched_font->Next && (compare=Compare_fonts(font, searched_font->Next))>0)
|
||||
searched_font=searched_font->Next;
|
||||
// Après searched_font
|
||||
// Après searched_font
|
||||
if (compare==0 && strcmp(font->Name, searched_font->Next->Name)==0)
|
||||
{
|
||||
// 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)
|
||||
{
|
||||
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.
|
||||
char * Font_label(int index)
|
||||
{
|
||||
@ -255,13 +255,13 @@ char * Font_label(int index)
|
||||
while (index--)
|
||||
font = font->Next;
|
||||
|
||||
// Libellé
|
||||
// Libellé
|
||||
strcpy(label, font->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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
char directory_name[MAX_PATH_CHARACTERS];
|
||||
@ -286,7 +286,7 @@ void Init_text(void)
|
||||
// Initialisation des fontes
|
||||
font_list_start = NULL;
|
||||
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);
|
||||
For_each_file(directory_name, Add_font);
|
||||
// fonts subdirectory in Config_directory
|
||||
@ -294,7 +294,7 @@ void Init_text(void)
|
||||
For_each_file(directory_name, Add_font);
|
||||
|
||||
#if defined(__WIN32__)
|
||||
// Parcours du répertoire systeme windows "fonts"
|
||||
// Parcours du répertoire systeme windows "fonts"
|
||||
#ifndef NOTTF
|
||||
{
|
||||
char * WindowsPath=getenv("windir");
|
||||
@ -306,7 +306,7 @@ void Init_text(void)
|
||||
}
|
||||
#endif
|
||||
#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
|
||||
|
||||
|
||||
@ -375,7 +375,7 @@ void Init_text(void)
|
||||
#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()
|
||||
{
|
||||
#ifdef NOTTF
|
||||
@ -662,8 +662,8 @@ byte *Render_text_SFont(const char *str, int font_number, int *width, int *heigh
|
||||
return new_brush;
|
||||
}
|
||||
|
||||
// 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,
|
||||
// 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,
|
||||
// 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)
|
||||
{
|
||||
|
||||
@ -355,13 +355,13 @@ void Button_Transform_menu(int btn)
|
||||
break;
|
||||
case 2 : // Flip X
|
||||
case 3 : // Flip Y
|
||||
case 6 : // 180° Rotation
|
||||
case 6 : // 180° Rotation
|
||||
new_width=Main.image_width;
|
||||
new_height=Main.image_height;
|
||||
break;
|
||||
|
||||
case 4 : // -90° Rotation
|
||||
case 5 : // +90° Rotation
|
||||
case 4 : // -90° Rotation
|
||||
case 5 : // +90° Rotation
|
||||
|
||||
new_width=Main.image_height;
|
||||
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);
|
||||
}
|
||||
break;
|
||||
case 4 : // -90° Rotation
|
||||
case 4 : // -90° Rotation
|
||||
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);
|
||||
}
|
||||
break;
|
||||
case 5 : // +90° Rotation
|
||||
case 5 : // +90° Rotation
|
||||
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);
|
||||
}
|
||||
break;
|
||||
case 6 : // 180° Rotation
|
||||
case 6 : // 180° Rotation
|
||||
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);
|
||||
|
||||
180
src/windows.c
180
src/windows.c
@ -62,9 +62,9 @@ T_Menu_Bar Menu_bars[MENUBAR_COUNT] =
|
||||
/// Width of one layer button, in pixels before scaling
|
||||
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 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;
|
||||
}
|
||||
|
||||
// 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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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,
|
||||
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_br =Bords Bas et Droite
|
||||
// color_s =Coins Haut-Droite et Bas-Gauche
|
||||
// color_tlc=Coin Haut-Gauche
|
||||
// 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);
|
||||
|
||||
// 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);
|
||||
|
||||
// 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);
|
||||
|
||||
// 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);
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
// -- 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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
@ -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 --
|
||||
|
||||
@ -438,19 +438,19 @@ void Change_palette_cells()
|
||||
{
|
||||
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)
|
||||
break;
|
||||
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)
|
||||
First_color_in_palette=First_color_in_palette/Menu_cells_X*Menu_cells_X;
|
||||
else
|
||||
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
|
||||
// de couleurs.
|
||||
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;
|
||||
}
|
||||
|
||||
// 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.
|
||||
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;
|
||||
}
|
||||
|
||||
// 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 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
|
||||
// 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
|
||||
// avec un nombre de lignes qui n'est pas une puissance de deux.)
|
||||
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)
|
||||
{
|
||||
@ -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
|
||||
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);
|
||||
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++)
|
||||
@ -1093,11 +1093,11 @@ void Print_filename(void)
|
||||
}
|
||||
}
|
||||
|
||||
// Fonction d'affichage d'une chaine numérique avec une fonte très fine
|
||||
// Spécialisée pour les compteurs RGB
|
||||
// Fonction d'affichage d'une chaine numérique avec une fonte très fine
|
||||
// Spécialisée pour les compteurs RGB
|
||||
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
|
||||
#define Ob(x) ((unsigned)Ob_(0 ## x ## uL))
|
||||
#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);
|
||||
}
|
||||
|
||||
// -- 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)
|
||||
// Pinceau = 0..NB_PAINTBRUSH_SPRITES-1 : Pinceau prédéfini
|
||||
// Pinceau = 0..NB_PAINTBRUSH_SPRITES-1 : Pinceau prédéfini
|
||||
{
|
||||
word x_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])
|
||||
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
|
||||
// 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),
|
||||
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);
|
||||
}
|
||||
|
||||
// -- 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)
|
||||
{
|
||||
@ -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)
|
||||
{
|
||||
@ -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)
|
||||
{
|
||||
// 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!
|
||||
// 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!
|
||||
word color,real_color;
|
||||
word start_x,start_y;
|
||||
word end_x,end_y;
|
||||
word width;
|
||||
word height;
|
||||
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)
|
||||
{
|
||||
@ -1687,8 +1687,8 @@ void Display_menu_palette_avoiding_window(byte * table)
|
||||
end_x=start_x+width;
|
||||
end_y=start_y+height;
|
||||
|
||||
// On affiche le bloc en entier si on peut, sinon on le découpe autour
|
||||
// de la fenêtre.
|
||||
// On affiche le bloc en entier si on peut, sinon on le découpe autour
|
||||
// de la fenêtre.
|
||||
if ( (start_y>=corner_y) || (end_x<=Window_pos_X) || (start_x>=corner_x) )
|
||||
Block(start_x,start_y,width,height,real_color);
|
||||
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.
|
||||
// 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 y_pos;
|
||||
short relative_x; // besoin d'une variable signée
|
||||
short relative_y; // besoin d'une variable signée
|
||||
// Attention aux unités
|
||||
short relative_x; // besoin d'une variable signée
|
||||
short relative_y; // besoin d'une variable signée
|
||||
// Attention aux unités
|
||||
relative_x = ((short)start_x - (short)Window_pos_X);
|
||||
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);
|
||||
}
|
||||
|
||||
// -------- 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)
|
||||
/*
|
||||
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)
|
||||
{
|
||||
// -- 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_left=Main.offset_X;
|
||||
Limit_visible_bottom =Limit_top+Menu_Y-1;
|
||||
@ -1785,7 +1785,7 @@ void Compute_limits(void)
|
||||
else
|
||||
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_left_zoom=Main.magnifier_offset_X;
|
||||
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)
|
||||
{
|
||||
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;
|
||||
|
||||
|
||||
// On vérifie que la limite à droite est visible:
|
||||
// On vérifie que la limite à droite est visible:
|
||||
if (right_is_visible)
|
||||
{
|
||||
start=Limit_top;
|
||||
@ -1910,7 +1910,7 @@ void Display_image_limits(void)
|
||||
if (bottom_is_visible)
|
||||
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.
|
||||
old_zoom_limit=Limit_right_zoom;
|
||||
Limit_right_zoom=Limit_visible_right_zoom;
|
||||
@ -1923,14 +1923,14 @@ void Display_image_limits(void)
|
||||
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)
|
||||
{
|
||||
start=Limit_left;
|
||||
end=(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;
|
||||
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 --
|
||||
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)
|
||||
{
|
||||
//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.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))
|
||||
{
|
||||
Main.separator_position+=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);
|
||||
while (Main.X_zoom>=theoric_X)
|
||||
{
|
||||
@ -2051,7 +2051,7 @@ void Compute_separator_data(void)
|
||||
// -------------------- Calcul des information de la loupe -------------------
|
||||
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();
|
||||
@ -2159,31 +2159,31 @@ void Copy_view_to_spare(void)
|
||||
if (Main.image_width!=Spare.image_width || Main.image_height!=Spare.image_height)
|
||||
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_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;
|
||||
|
||||
// Copie du facteur de zoom du brouillon
|
||||
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_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_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.X_zoom=Main.X_zoom;
|
||||
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 --
|
||||
|
||||
void Display_separator(void)
|
||||
@ -2207,11 +2207,11 @@ void Display_separator(void)
|
||||
Block(Main.separator_position+Menu_factor_X,Menu_factor_Y,
|
||||
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,
|
||||
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,
|
||||
(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,
|
||||
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 -----------------------------------
|
||||
|
||||
|
||||
// -- 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)
|
||||
{
|
||||
@ -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)
|
||||
{
|
||||
@ -2281,7 +2281,7 @@ void Display_cursor(void)
|
||||
float cos_a,sin_a;
|
||||
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)
|
||||
&& ( (!Main.magnifier_mode) || (Mouse_X<Main.separator_position) || (Mouse_X>=Main.X_zoom) ) )
|
||||
|| (Windows_open) || (Cursor_shape==CURSOR_SHAPE_HOURGLASS) )
|
||||
@ -2365,7 +2365,7 @@ void Display_cursor(void)
|
||||
if (end_y<3)
|
||||
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_y=(!Mouse_Y);
|
||||
@ -2464,7 +2464,7 @@ void Display_cursor(void)
|
||||
}
|
||||
break;
|
||||
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
|
||||
start_x=(Mouse_X-3);
|
||||
@ -2573,7 +2573,7 @@ void Display_cursor(void)
|
||||
void Hide_cursor(void)
|
||||
{
|
||||
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;
|
||||
short end_x;
|
||||
short end_y;
|
||||
@ -2762,7 +2762,7 @@ void Hide_cursor(void)
|
||||
|
||||
break;
|
||||
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
|
||||
start_x=(Mouse_X-3);
|
||||
@ -2878,7 +2878,7 @@ void Display_all_screen(void)
|
||||
word width;
|
||||
word height;
|
||||
|
||||
// ---/\/\/\ Partie non zoomée: /\/\/\---
|
||||
// ---/\/\/\ Partie non zoomée: /\/\/\---
|
||||
if (Main.magnifier_mode)
|
||||
{
|
||||
if (Main.image_width<Main.separator_position)
|
||||
@ -2899,7 +2899,7 @@ void Display_all_screen(void)
|
||||
height=Menu_Y;
|
||||
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.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)
|
||||
Block(0,Main.image_height,width,(Menu_Y-height),Main.backups->Pages->Transparent_color);
|
||||
|
||||
// ---/\/\/\ Partie zoomée: /\/\/\---
|
||||
// ---/\/\/\ Partie zoomée: /\/\/\---
|
||||
if (Main.magnifier_mode)
|
||||
{
|
||||
// Affichage de la barre de split
|
||||
@ -2925,7 +2925,7 @@ void Display_all_screen(void)
|
||||
else
|
||||
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)
|
||||
height=Main.image_height*Main.magnifier_factor;
|
||||
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);
|
||||
|
||||
// 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)
|
||||
Block(Main.X_zoom+(Main.image_width*Main.magnifier_factor),0,
|
||||
(Main.magnifier_width-Main.image_width)*Main.magnifier_factor,
|
||||
@ -2948,7 +2948,7 @@ void Display_all_screen(void)
|
||||
// ---/\/\/\ Affichage des limites /\/\/\---
|
||||
if (Config.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)
|
||||
{
|
||||
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
|
||||
{
|
||||
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 )
|
||||
|| (MC_Trans!=Old_trans) )
|
||||
{
|
||||
// Création de la table de conversion
|
||||
// Création de la table de conversion
|
||||
for (index=0; index<256; 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_white]=MC_White;
|
||||
|
||||
// Remappage de l'écran
|
||||
// Remappage de l'écran
|
||||
|
||||
// remap only screen pixels covered by a window or the menu
|
||||
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)
|
||||
{
|
||||
/*
|
||||
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 de toutes façons, c'est franchement facultatif...
|
||||
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 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);
|
||||
}
|
||||
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)
|
||||
{
|
||||
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) ||
|
||||
(MC_Trans==MC_Light) || (MC_Trans==MC_White)); MC_Trans++);
|
||||
// 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)
|
||||
{
|
||||
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) ||
|
||||
(MC_Trans==MC_Light) || (MC_Trans==MC_White)); MC_Trans++);
|
||||
// Easy case
|
||||
@ -3510,16 +3510,16 @@ void Compute_optimal_menu_colors(T_Components * palette)
|
||||
// SWAP_BYTES(MC_Light, MC_Dark)
|
||||
//}
|
||||
|
||||
// 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
|
||||
// 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
|
||||
// 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
|
||||
//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_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) ||
|
||||
(MC_Trans==MC_Light) || (MC_Trans==MC_White)); MC_Trans++);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user