Voici le code des fonctions _malloc et _free à placer dans le fichier qtsi1.cpp :

// ************************ _malloc ***********************
// Allocation de la mémoire (même fonction que malloc du C)
// ********************************************************

void *_malloc(size_t longueur)
{
GLOBALHANDLE hBuffer;
void *retour;

hBuffer=GlobalAlloc(GHND,longueur);
if (hBuffer && (retour=(void *)GlobalLock(hBuffer))==NULL)
   return NULL;
else
   {
   g_nb_alloc++;
   return retour;   
   }
}

// ******************** _free ******************
// Libère la mémoire
// *********************************************

void _free(void *block)
{
GLOBALHANDLE hBuffer;

hBuffer=GlobalHandle(block);
GlobalUnlock(hBuffer);
GlobalFree(hBuffer);
g_nb_free++;
}

Nous devons à présent écrire un petit script Tcl qui va permettre d'appeler la fonction qm_window efficacement (utilisez pour cela un petite traitement de texte comme WordPad) :

#############################
# Q_WINDOW
# Syntaxe     : q_window x1 y1 x2 y2
# Description : Modifie l'échelle d'une image
#############################
proc q_window {} {
   global audace

   if {[llength $audace(box)] == 4} {
     qm_window [lindex $audace(box) 0] [lindex $audace(box) 1] [lindex $audace(box) 2] [lindex $audace(box) 3]
     image delete image0
     image create photo image0
     visu$audace(visuNo) disp
   } else {
   error "Select first a zone on the image"
   }
}

Sauvegardez ce script sous le nom qm.tcl (par exemple) dans le répertoire du logiciel AUDACE.

Ce simple script permet d'exploiter la fonction de fenêtrage intéractivement : vous définissez un rectangle dans l'image (en glissant avec la souris tout en appuyant sur le bouton gauche), puis vous tapez la commande q_window depuis la console.

Le fonction q_window qui est définie dans le script vérifie tout d'abord que vous avez bien défini un rectangle dans l'image (les coordonnées de ce rectangle sont situées dans la variable liste audace(box)). Les coordonnées des deux coins opposés du rectangle sont passées ensuite à la fonction qm_window qui se situe dans votre bibliothèque. Pour finir, l'image modifiée est est affichée à l'écran.

D'une manière générale il est opportun d'appeler vos fonctions C depuis un script Tcl qui est propre à votre bibliothèque. Par exemple pour la fonction offset vous pourriez ajouter le script suivant dans le fichier qm.tcl :

#############################
# Q_OFFSET
# Syntaxe     : q_offset value
# Description : Ajoute une constante à tous les pixels
#############################
proc q_offset {args} {
   global audace

   if {[llength $args] == 1} {
      qm_offset [lindex $args 0]
      visu$audace(visuNo) disp
   } else {
      error "q_offset value"
   }
}

Ainsi pour additionner une constante à une image vous pouvez faire :

q_offset 500

au lieu de :

qm_offset 500

La première manière enchaîne automatiquement une visualisation à la suite du calcul d'offset.

Pour rendre accessibles toutes les fonctions de votre librairie il suffit de charger votre fichier de script qm.tcl depuis AUDACE. Pour cela éditez le fichier aud.tcl et au tout debut ajoutez la ligne :

source qm.tcl

Les premières lignes de aud.tcl vont donc ressembler à ceci :

source combobox.tcl
source notebook.tcl
source menu.tcl
#--- Fichiers de audace.
source aud1.tcl
source aud2.tcl
source aud3.tcl
source aud4.tcl
source console.tcl
source confeditscript.tcl
source newscript.tcl
source focus.tcl
source confcam.tcl
source conftel.tcl
#--- Librairie qm.
source qm.tcl

Lorsque vous distribuez votre librairie il faudra donc fournir les fichiers qm.tcl et libqm.dll.

A vous de faire vivre à présent le langage Tcl en y ajoutant toutes les fonctions de votre choix !

 

                      (4/4)