1773 lines
		
	
	
		
			62 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			1773 lines
		
	
	
		
			62 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
program GrafX2_Setup;
 | 
						||
 | 
						||
{============================================================================}
 | 
						||
const
 | 
						||
  TAILLE_FICHIER_CONFIG=10351;
 | 
						||
  TAILLE_INI           =16203;
 | 
						||
  NB_MAX_OPTIONS       =134;
 | 
						||
  NB_MODES_VIDEO       =60;
 | 
						||
 | 
						||
  VERSION1             =2;
 | 
						||
  VERSION2             =0;
 | 
						||
  BETA1                =96;
 | 
						||
  BETA2                =5;
 | 
						||
 | 
						||
  COULEUR_TITRE        =$5D;
 | 
						||
  COULEUR_SETUP        =$1B;
 | 
						||
  COULEUR_SELECT       =$3F;
 | 
						||
  COULEUR_EXPLIC       =$2A;
 | 
						||
  COULEUR_MESSAGE      =$3F;
 | 
						||
  HAUTEUR_DEBUT_SETUP  =10;
 | 
						||
  HAUTEUR_FIN_SETUP    =44;
 | 
						||
  TAILLE_SETUP         =(HAUTEUR_FIN_SETUP-HAUTEUR_DEBUT_SETUP)*40;
 | 
						||
 | 
						||
{$I SCANCODE.PAS}
 | 
						||
{$I VIDEOMOD.PAS}
 | 
						||
 | 
						||
type
 | 
						||
  Options=record
 | 
						||
            Numero : word;
 | 
						||
            Touche : word;
 | 
						||
            Touche2: word;
 | 
						||
            Libelle: string[35];
 | 
						||
            Explic1: string[76];
 | 
						||
            Explic2: string[76];
 | 
						||
            Erreur : boolean;
 | 
						||
            Suppr  : boolean;
 | 
						||
          end;
 | 
						||
 | 
						||
var
 | 
						||
  Config:array [1..NB_MAX_OPTIONS] of Options;
 | 
						||
  NB_OPTIONS:word;
 | 
						||
  Numero_definition_option:word;
 | 
						||
  Choix_enreg:byte;
 | 
						||
 | 
						||
 | 
						||
 | 
						||
{============================================================================}
 | 
						||
 | 
						||
{------------------------ Passer en mode texte 80x50 ------------------------}
 | 
						||
procedure Text_mode_80x50; assembler;
 | 
						||
asm
 | 
						||
  mov  ax,3
 | 
						||
  int  10h
 | 
						||
  mov  ax,1112h
 | 
						||
  xor  bl,bl
 | 
						||
  mov  dl,50
 | 
						||
  int  10h
 | 
						||
end;
 | 
						||
 | 
						||
{------------------------ Passer en mode texte 80x25 ------------------------}
 | 
						||
procedure Text_mode_80x25; assembler;
 | 
						||
asm
 | 
						||
  mov  ax,3
 | 
						||
  int  10h
 | 
						||
end;
 | 
						||
 | 
						||
{---------------------------- Gestion du curseur ----------------------------}
 | 
						||
procedure Montrer_Curseur; assembler;
 | 
						||
asm
 | 
						||
  mov ax,0103h
 | 
						||
  mov cx,0E0Fh
 | 
						||
  int 10h
 | 
						||
end;
 | 
						||
 | 
						||
procedure Cacher_Curseur; assembler;
 | 
						||
asm
 | 
						||
  mov ax,0103h
 | 
						||
  mov cx,0F0Eh
 | 
						||
  int 10h
 | 
						||
end;
 | 
						||
 | 
						||
procedure Goto_XY(X,Y:byte); assembler;
 | 
						||
asm
 | 
						||
    mov ah,2
 | 
						||
    xor bh,bh
 | 
						||
    mov dl,X
 | 
						||
    mov dh,Y
 | 
						||
    int 10h
 | 
						||
end;
 | 
						||
 | 
						||
{------- Ecrire une chaine d'une certaine couleur … un certain endroit ------}
 | 
						||
procedure Print(X,Y:word; Chaine:string; Attrib:byte); assembler;
 | 
						||
asm
 | 
						||
  mov  ax,0B800h
 | 
						||
  mov  es,ax
 | 
						||
  mov  ax,Y
 | 
						||
  mov  bl,80
 | 
						||
  mul  bl
 | 
						||
  mov  bx,X
 | 
						||
  add  ax,bx
 | 
						||
  shl  ax,1
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  push ds
 | 
						||
  mov  si,word ptr [Chaine]
 | 
						||
  mov  ds,word ptr [Chaine+2]
 | 
						||
 | 
						||
  mov  cl,[ds:si]
 | 
						||
  inc  si
 | 
						||
  mov  al,Attrib
 | 
						||
  @Ecrire_loop:
 | 
						||
    movsb
 | 
						||
    stosb
 | 
						||
  dec  cl
 | 
						||
  jnz  @Ecrire_loop
 | 
						||
  pop  ds
 | 
						||
end;
 | 
						||
 | 
						||
{-------------- Dessiner un cadre plein d'une certaine couleur --------------}
 | 
						||
procedure Cadre(X1,Y1,X2,Y2,Couleur:byte);
 | 
						||
var
 | 
						||
    Tampon:string;
 | 
						||
    i,j:byte;
 | 
						||
begin
 | 
						||
  Tampon[0]:=chr(X2-X1+1);
 | 
						||
  for j:=Y1 to Y2 do
 | 
						||
  begin
 | 
						||
    if j=Y1 then
 | 
						||
    begin
 | 
						||
      Tampon[1]:='É';
 | 
						||
      Tampon[X2-X1+1]:='»';
 | 
						||
      for i:=X1+1 to X2-1 do Tampon[i-X1+1]:='Í';
 | 
						||
    end
 | 
						||
    else
 | 
						||
    if j=Y2 then
 | 
						||
    begin
 | 
						||
      Tampon[1]:='È';
 | 
						||
      Tampon[X2-X1+1]:='¼';
 | 
						||
      for i:=X1+1 to X2-1 do Tampon[i-X1+1]:='Í';
 | 
						||
    end
 | 
						||
    else
 | 
						||
    begin
 | 
						||
      Tampon[1]:='º';
 | 
						||
      Tampon[X2-X1+1]:='º';
 | 
						||
      for i:=X1+1 to X2-1 do Tampon[i-X1+1]:=' ';
 | 
						||
    end;
 | 
						||
 | 
						||
    Print(X1,j,Tampon,Couleur);
 | 
						||
  end;
 | 
						||
end;
 | 
						||
 | 
						||
{---------------------- Change la couleur d'une ligne -----------------------}
 | 
						||
procedure Set_color_of_line(Num_ligne:word; X1,X2,Couleur:byte); assembler;
 | 
						||
asm
 | 
						||
  mov  ax,0B800h
 | 
						||
  mov  es,ax
 | 
						||
  mov  ax,Num_ligne
 | 
						||
  mov  bx,80
 | 
						||
  mul  bl
 | 
						||
  mov  bl,X1
 | 
						||
  add  ax,bx
 | 
						||
  add  ax,ax
 | 
						||
  mov  di,ax
 | 
						||
 | 
						||
  mov  cl,X2
 | 
						||
  sub  cl,X1
 | 
						||
  inc  cl
 | 
						||
  mov  al,Couleur
 | 
						||
  @Set_col_loop:
 | 
						||
    inc  di
 | 
						||
    stosb
 | 
						||
  dec  cl
 | 
						||
  jnz  @Set_col_loop
 | 
						||
end;
 | 
						||
 | 
						||
{--------------------------- Lecture d'une touche ---------------------------}
 | 
						||
function Lire_touche:word; assembler;
 | 
						||
var
 | 
						||
    Touche:word;
 | 
						||
asm
 | 
						||
  mov  Touche,0
 | 
						||
 | 
						||
  mov  ah,11h
 | 
						||
  int  16h
 | 
						||
 | 
						||
  jz   @Get_input_Pas_de_touche
 | 
						||
 | 
						||
  mov  ah,10h
 | 
						||
  int  16h
 | 
						||
 | 
						||
  mov  byte ptr[Touche],ah
 | 
						||
 | 
						||
  mov  ah,02h
 | 
						||
  int  16h
 | 
						||
 | 
						||
  and  al,00001111b
 | 
						||
 | 
						||
  mov  ah,al
 | 
						||
  and  ah,00000001b
 | 
						||
  shr  al,1
 | 
						||
  or   al,ah
 | 
						||
 | 
						||
  mov  byte ptr[Touche+1],al
 | 
						||
 | 
						||
  @Get_input_Pas_de_touche:
 | 
						||
  mov  ax,Touche
 | 
						||
end;
 | 
						||
 | 
						||
{--------------- Dessiner une jolie fenˆtre au premier plan -----------------}
 | 
						||
function Fenetre_choix(Largeur,Hauteur:byte; Titre,Choix:string; Choix_debut,Couleur,Couleur_choix:byte):byte;
 | 
						||
var
 | 
						||
    Temp:string;
 | 
						||
    i,Num_titre,Num_choix:byte;
 | 
						||
    X1,X2,Y1,Y2:byte;
 | 
						||
    Option_choisie:byte;
 | 
						||
    Touche:word;
 | 
						||
    Memoire_video:array[0..7999] of byte;
 | 
						||
begin
 | 
						||
  move(mem[$B800:0000],Memoire_video,8000);
 | 
						||
 | 
						||
  X1:=40-(Largeur shr 1);
 | 
						||
  Y1:=25-(Hauteur shr 1);
 | 
						||
  X2:=X1+Largeur-1;
 | 
						||
  Y2:=Y1+Hauteur-1;
 | 
						||
 | 
						||
  Cadre(X1,Y1,X2,Y2,Couleur);
 | 
						||
  if Y2<49 then Set_color_of_line(Y2+1,X1+1,X2+1,$08);
 | 
						||
  if X2<79 then for i:=Y1+1 to Y2 do Set_color_of_line(i,X2+1,X2+1,$08);
 | 
						||
 | 
						||
 | 
						||
  Num_titre:=1;
 | 
						||
  Temp:='';
 | 
						||
  for i:=1 to length(Titre) do
 | 
						||
  begin
 | 
						||
    if Titre[i]<>'^'
 | 
						||
    then Temp:=Temp+Titre[i]
 | 
						||
    else
 | 
						||
    begin
 | 
						||
      Print(X1+(X2-X1+1-length(Temp)) shr 1,Y1+1+Num_titre,Temp,Couleur);
 | 
						||
      Temp:='';
 | 
						||
      inc(Num_titre);
 | 
						||
    end;
 | 
						||
  end;
 | 
						||
 | 
						||
  Num_choix:=1;
 | 
						||
  Temp:='';
 | 
						||
  for i:=1 to length(Choix) do
 | 
						||
  begin
 | 
						||
    if Choix[i]<>'^'
 | 
						||
    then Temp:=Temp+Choix[i]
 | 
						||
    else
 | 
						||
    begin
 | 
						||
      Print(X1+(X2-X1+1-length(Temp)) shr 1,Y1+2+Num_choix+Num_titre,Temp,Couleur);
 | 
						||
      Temp:='';
 | 
						||
      inc(Num_choix);
 | 
						||
    end;
 | 
						||
  end;
 | 
						||
  dec(Num_choix);
 | 
						||
 | 
						||
  Option_choisie:=Choix_debut;
 | 
						||
  Set_color_of_line(Y1+2+Num_titre+Option_choisie,X1+2,X2-2,Couleur_choix);
 | 
						||
  Repeat
 | 
						||
    Touche:=Lire_touche;
 | 
						||
    case Touche of
 | 
						||
      $0048 : begin
 | 
						||
                Set_color_of_line(Y1+2+Num_titre+Option_choisie,X1+2,X2-2,Couleur);
 | 
						||
                if Option_choisie=1
 | 
						||
                then Option_choisie:=Num_choix
 | 
						||
                else dec(Option_choisie);
 | 
						||
                Set_color_of_line(Y1+2+Num_titre+Option_choisie,X1+2,X2-2,Couleur_choix);
 | 
						||
              end;
 | 
						||
      $0050 : begin
 | 
						||
                Set_color_of_line(Y1+2+Num_titre+Option_choisie,X1+2,X2-2,Couleur);
 | 
						||
                if Option_choisie=Num_choix
 | 
						||
                then Option_choisie:=1
 | 
						||
                else inc(Option_choisie);
 | 
						||
                Set_color_of_line(Y1+2+Num_titre+Option_choisie,X1+2,X2-2,Couleur_choix);
 | 
						||
              end;
 | 
						||
    end;
 | 
						||
  until Touche=$001C;
 | 
						||
 | 
						||
  move(Memoire_video,mem[$B800:0000],8000);
 | 
						||
 | 
						||
  Fenetre_choix:=Option_choisie;
 | 
						||
end;
 | 
						||
 | 
						||
{------------------------ Passer en mode texte 80x25 ------------------------}
 | 
						||
procedure Dessiner_ecran_principal;
 | 
						||
var
 | 
						||
    i:byte;
 | 
						||
begin
 | 
						||
  Cadre( 0, 0,79, 6,COULEUR_TITRE);
 | 
						||
  Print( 2, 1,'Setup program for GRAFX 2.00 (c)1996-98 Sunset Design (G.DORME & K.MARITAUD)',COULEUR_TITRE);
 | 
						||
  Print( 0, 2,'Ç',COULEUR_TITRE);
 | 
						||
  Print(79, 2,'¶',COULEUR_TITRE);
 | 
						||
  for i:=1 to 78 do
 | 
						||
    Print(i,2,'Ä',COULEUR_TITRE);
 | 
						||
  Print( 2, 3,'Use Up/Down arrows & Page-Up/Page-Down to scroll, Enter to modify, Delete to',COULEUR_TITRE);
 | 
						||
  Print( 2, 4,'remove a hot-key, and Escape to validate or cancel. (Warning: QWERTY keys!)',COULEUR_TITRE);
 | 
						||
  Print( 2, 5,'DO NOT USE Print-screen, Pause, and all other special keys!',COULEUR_TITRE);
 | 
						||
  Cadre( 0, 7,79, 9,COULEUR_SETUP);
 | 
						||
  Print( 2, 8,'Option',COULEUR_SETUP);
 | 
						||
  Print(38, 8,'³ Hot-key',COULEUR_SETUP);
 | 
						||
  Print(75, 8,'³Err',COULEUR_SETUP);
 | 
						||
  Cadre( 0, 9,79,45,COULEUR_SETUP);
 | 
						||
  Print( 0, 9,'Ì',COULEUR_SETUP);
 | 
						||
  Print(79, 9,'¹',COULEUR_SETUP);
 | 
						||
  Print(38, 7,'Ñ',COULEUR_SETUP);
 | 
						||
  Print(75, 7,'Ñ',COULEUR_SETUP);
 | 
						||
  Print(38, 9,'Ø',COULEUR_SETUP);
 | 
						||
  Print(75, 9,'Ø',COULEUR_SETUP);
 | 
						||
  Print(38,45,'Ï',COULEUR_SETUP);
 | 
						||
  Print(75,45,'Ï',COULEUR_SETUP);
 | 
						||
  Cadre( 0,46,79,49,COULEUR_EXPLIC);
 | 
						||
end;
 | 
						||
 | 
						||
{------------------------- D‚finition d'une option --------------------------}
 | 
						||
procedure Definir_option(Numero:word;Libelle,Explic1,Explic2:string; Supprimable:boolean; Touche_par_defaut:word);
 | 
						||
begin
 | 
						||
  Config[Numero_definition_option].Numero :=Numero;
 | 
						||
  Config[Numero_definition_option].Touche :=Touche_par_defaut;
 | 
						||
  Config[Numero_definition_option].Touche2:=$00FF;
 | 
						||
  Config[Numero_definition_option].Libelle:=Libelle;
 | 
						||
  Config[Numero_definition_option].Explic1:=Explic1;
 | 
						||
  Config[Numero_definition_option].Explic2:=Explic2;
 | 
						||
  Config[Numero_definition_option].Erreur :=false;
 | 
						||
  Config[Numero_definition_option].Suppr  :=Supprimable;
 | 
						||
  inc(Numero_definition_option);
 | 
						||
end;
 | 
						||
 | 
						||
{--------------- Transformer une chaŒne AZT en String Pascal ----------------}
 | 
						||
function Pchar2string(Chaine:pchar):string;
 | 
						||
var
 | 
						||
    Temp:string;
 | 
						||
    i:byte;
 | 
						||
begin
 | 
						||
  Temp:='';
 | 
						||
  i:=0;
 | 
						||
  while Chaine[i]>#0 do
 | 
						||
  begin
 | 
						||
    Temp:=Temp+Chaine[i];
 | 
						||
    inc(i);
 | 
						||
  end;
 | 
						||
  Pchar2string:=Temp;
 | 
						||
end;
 | 
						||
 | 
						||
{------------- Renvoyer une chaŒne donnant une touche "en clair" ------------}
 | 
						||
function Nom_touche(Touche:word):string;
 | 
						||
var
 | 
						||
    Temp,Temp2:string;
 | 
						||
    Num_table:byte;
 | 
						||
begin
 | 
						||
  Num_table:=1;
 | 
						||
  Temp:='';
 | 
						||
  if (hi(Touche) and 1)>0 then
 | 
						||
  begin
 | 
						||
    Temp:=Temp+'<Shift> + ';
 | 
						||
    Num_table:=2;
 | 
						||
  end;
 | 
						||
  if (hi(Touche) and 2)>0 then
 | 
						||
  begin
 | 
						||
    Temp:=Temp+'<Ctrl> + ';
 | 
						||
    Num_table:=3;
 | 
						||
  end;
 | 
						||
  if (hi(Touche) and 4)>0 then
 | 
						||
  begin
 | 
						||
    Temp:=Temp+'<Alt> + ';
 | 
						||
    Num_table:=4;
 | 
						||
  end;
 | 
						||
  case Num_table of
 | 
						||
    1: begin
 | 
						||
         Temp2:=Pchar2string(Table_Normal[lo(Touche)]);
 | 
						||
         if Temp2='???'
 | 
						||
         then Temp:='********** Invalid key! **********'
 | 
						||
         else if Temp2=''
 | 
						||
         then Temp:=''
 | 
						||
         else Temp:=Temp+'<'+Temp2+'>';
 | 
						||
       end;
 | 
						||
    2: begin
 | 
						||
         Temp2:=Pchar2string(Table_Shift[lo(Touche)]);
 | 
						||
         if Temp2='???'
 | 
						||
         then Temp:='**** Invalid key combination! ****'
 | 
						||
         else if Temp2=''
 | 
						||
         then Temp:=''
 | 
						||
         else Temp:=Temp+'<'+Temp2+'>';
 | 
						||
       end;
 | 
						||
    3: begin
 | 
						||
         Temp2:=Pchar2string(Table_Ctrl[lo(Touche)]);
 | 
						||
         if Temp2='???'
 | 
						||
         then Temp:='**** Invalid key combination! ****'
 | 
						||
         else if Temp2=''
 | 
						||
         then Temp:=''
 | 
						||
         else Temp:=Temp+'<'+Temp2+'>';
 | 
						||
       end;
 | 
						||
    4: begin
 | 
						||
         Temp2:=Pchar2string(Table_Alt[lo(Touche)]);
 | 
						||
         if Temp2='???'
 | 
						||
         then Temp:='**** Invalid key combination! ****'
 | 
						||
         else if Temp2=''
 | 
						||
         then Temp:=''
 | 
						||
         else Temp:=Temp+'<'+Temp2+'>';
 | 
						||
       end;
 | 
						||
  end;
 | 
						||
  Nom_touche:=Temp;
 | 
						||
end;
 | 
						||
 | 
						||
{------------------- ComplŠte une chaine avec un caractŠre ------------------}
 | 
						||
function Completer_chaine(Chaine:string; Taille:byte; Caractere:char):string;
 | 
						||
var
 | 
						||
    i:byte;
 | 
						||
begin
 | 
						||
  for i:=length(Chaine)+1 to Taille do
 | 
						||
    Chaine[i]:=Caractere;
 | 
						||
  Chaine[0]:=chr(Taille);
 | 
						||
  Completer_chaine:=Chaine;
 | 
						||
end;
 | 
						||
 | 
						||
{------------------- Ecrire les informations sur une option -----------------}
 | 
						||
procedure Ecrire(Ligne:byte; Num_option:word; Couleur:byte);
 | 
						||
begin
 | 
						||
  Print( 2,Ligne,Completer_chaine(Config[Num_option].Libelle,35,' '),Couleur);
 | 
						||
  Print(40,Ligne,Completer_chaine(Nom_touche(Config[Num_option].Touche),34,' '),Couleur);
 | 
						||
  if Config[Num_option].Erreur
 | 
						||
  then Print(77,Ligne,'X',Couleur)
 | 
						||
  else Print(77,Ligne,' ',Couleur);
 | 
						||
end;
 | 
						||
 | 
						||
{-------------------- Ecrire un commentaire sur une option ------------------}
 | 
						||
procedure Ecrire_commentaire(Num_option:word);
 | 
						||
begin
 | 
						||
  Print(2,47,Completer_chaine(Config[Num_option].Explic1,76,' '),COULEUR_EXPLIC);
 | 
						||
  Print(2,48,Completer_chaine(Config[Num_option].Explic2,76,' '),COULEUR_EXPLIC);
 | 
						||
end;
 | 
						||
 | 
						||
{----------------- Ecrire toutes les premieres lignes visibles --------------}
 | 
						||
procedure Tout_ecrire(Decalage_curseur, Position_curseur:word);
 | 
						||
var
 | 
						||
    i:byte;
 | 
						||
begin
 | 
						||
  i:=HAUTEUR_DEBUT_SETUP;
 | 
						||
  while (i<=HAUTEUR_FIN_SETUP) and (i<NB_OPTIONS+HAUTEUR_DEBUT_SETUP) do
 | 
						||
  begin
 | 
						||
    Ecrire(i,Decalage_curseur+i+1-HAUTEUR_DEBUT_SETUP,COULEUR_SETUP);
 | 
						||
    inc(i);
 | 
						||
  end;
 | 
						||
  for i:=HAUTEUR_DEBUT_SETUP to HAUTEUR_FIN_SETUP do
 | 
						||
  begin
 | 
						||
    Print(38,i,'³',COULEUR_SETUP);
 | 
						||
    Print(75,i,'³',COULEUR_SETUP);
 | 
						||
  end;
 | 
						||
  Set_color_of_line(HAUTEUR_DEBUT_SETUP+Position_curseur-1,1,78,COULEUR_SELECT);
 | 
						||
  Ecrire_commentaire(Decalage_curseur+Position_curseur);
 | 
						||
end;
 | 
						||
 | 
						||
{-------------- Faire scroller tout l'ecran de setup vers le bas ------------}
 | 
						||
procedure Tout_scroller_bas(Decalage_curseur, Position_curseur:word);
 | 
						||
begin
 | 
						||
  asm
 | 
						||
    mov  ax,0B800h
 | 
						||
    mov  es,ax
 | 
						||
    mov  ax,HAUTEUR_FIN_SETUP
 | 
						||
    mov  bl,160
 | 
						||
    mul  bl
 | 
						||
    sub  ax,4
 | 
						||
    mov  si,ax
 | 
						||
    mov  di,si
 | 
						||
    add  di,160
 | 
						||
 | 
						||
    push ds
 | 
						||
    push es
 | 
						||
    pop  ds
 | 
						||
 | 
						||
    mov  cx,TAILLE_SETUP
 | 
						||
    std
 | 
						||
    db   66h
 | 
						||
    rep  movsw
 | 
						||
    cld
 | 
						||
    pop  ds
 | 
						||
  end;
 | 
						||
  Ecrire(HAUTEUR_DEBUT_SETUP,Decalage_curseur+Position_curseur,COULEUR_SELECT);
 | 
						||
  Set_color_of_line(HAUTEUR_DEBUT_SETUP,1,78,COULEUR_SELECT);
 | 
						||
end;
 | 
						||
 | 
						||
{------------- Faire scroller tout l'ecran de setup vers le haut ------------}
 | 
						||
procedure Tout_scroller_haut(Decalage_curseur, Position_curseur:word);
 | 
						||
begin
 | 
						||
  asm
 | 
						||
    mov  ax,0B800h
 | 
						||
    mov  es,ax
 | 
						||
    mov  ax,HAUTEUR_DEBUT_SETUP+1
 | 
						||
    mov  bl,160
 | 
						||
    mul  bl
 | 
						||
    mov  di,ax
 | 
						||
    mov  si,di
 | 
						||
    sub  di,160
 | 
						||
 | 
						||
    push ds
 | 
						||
    push es
 | 
						||
    pop  ds
 | 
						||
 | 
						||
    mov  cx,TAILLE_SETUP
 | 
						||
    db   66h
 | 
						||
    rep  movsw
 | 
						||
    pop  ds
 | 
						||
  end;
 | 
						||
  Ecrire(HAUTEUR_FIN_SETUP,Decalage_curseur+Position_curseur,COULEUR_SELECT);
 | 
						||
  Set_color_of_line(HAUTEUR_FIN_SETUP,1,78,COULEUR_SELECT);
 | 
						||
end;
 | 
						||
 | 
						||
{-------------------------- Scroller vers le haut ---------------------------}
 | 
						||
procedure Scroll_haut(var Decalage_curseur, Position_curseur:word);
 | 
						||
begin
 | 
						||
  if Position_curseur+Decalage_Curseur>0 then
 | 
						||
  begin
 | 
						||
    if Position_curseur>1 then
 | 
						||
    begin
 | 
						||
      Set_color_of_line(Position_Curseur+HAUTEUR_DEBUT_SETUP-1,1,78,COULEUR_SETUP);
 | 
						||
      dec(Position_curseur);
 | 
						||
      Set_color_of_line(Position_Curseur+HAUTEUR_DEBUT_SETUP-1,1,78,COULEUR_SELECT);
 | 
						||
    end
 | 
						||
    else
 | 
						||
    begin
 | 
						||
      if Decalage_curseur>0 then
 | 
						||
      begin
 | 
						||
        Set_color_of_line(Position_Curseur+HAUTEUR_DEBUT_SETUP-1,1,78,COULEUR_SETUP);
 | 
						||
        dec(Decalage_curseur);
 | 
						||
        Tout_Scroller_bas(Decalage_curseur,Position_curseur);
 | 
						||
      end;
 | 
						||
    end;
 | 
						||
    Ecrire_commentaire(Position_curseur+Decalage_curseur);
 | 
						||
  end;
 | 
						||
end;
 | 
						||
 | 
						||
{-------------------------- Scroller vers le bas ----------------------------}
 | 
						||
procedure Scroll_bas(var Decalage_curseur, Position_curseur:word);
 | 
						||
begin
 | 
						||
  if Position_curseur+Decalage_Curseur<NB_OPTIONS then
 | 
						||
  begin
 | 
						||
    if Position_curseur<=(HAUTEUR_FIN_SETUP-HAUTEUR_DEBUT_SETUP) then
 | 
						||
    begin
 | 
						||
      Set_color_of_line(Position_Curseur+HAUTEUR_DEBUT_SETUP-1,1,78,COULEUR_SETUP);
 | 
						||
      inc(Position_curseur);
 | 
						||
      Set_color_of_line(Position_Curseur+HAUTEUR_DEBUT_SETUP-1,1,78,COULEUR_SELECT);
 | 
						||
    end
 | 
						||
    else
 | 
						||
    begin
 | 
						||
      if Decalage_curseur+Position_curseur<NB_OPTIONS then
 | 
						||
      begin
 | 
						||
        Set_color_of_line(Position_Curseur+HAUTEUR_DEBUT_SETUP-1,1,78,COULEUR_SETUP);
 | 
						||
        inc(Decalage_curseur);
 | 
						||
        Tout_Scroller_haut(Decalage_curseur,Position_curseur);
 | 
						||
      end;
 | 
						||
    end;
 | 
						||
    Ecrire_commentaire(Position_curseur+Decalage_curseur);
 | 
						||
  end;
 | 
						||
end;
 | 
						||
 | 
						||
{-------------------------- Scroller vers le haut ---------------------------}
 | 
						||
procedure Page_up(var Decalage_curseur, Position_curseur:word);
 | 
						||
begin
 | 
						||
  if Position_curseur+Decalage_Curseur>0 then
 | 
						||
  begin
 | 
						||
    if Position_curseur>1 then
 | 
						||
    begin
 | 
						||
      Set_color_of_line(Position_Curseur+HAUTEUR_DEBUT_SETUP-1,1,78,COULEUR_SETUP);
 | 
						||
      Position_curseur:=1;
 | 
						||
      Set_color_of_line(Position_Curseur+HAUTEUR_DEBUT_SETUP-1,1,78,COULEUR_SELECT);
 | 
						||
    end
 | 
						||
    else
 | 
						||
    begin
 | 
						||
      if Decalage_curseur>0 then
 | 
						||
      begin
 | 
						||
        Set_color_of_line(Position_Curseur+HAUTEUR_DEBUT_SETUP-1,1,78,COULEUR_SETUP);
 | 
						||
        if Decalage_curseur>HAUTEUR_FIN_SETUP-HAUTEUR_DEBUT_SETUP
 | 
						||
        then dec(Decalage_curseur,HAUTEUR_FIN_SETUP-HAUTEUR_DEBUT_SETUP)
 | 
						||
        else Decalage_curseur:=0;
 | 
						||
        Tout_ecrire(Decalage_curseur,Position_curseur);
 | 
						||
      end;
 | 
						||
    end;
 | 
						||
    Ecrire_commentaire(Position_curseur+Decalage_curseur);
 | 
						||
  end;
 | 
						||
end;
 | 
						||
 | 
						||
{-------------------------- Scroller vers le bas ----------------------------}
 | 
						||
procedure Page_down(var Decalage_curseur, Position_curseur:word);
 | 
						||
begin
 | 
						||
  if Position_curseur+Decalage_Curseur<NB_OPTIONS then
 | 
						||
  begin
 | 
						||
    if Position_curseur<=(HAUTEUR_FIN_SETUP-HAUTEUR_DEBUT_SETUP) then
 | 
						||
    begin
 | 
						||
      Set_color_of_line(Position_Curseur+HAUTEUR_DEBUT_SETUP-1,1,78,COULEUR_SETUP);
 | 
						||
      Position_curseur:=HAUTEUR_FIN_SETUP-HAUTEUR_DEBUT_SETUP+1;
 | 
						||
      Set_color_of_line(Position_Curseur+HAUTEUR_DEBUT_SETUP-1,1,78,COULEUR_SELECT);
 | 
						||
    end
 | 
						||
    else
 | 
						||
    begin
 | 
						||
      if Decalage_curseur+Position_curseur<NB_OPTIONS then
 | 
						||
      begin
 | 
						||
        Set_color_of_line(Position_Curseur+HAUTEUR_DEBUT_SETUP-1,1,78,COULEUR_SETUP);
 | 
						||
        if (Decalage_curseur+Position_curseur+HAUTEUR_FIN_SETUP-HAUTEUR_DEBUT_SETUP)<NB_OPTIONS
 | 
						||
        then inc(Decalage_curseur,HAUTEUR_FIN_SETUP-HAUTEUR_DEBUT_SETUP)
 | 
						||
        else Decalage_curseur:=NB_OPTIONS-(HAUTEUR_FIN_SETUP-HAUTEUR_DEBUT_SETUP)-1;
 | 
						||
        Tout_ecrire(Decalage_curseur,Position_curseur);
 | 
						||
      end;
 | 
						||
    end;
 | 
						||
    Ecrire_commentaire(Position_curseur+Decalage_curseur);
 | 
						||
  end;
 | 
						||
end;
 | 
						||
 | 
						||
{--------------------- Test de duplication des touches ----------------------}
 | 
						||
procedure Test_duplic;
 | 
						||
var
 | 
						||
    i,j:word;
 | 
						||
    Pas_encore_erreur:boolean;
 | 
						||
begin
 | 
						||
  for i:=1 to NB_OPTIONS do
 | 
						||
    if (Config[i].Touche<>$00FF) then
 | 
						||
    begin
 | 
						||
      j:=1;
 | 
						||
      Pas_encore_erreur:=true;
 | 
						||
      while (j<=NB_OPTIONS) and (Pas_encore_erreur) do
 | 
						||
      begin
 | 
						||
        if (i<>j) and (Config[i].Touche=Config[j].Touche) then
 | 
						||
        begin
 | 
						||
          Pas_encore_erreur:=false;
 | 
						||
          Config[i].Erreur:=true;
 | 
						||
        end;
 | 
						||
        inc(j);
 | 
						||
      end;
 | 
						||
      if Pas_encore_erreur then Config[i].Erreur:=false;
 | 
						||
    end;
 | 
						||
end;
 | 
						||
 | 
						||
{------------------- S‚lectionner une touche … modifier ---------------------}
 | 
						||
procedure Select(Decalage_curseur, Position_curseur:word);
 | 
						||
var
 | 
						||
    Touche,Num_ligne,Num_option,Num_table:word;
 | 
						||
begin
 | 
						||
  Num_ligne:=Position_curseur+HAUTEUR_DEBUT_SETUP-1;
 | 
						||
  Num_option:=Position_curseur+Decalage_curseur;
 | 
						||
  Config[Num_option].Touche:=$00FF;
 | 
						||
  Ecrire(Num_ligne,Num_option,COULEUR_SELECT);
 | 
						||
  Goto_XY(40,Num_ligne);
 | 
						||
  Montrer_curseur;
 | 
						||
 | 
						||
  repeat
 | 
						||
    Touche:=Lire_touche;
 | 
						||
  until Touche<>$0000;
 | 
						||
  Config[Num_option].Touche:=Touche;
 | 
						||
 | 
						||
  Cacher_curseur;
 | 
						||
  Test_duplic;
 | 
						||
 | 
						||
  Num_table:=1;
 | 
						||
  if (hi(Touche) and 1)>0
 | 
						||
  then Num_table:=2;
 | 
						||
  if (hi(Touche) and 2)>0
 | 
						||
  then Num_table:=3;
 | 
						||
  if (hi(Touche) and 4)>0
 | 
						||
  then Num_table:=4;
 | 
						||
  case Num_table of
 | 
						||
    1: if Pchar2string(Table_Normal[lo(Touche)])='???'
 | 
						||
       then Config[Num_option].Erreur:=true;
 | 
						||
    2: if Pchar2string(Table_Shift[lo(Touche)])='???'
 | 
						||
       then Config[Num_option].Erreur:=true;
 | 
						||
    3: if Pchar2string(Table_Ctrl[lo(Touche)])='???'
 | 
						||
       then Config[Num_option].Erreur:=true;
 | 
						||
    4: if Pchar2string(Table_Alt[lo(Touche)])='???'
 | 
						||
       then Config[Num_option].Erreur:=true;
 | 
						||
  end;
 | 
						||
 | 
						||
  Tout_ecrire(Decalage_curseur,Position_curseur);
 | 
						||
end;
 | 
						||
 | 
						||
{------------------------ D‚s‚lectionner une touche -------------------------}
 | 
						||
procedure Unselect(Decalage_curseur, Position_curseur:word);
 | 
						||
var
 | 
						||
    Num_option:word;
 | 
						||
begin
 | 
						||
  Num_option:=Decalage_curseur+Position_curseur;
 | 
						||
  Config[Num_option].Erreur:=false;
 | 
						||
  Config[Num_option].Touche:=$00FF;
 | 
						||
  Test_duplic;
 | 
						||
  if not Config[Num_option].Suppr
 | 
						||
  then Config[Num_option].Erreur:=true;
 | 
						||
  Tout_ecrire(Decalage_curseur,Position_curseur);
 | 
						||
end;
 | 
						||
 | 
						||
{---------------------- Validation de la configuration ----------------------}
 | 
						||
function Validation:boolean;
 | 
						||
var
 | 
						||
    Y_a_des_erreurs:boolean;
 | 
						||
    i:word;
 | 
						||
begin
 | 
						||
  Y_a_des_erreurs:=false;
 | 
						||
  i:=1;
 | 
						||
  while (i<=NB_OPTIONS) and not Y_a_des_erreurs do
 | 
						||
  begin
 | 
						||
    Y_a_des_erreurs:=Config[i].Erreur;
 | 
						||
    inc(i);
 | 
						||
  end;
 | 
						||
 | 
						||
  if Y_a_des_erreurs
 | 
						||
  then Choix_enreg:=4-Fenetre_choix(30,12,
 | 
						||
       'There are errors in the^hot-keys configuration.^Check out the "Err" column^in order to correct them.^',
 | 
						||
       'OK^Quit anyway^',1,$4C,$3F)
 | 
						||
  else Choix_enreg:=Fenetre_choix(30,10,'Save configuration?^','Yes^No^Cancel^',1,$2A,$6F);
 | 
						||
  Validation:=(Choix_enreg<>3);
 | 
						||
end;
 | 
						||
 | 
						||
{------------------------ Configuration des touches -------------------------}
 | 
						||
procedure Setup;
 | 
						||
var
 | 
						||
    Sortie_OK:boolean;
 | 
						||
    Touche:word;
 | 
						||
    Decalage_curseur:word;
 | 
						||
    Position_curseur:word;
 | 
						||
begin
 | 
						||
  Sortie_OK:=false;
 | 
						||
  Decalage_curseur:=0;
 | 
						||
  Position_curseur:=1;
 | 
						||
  Test_duplic;
 | 
						||
  Tout_ecrire(0,1);
 | 
						||
  repeat
 | 
						||
    Touche:=Lire_Touche;
 | 
						||
    case Touche of
 | 
						||
      $0048 : Scroll_haut(Decalage_curseur,Position_curseur);
 | 
						||
      $0050 : Scroll_bas(Decalage_curseur,Position_curseur);
 | 
						||
      $0049 : Page_up(Decalage_curseur,Position_curseur);
 | 
						||
      $0051 : Page_down(Decalage_curseur,Position_curseur);
 | 
						||
      $001C : Select(Decalage_curseur,Position_curseur);
 | 
						||
      $0053 : Unselect(Decalage_curseur,Position_curseur);
 | 
						||
      $0001 : Sortie_OK:=Validation;
 | 
						||
    end;
 | 
						||
  until Sortie_OK;
 | 
						||
end;
 | 
						||
 | 
						||
 | 
						||
 | 
						||
{--- Lecture (et mise … jour s'il est ancien) du fichier de configuration ---}
 | 
						||
type
 | 
						||
  Type_shade=record
 | 
						||
    Table:array[1..512] of word;
 | 
						||
    Pas:byte;
 | 
						||
    Mode:byte;
 | 
						||
  end;
 | 
						||
  Type_mode_video=record
 | 
						||
    Etat   :byte;
 | 
						||
    Largeur:word;
 | 
						||
    Hauteur:word;
 | 
						||
  end;
 | 
						||
  Type_header=record
 | 
						||
    Signature:array[1..3] of char;
 | 
						||
    Version1:byte;
 | 
						||
    Version2:byte;
 | 
						||
    Beta1:byte;
 | 
						||
    Beta2:byte;
 | 
						||
  end;
 | 
						||
  Type_chunk=record
 | 
						||
    Numero:byte;
 | 
						||
    Taille:word;
 | 
						||
  end;
 | 
						||
  Type_infos_touche=record
 | 
						||
    Numero : word;
 | 
						||
    Touche : word;
 | 
						||
    Touche2: word;
 | 
						||
  end;
 | 
						||
 | 
						||
var
 | 
						||
  Modes_video   :array[1..NB_MODES_VIDEO] of Type_mode_video;
 | 
						||
  Shade_actuel  :byte;
 | 
						||
  Shades        :array[1..8] of Type_shade;
 | 
						||
  Masque        :array[1..256] of byte;
 | 
						||
  Stencil       :array[1..256] of byte;
 | 
						||
  Infos_degrades:array[1..225] of byte;
 | 
						||
  Smooth_Matrice:array[1..3,1..3] of byte;
 | 
						||
  Exclude_color :array[1..256] of byte;
 | 
						||
  Quick_shade   :array[1..2] of byte;
 | 
						||
 | 
						||
 | 
						||
procedure Interpretation_du_fichier_config;
 | 
						||
var
 | 
						||
  Fichier       :file;
 | 
						||
  Indice        :word;
 | 
						||
  Indice2       :word;
 | 
						||
  Taille_fichier:longint;
 | 
						||
  Header        :Type_header;
 | 
						||
  Chunk         :Type_chunk;
 | 
						||
  Infos_touche  :Type_infos_touche;
 | 
						||
  Mode_video    :Type_mode_video;
 | 
						||
  OK            :boolean;
 | 
						||
begin
 | 
						||
  {- Modes vid‚os -}
 | 
						||
  for Indice:=1 to NB_MODES_VIDEO do
 | 
						||
  begin
 | 
						||
    Modes_video[Indice].Etat   :=Table_modes_video[Indice,1];
 | 
						||
    Modes_video[Indice].Largeur:=Table_modes_video[Indice,2];
 | 
						||
    Modes_video[Indice].Hauteur:=Table_modes_video[Indice,3];
 | 
						||
  end;
 | 
						||
  {- Shade -}
 | 
						||
  Shade_actuel:=0; {1er shade}
 | 
						||
  for Indice:=1 to 8 do
 | 
						||
  begin
 | 
						||
    for Indice2:=1 to 512 do
 | 
						||
      Shades[Indice].Table[Indice2]:=256; {Case vide pas tagg‚e}
 | 
						||
    Shades[Indice].Pas:=1;                {Pas de 1}
 | 
						||
    Shades[Indice].Mode:=0;               {Mode Normal}
 | 
						||
  end;
 | 
						||
  {- Masque -}
 | 
						||
  fillchar(Masque,sizeof(Masque),0);
 | 
						||
  {- Stencil -}
 | 
						||
  fillchar(Stencil,sizeof(Stencil),0);
 | 
						||
  {- Infos sur les d‚grad‚s -}
 | 
						||
  fillchar(Infos_degrades,sizeof(Infos_degrades),0);
 | 
						||
  {- Matrice du Smooth -}
 | 
						||
  Smooth_matrice[1][1]:=1;
 | 
						||
  Smooth_matrice[2][1]:=2;
 | 
						||
  Smooth_matrice[3][1]:=1;
 | 
						||
  Smooth_matrice[1][2]:=2;
 | 
						||
  Smooth_matrice[2][2]:=4;
 | 
						||
  Smooth_matrice[3][2]:=2;
 | 
						||
  Smooth_matrice[1][3]:=1;
 | 
						||
  Smooth_matrice[2][3]:=2;
 | 
						||
  Smooth_matrice[3][3]:=1;
 | 
						||
  {- Exclude colors -}
 | 
						||
  fillchar(Exclude_color,sizeof(Exclude_color),0);
 | 
						||
  {- Quick-shade -}
 | 
						||
  Quick_shade[1]:=1; {Step}
 | 
						||
  Quick_shade[2]:=0; {Loop mode (0=normal,1=loop,2=no sat.}
 | 
						||
 | 
						||
  Taille_fichier:=0;
 | 
						||
  assign(Fichier,'GFX2.CFG');
 | 
						||
  {$I-}
 | 
						||
  reset(Fichier,1);
 | 
						||
  {$I+}
 | 
						||
  if (IOresult=0) then
 | 
						||
  begin {On tente de r‚cup‚rer les infos du fichier}
 | 
						||
    Taille_fichier:=filesize(Fichier);
 | 
						||
    if (Taille_fichier>=7) then
 | 
						||
    begin
 | 
						||
      blockread(Fichier,Header,7);
 | 
						||
      if Header.Signature='CFG' then
 | 
						||
      begin
 | 
						||
        {On regarde si c'est un fichier de la version actuelle}
 | 
						||
        if (Taille_fichier =TAILLE_FICHIER_CONFIG) and
 | 
						||
           (Header.Version1=VERSION1             ) and
 | 
						||
           (Header.Version2=VERSION2             ) and
 | 
						||
           (Header.Beta1   =BETA1                ) and
 | 
						||
           (Header.Beta2   =BETA2                ) then
 | 
						||
        begin {Si oui, on r‚cupŠre les touches et on s'arrˆte l…}
 | 
						||
          seek(Fichier,sizeof(Header)+Sizeof(Chunk));
 | 
						||
          for Indice:=1 to NB_OPTIONS do
 | 
						||
            blockread(Fichier,Config[Indice],6);
 | 
						||
          close(Fichier);
 | 
						||
          exit;
 | 
						||
        end
 | 
						||
        else
 | 
						||
        begin  {Si non, c'est une ancienne version et on r‚cupŠre tout ce qu'on peut}
 | 
						||
          OK:=TRUE;
 | 
						||
          {$I-}
 | 
						||
          while OK(*not eof(Fichier)*) do
 | 
						||
          begin
 | 
						||
            blockread(Fichier,Chunk,sizeof(Chunk));
 | 
						||
            if (IOresult<>0) then
 | 
						||
              OK:=FALSE
 | 
						||
            else
 | 
						||
              case Chunk.Numero of
 | 
						||
                0:begin {Touches}
 | 
						||
                    for Indice:=1 to (Chunk.Taille div sizeof(Infos_touche)) do
 | 
						||
                    begin
 | 
						||
                      blockread(Fichier,Infos_touche,sizeof(Infos_touche));
 | 
						||
                      if (IOresult<>0) then
 | 
						||
                        OK:=FALSE
 | 
						||
                      else
 | 
						||
                      begin
 | 
						||
                        Indice2:=1;
 | 
						||
                        while (Indice2<=NB_OPTIONS) and
 | 
						||
                              (Config[Indice2].Numero<>Infos_touche.Numero) do
 | 
						||
                          inc(Indice2);
 | 
						||
                        if (Indice2<=NB_OPTIONS) then
 | 
						||
                        begin
 | 
						||
                          Config[Indice2].Touche :=Infos_touche.Touche;
 | 
						||
                          Config[Indice2].Touche2:=Infos_touche.Touche2;
 | 
						||
                        end;
 | 
						||
                      end;
 | 
						||
                    end;
 | 
						||
                  end;
 | 
						||
                1:begin {Modes vid‚o}
 | 
						||
                    for Indice:=1 to (Chunk.Taille div sizeof(Mode_video)) do
 | 
						||
                    begin
 | 
						||
                      blockread(Fichier,Mode_video,sizeof(Mode_video));
 | 
						||
                      if (IOresult<>0) then
 | 
						||
                        OK:=FALSE
 | 
						||
                      else
 | 
						||
                      begin
 | 
						||
                        Indice2:=1;
 | 
						||
                        while (Indice2<=NB_MODES_VIDEO) and
 | 
						||
                              ( (Modes_video[Indice2].Largeur<>Mode_video.Largeur) or
 | 
						||
                                (Modes_video[Indice2].Hauteur<>Mode_video.Hauteur) or
 | 
						||
                                ((Modes_video[Indice2].Etat and $C0)<>(Mode_video.Etat and $C0)) ) do
 | 
						||
                          inc(Indice2);
 | 
						||
                        if (Indice2<=NB_MODES_VIDEO) then
 | 
						||
                          Modes_video[Indice2].Etat:=Mode_video.Etat;
 | 
						||
                      end;
 | 
						||
                    end;
 | 
						||
                  end;
 | 
						||
                2:begin {Shade}
 | 
						||
                    blockread(Fichier,Shade_actuel,sizeof(Shade_actuel));
 | 
						||
                    if (IOresult<>0) then
 | 
						||
                    begin
 | 
						||
                      OK:=FALSE; {Erreur => On remet un shade actuel propre}
 | 
						||
                      Shade_actuel:=0;
 | 
						||
                    end
 | 
						||
                    else
 | 
						||
                    begin
 | 
						||
                      blockread(Fichier,Shades,sizeof(Shades));
 | 
						||
                      if (IOresult<>0) then
 | 
						||
                      begin
 | 
						||
                        OK:=FALSE; {Erreur => On remet des tables de shades propres}
 | 
						||
                        for Indice:=1 to 8 do
 | 
						||
                        begin
 | 
						||
                          for Indice2:=1 to 512 do
 | 
						||
                            Shades[Indice].Table[Indice2]:=256; {Case vide pas tagg‚e}
 | 
						||
                          Shades[Indice].Pas:=1;                {Pas de 1}
 | 
						||
                          Shades[Indice].Mode:=0;               {Mode Normal}
 | 
						||
                        end;
 | 
						||
                      end;
 | 
						||
                    end;
 | 
						||
                  end;
 | 
						||
                3:begin {Masque}
 | 
						||
                    blockread(Fichier,Masque,sizeof(Masque));
 | 
						||
                    if (IOresult<>0) then
 | 
						||
                    begin
 | 
						||
                      OK:=FALSE; {Erreur => On remet un masque propre}
 | 
						||
                      fillchar(Masque,sizeof(Masque),0);
 | 
						||
                    end;
 | 
						||
                  end;
 | 
						||
                4:begin {Stencil}
 | 
						||
                    blockread(Fichier,Stencil,sizeof(Stencil));
 | 
						||
                    if (IOresult<>0) then
 | 
						||
                    begin
 | 
						||
                      OK:=FALSE; {Erreur => On remet un stencil propre}
 | 
						||
                      fillchar(Stencil,sizeof(Stencil),0);
 | 
						||
                    end;
 | 
						||
                  end;
 | 
						||
                5:begin {Infos sur les d‚grad‚s}
 | 
						||
                    blockread(Fichier,Infos_degrades,sizeof(Infos_degrades));
 | 
						||
                    if (IOresult<>0) then
 | 
						||
                    begin
 | 
						||
                      OK:=FALSE; {Erreur => On remet des infos sur les d‚grad‚s propres}
 | 
						||
                      fillchar(Stencil,sizeof(Infos_degrades),0);
 | 
						||
                    end;
 | 
						||
                  end;
 | 
						||
                6:begin {Matrice du Smooth}
 | 
						||
                    blockread(Fichier,Smooth_Matrice,sizeof(Smooth_Matrice));
 | 
						||
                    if (IOresult<>0) then
 | 
						||
                    begin
 | 
						||
                      OK:=FALSE; {Erreur => On remet une matrice de Smooth propre}
 | 
						||
                      Smooth_matrice[1][1]:=1;
 | 
						||
                      Smooth_matrice[2][1]:=2;
 | 
						||
                      Smooth_matrice[3][1]:=1;
 | 
						||
                      Smooth_matrice[1][2]:=2;
 | 
						||
                      Smooth_matrice[2][2]:=4;
 | 
						||
                      Smooth_matrice[3][2]:=2;
 | 
						||
                      Smooth_matrice[1][3]:=1;
 | 
						||
                      Smooth_matrice[2][3]:=2;
 | 
						||
                      Smooth_matrice[3][3]:=1;
 | 
						||
                    end;
 | 
						||
                  end;
 | 
						||
                7:begin {Exclude colors}
 | 
						||
                    blockread(Fichier,Exclude_color,sizeof(Exclude_color));
 | 
						||
                    if (IOresult<>0) then
 | 
						||
                    begin
 | 
						||
                      OK:=FALSE; {Erreur => On remet une table d'exclusion propre}
 | 
						||
                      fillchar(Exclude_color,sizeof(Exclude_color),0);
 | 
						||
                    end;
 | 
						||
                  end;
 | 
						||
                8:begin {Quick-shade}
 | 
						||
                    blockread(Fichier,Quick_shade,sizeof(Quick_shade));
 | 
						||
                    if (IOresult<>0) then
 | 
						||
                    begin
 | 
						||
                      OK:=FALSE; {Erreur => On remet un quick-shade propre}
 | 
						||
                      Quick_shade[1]:=1; {Step}
 | 
						||
                      Quick_shade[2]:=0; {Loop mode}
 | 
						||
                    end;
 | 
						||
                  end
 | 
						||
                else
 | 
						||
                begin
 | 
						||
                  seek(Fichier,filepos(Fichier)+Chunk.Taille);
 | 
						||
                  if (IOresult<>0) then
 | 
						||
                    OK:=FALSE;
 | 
						||
                end;
 | 
						||
              end;
 | 
						||
          end;
 | 
						||
          {$I+}
 | 
						||
        end;
 | 
						||
      end;
 | 
						||
    end;
 | 
						||
  end;
 | 
						||
 | 
						||
  {- Ecriture du fichier d'options -}
 | 
						||
  assign(Fichier,'GFX2.CFG');
 | 
						||
  rewrite(Fichier,1);
 | 
						||
 | 
						||
  {Ecriture du header}
 | 
						||
  Header.Signature:='CFG';
 | 
						||
  Header.Version1 :=VERSION1;
 | 
						||
  Header.Version2 :=VERSION2;
 | 
						||
  Header.Beta1    :=BETA1;
 | 
						||
  Header.Beta2    :=BETA2;
 | 
						||
  blockwrite(Fichier,Header,sizeof(Header));
 | 
						||
 | 
						||
  {Enregistrement des touches}
 | 
						||
  Chunk.Numero:=0;
 | 
						||
  Chunk.Taille:=NB_OPTIONS*sizeof(Infos_touche);
 | 
						||
  blockwrite(Fichier,Chunk,sizeof(Chunk));
 | 
						||
  for Indice:=1 to NB_OPTIONS do
 | 
						||
    blockwrite(Fichier,Config[Indice],sizeof(Infos_touche)); {Les 3 premiers champs (words) sont: Num‚ro,Touche,Touche2}
 | 
						||
 | 
						||
  {Sauvegarde de l'‚tat de chaque mode vid‚o}
 | 
						||
  Chunk.Numero:=1;
 | 
						||
  Chunk.Taille:=sizeof(Modes_video);
 | 
						||
  blockwrite(Fichier,Chunk,sizeof(Chunk));
 | 
						||
  blockwrite(Fichier,Modes_video,sizeof(Modes_video));
 | 
						||
 | 
						||
  {Ecriture des donn‚es du Shade (pr‚c‚d‚es du shade en cours)}
 | 
						||
  Chunk.Numero:=2;
 | 
						||
  Chunk.Taille:=sizeof(Shades)+Sizeof(Shade_actuel);
 | 
						||
  blockwrite(Fichier,Chunk,sizeof(Chunk));
 | 
						||
  blockwrite(Fichier,Shade_actuel,Sizeof(Shade_actuel));
 | 
						||
  blockwrite(Fichier,Shades,Sizeof(Shades));
 | 
						||
 | 
						||
  {Ecriture des donn‚es du Masque}
 | 
						||
  Chunk.Numero:=3;
 | 
						||
  Chunk.Taille:=sizeof(Masque);
 | 
						||
  blockwrite(Fichier,Chunk,sizeof(Chunk));
 | 
						||
  blockwrite(Fichier,Masque,Sizeof(Masque));
 | 
						||
 | 
						||
  {Ecriture des donn‚es du Stencil}
 | 
						||
  Chunk.Numero:=4;
 | 
						||
  Chunk.Taille:=sizeof(Stencil);
 | 
						||
  blockwrite(Fichier,Chunk,sizeof(Chunk));
 | 
						||
  blockwrite(Fichier,Stencil,Sizeof(Stencil));
 | 
						||
 | 
						||
  {Ecriture des donn‚es sur les d‚grad‚s}
 | 
						||
  Chunk.Numero:=5;
 | 
						||
  Chunk.Taille:=sizeof(Infos_degrades);
 | 
						||
  blockwrite(Fichier,Chunk,sizeof(Chunk));
 | 
						||
  blockwrite(Fichier,Infos_degrades,Sizeof(Infos_degrades));
 | 
						||
 | 
						||
  {Ecriture de la matrice de Smooth}
 | 
						||
  Chunk.Numero:=6;
 | 
						||
  Chunk.Taille:=sizeof(Smooth_Matrice);
 | 
						||
  blockwrite(Fichier,Chunk,sizeof(Chunk));
 | 
						||
  blockwrite(Fichier,Smooth_Matrice,Sizeof(Smooth_Matrice));
 | 
						||
 | 
						||
  {Ecriture de la table d'exclusion de couleurs}
 | 
						||
  Chunk.Numero:=7;
 | 
						||
  Chunk.Taille:=sizeof(Exclude_color);
 | 
						||
  blockwrite(Fichier,Chunk,sizeof(Chunk));
 | 
						||
  blockwrite(Fichier,Exclude_color,Sizeof(Exclude_color));
 | 
						||
 | 
						||
  {Ecriture des donn‚es du Quick-shade}
 | 
						||
  Chunk.Numero:=8;
 | 
						||
  Chunk.Taille:=sizeof(Quick_shade);
 | 
						||
  blockwrite(Fichier,Chunk,sizeof(Chunk));
 | 
						||
  blockwrite(Fichier,Quick_shade,Sizeof(Quick_shade));
 | 
						||
 | 
						||
  close(Fichier);
 | 
						||
end;
 | 
						||
 | 
						||
 | 
						||
 | 
						||
function Recreer_INI:boolean;
 | 
						||
type
 | 
						||
  T_Buffer=array[1..TAILLE_INI] of byte;
 | 
						||
var
 | 
						||
  Fichier_INI,Fichier_DAT:file;
 | 
						||
  Buffer:pointer;{^T_Buffer;}
 | 
						||
  Erreur:boolean;
 | 
						||
begin
 | 
						||
  assign(Fichier_INI,'GFX2.INI');
 | 
						||
 | 
						||
  assign(Fichier_DAT,'GFX2.DAT');
 | 
						||
  {$I-}
 | 
						||
  reset(Fichier_DAT,1);
 | 
						||
  if IOresult<>0 then
 | 
						||
    Erreur:=true
 | 
						||
  else
 | 
						||
  begin
 | 
						||
    seek(Fichier_DAT,filesize(Fichier_DAT)-TAILLE_INI);
 | 
						||
    if IOresult<>0 then
 | 
						||
      Erreur:=true
 | 
						||
    else
 | 
						||
    begin
 | 
						||
      Erreur:=false;
 | 
						||
      rewrite(Fichier_INI,1);
 | 
						||
      getmem(Buffer,TAILLE_INI);
 | 
						||
      blockread (Fichier_DAT,Buffer^,TAILLE_INI);
 | 
						||
      blockwrite(Fichier_INI,Buffer^,TAILLE_INI);
 | 
						||
      freemem(Buffer,TAILLE_INI);
 | 
						||
      close(Fichier_INI);
 | 
						||
    end;
 | 
						||
    close(Fichier_DAT);
 | 
						||
  end;
 | 
						||
  {$I+}
 | 
						||
 | 
						||
  Recreer_INI:=Erreur;
 | 
						||
end;
 | 
						||
 | 
						||
 | 
						||
{------------------- Initialisation de la configuration ---------------------}
 | 
						||
function Initialiser_config:boolean;
 | 
						||
var
 | 
						||
  Erreur:boolean;
 | 
						||
  Fichier_INI:file;
 | 
						||
begin
 | 
						||
  Erreur:=false;
 | 
						||
 | 
						||
  Numero_definition_option:=1;
 | 
						||
 | 
						||
  {!!! LES TOUCHES SONT CONFIGUREES POUR LES CLAVIERS QWERTY !!!}
 | 
						||
 | 
						||
  Definir_option(0,'Scroll up',
 | 
						||
                 'Used to scroll upwards in the picture, either in magnify and normal mode.',
 | 
						||
                 'This hot-key cannot be removed.',
 | 
						||
                 false,$0048); {Haut}
 | 
						||
  Definir_option(1,'Scroll down',
 | 
						||
                 'Used to scroll downwards in the picture, either in magnify and normal mode.',
 | 
						||
                 'This hot-key cannot be removed.',
 | 
						||
                 false,$0050); {Bas}
 | 
						||
  Definir_option(2,'Scroll left',
 | 
						||
                 'Used to scroll to the left in the picture, either in magnify and normal',
 | 
						||
                 'mode. This hot-key cannot be removed.',
 | 
						||
                 false,$004B); {Gauche}
 | 
						||
  Definir_option(3,'Scroll right',
 | 
						||
                 'Used to scroll to the right in the picture, either in magnify and normal',
 | 
						||
                 'mode. This hot-key cannot be removed.',
 | 
						||
                 false,$004D); {Droite}
 | 
						||
  Definir_option(4,'Faster scroll up',
 | 
						||
                 'Used to scroll upwards in the picture fast, either in magnify and normal',
 | 
						||
                 'mode.',
 | 
						||
                 true,$0148);  {Shift + Haut}
 | 
						||
  Definir_option(5,'Faster scroll down',
 | 
						||
                 'Used to scroll downwards in the picture fast, either in magnify and normal',
 | 
						||
                 'mode.',
 | 
						||
                 true,$0150);  {Shift + Bas}
 | 
						||
  Definir_option(6,'Faster scroll left',
 | 
						||
                 'Used to scroll to the left in the picture fast, either in magnify and normal',
 | 
						||
                 'mode.',
 | 
						||
                 true,$014B);  {Shift + Gauche}
 | 
						||
  Definir_option(7,'Faster scroll right',
 | 
						||
                 'Used to scroll to the right in the picture fast, either in magnify and',
 | 
						||
                 'normal mode.',
 | 
						||
                 true,$014D);  {Shift + Droite}
 | 
						||
  Definir_option(8,'Slower scroll up',
 | 
						||
                 'Used to scroll upwards in the picture pixel by pixel, either in magnify and',
 | 
						||
                 'normal mode.',
 | 
						||
                 true,$0498);  {Alt + Haut}
 | 
						||
  Definir_option(9,'Slower scroll down',
 | 
						||
                 'Used to scroll downwards in the picture pixel by pixel, either in magnify and',
 | 
						||
                 'normal mode.',
 | 
						||
                 true,$04A0);  {Alt + Bas}
 | 
						||
  Definir_option(10,'Slower scroll left',
 | 
						||
                 'Used to scroll to the left in the picture pixel by pixel, either in magnify',
 | 
						||
                 'and normal mode.',
 | 
						||
                 true,$049B);  {Alt + Gauche}
 | 
						||
  Definir_option(11,'Slower scroll right',
 | 
						||
                 'Used to scroll to the right in the picture pixel by pixel, either in magnify',
 | 
						||
                 'and normal mode.',
 | 
						||
                 true,$049D);  {Alt + Droite}
 | 
						||
  Definir_option(12,'Move mouse cursor 1 pixel up',
 | 
						||
                 'Used to simulate a very small mouse deplacement upwards.',
 | 
						||
                 'It''s very useful when you want a ultra-high precision.',
 | 
						||
                 true,$028D);  {Ctrl + Haut}
 | 
						||
  Definir_option(13,'Move mouse cursor 1 pixel down',
 | 
						||
                 'Used to simulate a very small mouse deplacement downwards.',
 | 
						||
                 'It''s very useful when you want a ultra-high precision.',
 | 
						||
                 true,$0291);  {Ctrl + Bas}
 | 
						||
  Definir_option(14,'Move mouse cursor 1 pixel left',
 | 
						||
                 'Used to simulate a very small mouse deplacement to the left.',
 | 
						||
                 'It''s very useful when you want a ultra-high precision.',
 | 
						||
                 true,$0273);  {Ctrl + Gauche}
 | 
						||
  Definir_option(15,'Move mouse cursor 1 pixel right',
 | 
						||
                 'Used to simulate a very small mouse deplacement to the right.',
 | 
						||
                 'It''s very useful when you want a ultra-high precision.',
 | 
						||
                 true,$0274);  {Ctrl + Droite}
 | 
						||
  Definir_option(16,'Simulate left mouse click',
 | 
						||
                 'Used to simulate a click with the left mouse button..',
 | 
						||
                 'It''s very useful when you want a ultra-high precision.',
 | 
						||
                 true,$0039);  {Space}
 | 
						||
  Definir_option(17,'Simulate right mouse click',
 | 
						||
                 'Used to simulate a click with the right mouse button..',
 | 
						||
                 'It''s very useful when you want a ultra-high precision.',
 | 
						||
                 true,$0139);  {Shift + Space}
 | 
						||
  Definir_option(18,'Show/hide option menu',
 | 
						||
                 'Switch the tool bar display on/off.',
 | 
						||
                 'This hot-key cannot be removed.',
 | 
						||
                 false,$0044); {F10}
 | 
						||
  Definir_option(19,'Show/hide cursor',
 | 
						||
                 'Switch the cursor display on/off.',
 | 
						||
                 'This only works on the "small cross" and "hand" cursors.',
 | 
						||
                 true,$0043);  {F9}
 | 
						||
  Definir_option(20,'Set paintbrush to 1 pixel',
 | 
						||
                 'Useful when you want to use a "single-pixel-brush".',
 | 
						||
                 '',
 | 
						||
                 true,$0053);  {Del}
 | 
						||
  Definir_option(21,'Paintbrush choice',
 | 
						||
                 'Opens a menu where you can choose a paintbrush out of 24 predefined ones.',
 | 
						||
                 '',
 | 
						||
                 true,$003E);  {F4}
 | 
						||
  Definir_option(22,'Monochrome brush',
 | 
						||
                 'Turn your current user-defined brush into a single colored one.',
 | 
						||
                 'All non-transparent colors are set to current foreground color.',
 | 
						||
                 true,$0157);  {Shift + F4}
 | 
						||
  Definir_option(23,'Freehand drawing',
 | 
						||
                 'Set the drawing mode to the classical freehand one.',
 | 
						||
                 '',
 | 
						||
                 true,$0020);  {D}
 | 
						||
  Definir_option(24,'Switch freehand drawing mode',
 | 
						||
                 'Switch between the 3 ways to use freehand drawing.',
 | 
						||
                 'These modes are: continuous, discontinuous and point by point.',
 | 
						||
                 true,$0120);  {Shift + D}
 | 
						||
  Definir_option(25,'Continuous freehand drawing',
 | 
						||
                 'Switch directly to continuous freehand drawing mode.',
 | 
						||
                 '',
 | 
						||
                 true,$0220);  {Ctrl + D}
 | 
						||
  Definir_option(26,'Line',
 | 
						||
                 'Allows you to draw lines.',
 | 
						||
                 '',
 | 
						||
                 true,$0026);  {L}
 | 
						||
  Definir_option(27,'Knotted lines',
 | 
						||
                 'Allows you to draw linked lines.',
 | 
						||
                 'This mode can also be called "Polyline".',
 | 
						||
                 true,$0126);  {Shift + L}
 | 
						||
  Definir_option(28,'Spray',
 | 
						||
                 'Allows you to spray brushes randomly in the picture.',
 | 
						||
                 '',
 | 
						||
                 true,$001E);  {A (Q en AZERTY)}
 | 
						||
  Definir_option(29,'Spray menu',
 | 
						||
                 'Opens a menu in which you can configure the spray flow and size.',
 | 
						||
                 '',
 | 
						||
                 true,$011E);  {Shift + A}
 | 
						||
  Definir_option(30,'Flood-fill',
 | 
						||
                 'Allows you to fill an area of the picture made of pixels of the same color.',
 | 
						||
                 '',
 | 
						||
                 true,$0021);  {F}
 | 
						||
  Definir_option(124,'Replace color',
 | 
						||
                 'Allows you to replace all the pixels of the color pointed by the mouse with',
 | 
						||
                 'the fore-color or the back-color.',
 | 
						||
                 true,$0121);  {Shift + F}
 | 
						||
  Definir_option(31,'B‚zier''s curves',
 | 
						||
                 'Allows you to draw B‚zier''s curves.',
 | 
						||
                 '',
 | 
						||
                 true,$0017);  {I}
 | 
						||
  Definir_option(32,'B‚zier''s curve with 3 or 4 points',
 | 
						||
                 'Allows you to choose whether you want to draw B‚zier''s curves with 3 or 4',
 | 
						||
                 'points.',
 | 
						||
                 true,$0117);  {Shift + I}
 | 
						||
  Definir_option(33,'Empty rectangle',
 | 
						||
                 'Allows you to draw a rectangle using the brush.',
 | 
						||
                 '',
 | 
						||
                 true,$0013);  {R}
 | 
						||
  Definir_option(34,'Filled rectangle',
 | 
						||
                 'Allows you to draw a filled rectangle.',
 | 
						||
                 '',
 | 
						||
                 true,$0113);  {Shift + R}
 | 
						||
  Definir_option(35,'Empty circle',
 | 
						||
                 'Allows you to draw a circle using the brush.',
 | 
						||
                 '',
 | 
						||
                 true,$002E);  {C}
 | 
						||
  Definir_option(36,'Empty ellipse',
 | 
						||
                 'Allows you to draw an ellipse using the brush.',
 | 
						||
                 '',
 | 
						||
                 true,$022E);  {Ctrl + C}
 | 
						||
  Definir_option(37,'Filled circle',
 | 
						||
                 'Allows you to draw a filled circle.',
 | 
						||
                 '',
 | 
						||
                 true,$012E);  {Shift + C}
 | 
						||
  Definir_option(38,'Filled ellipse',
 | 
						||
                 'Allows you to draw a filled ellipse.',
 | 
						||
                 '',
 | 
						||
                 true,$032E);  {Shift + Ctrl + C}
 | 
						||
  Definir_option(39,'Empty polygon',
 | 
						||
                 'Allows you to draw a polygon using the brush.',
 | 
						||
                 '',
 | 
						||
                 true,$0031);  {N}
 | 
						||
  Definir_option(40,'Empty "polyform"',
 | 
						||
                 'Allows you to draw a freehand polygon using the brush.',
 | 
						||
                 '',
 | 
						||
                 true,$0231);  {Ctrl + N}
 | 
						||
  Definir_option(41,'Filled polygon',
 | 
						||
                 'Allows you to draw a filled polygon.',
 | 
						||
                 '',
 | 
						||
                 true,$0131);  {Shift + N}
 | 
						||
  Definir_option(42,'Filled "polyform"',
 | 
						||
                 'Allows you to draw a filled freehand polygon.',
 | 
						||
                 '',
 | 
						||
                 true,$0331);  {Shift + Ctrl + N}
 | 
						||
  Definir_option(43,'Rectangle with gradation',
 | 
						||
                 'Allows you to draw a rectangle with a color gradation.',
 | 
						||
                 '',
 | 
						||
                 true,$0413);  {Alt + R}
 | 
						||
  Definir_option(44,'Gradation menu',
 | 
						||
                 'Allows you to configure the way color gradations are calculated.',
 | 
						||
                 '',
 | 
						||
                 true,$0422);  {Alt + G}
 | 
						||
  Definir_option(45,'Sphere with gradation',
 | 
						||
                 'Allows you to draw a rectangle with a color gradation.',
 | 
						||
                 '',
 | 
						||
                 true,$042E);  {Alt + C}
 | 
						||
  Definir_option(46,'Ellipse with gradation',
 | 
						||
                 'Allows you to draw an ellipse filled with a color gradation.',
 | 
						||
                 '',
 | 
						||
                 true,$052E);  {Shift + Alt + C}
 | 
						||
  Definir_option(47,'Adjust picture',
 | 
						||
                 'Allows you to move the whole picture in order to re-center it.',
 | 
						||
                 'Notice that what gets out from a side reappears on the other.',
 | 
						||
                 true,$004C);  {Kpad5}
 | 
						||
  Definir_option(48,'Flip/shrink picture menu',
 | 
						||
                 'Opens a menu which allows you to flip the picture horizontally/vertically or',
 | 
						||
                 'to shrink it to half-scale horizontally and/or vertically.',
 | 
						||
                 true,$014C);  {Shift + Kpad5}
 | 
						||
  Definir_option(49,'Drawing effects',
 | 
						||
                 'Opens a menu where you can enable/disable and configure the drawing effects',
 | 
						||
                 'listed below.',
 | 
						||
                 true,$0012);  {E}
 | 
						||
  Definir_option(50,'Shade mode',
 | 
						||
                 'Allows you to shade or lighten some pixels of the picture belonging to a',
 | 
						||
                 'color range, in addition of any drawing tool.',
 | 
						||
                 true,$003F);  {F5}
 | 
						||
  Definir_option(51,'Shade menu',
 | 
						||
                 'Opens a menu where you can choose color ranges to use with the Shade mode.',
 | 
						||
                 'This menu also contains parameters used both in Shade and Quick-shade modes.',
 | 
						||
                 true,$0158);  {Shift + F5}
 | 
						||
  Definir_option(131,'Quick-shade mode',
 | 
						||
                 'Does the same thing as shade mode with a simpler method (faster to define',
 | 
						||
                 'but a bit less powerful).',
 | 
						||
                 true,$0262);  {Ctrl + F5}
 | 
						||
  Definir_option(132,'Quick-shade menu',
 | 
						||
                 'Opens a menu where you can define the parameters of the quick-shade mode.',
 | 
						||
                 '',
 | 
						||
                 true,$0362);  {Shift + Ctrl + F5}
 | 
						||
  Definir_option(52,'Stencil mode',
 | 
						||
                 'Allows you to mask colors that must not be affected when you are drawing.',
 | 
						||
                 '',
 | 
						||
                 true,$0040);  {F6}
 | 
						||
  Definir_option(53,'Stencil menu',
 | 
						||
                 'Opens a menu where you can choose colors masked by the Stencil mode.',
 | 
						||
                 '',
 | 
						||
                 true,$0159);  {Shift + F6}
 | 
						||
  Definir_option(54,'Mask mode',
 | 
						||
                 'Allows you to mask colors of the spare page that will keep you from ',
 | 
						||
                 'drawing. This mode should be called "True stencil".',
 | 
						||
                 true,$046D);  {Alt + F6}
 | 
						||
  Definir_option(55,'Mask menu',
 | 
						||
                 'Opens a menu where you can choose colors for the Mask mode.',
 | 
						||
                 '',
 | 
						||
                 true,$056D);  {Shift + Alt + F6}
 | 
						||
  Definir_option(56,'Grid mode',
 | 
						||
                 'Force the cursor to snap up grid points.',
 | 
						||
                 '',
 | 
						||
                 true,$0022);  {G}
 | 
						||
  Definir_option(57,'Grid menu',
 | 
						||
                 'Open a menu where you can configure the grid used by Grid mode.',
 | 
						||
                 '',
 | 
						||
                 true,$0122);  {Shift + G}
 | 
						||
  Definir_option(58,'Sieve mode',
 | 
						||
                 'Only draws pixels on certain positions matching with a sieve.',
 | 
						||
                 '',
 | 
						||
                 true,$0222);  {Ctrl + G}
 | 
						||
  Definir_option(59,'Sieve menu',
 | 
						||
                 'Opens a menu where you can configure the sieve.',
 | 
						||
                 '',
 | 
						||
                 true,$0322);  {Shift + Ctrl + G}
 | 
						||
  Definir_option(60,'Invert sieve',
 | 
						||
                 'Inverts the pattern defined in the Sieve menu.',
 | 
						||
                 '',
 | 
						||
                 true,$0622);  {Ctrl + Alt + G}
 | 
						||
  Definir_option(61,'Colorize mode',
 | 
						||
                 'Allows you to colorize the pixels on which your brush is pasted.',
 | 
						||
                 'This permits you to make transparency effects.',
 | 
						||
                 true,$0041);  {F7}
 | 
						||
  Definir_option(62,'Colorize menu',
 | 
						||
                 'Opens a menu where you can give the opacity percentage for Colorize mode.',
 | 
						||
                 '',
 | 
						||
                 true,$015A);  {Shift + F7}
 | 
						||
  Definir_option(63,'Smooth mode',
 | 
						||
                 'Soften pixels on which your brush is pasted.',
 | 
						||
                 '',
 | 
						||
                 true,$0042);  {F8}
 | 
						||
  Definir_option(123,'Smooth menu',
 | 
						||
                 'Opens a menu where you can define the Smooth matrix.',
 | 
						||
                 '',
 | 
						||
                 true,$015B);  {Shift + F8}
 | 
						||
  Definir_option(64,'Smear mode',
 | 
						||
                 'Smears the pixels when you move your brush on the picture.',
 | 
						||
                 '',
 | 
						||
                 true,$046F);  {Alt + F8}
 | 
						||
  Definir_option(65,'Tiling mode',
 | 
						||
                 'Puts parts of the brush where you draw.',
 | 
						||
                 '',
 | 
						||
                 true,$0430);  {Alt + B}
 | 
						||
  Definir_option(66,'Tiling menu',
 | 
						||
                 'Opens a menu where you can configure the origin of the tiling.',
 | 
						||
                 '',
 | 
						||
                 true,$0530);  {Shift + Alt + B}
 | 
						||
  Definir_option(67,'Classical brush grabbing',
 | 
						||
                 'Allows you to pick a brush defined within a rectangle.',
 | 
						||
                 '',
 | 
						||
                 true,$0030);  {B}
 | 
						||
  Definir_option(68,'"Lasso" brush grabbing',
 | 
						||
                 'Allows you to pick a brush defined within a freehand polygon.',
 | 
						||
                 '',
 | 
						||
                 true,$0230);  {Ctrl + B}
 | 
						||
  Definir_option(69,'Get previous brush back',
 | 
						||
                 'Restore the last user-defined brush.',
 | 
						||
                 '',
 | 
						||
                 true,$0130);  {Shift + B}
 | 
						||
  Definir_option(70,'Horizontal brush flipping',
 | 
						||
                 'Reverse brush horizontally.',
 | 
						||
                 '',
 | 
						||
                 true,$002D);  {X}
 | 
						||
  Definir_option(71,'Vertical brush flipping',
 | 
						||
                 'Reverse brush vertically.',
 | 
						||
                 '',
 | 
						||
                 true,$0015);  {Y}
 | 
						||
  Definir_option(72,'90ø brush rotation',
 | 
						||
                 'Rotate the user-defined brush by 90ø (counter-clockwise).',
 | 
						||
                 '',
 | 
						||
                 true,$002C);  {Z (W en AZERTY)}
 | 
						||
  Definir_option(73,'180ø brush rotation',
 | 
						||
                 'Rotate the user-defined brush by 180ø.',
 | 
						||
                 '',
 | 
						||
                 true,$012C);  {Shift + Z}
 | 
						||
  Definir_option(74,'Strech brush',
 | 
						||
                 'Allows you to resize the user-defined brush.',
 | 
						||
                 '',
 | 
						||
                 true,$001F);  {S}
 | 
						||
  Definir_option(75,'Distort brush',
 | 
						||
                 'Allows you to distort the user-defined brush.',
 | 
						||
                 '',
 | 
						||
                 true,$011F);  {Shift + S}
 | 
						||
  Definir_option(76,'Outline brush',
 | 
						||
                 'Outlines the user-defined brush with the fore color.',
 | 
						||
                 '',
 | 
						||
                 true,$0018);  {O}
 | 
						||
  Definir_option(77,'Nibble brush',
 | 
						||
                 'Deletes the borders of the user-defined brush.',
 | 
						||
                 'This does the opposite of the Outline option.',
 | 
						||
                 true,$0118);  {Shift + O}
 | 
						||
  Definir_option(78,'Get colors from brush',
 | 
						||
                 'Copy colors of the spare page that are used in the brush.',
 | 
						||
                 '',
 | 
						||
                 true,$0085);  {F11}
 | 
						||
  Definir_option(79,'Recolorize brush',
 | 
						||
                 'Recolorize pixels of the user-defined brush in order to get a brush which',
 | 
						||
                 'looks like the one grabbed in the spare page.',
 | 
						||
                 true,$0086);  {F12}
 | 
						||
  Definir_option(80,'Rotate by any angle',
 | 
						||
                 'Rotate the brush by an angle that you can define.',
 | 
						||
                 '',
 | 
						||
                 true,$0011);  {W (Z en AZERTY)}
 | 
						||
  Definir_option(81,'Pipette',
 | 
						||
                 'Allows you to copy the color of a pixel in the picture into the foreground',
 | 
						||
                 'or background color.',
 | 
						||
                 true,$0029);  {`~ (Touche sous le Esc - ý en AZERTY)}
 | 
						||
  Definir_option(82,'Swap foreground/background colors',
 | 
						||
                 'Invert foreground and background colors.',
 | 
						||
                 '',
 | 
						||
                 true,$0129);  {Shift + `~}
 | 
						||
  Definir_option(83,'Magnifier mode',
 | 
						||
                 'Allows you to zoom into the picture.',
 | 
						||
                 '',
 | 
						||
                 true,$0032);  {M (,? sur AZERTY)}
 | 
						||
  Definir_option(84,'Zoom factor menu',
 | 
						||
                 'Opens a menu where you can choose a magnifying factor.',
 | 
						||
                 '',
 | 
						||
                 true,$0132);  {Shift + M}
 | 
						||
  Definir_option(85,'Zoom in',
 | 
						||
                 'Increase magnifying factor.',
 | 
						||
                 '',
 | 
						||
                 true,$004E);  {Grey +}
 | 
						||
  Definir_option(86,'Zoom out',
 | 
						||
                 'Decrease magnifying factor.',
 | 
						||
                 '',
 | 
						||
                 true,$004A);  {Grey -}
 | 
						||
  Definir_option(87,'Brush effects menu',
 | 
						||
                 'Opens a menu which proposes different effects on the user-defined brush.',
 | 
						||
                 '',
 | 
						||
                 true,$0630);  {Ctrl + Alt + B}
 | 
						||
  Definir_option(88,'Text',
 | 
						||
                 'Opens a menu which permits you to type in a character string and to choose a',
 | 
						||
                 'font, and then creates a new user-defined brush fitting to your choices.',
 | 
						||
                 true,$0014);  {T}
 | 
						||
  Definir_option(89,'Screen resolution menu',
 | 
						||
                 'Opens a menu where you can choose the dimensions of the screen in which you',
 | 
						||
                 'want to draw among the numerous X and SVGA proposed modes.',
 | 
						||
                 true,$001C);  {Enter}
 | 
						||
  Definir_option(90,'"Safety" resolution',
 | 
						||
                 'Set resolution to 320x200. This can be useful if you choosed a resolution',
 | 
						||
                 'that is not supported by your monitor and video card. Cannot be removed.',
 | 
						||
                 false,$011C); {Shift + Enter}
 | 
						||
  Definir_option(91,'Help and credits',
 | 
						||
                 'Opens a window where you can get information about the program.',
 | 
						||
                 '',
 | 
						||
                 true,$003B);  {F1}
 | 
						||
  Definir_option(92,'Statistics',
 | 
						||
                 'Displays miscellaneous more or less useful information.',
 | 
						||
                 '',
 | 
						||
                 true,$0154);  {Shift + F1}
 | 
						||
  Definir_option(93,'Jump to spare page',
 | 
						||
                 'Swap current page and spare page.',
 | 
						||
                 '',
 | 
						||
                 true,$000F);  {Tab}
 | 
						||
  Definir_option(94,'Copy current page to spare page',
 | 
						||
                 'Copy current page to spare page.',
 | 
						||
                 '',
 | 
						||
                 true,$010F);  {Shift + Tab}
 | 
						||
  Definir_option(95,'Save picture as...',
 | 
						||
                 'Opens a file-selector that allows you to save your picture with a new',
 | 
						||
                 'path-name.',
 | 
						||
                 true,$003C);  {F2}
 | 
						||
  Definir_option(96,'Save picture',
 | 
						||
                 'Saves your picture with the last name you gave it.',
 | 
						||
                 '',
 | 
						||
                 true,$0155);  {Shift + F2}
 | 
						||
  Definir_option(97,'Load picture',
 | 
						||
                 'Opens a file-selector that allows you to load a new picture.',
 | 
						||
                 '',
 | 
						||
                 true,$003D);  {F3}
 | 
						||
  Definir_option(98,'Re-load picture',
 | 
						||
                 'Re-load the current picture.',
 | 
						||
                 'This allows you to cancel modifications made since last saving.',
 | 
						||
                 true,$0156);  {Shift + F3}
 | 
						||
  Definir_option(99,'Save brush',
 | 
						||
                 'Opens a file-selector that allows you to save your current user-defined',
 | 
						||
                 'brush.',
 | 
						||
                 true,$025F);  {Ctrl + F2}
 | 
						||
  Definir_option(100,'Load brush',
 | 
						||
                 'Opens a file-selector that allows you to load a brush.',
 | 
						||
                 '',
 | 
						||
                 true,$0260);  {Ctrl + F3}
 | 
						||
  Definir_option(101,'Settings',
 | 
						||
                 'Opens a menu which permits you to set the dimension of your picture, and to',
 | 
						||
                 'modify some parameters of the program.',
 | 
						||
                 true,$015D);  {Shift + F10}
 | 
						||
  Definir_option(102,'Undo (Oops!)',
 | 
						||
                 'Cancel the last action which modified the picture. This has no effect after',
 | 
						||
                 'a jump to the spare page, loading a picture or modifying its size.',
 | 
						||
                 true,$0016);  {U}
 | 
						||
  Definir_option(103,'Redo',
 | 
						||
                 'Redo the last undone action. This has no effect after a jump to the spare',
 | 
						||
                 'page, loading a picture or modifying its size.',
 | 
						||
                 true,$0116);  {Shift + U}
 | 
						||
  Definir_option(133,'Kill',
 | 
						||
                 'Kills the current page. It actually removes the current page from the list',
 | 
						||
                 'of "Undo" pages.',
 | 
						||
                 true,$0153);  {Shift + Suppr}
 | 
						||
  Definir_option(104,'Clear page',
 | 
						||
                 'Clears the picture with the first color of the palette (usually black).',
 | 
						||
                 '',
 | 
						||
                 true,$000E);  {BackSpace}
 | 
						||
  Definir_option(105,'Clear page with backcolor',
 | 
						||
                 'Clears the picture with the backcolor.',
 | 
						||
                 '',
 | 
						||
                 true,$010E);  {Shift + BackSpace}
 | 
						||
  Definir_option(106,'Quit program',
 | 
						||
                 'Allows you to leave the program.',
 | 
						||
                 'If modifications were not saved, confirmation is asked.',
 | 
						||
                 false,$0010);  {Q (A en AZERTY)}
 | 
						||
  Definir_option(107,'Palette menu',
 | 
						||
                 'Opens a menu which allows you to modify the current palette.',
 | 
						||
                 '',
 | 
						||
                 true,$0019);  {P}
 | 
						||
  Definir_option(125,'Secondary palette menu',
 | 
						||
                 'Opens a menu which allows you to define color series and some tagged colors.',
 | 
						||
                 '',
 | 
						||
                 true,$0119);  {Shift + P}
 | 
						||
  Definir_option(130,'Exclude colors menu',
 | 
						||
                 'Opens a menu which allows you to define the colors you don''t want to use in',
 | 
						||
                 'modes such as Smooth and Transparency, or when remapping a brush.',
 | 
						||
                 true,$0219);  {Ctrl + P}
 | 
						||
  Definir_option(108,'Scroll palette to the left',
 | 
						||
                 'Scroll palette in the tool bar to the left, column by column.',
 | 
						||
                 '',
 | 
						||
                 true,$0049);  {PgUp}
 | 
						||
  Definir_option(109,'Scroll palette to the right',
 | 
						||
                 'Scroll palette in the tool bar to the right, column by column.',
 | 
						||
                 '',
 | 
						||
                 true,$0051);  {PgDn}
 | 
						||
  Definir_option(110,'Scroll palette to the left faster',
 | 
						||
                 'Scroll palette in the tool bar to the left, 8 columns by 8 columns.',
 | 
						||
                 '',
 | 
						||
                 true,$0149);  {Shift + PgUp}
 | 
						||
  Definir_option(111,'Scroll palette to the right faster',
 | 
						||
                 'Scroll palette in the tool bar to the right, 8 columns by 8 columns.',
 | 
						||
                 '',
 | 
						||
                 true,$0151);  {Shift + PgDn}
 | 
						||
  Definir_option(112,'Center brush attachment point',
 | 
						||
                 'Set the attachement of the user-defined brush to its center.',
 | 
						||
                 '',
 | 
						||
                 true,$028F);  {Ctrl + 5 (pav‚ num‚rique)}
 | 
						||
  Definir_option(113,'Top-left brush attachment point',
 | 
						||
                 'Set the attachement of the user-defined brush to its top-left corner.',
 | 
						||
                 '',
 | 
						||
                 true,$0277);  {Ctrl + 7}
 | 
						||
  Definir_option(114,'Top-right brush attachment point',
 | 
						||
                 'Set the attachement of the user-defined brush to its top-right corner.',
 | 
						||
                 '',
 | 
						||
                 true,$0284);  {Ctrl + 9}
 | 
						||
  Definir_option(115,'Bottom-left brush attachment point',
 | 
						||
                 'Set the attachement of the user-defined brush to its bottom-left corner.',
 | 
						||
                 '',
 | 
						||
                 true,$0275);  {Ctrl + 1}
 | 
						||
  Definir_option(116,'Bottom-right brush attachment point',
 | 
						||
                 'Set the attachement of the user-defined brush to its bottom-right corner.',
 | 
						||
                 '',
 | 
						||
                 true,$0276);  {Ctrl + 3}
 | 
						||
  Definir_option(117,'Next foreground color',
 | 
						||
                 'Set the foreground color to the next in the palette.',
 | 
						||
                 '',
 | 
						||
                 true,$001B);  {] ($ en AZERTY)}
 | 
						||
  Definir_option(118,'Previous foreground color',
 | 
						||
                 'Set the foreground color to the previous in the palette.',
 | 
						||
                 '',
 | 
						||
                 true,$001A);  {[ (^ en AZERTY)}
 | 
						||
  Definir_option(119,'Next background color',
 | 
						||
                 'Set the background color to the next in the palette.',
 | 
						||
                 '',
 | 
						||
                 true,$011B);  {Shift + ]}
 | 
						||
  Definir_option(120,'Previous background color',
 | 
						||
                 'Set the background color to the previous in the palette.',
 | 
						||
                 '',
 | 
						||
                 true,$011A);  {Shift + [}
 | 
						||
  Definir_option(126,'Next user-defined forecolor',
 | 
						||
                 'Set the foreground color to the next in the user-defined color series.',
 | 
						||
                 '',
 | 
						||
                 true,$000D);  {'=+'}
 | 
						||
  Definir_option(127,'Previous user-defined forecolor',
 | 
						||
                 'Set the foreground color to the previous in the user-defined color series.',
 | 
						||
                 '',
 | 
						||
                 true,$000C);  {'-_' (')ø' en AZERTY}
 | 
						||
  Definir_option(128,'Next user-defined backcolor',
 | 
						||
                 'Set the background color to the next in the user-defined color series.',
 | 
						||
                 '',
 | 
						||
                 true,$010D);  {Shift + '=+'}
 | 
						||
  Definir_option(129,'Previous user-defined backcolor',
 | 
						||
                 'Set the background color to the previous in the user-defined color series.',
 | 
						||
                 '',
 | 
						||
                 true,$010C);  {Shift + '-_' (')ø' en AZERTY}
 | 
						||
  Definir_option(121,'Shrink paintbrush',
 | 
						||
                 'Decrease the width of the paintbrush if it is special circle or square.',
 | 
						||
                 '',
 | 
						||
                 true,$0033);  {,< (;. en AZERTY)}
 | 
						||
  Definir_option(122,'Enlarge paintbrush',
 | 
						||
                 'Increase the width of the paintbrush if it is special circle or square.',
 | 
						||
                 '',
 | 
						||
                 true,$0034);  {.> (:/ en AZERTY)}
 | 
						||
  NB_OPTIONS:=Numero_definition_option-1;
 | 
						||
 | 
						||
  assign(Fichier_INI,'GFX2.INI');
 | 
						||
  {$I-}
 | 
						||
  reset(Fichier_INI,1);
 | 
						||
  {$I+}
 | 
						||
  if IOresult<>0 then {Si GFX2.INI est absent, on l'extrait de GFX2.DAT}
 | 
						||
    Erreur:=Recreer_INI
 | 
						||
  else
 | 
						||
    close(Fichier_INI);
 | 
						||
 | 
						||
  if not Erreur then Interpretation_du_fichier_config;
 | 
						||
 | 
						||
  Initialiser_config:=Erreur;
 | 
						||
end;
 | 
						||
 | 
						||
 | 
						||
{------------------- Enregistrement de la configuration ---------------------}
 | 
						||
procedure Enregistrer_config;
 | 
						||
var
 | 
						||
    Fichier:file;
 | 
						||
    Indice:word;
 | 
						||
    Octet:byte;
 | 
						||
begin
 | 
						||
  if Choix_enreg=1 then {Enregistrement des touches (si souhait‚)}
 | 
						||
  begin
 | 
						||
    assign(Fichier,'GFX2.CFG');
 | 
						||
    reset(Fichier,1);
 | 
						||
 | 
						||
    seek(Fichier,sizeof(Type_header)+Sizeof(Type_chunk)); {Positionnement sur la 1Šre touche}
 | 
						||
 | 
						||
    for Indice:=1 to NB_OPTIONS do
 | 
						||
      blockwrite(Fichier,Config[Indice],sizeof(Type_infos_touche)); {Les 3 premiers champs (words) sont: Num‚ro,Touche,Touche2}
 | 
						||
 | 
						||
    close(Fichier);
 | 
						||
  end;
 | 
						||
end;
 | 
						||
 | 
						||
{---------- V‚rifier qu'on peut ‚crire sur le lecteur de lancement ----------}
 | 
						||
function Verifier_ecriture_possible:boolean;
 | 
						||
var
 | 
						||
    Fichier:file;
 | 
						||
begin
 | 
						||
  assign(Fichier,'GFX2.$$$');
 | 
						||
  {$I-}
 | 
						||
  rewrite(Fichier,1);
 | 
						||
  close(Fichier);
 | 
						||
  erase(Fichier);
 | 
						||
  {$I+}
 | 
						||
  Verifier_ecriture_possible:=(IOresult=0);
 | 
						||
end;
 | 
						||
 | 
						||
{============================================================================}
 | 
						||
var
 | 
						||
    Keyb_mode:byte;
 | 
						||
 | 
						||
begin
 | 
						||
  if Verifier_ecriture_possible then
 | 
						||
  begin
 | 
						||
 | 
						||
    asm
 | 
						||
      mov  ax,0AD83h
 | 
						||
      int  2Fh
 | 
						||
      mov  Keyb_mode,bl
 | 
						||
      mov  ax,0AD82h
 | 
						||
      xor  bl,bl
 | 
						||
      int  2Fh
 | 
						||
    end;
 | 
						||
 | 
						||
    Text_mode_80x50;
 | 
						||
    Cacher_curseur;
 | 
						||
    Dessiner_ecran_principal;
 | 
						||
    if not Initialiser_config then
 | 
						||
    begin
 | 
						||
      Setup;
 | 
						||
      Enregistrer_config;
 | 
						||
 | 
						||
      Text_mode_80x25;
 | 
						||
      Montrer_curseur;
 | 
						||
 | 
						||
      asm
 | 
						||
        mov  ax,0AD82h
 | 
						||
        mov  bl,Keyb_mode
 | 
						||
        int  2Fh
 | 
						||
      end;
 | 
						||
 | 
						||
      halt(0);
 | 
						||
    end
 | 
						||
    else
 | 
						||
    begin
 | 
						||
      Text_mode_80x25;
 | 
						||
      writeln('Error reading GFX2.DAT! This file is either absent or corrupt.');
 | 
						||
      Montrer_curseur;
 | 
						||
 | 
						||
      asm
 | 
						||
        mov  ax,0AD82h
 | 
						||
        mov  bl,Keyb_mode
 | 
						||
        int  2Fh
 | 
						||
      end;
 | 
						||
      halt(1);
 | 
						||
    end;
 | 
						||
  end
 | 
						||
  else
 | 
						||
  begin
 | 
						||
    writeln('Error: You mustn''t run this setup program from a read-only drive!');
 | 
						||
    writeln;
 | 
						||
    writeln('The most probable cause of this error is that you are either running this');
 | 
						||
    writeln('program from a CD-ROM or a protected floppy disk.');
 | 
						||
    writeln('You should try to copy all the files of GrafX 2.00 on a hard drive, or to');
 | 
						||
    writeln('unprotect your floppy disk if you really want to run it from this medium.');
 | 
						||
    halt(1);
 | 
						||
  end;
 | 
						||
end.
 |