1105 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1105 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*  Grafx2 - The Ultimate 256-color bitmap paint program
 | 
						||
 | 
						||
    Copyright 2007 Adrien Destugues
 | 
						||
    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 <http://www.gnu.org/licenses/> or
 | 
						||
    write to the Free Software Foundation, Inc.,
 | 
						||
    59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 | 
						||
*/
 | 
						||
#include <string.h>
 | 
						||
#include <stdlib.h>
 | 
						||
#include "global.h"
 | 
						||
#include "graph.h"
 | 
						||
#include "moteur.h"
 | 
						||
#include "divers.h"
 | 
						||
#include "readline.h"
 | 
						||
#include "aide.h"
 | 
						||
#include "sdlscreen.h"
 | 
						||
 | 
						||
void Bouton_Shade_Mode(void)
 | 
						||
{
 | 
						||
  if (Shade_Mode)
 | 
						||
    Fonction_effet=Aucun_effet;
 | 
						||
  else
 | 
						||
  {
 | 
						||
    Fonction_effet=Effet_Shade;
 | 
						||
    Quick_shade_Mode=0;
 | 
						||
    Colorize_Mode=0;
 | 
						||
    Smooth_Mode=0;
 | 
						||
    Tiling_Mode=0;
 | 
						||
    Smear_Mode=0;
 | 
						||
  }
 | 
						||
  Shade_Mode=!Shade_Mode;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
void Bouton_Quick_shade_Mode(void)
 | 
						||
{
 | 
						||
  if (Quick_shade_Mode)
 | 
						||
    Fonction_effet=Aucun_effet;
 | 
						||
  else
 | 
						||
  {
 | 
						||
    Fonction_effet=Effet_Quick_shade;
 | 
						||
    Shade_Mode=0;
 | 
						||
    Colorize_Mode=0;
 | 
						||
    Smooth_Mode=0;
 | 
						||
    Tiling_Mode=0;
 | 
						||
    Smear_Mode=0;
 | 
						||
  }
 | 
						||
  Quick_shade_Mode=!Quick_shade_Mode;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
void Shade_Blocs_degrades(void)
 | 
						||
{
 | 
						||
  word  Curseur=0;
 | 
						||
  word  Nb_shades=0;
 | 
						||
  short Shade_traite,Ancien_shade_traite;
 | 
						||
  word  Taille_shade=0;
 | 
						||
  word  Debut_shade=0;
 | 
						||
  short Pos_X,Pos_Y;
 | 
						||
  short Taille_X,Taille_Y;
 | 
						||
  short Debut_X,Debut_Y,Fin_X,Fin_Y;
 | 
						||
 | 
						||
  // On commence par compter le nombre de shades
 | 
						||
  while (Curseur<512)
 | 
						||
  {
 | 
						||
    while ((Curseur<512) && (Shade_Liste[Shade_Actuel].Liste[Curseur]&0xFF00))
 | 
						||
      Curseur++;
 | 
						||
 | 
						||
    if (Curseur<512)
 | 
						||
    {
 | 
						||
      Nb_shades++;
 | 
						||
      while ( (Curseur<512)
 | 
						||
         && (!(Shade_Liste[Shade_Actuel].Liste[Curseur]&0xFF00)) )
 | 
						||
        Curseur++;
 | 
						||
    }
 | 
						||
  }
 | 
						||
 | 
						||
  // Maintenant qu'on sait combien il y en a, on les affiche:
 | 
						||
  if (Nb_shades)
 | 
						||
  {
 | 
						||
    Taille_X=Menu_Facteur_X<<6;
 | 
						||
    Taille_Y=Menu_Facteur_Y*48;
 | 
						||
    Debut_X=Fenetre_Pos_X+(Menu_Facteur_X*224);
 | 
						||
    Debut_Y=Fenetre_Pos_Y+(Menu_Facteur_Y*35);
 | 
						||
    Fin_X=Debut_X+Taille_X;
 | 
						||
    Fin_Y=Debut_Y+Taille_Y;
 | 
						||
 | 
						||
    Curseur=0;
 | 
						||
    Ancien_shade_traite=-1;
 | 
						||
 | 
						||
    for (Pos_Y=Debut_Y;Pos_Y<Fin_Y;Pos_Y++)
 | 
						||
    {
 | 
						||
      // On regarde quel shade on va afficher en preview
 | 
						||
      Shade_traite=((Pos_Y-Debut_Y)*Nb_shades)/Taille_Y;
 | 
						||
      // Si ce n'est pas le shade pr<70>c<EFBFBD>demment trait<69> on calcule ses infos
 | 
						||
      if (Shade_traite>Ancien_shade_traite)
 | 
						||
      {
 | 
						||
        // On commence par sauter tous les vides jusqu'au prochain shade
 | 
						||
        while ((Curseur<512) && (Shade_Liste[Shade_Actuel].Liste[Curseur]&0xFF00))
 | 
						||
          Curseur++;
 | 
						||
        Debut_shade=Curseur;
 | 
						||
        // puis regarde sa taille
 | 
						||
        while ((Curseur<512) && (!(Shade_Liste[Shade_Actuel].Liste[Curseur]&0xFF00)))
 | 
						||
          Curseur++;
 | 
						||
        Taille_shade=Curseur-Debut_shade;
 | 
						||
        Ancien_shade_traite=Shade_traite;
 | 
						||
      }
 | 
						||
 | 
						||
      for (Pos_X=Debut_X;Pos_X<Fin_X;Pos_X++)
 | 
						||
      {
 | 
						||
        Pixel(Pos_X,Pos_Y,Shade_Liste[Shade_Actuel].Liste
 | 
						||
              [(((Pos_X-Debut_X)*Taille_shade)/Taille_X)+Debut_shade]);
 | 
						||
      }
 | 
						||
    }
 | 
						||
  }
 | 
						||
  else
 | 
						||
  {
 | 
						||
    Fenetre_Afficher_cadre_bombe(224,35,64,48);
 | 
						||
    Block(Fenetre_Pos_X+(Menu_Facteur_X*225),Fenetre_Pos_Y+(Menu_Facteur_Y*36),
 | 
						||
          Menu_Facteur_X*62,Menu_Facteur_Y*46,CM_Clair);
 | 
						||
  }
 | 
						||
  UpdateRect(Fenetre_Pos_X+(Menu_Facteur_X*224),Fenetre_Pos_Y+(Menu_Facteur_Y*35),Menu_Facteur_X*64,Menu_Facteur_Y*48);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
void Tagger_shades(word Select_Debut,word Select_Fin)
 | 
						||
{
 | 
						||
  word Ligne, Colonne;
 | 
						||
  word Position;
 | 
						||
  word Pos_X, Pos_Y;
 | 
						||
 | 
						||
 | 
						||
  if (Select_Fin<Select_Debut)
 | 
						||
  {
 | 
						||
    Position    =Select_Fin;
 | 
						||
    Select_Fin  =Select_Debut;
 | 
						||
    Select_Debut=Position;
 | 
						||
  }
 | 
						||
 | 
						||
  for (Ligne=0; Ligne<8; Ligne++)
 | 
						||
    for (Colonne=0; Colonne<64; Colonne++)
 | 
						||
    {
 | 
						||
      Position=(Ligne<<6)+Colonne;
 | 
						||
      Pos_X=Fenetre_Pos_X+(Menu_Facteur_X*((Colonne<<2)+8));
 | 
						||
      Pos_Y=Fenetre_Pos_Y+(Menu_Facteur_Y*((Ligne*7)+131));
 | 
						||
 | 
						||
      // On regarde si la case est "disabl<62>e"
 | 
						||
      if (Shade_Liste[Shade_Actuel].Liste[Position]&0x8000)
 | 
						||
      {
 | 
						||
        if ((Position>=Select_Debut) && (Position<=Select_Fin))
 | 
						||
        {
 | 
						||
          Block(Pos_X,Pos_Y,Menu_Facteur_X<<2,Menu_Facteur_Y,CM_Blanc);
 | 
						||
          Block(Pos_X,Pos_Y+Menu_Facteur_Y,Menu_Facteur_X<<2,Menu_Facteur_Y,CM_Noir);
 | 
						||
        }
 | 
						||
        else
 | 
						||
          Block(Pos_X,Pos_Y,Menu_Facteur_X<<2,Menu_Facteur_Y<<1,CM_Blanc);
 | 
						||
      }
 | 
						||
      else // "enabl<62>e"
 | 
						||
      {
 | 
						||
        if ((Position>=Select_Debut) && (Position<=Select_Fin))
 | 
						||
          Block(Pos_X,Pos_Y,Menu_Facteur_X<<2,Menu_Facteur_Y<<1,CM_Noir);
 | 
						||
        else
 | 
						||
          Block(Pos_X,Pos_Y,Menu_Facteur_X<<2,Menu_Facteur_Y<<1,CM_Clair);
 | 
						||
      }
 | 
						||
    }
 | 
						||
    UpdateRect(Fenetre_Pos_X+8*Menu_Facteur_X,Fenetre_Pos_Y+131*Menu_Facteur_Y,Menu_Facteur_X*64<<2,Menu_Facteur_Y*8<<3);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
void Afficher_couleur_case_selectionnee(word Select_Debut,word Select_Fin)
 | 
						||
{
 | 
						||
  char Chaine[4];
 | 
						||
 | 
						||
  if ((Select_Debut!=Select_Fin)
 | 
						||
   || (Shade_Liste[Shade_Actuel].Liste[Select_Debut]&0x0100))
 | 
						||
    strcpy(Chaine,"   ");
 | 
						||
  else
 | 
						||
    Num2str(Shade_Liste[Shade_Actuel].Liste[Select_Debut]&0xFF,Chaine,3);
 | 
						||
 | 
						||
  Print_dans_fenetre(213,115,Chaine,CM_Noir,CM_Clair);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
void Afficher_couleur_selectionnee(word Select_Debut,word Select_Fin)
 | 
						||
{
 | 
						||
  char Chaine[4];
 | 
						||
 | 
						||
  if (Select_Debut!=Select_Fin)
 | 
						||
    strcpy(Chaine,"   ");
 | 
						||
  else
 | 
						||
    Num2str(Select_Debut,Chaine,3);
 | 
						||
 | 
						||
  Print_dans_fenetre(213,106,Chaine,CM_Noir,CM_Clair);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
void Afficher_mode_du_shade(short X,short Y,byte Mode)
 | 
						||
{
 | 
						||
  char Chaine[7];
 | 
						||
 | 
						||
  switch (Mode)
 | 
						||
  {
 | 
						||
    case MODE_SHADE_NORMAL :
 | 
						||
      strcpy(Chaine,"Normal");
 | 
						||
      break;
 | 
						||
    case MODE_SHADE_BOUCLE :
 | 
						||
      strcpy(Chaine," Loop ");
 | 
						||
      break;
 | 
						||
    default : // MODE_SHADE_NOSAT
 | 
						||
      strcpy(Chaine,"No sat");
 | 
						||
  }
 | 
						||
  Print_dans_fenetre(X,Y,Chaine,CM_Noir,CM_Clair);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
void Afficher_tout_le_shade(word Select_Debut1,word Select_Fin1,
 | 
						||
                            word Select_Debut2,word Select_Fin2)
 | 
						||
{
 | 
						||
  word Ligne, Colonne;
 | 
						||
  word Position;
 | 
						||
 | 
						||
  for (Ligne=0; Ligne<8; Ligne++)
 | 
						||
    for (Colonne=0; Colonne<64; Colonne++)
 | 
						||
    {
 | 
						||
      Position=(Ligne<<6)+Colonne;
 | 
						||
      // On regarde si c'est une couleur ou un bloc vide
 | 
						||
      if (Shade_Liste[Shade_Actuel].Liste[Position]&0x0100) // Vide
 | 
						||
      {
 | 
						||
        Fenetre_Afficher_cadre_bombe((Colonne<<2)+8,(Ligne*7)+127,4,4);
 | 
						||
        Block(Fenetre_Pos_X+(Menu_Facteur_X*((Colonne<<2)+9)),
 | 
						||
              Fenetre_Pos_Y+(Menu_Facteur_Y*((Ligne*7)+128)),
 | 
						||
              Menu_Facteur_X<<1,Menu_Facteur_Y<<1,CM_Clair);
 | 
						||
      }
 | 
						||
      else // Couleur
 | 
						||
        Block(Fenetre_Pos_X+(Menu_Facteur_X*((Colonne<<2)+8)),
 | 
						||
              Fenetre_Pos_Y+(Menu_Facteur_Y*((Ligne*7)+127)),
 | 
						||
              Menu_Facteur_X<<2,Menu_Facteur_Y<<2,
 | 
						||
              Shade_Liste[Shade_Actuel].Liste[Position]&0xFF);
 | 
						||
    }
 | 
						||
  UpdateRect(Fenetre_Pos_X+7*Menu_Facteur_X,Fenetre_Pos_Y+126*Menu_Facteur_Y,Menu_Facteur_X*((64<<2)+2),Menu_Facteur_Y*((8<<2)+2));
 | 
						||
  Tagger_shades(Select_Debut2,Select_Fin2);
 | 
						||
  Shade_Blocs_degrades();
 | 
						||
  Afficher_couleur_case_selectionnee(Select_Debut2,Select_Fin2);
 | 
						||
  Afficher_couleur_selectionnee(Select_Debut1,Select_Fin1);
 | 
						||
  Afficher_mode_du_shade(250,110,Shade_Liste[Shade_Actuel].Mode);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
void Supprimer_shade(word Select_Debut,word Select_Fin)
 | 
						||
{
 | 
						||
  word Temp;
 | 
						||
 | 
						||
  if (Select_Fin<Select_Debut)
 | 
						||
  {
 | 
						||
    Temp        =Select_Fin;
 | 
						||
    Select_Fin  =Select_Debut;
 | 
						||
    Select_Debut=Temp;
 | 
						||
  }
 | 
						||
 | 
						||
  for (Select_Fin++;Select_Fin<512;Select_Debut++,Select_Fin++)
 | 
						||
    Shade_Liste[Shade_Actuel].Liste[Select_Debut]=Shade_Liste[Shade_Actuel].Liste[Select_Fin];
 | 
						||
 | 
						||
  for (;Select_Debut<512;Select_Debut++)
 | 
						||
    Shade_Liste[Shade_Actuel].Liste[Select_Debut]=0x0100;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
void Inserer_shade(byte Premiere_couleur, byte Derniere_couleur, word Select_Debut)
 | 
						||
{
 | 
						||
  word Curseur,Limite;
 | 
						||
  word Temp;
 | 
						||
 | 
						||
  if (Derniere_couleur<Premiere_couleur)
 | 
						||
  {
 | 
						||
    Temp            =Derniere_couleur;
 | 
						||
    Derniere_couleur=Premiere_couleur;
 | 
						||
    Premiere_couleur=Temp;
 | 
						||
  }
 | 
						||
 | 
						||
  // Avant d'ins<6E>rer quoi que ce soit, on efface les <20>ventuelles couleurs que
 | 
						||
  // l'on va r<>ins<6E>rer:
 | 
						||
  Limite=512-Select_Debut;
 | 
						||
  for (Curseur=0; Curseur<512; Curseur++)
 | 
						||
  {
 | 
						||
    if (!(Shade_Liste[Shade_Actuel].Liste[Curseur]&0x0100))
 | 
						||
      for (Temp=Premiere_couleur; Temp<=Derniere_couleur; Temp++)
 | 
						||
        if ( (Temp-Premiere_couleur<Limite)
 | 
						||
          && ((Shade_Liste[Shade_Actuel].Liste[Curseur]&0xFF)==Temp) )
 | 
						||
          Shade_Liste[Shade_Actuel].Liste[Curseur]=(Shade_Liste[Shade_Actuel].Liste[Curseur]&0x8000)|0x0100;
 | 
						||
  }
 | 
						||
  // Voil<69>... Maintenant on peut y aller peinard.
 | 
						||
 | 
						||
  Temp=1+Derniere_couleur-Premiere_couleur;
 | 
						||
  Limite=Select_Debut+Temp;
 | 
						||
  if (Limite>=512)
 | 
						||
    Temp=512-Select_Debut;
 | 
						||
 | 
						||
  for (Curseur=511;Curseur>=Limite;Curseur--)
 | 
						||
    Shade_Liste[Shade_Actuel].Liste[Curseur]=Shade_Liste[Shade_Actuel].Liste[Curseur-Temp];
 | 
						||
 | 
						||
  for (Curseur=Select_Debut+Temp;Select_Debut<Curseur;Select_Debut++,Premiere_couleur++)
 | 
						||
    Shade_Liste[Shade_Actuel].Liste[Select_Debut]=Premiere_couleur;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
void Inserer_case_vide_dans_shade(word Position)
 | 
						||
{
 | 
						||
  word Curseur;
 | 
						||
 | 
						||
  if (Position>=512) return;
 | 
						||
 | 
						||
  for (Curseur=511;Curseur>Position;Curseur--)
 | 
						||
    Shade_Liste[Shade_Actuel].Liste[Curseur]=Shade_Liste[Shade_Actuel].Liste[Curseur-1];
 | 
						||
 | 
						||
  Shade_Liste[Shade_Actuel].Liste[Position]=0x0100;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
short Attendre_click_dans_shade()
 | 
						||
{
 | 
						||
  short Case_choisie=-1;
 | 
						||
  byte  Ancien_Cacher_curseur;
 | 
						||
 | 
						||
 | 
						||
  Effacer_curseur();
 | 
						||
  Ancien_Cacher_curseur=Cacher_curseur;
 | 
						||
  Cacher_curseur=0;
 | 
						||
  Forme_curseur=FORME_CURSEUR_CIBLE;
 | 
						||
  Afficher_curseur();
 | 
						||
 | 
						||
  while (Case_choisie<0)
 | 
						||
  {
 | 
						||
    Get_input();
 | 
						||
 | 
						||
    if ( (Mouse_K==A_GAUCHE)
 | 
						||
      && ( ( (Fenetre_click_dans_zone(8,127,263,179)) && (((((Mouse_Y-Fenetre_Pos_Y)/Menu_Facteur_Y)-127)%7)<4) )
 | 
						||
           || ( (Mouse_X<Fenetre_Pos_X) || (Mouse_Y<Fenetre_Pos_Y)
 | 
						||
             || (Mouse_X>=Fenetre_Pos_X+(Fenetre_Largeur*Menu_Facteur_X))
 | 
						||
             || (Mouse_Y>=Fenetre_Pos_Y+(Fenetre_Hauteur*Menu_Facteur_Y)) ) )
 | 
						||
       )
 | 
						||
      Case_choisie=(((((Mouse_Y-Fenetre_Pos_Y)/Menu_Facteur_Y)-127)/7)<<6)+
 | 
						||
                    ((((Mouse_X-Fenetre_Pos_X)/Menu_Facteur_X)-8 )>>2);
 | 
						||
 | 
						||
    if ((Mouse_K==A_DROITE) || (Touche==SDLK_ESCAPE))
 | 
						||
      Case_choisie=512; // valeur indiquant que l'on n'a rien choisi
 | 
						||
  }
 | 
						||
 | 
						||
  Attendre_fin_de_click();
 | 
						||
  Effacer_curseur();
 | 
						||
  Forme_curseur=FORME_CURSEUR_FLECHE;
 | 
						||
  Cacher_curseur=Ancien_Cacher_curseur;
 | 
						||
  Afficher_curseur();
 | 
						||
  return Case_choisie;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
void Swap_shade(short Debut_Bloc_1,short Debut_Bloc_2,short Taille_du_bloc)
 | 
						||
{
 | 
						||
  short  Pos_1;
 | 
						||
  short  Pos_2;
 | 
						||
  short  Fin_1;
 | 
						||
  short  Fin_2;
 | 
						||
  word   Temp;
 | 
						||
  word * Shade_temporaire;
 | 
						||
 | 
						||
  // On fait une copie de la liste
 | 
						||
  Shade_temporaire=(word *)malloc(512*sizeof(word));
 | 
						||
  memcpy(Shade_temporaire,Shade_Liste[Shade_Actuel].Liste,512*sizeof(word));
 | 
						||
 | 
						||
  // On calcul les derni<6E>res couleurs de chaque bloc.
 | 
						||
  Fin_1=Debut_Bloc_1+Taille_du_bloc-1;
 | 
						||
  Fin_2=Debut_Bloc_2+Taille_du_bloc-1;
 | 
						||
 | 
						||
  if ((Debut_Bloc_2>=Debut_Bloc_1) && (Debut_Bloc_2<=Fin_1))
 | 
						||
  {
 | 
						||
    // Le bloc destination commence dans le bloc source.
 | 
						||
    for (Pos_1=Debut_Bloc_1,Pos_2=Fin_1+1;Pos_1<=Fin_2;Pos_1++)
 | 
						||
    {
 | 
						||
      // Il faut transformer la case Pos_1 en Pos_2:
 | 
						||
      Shade_Liste[Shade_Actuel].Liste[Pos_1]=Shade_temporaire[Pos_2];
 | 
						||
      // On g<>re la mise <20> jour de Pos_2
 | 
						||
      if (Pos_2==Fin_2)
 | 
						||
        Pos_2=Debut_Bloc_1;
 | 
						||
      else
 | 
						||
        Pos_2++;
 | 
						||
    }
 | 
						||
  }
 | 
						||
  else
 | 
						||
  if ((Debut_Bloc_2<Debut_Bloc_1) && (Fin_2>=Debut_Bloc_1))
 | 
						||
  {
 | 
						||
    // Le bloc destination d<>borde dans le bloc source.
 | 
						||
    for (Pos_1=Debut_Bloc_2,Pos_2=Debut_Bloc_1;Pos_1<=Fin_1;Pos_1++)
 | 
						||
    {
 | 
						||
      // Il faut transformer la couleur Pos_1 en Pos_2:
 | 
						||
      Shade_Liste[Shade_Actuel].Liste[Pos_1]=Shade_temporaire[Pos_2];
 | 
						||
      // On g<>re la mise <20> jour de Pos_2
 | 
						||
      if (Pos_2==Fin_1)
 | 
						||
        Pos_2=Debut_Bloc_2;
 | 
						||
      else
 | 
						||
        Pos_2++;
 | 
						||
    }
 | 
						||
  }
 | 
						||
  else
 | 
						||
  {
 | 
						||
    // Le bloc source et le bloc destination sont distincts.
 | 
						||
    for (Pos_1=Debut_Bloc_1,Pos_2=Debut_Bloc_2;Pos_1<=Fin_1;Pos_1++,Pos_2++)
 | 
						||
    {
 | 
						||
      // On <20>change les cases
 | 
						||
      Temp                                  =Shade_Liste[Shade_Actuel].Liste[Pos_1];
 | 
						||
      Shade_Liste[Shade_Actuel].Liste[Pos_1]=Shade_Liste[Shade_Actuel].Liste[Pos_2];
 | 
						||
      Shade_Liste[Shade_Actuel].Liste[Pos_2]=Temp;
 | 
						||
    }
 | 
						||
  }
 | 
						||
 | 
						||
  free(Shade_temporaire);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
int Menu_Shade(void)
 | 
						||
{
 | 
						||
  short Bouton_clicke;  // Num<75>ro du bouton sur lequel l'utilisateur a click<63>
 | 
						||
  char Chaine[4];        // Chaine d'affichage du n<> de shade actif et du Pas
 | 
						||
  word Ancien_Mouse_X,Ancien_Mouse_X2; // M<>mo. de l'ancienne pos. du curseur
 | 
						||
  word Ancien_Mouse_Y,Ancien_Mouse_Y2;
 | 
						||
  byte Ancien_Mouse_K,Ancien_Mouse_K2;
 | 
						||
  byte Couleur_temporaire; // Variables de gestion des clicks dans la palette
 | 
						||
  byte Premiere_couleur=0;
 | 
						||
  byte Derniere_couleur=0;
 | 
						||
  word Select_Debut=0;
 | 
						||
  word Select_Fin=0;
 | 
						||
  struct Fenetre_Bouton_special * Bouton_saisie;
 | 
						||
  short Temp,Temp2;
 | 
						||
  word Case_temporaire;
 | 
						||
  word * Buffer;       // Buffer du Copy/Paste
 | 
						||
  word * Buffer_Undo;  // Buffer du Undo
 | 
						||
  word * Pointeur_temp;
 | 
						||
  byte Couleur;
 | 
						||
  byte Click;
 | 
						||
 | 
						||
 | 
						||
  Buffer       =(word *)malloc(512*sizeof(word));
 | 
						||
  Buffer_Undo  =(word *)malloc(512*sizeof(word));
 | 
						||
  Pointeur_temp=(word *)malloc(512*sizeof(word));
 | 
						||
 | 
						||
  // Ouverture de la fen<65>tre du menu
 | 
						||
  Ouvrir_fenetre(310,190,"Shade");
 | 
						||
 | 
						||
  // D<>claration & trac<61> du bouton de palette
 | 
						||
  Fenetre_Definir_bouton_palette(5,16);                             // 1
 | 
						||
 | 
						||
  // D<>claration & trac<61> du scroller de s<>lection du n<> de d<>grad<61>
 | 
						||
  Fenetre_Definir_bouton_scroller(192,17,84,8,1,Shade_Actuel);      // 2
 | 
						||
 | 
						||
  // D<>claration & trac<61> de la zone de d<>finition des d<>grad<61>s
 | 
						||
  Fenetre_Definir_bouton_special(8,127,256,53);                     // 3
 | 
						||
 | 
						||
  // D<>claration & trac<61> des boutons de sortie
 | 
						||
  Fenetre_Definir_bouton_normal(207,17,51,14,"Cancel",0,1,SDLK_ESCAPE);  // 4
 | 
						||
  Fenetre_Definir_bouton_normal(261,17,43,14,"OK"    ,0,1,SDLK_RETURN);  // 5
 | 
						||
 | 
						||
  // D<>claration & trac<61> des boutons de copie de shade
 | 
						||
  Fenetre_Definir_bouton_normal(206,87,27,14,"Cpy"   ,1,1,SDLK_c);  // 6
 | 
						||
  Fenetre_Definir_bouton_normal(234,87,43,14,"Paste" ,1,1,SDLK_p);  // 7
 | 
						||
 | 
						||
  // On tagge le bloc
 | 
						||
  Tagger_intervalle_palette(0,0);
 | 
						||
 | 
						||
  // Trac<61> d'un cadre creux autour du bloc d<>grad<61>
 | 
						||
  Fenetre_Afficher_cadre_creux(171,26,18,66);
 | 
						||
  Block(Fenetre_Pos_X+(Menu_Facteur_X*172),Fenetre_Pos_Y+(Menu_Facteur_Y*27),
 | 
						||
        Menu_Facteur_X<<4,Menu_Facteur_Y<<6,CM_Noir);
 | 
						||
  // Trac<61> d'un cadre creux autour de tous les d<>grad<61>s
 | 
						||
  Fenetre_Afficher_cadre_creux(223,34,66,50);
 | 
						||
  Shade_Blocs_degrades();
 | 
						||
  // Trac<61> d'un cadre autour de la zone de d<>finition de d<>grad<61>s
 | 
						||
  Fenetre_Afficher_cadre(5,124,262,61);
 | 
						||
  Afficher_tout_le_shade(Premiere_couleur,Derniere_couleur,Select_Debut,Select_Fin);
 | 
						||
 | 
						||
  // D<>claration & trac<61> des boutons d'<27>dition de shade
 | 
						||
  Fenetre_Definir_bouton_normal(  6,107,27,14,"Ins"  ,0,1,SDLK_INSERT);  // 8
 | 
						||
  Fenetre_Definir_bouton_normal( 38,107,27,14,"Del"  ,0,1,SDLK_DELETE);  // 9
 | 
						||
  Fenetre_Definir_bouton_normal( 66,107,43,14,"Blank",1,1,SDLK_b);  // 10
 | 
						||
  Fenetre_Definir_bouton_normal(110,107,27,14,"Inv"  ,1,1,SDLK_i);  // 11
 | 
						||
  Fenetre_Definir_bouton_normal(138,107,27,14,"Swp"  ,1,1,SDLK_s);  // 12
 | 
						||
 | 
						||
  // D<>claration & trac<61> des boutons de taggage
 | 
						||
  Print_dans_fenetre(268,123,"Disbl"/*"Dsabl"*/,CM_Fonce,CM_Clair);
 | 
						||
  Fenetre_Definir_bouton_normal(274,133,27,14,"Set"   ,0,1,SDLK_F1); // 13
 | 
						||
  Fenetre_Definir_bouton_normal(274,148,27,14,"Clr"   ,0,1,SDLK_F2); // 14
 | 
						||
 | 
						||
  // D<>claration & trac<61> de la zone de saisie du pas
 | 
						||
  Print_dans_fenetre(272,165,"Step",CM_Fonce,CM_Clair);
 | 
						||
  Fenetre_Definir_bouton_saisie(274,174,3);                         // 15
 | 
						||
  Bouton_saisie=Fenetre_Liste_boutons_special;
 | 
						||
  Num2str(Shade_Liste[Shade_Actuel].Pas,Chaine,3);
 | 
						||
  Fenetre_Contenu_bouton_saisie(Bouton_saisie,Chaine);
 | 
						||
 | 
						||
  // Bouton Undo
 | 
						||
  Fenetre_Definir_bouton_normal(170,107,35,14,"Undo",1,1,SDLK_u);   // 16
 | 
						||
  // Bouton Clear
 | 
						||
  Fenetre_Definir_bouton_normal(278,87,27,14,"Clr",0,1,SDLK_BACKSPACE);     // 17
 | 
						||
 | 
						||
  // Bouton Mode
 | 
						||
  Fenetre_Definir_bouton_normal(244,107,60,14,"",0,1,SDLK_TAB);       // 18
 | 
						||
 | 
						||
  // Affichage du n<> de shade actif
 | 
						||
  Num2str(Shade_Actuel+1,Chaine,1);
 | 
						||
  Print_dans_fenetre(210,55,Chaine,CM_Noir,CM_Clair);
 | 
						||
 | 
						||
  memcpy(Buffer     ,Shade_Liste[Shade_Actuel].Liste,512*sizeof(word));
 | 
						||
  memcpy(Buffer_Undo,Shade_Liste[Shade_Actuel].Liste,512*sizeof(word));
 | 
						||
 | 
						||
  UpdateRect(Fenetre_Pos_X,Fenetre_Pos_Y,Menu_Facteur_X*310,Menu_Facteur_Y*190);
 | 
						||
 | 
						||
  Afficher_curseur();
 | 
						||
 | 
						||
  do
 | 
						||
  {
 | 
						||
    Ancien_Mouse_X=Ancien_Mouse_X2=Mouse_X;
 | 
						||
    Ancien_Mouse_Y=Ancien_Mouse_Y2=Mouse_Y;
 | 
						||
    Ancien_Mouse_K=Ancien_Mouse_K2=Mouse_K;
 | 
						||
 | 
						||
    Bouton_clicke=Fenetre_Bouton_clicke();
 | 
						||
 | 
						||
    switch (Bouton_clicke)
 | 
						||
    {
 | 
						||
      case  0 :
 | 
						||
        break;
 | 
						||
      case -1 :
 | 
						||
      case  1 : // Gestion de la palette
 | 
						||
        if ( (Mouse_X!=Ancien_Mouse_X) || (Mouse_Y!=Ancien_Mouse_Y) || (Mouse_K!=Ancien_Mouse_K) )
 | 
						||
        {
 | 
						||
          Effacer_curseur();
 | 
						||
          Couleur_temporaire=Lit_pixel(Mouse_X,Mouse_Y);
 | 
						||
 | 
						||
          if (!Ancien_Mouse_K)
 | 
						||
          { // On vient de clicker
 | 
						||
 | 
						||
            // On met <20> jour l'intervalle du Shade
 | 
						||
            Premiere_couleur=Derniere_couleur=Couleur_temporaire;
 | 
						||
            // On tagge le bloc
 | 
						||
            Tagger_intervalle_palette(Premiere_couleur,Derniere_couleur);
 | 
						||
            // Trac<61> du bloc d<>grad<61>:
 | 
						||
            Bloc_degrade_dans_fenetre(172,27,Premiere_couleur,Derniere_couleur);
 | 
						||
          }
 | 
						||
          else
 | 
						||
          { // On maintient le click, on va donc tester si le curseur bouge
 | 
						||
            if (Couleur_temporaire!=Derniere_couleur)
 | 
						||
            {
 | 
						||
              Derniere_couleur=Couleur_temporaire;
 | 
						||
 | 
						||
              // On tagge le bloc
 | 
						||
              if (Premiere_couleur<=Couleur_temporaire)
 | 
						||
              {
 | 
						||
                Tagger_intervalle_palette(Premiere_couleur,Derniere_couleur);
 | 
						||
                Bloc_degrade_dans_fenetre(172,27,Premiere_couleur,Derniere_couleur);
 | 
						||
              }
 | 
						||
              else
 | 
						||
              {
 | 
						||
                Tagger_intervalle_palette(Derniere_couleur,Premiere_couleur);
 | 
						||
                Bloc_degrade_dans_fenetre(172,27,Derniere_couleur,Premiere_couleur);
 | 
						||
              }
 | 
						||
            }
 | 
						||
          }
 | 
						||
 | 
						||
          // On affiche le num<75>ro de la couleur s<>lectionn<6E>e
 | 
						||
          Afficher_couleur_selectionnee(Premiere_couleur,Derniere_couleur);
 | 
						||
 | 
						||
          Afficher_curseur();
 | 
						||
        }
 | 
						||
        break;
 | 
						||
 | 
						||
      case  2 : // Gestion du changement de Shade (scroller)
 | 
						||
        Effacer_curseur();
 | 
						||
        Shade_Actuel=Fenetre_Attribut2;
 | 
						||
        // Affichade du n<> de shade actif
 | 
						||
        Num2str(Shade_Actuel+1,Chaine,1);
 | 
						||
        Print_dans_fenetre(210,55,Chaine,CM_Noir,CM_Clair);
 | 
						||
        // Affichade du Pas
 | 
						||
        Num2str(Shade_Liste[Shade_Actuel].Pas,Chaine,3);
 | 
						||
        Print_dans_fenetre(276,176,Chaine,CM_Noir,CM_Clair);
 | 
						||
        // Trac<61> du bloc d<>grad<61>:
 | 
						||
        Afficher_tout_le_shade(Premiere_couleur,Derniere_couleur,Select_Debut,Select_Fin);
 | 
						||
        Afficher_curseur();
 | 
						||
        // On place le nouveau shade dans le buffer du Undo
 | 
						||
        memcpy(Buffer_Undo,Shade_Liste[Shade_Actuel].Liste,512*sizeof(word));
 | 
						||
        break;
 | 
						||
 | 
						||
      case  3 : // Gestion de la zone de d<>finition de shades
 | 
						||
        if (((((Mouse_Y-Fenetre_Pos_Y)/Menu_Facteur_Y)-127)%7)<4)
 | 
						||
        if ( (Mouse_X!=Ancien_Mouse_X2) || (Mouse_Y!=Ancien_Mouse_Y2) || (Mouse_K!=Ancien_Mouse_K2) )
 | 
						||
        {
 | 
						||
          Effacer_curseur();
 | 
						||
          Select_Fin=(((((Mouse_Y-Fenetre_Pos_Y)/Menu_Facteur_Y)-127)/7)<<6)+
 | 
						||
                      ((((Mouse_X-Fenetre_Pos_X)/Menu_Facteur_X)-8 )>>2);
 | 
						||
          if (!Ancien_Mouse_K2) // On vient de clicker
 | 
						||
            Select_Debut=Select_Fin;
 | 
						||
          Tagger_shades(Select_Debut,Select_Fin);
 | 
						||
          Afficher_couleur_case_selectionnee(Select_Debut,Select_Fin);
 | 
						||
          Afficher_curseur();
 | 
						||
        }
 | 
						||
        break;
 | 
						||
 | 
						||
      case  6 : // Copy
 | 
						||
        memcpy(Buffer,Shade_Liste[Shade_Actuel].Liste,512*sizeof(word));
 | 
						||
        break;
 | 
						||
 | 
						||
      case  7 : // Paste
 | 
						||
        // On place le shade dans le buffer du Undo
 | 
						||
        memcpy(Buffer_Undo,Shade_Liste[Shade_Actuel].Liste,512*sizeof(word));
 | 
						||
        // Et on le modifie
 | 
						||
        memcpy(Shade_Liste[Shade_Actuel].Liste,Buffer,512*sizeof(word));
 | 
						||
        Effacer_curseur();
 | 
						||
        Afficher_tout_le_shade(Premiere_couleur,Derniere_couleur,Select_Debut,Select_Fin);
 | 
						||
        Afficher_curseur();
 | 
						||
        break;
 | 
						||
 | 
						||
      case  8 : // Insert
 | 
						||
        // On place le shade dans le buffer du Undo
 | 
						||
        memcpy(Buffer_Undo,Shade_Liste[Shade_Actuel].Liste,512*sizeof(word));
 | 
						||
        // Et on le modifie
 | 
						||
        if (Premiere_couleur<=Derniere_couleur)
 | 
						||
          Temp=Derniere_couleur-Premiere_couleur;
 | 
						||
        else
 | 
						||
          Temp=Premiere_couleur-Derniere_couleur;
 | 
						||
 | 
						||
        if (Select_Debut==Select_Fin) // Une couleur s<>lectionn<6E>e
 | 
						||
        {
 | 
						||
          if (Fenetre_Attribut1==2)
 | 
						||
            Supprimer_shade(Select_Debut,Select_Debut+Temp);
 | 
						||
        }
 | 
						||
        else                          // Un bloc s<>lectionn<6E>
 | 
						||
        {
 | 
						||
          Supprimer_shade(Select_Debut,Select_Fin);
 | 
						||
 | 
						||
          if (Premiere_couleur<=Derniere_couleur)
 | 
						||
            Temp=Derniere_couleur-Premiere_couleur;
 | 
						||
          else
 | 
						||
            Temp=Premiere_couleur-Derniere_couleur;
 | 
						||
 | 
						||
          if (Select_Debut<Select_Fin)
 | 
						||
            Select_Fin=Select_Debut+Temp;
 | 
						||
          else
 | 
						||
          {
 | 
						||
            Select_Debut=Select_Fin;
 | 
						||
            Select_Fin+=Temp;
 | 
						||
          }
 | 
						||
        }
 | 
						||
 | 
						||
        if (Select_Debut<Select_Fin)
 | 
						||
          Select_Fin=Select_Debut+Temp;
 | 
						||
        else
 | 
						||
        {
 | 
						||
          Select_Debut=Select_Fin;
 | 
						||
          Select_Fin+=Temp;
 | 
						||
        }
 | 
						||
        Inserer_shade(Premiere_couleur,Derniere_couleur,Select_Debut);
 | 
						||
 | 
						||
        // On s<>lectionne la position juste apr<70>s ce qu'on vient d'ins<6E>rer
 | 
						||
        Select_Debut+=Temp+1;
 | 
						||
        if (Select_Debut>=512)
 | 
						||
          Select_Debut=511;
 | 
						||
        Select_Fin=Select_Debut;
 | 
						||
 | 
						||
        Effacer_curseur();
 | 
						||
        Afficher_tout_le_shade(Premiere_couleur,Derniere_couleur,Select_Debut,Select_Fin);
 | 
						||
        Afficher_curseur();
 | 
						||
        break;
 | 
						||
 | 
						||
      case  9 : // Delete
 | 
						||
        // On place le shade dans le buffer du Undo
 | 
						||
        memcpy(Buffer_Undo,Shade_Liste[Shade_Actuel].Liste,512*sizeof(word));
 | 
						||
        // Et on le modifie
 | 
						||
        Supprimer_shade(Select_Debut,Select_Fin);
 | 
						||
        if (Select_Debut<=Select_Fin)
 | 
						||
          Select_Fin=Select_Debut;
 | 
						||
        else
 | 
						||
          Select_Debut=Select_Fin;
 | 
						||
        Effacer_curseur();
 | 
						||
        Afficher_tout_le_shade(Premiere_couleur,Derniere_couleur,Select_Debut,Select_Fin);
 | 
						||
        Afficher_curseur();
 | 
						||
        break;
 | 
						||
 | 
						||
      case 10 : // Blank
 | 
						||
        // On place le shade dans le buffer du Undo
 | 
						||
        memcpy(Buffer_Undo,Shade_Liste[Shade_Actuel].Liste,512*sizeof(word));
 | 
						||
        // Et on le modifie
 | 
						||
        if (Fenetre_Attribut1==A_DROITE)  // Click droit
 | 
						||
        {
 | 
						||
          if (Select_Debut!=Select_Fin)
 | 
						||
          {
 | 
						||
            if (Select_Debut<=Select_Fin)
 | 
						||
            {
 | 
						||
              Inserer_case_vide_dans_shade(Select_Debut);
 | 
						||
              Inserer_case_vide_dans_shade(Select_Fin+2);
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
              Inserer_case_vide_dans_shade(Select_Fin);
 | 
						||
              Inserer_case_vide_dans_shade(Select_Debut+2);
 | 
						||
            }
 | 
						||
          }
 | 
						||
          else
 | 
						||
            Inserer_case_vide_dans_shade(Select_Debut);
 | 
						||
 | 
						||
          if (Select_Debut<511) Select_Debut++;
 | 
						||
          if (Select_Fin<511) Select_Fin++;
 | 
						||
        }
 | 
						||
        else                              // Click gauche
 | 
						||
        {
 | 
						||
          if (Select_Debut<=Select_Fin)
 | 
						||
          {
 | 
						||
            Temp=Select_Debut;
 | 
						||
            Temp2=Select_Fin;
 | 
						||
          }
 | 
						||
          else
 | 
						||
          {
 | 
						||
            Temp=Select_Fin;
 | 
						||
            Temp2=Select_Debut;
 | 
						||
          }
 | 
						||
          while (Temp<=Temp2)
 | 
						||
            Shade_Liste[Shade_Actuel].Liste[Temp++]=0x0100;
 | 
						||
        }
 | 
						||
 | 
						||
        Effacer_curseur();
 | 
						||
        Afficher_tout_le_shade(Premiere_couleur,Derniere_couleur,Select_Debut,Select_Fin);
 | 
						||
        Afficher_curseur();
 | 
						||
        break;
 | 
						||
 | 
						||
      case 11 : // Invert
 | 
						||
        // On place le shade dans le buffer du Undo
 | 
						||
        memcpy(Buffer_Undo,Shade_Liste[Shade_Actuel].Liste,512*sizeof(word));
 | 
						||
        // Et on le modifie
 | 
						||
        if (Select_Debut<=Select_Fin)
 | 
						||
        {
 | 
						||
          Temp=Select_Debut;
 | 
						||
          Temp2=Select_Fin;
 | 
						||
        }
 | 
						||
        else
 | 
						||
        {
 | 
						||
          Temp=Select_Fin;
 | 
						||
          Temp2=Select_Debut;
 | 
						||
        }
 | 
						||
 | 
						||
        for (;Temp<Temp2;Temp++,Temp2--)
 | 
						||
        {
 | 
						||
          Case_temporaire=Shade_Liste[Shade_Actuel].Liste[Temp];
 | 
						||
          Shade_Liste[Shade_Actuel].Liste[Temp]=Shade_Liste[Shade_Actuel].Liste[Temp2];
 | 
						||
          Shade_Liste[Shade_Actuel].Liste[Temp2]=Case_temporaire;
 | 
						||
        }
 | 
						||
 | 
						||
        Effacer_curseur();
 | 
						||
        Afficher_tout_le_shade(Premiere_couleur,Derniere_couleur,Select_Debut,Select_Fin);
 | 
						||
        Afficher_curseur();
 | 
						||
        break;
 | 
						||
 | 
						||
      case 12 : // Swap
 | 
						||
        Case_temporaire=Attendre_click_dans_shade();
 | 
						||
        if (Case_temporaire<512)
 | 
						||
        {
 | 
						||
          // On place le shade dans le buffer du Undo
 | 
						||
          memcpy(Buffer_Undo,Shade_Liste[Shade_Actuel].Liste,512*sizeof(word));
 | 
						||
          // Et on le modifie
 | 
						||
          // On <20>change le bloc avec sa destination
 | 
						||
          if (Select_Debut<=Select_Fin)
 | 
						||
          {
 | 
						||
            Temp=(Case_temporaire+Select_Fin-Select_Debut<512)?Select_Fin+1-Select_Debut:512-Case_temporaire;
 | 
						||
            Swap_shade(Select_Debut,Case_temporaire,Temp);
 | 
						||
          }
 | 
						||
          else
 | 
						||
          {
 | 
						||
            Temp=(Case_temporaire+Select_Debut-Select_Fin<512)?Select_Debut+1-Select_Fin:512-Case_temporaire;
 | 
						||
            Swap_shade(Select_Fin,Case_temporaire,Temp);
 | 
						||
          }
 | 
						||
          // On place la s<>lection sur la nouvelle position du bloc
 | 
						||
          Select_Debut=Case_temporaire;
 | 
						||
          Select_Fin=Select_Debut+Temp-1;
 | 
						||
          // Et on raffiche tout
 | 
						||
          Effacer_curseur();
 | 
						||
          Afficher_tout_le_shade(Premiere_couleur,Derniere_couleur,Select_Debut,Select_Fin);
 | 
						||
          Afficher_curseur();
 | 
						||
        }
 | 
						||
        break;
 | 
						||
 | 
						||
      case 13 : // Set (disable)
 | 
						||
      case 14 : // Clear (enable)
 | 
						||
        // On place le shade dans le buffer du Undo
 | 
						||
        memcpy(Buffer_Undo,Shade_Liste[Shade_Actuel].Liste,512*sizeof(word));
 | 
						||
        // Et on le modifie
 | 
						||
        if (Select_Debut<Select_Fin)
 | 
						||
        {
 | 
						||
          Temp=Select_Debut;
 | 
						||
          Temp2=Select_Fin;
 | 
						||
        }
 | 
						||
        else
 | 
						||
        {
 | 
						||
          Temp=Select_Fin;
 | 
						||
          Temp2=Select_Debut;
 | 
						||
        }
 | 
						||
 | 
						||
        if (Bouton_clicke==13)
 | 
						||
          for (;Temp<=Temp2;Temp++)
 | 
						||
            Shade_Liste[Shade_Actuel].Liste[Temp]|=0x8000;
 | 
						||
        else
 | 
						||
          for (;Temp<=Temp2;Temp++)
 | 
						||
            Shade_Liste[Shade_Actuel].Liste[Temp]&=0x7FFF;
 | 
						||
 | 
						||
        Effacer_curseur();
 | 
						||
        Tagger_shades(Select_Debut,Select_Fin);
 | 
						||
        Shade_Blocs_degrades();
 | 
						||
        Afficher_curseur();
 | 
						||
        break;
 | 
						||
 | 
						||
      case 15 : // Saisie du pas
 | 
						||
        Effacer_curseur();
 | 
						||
        Num2str(Shade_Liste[Shade_Actuel].Pas,Chaine,3);
 | 
						||
        Readline(276,176,Chaine,3,1);
 | 
						||
        Temp=atoi(Chaine);
 | 
						||
        // On corrige le pas
 | 
						||
        if (!Temp)
 | 
						||
        {
 | 
						||
          Temp=1;
 | 
						||
          Num2str(Temp,Chaine,3);
 | 
						||
          Fenetre_Contenu_bouton_saisie(Bouton_saisie,Chaine);
 | 
						||
        }
 | 
						||
        else if (Temp>255)
 | 
						||
        {
 | 
						||
          Temp=255;
 | 
						||
          Num2str(Temp,Chaine,3);
 | 
						||
          Fenetre_Contenu_bouton_saisie(Bouton_saisie,Chaine);
 | 
						||
        }
 | 
						||
        Shade_Liste[Shade_Actuel].Pas=Temp;
 | 
						||
        Afficher_curseur();
 | 
						||
        break;
 | 
						||
 | 
						||
      case 16 : // Undo
 | 
						||
        memcpy(Pointeur_temp,Buffer_Undo,512*sizeof(word));
 | 
						||
        memcpy(Buffer_Undo,Shade_Liste[Shade_Actuel].Liste,512*sizeof(word));
 | 
						||
        memcpy(Shade_Liste[Shade_Actuel].Liste,Pointeur_temp,512*sizeof(word));
 | 
						||
 | 
						||
        Effacer_curseur();
 | 
						||
        Afficher_tout_le_shade(Premiere_couleur,Derniere_couleur,Select_Debut,Select_Fin);
 | 
						||
        Afficher_curseur();
 | 
						||
        break;
 | 
						||
 | 
						||
      case 17 : // Clear
 | 
						||
        memcpy(Buffer_Undo,Shade_Liste[Shade_Actuel].Liste,512*sizeof(word));
 | 
						||
        for (Temp=0;Temp<512;Temp++)
 | 
						||
          Shade_Liste[Shade_Actuel].Liste[Temp]=0x0100;
 | 
						||
        Effacer_curseur();
 | 
						||
        Afficher_tout_le_shade(Premiere_couleur,Derniere_couleur,Select_Debut,Select_Fin);
 | 
						||
        Afficher_curseur();
 | 
						||
        break;
 | 
						||
 | 
						||
      case 18 : // Mode
 | 
						||
        Shade_Liste[Shade_Actuel].Mode=(Shade_Liste[Shade_Actuel].Mode+1)%3;
 | 
						||
        Effacer_curseur();
 | 
						||
        Afficher_mode_du_shade(250,110,Shade_Liste[Shade_Actuel].Mode);
 | 
						||
        Afficher_curseur();
 | 
						||
    }
 | 
						||
 | 
						||
    if (!Mouse_K)
 | 
						||
    switch (Touche)
 | 
						||
    {
 | 
						||
      case SDLK_LEFTBRACKET : // D<>caler couleur dans palette vers la gauche
 | 
						||
      case SDLK_RIGHTBRACKET : // D<>caler couleur dans palette vers la droite
 | 
						||
        if (Premiere_couleur==Derniere_couleur)
 | 
						||
        {
 | 
						||
          if (Touche==SDLK_LEFTBRACKET)
 | 
						||
          {
 | 
						||
            Premiere_couleur--;
 | 
						||
            Derniere_couleur--;
 | 
						||
          }
 | 
						||
          else
 | 
						||
          {
 | 
						||
            Premiere_couleur++;
 | 
						||
            Derniere_couleur++;
 | 
						||
          }
 | 
						||
          Effacer_curseur();
 | 
						||
          Tagger_intervalle_palette(Premiere_couleur,Premiere_couleur);
 | 
						||
          Block(Fenetre_Pos_X+(Menu_Facteur_X*172),
 | 
						||
                Fenetre_Pos_Y+(Menu_Facteur_Y*27),
 | 
						||
                Menu_Facteur_X<<4,Menu_Facteur_Y*64,Premiere_couleur);
 | 
						||
          // On affiche le num<75>ro de la couleur s<>lectionn<6E>e
 | 
						||
          Afficher_couleur_selectionnee(Premiere_couleur,Derniere_couleur);
 | 
						||
          Afficher_curseur();
 | 
						||
        }
 | 
						||
        break;
 | 
						||
 | 
						||
      case SDLK_UP    : // Select Haut
 | 
						||
      case SDLK_DOWN  : // Select Bas
 | 
						||
      case SDLK_LEFT  : // Select Gauche
 | 
						||
      case SDLK_RIGHT : // Select Droite
 | 
						||
        if (Select_Debut==Select_Fin)
 | 
						||
        {
 | 
						||
          switch (Touche)
 | 
						||
          {
 | 
						||
            case SDLK_UP : // Select Haut
 | 
						||
              if (Select_Debut>=64)
 | 
						||
              {
 | 
						||
                Select_Debut-=64;
 | 
						||
                Select_Fin-=64;
 | 
						||
              }
 | 
						||
              else
 | 
						||
                Select_Debut=Select_Fin=0;
 | 
						||
              break;
 | 
						||
            case SDLK_DOWN : // Select Bas
 | 
						||
              if (Select_Debut<448)
 | 
						||
              {
 | 
						||
                Select_Debut+=64;
 | 
						||
                Select_Fin+=64;
 | 
						||
              }
 | 
						||
              else
 | 
						||
                Select_Debut=Select_Fin=511;
 | 
						||
              break;
 | 
						||
            case SDLK_LEFT : // Select Gauche
 | 
						||
              if (Select_Debut>0)
 | 
						||
              {
 | 
						||
                Select_Debut--;
 | 
						||
                Select_Fin--;
 | 
						||
              }
 | 
						||
              break;
 | 
						||
            default :     // Select Droite
 | 
						||
              if (Select_Debut<511)
 | 
						||
              {
 | 
						||
                Select_Debut++;
 | 
						||
                Select_Fin++;
 | 
						||
              }
 | 
						||
          }
 | 
						||
          Effacer_curseur();
 | 
						||
          Tagger_shades(Select_Debut,Select_Debut);
 | 
						||
          Afficher_couleur_case_selectionnee(Select_Debut,Select_Debut);
 | 
						||
          Afficher_curseur();
 | 
						||
        }
 | 
						||
        break;
 | 
						||
 | 
						||
      case SDLK_BACKQUOTE : // R<>cup<75>ration d'une couleur derri<72>re le menu
 | 
						||
      case SDLK_COMMA :
 | 
						||
        Recuperer_couleur_derriere_fenetre(&Couleur,&Click);
 | 
						||
        if (Click)
 | 
						||
        {
 | 
						||
          Effacer_curseur();
 | 
						||
          Couleur_temporaire=Couleur;
 | 
						||
 | 
						||
          // On met <20> jour l'intervalle du Shade
 | 
						||
          Premiere_couleur=Derniere_couleur=Couleur_temporaire;
 | 
						||
          // On tagge le bloc
 | 
						||
          Tagger_intervalle_palette(Premiere_couleur,Derniere_couleur);
 | 
						||
          // Trac<61> du bloc d<>grad<61>:
 | 
						||
          Bloc_degrade_dans_fenetre(172,27,Premiere_couleur,Derniere_couleur);
 | 
						||
 | 
						||
          // On affiche le num<75>ro de la couleur s<>lectionn<6E>e
 | 
						||
          Afficher_couleur_selectionnee(Premiere_couleur,Derniere_couleur);
 | 
						||
 | 
						||
          Afficher_curseur();
 | 
						||
        }
 | 
						||
        break;
 | 
						||
      default:
 | 
						||
        if (Touche==Bouton[BOUTON_AIDE].Raccourci_gauche)
 | 
						||
          Fenetre_aide(BOUTON_EFFETS, "SHADE");
 | 
						||
    }
 | 
						||
  }
 | 
						||
  while ((Bouton_clicke!=4) && (Bouton_clicke!=5));
 | 
						||
 | 
						||
  Fermer_fenetre();
 | 
						||
  free(Buffer_Undo);
 | 
						||
  free(Buffer);
 | 
						||
  free(Pointeur_temp);
 | 
						||
 | 
						||
  return (Bouton_clicke==5);
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
void Bouton_Shade_Menu(void)
 | 
						||
{
 | 
						||
  struct T_Shade * Shade_Liste_Backup;        // Anciennes donn<6E>es des shades
 | 
						||
  byte Ancien_shade;                              // Ancien n<> de shade actif
 | 
						||
 | 
						||
 | 
						||
  // Backup des anciennes donn<6E>es
 | 
						||
  Shade_Liste_Backup=(struct T_Shade *)malloc(sizeof(Shade_Liste));
 | 
						||
  memcpy(Shade_Liste_Backup,Shade_Liste,sizeof(Shade_Liste));
 | 
						||
  Ancien_shade=Shade_Actuel;
 | 
						||
 | 
						||
  if (!Menu_Shade()) // Cancel
 | 
						||
  {
 | 
						||
    memcpy(Shade_Liste,Shade_Liste_Backup,sizeof(Shade_Liste));
 | 
						||
    Shade_Actuel=Ancien_shade;
 | 
						||
  }
 | 
						||
  else // OK
 | 
						||
  {
 | 
						||
    Liste2tables(Shade_Liste[Shade_Actuel].Liste,
 | 
						||
                 Shade_Liste[Shade_Actuel].Pas,
 | 
						||
                 Shade_Liste[Shade_Actuel].Mode,
 | 
						||
                 Shade_Table_gauche,Shade_Table_droite);
 | 
						||
 | 
						||
    // Si avant de rentrer dans le menu on n'<27>tait pas en mode Shade
 | 
						||
    if (!Shade_Mode)
 | 
						||
      Bouton_Shade_Mode(); // => On y passe (cool!)
 | 
						||
  }
 | 
						||
 | 
						||
  free(Shade_Liste_Backup);
 | 
						||
 | 
						||
  Afficher_curseur();
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
void Bouton_Quick_shade_Menu(void)
 | 
						||
{
 | 
						||
  short Bouton_clicke;
 | 
						||
  int Temp;
 | 
						||
  char Chaine[4];
 | 
						||
  byte Step_Backup=Quick_shade_Step; // Backup des
 | 
						||
  byte Loop_Backup=Quick_shade_Loop; // anciennes donn<6E>es
 | 
						||
 | 
						||
 | 
						||
  Ouvrir_fenetre(142,56,"Quick-shade");
 | 
						||
 | 
						||
  Fenetre_Definir_bouton_normal(76,36,60,14,"OK",0,1,SDLK_RETURN);     // 1
 | 
						||
  Fenetre_Definir_bouton_normal( 6,36,60,14,"Cancel",0,1,SDLK_ESCAPE); // 2
 | 
						||
  Fenetre_Definir_bouton_normal(76,18,60,14,"",0,1,SDLK_TAB);       // 3
 | 
						||
  Afficher_mode_du_shade(83,21,Quick_shade_Loop);
 | 
						||
 | 
						||
  // D<>claration & trac<61> de la zone de saisie du pas
 | 
						||
  Print_dans_fenetre(5,21,"Step",CM_Fonce,CM_Clair);
 | 
						||
  Fenetre_Definir_bouton_saisie(40,19,3);                         // 4
 | 
						||
  Num2str(Quick_shade_Step,Chaine,3);
 | 
						||
  Fenetre_Contenu_bouton_saisie(Fenetre_Liste_boutons_special,Chaine);
 | 
						||
 | 
						||
  UpdateRect(Fenetre_Pos_X,Fenetre_Pos_Y,Menu_Facteur_X*142,Menu_Facteur_Y*56);
 | 
						||
 | 
						||
  Afficher_curseur();
 | 
						||
 | 
						||
  do
 | 
						||
  {
 | 
						||
    Bouton_clicke=Fenetre_Bouton_clicke();
 | 
						||
 | 
						||
    switch (Bouton_clicke)
 | 
						||
    {
 | 
						||
      case 3 : // Mode
 | 
						||
        Quick_shade_Loop=(Quick_shade_Loop+1)%3;
 | 
						||
        Effacer_curseur();
 | 
						||
        Afficher_mode_du_shade(83,21,Quick_shade_Loop);
 | 
						||
        Afficher_curseur();
 | 
						||
        break;
 | 
						||
 | 
						||
      case 4 : // Saisie du pas
 | 
						||
        Effacer_curseur();
 | 
						||
        Num2str(Quick_shade_Step,Chaine,3);
 | 
						||
        Readline(42,21,Chaine,3,1);
 | 
						||
        Temp=atoi(Chaine);
 | 
						||
        // On corrige le pas
 | 
						||
        if (!Temp)
 | 
						||
        {
 | 
						||
          Temp=1;
 | 
						||
          Num2str(Temp,Chaine,3);
 | 
						||
          Fenetre_Contenu_bouton_saisie(Fenetre_Liste_boutons_special,Chaine);
 | 
						||
        }
 | 
						||
        else if (Temp>255)
 | 
						||
        {
 | 
						||
          Temp=255;
 | 
						||
          Num2str(Temp,Chaine,3);
 | 
						||
          Fenetre_Contenu_bouton_saisie(Fenetre_Liste_boutons_special,Chaine);
 | 
						||
        }
 | 
						||
        Quick_shade_Step=Temp;
 | 
						||
        Afficher_curseur();
 | 
						||
    }
 | 
						||
    if (Touche==Bouton[BOUTON_AIDE].Raccourci_gauche)
 | 
						||
      Fenetre_aide(BOUTON_EFFETS, "QUICK SHADE");
 | 
						||
  }
 | 
						||
  while ((Bouton_clicke!=1) && (Bouton_clicke!=2));
 | 
						||
 | 
						||
  Fermer_fenetre();
 | 
						||
 | 
						||
  if (Bouton_clicke==2) // Cancel
 | 
						||
  {
 | 
						||
    Quick_shade_Step=Step_Backup;
 | 
						||
    Quick_shade_Loop=Loop_Backup;
 | 
						||
  }
 | 
						||
  else // OK
 | 
						||
  {
 | 
						||
    // Si avant de rentrer dans le menu on n'<27>tait pas en mode Quick-Shade
 | 
						||
    if (!Quick_shade_Mode)
 | 
						||
      Bouton_Quick_shade_Mode(); // => On y passe (cool!)
 | 
						||
  }
 | 
						||
 | 
						||
  Afficher_curseur();
 | 
						||
}
 |