Started work on the gradiation rectangle.

The handling in the operation engine should work pretty well. I would like to do some changes, however (displaying the bottomright of the rectangle, and use XOR for the vector, for example)
Now, i have to do the real thing, the gradiation calculation and drawing. But let's see that tomorrow...


git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@299 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Adrien Destugues 2008-10-21 19:57:25 +00:00
parent 320eb547cd
commit dc9e10c054
9 changed files with 264 additions and 6 deletions

View File

@ -110,7 +110,7 @@ void Message_Non_disponible(void)
// ne sait pas lequel c'est, on les désenclenche tous. De toutes façons, ça
// ne sert à rien d'essayer d'optimiser ça puisque l'utilisateur ne devrait
// pas souvent l'appeler, et en plus y'en a pas beaucoup à désenclencher. ;)
Desenclencher_bouton(BOUTON_GRADRECT);
// Desenclencher_bouton(BOUTON_GRADRECT);
Desenclencher_bouton(BOUTON_TEXTE);
Afficher_curseur();
@ -2029,7 +2029,7 @@ void Bouton_Degrades(void)
}
// -- Gestion des boutons de cercle (ellipse) dégradé(e) --------------------
// -- Gestion des boutons de cercle / ellipse / rectangle dégradés --------------------
void Bouton_Cercle_degrade(void)
{
@ -2047,6 +2047,14 @@ void Bouton_Ellipse_degrade(void)
}
void Bouton_Rectangle_degrade(void)
{
Effacer_curseur();
Demarrer_pile_operation(OPERATION_RECTANGLE_DEGRADE);
Afficher_curseur();
}
// -- Gestion du bouton de remplissage ---------------------------------------
void Bouton_Fill(void)

View File

@ -64,9 +64,11 @@ void Bouton_Rectangle_plein(void);
// Boutons relatifs aux dégradés
void Bouton_Degrades(void);
void Degrade_Charger_infos_du_tableau(int Indice);
// Boutons relatifs aux cercles (ellipses) dégradé(e)s
void Bouton_Cercle_degrade(void);
void Bouton_Ellipse_degrade(void);
void Bouton_Rectangle_degrade(void);
// Boutons relatifs aux cercles (ellipses) plein(e)s et vides
void Bouton_Cercle_vide(void);

View File

@ -40,7 +40,7 @@
#define NB_BOUTONS 38 // Nombre de boutons à gérer
#define NB_TOUCHES 134 // Nombre de combinaisons de touches
#define NB_TOUCHES_SPECIALES 72 // Nombre de touches spéciales
#define NB_OPERATIONS 32 // Nombre d'opérations gérées par le moteur
#define NB_OPERATIONS 33 // Nombre d'opérations gérées par le moteur
#define NB_FACTEURS_DE_ZOOM 12 // Nombre de facteurs de zoom
#define LARGEUR_MENU 254 // Largeur du menu en taille réelle
#define HAUTEUR_MENU 44 // Hauteur du menu en taille réelle
@ -392,6 +392,7 @@ enum OPERATIONS
OPERATION_TOURNER_BROSSE, // Faire tourner brosse
OPERATION_ETIRER_BROSSE, // Etirer brosse
OPERATION_DEFORMER_BROSSE, // Deformer brosse
OPERATION_RECTANGLE_DEGRADE, // Rectangle dégradé
OPERATION_AUCUNE
};

BIN
gfx2.cfg

Binary file not shown.

View File

@ -594,7 +594,8 @@ GLOBAL short Pipette_Y;
FORME_CURSEUR_CIBLE , // Ellipses dégradées
FORME_CURSEUR_ROTATE_XOR , // Faire tourner brosse
FORME_CURSEUR_CIBLE_XOR , // Etirer brosse
FORME_CURSEUR_CIBLE // Deformer brosse
FORME_CURSEUR_CIBLE , // Deformer brosse
FORME_CURSEUR_CIBLE_XOR , // Rectangle degrade
};
#else
extern byte CURSEUR_D_OPERATION[NB_OPERATIONS];

13
init.c
View File

@ -669,9 +669,9 @@ void Initialisation_des_boutons(void)
85,1,
15,15,
FORME_BOUTON_TRIANGLE_HAUT_GAUCHE,
Message_Non_disponible,Message_Non_disponible,
Bouton_Rectangle_degrade,Bouton_Rectangle_degrade,
Rien_du_tout,
FAMILLE_INSTANTANE);
FAMILLE_OUTIL);
/*
Initialiser_bouton(BOUTON_GRADRECT,
85,1,
@ -1259,6 +1259,15 @@ void Initialisation_des_operations(void)
Initialiser_operation(OPERATION_ELLIPSE_DEGRADEE,2,8,
Ellipse_degradee_12_8,1);
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,1,0,Rectangle_Degrade_12_0,0);
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,1,5,Rectangle_Degrade_12_5,0);
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,0,5,Rectangle_Degrade_0_5,1);
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,0,7,Rectangle_Degrade_0_7,0);
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,1,7,Rectangle_Degrade_12_7,1);
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,1,9,Rectangle_Degrade_12_9,0);
Initialiser_operation(OPERATION_RECTANGLE_DEGRADE,0,9,Rectangle_Degrade_0_9,1);
Initialiser_operation(OPERATION_LIGNES_CENTREES,1,0,
Lignes_centrees_12_0,1);
Initialiser_operation(OPERATION_LIGNES_CENTREES,2,0,

View File

@ -4139,7 +4139,231 @@ void Ellipse_degradee_12_8(void)
}
}
/******************************
* Operation_Rectangle_Degrade *
******************************/
// 1) tracé d'un rectangle classique avec les lignes XOR
// 2) tracé d'une ligne vecteur de dégradé, comme une ligne normale
// 3) dessin du dégradé
void Rectangle_Degrade_12_0(void)
// Opération : OPERATION_RECTANGLE_DEGRADE
// Click Souris: 1 ou 2
// Taille_Pile : 0
//
// Souris effacée: Oui
// Initialisation de l'étape 1, on commence à dessiner le rectangle
{
Initialiser_debut_operation();
if ((Config.Coords_rel) && (Menu_visible))
Print_dans_menu("\035: 1 \022: 1",0);
// On laisse une trace du curseur à l'écran
Afficher_curseur();
if (Mouse_K==A_GAUCHE)
{
Shade_Table=Shade_Table_gauche;
Operation_PUSH(Fore_color);
}
else
{
Shade_Table=Shade_Table_droite;
Operation_PUSH(Back_color);
}
Operation_PUSH(Pinceau_X);
Operation_PUSH(Pinceau_Y);
Operation_PUSH(Pinceau_X);
Operation_PUSH(Pinceau_Y);
DEBUG("12 ",0);
}
void Rectangle_Degrade_12_5(void)
// Opération : OPERATION_RECTANGLE_DEGRADE
// Click Souris: 1 ou 2
// Taille_Pile : 5
//
// Souris effacée: Non
// Modification de la taille du rectangle
{
short Debut_X;
short Debut_Y;
short Ancien_X;
short Ancien_Y;
char Chaine[5];
Operation_POP(&Ancien_Y);
Operation_POP(&Ancien_X);
if ((Pinceau_X!=Ancien_X) || (Pinceau_Y!=Ancien_Y))
{
Operation_POP(&Debut_Y);
Operation_POP(&Debut_X);
if ((Config.Coords_rel) && (Menu_visible))
{
Num2str(((Debut_X<Pinceau_X)?Pinceau_X-Debut_X:Debut_X-Pinceau_X)+1,Chaine,4);
Print_dans_menu(Chaine,2);
Num2str(((Debut_Y<Pinceau_Y)?Pinceau_Y-Debut_Y:Debut_Y-Pinceau_Y)+1,Chaine,4);
Print_dans_menu(Chaine,11);
}
else
Print_coordonnees();
Operation_PUSH(Debut_X);
Operation_PUSH(Debut_Y);
}
Operation_PUSH(Pinceau_X);
Operation_PUSH(Pinceau_Y);
DEBUG("12 ",5);
}
void Rectangle_Degrade_0_5(void)
// OPERATION_RECTANGLE_DEGRADE
// Clic souris 0
// Taile pile : 5
//
// Souris effacée : non
// Le rectangle est en place, maintenant il faut tracer le vecteur de dégradé,
// on doit donc attendre que l'utilisateur clique quelque part
// On stocke tout de suite les coordonnées du pinceau comme ça on change d'état et on passe à la suite
{
DEBUG("0 ",5);
Forme_curseur = FORME_CURSEUR_CIBLE;
Operation_PUSH(Pinceau_X);
Operation_PUSH(Pinceau_Y);
}
void Rectangle_Degrade_0_7(void)
// OPERATION_RECTANGLE_DEGRADE
// Clic souris 0
// Taile pile : 5
//
// Souris effacée : non
// On continue à attendre que l'utilisateur clique en gardant les coords à jour
{
Operation_Taille_pile -= 2;
Print_coordonnees();
Operation_PUSH(Pinceau_X);
Operation_PUSH(Pinceau_Y);
DEBUG("0 ",7);
}
void Rectangle_Degrade_12_7(void)
// Opération : OPERATION_RECTANGLE_DEGRADE
// Click Souris: 1 ou 2
// Taille_Pile : 7
//
// Souris effacée: Oui
// Début du tracé du vecteur (premier clic)
// On garde les anciennes coordonnées dans la pile, et on ajoute les nouvelles par dessus
{
Operation_PUSH(Pinceau_X);
Operation_PUSH(Pinceau_Y);
DEBUG("12 ",7);
}
void Rectangle_Degrade_12_9(void)
// Opération : OPERATION_RECTANGLE_DEGRADE
// Click Souris: 1
// Taille_Pile : 5
//
// Souris effacée: Non
// Poursuite du tracé du vecteur (déplacement de la souris en gardant le curseur appuyé)
{
short Debut_X;
short Debut_Y;
short Fin_X;
short Fin_Y;
Operation_POP(&Fin_Y);
Operation_POP(&Fin_X);
DEBUG("12 ",9);
if ((Pinceau_X!=Fin_X) || (Pinceau_Y!=Fin_Y))
{
Effacer_curseur();
Operation_POP(&Debut_Y);
Operation_POP(&Debut_X);
// On corrige les coordonnées de la ligne si la touche shift est appuyée...
if(SDL_GetModState() & KMOD_SHIFT)
Rectifier_coordonnees_a_45_degres(Debut_X,Debut_Y,&Pinceau_X,&Pinceau_Y);
Aff_coords_rel_ou_abs(Debut_X,Debut_Y);
Effacer_ligne_Preview(Debut_X,Debut_Y,Fin_X,Fin_Y);
if (Mouse_K==A_GAUCHE)
{
Tracer_ligne_Preview (Debut_X,Debut_Y,Pinceau_X,Pinceau_Y,Fore_color);
}
else
{
Tracer_ligne_Preview (Debut_X,Debut_Y,Pinceau_X,Pinceau_Y,Back_color);
}
Operation_PUSH(Debut_X);
Operation_PUSH(Debut_Y);
Afficher_curseur();
}
Operation_PUSH(Pinceau_X);
Operation_PUSH(Pinceau_Y);
}
void Rectangle_Degrade_0_9(void)
// Opération : OPERATION_RECTANGLE_DEGRADE
// Click Souris: 1 ou 2
// Taille_Pile : 0
//
// Souris effacée: Oui
// Ouf, fini ! on dessine enfin le rectangle avec son dégradé
{
short Rect_Debut_X;
short Rect_Debut_Y;
short Rect_Fin_X;
short Rect_Fin_Y;
short Vecteur_Debut_X;
short Vecteur_Debut_Y;
short Vecteur_Fin_X;
short Vecteur_Fin_Y;
DEBUG("FINISH ",9);
Operation_POP(&Vecteur_Fin_Y);
Operation_POP(&Vecteur_Fin_X);
Operation_POP(&Vecteur_Debut_Y);
Operation_POP(&Vecteur_Debut_X);
Operation_POP(&Rect_Fin_Y);
Operation_POP(&Rect_Fin_X);
Operation_POP(&Rect_Debut_Y);
Operation_POP(&Rect_Debut_X);
Operation_Taille_pile --;
// Maintenant on efface tout le bazar temporaire : rectangle et ligne XOR
Effacer_ligne_Preview(Vecteur_Debut_X,Vecteur_Debut_Y,Vecteur_Fin_X,Vecteur_Fin_Y);
Effacer_curseur();
Forme_curseur = FORME_CURSEUR_CIBLE_XOR; // Ceci nous permet d'effacer correctement le curseur
// On remet le pinceau en haut à droite du rectangle pour effacer le curseur qui y traine
Pinceau_X = Rect_Debut_X;
Pinceau_Y = Rect_Debut_Y;
Effacer_curseur();
// Et enfin on trace le rectangle avec le dégradé dedans !
}
/////////////////////////////////////////////////// OPERATION_LIGNES_CENTREES

View File

@ -181,6 +181,16 @@ void Ellipse_degradee_12_6(void);
void Ellipse_degradee_0_6(void);
void Ellipse_degradee_12_8(void);
///////////////////////////////////////////////// OPERATION_RECTANGLE_DEGRADE
void Rectangle_Degrade_12_0(void);
void Rectangle_Degrade_12_5(void);
void Rectangle_Degrade_0_5(void);
void Rectangle_Degrade_0_7(void);
void Rectangle_Degrade_12_7(void);
void Rectangle_Degrade_12_9(void);
void Rectangle_Degrade_0_9(void);
/////////////////////////////////////////////////// OPERATION_LIGNES_CENTREES
void Lignes_centrees_12_0(void);

View File

@ -571,6 +571,9 @@ static const char * TableAideLignes[] =
AIDE_TEXTE("line. Maintain your click to choose the end")
AIDE_TEXTE("of the line and release the mouse button to")
AIDE_TEXTE("set it.")
AIDE_TEXTE("If you hold SHIFT when drawing, the line")
AIDE_TEXTE("will be constrained to horizonal, vertical")
AIDE_TEXTE("or diagonal.")
AIDE_TEXTE("")
AIDE_TEXTE("* Knotted lines: works like classical lines,")
AIDE_TEXTE("but the end of your line will automatically")