Section courante

A propos

Section administrative du site

 Langage  Elément  Tutoriel  Compilateur  Emulateur  Aide 
ABAP/4
Ada
Assembleur
Assembly & bytecode
ASP (Active Server Pages)
Basic
C
C++
C# (C Sharp)
Cobol
ColdFusion
Fortran
HTML
Java
JavaScript
LISP
Logo
LotusScript
Oberon
Pascal
Perl
PHP
PL/1
Prolog
Python
Rebol
REXX
Ruby
SAS
NoSQL
SQL
Swift
X++ (Axapta)
GNAT
SMALLAda
VHDL
Assembleur 370
Assembleur 1802
Assembleur 4004
Assembleur 6502
Assembleur 6800
Assembleur 68000
Assembleur 8080 et 8085
Assembleur 8089
Assembleur 80x86
Assembleur AGC4
Assembleur ARM
Assembleur DPS 8000
Assembleur i860
Assembleur Itanium
Assembleur MIPS
Assembleur PDP-11
Assembleur PowerPC
Assembleur RISC-V
Assembleur SPARC
Assembleur SuperH
Assembleur UNIVAC I
Assembleur VAX
Assembleur Z80
Assembleur Z8000
Assembleur z/Architecture
ASSEMBLER/MONITOR 64
Micol Assembler
GFA Assembler
A86
MASM (Macro Assembler)
TASM (Turbo Assembler)
CIL
Jasmin
LLVM
MSIL
Parrot
P-Code (PCode)
SWEET16
G-Pascal
ASP 1.0
ASP 2.0
ASP 3.0
ASP.NET
ASP.NET Core
ABasiC (Amiga)
Adam SmartBASIC
Altair BASIC
AmigaBASIC (Amiga)
AMOS Basic (Amiga)
Atari Basic (Atari 400, 600 XL, 800, 800XL)
Basic Apple II (Integer BASIC/APPLESOFT)
Basic Commodore 64 (CBM-BASIC)
Basic Commodore 128 (BASIC 7.0)
Basic Commodore VIC-20 (CBM-BASIC 2.0)
Basic Coco 1 (Color Basic)
Basic Coco 2 (Extended Color Basic)
Basic Coco 3 (Extended Color Basic 2.0)
BASICA (PC DOS)
Basic Pro
BBC BASIC
Blitz BASIC (Amiga)
DarkBASIC
Dartmouth BASIC
GFA-Basic (Atari ST/Amiga)
GWBASIC (MS-DOS)
Liberty BASIC
Locomotive BASIC (Amstrad CPC)
MSX-Basic
Omikron Basic (Atari ST)
Oric Extended Basic
Power Basic
Quick Basic/QBasic (MS-DOS)
Sinclair BASIC (ZX80, ZX81, ZX Spectrum)
ST BASIC (Atari ST)
Turbo Basic
Vintage BASIC
VBScript
Visual Basic (VB)
Visual Basic .NET (VB .NET)
Visual Basic pour DOS
Yabasic
BeckerBASIC
SIMONS' BASIC
Basic09 d'OS-9
Disk Extended Color Basic
Basic09 d'OS-9
Disk Extended Color Basic
Access
Excel
Visual Basic pour Windows
Visual Basic .NET pour Windows
C Shell Unix (csh)
C pour Amiga
C pour Atari ST
C pour DOS
C pour Falcon030
C pour GEMDOS (Atari ST)
C pour Linux
C pour PowerTV OS
C pour OS/2
C pour Unix
C pour Windows
Aztec C
CoCo-C
GNU C
HiSoft C
IBM C/2
Introl-C
Lattice C
Microsoft C
MinGW C
MSX-C
Open Watcom C
OS-9 C Compiler
Pure C
Quick C
Turbo C
HiSoft C for Atari ST
HiSoft C for CP/M (Amstrad CPC)
C++ pour OS/2
C++ pour Windows
Borland C++
C++Builder
IBM VisualAge C++
Intel C++
MinGW C++
Open Watcom C++
Symantec C++
Turbo C++
Visual C++
Visual C++ .NET
Watcom C++
Zortech C++
C# (C Sharp) pour Windows
Apple III Cobol
Microsoft Cobol
BlueDragon
Lucee
OpenBD
Railo
Smith Project
Microsoft Fortran
WATFOR-77
CSS
FBML
Open Graph
SVG
XML
XSL/XSLT
LESS
SASS
GCJ (GNU)
JSP
Jython
Visual J++
Node.js
TypeScript
AutoLISP
ACSLogo
LotusScript pour Windows
Amiga Oberon
Oberon .NET
Apple Pascal
Delphi/Kylix/Lazarus
Free Pascal
GNU Pascal
HighSpeed Pascal
IBM Personal Computer Pascal
Lisa Pascal
Maxon Pascal
MPW Pascal
OS-9 Pascal
OSS Personal Pascal
Pascal-86
Pascal du Cray Research
Pascal/VS
Pascal-XT
PURE Pascal
QuickPascal
RemObjets Chrome
Sun Pascal
THINK Pascal
Tiny Pascal (TRS-80)
Turbo Pascal
UCSD Pascal
VAX Pascal
Virtual Pascal
Turbo Pascal for CP/M-80
Turbo Pascal for DOS
Turbo Pascal for Macintosh
Turbo Pascal for Windows
CodeIgniter (Cadre d'application)
Drupal (Projet)
Joomla! (Projet)
Phalanger (PHP .NET)
phpBB (Projet)
Smarty (balise)
Twig (balise)
Symfony (Cadre d'application)
WordPress (Projet)
Zend (Cadre d'application)
PL360
PL/M-80
PL/M-86
Turbo Prolog
CPython
IronPython
Jython
PyPy
AREXX
Regina REXX
JMP
Btrieve
Cassandra
Clipper
CouchDB
dBASE
Hbase
Hypertable
MongoDB
Redis
Access
BigQuery
DB2
H2
Interbase
MySQL
Oracle
PostgreSQL
SAP HANA
SQL Server
Sybase
U-SQL
Introduction
Référence des fonctions
Structures en boucle et entrée/sortie de fichiers
Le premier regard sur GEM et le VDI
Lattice C
Pure C
Hatari
Préface
Notes légal
Dictionnaire
Recherche

Le premier regard sur GEM et le VDI

Dans la pager Structures en boucle et entrée/sortie de fichiers, nous avons jeté un bref coup d'oeil sur ce qu'est vraiment GEM. Nous avons indiqué que GEM (Graphics Environment Manager) est composé de nombreuses bibliothèques de fonctions, dont chacune gère certaines parties des activités du système. Ces bibliothèques sont regroupées en deux grandes unités, appelées AES (Applications Environment Services) et VDI (Virtual Device Interface). L'AES contient les fonctions dont nous avons besoin pour gérer les fenêtres, les boîtes de dialogue, les barres de menus et le traitement des événements. Le VDI contrôle la plupart des capacités graphiques du Atari ST, ainsi que certaines fonctions de contrôle de la souris et du curseur.

Présentation du VDI

Le VDI joue un rôle important pour faire fonctionner vos programmes graphiques sur de nombreux appareils différents. Malheureusement, l'un des éléments cruciaux de l'interface graphique, GDOS (Graphics Device Operating System) n'est pas intégré au système d'exploitation actuel. Le GDOS est la partie du VDI reliant les fonctions graphiques aux pilotes nécessaires pour garantir que les graphiques fonctionnent correctement sur tous les périphériques graphiques. Le GDOS permet également de charger différentes polices de caractères dans votre Atari ST, en utilisant les fonctions VDI standard. Pour le moment, cependant, nous ne nous intéressons qu'à un seul périphérique : l'écran.

Les fonctions VDI

Le VDI fournit au programmeur une série de fonctions lui permettant de dessiner rapidement de nombreuses formes graphiques. Cela rend le développement de programmes s'appuyant fortement sur les graphiques un jeu d'enfant. Si vous avez programmé un Atari 8 bits, pensez à tout le travail nécessaire pour dessiner un cercle. Le VDI fournit une fonction dessinant n'importe quel cercle de taille que nous voulons - avec un seul appel. Il existe également des fonctions pour dessiner des ellipses, des lignes, des rectangles, des rectangles arrondis, des arcs, des tranches de tarte et un certain nombre d'autres graphiques utiles.

Et ça ne s'arrête pas là. Chaque fonction graphique a un groupe d'attributs associés pouvant être définis avant que le graphique ne soit dessiné, permettant différents types de lignes, de motifs de remplissage et de couleurs. Lorsque le programme est exécuté, le premier écran affiche les différents types de styles de ligne disponibles via le VDI. Chaque fois que vous appuyez sur une touche, le programme affiche un autre ensemble de graphiques générés par une fonction VDI.

Un exemple de programme

La première chose que nous devons faire lors de l'écriture d'un programme GEM est d'initialiser l'application. Nous le faisons avec l'appel :

  1. appl_init(); 

Cela informe l'AES de notre application et met de côté les ressources dont l'AES a besoin pour fonctionner. Ensuite, nous devons faire l'appel :

  1. handle=graf_handle(&gr_hwchar, &gr_hhchar, &gr_hwbox, &gr_hhbox);

Cela renvoie le handle du périphérique ou du poste de travail actuellement ouvert, ainsi que la taille de la police de caractères système. Parce que GEM est capable d'avoir de nombreux programmes en mémoire à la fois, chacun nécessite une certaine identification, pour empêcher les commandes d'un programme d'en perturber un autre. Ceci est accompli en attribuant à chaque programme un handle. Le handle de variable dans l'appel ci-dessus est une valeur entière identifiant le poste de travail actuel. L'appel graf_handle() renvoie également des informations sur la police de caractères système. Nous devons déclarer quatre variables de type entier pour contenir ces informations, puis passer leurs adresses à la fonction. Dans l'appel ci-dessus, gr_hwchar obtiendra la largeur d'une cellule de caractère en pixels ; gr_hhchar obtiendra la hauteur d'une cellule de caractère en pixels ; gr_hwbox obtiendra la largeur, en pixels, d'une boîte suffisamment grande pour contenir un seul caractère ; et gr_hhbox obtiendra la hauteur, en pixels, d'une boîte suffisamment grande pour contenir un seul caractère.

Le virtuel

L'appel graf_handle() renvoie le handle au poste de travail physique. Ce dont nous avons vraiment besoin pour notre programme, c'est d'un accès à un poste de travail virtuel. Un périphérique particulier peut avoir de nombreux postes de travail virtuels, mais un seul poste de travail physique. Le poste de travail physique est directement associé au périphérique lui-même, généralement l'écran. Vous pouvez considérer un poste de travail virtuel comme un périphérique "simulé". Il possède sa propre section de mémoire et conserve ses données et son état complètement séparés de tous les autres postes de travail virtuels. Lorsque vous activez une application (comme cliquer sur un accessoire de bureau), elle est liée au poste de travail physique. En un sens, il devient le poste de travail physique. Nous obtenons le handle de notre poste de travail virtuel avec l'appel :

  1. v_opnvwk(work_in,&handle,work_out);    

Cette fonction s'attend à ce que les attributs système soient dans le tableau work_in[].

Polylignes

Maintenant que nous avons configuré notre poste de travail, nous pouvons nous mettre au travail. Le premier graphique que nous allons expérimenter s'appelle les polylignes. Ceux d'entre vous maîtrisant la linguistique savent que le préfixe poly signifie beaucoup. Les polylignes sont une ou plusieurs lignes connectées d'un point à un autre, permettant au programmeur de dessiner des formes complexes avec un seul appel de fonction. L'appel de fonction ressemble à ceci :

  1. v_pline(handle,num_pairs,pxy);

Le handle de la variable est, bien sûr, le handle renvoyé par l'appel v_opnvwk(). Chaque fonction que nous utilisons nécessite ce handle. De cette façon, nous sommes sûrs de ne pas jouer avec une autre application pouvant être en mémoire en même temps. Si nous écrivons un accessoire de bureau à utiliser avec un traitement de texte, par exemple, nous voulons être sûrs de ne rien changer à l'application de traitement de texte. Sinon, nous risquons d'avoir un utilisateur irrité, c'est le moins qu'on puisse dire.

Le paramètre pxy est un pointeur vers un tableau d'entiers contenant chacune des extrémités de notre polyligne en paires X,Y. Par exemple, si nous voulions dessiner une boîte, pxy[] pourrait ressembler à ceci :

  1. int pxy[]={24,18,176,18,176,118,24,118,24,18}    

Le paramètre entier num_pairs est le nombre de paires de coordonnées dans le tableau pxy. Au fait, les valeurs pxy sont des valeurs de pixel ; en d'autres termes, dans un écran à faible résolution, nous aurions des valeurs possibles de 0 à 319 pour les coordonnées X et 0 à 199 pour les coordonnées Y. Il existe un certain nombre d'attributs que nous pouvons définir pour chacune des fonctions graphiques VDI. Pour les polylignes, nous pouvons définir la couleur, le type et la largeur, ainsi que le style de fin. Nous définissons la couleur avec :

  1. vsl_color(handle,color);

Ici, la couleur est un entier compris entre 0 et le maximum du périphérique (basse résolution = 15, résolution moyenne = 3 et haute résolution = 1). Si nous utilisons un nombre supérieur au maximum, la fonction passera par défaut à la couleur 1. Sur l'Atari ST, la palette de couleurs par défaut, commençant par 0 et se terminant par 15, est blanc, noir, rouge, vert, bleu, cyan, jaune, magenta, blanc, noir, rouge clair, vert clair, bleu clair, cyan clair, jaune clair et magenta clair. La fonction renverra la valeur de couleur choisie. Si nous dessinons une ligne à la plus petite largeur, nous pouvons choisir entre six types de lignes système avec :

  1. vsl_type(handle,type);

Ici, type est une valeur entière de 1 à 7 comme suit :

Valeur Nom Apparence
1 Solide (solid)
     
2 Tiret long (long dash) -------------------------------------
3 Point (dot)
     
4 Point de tiret (dash dot) -·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-
5 Tiret (dash)
     
6 Tiret point point (dash dot dot) -··-··-··-··-··-··-··-··-··-··-··-··-··
7 Définit par l'utilisateur  

Le type 7 vous permet de configurer vos propres types de lignes. Lorsque vous dessinez des lignes, vous pouvez également choisir un style de fin avec l'appel :

  1. vsl_ends(handle,end1,end2);

Dans ce cas, end1 et end2 sont des valeurs entières de 0 à 2. Une valeur de 0 donnera une extrémité carrée, 1 vous donnera une flèche et 2 entraînera une extrémité arrondie. La variable end1 est le style de début et end2 est le style de fin. Enfin, nous pouvons définir l'épaisseur de nos lignes avec l'appel :

  1. vsl_width(handle,width);    

La variable largeur doit être un entier positif impair. La ligne sera définie sur la largeur la plus proche inférieure ou égale à la valeur de largeur. La valeur choisie est renvoyée par la fonction.

Rectangles arrondis

Nous pouvons utiliser v_pline() pour dessiner une boîte standard à coins carrés, mais le VDI fournit également une fonction nous permettant de dessiner des rectangles aux coins arrondis. La fonction est appelée de cette manière :

  1. v_rbox(handle,pxy);

Encore une fois, nous indiquons à GEM où dessiner notre rectangle avec le tableau pxy, sauf que cette fois nous ne devons fournir que les coordonnées en pixels des coins inférieur gauche et supérieur droit. Les attributs de ligne (couleur, style et largeur) sont utilisés avec v_rbox(), permettant une grande variété de rectangles.

Rectangles arrondis remplis

Si vous voulez un rectangle solide et arrondi, vous pouvez appeler cette fonction :

  1. v_rfbox(handle,pxy);

Le tableau pxy est utilisé de la même manière que dans v_rbox(), fournissant à la fonction les coins inférieur gauche et supérieur droit. Le corps du rectangle est rempli avec le motif de remplissage actif, que nous verrons comment définir plus tard. La valeur par défaut est un remplissage uni.

Cercles

Pour dessiner un cercle, vous pouvez simplement utiliser cet appel de fonction :

  1. v_circle(handle,x,y,radius);

Les paramètres entiers x et y sont les coordonnées en pixels du centre du cercle, et le rayon est, évidemment, le rayon du cercle (également un entier). La fonction v_circle(), comme v_rfbox(), utilise les attributs de remplissage actuels.

Polymarqueurs

Les polymarqueurs sont un certain nombre de formes prédéfinies que vous pouvez utiliser dans vos graphiques. Vous appelez la fonction de cette façon :

  1. v_pmarker(handle,number,pxy);

Le numéro de paramètre entier est le nombre de marqueurs que vous souhaitez dessiner. Les coordonnées de chaque marqueur sont entreposées dans le tableau pxy, une paire X,Y pour chaque marqueur. Mais à quoi ressemblent ces marqueurs ? Vous avez le choix entre six formes prédéfinies qui (respectivement de 1 à 6) sont le point, le signe plus, l'astérisque, le carré, la croix diagonale) et le losange.

Valeur Forme
1
2 +
3
 
4
5 X
6

Pour définir le type de polymarqueur, appelez :

  1. vsm_type(handle,type);

Ici, type est un entier compris entre 1 et 6. Si vous devez choisir une valeur hors de cette intervalle, la fonction sélectionnera l'astérisque par défaut. La valeur choisie sera renvoyée par la fonction. Deux autres attributs affectent les polymarqueurs : la couleur et la hauteur. La couleur est définie avec l'appel :

  1. vsm_color(handle,color);

Ici, la couleur est un nombre entier compris entre 0 et le maximum du périphérique. Toutes les règles de l'appel vsl_color() s'appliquent dans ce cas. Vous pouvez modifier la taille de tous les polymarqueurs, à l'exception du point (apparaissant toujours dans la plus petite taille), avec l'appel :

  1. vsm_height(handle,height);

Ici, la hauteur du paramètre entier est la taille du polymarqueur sur l'axe Y. La hauteur réelle sera la plus grande hauteur disponible sur le périphérique, inférieure ou égale au paramètre de hauteur.

Rectangles remplis

Des rectangles pleins peuvent être dessinés avec l'appel :

  1. v_bar(handle,pxy);    

Comme d'habitude, les coins inférieur gauche et supérieur droit sont entreposés dans le tableau pxy. Les attributs de remplissage actifs sont utilisés pour colorer le corps du rectangle.

Ellipses

Une ellipse ressemble à un cercle écrasé ou à un ovale solide. Vous pouvez le dessiner avec l'appel :

  1. v_ellipse(handle,x,y,xrad,yrad);    

Arcs

Les arcs sont simples à dessiner, avec cet appel :

  1. v_arc(handle,x,y,radius,bang,eang);

Les nombres entiers x, y et radius sont les coordonnées X,Y du centre et du rayon, respectivement. Les nombres entiers bang et eang sont les angles de début et de fin de l'arc, en dixièmes de degré. Le schéma suivant illustre les valeurs d'angle possibles :

900

|
1800 ← - + - →    0
|

2700

Tranches de tarte

Voici une fonction pratique vous aidant à dessiner ces graphiques circulaires fantaisistes. Pour dessiner une part de tarte, utilisez l'appel :

  1. v_pieslice(handle,x,y,radius,bang,eang);

Les paramètres sont les mêmes que ceux de la fonction arc. Le corps du secteur sera coloré par le motif de remplissage actif.

Motifs de remplissage

Le GEM vous fournit de nombreux modèles que nous pouvons utiliser pour remplir nos chiffres. Il existe une série de fonctions pour vous permettre de configurer ces modèles comme nous le voulons. La première étape est l'appel de la fonction :

  1. vsf_interior(handle,style);    

Ici, le style est un entier compris entre 0 et 4. Les valeurs sont interprétées comme suit :

Valeur Description
0 Creux (couleur de fond)
1 Solide
2 Motif
3 Haché
4 Défini par l'utilisateur

Si vous choisissez le style 0 ou 1, vous n'avez pas besoin d'aller plus loin, mais le style 2 vous permet de choisir entre 24 motifs différents et le style 3 propose 12 styles de hachures. Vous choisissez le motif que vous souhaitez utiliser, avec l'appel :

  1. vsf_style(handle,style);

Ici, le style est une valeur entière comprise entre 0 et 23. La couleur de votre remplissage est sélectionnée avec l'appel :

  1. vsf_color(handle,color);

Toutes les règles de la fonction vsl_color() s'appliquent également ici. Enfin, vous pouvez choisir entre une bordure visible ou invisible pour votre remplissage, avec l'appel :

  1. vsf_perimeter(handle,vis);

Ici, vis est n'importe quel nombre entier. Une valeur de 0 vous donnera une bordure invisible ; toute autre valeur entraînera le dessin de la bordure dans la couleur de remplissage actuelle.



PARTAGER CETTE PAGE SUR
Dernière mise à jour : Jeudi, le 17 février 2022