begin process at 2010 03 20 03:39:08
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

divers

 > DESSIN DE RECTANGLES (POSITION, TAILLE, COULEUR, ÉPAISSEUR)

DESSIN DE RECTANGLES (POSITION, TAILLE, COULEUR, ÉPAISSEUR)


 Information sur la source

Note :
Aucune note
Catégorie :divers Classé sous :rectangle, dessin, graphique, pixel, couleur Niveau :Débutant Date de création :05/02/2009 Date de mise à jour :07/02/2009 11:21:30 Vu :3 438

Auteur : macsou01

Ecrire un message privé
Site perso
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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

  • 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)
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)



 Historique

07 février 2009 11:21:30 :
Découverte d'un bug sous Windows avec DosBox 0.72 (certains rectangles ne sont pas entiers).

 Sources de la même categorie

RECHERCHE DES PALINDROMES D'UN TEXTE SAISI. par PCBill
Source avec Zip LIBRAIRIE GRAPHIQUE (ET PLUS) EN MODE RÉEL par epineurien
Source avec Zip Source avec une capture LIB PROGRESSBAR (PERSONNALISABLE , DÉGRADÉ DE COULEUR,POURCE... par knetus
Source avec Zip Source avec une capture AFFICHE COULEUR par knetus
Source avec Zip BOOT DEPUIS UNE DISQUETTE FORMATTÉ DOS par bofur

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture AFFICHE COULEUR par knetus
Source avec Zip EFFET ARC EN CIEL EN LANGAGE ASM ET EN C++ EN MODE VGA 256 C... par taha_badr
Source avec Zip HISTOGRAMME DE LA FRÉQUENCE DES LETTRES ET DES CHIFFRES RENC... par nicompx
Source avec Zip CRÉATION DE GRAPHIQUES AVEC LES API WINDOWS par Nasman
Source avec Zip HORLOGE ET DATE NUMERIQUE MODE GRAPHIQUE par rythm_of_hell

Commentaires et avis

Commentaire de 42wawa42 le 08/02/2009 12:07:08

Hello bonjour

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

Merci pour réponse
A+
42wawa42

Commentaire de macsou01 le 08/02/2009 12:49:03

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.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

couleur d'un pixel [ par akina ] IlyJe recherche une fonction en asm (rapide) pour récupérer la couleur d'un pixel de l'écran. Si quelqu'un connait une fonction plus rapide que celle couleur en TASM ? [ par redwings ] j'aimerai savoir les instructions qui permettent d'affiche un caractere en couleurAL contient le caractere ...MOV DL,AL MOV AH,02hINT 21h...merci programmation graphique en mode 12h [ par masta_jigga ] J'aimerai poser surement une bete question. Comment puis-je faire pour travailler dans le mode 12h (640x480 en 16 couleurs)en accedant directemen [ASM] Ecrire en couleur un buffer [ par diaboloche ] Slt, donc la question est dans le titre, j'aimerais ecrire en couleur certaines lettres en dehors d'un buffer... Ecrire une simple lettre j'y arrive s Maitriser chaque petit pixel de l'écran [ par tntprog ] Bonjour, J'aimerais pouvoir afficher ou éteindre le moindre petit pixel de mon écran avec la couleur que je désir. Est-ce que quelqu'un sait comment help schema de carte graphique [ par busman ] salut a tous j ai recup une " saphirre radeon x1900 xtx 512m dual - dvi/vivo"SKU#21082-00PN 102-A 52021-52-ATje recherche desesperement le chema elect Impression d'une fenêtre [ par Nasman ] Bonjour,Je suis à la recherche des méthodes à employer pour permettre d'imprimer une fenêtre graphique sur une imprimante sélectionnée. Je n'ai pas de Graphisme 2D Plein écran avec Window [ par epineurien ] Bonjour ! Voilà , j'ai un problême tout simple : je veux faire une application (qui utilise les api-window au passage) qui puisse passer en plein écra luminance d'un pixel [ par raoulli ] bonsoir.comme le titre l'indique, je cherche a connaitre la luminance d'un pixel a l'ecran.j'ai son RGB, mais je n'ai pas trouvé l'API pour pouvoir co bug graphique [ par raoulli ] salut.c'est encore moi.je suis collant hein !Cette fois ci c'est donc pour un bug graphique.Voila, je ne vois pas dutout la maniere de debuguer ce pro


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,796 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales