Suivez-nous sur X
|
|
|
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,
ALL
|
|
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
|
|
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
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : GFA Basic - Gestion des polices vectorielles
(Article écrit par Morgan Chanet et extrait d'Amiga News Tech - mars 1991)
|
|
L'Amiga souffre d'un grave défaut au niveau des polices de caractères : il ne connaît pas les polices
vectorielles. Certains programmes, comme Professional Page, implémente donc les leurs, qui suivent
leur propre format. En voici un exemple.
La différence entre une police "Bitmap" et une police vectorielle tient essentiellement en ce que la
police vectorielle est affichée par des calculs mathématiques, et non grâce à des matrices de points.
Cependant, le calcul revient à transformer une police vectorielle en une matrice affichable, donc
pour les petites tailles, il n'y aura pas de différence entre les deux types de polices. Mais l'avantage de
la police vectorielle est qu'elle peut générer elle-même toutes ses tailles, sans limite théorique
(seulement l'affichage), contrairement à la police Bitmap qui doit posséder chaque taille de corps de
caractère, sous peine de représenter le caractère avec un effet d'escalier assez désagréable, en
procédant à une multiplication des points de la matrice.
La théorie
Pour représenter la police vectorielle, j'ai renoncé aux coordonnées dites rectangulaires, où un point a
pour coordonnées les valeurs x et y par rapport à l'origine, au profit des coordonnées dites polaires,
où un point est défini par un rayon et un angle par rapport à l'origine. L'avantage des coordonnées polaires
est essentiel lorsque l'on désire procéder à une rotation du caractère, car il suffit d'ajouter l'angle de
rotation désiré à l'angle du point et le tour est joué !
Cependant, les instructions graphiques du GFA Basic ne connaissant que les coordonnées rectangulaires (x.y),
il faudra procéder à une conversion :
Conversion polaire à rectangulaire :
x = r*COS(alpha)
y = r*SIN(alpha)
|
Conversion rectangulaire à polaire :
r=SQR(x~2+y~2)
alpha=ATN(y/x)
|
Dans mes routines, j'utilise les fonctions SINQ() et COSQ() qui travaillent dix
fois plus vite que SIN() et COS(), même si la précision est moins bonne, elle est amplement suffisante.
La pratique
Avant de pouvoir afficher une police, il faut en posséder les données. A cette fin, chaque caractère de
la police est formé par un certain nombre de vecteurs, théoriquement illimité, mais moins il y en aura,
plus rapide sera l'affichage. Par soucis de simplification, vous définirez vos caractères à l'aide de
coordonnées rectangulaires, puis les données seront converties par le programme 2 en coordonnées polaires,
sous la forme de données (data), que vous insérerez ensuite dans le programme 1.
Donc en premier lieu, écrivez vos définitions de caractères dans un fichier appelé "VectorFont.data"
(utilisez n'importe quel éditeur de texte) sous la forme caractère, x1, y1, x2, y2,...,xn, yn. -1, -1.
Par exemple : A, 1, 0, 1, 7,..., -1,-1
"-1, -1" indique la fin de la définition du caractère. Chaque caractère est défini à l'aide de segments de
droite, il faut donc deux couples de coordonnées pour chaque segment (x1,y1) et (x2,y2). L'origine des
points se trouve en haut à gauche de la matrice. Enfin, vous devez prévoir la taille de la matrice de la
définition d'un caractère dans les variables "font_base%" (largeur, en principe 8) et "font_height%"
(hauteur, en principe 8).
Ces données sont converties en coordonnées polaires pour ne pas avoir à le faire pendant l'exécution du
programme, ce qui gagne du temps. Les données sont lues et chaque segment est stocké dans un tableau
nommé "font_data#()", un autre tableau nommé "Font%()" servant de table d'index pour retrouver les
segments des caractères. Il est à deux dimensions : le premier indice varie de 0 à 255, équivaut au code
ASCII. Le second peut prendre les valeurs 1 et 2 : "1" indique l'indice de départ pour "Font_data#()",
"2" indique le nombre de segments pour le caractère demandé.
De fait, rien n'oblige à construire une police entière : on peut se contenter de définir les caractères dont
on a réellement besoin (d'ailleurs, à titre d'exemple, je vous donne la définition des chiffres 0 à 9 seulement).
Les routines qui suivent sont relativement simples et suffisamment commentées. Vous pourrez même les améliorer,
en permettant par exemple d'utiliser plusieurs polices en même temps...
Programme 1 : gestion des polices vectorielles
Programme 2 : conversion des coordonnées cartésiennes en coordonnées polaires
Programme 3 : coordonnées cartésiennes, à convertir avec le programme 2 et à insérer dans le programme 1
au label "segments:".
|