GFA
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le Deal du moment :
Pokémon EV06 : où acheter le Bundle Lot ...
Voir le deal

TUTO Bliter la fonction LINE-A

GFA :: TUTOS :: Confirmés

Aller en bas

TUTO Bliter la fonction LINE-A Empty TUTO Bliter la fonction LINE-A

Message par Shadow272 Ven 20 Nov - 10:02

Par Sporkinet


La fonction Line-A est moins évidente à mettre en oeuvre, mais permet de paramétrer plus finement le fonctionnement du blitter : quasiment tous les registres du blitter sont gérés, pour faire plus il faudra placer directement les données en mémoire, mais ça dépasse le cadre de ce tutorial.

BITBLT parametres&()
BITBLT struct%


Les paramètres sont stockés dans une structure de 76 octets. La différence entre les deux appels est subtile : en fournissant l'adresse en mémoire, les données de certains champs seront modifiés par le blitter ; en fournissant le tableau, le contenu de ce dernier est d'abord copié dans un buffer interne, autrement dit les données d'origines sont préservées.

En revanche, quelque soit la variante, la préparation sera la même : on placera les valeurs à l'aide de DPOKE et LPOKE, ou leurs équivalents CARD{} et LONG{}.

Pour comprendre certains paramètres, il faut savoir comment les données graphiques sont stockées en mémoire.

Au début tout était noir ou blanc...

Un pixel monochrome est soit allumé, soit éteint. Son état est donc exactement représenté par un bit. Un octet contient donc huit pixels, et pour aller plus vite, on manipule les octets par packet de deux (un mot).

Puis vint la couleur...

Dans les modes couleurs usuels (hors mode True Color du Falcon), chaque pixel est représenté par un code couleur. Une table de correspondance, qu'on appelle plus couramment "palette de couleur" permet au processeur vidéo d'afficher la couleur physique associée à chaque code. Avec deux bits, on a 4 codes possibles, 16 codes avec 4 bits etc...

Si on garde tous les bits d'un pixel d'un seul tenant, le système va devoir manipuler plusieurs bits d'un même octets. Et surtout il faut réécrire les routines systèmes pour chaque mode. L'astuce consiste donc à séparer les bits de chaque pixels, et de regrouper tous les bits de même niveau : les plans de couleur. Ainsi, tracer un pixel revient à tracer le même pixel sur chaque plan, et on a économisé du code.

Pour limiter les déplacements en mémoire pour afficher l'écran, on entrelace ces plans : on commence par le premier mot du premier plan de couleur, puis le premier mot du second plan de couleur, etc.

La structure struct% est remplie ainsi :
Les valeurs soulignées sont modifiées par le blitter. Lorsqu'on utilise un tableau :

struct% = V:parametres&(0)

CARD{struct%}
Largeur en pixels du bloc à copier
CARD{struct%+2}
Hauteur en pixels du bloc à copier
CARD{struct%+4}
Nombre de plans de couleur
(monochrome : 1 ; 4 couleurs : 2 ; 16 couleurs : 4 ; 256 couleurs : Cool
CARD{struct%+6}
Couleur de premier plan
CARD{struct%+8}
Couleur de fond
LONG{struct%+10}
Tableau de 4 octets contenant le mode graphique à utiliser en fonction des bits de la couleur source et destination
Pour chaque plan de couleur, index = (bit de la couleur de premier plan * 2) + (bit de la couleur de fond)
CARD{struct%+14}
Coordonnées x du coin en haut à gauche, dans la surface source, du bloc à copier
CARD{struct%+16}
Coordonnées y du coin en haut à gauche, dans la surface source, du bloc à copier
LONG{struct%+18}
Adresse de la surface source
CARD{struct%+22}
Offset en octets entre deux mots du même plan de couleur
En général, CARD{struct%+22} = 2 * Nombre de plan de couleur de la surface source
CARD{struct%+24}
Incrément en octets entre le début d'une ligne et la suivante
Pour une zone mémoire continue, ce sera la largeur en pixel * le nombre de plan de couleur *
CARD{struct%+26}
Incrément en octets pour passer au plan suivant
En général, ce sera 2
CARD{struct%+28}
Coordonnées x du coin en haut à gauche, dans la surface cible, du bloc à copier
CARD{struct%+30}
Coordonnées y du coin en haut à gauche, dans la surface cible, du bloc à copier
LONG{struct%+32}
Adresse de la surface cible
CARD{struct%+36}
Incrémenten octets entre deux mots du même plan de couleur
En général, CARD{struct%+36} = 2 * Nombre de plan de couleur de la surface cible
CARD{struct%+38}
Increment en octets entre le début d'une ligne et la suivante
Pour une zone mémoire continue, ce sera la largeur en pixel * le nombre de plan de couleur *
CARD{struct%+40}
Incrément en octets pour passer au plan suivant
En général, ce sera 2
LONG{struct%+42}
Adresse du motif de demi-teinte
L'adresse doit être non nulle pour utiliser cette fonctionnalité
CARD{struct%+46}
Taille en octets d'une ligne de motif de demi-teinte
CARD{struct%+48}
Taille en octets d'un plan d'une ligne de motif
Si le motif est sur un seul plan, on met 0
CARD{struct%+50}
Taille du motif en octets - 1
Cette taille doit être une puissance de deux (2, 4, 8, 16, ...)

Le reste de la zone est réservé au blitter


Les couleurs de premier plan, de fond, et le mode graphique

C'est trois valeurs fonctionnent ensemble, et permettent de définir un mode graphique différent pour chaque plan de couleur.

Pour déterminer le mode graphique du plan de couleur p, on récupère le bit correspondant de la couleur de premier plan et de fond, et on calcule un index comme indiqué plus haut.

Par exemple, pour la couleur de premier plan 14 (1110 en binaire) et la couleur de fond 5 (0101) :

       bitplan
        4321
FG color 1110 => 14
BG color 0101 => 5

           FG BG
Bitplan 1 =  0  1 = 1
Bitplan 2 =  1  0 = 2
Bitplan 3 =  1  1 = 3
Bitplan 4 =  1  0 = 1


Une fois l'index calculé pour un plan de couleur, on consulte le mode graphique comme un tableau de quatre octets.

Par exemple, en reprenant les couleurs 14 et 5 pour le premier plan et le fond, et pour un tableau contenant les valeurs 3, 7, 6, 13 (0307060d en hexadécimal), valeurs qui correspondent aux GRAPHMODE 1 a GRAPHMODE 4, respectivement.

Index  0  1  2  3
Value 03 07 06 0D

           Index => Mode
Bitplan 1 :   1   => 07
Bitplan 2 :   2   => 06
Bitplan 3 :   3   => 0D
Bitplan 4 :   1   => 07


Dans les cas usuels, c'est à dire le même mode graphique pour chaque plan, le plus simple est de remplir le tableau avec la même valeur, de sorte que les couleurs de premier plan et de fond importent peu.

Par exemple, pour avoir un résultat équivalent à GRAPHMODE 1 (mode 3), on mettra la valeur &H03030303.

Le motif de demi teinte

On peut fournir au blitter un motif de 16 pixels de large et de hauteur libre. Ce motif est soit monochrome, soit en couleur.

Lorsqu'un motif est fourni au blitter, celui-ci combine le motif avec les données graphiques source (opérateur binaire AND). Si le motif est en couleur, chaque plan de couleur est traité individuellement. Le motif de demi-teinte est fixe par rapport à la surface cible.

La taille en octet du motif doit être une puissance de deux.

Le programme d'exemple

L'exemple prépare des graphismes à l'écran, puis effectue un copier/coller d'un bloc, d'abord normalement (comme pour l'exemple de la fonction VDI), puis en utilisant les motifs de demi-teinte monochrome et couleur.

On copie deux fois avec le motif monochrome, pour montrer que le motif est fixe. Les couleurs choisie pour le bloc graphique à copier mettent en évidence les 4 plans de couleurs.

La surface source est la moitié supérieure de l'écran, la surface destination est la moitié inférieure. Appuyez sur une touche pour passer à l'étape suivante.

On en a terminé avec Bitblt.

Shadow272 :
Ben, va falloir m'y mettre moi

HYLST :
Salut et merci pour ce tutoriel avisé =)

j'avoue avoir du mal à saisi le principe de couleur de fond et de 1er plan.
Si 4 plans car écrancs décomposé en blocs de 16 pixels par plan.
0.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15 16 Bits du Plan 1
0.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15 16 Bits du Plan 2
0.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15 16 Bits du Plan 3
0.1.2.3.4.5.6.7.8.9.10.11.12.13.14.15 16 Bits du Plan 4
=4*8 bits = 4 octets = 1 long mot
Je raisonne en couleurs par plan :
Pour un pixel donné, 1 bit tous les 2 octets code sa couleur une fois les 4 bits réunis, couleur indexant le registre couleur &ffff8240 du shifter video.
HSB 0 0 0 0 MSB = couleur de fond aucun plan "activé" mis à 1
HSB 0 0 0 1 MSB = couleur 1 correspondant au seul 1er plan
HSB 0 0 1 0 MSB = couleur 2 correspondant au seul 1er plan
HSB 0 1 0 0 MSB = couleur 4 correspondant au seul 1er plan
HSB 1 0 0 0 MSB = couleur 8 correspondant au seul 1er plan

Couleurs appartenant aux 2 1ers plans : 0000 0001 0010 0011 soit 4 couleurs, de 0 à 3. Mais... quelle est cette notion de plan de couleur par plan ?
Si on utilise qu'un plan, on laisse le 3 autres octets du tableau à 0 ? 2 plans les 2 autres à 0 ? ...
D'où "vient" ce tableau Value 03 07 06 0D ?

Merci d'avance =)

Leglod :
Je vois que la question des plan ne taraude pas que moi a l'epoque j'avais fini par comprendre la logique mais depuis j'ai tout oublier faut qu'on me rexplique aussi ! Very Happy

Sporkinet :
Salut, après m'être relu (ça fait un moment que j'ai écrit çà Very Happy ), il faut d'abord bien comprendre que bitblt ne travaille que plan par plan, chaque plan étant traité isolément.

Autrement dit, la fonction se fiche de savoir que tel pixel est de la couleur numéro 13, elle traitera les bits 1, puis 0, puis 1, puis 1 (13 = 1101 en binaire, j'ai commencé par le bit de poids faible)

le tableau de 4 octets est construit par le programme appelant, habituellement, on mettra la même valeur quatre fois (pour une image sur 4 plans -16 couleurs-) MAIS l'algorithme de sélection de la valeur du tableau permet potentiellement d'utiliser 4 mode graphique différents, le mode à utiliser pour chaque bitplan étant défini tel qu'expliqué dans le tutoriel.
Shadow272
Shadow272
Admin

Messages : 328
Date d'inscription : 28/12/2017
Age : 65
Localisation : Hainaut Belgique

http://toutatari.blog4ever.xyz/

Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

GFA :: TUTOS :: Confirmés

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum