Obligement - L'Amiga au maximum

Jeudi 21 mars 2019 - 01:00  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles en d'autres langues


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Logiciels
 · Jeux
 · Scène démo
 · Divers


Jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


Programmation : C - Les gadgets proportionnels
(Article écrit par Pascal Amiable et extrait d'Amiga News Tech - juin 1991)


Après avoir fait connaissance avec les gadgets booléeens et les gadgets de chaînes, nous allons étudier ce mois-ci les gadgets proportionnels. Et pour illustrer tout cela, je vous propose un programme de palette pour faire varier les couleurs du Workbench.

Le gadget proportionnel est, à mon avis, l'objet le plus flexible et le plus intuitif pour la saisie de données numériques, que l'on puisse trouver sur Amiga. Qu'ils soient fonction d'une ou plusieurs variables, ces gadgets permettent de saisir une valeur discrète comprise entre deux bornes fixées par le programmeur. Par exemple, dans un programme permettant de changer les couleurs de l'écran, les bornes inférieure et supérieure sont respectivement 0 et 15, l'intervalle entre deux valeurs (le pas de "déplacement") étant de 1.

Mais l'intérêt d'un tel gadget ne s'arrête pas là, puisqu'il permet également de donner à l'utilisateur des informations sur la valeur de telle ou telle donnée, ou une proportion de cette donnée par rapport à une autre. Par exemple, sur mon traitement de texte, au moment où j'écris cet article, le gadget proportionnel situé sur le côté m'indique en permanence la taille de mon document et la position du curseur dans celui-ci, et ce de manière beaucoup plus intuitive qu'une série de chiffres.

Un gadget proportionnel est, pour Intuition, un gadget de type spécial, comme l'était le gadget de saisie de chaîne de caractères du mois dernier. Nous allons donc associer à la structure gadget classique une structure spéciale dénommée "PropInfo".

La première chose à faire pour créer ce type de gadget est d'indiquer dans le champ "GadgetType" le drapeau PROPGADGET.

Ensuite, on indique dans le champ "SpecialInfo" l'adresse de la structure "PropInfo" associée au gadget. Cette structure "PropInfo" contient les données suivantes :

C

Voyons maintenant comment sont utilisés les différents champs de cette structure. Nous prendrons comme exemple le potentiomètre gérant une des couleurs de la palette.

La première chose qu'il faut indiquer à Intuition dans le champ "Flag", c'est de n'autoriser la variation que suivant la verticale. Pour ce faire on positionne le drapeau FREEVERT. On positionne également le drapeau AUTOKNOB afin de laisser Intuition gérer la taille du curseur de déplacement.

Il nous faut maintenant indiquer à Intuition l'incrément du potentiomètre. Il est codé sur 16 bits, c'est-à-dire que la valeur d'incrément doit être ramenée sur 16 bits. Pour notre exemple, l'incrément est de 1/16, on précisera donc dans le champ "VertBody" 0xFFFF/16 soit 4096. Comme le déplacement horizontal est interdit, on indiquera -1 dans le champ "VertBody".

On initialisera le champ "HorizPot" à -1 (déplacement interdit suivant X) et "VertPot" à la valeur de la couleur, multipliée par 4096 (exemple : si la couleur vaut 2, alors "VertPot" vaut 2*4096=8192). Le reste des champs de la structure "PropInfo" est géré par Intuition. On les initialisera à 0 malgré tout.

Gestion des gadgets

Le mois dernier, pour attendre la sélection d'un gadget, nous avons eu recours à une boucle sans fin de type "while(1)". Cette méthode très simple de gérer les actions a pour grave inconvénient de faire tourner à vide le programme lorsqu'aucun gadget n'est sélectionné. Pour éviter cette boucle à vide qui consomme de toute façon du temps processeur, nous allons simplement utiliser la fonction Wait() d'exec.library, qui met la tâche en veille jusqu'à ce que l'argument transmis à la fonction passe à 1. Cet argument est tout simplement le champs fenêtre->UserPort->mp_SigBit, qui vaut 1 lorsqu'une interaction a été effectuée par l'utilisateur, et 0 sinon. Ainsi on ne consomme plus inutilement du temps processeur.

Une fois qu'un signal a été envoyé à notre programme, il s'agit de déterminer quel type d'évènement est survenu. S'il s'agit d'un IntuiMessage, on le récupère avec la fonction GetMsg() et on étudie sa classe (IntuiMessage->Class). Trois cas nous intéressent alors :

GADGETDOWN : dans ce cas, l'utilisateur a sélectionné un des gadgets, on exécute donc la fonction qui lui est associée, suivant la méthode décrite le mois dernier.

CLOSEWINDOW : l'utilisateur veut refermer la palette et terminer le programme. On exécute alors la fonction referme() qui, comme son nom l'indique, clos la fenêtre et les bibliothèques Intuition et Graphics. On positionne également la variable "fin" à 1, terminant ainsi l'exécution du programme.

MOUSEBUTTONS : dans ce cas, l'utilisateur a cliqué avec le bouton gauche de la souris dans la fenêtre. Ce type d'évènement va nous permettre de savoir par une série de quatre tests, si l'utilisateur a sélectionné une couleur et laquelle, ou s'il a simplement cliqué au hasard dans la fenêtre. Lors d'une sélection d'une couleur, on affecte le numéro de couleur à la variable "courant".

Toute autre évènement ne nous intéresse pas, donc on ne fait rien. Comme vous pouvez le voir tout cela est fort simple.

Dernier point sur la gestion des gadgets proportionnels. Lors de la sélection d'une couleur, il faut réinitialiser les potentiomètres des gadgets RVB pour tenir compte de chaque valeur des composantes de couleur. Pour ce faire, on initialise chaque champ "VertPot" des gadgets avec la valeur de la composante rouge, vert, bleu multipliée par 4096, ce qui revient à effectuer un décalage de 12 bits ver la gauche comme suit :

C

Voici décrite la manière dont sont gérés les gadgets. Je vous conseille de vous reporter au programme d'exemple joint en fin d'article pour de plus amples renseignements.

La gestion des couleurs

Nous allons maintenant étudier comment sont gérés les couleurs par l'Amiga. Chaque écran ouvert sous Intuition possède sa propre palette de couleurs dont le nombre est lié, je vous le rappelle, au nombre de bitplanes associés à l'écran. Notre palette sert à modifier les couleurs du Workbench, qui possède en standard deux bitplanes, donc quatre couleurs. On accède à la table des couleurs par le ViewPort de l'écran, son adresse se trouvant dans le champ "ColorMap". La première étape consiste donc à récupérer l'adresse du ViewPort de l'écran à l'aide de la fonction ViewPortAdress :

C

On récupère ensuite l'adresse de la table des couleurs :

C

Cette adresse obtenue, on peut modifier les valeurs de la table et ainsi les couleurs de l'écran. On lit la valeur d'une couleur à l'aide de la fonction GetRGB4() :

C

Une couleur contient trois composantes rouge, vert et bleu. Sur Amiga, la couleur complète est codée sur 16 bits (UWORD). Chaque composante se voit associer 4 bits, soit 12 bits pour les trois. Les 4 bits de poids fort ne sont pas utilisés. Le schéma ci-dessous synthétise cette organisation.

C

Avec :
  • "xx" représente un bit inutilisé.
  • "RR" un bit associé à la composante rouge.
  • "VV" un bit associé à la composante verte.
  • "BB" un bit associé à la composante bleu.
Pour extraire chaque composante de notre mot couleur, on utilisera les formules suivantes :

C

Pour initialiser une couleur de la ColorMap, on utilise la fonction SetRGB4() :

C

A noter qu'il est également possible, comme on peut le voir dans le programme d'exemple, de charger plusieurs couleurs à la fois dans la ColorMap avec LoadRGB4() :

C

Les couleurs sont déclarées dans un tableau de mots de 16 bits :

C

Conclusion

Notre article sur Intuition se termine. Il a certes été plus long que d'habitude, mais un minimum d'explications etait nécessaire pour ce programme.

C
C
C
C
C
C

C


[Retour en haut] / [Retour aux articles] [Article précédent] / [Article suivant]