Le VDI

 

Le VDI est une sous partie du GEM.

Le GEM VDI se découpe en deux parties :

La partie GIOS: Graphic Input/Output System, code dépendant des périphériques graphiques qui seront utilisés puiqu'il permettra d'accéder à ces périphériques (device driver). Le GIOS utilisera aussi le GEMDOS ou la Line-A

Et la partie GDOS: Graphics Device Operating System, qui permet de rendre vos programmes complétement indépendants des périphériques utilisés. Car ce sera le GDOS qui demandera au GIOS de traduire les commandes graphiques sur les périphériques.

Pour être complétement indépendant des résolutions des périphériques, le GDOS utilise un système de coordonnées virtuelles appelé NDC (pour Normalized Device Coordinates de résolution 32767/32767). Ces coordonnées sont ensuite traduites en RC (pour Raster Coordinates) par le device driver du périphérique destinataire pour en déduire les coordonnées correspondantes au périphérique.

Il est évidemment possible d'adresser directement le périphérique en coordonnées réelles, mais là, le VDI n'aurait plus grand intérêt.

Nous verrons qu'il est aussi possible de créer des fichiers "métafile". Ils contiennent en fait les différents ordres utilisés pour aboutir à l'image final (position, couleur, type de remplissage). Ce fichier pouvant ensuite être renvoyé sur un périphérique quelconque qui se chargera de faire le rendu.

 

Pour appeler les fonctions du vdi, vous utiliserez différents tableaux qui sont:contrl, intin, intout, ptsin, ptsout (càd les mêmes que ceux de l'AES).

contrl contient des paramètres de toutes sortes. Il sert aussi bien à communiquer des paramètres à la fonction appelée qu'à en recevoir de celle-ci:
Taille : 2 octets par éléments

Mot 0 : numéro ou opcode de la fonction
Mot 1 : nb. points dans ptsin
Mot 2 : nb. de points dans ptsout
Mot 3 : nb. mots dans intin
Mot 4 : nb. mots dans intout
Mot 5 : n° commande de la sous fonction
Mot 6 : n° id du périphérique (device-handle), pour l'écran, vous utiliserez le context handle récupéré lors de l'initialisation de l'AES
Mot 7 à 10 : informations complémentaires suivant la fonction

Image non trouvée !Les mots 0, 1, 3, 5 et 6 doivent toujours être renseignés par le développeur.

Les mots 2 et 4 sont retournés par la fonction appelée.

intin (integer input) (Habituellement d'une taille de 128 mots)
Valeurs entières (mot) qui vont dépendre de la fonction appelée.

intout (integer output)
Valeurs entières (mot) qui seront retournées par la fonction appelée.

ptsin (points input): 2 mots par points. La taille de ce tableau est à communiquer dans le tableau control (généralement 128 points).

Vous passerez ici des coordonnées x, y de points.

ptsout (points output): 2 mots par point.

Vous récupérerez ici des coordonnées x, y de points.

Le VDI avec le GFA-BASIC

Vous utiliserez la fonction vdisys fn sous GFA-BASIC après avoir renseigné les tableaux comme il faut (contrl, intin, ... vu précédemment).

 

Le VDI en assembleur

Initialiser le VDI

Avant d'initialiser le VDI, il est nécessaire d'initialiser l'AES. En effet, c'est l'AES qui va retourner un contexte graphique qui sera nécessaire ensuite pour les opérations graphiques sur l'écran.

La fonction qui va permettre d'initialiser le VDI sur un Atari ST est la fonction 100 - Open virtual workstation

En entrée de la fonction, les paramètres intin correspondent à :

INTIN[0] device_number
INTIN[1] line_style
INTIN[2] line_colour
INTIN[3] marker_style
INTIN[4] marker_colour
INTIN[5] text_style
INTIN[6] text_colour
INTIN[7] fill_style
INTIN[8] fill_index
INTIN[9] fill_colour
INTIN[10] pixel_mode avec 1 pour utiliser NDCs, 2 pour les pixels. Dans mon cas, 2 ...

La fonction devrait retournée 6 ptsout et 45 intout

En brut cela donne:

INTOUT[0] Screen width, device units
INTOUT [1] Screen height, device units
INTOUT [2] 0 if device can produce a precisely scaled image, 1 if it can't
INTOUT [3] Width of a pixel, in thousandths of a millimetre.
INTOUT [4] Height of a pixel, in thousandths of a millimetre.
INTOUT [5] Number of character sizes, 0 for continuous sizing.
INTOUT [6] Number of line styles.
INTOUT [7] Number of line widths, 0 for continuous scaling.
INTOUT [8] Number of marker styles.
INTOUT [9] Number of marker sizes, 0 for continuous scaling.
INTOUT [10] Number of fonts.
INTOUT [11] Number of patterns.
INTOUT [12] Number of hatch styles.
INTOUT [13] Number of colours displayable at once.
INTOUT [14] Number of General Drawing Primitives
INTOUT [15] 20 ;General Drawing Primitive list.

  • -1 => End of list
  • 1 => Bar
  • 2 => Arc
  • 3 => Pie slice
  • 4 => Circle
  • 5 => Ellipse
  • 6 => Elliptical arc
  • 7 => Elliptical pie slice
  • 8 => Rounded rectangle
  • 9 => Filled rounded rectangle
  • 10 => Justified graphic text

INTOUT[25] 20 ;General Drawing Primitive attributes

  • -1 => End of list
  • 0 => Polyline
  • 1 => Polymarker
  • 2 => Text
  • 3 => Filled area
  • 4 => None


INTOUT [35] 0 for black/white, 1 for colour.
INTOUT [36] 0 if text rotation is not possible, 1 if it is.
INTOUT [37] 0 if filled areas are not possible, 1 if they are.
INTOUT [38] 0 if cannot read cell array, 1 if can.
INTOUT [39] Number of colours in the palette.

  • 0 => More than 32767
  • 2 => Black and white

INTOUT [40] Number of locator devices (mice, tablets, lightpens)
INTOUT [41] Number of valuator devices (eg: a joystick throttle)
INTOUT [42] Number of choice devices (eg: function keys on a keyboard)
INTOUT [43] Number of string devices (ie: keyboards)
INTOUT [44] Workstation type

  • 0 => Output only
  • 1 => Input only
  • 2 => Input and output
  • 3 => Segment storage
  • 4 => GEM metafile output.

PTSOUT lui donne


PTSOUT[0] minimum character width, minimum character height
PTSOUT[1] maximum character width, maximum character height
PTSOUT[2] minimum line width,0
PTSOUT[2] maximum line width,0
PTSOUT[4] minimum marker width, minimum marker height
PTSOUT[5] maximum marker width, maximum marker height.

Informations extraites de http://www.seasip.info/Gem/vdi.html#1

En sortie, il semble que control+12 puisse avoir un nouveau handle. 0 si la fonction n'a pas marché.

En fait, peu importe, tant que vous n'effacez pas le contenu de control+12 !

 

Terminer les appels au VDI

Votre programme va se fermer? Avant, il faut terminer les appels au VDI en utilisant la fonction 3 (clear picture)

Cela va effacer le contenu de l'écran ou du buffer du périphérique utilisé.

 

Appel fonction VDI

En assembleur, vous utiliserez le trap #2 en alimentant avant cet appel les registres D0.W et D1.L:

- Dans d0.w, vous indiquez que vous voulez appeler une fonction du vdi en mettant la valeur $73. En effet, TRAP #2 sert aussi bien pour le VDI que pour l'AES.

- Dans le registre d1.l, vous indiquerez l'adresse d'un block de pointeurs sur les différents tableaux utilisés par le VDI.

Ce qui donne:

move.l #vdipb,d1
move.w #$73,d0
trap #2

avec

vdipb dc.l contrl,intin,ptsin,intout,ptsout

(Cf. les explications et sources dans le chapitre sur l'AES)

 

Quelques fonctions