Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .386
- .model flat, stdcall
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;includem biblioteci, si declaram ce functii vrem sa importam
- includelib msvcrt.lib
- extern exit: proc
- extern malloc: proc
- extern memset: proc
- includelib canvas.lib
- extern BeginDrawing: proc
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;declaram simbolul start ca public - de acolo incepe executia
- public start
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;sectiunile programului, date, respectiv cod
- .data
- ;aici declaram date
- window_title DB "Exemplu proiect desenare",0
- area_width EQU 1200
- area_height EQU 700
- selectie_width EQU 80
- selectie_height EQU 60
- area DD 0
- deltay DD 0
- deltax DD 0
- deltaerr DD 0.0
- errorr DD 0.0
- unu dd 1.0
- zerocinci dd 0.5
- click DD 0
- semn DD 0
- x DD 0
- y DD 0
- forma DD 0
- counter DD 0 ; numara evenimentele de tip timer
- arg1 EQU 8
- arg2 EQU 12
- arg3 EQU 16
- arg4 EQU 20
- symbol_width EQU 10
- symbol_height EQU 20
- include digits.inc
- include letters.inc
- include linie.inc
- include patrat.inc
- include cerc.inc
- .code
- ; procedura make_text afiseaza o litera sau o cifra la coordonatele date
- ; arg1 - simbolul de afisat (litera sau cifra)
- ; arg2 - pointer la vectorul de pixeli
- ; arg3 - pos_x
- ; arg4 - pos_y
- make_text proc
- push ebp
- mov ebp, esp
- pusha
- mov eax, [ebp+arg1] ; citim simbolul de afisat
- cmp eax, 'A'
- jl make_digit
- cmp eax, 'Z'
- jg make_digit
- sub eax, 'A'
- lea esi, letters
- jmp draw_text
- make_digit:
- cmp eax, '0'
- jl make_space
- cmp eax, '9'
- jg make_space
- sub eax, '0'
- lea esi, digits
- jmp draw_text
- make_space:
- mov eax, 26 ; de la 0 pana la 25 sunt litere, 26 e space
- lea esi, letters
- draw_text:
- mov ebx, symbol_width
- mul ebx
- mov ebx, symbol_height
- mul ebx
- add esi, eax
- mov ecx, symbol_height
- bucla_simbol_linii:
- mov edi, [ebp+arg2] ; pointer la matricea de pixeli
- mov eax, [ebp+arg4] ; pointer la coord y
- add eax, symbol_height
- sub eax, ecx
- mov ebx, area_width
- mul ebx
- add eax, [ebp+arg3] ; pointer la coord x
- shl eax, 2 ; inmultim cu 4, avem un DWORD per pixel
- add edi, eax
- push ecx
- mov ecx, symbol_width
- bucla_simbol_coloane:
- cmp byte ptr [esi], 0
- je simbol_pixel_alb
- mov dword ptr [edi], 0
- jmp simbol_pixel_next
- simbol_pixel_alb:
- mov dword ptr [edi], 0FFFFFFh
- simbol_pixel_next:
- inc esi
- add edi, 4
- loop bucla_simbol_coloane
- pop ecx
- loop bucla_simbol_linii
- popa
- mov esp, ebp
- pop ebp
- ret
- make_text endp
- ; un macro ca sa apelam mai usor desenarea simbolului
- make_text_macro macro symbol, drawArea, x, y
- push y
- push x
- push drawArea
- push symbol
- call make_text
- add esp, 16
- endm
- make_selectie proc
- push ebp
- mov ebp, esp
- pusha
- mov eax, [ebp+arg1] ; citim simbolul de afisat
- cmp eax, 'L'
- je linie_S
- cmp eax, 'P'
- je patrat_S
- cmp eax, 'C'
- je cerc_S
- linie_S:
- mov eax,0
- lea esi, linie
- jmp draw_selectie
- patrat_S:
- mov eax,0
- lea esi, patrat
- jmp draw_selectie
- cerc_S:
- mov eax,0
- lea esi, cerc
- jmp draw_selectie
- draw_selectie:
- mov ebx, selectie_width
- mul ebx
- mov ebx, selectie_height
- mul ebx
- add esi, eax
- mov ecx, selectie_height
- bucla_selectie_linii:
- mov edi, [ebp+arg2] ; pointer la matricea de pixeli
- mov eax, [ebp+arg4] ; pointer la coord y
- add eax, selectie_height
- sub eax, ecx
- mov ebx, area_width
- mul ebx
- add eax, [ebp+arg3] ; pointer la coord x
- shl eax, 2 ; inmultim cu 4, avem un DWORD per pixel
- add edi, eax
- push ecx
- mov ecx, selectie_width
- bucla_selectie_coloane:
- cmp byte ptr [esi], 0
- je selectie_pixel_alb
- mov dword ptr [edi], 0
- jmp selectie_pixel_next
- selectie_pixel_alb:
- ;mov dword ptr [edi], 0FFFFFFh
- selectie_pixel_next:
- add esi, 4
- add edi, 4
- loop bucla_selectie_coloane
- pop ecx
- loop bucla_selectie_linii
- popa
- mov esp, ebp
- pop ebp
- ret
- make_selectie endp
- ; un macro ca sa apelam mai usor desenarea simbolului
- make_selectie_macro macro symbol, drawArea, x, y
- push y
- push x
- push drawArea
- push symbol
- call make_selectie
- add esp, 16
- endm
- ; functia de desenare - se apeleaza la fiecare click
- ; sau la fiecare interval de 200ms in care nu s-a dat click
- ; arg1 - evt (0 - initializare, 1 - click, 2 - s-a scurs intervalul fara click)
- ; arg2 - x coloana
- ; arg3 - y linia
- draw proc
- push ebp
- mov ebp, esp
- pusha
- mov eax, [ebp+arg1]
- cmp eax, 1
- jz evt_click
- cmp eax, 2
- jz evt_timer ; nu s-a efectuat click pe nimic
- ;mai jos e codul care intializeaza fereastra cu pixeli albi
- mov eax, area_width
- mov ebx, area_height
- mul ebx
- shl eax, 2
- push eax
- push 255
- push area
- call memset
- add esp, 12
- mov [click],0
- mov [forma],0
- make_selectie_macro 'L',area,0,0
- make_selectie_macro 'P',area,80,0
- make_selectie_macro 'C',area,160,0
- jmp final_draw
- evt_click:
- push ecx
- mov eax, [ebp+arg3]
- mov ecx, area_width
- mul ecx
- add eax, [ebp+arg2]
- shl eax,2
- mov ecx, area
- add ecx, eax
- mov dword ptr [ecx],1h
- pop ecx
- mov eax, [ebp+arg3] ;y linie
- cmp eax,selectie_height
- jg next
- mov ebx,[ebp+arg2] ;x
- cmp ebx,80
- jg next_p
- mov [forma],1 ;forma linie
- jmp final_draw
- next_p:
- cmp ebx,160
- jg next_c
- mov [forma],2 ;forma patrat
- jmp final_draw
- next_c:
- cmp ebx,240
- jg next
- mov [forma],3 ;forma cerc
- jmp final_draw
- next:
- cmp forma,1
- je draw_linie
- cmp forma,2
- je draw_patrat
- cmp forma,3
- je draw_cerc
- ;cmp forma,0
- jmp final_draw
- draw_linie:
- cmp click,0
- je click1
- make_text_macro '0',area,10,10
- mov [click],0
- ;Bresenham
- mov eax, x
- sub eax,[ebp+arg2] ;deltax
- mov [deltax],eax
- mov ebx, y
- sub ebx,[ebp+arg3] ;deltay
- mov [deltay],ebx
- mov eax, y
- cmp eax,[ebp+arg3]
- jg semn1
- mov [semn],0
- jmp semn2
- semn1:
- mov [semn],0
- semn2:
- finit
- fld deltax
- fld deltay
- fdiv
- fabs
- fist [deltaerr] ;deltaerr
- mov [errorr],0
- finit
- fld deltax
- fabs
- fist [deltax]
- mov ecx,deltax
- mov eax, y
- mov edx,0
- loop1:
- push eax
- push ecx
- ;mov edx,eax
- mov ecx, area_width
- mov edx,0
- mul ecx
- pop ecx
- mov edx,ecx
- add edx,x
- add eax,edx
- shl eax,2
- mov edx,area
- add edx, eax
- mov dword ptr[edx],0h
- pop eax
- mov ebx,errorr
- add ebx,deltaerr
- mov [errorr],ebx
- begin:
- cmp semn,1
- je semn0
- add [y],1
- jmp semn3
- semn0:
- sub [y],1
- semn3:
- finit
- fld errorr
- fsub unu
- fist [errorr]
- mov ebx,errorr
- cmp ebx,zerocinci
- jg begin
- loop loop1
- mov [click],0
- jmp final_draw
- click1:
- mov [click],1
- push ecx
- mov ecx,[ebp+arg2]
- mov [x],ecx
- mov ecx,[ebp+arg3]
- mov [y],ecx
- pop ecx
- jmp final_draw
- draw_patrat:
- jmp final_draw
- draw_cerc:
- jmp final_draw
- evt_timer:
- final_draw:
- popa
- mov esp, ebp
- pop ebp
- ret
- draw endp
- start:
- ;alocam memorie pentru zona de desenat
- mov eax, area_width
- mov ebx, area_height
- mul ebx
- shl eax, 2
- push eax
- call malloc
- add esp, 4
- mov area, eax
- ;apelam functia de desenare a ferestrei
- ; typedef void (*DrawFunc)(int evt, int x, int y);
- ; void __cdecl BeginDrawing(const char *title, int width, int height, unsigned int *area, DrawFunc draw);
- push offset draw
- push area
- push area_height
- push area_width
- push offset window_title
- call BeginDrawing
- add esp, 20
- ;terminarea programului
- push 0
- call exit
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement