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 : Assembleur - Le remplissage de surfaces par le Blitter
(Article écrit par Frédéric Mazué et extrait d'Amiga News Tech - juin 1990)
|
|
Aujourd'hui, nous nous intéressons au remplissage de surfaces par le Blitter.
Pas de difficultés particulières, c'est même très simple pour une fois.
Petit préliminaire
Avant de rentrer dans le vif du sujet, il est peut-être nécessaire de rappeler le détail des bits
du registre BLTCON1 pour ceux qui auraient manqué les épisodes précédents.
BLTCON1, décalage $42, registre 16 bits
Bit numéro |
Nom |
Fonction |
15 |
BSH3 |
Expliqué dans cet article |
14 |
BSH2 |
Expliqué dans cet article |
13 |
BSH2 |
Expliqué dans cet article |
12 |
BSH1 |
Expliqué dans cet article |
11-5 |
--- |
Ces sept bits ne sont pas utilisés |
4 |
EFE |
Exclusive Fill Enable |
3 |
IFE |
Inclusive Fill Enable |
2 |
FCI |
Fill Carry In |
1 |
DESC |
Mode décrémentation (descending) |
0 |
LINE |
Mode tracé de ligne |
Le vif du sujet
Nous avons vu précédemment que le Blitter travaille avec des fenêtres "rectangulaires". Sachant cela, il
sera possible de remplir n'importe quelle surface, à condition que celle-ci soit inscrite dans la fenêtre
qui sera définie dans le registre BLTSIZE.
Comment le Blitter procède-t-il pour remplir une surface ? Comme d'habitude, il travaille ligne par ligne,
mais cette fois il commencera par la ligne la plus en bas de la fenêtre et traitera cette ligne de droite à gauche,
et ainsi de suite jusqu'à la ligne la plus haute.
Du point de vue de la programmation, cela signifie que, dans ce cas, le Blitter travaille par décrémentation
d'adresses. Cela implique que pour un remplissage de surface, il est obligatoire d'activer le bit DESC.
De même, les registres BLTxPTH devront pointer sur les derniers mots des zones source et cible.
Voyons maintenant comment le Blitter rempli une ligne. Hypothèse de départ, le bit FCI n'est pas mis.
Soit l'exemple de ligne à remplir :
.....1.....1.....1........
|
Un point correspond à un point écran éteint et un 1 correspond à un point écran allumé et ceci
dans une fenêtre de deux mots de large.
Le Blitter examine le point le plus à droite : ce point est éteint, le Blitter passe au point immédiatement
à gauche qui lui aussi est éteint et ainsi de suite jusqu'à ce qu'il rencontre le premier point allumé. A
ce moment, le Blitter inverse le bit FCI. Dans ce cas précis le Blitter met donc le bit FCI à 1.
Le Blitter continue son examen sur la gauche et, à ce moment, de deux choses l'une :
- Le point examiné est éteint : dans ce cas le Blitter écrit le bit FCI à l'emplacement correspondant au point. Le
point s'allume.
- Le point examiné est allumé : dans ce cas, comme précédemment, le Blitter inverse le bit FCI, puis continue
son examen à gauche.
Après travail du Blitter, la ligne de l'exemple devient donc :
.....1111111.....1111111........
|
Maintenant que vous avez tout compris, il est possible de résumer très simplement : le Blitter examine chaque
point de droite à gauche. Chaque point éteint est "rempli" par le bit FCI. A chaque point allumé rencontré
le bit FCI est inversé.
L'hypothèse de départ était FCI = 0. Mais il est parfaitement possible d'initialiser ce bit à 1 dès le départ.
Observons ce qu'il se passe à partir du même exemple : le premier point est éteint, donc le Blitter y place le
bit FCI. Celui-ci étant initialisé à 1, le point s'allume, et ainsi de suite jusqu'à ce que le Blitter rencontre
un point allumé. A ce moment le bit FCI sera inversé (et donc dans ce cas annulé) et ainsi de suite. Le
résultat sera donc :
111111.....111111..... 111111111
|
Autrement dit, nous avons colorié l'image en "négatif".
Attention au piège !
Tout ceci c'est bien joli, mais il y a quand même un traquenard. Pour que tout se passe bien, il faut que
chaque ligne de l'image à colorier contienne un nombre pair de points allumés. Sinon "........11.....",
par exemple, ne sera pas rempli comme ceci : "........11111111" mais comme cela : "1111111111111111".
En clair (si j'ose dire) cela s'appelle une grosse tache !
Nous en avons presque fini. Il nous reste à savoir qu'il existe en fait deux modes de remplissage.
- Le mode IFE, ce qui signifie Inclusive Fill Enable ou mode de remplissage inclusif. Ce mode vous
le connaissez déjà car les exemples précédents sous-entendaient qu'il était utilisé. Vous savez tout,
n'en parlons plus.
- Le mode EFE, ce qui signifie Exclusive Fill Enable ou mode de remplissage exclusif. Que se passe-t-il
avec ce mode ? Très simple : nous avons vu que lorsque le Blitter rencontre un point allumé, il inverse
le bit FCI. Si cette inversion met le bit à 1, rien ne change. Par contre, si l'inversion met le bit
à 0, alors le point responsable de l'inversion sera éteint. Pour être plus clair, le premier exemple sera
rempli en mode EFE comme suit : ......111111......111111........ soit deux points de moins qu'en mode IFE.
Et maintenant le programme
Remarquez qu'au label "data" les données de notre image (Cf. articles précédents) ont été modifiées.
Presque tous les bits sont nuls et il ne subsiste plus qu'un "squelette" qui sera notre motif à
remplir. Comme d'habitude, le programme ouvre les bibliothèques nécessaires puis un écran Intuition à
un plan de bits.
Premièrement, le programme copie on ne peut plus simplement le squelette dans le plan de bits de
l'écran puis il en effectue le remplissage.
Deuxièmement, on ruse : le squelette est installé en mode décrémentation et en même temps on
active un mode de remplissage dans BLTCON1 (dans ce cas le mode IFE). Oh miracle, notre motif est rempli
en même temps qu'il est installé et le Blitter a travaillé aussi vite que pour une copie de données
simple. Décidément ce Blitter est génial !
Troisièmement, on reprend la ruse du deuxièmement mais avec le mode EFE et on constate comme prévu
que le Blitter a supprimé une colonne de points à gauche du motif et une colonne de points à droite dans
le trou du motif.
Quatrièmement, toujours avec ruse, en mode IFE, mais au départ le bit FCI est initialisé à 1 :
on a un remplissage en négatif.
Enfin, après un clic de la souris, le programme ferme écran et bibliothèques et rend la main.
Tout est dit à propos des remplissages de surfaces et je vous donne rendez-vous le mois prochain pour un gros morceau,
le tracé de droites.
Remplissage de surface avec le Blitter
Mise en place du "squelette"
Remplissage du "squelette"
Mise en place du "squelette" et remplissage en même temps
Mise en place en remplissage exclusif
Mise en place et remplissage en "négatif"
|