diff --git a/Makefile b/Makefile
index f8830ffe..fc2f66a3 100644
--- a/Makefile
+++ b/Makefile
@@ -287,7 +287,7 @@ endif
.PHONY : all debug release clean depend zip version force install uninstall
# This is the list of the objects we want to build. Dependancies are built by "make depend" automatically.
-OBJ = $(OBJDIR)/main.o $(OBJDIR)/init.o $(OBJDIR)/graph.o $(OBJDIR)/sdlscreen.o $(OBJDIR)/misc.o $(OBJDIR)/special.o $(OBJDIR)/buttons.o $(OBJDIR)/palette.o $(OBJDIR)/help.o $(OBJDIR)/operatio.o $(OBJDIR)/pages.o $(OBJDIR)/loadsave.o $(OBJDIR)/readline.o $(OBJDIR)/engine.o $(OBJDIR)/filesel.o $(OBJDIR)/op_c.o $(OBJDIR)/readini.o $(OBJDIR)/saveini.o $(OBJDIR)/shade.o $(OBJDIR)/keyboard.o $(OBJDIR)/io.o $(OBJDIR)/version.o $(OBJDIR)/text.o $(OBJDIR)/SFont.o $(OBJDIR)/setup.o $(OBJDIR)/pxsimple.o $(OBJDIR)/pxtall.o $(OBJDIR)/pxwide.o $(OBJDIR)/pxdouble.o $(OBJDIR)/pxtriple.o $(OBJDIR)/pxtall2.o $(OBJDIR)/pxwide2.o $(OBJDIR)/pxquad.o $(OBJDIR)/windows.o $(OBJDIR)/brush.o $(OBJDIR)/realpath.o $(OBJDIR)/mountlist.o $(OBJDIR)/input.o $(OBJDIR)/hotkeys.o $(OBJDIR)/transform.o $(OBJDIR)/pversion.o $(OBJDIR)/factory.o $(PLATFORMOBJ) $(OBJDIR)/fileformats.o $(OBJDIR)/miscfileformats.o $(OBJDIR)/libraw2crtc.o
+OBJ = $(OBJDIR)/main.o $(OBJDIR)/init.o $(OBJDIR)/graph.o $(OBJDIR)/sdlscreen.o $(OBJDIR)/misc.o $(OBJDIR)/special.o $(OBJDIR)/buttons.o $(OBJDIR)/palette.o $(OBJDIR)/help.o $(OBJDIR)/operatio.o $(OBJDIR)/pages.o $(OBJDIR)/loadsave.o $(OBJDIR)/readline.o $(OBJDIR)/engine.o $(OBJDIR)/filesel.o $(OBJDIR)/op_c.o $(OBJDIR)/readini.o $(OBJDIR)/saveini.o $(OBJDIR)/shade.o $(OBJDIR)/keyboard.o $(OBJDIR)/io.o $(OBJDIR)/version.o $(OBJDIR)/text.o $(OBJDIR)/SFont.o $(OBJDIR)/setup.o $(OBJDIR)/pxsimple.o $(OBJDIR)/pxtall.o $(OBJDIR)/pxwide.o $(OBJDIR)/pxdouble.o $(OBJDIR)/pxtriple.o $(OBJDIR)/pxtall2.o $(OBJDIR)/pxwide2.o $(OBJDIR)/pxquad.o $(OBJDIR)/windows.o $(OBJDIR)/brush.o $(OBJDIR)/realpath.o $(OBJDIR)/mountlist.o $(OBJDIR)/input.o $(OBJDIR)/hotkeys.o $(OBJDIR)/transform.o $(OBJDIR)/pversion.o $(OBJDIR)/factory.o $(PLATFORMOBJ) $(OBJDIR)/fileformats.o $(OBJDIR)/miscfileformats.o $(OBJDIR)/libraw2crtc.o $(OBJDIR)/brush_ops.o
SKIN_FILES = skins/skin_classic.png skins/skin_modern.png skins/font_Classic.png skins/font_Fun.png
diff --git a/brush_ops.c b/brush_ops.c
new file mode 100644
index 00000000..8178a573
--- /dev/null
+++ b/brush_ops.c
@@ -0,0 +1,1286 @@
+/* vim:expandtab:ts=2 sw=2:
+*/
+/* Grafx2 - The Ultimate 256-color bitmap paint program
+
+ Copyright 2007 Adrien Destugues
+ Copyright 2009 Franck Charlet
+ Copyright 1996-2001 Sunset Design (Guillaume Dorme & Karl Maritaud)
+
+ Grafx2 is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; version 2
+ of the License.
+
+ Grafx2 is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Grafx2; if not, see
+*/
+//////////////////////////////////////////////////////////////////////////////
+///@file brush_ops.c
+/// Code for operations about the brush (grabbing, rotating, ...) and magnifier
+//////////////////////////////////////////////////////////////////////////////
+
+#include
+
+#include "brush.h"
+#include "buttons.h"
+#include "engine.h"
+#include "global.h"
+#include "graph.h"
+#include "misc.h"
+#include "operatio.h"
+#include "pages.h"
+#include "windows.h"
+
+
+/// Simulates clicking the "Draw" button.
+void Return_to_draw_mode(void)
+{
+
+ // Comme l'enclenchement du bouton efface le curseur, il faut l'afficher au
+ // 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
+ if (Config.Auto_discontinuous)
+ {
+ // 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:
+ Hide_cursor();
+
+ // On passe en brosse couleur:
+ Change_paintbrush_shape(PAINTBRUSH_SHAPE_COLOR_BRUSH);
+
+ if ((Config.Coords_rel) && (Menu_is_visible))
+ Print_in_menu("X: Y:",0);
+ Print_coordinates();
+}
+
+// ---------------------------------------------------------- OPERATION_MAGNIFY
+
+
+void Magnifier_12_0(void)
+
+// Opération : 4 (item d'une Loupe)
+// Click Souris: 1 ou 2
+// Taille_Pile : 0
+//
+// 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.
+ 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 du coin haut_gauche de la fenêtre devant être zoomée DANS L'ECRAN
+ if (Main_magnifier_offset_X+Main_magnifier_width>=Limit_right-Main_offset_X)
+ Main_magnifier_offset_X=Limit_right-Main_magnifier_width-Main_offset_X+1;
+ if (Main_magnifier_offset_Y+Main_magnifier_height>=Limit_bottom-Main_offset_Y)
+ Main_magnifier_offset_Y=Limit_bottom-Main_magnifier_height-Main_offset_Y+1;
+
+ // 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;
+
+ if (Main_magnifier_offset_X<0)
+ Main_magnifier_offset_X=0;
+ if (Main_magnifier_offset_Y<0)
+ Main_magnifier_offset_Y=0;
+
+ // 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
+ Compute_paintbrush_coordinates();
+
+ // On fait de notre mieux pour restaurer l'ancienne opération:
+ Start_operation_stack(Operation_before_interrupt);
+ Display_cursor();
+ Wait_end_of_click();
+}
+
+
+/////////////////////////////////////////////////////////// OPERATION_COLORPICK
+
+
+void Colorpicker_12_0(void)
+//
+// Opération : OPERATION_COLORPICK
+// Click Souris: 1 ou 2
+// Taille_Pile : 0
+//
+// Souris effacée: Oui
+//
+{
+ Init_start_operation();
+
+ if (Mouse_K==LEFT_SIDE)
+ {
+ Set_fore_color(Colorpicker_color);
+ }
+ else
+ {
+ Set_back_color(Colorpicker_color);
+ }
+ Operation_push(Mouse_K);
+}
+
+
+void Colorpicker_1_1(void)
+//
+// Opération : OPERATION_COLORPICK
+// Click Souris: 1
+// Taille_Pile : 1
+//
+// Souris effacée: Non
+//
+{
+ char str[4];
+
+ if ( (Paintbrush_X>=0) && (Paintbrush_Y>=0)
+ && (Paintbrush_X=0) && (Paintbrush_Y>=0)
+ && (Paintbrush_X1) width--;
+ if (height>1) height--;
+ }
+
+ Num2str(width,str,4);
+ Print_in_menu(str,2);
+ Num2str(height,str,4);
+ Print_in_menu(str,11);
+ }
+ else
+ Print_coordinates();
+ }
+
+ Display_all_screen();
+
+ x=Paintbrush_X;
+ y=Paintbrush_Y;
+ if (Snap_mode && Config.Adjust_brush_pick)
+ {
+ dx=Paintbrush_X-start_x;
+ dy=Paintbrush_Y-start_y;
+ if (dx<0) x++; else {if (dx>0) x--;}
+ if (dy<0) y++; else {if (dy>0) y--;}
+ Stretch_brush_preview(start_x,start_y,x,y);
+ }
+ else
+ Stretch_brush_preview(start_x,start_y,Paintbrush_X,Paintbrush_Y);
+
+ old_x=Paintbrush_X;
+ old_y=Paintbrush_Y;
+ Paintbrush_X=start_x;
+ Paintbrush_Y=start_y;
+ Display_cursor();
+ Paintbrush_X=old_x;
+ Paintbrush_Y=old_y;
+ Display_cursor();
+
+ Operation_stack_size-=2;
+ Operation_push(x);
+ Operation_push(y);
+
+ Operation_push(start_x);
+ Operation_push(start_y);
+ }
+
+ Operation_push(Paintbrush_X);
+ Operation_push(Paintbrush_Y);
+ Operation_push(2);
+}
+
+
+
+void Stretch_brush_0_7(void)
+//
+// Opération : OPERATION_STRETCH_BRUSH
+// Click Souris: 0
+// Taille_Pile : 7
+//
+// Souris effacée: Non
+//
+{
+ char str[5];
+ short start_x;
+ short start_y;
+ short old_x;
+ short old_y;
+ short width=0;
+ short height=0;
+ byte size_change;
+ short prev_state;
+
+ Operation_pop(&prev_state);
+ Operation_pop(&old_y);
+ Operation_pop(&old_x);
+ Operation_pop(&start_y);
+ Operation_pop(&start_x);
+
+ if ((Paintbrush_X!=old_x) || (Paintbrush_Y!=old_y) || (prev_state!=3))
+ {
+ if (Menu_is_visible)
+ {
+ if (Config.Coords_rel)
+ {
+ width=((start_x1)?start_x+(Brush_width>>1)-1:1;
+ height=(Brush_height>1)?start_y+(Brush_height>>1)-1:1;
+ break;
+ 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
+ width=start_x+Brush_width-1;
+ height=(Brush_height>1)?start_y+(Brush_height>>1)-1:1;
+ break;
+ case 'n': // Normal
+ width=start_x+Brush_width-1;
+ height=start_y+Brush_height-1;
+ break;
+ default :
+ size_change=0;
+ }
+ Key_ANSI=0;
+ }
+ else
+ size_change=0;
+
+ if (size_change)
+ {
+ // On efface la preview de la brosse (et la croix)
+ Display_all_screen();
+
+ old_x=Paintbrush_X;
+ old_y=Paintbrush_Y;
+ Paintbrush_X=start_x;
+ Paintbrush_Y=start_y;
+ Display_cursor();
+ Paintbrush_X=old_x;
+ Paintbrush_Y=old_y;
+
+ Stretch_brush_preview(start_x,start_y,width,height);
+ Display_cursor();
+
+ Operation_stack_size-=2;
+ Operation_push(width);
+ Operation_push(height);
+ }
+
+ Operation_push(start_x);
+ Operation_push(start_y);
+ Operation_push(Paintbrush_X);
+ Operation_push(Paintbrush_Y);
+ Operation_push(3);
+}
+
+
+void Stretch_brush_2_7(void)
+//
+// Opération : OPERATION_STRETCH_BRUSH
+// Click Souris: 2
+// Taille_Pile : 7
+//
+// Souris effacée: Oui
+//
+{
+ short computed_x;
+ short computed_y;
+ short start_x;
+ short start_y;
+
+
+ Operation_stack_size-=3;
+ Operation_pop(&start_y);
+ Operation_pop(&start_x);
+ Operation_pop(&computed_y);
+ Operation_pop(&computed_x);
+
+ // 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
+ Stretch_brush(start_x,start_y,computed_x,computed_y);
+
+ Return_to_draw_mode();
+}
+
+
+//////////////////////////////////////////////////// OPERATION_ROTATE_BRUSH
+
+
+void Rotate_brush_12_0(void)
+//
+// Opération : OPERATION_ROTATE_BRUSH
+// Click Souris: 1 ou 2
+// Taille_Pile : 0
+//
+// Souris effacée: Oui
+//
+{
+ Init_start_operation();
+ if (Mouse_K==LEFT_SIDE)
+ {
+ 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
+
+ if ((Config.Coords_rel) && (Menu_is_visible))
+ Print_in_menu("Angle: 0° ",0);
+ }
+ 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
+ }
+}
+
+
+
+void Rotate_brush_1_5(void)
+//
+// Opération : OPERATION_ROTATE_BRUSH
+// Click Souris: 1
+// Taille_Pile : 5
+//
+// Souris effacée: Non
+//
+{
+ char str[4];
+ short old_x;
+ short old_y;
+ short prev_state;
+ float angle;
+ int dx,dy;
+
+ Operation_pop(&prev_state);
+ Operation_pop(&old_y);
+ Operation_pop(&old_x);
+
+ if ( (Paintbrush_X!=old_x) || (Paintbrush_Y!=old_y) || (prev_state!=2) )
+ {
+ if ( (Brush_rotation_center_X==Paintbrush_X)
+ && (Brush_rotation_center_Y==Paintbrush_Y) )
+ angle=0.0;
+ else
+ {
+ dx=Paintbrush_X-Brush_rotation_center_X;
+ dy=Paintbrush_Y-Brush_rotation_center_Y;
+ angle=acos(((float)dx)/sqrt((dx*dx)+(dy*dy)));
+ if (dy>0) angle=M_2PI-angle;
+ }
+
+ if (Menu_is_visible)
+ {
+ if (Config.Coords_rel)
+ {
+ Num2str((int)(angle*180.0/M_PI),str,3);
+ Print_in_menu(str,7);
+ }
+ else
+ Print_coordinates();
+ }
+
+ Display_all_screen();
+ Rotate_brush_preview(angle);
+ Display_cursor();
+
+ Operation_stack_size-=2;
+ Operation_push(Paintbrush_X);
+ Operation_push(Paintbrush_Y);
+ }
+
+ Operation_push(Paintbrush_X);
+ Operation_push(Paintbrush_Y);
+ Operation_push(2);
+}
+
+
+
+void Rotate_brush_0_5(void)
+//
+// Opération : OPERATION_ROTATE_BRUSH
+// Click Souris: 0
+// Taille_Pile : 5
+//
+// Souris effacée: Non
+//
+{
+ char str[4];
+ short old_x;
+ short old_y;
+ short computed_x=0;
+ short computed_y=0;
+ byte angle_change;
+ short prev_state;
+ float angle=0.0;
+ int dx,dy;
+
+ Operation_pop(&prev_state);
+ Operation_pop(&old_y);
+ Operation_pop(&old_x);
+
+ if ((Paintbrush_X!=old_x) || (Paintbrush_Y!=old_y) || (prev_state!=3))
+ {
+ if ( (Brush_rotation_center_X==Paintbrush_X)
+ && (Brush_rotation_center_Y==Paintbrush_Y) )
+ angle=0.0;
+ else
+ {
+ dx=Paintbrush_X-Brush_rotation_center_X;
+ dy=Paintbrush_Y-Brush_rotation_center_Y;
+ angle=acos(((float)dx)/sqrt((dx*dx)+(dy*dy)));
+ if (dy>0) angle=M_2PI-angle;
+ }
+
+ if (Menu_is_visible)
+ {
+ if (Config.Coords_rel)
+ {
+ Num2str(Round(angle*180.0/M_PI),str,3);
+ Print_in_menu(str,7);
+ }
+ else
+ Print_coordinates();
+ }
+ }
+
+ // Utilise Key_ANSI au lieu de Key, car Get_input() met ce dernier
+ // à zero si une operation est en cours (Operation_stack_size!=0)
+ if (Key_ANSI)
+ {
+ angle_change=1;
+ computed_x=Brush_rotation_center_X;
+ computed_y=Brush_rotation_center_Y;
+ switch (Key_ANSI)
+ {
+ case '6': angle= 0.0 ; computed_x++; break;
+ case '9': angle=M_PI*0.25; computed_x++; computed_y--; break;
+ case '8': angle=M_PI*0.5 ; computed_y--; break;
+ case '7': angle=M_PI*0.75; computed_x--; computed_y--; break;
+ case '4': angle=M_PI ; computed_x--; break;
+ case '1': angle=M_PI*1.25; computed_x--; computed_y++; break;
+ case '2': angle=M_PI*1.5 ; computed_y++; break;
+ case '3': angle=M_PI*1.75; computed_x++; computed_y++; break;
+ default :
+ angle_change=0;
+ }
+ Key_ANSI=0;
+ }
+ else
+ angle_change=0;
+
+ if (angle_change)
+ {
+ // On efface la preview de la brosse
+ Display_all_screen();
+ Rotate_brush_preview(angle);
+ Display_cursor();
+
+ Operation_stack_size-=2;
+ Operation_push(computed_x);
+ Operation_push(computed_y);
+ }
+
+ Operation_push(Paintbrush_X);
+ Operation_push(Paintbrush_Y);
+ Operation_push(3);
+}
+
+
+void Rotate_brush_2_5(void)
+//
+// Opération : OPERATION_ROTATE_BRUSH
+// Click Souris: 2
+// Taille_Pile : 5
+//
+// Souris effacée: Oui
+//
+{
+ short computed_x;
+ short computed_y;
+ int dx,dy;
+ float angle;
+
+
+ // On efface la preview de la brosse
+ Display_all_screen();
+
+ Operation_stack_size-=3;
+ Operation_pop(&computed_y);
+ Operation_pop(&computed_x);
+
+ // 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;
+ else
+ {
+ dx=computed_x-Brush_rotation_center_X;
+ dy=computed_y-Brush_rotation_center_Y;
+ angle=acos(((float)dx)/sqrt((dx*dx)+(dy*dy)));
+ if (dy>0) angle=M_2PI-angle;
+ }
+
+ // Et enfin on stocke pour de bon la nouvelle brosse étirée
+ Rotate_brush(angle);
+
+ Return_to_draw_mode();
+}
+
+///////////////////////////////////////////////////// OPERATION_DISTORT_BRUSH
+
+/// Draws a 2x2 XOR square at the specified picture coordinates, on the screen.
+void Draw_stretch_spot(short x_pos, short y_pos)
+{
+ short x,y;
+
+ for (y=y_pos-1;y=Limit_top && y<=Limit_visible_bottom)
+ for (x=x_pos-1;x=Limit_left && x<=Limit_visible_right)
+ Pixel_preview(x,y,~Read_pixel(x-Main_offset_X,y-Main_offset_Y));
+ Update_part_of_screen(x_pos-1, y_pos-1, 2, 2);
+}
+
+void Distort_brush_0_0(void)
+//
+// Opération : OPERATION_DISTORT_BRUSH
+// Click Souris: 0
+// Taille_Pile : 0
+//
+// Souris effacée: Non
+//
+{
+ if ( Menu_is_visible )
+ {
+ Print_in_menu("POSITION BRUSH TO START ",0);
+ }
+}
+
+void Distort_brush_1_0(void)
+//
+// Opération : OPERATION_DISTORT_BRUSH
+// Click Souris: 1
+// Taille_Pile : 0
+//
+// Souris effacée: Non
+//
+{
+ short x_pos, y_pos;
+
+ Init_start_operation();
+ Paintbrush_hidden=1;
+ Hide_cursor();
+
+ // Top left angle
+ x_pos=Paintbrush_X-Brush_offset_X;
+ y_pos=Paintbrush_Y-Brush_offset_Y;
+ Draw_stretch_spot(x_pos,y_pos);
+ Operation_push(x_pos);
+ Operation_push(y_pos);
+
+ // Top right angle
+ x_pos+=Brush_width;
+ Draw_stretch_spot(x_pos,y_pos);
+ Operation_push(x_pos);
+ Operation_push(y_pos);
+
+ // Bottom right angle
+ y_pos+=Brush_height;
+ Draw_stretch_spot(x_pos,y_pos);
+ Operation_push(x_pos);
+ Operation_push(y_pos);
+
+ // Bottom left angle
+ x_pos-=Brush_width;
+ Draw_stretch_spot(x_pos,y_pos);
+ Operation_push(x_pos);
+ Operation_push(y_pos);
+
+ Distort_brush_preview(
+ Operation_stack[1],
+ Operation_stack[2],
+ Operation_stack[3],
+ Operation_stack[4],
+ Operation_stack[5],
+ Operation_stack[6],
+ Operation_stack[7],
+ Operation_stack[8]);
+ Display_cursor();
+ Update_part_of_screen(Paintbrush_X-Brush_offset_X, Paintbrush_Y-Brush_offset_Y, Brush_width, Brush_height);
+ Wait_end_of_click();
+ // Erase the message in status bar
+ if ( (Config.Coords_rel) && (Menu_is_visible) )
+ {
+ Print_in_menu("X: Y: ",0);
+ }
+}
+
+void Distort_brush_1_8(void)
+//
+// Opération : OPERATION_DISTORT_BRUSH
+// Click Souris: 1
+// Taille_Pile : 8
+//
+// Souris effacée: No
+//
+{
+ // How far (in pixels) you can catch a handle
+ #define REACH_DISTANCE 100
+ short i;
+ short x[4];
+ short y[4];
+ long best_distance=REACH_DISTANCE;
+ short best_spot=-1;
+
+ for (i=3;i>=0;i--)
+ {
+ long distance;
+ Operation_pop(&y[i]);
+ Operation_pop(&x[i]);
+ distance=Distance(Paintbrush_X,Paintbrush_Y,x[i],y[i]);
+ if (distance-1)
+ {
+ Operation_push(best_spot);
+ }
+ if ( (Config.Coords_rel) && (Menu_is_visible) )
+ {
+ Print_in_menu("X: Y: ",0);
+ Print_coordinates();
+ }
+}
+
+void Distort_brush_1_9(void)
+//
+// Opération : OPERATION_DISTORT_BRUSH
+// Click Souris: 1
+// Taille_Pile : 9
+//
+// Souris effacée: No
+//
+{
+ short i;
+ short x[4];
+ short y[4];
+ short selected_corner;
+
+ // Pop all arguments
+ Operation_pop(&selected_corner);
+ for (i=3;i>=0;i--)
+ {
+ Operation_pop(&y[i]);
+ Operation_pop(&x[i]);
+ }
+
+ if (Paintbrush_X!=x[selected_corner] || Paintbrush_Y!=y[selected_corner])
+ {
+ Hide_cursor();
+
+ // Easiest refresh mode: make no assumptions on how the brush was
+ // displayed before.
+ Display_all_screen();
+
+ x[selected_corner]=Paintbrush_X;
+ y[selected_corner]=Paintbrush_Y;
+
+ for (i=0;i<4;i++)
+ Draw_stretch_spot(x[i],y[i]);
+
+ Distort_brush_preview(x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3]);
+
+ Display_cursor();
+
+ if ( (Config.Coords_rel) && (Menu_is_visible) )
+ {
+ Print_in_menu("X: Y: ",0);
+ Print_coordinates();
+ }
+ Update_rect(0,0,Screen_width,Menu_Y);
+ }
+
+ // Push back all arguments
+ for (i=0;i<4;i++)
+ {
+ Operation_push(x[i]);
+ Operation_push(y[i]);
+ }
+ Operation_push(selected_corner);
+
+}
+void Distort_brush_0_9(void)
+//
+// Opération : OPERATION_DISTORT_BRUSH
+// Click Souris: 0
+// Taille_Pile : 9
+//
+// Souris effacée: No
+//
+{
+ short selected_corner;
+ Operation_pop(&selected_corner);
+
+}
+
+void Distort_brush_2_0(void)
+//
+// Opération : OPERATION_DISTORT_BRUSH
+// Click Souris: 2
+// Taille_Pile : 0
+//
+// Souris effacée: Oui
+//
+{
+ Paintbrush_hidden=0;
+ Display_all_screen();
+ // Erase the message in status bar
+ if ( (Config.Coords_rel) && (Menu_is_visible) )
+ {
+ Print_in_menu("X: Y: ",0);
+ }
+ Return_to_draw_mode();
+}
+
+void Distort_brush_2_8(void)
+//
+// Opération : OPERATION_DISTORT_BRUSH
+// Click Souris: 2
+// Taille_Pile : 8
+//
+// Souris effacée: Oui
+//
+{
+ short i;
+ short x[4];
+ short y[4];
+
+ // Pop all arguments
+ for (i=3;i>=0;i--)
+ {
+ Operation_pop(&y[i]);
+ Operation_pop(&x[i]);
+ }
+ Distort_brush(x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3]);
+
+ Paintbrush_hidden=0;
+ Display_all_screen();
+
+ Return_to_draw_mode();
+}
+
diff --git a/global.h b/global.h
index 2f013869..2b0927c1 100644
--- a/global.h
+++ b/global.h
@@ -836,6 +836,9 @@ GFX2_GLOBAL short Colorpicker_X;
/// Position of the colorpicker tool, in image coordinates.
GFX2_GLOBAL short Colorpicker_Y;
+GFX2_GLOBAL short * Polyfill_table_of_points;
+GFX2_GLOBAL int Polyfill_number_of_points;
+
/// Brush container
GFX2_GLOBAL T_Brush_template Brush_container[BRUSH_CONTAINER_COLUMNS*BRUSH_CONTAINER_ROWS];
diff --git a/help.c b/help.c
index f498ab76..9fcf976e 100644
--- a/help.c
+++ b/help.c
@@ -646,11 +646,11 @@ void Button_Stats(void)
// Used memory
Print_in_window(10,59,"Used memory pages: ",STATS_TITLE_COLOR,MC_Black);
if(Stats_pages_memory > (100LL*1024*1024*1024))
- sprintf(buffer,"%u (%u Gb)",Stats_pages_number, (unsigned int)(Stats_pages_memory/(1024*1024*1024)));
+ sprintf(buffer,"%ld (%lld Gb)",Stats_pages_number, Stats_pages_memory/(1024*1024*1024));
else if(Stats_pages_memory > (100*1024*1024))
- sprintf(buffer,"%u (%u Mb)",Stats_pages_number, (unsigned int)(Stats_pages_memory/(1024*1024)));
+ sprintf(buffer,"%ld (%lld Mb)",Stats_pages_number, Stats_pages_memory/(1024*1024));
else
- sprintf(buffer,"%u (%u Kb)",Stats_pages_number, (unsigned int)(Stats_pages_memory/1024));
+ sprintf(buffer,"%ld (%lld Kb)",Stats_pages_number, Stats_pages_memory/1024);
Print_in_window(162,59,buffer,STATS_DATA_COLOR,MC_Black);
// Affichage de l'espace disque libre
diff --git a/operatio.c b/operatio.c
index 728c4e08..c349af1e 100644
--- a/operatio.c
+++ b/operatio.c
@@ -162,35 +162,6 @@ void Display_coords_rel_or_abs(short start_x, short start_y)
Print_coordinates();
}
-/// Simulates clicking the "Draw" button.
-void Return_to_draw_mode(void)
-{
-
- // Comme l'enclenchement du bouton efface le curseur, il faut l'afficher au
- // 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
- if (Config.Auto_discontinuous)
- {
- // 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:
- Hide_cursor();
-
- // On passe en brosse couleur:
- Change_paintbrush_shape(PAINTBRUSH_SHAPE_COLOR_BRUSH);
-
- if ((Config.Coords_rel) && (Menu_is_visible))
- Print_in_menu("X: Y:",0);
- Print_coordinates();
-}
-
//////////////////////////////////////////////////// OPERATION_CONTINUOUS_DRAW
void Freehand_mode1_1_0(void)
@@ -765,60 +736,6 @@ void K_line_12_7(void)
}
}
-
-// ---------------------------------------------------------- OPERATION_MAGNIFY
-
-
-void Magnifier_12_0(void)
-
-// Opération : 4 (item d'une Loupe)
-// Click Souris: 1 ou 2
-// Taille_Pile : 0
-//
-// 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.
- 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 du coin haut_gauche de la fenêtre devant être zoomée DANS L'ECRAN
- if (Main_magnifier_offset_X+Main_magnifier_width>=Limit_right-Main_offset_X)
- Main_magnifier_offset_X=Limit_right-Main_magnifier_width-Main_offset_X+1;
- if (Main_magnifier_offset_Y+Main_magnifier_height>=Limit_bottom-Main_offset_Y)
- Main_magnifier_offset_Y=Limit_bottom-Main_magnifier_height-Main_offset_Y+1;
-
- // 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;
-
- if (Main_magnifier_offset_X<0)
- Main_magnifier_offset_X=0;
- if (Main_magnifier_offset_Y<0)
- Main_magnifier_offset_Y=0;
-
- // 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
- Compute_paintbrush_coordinates();
-
- // On fait de notre mieux pour restaurer l'ancienne opération:
- Start_operation_stack(Operation_before_interrupt);
- Display_cursor();
- Wait_end_of_click();
-}
-
/////////////////////////////////////////////////// OPERATION_RECTANGLE_?????
void Rectangle_12_0(void)
@@ -1430,141 +1347,6 @@ void Replace_2_0(void)
}
-/////////////////////////////////////////////////////////// OPERATION_COLORPICK
-
-
-void Colorpicker_12_0(void)
-//
-// Opération : OPERATION_COLORPICK
-// Click Souris: 1 ou 2
-// Taille_Pile : 0
-//
-// Souris effacée: Oui
-//
-{
- Init_start_operation();
-
- if (Mouse_K==LEFT_SIDE)
- {
- Set_fore_color(Colorpicker_color);
- }
- else
- {
- Set_back_color(Colorpicker_color);
- }
- Operation_push(Mouse_K);
-}
-
-
-void Colorpicker_1_1(void)
-//
-// Opération : OPERATION_COLORPICK
-// Click Souris: 1
-// Taille_Pile : 1
-//
-// Souris effacée: Non
-//
-{
- char str[4];
-
- if ( (Paintbrush_X>=0) && (Paintbrush_Y>=0)
- && (Paintbrush_X=0) && (Paintbrush_Y>=0)
- && (Paintbrush_X1) width--;
- if (height>1) height--;
- }
-
- Num2str(width,str,4);
- Print_in_menu(str,2);
- Num2str(height,str,4);
- Print_in_menu(str,11);
- }
- else
- Print_coordinates();
- }
-
- Display_all_screen();
-
- x=Paintbrush_X;
- y=Paintbrush_Y;
- if (Snap_mode && Config.Adjust_brush_pick)
- {
- dx=Paintbrush_X-start_x;
- dy=Paintbrush_Y-start_y;
- if (dx<0) x++; else {if (dx>0) x--;}
- if (dy<0) y++; else {if (dy>0) y--;}
- Stretch_brush_preview(start_x,start_y,x,y);
- }
- else
- Stretch_brush_preview(start_x,start_y,Paintbrush_X,Paintbrush_Y);
-
- old_x=Paintbrush_X;
- old_y=Paintbrush_Y;
- Paintbrush_X=start_x;
- Paintbrush_Y=start_y;
- Display_cursor();
- Paintbrush_X=old_x;
- Paintbrush_Y=old_y;
- Display_cursor();
-
- Operation_stack_size-=2;
- Operation_push(x);
- Operation_push(y);
-
- Operation_push(start_x);
- Operation_push(start_y);
- }
-
- Operation_push(Paintbrush_X);
- Operation_push(Paintbrush_Y);
- Operation_push(2);
-}
-
-
-
-void Stretch_brush_0_7(void)
-//
-// Opération : OPERATION_STRETCH_BRUSH
-// Click Souris: 0
-// Taille_Pile : 7
-//
-// Souris effacée: Non
-//
-{
- char str[5];
- short start_x;
- short start_y;
- short old_x;
- short old_y;
- short width=0;
- short height=0;
- byte size_change;
- short prev_state;
-
- Operation_pop(&prev_state);
- Operation_pop(&old_y);
- Operation_pop(&old_x);
- Operation_pop(&start_y);
- Operation_pop(&start_x);
-
- if ((Paintbrush_X!=old_x) || (Paintbrush_Y!=old_y) || (prev_state!=3))
- {
- if (Menu_is_visible)
- {
- if (Config.Coords_rel)
- {
- width=((start_x1)?start_x+(Brush_width>>1)-1:1;
- height=(Brush_height>1)?start_y+(Brush_height>>1)-1:1;
- break;
- 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
- width=start_x+Brush_width-1;
- height=(Brush_height>1)?start_y+(Brush_height>>1)-1:1;
- break;
- case 'n': // Normal
- width=start_x+Brush_width-1;
- height=start_y+Brush_height-1;
- break;
- default :
- size_change=0;
- }
- Key_ANSI=0;
- }
- else
- size_change=0;
-
- if (size_change)
- {
- // On efface la preview de la brosse (et la croix)
- Display_all_screen();
-
- old_x=Paintbrush_X;
- old_y=Paintbrush_Y;
- Paintbrush_X=start_x;
- Paintbrush_Y=start_y;
- Display_cursor();
- Paintbrush_X=old_x;
- Paintbrush_Y=old_y;
-
- Stretch_brush_preview(start_x,start_y,width,height);
- Display_cursor();
-
- Operation_stack_size-=2;
- Operation_push(width);
- Operation_push(height);
- }
-
- Operation_push(start_x);
- Operation_push(start_y);
- Operation_push(Paintbrush_X);
- Operation_push(Paintbrush_Y);
- Operation_push(3);
-}
-
-
-void Stretch_brush_2_7(void)
-//
-// Opération : OPERATION_STRETCH_BRUSH
-// Click Souris: 2
-// Taille_Pile : 7
-//
-// Souris effacée: Oui
-//
-{
- short computed_x;
- short computed_y;
- short start_x;
- short start_y;
-
-
- Operation_stack_size-=3;
- Operation_pop(&start_y);
- Operation_pop(&start_x);
- Operation_pop(&computed_y);
- Operation_pop(&computed_x);
-
- // 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
- Stretch_brush(start_x,start_y,computed_x,computed_y);
-
- Return_to_draw_mode();
-}
-
-
-//////////////////////////////////////////////////// OPERATION_ROTATE_BRUSH
-
-
-void Rotate_brush_12_0(void)
-//
-// Opération : OPERATION_ROTATE_BRUSH
-// Click Souris: 1 ou 2
-// Taille_Pile : 0
-//
-// Souris effacée: Oui
-//
-{
- Init_start_operation();
- if (Mouse_K==LEFT_SIDE)
- {
- 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
-
- if ((Config.Coords_rel) && (Menu_is_visible))
- Print_in_menu("Angle: 0° ",0);
- }
- 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
- }
-}
-
-
-
-void Rotate_brush_1_5(void)
-//
-// Opération : OPERATION_ROTATE_BRUSH
-// Click Souris: 1
-// Taille_Pile : 5
-//
-// Souris effacée: Non
-//
-{
- char str[4];
- short old_x;
- short old_y;
- short prev_state;
- float angle;
- int dx,dy;
-
- Operation_pop(&prev_state);
- Operation_pop(&old_y);
- Operation_pop(&old_x);
-
- if ( (Paintbrush_X!=old_x) || (Paintbrush_Y!=old_y) || (prev_state!=2) )
- {
- if ( (Brush_rotation_center_X==Paintbrush_X)
- && (Brush_rotation_center_Y==Paintbrush_Y) )
- angle=0.0;
- else
- {
- dx=Paintbrush_X-Brush_rotation_center_X;
- dy=Paintbrush_Y-Brush_rotation_center_Y;
- angle=acos(((float)dx)/sqrt((dx*dx)+(dy*dy)));
- if (dy>0) angle=M_2PI-angle;
- }
-
- if (Menu_is_visible)
- {
- if (Config.Coords_rel)
- {
- Num2str((int)(angle*180.0/M_PI),str,3);
- Print_in_menu(str,7);
- }
- else
- Print_coordinates();
- }
-
- Display_all_screen();
- Rotate_brush_preview(angle);
- Display_cursor();
-
- Operation_stack_size-=2;
- Operation_push(Paintbrush_X);
- Operation_push(Paintbrush_Y);
- }
-
- Operation_push(Paintbrush_X);
- Operation_push(Paintbrush_Y);
- Operation_push(2);
-}
-
-
-
-void Rotate_brush_0_5(void)
-//
-// Opération : OPERATION_ROTATE_BRUSH
-// Click Souris: 0
-// Taille_Pile : 5
-//
-// Souris effacée: Non
-//
-{
- char str[4];
- short old_x;
- short old_y;
- short computed_x=0;
- short computed_y=0;
- byte angle_change;
- short prev_state;
- float angle=0.0;
- int dx,dy;
-
- Operation_pop(&prev_state);
- Operation_pop(&old_y);
- Operation_pop(&old_x);
-
- if ((Paintbrush_X!=old_x) || (Paintbrush_Y!=old_y) || (prev_state!=3))
- {
- if ( (Brush_rotation_center_X==Paintbrush_X)
- && (Brush_rotation_center_Y==Paintbrush_Y) )
- angle=0.0;
- else
- {
- dx=Paintbrush_X-Brush_rotation_center_X;
- dy=Paintbrush_Y-Brush_rotation_center_Y;
- angle=acos(((float)dx)/sqrt((dx*dx)+(dy*dy)));
- if (dy>0) angle=M_2PI-angle;
- }
-
- if (Menu_is_visible)
- {
- if (Config.Coords_rel)
- {
- Num2str(Round(angle*180.0/M_PI),str,3);
- Print_in_menu(str,7);
- }
- else
- Print_coordinates();
- }
- }
-
- // Utilise Key_ANSI au lieu de Key, car Get_input() met ce dernier
- // à zero si une operation est en cours (Operation_stack_size!=0)
- if (Key_ANSI)
- {
- angle_change=1;
- computed_x=Brush_rotation_center_X;
- computed_y=Brush_rotation_center_Y;
- switch (Key_ANSI)
- {
- case '6': angle= 0.0 ; computed_x++; break;
- case '9': angle=M_PI*0.25; computed_x++; computed_y--; break;
- case '8': angle=M_PI*0.5 ; computed_y--; break;
- case '7': angle=M_PI*0.75; computed_x--; computed_y--; break;
- case '4': angle=M_PI ; computed_x--; break;
- case '1': angle=M_PI*1.25; computed_x--; computed_y++; break;
- case '2': angle=M_PI*1.5 ; computed_y++; break;
- case '3': angle=M_PI*1.75; computed_x++; computed_y++; break;
- default :
- angle_change=0;
- }
- Key_ANSI=0;
- }
- else
- angle_change=0;
-
- if (angle_change)
- {
- // On efface la preview de la brosse
- Display_all_screen();
- Rotate_brush_preview(angle);
- Display_cursor();
-
- Operation_stack_size-=2;
- Operation_push(computed_x);
- Operation_push(computed_y);
- }
-
- Operation_push(Paintbrush_X);
- Operation_push(Paintbrush_Y);
- Operation_push(3);
-}
-
-
-void Rotate_brush_2_5(void)
-//
-// Opération : OPERATION_ROTATE_BRUSH
-// Click Souris: 2
-// Taille_Pile : 5
-//
-// Souris effacée: Oui
-//
-{
- short computed_x;
- short computed_y;
- int dx,dy;
- float angle;
-
-
- // On efface la preview de la brosse
- Display_all_screen();
-
- Operation_stack_size-=3;
- Operation_pop(&computed_y);
- Operation_pop(&computed_x);
-
- // 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;
- else
- {
- dx=computed_x-Brush_rotation_center_X;
- dy=computed_y-Brush_rotation_center_Y;
- angle=acos(((float)dx)/sqrt((dx*dx)+(dy*dy)));
- if (dy>0) angle=M_2PI-angle;
- }
-
- // Et enfin on stocke pour de bon la nouvelle brosse étirée
- Rotate_brush(angle);
-
- Return_to_draw_mode();
-}
-
-///////////////////////////////////////////////////// OPERATION_DISTORT_BRUSH
-
-/// Draws a 2x2 XOR square at the specified picture coordinates, on the screen.
-void Draw_stretch_spot(short x_pos, short y_pos)
-{
- short x,y;
-
- for (y=y_pos-1;y=Limit_top && y<=Limit_visible_bottom)
- for (x=x_pos-1;x=Limit_left && x<=Limit_visible_right)
- Pixel_preview(x,y,~Read_pixel(x-Main_offset_X,y-Main_offset_Y));
- Update_part_of_screen(x_pos-1, y_pos-1, 2, 2);
-}
-
-void Distort_brush_0_0(void)
-//
-// Opération : OPERATION_DISTORT_BRUSH
-// Click Souris: 0
-// Taille_Pile : 0
-//
-// Souris effacée: Non
-//
-{
- if ( Menu_is_visible )
- {
- Print_in_menu("POSITION BRUSH TO START ",0);
- }
-}
-
-void Distort_brush_1_0(void)
-//
-// Opération : OPERATION_DISTORT_BRUSH
-// Click Souris: 1
-// Taille_Pile : 0
-//
-// Souris effacée: Non
-//
-{
- short x_pos, y_pos;
-
- Init_start_operation();
- Paintbrush_hidden=1;
- Hide_cursor();
-
- // Top left angle
- x_pos=Paintbrush_X-Brush_offset_X;
- y_pos=Paintbrush_Y-Brush_offset_Y;
- Draw_stretch_spot(x_pos,y_pos);
- Operation_push(x_pos);
- Operation_push(y_pos);
-
- // Top right angle
- x_pos+=Brush_width;
- Draw_stretch_spot(x_pos,y_pos);
- Operation_push(x_pos);
- Operation_push(y_pos);
-
- // Bottom right angle
- y_pos+=Brush_height;
- Draw_stretch_spot(x_pos,y_pos);
- Operation_push(x_pos);
- Operation_push(y_pos);
-
- // Bottom left angle
- x_pos-=Brush_width;
- Draw_stretch_spot(x_pos,y_pos);
- Operation_push(x_pos);
- Operation_push(y_pos);
-
- Distort_brush_preview(
- Operation_stack[1],
- Operation_stack[2],
- Operation_stack[3],
- Operation_stack[4],
- Operation_stack[5],
- Operation_stack[6],
- Operation_stack[7],
- Operation_stack[8]);
- Display_cursor();
- Update_part_of_screen(Paintbrush_X-Brush_offset_X, Paintbrush_Y-Brush_offset_Y, Brush_width, Brush_height);
- Wait_end_of_click();
- // Erase the message in status bar
- if ( (Config.Coords_rel) && (Menu_is_visible) )
- {
- Print_in_menu("X: Y: ",0);
- }
-}
-
-void Distort_brush_1_8(void)
-//
-// Opération : OPERATION_DISTORT_BRUSH
-// Click Souris: 1
-// Taille_Pile : 8
-//
-// Souris effacée: No
-//
-{
- // How far (in pixels) you can catch a handle
- #define REACH_DISTANCE 100
- short i;
- short x[4];
- short y[4];
- long best_distance=REACH_DISTANCE;
- short best_spot=-1;
-
- for (i=3;i>=0;i--)
- {
- long distance;
- Operation_pop(&y[i]);
- Operation_pop(&x[i]);
- distance=Distance(Paintbrush_X,Paintbrush_Y,x[i],y[i]);
- if (distance-1)
- {
- Operation_push(best_spot);
- }
- if ( (Config.Coords_rel) && (Menu_is_visible) )
- {
- Print_in_menu("X: Y: ",0);
- Print_coordinates();
- }
-}
-
-void Distort_brush_1_9(void)
-//
-// Opération : OPERATION_DISTORT_BRUSH
-// Click Souris: 1
-// Taille_Pile : 9
-//
-// Souris effacée: No
-//
-{
- short i;
- short x[4];
- short y[4];
- short selected_corner;
-
- // Pop all arguments
- Operation_pop(&selected_corner);
- for (i=3;i>=0;i--)
- {
- Operation_pop(&y[i]);
- Operation_pop(&x[i]);
- }
-
- if (Paintbrush_X!=x[selected_corner] || Paintbrush_Y!=y[selected_corner])
- {
- Hide_cursor();
-
- // Easiest refresh mode: make no assumptions on how the brush was
- // displayed before.
- Display_all_screen();
-
- x[selected_corner]=Paintbrush_X;
- y[selected_corner]=Paintbrush_Y;
-
- for (i=0;i<4;i++)
- Draw_stretch_spot(x[i],y[i]);
-
- Distort_brush_preview(x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3]);
-
- Display_cursor();
-
- if ( (Config.Coords_rel) && (Menu_is_visible) )
- {
- Print_in_menu("X: Y: ",0);
- Print_coordinates();
- }
- Update_rect(0,0,Screen_width,Menu_Y);
- }
-
- // Push back all arguments
- for (i=0;i<4;i++)
- {
- Operation_push(x[i]);
- Operation_push(y[i]);
- }
- Operation_push(selected_corner);
-
-}
-void Distort_brush_0_9(void)
-//
-// Opération : OPERATION_DISTORT_BRUSH
-// Click Souris: 0
-// Taille_Pile : 9
-//
-// Souris effacée: No
-//
-{
- short selected_corner;
- Operation_pop(&selected_corner);
-
-}
-
-void Distort_brush_2_0(void)
-//
-// Opération : OPERATION_DISTORT_BRUSH
-// Click Souris: 2
-// Taille_Pile : 0
-//
-// Souris effacée: Oui
-//
-{
- Paintbrush_hidden=0;
- Display_all_screen();
- // Erase the message in status bar
- if ( (Config.Coords_rel) && (Menu_is_visible) )
- {
- Print_in_menu("X: Y: ",0);
- }
- Return_to_draw_mode();
-}
-
-void Distort_brush_2_8(void)
-//
-// Opération : OPERATION_DISTORT_BRUSH
-// Click Souris: 2
-// Taille_Pile : 8
-//
-// Souris effacée: Oui
-//
-{
- short i;
- short x[4];
- short y[4];
-
- // Pop all arguments
- for (i=3;i>=0;i--)
- {
- Operation_pop(&y[i]);
- Operation_pop(&x[i]);
- }
- Distort_brush(x[0],y[0],x[1],y[1],x[2],y[2],x[3],y[3]);
-
- Paintbrush_hidden=0;
- Display_all_screen();
-
- Return_to_draw_mode();
-}
//////////////////////////////////////////////////////////// OPERATION_SCROLL
@@ -5244,4 +3995,3 @@ void Centered_lines_0_7(void)
Operation_push(Paintbrush_Y);
}
-
diff --git a/operatio.h b/operatio.h
index 97cdde15..a228c582 100644
--- a/operatio.h
+++ b/operatio.h
@@ -21,15 +21,21 @@
//////////////////////////////////////////////////////////////////////////////
///@file operatio.h
-/// Code for the operations, ie all drawing tools.
+/// Code for the drawing tools operations.
//////////////////////////////////////////////////////////////////////////////
+#include "struct.h"
+
+// General operation handling functions. These may be moved to ops_handler.h when operatio.c grows over 5000 lines again...
+
/// Do some housekeeping before starting work on a operation.
void Start_operation_stack(word new_operation);
/// Put a value on ::Operation_stack
void Operation_push(short value);
/// Take a value off ::Operation_stack
void Operation_pop(short * value);
+void Init_start_operation(void);
+short Distance(short x1, short y1, short x2, short y2);
//////////////////////////////////////////////////// OPERATION_CONTINUOUS_DRAW
void Freehand_mode1_1_0(void);