Dessin de rectangles (position, taille, couleur, épaisseur)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 10 562 fois - Téléchargée 15 fois

Contenu du snippet

Comme l'indique le titre, c'est un petit programme permettant de dessiner des rectangles dont on peut définir la position, la taille, la couleur (parmi 16), et l'épaisseur de trait.
C'est programmé en NASM.
J'ai utilisé la pile pour les arguments des fonctions.
C'est ma première source donc c'est possible qu'il y ait des incohérences, des erreurs ou autre... :)
Le code est un peu commenté.

Après avoir testé ce code sous Windows Vista (via DosBOX), j'ai remarqué que certains rectangles ne sont pas entiers... (alors que via xdosemu sous Linux il n'y a pas ce problème).

Source / Exemple :


bits 16
org 0x100

section .text
	;Mode vidéo VGA (640 * 480 16 couleurs)
	mov ah, 00h
	mov al, 12h
	int 10h
	
	;Codes couleurs en hexadécimal
	;00h : noir
	;01h : bleu
	;02h : vert
	;03h : cyan
	;04h : rouge
	;05h : mangenta
	;06h : brun 
	;07h : gris clair
	;08h : gris foncé
	;09h : bleu clair
	;0Ah : vert clair
	;0Bh : cyan clair
	;0Ch : rouge clair
	;0Dh : mangenta clair
	;0Eh : jaune
	;0Fh : blanc

	;On dessine un rectangle épais
	push 0Dh
	push 24
	push 130
	push 234
	push 139
	push 56
	call drawRectWithWidth

	;On dessine un rectangle plein (épaisseur de trait = minimum(largeur, hauteur)  / 2)
	push 0Ch
	push 350
	push 130
	push 76
	push 167
	push 76 / 2
	call drawRectWithWidth

	;On dessine un rectangle qui superpose les autres
	push 02h
	push 55
	push 237
	push 471
	push 167
	push 19
	call drawRectWithWidth

	;On dessine un rectangle encadrant la fenêtre
	push 06h
	push 0
	push 0
	push 640
	push 480
	push 12
	call drawRectWithWidth

	;On quitte le programme
	mov ch, 0
	mov ah, 4Ch
	int 21h

	;Fonction de dessin de ligne
	;Prend en paramètres :
	;- Couleur [bp + 12]
	;- Longueur [bp + 10]
	;- Abscisse [bp + 8]
	;- Ordonnée [bp + 6]
	;- Direction (0 : horizontale, 1 : verticale) [bp + 4]
	drawLine:
		push bp
		mov bp, sp

		mov bx, -1 ;Pour un coin superieur gauche non biseauté

		whileDrawLine: 
			cmp bx, [bp + 10]
			je _whileDrawLine
			inc bx

			;On dessine un pixel
			mov ah, 0Ch
			mov al, [bp + 12]

			;On dessine le pixel en fonction de la direction (horizontale ou verticale)
			mov cx, [bp + 4]
			cmp cx, 1
			je vertical
			horizontal:
				mov cx, bx
				add cx, [bp + 8]
				mov dx, [bp + 6]
				jmp draw
			vertical:
				mov cx, [bp + 8]
				mov dx, bx
				add dx, [bp + 6]
			draw:
			int 10h

			jmp whileDrawLine
		_whileDrawLine:

		pop bp
		ret 10 ;2 * le nombre de paramètres (important)

	;Fonction de dessin de rectangle
	;Prend en paramètres :
	;- Couleur [bp + 12]
	;- Abcsse [bp + 10]
	;- Ordonnée [bp + 8]
	;- Largeur [bp + 6]
	;- Hauteur [bp + 4]
	drawRect:
		push bp
		mov bp, sp

		mov ax, [bp + 12]
		push ax
		mov ax, [bp + 6]
		push ax
		mov ax, [bp + 10]
		push ax
		mov ax, [bp + 8]
		push ax
		push 0
		call drawLine ;Ligne horizontale haute

		mov ax, [bp + 12]
		push ax
		mov ax, [bp + 4]
		push ax
		mov ax, [bp + 10]
		push ax
		mov ax, [bp + 8]
		push ax
		push 1
		call drawLine ;Ligne verticale gauche

		mov ax, [bp + 12]
		push ax
		mov ax, [bp + 6]
		push ax
		mov ax, [bp + 10]
		push ax
		mov ax, [bp + 4]
		add ax, [bp + 8]
		push ax
		push 0
		call drawLine ;Ligne horizontale basse

		mov ax, [bp + 12]
		push ax
		mov ax, [bp + 4]
		push ax
		mov ax, [bp + 10]
		add ax, [bp + 6]
		push ax
		mov ax, [bp + 8]
		push ax
		push 1
		call drawLine ;Ligne verticale droite

		pop bp
		ret 10 ;2 * le nombre de paramètres (important)

	;Fonction de dessin de rectangle avec une épaisseur de trait
	;Prend en paramètres :
	;- Couleur [bp + 14]
	;- Abcsse [bp + 12]
	;- Ordonnée [bp + 10]
	;- Largeur [bp + 8]
	;- Hauteur [bp + 6]
	;- Epaisseur de trait [bp + 4]
	drawRectWithWidth:
		push bp
		mov bp, sp

		;On annule l'épaisseur de trait si elle est plus grande que la largeur ou la hauteur du rectangle divisée par 2
		;Car sinon le programme plante et/ou dessine n'importe quoi
		mov bx, [bp + 8]
		mov dx, [bp + 6]
		mov cx, [bp + 4]
		add cx, [bp + 4]
		
		cmp cx, bx
		ja disableWidth
		cmp cx, dx
		ja disableWidth

		mov dx, [bp + 4]
		jmp _disableWidth

		disableWidth:
			mov dx, 1
		_disableWidth:

		mov bx, 0

		;Boucle qui dessine dx rectangles d'épaisseur simple (grâce à la fonction drawRect) afin d'avoir une épaisseur
		whileDrawRectWithWidth: 
			cmp bx, dx
			je _whileDrawRectWithWidth
			inc bx
			push bx
			push dx

			mov ax, [bp + 14]
			push ax
			mov ax, [bp + 12]
			add ax, bx
			dec ax
			push ax
			mov ax, [bp + 10]
			add ax, bx
			dec ax
			push ax
			mov ax, [bp + 8]
			sub ax, bx
			sub ax, bx
			inc ax
			push ax
			mov ax, [bp + 6]
			sub ax, bx
			sub ax, bx
			inc ax
			push ax
			call drawRect

			pop dx
			pop bx

			jmp whileDrawRectWithWidth
		_whileDrawRectWithWidth:

		pop bp
		ret 12 ;2 * le nombre de paramètres (important)

A voir également

Ajouter un commentaire

Commentaires

Messages postés
45
Date d'inscription
mardi 20 mars 2007
Statut
Membre
Dernière intervention
28 juillet 2011

Alors pour les rectangles, j'ai un peu compris, ce n'est pas un histoire de position, mais de longueur.
L'erreur est donc dans la fonction drawLine. En effet, impossible de faire une ligne de plus de 255 px (comme si on était en 8 bits). Pourtant, le compteur dans drawLine est bx (16 bits). D'ailleurs il n'y a pas de problème sous xdosemu.
Messages postés
143
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
6 septembre 2011

Hello bonjour

"certains rectangles ne sont pas entiers"
Toujours les memes positions?

Merci pour réponse
A+
42wawa42

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.