# Logiciels de definition et generation de caracteres

Christian Bigo, Eric Saltel

► To cite this version:

Christian Bigo, Eric Saltel. Logiciels de definition et generation de caracteres. [Rapport de recherche] IRIA-RR-269, IRIA. 1977, pp.32. hal-04716452

HAL Id: hal-04716452

https://inria.hal.science/hal-04716452v1

Submitted on 1 Oct 2024

HAL is a multi-disciplinary open access
archive for the deposit and dissemination of sci-
entific research documents, whether they are pub-
lished or not. The documents may come from
teaching and research institutions in France or
abroad, or from public or private research centers.

L'archive ouverte pluridisciplinaire HAL, est
destinée au dépôt et à la diffusion de documents
scientifiques de niveau recherche, publiés ou non,
émanant des établissements d'enseignement et de
recherche français ou étrangers, des laboratoires
publics ou privés.

<figure><img src="image_1.png" /></figure>

Distributed under a Creative Commons Attribution 4.0 International License
<figure><img src="image_2.png" /></figure>

laboria

Institut de Recherche
d'Informatique
et d'Automatique

Domaine de Voluceau
Rocquencourt
B. P. 105 78150 - Le Chesnay
France
Tél.: 954 90 20

laboratoire de recherche
en informatique
et automatique

ARCHIVES

LOGICIELS DE
DÉFINITION ET GÉNÉRATION
DE CARACTÈRES

Christian BIGO
Eric SALTEL

Rapport de Recherche N° 269

Novembre 1977
LOGICIELS DE DÉFINITION ET GÉNÉRATION DE CARACTÈRES

Christian Bigo, Eric Saltel

Logiciels de définition et génération de caractères

Résumé :

Les logiciels présentés ici permettent, d'une part de décrire de manière interactive des caractères
ou des symboles graphiques et d'autre part, de les utiliser en leur appliquant différentes transfor-
mations telles que rotation, changement d'échelle ou cisaillement.

Abstract :

The two packages presented here allow, on the one hand to describe interactively characters and graphical symbols and, on the other hand, to use them applying different transformations like rotations, scaling and shear.
# LOGICIELS DE DEFINITION ET GENERATION DE CARACTERES

## 1. GENERALITES

## 2. EDITION DE POLICES DE CARACTERES

2.1 Possibilités

2.2 Définition d'un caractère

2.3 Définition des paramètres de création

2.4 Exemple de création d'un caractère

2.5 Assemblage de caractères

2.5.1 Largeur du caractère fonction du caractère

2.5.2 Largeur du caractère constante

2.5.3 Conclusions

## 3. CODAGE DES CARACTERES

3.1 Codage en coordonnées absolues

3.2 Codage en coordonnées relatives

3.3 Codage à 8 directions privilégiées

3.4 Compactage

## 4. OPTIMISATION DU CODAGE DES POLICES DE CARACTERES

4.1 Présentation de l'algorithme d'optimisation

4.2 Gains de place

4.3 Restrictions de l'algorithme

4.4 Description de l'algorithme

## 5. UTILISATION DES POLICES DE CARACTERES

5.1 Récupération de la police désirée

5.2 Définition des paramètres d'affichage de chaque caractère

5.3 Affichage de la chaîne de caractères

5.4 Exemple de programme
# 6. BIBLIOGRAPHIE

## ANNEXE I Mode d'utilisation sur MITRA 15

## ANNEXE II Entrée des segments

## ANNEXE III ADAPTATION

- interface d'entrée

- interface de sortie
LOGICIELS DE DEFINITION ET GENERATION DE CARACTERES

# 1. GENERALITES

En graphique on peut distinguer trois classes de caractères selon les possibilités de manipulation graphique qu'on peut leur appliquer ; ceci revient aussi à les classer selon les dispositifs qui les gèrent.

- A - Les caractères créés par générateur microprogrammé possèdent habituellement

* un ou deux sens de tracé

* une taille fixe, ou prenant un ensemble réduit de valeurs

* une ou deux polices de caractères

- B - Les caractères créés par logiciel possèdent habituellement

* différents sens de tracé

* une taille variable en continu

* en général, il n'existe qu'une seule police de caractères

- C - Les caractères que l'on pourrait qualifier de "qualité" ou "artistiques" qui sont de formes variées et peuvent comporter une "épaisseur". Ce sont par exemple des caractères d'imprimerie, des symboles mathématiques (lettres grecques, symboles de la théorie des ensembles, ...), des symboles utilisés en électricité (résistances, bobinages, transistors, Ampli-Op, ...).

On voit qu'il serait intéressant de pouvoir disposer d'un générateur de caractères logiciel permettant d'utiliser dynamiquement plusieurs polices et d'effectuer toutes les transformations sur les caractères (rotations, translations, cisaillement, perspectives ...). Pour un tel générateur la plus grande difficulté est d'introduire la description numérique de chaque caractère. En effet, un alphabet classique soit 26 lettres (majuscules et minuscules) ainsi que les nombres et quelques symboles représente 70 caractères environ ; chaque caractère est composé d'en moyenne 10 segments soit 20 coordonnées relatives ; un alphabet est donc décrit par 1400 coordonnées numériques.
Il est possible d'entrer ces données de deux manières :

- sous forme de cartes "DATA"

- en dessinant les caractères (un programme assurant l'entrée et le codage automatiques de données).

Cette seconde méthode couplée avec des facilités d'édition conversationnelle d'un caractère dans une police semble la moins contraignante à utiliser.

Il faut remarquer que l'encombrement d'une police n'est pas à négliger (700 codes ou 1400 coordonnées), nous avons donc élaboré une technique permettant de réduire cet encombrement par la détection et le recodage de séquences identiques de segments.

Le logiciel que nous avons réalisé permet :

- d'éditer par création, modification et destruction sur une console graphique une police de caractères et d'éditer chaque caractère d'une police

- d'optimiser la description numérique de cette police

- de sauver sur disque la description numérique de cette police

Un ensemble de sous-programmes permettent ensuite à l'utilisateur :

- un choix dynamique de la police de caractères

- de définir les caractéristiques de tracé des chaînes (orientations, transformations, taille des caractères, espacement de ceux-ci)

- de définir la chaîne à tracer avec sa position dans le plan ou l'espace.
Structure d'ensemble du système

Édition

<figure><img src="image_3.png" /></figure>

optimisation

<figure><img src="image_4.png" /></figure>

utilisation
## 2. EDITION DES POLICES

### 2.1 Possibilités

- Création de nouvelles polices de caractères

- Modification de polices déjà existantes

- Aide à la mise au point des caractères (visualisation ...)

### 2.2 Définition d'un caractère

On donnera le nom de caractère à tout symbole, dessin, caractère alphanumérique.... Tout caractère est référencé par rapport à une boite rectangulaire de taille TX x TY. Cette boite possède un point d'origine et un point de fin de tracé placés arbitrairement par l'utilisateur.
Les caractères sont déssinés sur une grille de quantification et présentent en général une hauteur et une largeur constante ; de même le point d'origine et le point de fin seront communs à plusieurs caractères.

### 2.3 Définitions des paramètres de création

- Résolution de la grille

La résolution de la grille détermine le nombre de carreaux par tranche de 10 cm.

- Taille de la boite

L'utilisateur fixe à l'aide de TX, TY le nombre de carreaux composant le boite, cette boite sera visualisée sur l'écran.
Les tailles TX et TY combinées avec les hauteur et largeur HX et HY, des caractères lors de l'utilisation, déterminent les affinités à effectuer lors de l'affichage.

- Point d'origine et fin des caractères

L'utilisateur positionnera l'origine et la fin standard des caractères. Celles-ci seront implicites pour les caractères standards, mais pourront être forcées pour la création d'autres types de caractères.

### Remarque

Les paramètres de création sont déterminés par l'utilisateur lors de la création d'une police et resteront invariants tout au long de l'évaluation de cette police.
## 2.4 Exemple de création de caractères

<figure><img src="image_5.png" /><figcaption>- caractère de largeur standard</figcaption></figure>

* fin implicite

O origine implicite

zone "utile" en grisé

1...7 ordre dans lequel ont été
rentrés les points

<figure><img src="image_6.png" /><figcaption>- caractère de largeur non standard</figcaption></figure>

commandes

① fin normale ; on va, trait
éteint, jusqu'au point de
fin implicite

① crée un segment et trace le
trait

M crée un segment et le faisceau
se déplace trait éteint

C① fin sur place et le faisceau
se déplace trait éteint

F① fin sur place et le faisceau
se déplace trait allumé
- caractère centré

<figure><img src="image_7.png" /></figure>

- caractère imprimerie avec contour

<figure><img src="image_8.png" /></figure>

- caractère gothique

<figure><img src="image_9.png" /></figure>
- symbole électrique

<figure><img src="image_10.png" /></figure>

- symbole naïf

<figure><img src="image_11.png" /></figure>

- symbole d'organigramme

<figure><img src="image_12.png" /></figure>
## 2.5 Assemblage de caractères

### 2.5.1 Largeur du caractère fonction de celui-ci

alphabet restreint :

<figure><img src="image_13.png" /></figure>

**séparateur** : distance entre le point de départ du 2ème caractère et le point de fin du ler.

**élongation** : distance entre le point de départ du 2ème caractère et le point de départ du ler.

<figure><img src="image_14.png" /><figcaption>séparateur</figcaption></figure>

<figure><img src="image_15.png" /><figcaption>élongation</figcaption></figure>

On peut envisager différents modes de tracé

#### 2.5.1.1. Tracé à séparateur constant

<figure><img src="image_16.png" /></figure>

La chaîne présente une bonne typographie, les caractères étant disposés régulièrement.
### 2.5.1.2 Tracé à elongation constante

<figure><img src="image_17.png" /></figure>

La chaîne ne présente pas une bonne typographie, les caractères sont disposés irrégulièrement.

### 2.5.2 Largeur du caractère constante

alphabet restreint

<figure><img src="image_18.png" /></figure>

On peut envisager différents modes de tracé

#### 2.5.2.1 Tracé à séparateur constant

<figure><img src="image_19.png" /></figure>

La chaîne ne présente pas une bonne typographie, les caractères sont disposés irrégulièrement.
### 2.5.2.2 Tracé à elongation constante

<figure><img src="image_20.png" /></figure>

On retrouve le même cas que précédemment car comme la largeur est constante, elongation = largeur + séparateur.

### 2.5.3 Conclusion

Sur les 4 cas envisagés seul le cas 2.5.1.1 "Tracé à séparateur constant et largeur du caractère fonction de celui-ci" présente une bonne typographie. Cette solution sera retenue : la largeur des caractères sera variable et à l'utilisation on fixera la taille du séparateur.
### 3. CODAGE DES CARACTERES

Si on veut décrire un caractère par une suite de segments, on peut envisager différentes formes de codage.

**Remarque.** Il est naturel de coder sur des tableaux d'entiers 1 mot machine au lieu de 2 pour les réels.

<figure><img src="image_21.png" /></figure>

#### 3.1 Codage en coordonnées absolues

<table><thead><tr><th></th><th>OX</th><th>OY</th><th>Code</th></tr></thead><tbody><tr><td>IO</td><td>0</td><td>0</td><td></td></tr><tr><td>I1</td><td>2</td><td>1</td><td>allumé</td></tr><tr><td>I2</td><td>4</td><td>5</td><td>éteint</td></tr></tbody></table>

**Avantages** : - on connait instantanément les coordonnées d'un point

- modifications faciles

**Inconvénients**

- encombrement : 3*n

- pas pratique pour les transformations géométriques

#### 3.2 Codage en coordonnées relatives

<table><thead><tr><th></th><th>ΔX</th><th>ΔY</th><th>Code</th></tr></thead><tbody><tr><td>IO</td><td></td><td></td><td></td></tr><tr><td>I1</td><td>2</td><td>1</td><td>allumé</td></tr><tr><td>I2</td><td>2</td><td>4</td><td>éteint</td></tr></tbody></table>

**Avantage** : - transformations géométriques aisées

**Inconvénients** : - encombrement

- modifications difficiles pour un segment quelconque (faciles pour le dernier)

- nécessité d'un calcul pour connaître la position d'un point
### 3.3 Codage à 8 directions privilégiées

<figure><img src="image_22.png" /><figcaption>allumé</figcaption></figure>

<figure><img src="image_23.png" /><figcaption>éteint</figcaption></figure>

La position relative d'un point par rapport au dernier sera déterminée par le couple : (direction, nombre d'incréments)

**direction** : une des 8 directions privilégiées (associées au mode de tracé : allumé/éteint)

**nombre d'incréments** : nombre de pas à effectuer dans une direction donnée.

Ceci présente un inconvénient. Il faut deux étapes pour atteindre certains points ; ex I4 n'est atteint qu'après 1 incrément horizontal : 0 et 1 incrément oblique : 1.

<figure><img src="image_24.png" /></figure>

<table><thead><tr><th></th><th>Code</th><th>Nbre incréments</th></tr></thead><tbody><tr><td>I0</td><td></td><td></td></tr><tr><td>I1</td><td>1</td><td>2</td></tr><tr><td>I2</td><td>0</td><td>1</td></tr><tr><td>I3</td><td>10</td><td>3</td></tr><tr><td></td><td>0</td><td>1</td></tr><tr><td>I4</td><td>1</td><td>1</td></tr></tbody></table>
**Avantages** : encombrement moindre : $2*n$

idem au codage relatif

en assembleur on pourrait coder sur 1 octet

**Inconvénients** :
- difficultés pour les points non accessibles en 1 code
  (ex I4 serait codé 0 suivi de 1) on peut lever l'ambiguïté
  en faisant 16 directions privilégiées mais on retrouverait
  les mêmes problèmes
- nécessité d'un décodage pour retrouver les déplacements relatifs.

### 3.4 Compactage

Si on code sur 1 entier $I = *XXYYC$

avec : $*= + \to$ segment allumé
       $*= - \to$ segment éteint

XX $\to$ déplacement relatif en X en valeur absolue

YY $\to$ déplacement relatif en Y en valeur absolue

C $\to$ le cadran dans lequel s'est effectué le déplacement

<figure><img src="image_25.png" /></figure>

Le point O n'est pas inclus mais si

$$ \begin{cases} \Delta X = 0 \\ \Delta Y = 0 \end{cases} $$

ce point est inutile
Si $C = 5$ il s'agit d'un codage particulier.

De plus si $C = C + 5$ alors les points entrés concernent un contour
(pour hachurer postérieurement) $C = 6 \to 9$

**Avantages** : - encombrement minimum : n ; - très fort compactage

Inconvénients : - nécessite un décodage avant utilisation

- on code sur un entier donc $I < 32 700$ et par conséquent
  $|\Delta X|<32$ pour 1 codage sur 16 bits. Mais comme la grille
  est limitée à 50 incréments, pour les longs segments on
  peut décomposer en 2 segments.

Nous avons choisi cette solution pour le gain de place qu'elle offrait
par rapport aux autres solutions.
# 4. PHASE D'OPTIMISATION DE LA POLICE

## 4.1 Présentation de l'optimisation

On va chercher à diminuer la place occupée par les différents codes en mémoire. Si on examine les caractères "B" et "D" dessinés ci-dessous on s'aperçoit par superposition que ces deux caractères présentent une séquence commune de segments.

<figure><img src="image_26.png" /></figure>

La description numérique de chacun de ces caractères est représentée ci-dessous avec les conventions de codage du paragraphe 3.4

$$B = \begin{array}{l} -07021 \ +02023 \ +01001 \ +01003 \ +05001 \\ \quad +02024 \ +00024 \ +04003 \ +02024 \ +00024 \\ \quad -00024 \end{array}$$

<figure><img src="image_27.png" /></figure>

$$D = \begin{array}{l} -07021 \ +02023 \ +04003 \ +01001 \ +00122 \ +01003 \ +05001 \\ \quad +02024 \ +00084 \ -00024 \end{array}$$

Si on code (voir remarque ci-dessous) +00015 la séquence :
+07021 +02023 +04003 +01001 +00122 +02003 +05001
+02024

$$B \text{ peut être codé } B = \begin{array}{l} +00015 \ +00024 \ +02023 \ +04003 \ +04001 \\ \quad +02024 \ +00024 \ -00024 \end{array}$$

$$D \text{ peut être code } D = \begin{array}{l} +00015 \ +00084 \ -00024 \end{array}$$

L'alphabet restreint B, D occuperait 25 places mémoire, après optimisation ce même alphabet occupe 11 places en mémoire et 8 places dans une table de correspondance.

**Remarque** : le codage +00015 est du type NNNN5 avec NNNN le rang de code. ex: ici $n=1$ (1er recodage) donc $code = 15 = 00015$ d'une manière générale $code = 10*n+5$
## 4.2 Gains de place

Quand on trouve une séquence de deux segments commune à plusieurs caractères, on peut remplacer celle-ci par un codage particulier qui permet de retrouver la séquence en question dans une table de correspondance.

On peut essayer de chiffrer le gain de place éventuel.

- On envisage uniquement les doublets dans un premier temps

* Pour chaque occurrence on gagne 1 place (on remplace 2 codes par un seul)

* Pour chaque type de doublet on utilise 2 places dans la table de correspondance

Si un doublet présente 'k' occurrences. On gagne k-2 places mémoire.

- Si on envisage les n-uples

* Si un n-uple se compose de j segments consécutifs et se répète k fois

* Pour chaque occurrence on remplacera j codes par un seul soit un gain de place de k*(j-1)

* Pour chaque type de n-uple on utilise 2*(j-1) places pour la table de correspondance

On gagne donc $(k-2) \times (j-1)$ places

- **Remarques** : On s'aperçoit que si l'occurrence n'apparaît que 2 fois on a un gain de place nul et on perdrait inutilement du temps en allant chercher dans les tables de correspondance les renseignements que l'on possédait au départ.

L'optimisation de séquences de codes ne se repétant que deux fois est superflue.

## 4.3 Restriction de l'algorithme

Si on examine les deux caractères suivants 'C' et 'O'. Ces deux caractères présentent une grande ressemblance, mais selon le sens de codage du 'C' par rapport au 'O' la chaîne de codes du 'C' sera inclue dans la chaîne de codes du 'O', ou inversement si le sens de parcours est différent aucune séquence ne sera présente simultanément dans la chaîne 'C' et la chaîne 'O'.
<figure><img src="image_28.png" /><figcaption>fig a</figcaption></figure>

<figure><img src="image_29.png" /><figcaption>fig b</figcaption></figure>

<figure><img src="image_30.png" /><figcaption>fig c</figcaption></figure>

Fig a: $0 = -08021 \ +02023 \ +04003 \ +02022 \ +00082 \ +02021 \ +04001$
       $\ +02024 \ +00084 \ -00024$

Fig b: $c = -08021 \ +02023 \ +04003 \ +02022 \ +00082 \ +02021 \ +04001$
       $\ +02024 \ -00104$

Fig c: $C = -08021 \ -00082 \ +02022 \ +04003 \ +02023 \ +00084 \ +02024$
       $\ +04001 \ +02021 \ -00024$

L'exemple montre une restriction de l'algorithme utilisé. Cette restriction vient du fait que l'on considère la chaîne de codes comme une chaîne ouverte. De ce fait on n'examine pas les permutations à l'intérieur des chaînes. Les rotations de la chaîne ne sont pas envisagées non plus, mais celles-ci ne feraient gagner qu'une place mémoire contre une perte de temps très longue du fait du nombre de décalages à effectuer.

En conclusion, pour pallier aux restrictions de l'algorithme
l'utilisateur doit :

- créer ou favoriser les ressemblances

- dessiner ses caractères de même manière (sens de tracé, point de départ, ...)

Si l'utilisateur prépare le dessin de ses caractères en respectant
les deux contraintes précédentes, on peut espérer gagner 10 % au
minimum sur la taille de la description de la police.
## 4.4 Description de l'algorithme

### Algorithme d'optimisation

n = 1
nnd = nombre initial de doublets
ntab (1) → ntab(9) paramètres de la police (taille, indicateurs, ...)

* Boucle sur l'examen des occurrences

pour i = 10, nnd-1 jusqu'à β
ii = i + 1
si ntab(i) = 0 on a ntab(i) déjà codé dans cette passe
alors aller en β

* on examine les successeurs jusqu'à en trouver un non nul
γ si ntab(ii) = 0 alors ii = ii + 1 et aller en γ
sinon * recherche des doublets

pour j = i + 2, nnd-1 jusqu'à δ
sinon jj = j + 1
v si ntab(jj) ≠ 0 aller en ε
sinon jj = jj + 1 et aller en v
ε si ntab(ii) ≠ 0 ntab(jj) ou si ntab(ii) déjà codé dans cette passe ou si on se trouve entre 2 caractères aller en δ
sinon codn = n 10+5
recod(n,1) = ntab(j)
recod(n,2) = ntab(jj)
ntab(j) = codn
ntab(jj) = 0
continue
si on n'a pas trouvé de doublet aller en β
si on n'a trouvé que deux doublets ntab(j) = Recod(n,1)
n(ab(jj) = Recod(n,2)
sinon ntab(i) = codn
ntab(ii) 0
n = n + 1

β continue

si on a trouvé des doublets dans la séquence aller en α
sinon supprimer les zéros de la liste en la recompactant.
# 5. UTILISATION DE LA POLICE

Les polices de caractères seront stockées sur disque.

## 5.1 Récupération de la police désirée

CALL RECUDA (NDQ, NPOL, IND)

entier : NDQ(4),NPOL(3),IND
NDQ(1) = DC ou DK
NDQ(2,3,4) = Nom du disque (6 caractères)
NPOL(1,2,3,) = Nom de la police (6 caractères)
IND en entrée est indifférent

En sortie IND = 0 : tout c'est bien passé
IND = 1 : mauvais disque
IND = 2 : mauvaise clé
IND = 3 ou 4 : fichier non conforme

Cette subroutine doit être appelée chaque fois que l'on désire changer de police de caractère.

## 5.2 Définition des paramètres d'affichage de chaque caractère

CALL DEFIN (HX,HY,A1,A2)

réel : HX,HY,A1,A2
HX = taille en x des caractères (coordonnées utilisateur)
HY = taille en y des caractères (coordonnées utilisateur)
A1 = angle de cisaillement en radians (voir figure suivante)
A2 = angle de rotation de chaque caractère en radians

<figure><img src="image_31.png" /><figcaption>fig 1</figcaption></figure>

<figure><img src="image_32.png" /><figcaption>fig 2</figcaption></figure>

<figure><img src="image_33.png" /><figcaption>fig 3</figcaption></figure>

<figure><img src="image_34.png" /><figcaption>fig 4</figcaption></figure>
On définit chaque caractère comme étant inclus dans une boite de
taille HX * HY avec origine en bas à gauche (figure 1) ; on accepte le
débordement de la boite pour les minuscules p q j ... Le bas de la boite
représente l'alignement des caractères sur une ligne.

L'angle A1 est l'angle de cisaillement

L'angle A2 est l'angle de rotation de chaque caractère du texte

L'angle A3 est l'angle de rotation du texte.

Chaque angle est exprimé en radians dans le sens trigonométrique ; tous
ces angles sont des angles absolus et sont donc exprimés indépendamment
les uns des autres.

5.3 Affichage de la chaîne de caractères

CALL ECRIT ( ICH,NC,A3,ESPACE,XIN,YIN,XOUT,YOUT )

entier : NC,ICH(40)

réel : A3,XIN,YIN,XOUT,YOUT,ESPACE

en entrée :

NC : Nombre de caractères de la chaîne (maximum 80)

ICH : Tableau d'entiers contenant la chaîne en FORMAT A2

A3 : Angle de rotation de la chaîne de caractères (figure 4)

ESPACE : Distance utilisateur entre la fin du caractère précédent
et le début du caractère

XIN,YIN : Coordonnées du point d'affichage

en sortie :

XOUT,YOUT : Coordonnées de la position du faisceau après tracé

$A1 = \pi/2$

$A2 = 0$

$A3 = 0$

<figure><img src="image_35.png" /><figcaption>Figure 5.</figcaption></figure>
$$A1 = \pi/2$$

$$A2 = \theta$$

$$A3 = \theta$$

<figure><img src="image_36.png" /><figcaption>Figure 6.</figcaption></figure>

$$A1 = \pi/2$$

$$A2 = 0$$

$$A3 = \theta$$

<figure><img src="image_37.png" /><figcaption>Figure 7.</figcaption></figure>

Remarque :

Les polices générées sont utilisables sur le système FORTRAN 3D du groupe graphique de l'IRIA, système développé sur MITRA 15.
### 5.4 Exemple de programme

INTEGER ICH(40), NDQ(4), NPOL(3)
CALL DEVICE (1,0)
CALL DEVICI (1,0)
CALL CLEAN

### C

100 CALL OUTEXT('DC OU DK!')
READ (105,112) NDQ(1)
CALL OUTEXT ('NOM DU DISQUE!')
READ (105,12) (NDQ(I),I=2,4)
CALL OUTEXT ('NOM DE LA POLICE!')
READ (105,12) NPOL
12 FORMAT (3A2)
112 FORMAT (A2)

### C

C TRANSFERT DE LA POLICE ET VERIFICATION DE CELUI-CI
CALL RECUDA (NDQ,NPOL,I)
IF (I.NE.O) GOTO 100

### C

CALL MASQU2 (0.,35.,0.,27.)
CALL FENTR2 (0.,35.,0.,27.)

C ICI L'ESPACE UTILISATEUR EST EN CENTIMETRES
CALL CLIP (.TRUE.)

### C

200 CALL CLEAN
CALL OUTEXT ('EPAISSEUR DES TRAITS8')
CALL INPUTR(EP)
CALL THICK (EP)
CALL OUTEXT ('TAILLE EN X?!')
CALL INPUTR (HX)
CALL OUTEXT ('TAILLE EN Y?!')
CALL INPUTR (HY)
CALL OUTEXT ('ANGLE DE CISAILLEMENT ?!')
CALL INPUTR (A1)
CALL OUTEXT ('ANGLE DE ROTATION TEXTE ?!')

CALL INPUTR (A3)

CALL OUTEXT('LONGUEUR DU SEPARATEUR ?!')

CALL INPUTR (ESPACE)

C

PREPARATION ET ECRITURE

C

CALL DEFIN (HX,HY,A1,A2)

300

CALL OUTEXT ('TAPEZ LA CHAINE!')

READ (105,22) ICH

22

FORMAT (40A2)

C

ENTREE DE LA POSITION INITIALE DU TEXTE GRACE AU CURSEUR

CALL GETXY (XI,YI)

CALL ECRIT (ICH,80,A3,ESPACE,XI,YI,XO,YO)

CALL OUTEXT ('O = FINIR')

CALL OUTEXT ('1=CHANGER LES PARAMETRES!')

CALL OUTEXT ('2=ECRIRE UNE AUTRE CHAINE!')

CALL INPUTI (N)

IF (.EQ.1) GOTO 200

IF (N.NE.O) GOTO 300

STOP

END
6. BIBLIOGRAPHIE

- BENSON, programmes de base niveau I et II

- TEKTRONIX

- Manuel d'utilisation FORTRAN 3D

- Manuel SGF-DA (gestion de fichiers)

- Rapport LABORIA sur la normalisation en graphique

- A FORTRAN IV PROGRAM TO DRAW ENHANCED GRAPHIC CHARACTERS

N.M. Wolcott, F.L.Mc Crackin

National bureau of standards Washington
# ANNEXE 1

## Mode d'utilisation sur MITRA 15

1. Lister les segments

liste les tableaux contenant les différents codes
ne peut servir que de contrôle

2. Nouveau caractère origine au réticule

3. Nouveau caractère origine standard

2 - 3 : taper le caractère

seul le premier caractère est pris en compte ex : P1 ≡ P

on tape donc : **carac** **return**

4. Redéfinir la grille on recommence tout

Perd toutes les informations précédentes sur la police en cours.
On réinitialise une police.

5. Stop

Arrêt du programme de codage des caractères.

Si l'on désire conserver les caractères créés, il faut faire
un sauvetage sur disque avant le stop (7.).

6. Tracé de caractères

Taper le caractère (idem à 2 - 3)

* 1 * Tracé avec origine et fin

Reproduit exactement le caractère dessiné précédemment

* 2 * Tracé libre

Idem à * 1 * sans l'origine et sans la fin standard

* 3 * Tracé en un point fixe

- taille du caractère en cm (20 cm maximum)

- cisaillement du caractère Angle := 10*N% de cisaillement

- épaisseur des traits en mm

- position du caractère avec le réticule
  la boite utilisateur définie doit être **inclue entièrement** dans
  l'écran sinon on réitère 10 fois la question.

* 4 * Retour

Reprise aux questions précédentes - ? -
* 5 * Alphabet

Trace l'alphabet défini

* 6 * Autre caractère

Reprise aux questions * ? * après avoir retapé un nouveau caractère

7. Sauver sur disque

Transfère les tableaux en zone DA sous la clé courante

8. Afficher la grille

si par suite d'une fausse manoeuvre on a effacé celle-ci
("CLEAN" intempestif ou autre)

8. Tracé de l'alphabet

idem à 6. * 5 *

9. Optimisation

- voir § 4

- demande sur quel disque et quelle clé on doit sauver la police
  optimisée.

- on peut recopier également sur un autre disque (ex DC et DK)

- on sauve également la police non optimisée sous la clé courante
# ANNEXE II

## Entrée des segments

I. Entrée "allumé"

trace un segment de la position initiale du faisceau jusqu'au coin de carreau le plus proche du réticule.

Position du faisceau après tracé : idem

En cas de carreaux très petits ex : 50*50
on a interêt à placer le réticule très
exactement pour ne pas rater le point.

M. Entrée "éteint"

Idem à I. mais ne trace pas de segment

F. Finit en ce point allumé

Pour créer des caractères centrés

Idem à I. mais termine le caractère courant

G. Finit en ce point éteint

Idem à F. M.

T. Finit au point final

Termine le caractère courant par un "MOVE" au point
de fin implicite défini au départ

D. Détruit le caractère courant

Ce caractère sera considéré comme n'ayant jamais existé

A. Annule le dernier point

N'enregistre pas le dernier point entré et se positionne
au point précédent en l'entourant d'un '0'

C. Définit un contour

Idem à I. mais trace les segments délimitant le contour en
pointillé

Ce contour permet le remplissage ou hachurage de certaines

zones pour : Gothique, Pleins-déliés, caractères publicitaires.
H. Ferme le contour et hachure

Nécessité d'avoir défini au moins deux points.