Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 1333 → Rev 1334

/kernel/trunk/gui/button.inc
3,89 → 3,172
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
$Revision$
 
 
max_buttons=4095
dececx:
push edx
push ecx
button._.MAX_BUTTONS = 4095
 
mov edx,2
.loop:
 
cmp byte [esp+edx],0x20
jae @f
mov [esp+edx],byte 0x20
@@:
sub [esp+edx],byte 0x20
;==============================================================================
;///// public functions ///////////////////////////////////////////////////////
;==============================================================================
 
dec edx
jns .loop
struc SYS_BUTTON
{
.pslot dw ?
.id_lo dw ?
.left dw ?
.width dw ?
.top dw ?
.height dw ?
.id_hi dw ?
.sizeof:
}
virtual at 0
SYS_BUTTON SYS_BUTTON
end virtual
 
pop ecx
pop edx
ret
iglobal
mx dw 0x0 ; keeps the x mouse's position when it was clicked
my dw 0x0 ; keeps the y mouse's position when it was clicked
bPressedMouseXY_B db 0x0
btn_down_determ db 0x0
endg
 
incecx:
push edx
push ecx
align 4
;------------------------------------------------------------------------------
syscall_button: ;///// system function 8 //////////////////////////////////////
;------------------------------------------------------------------------------
; Define/undefine GUI button object
;------------------------------------------------------------------------------
; Define button arguments:
; ebx = pack[16(x), 16(width)]
; ecx = pack[16(y), 16(height)]
; edx = pack[8(flags), 24(button identifier)]
; flags bits:
; 7 (31) = 0
; 6 (30) = don't draw button
; 5 (29) = don't draw button frame when pressed
; esi = button color
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Undefine button arguments:
; edx = pack[8(flags), 24(button identifier)]
; flags bits:
; 7 (31) = 1
;------------------------------------------------------------------------------
; do we actually need to undefine the button?
test edx, 0x80000000
jnz .remove_button
 
mov edx,2
.loop:
; do we have free button slots available?
mov edi, [BTN_ADDR]
mov eax, [edi]
cmp eax, button._.MAX_BUTTONS
jge .exit
 
cmp byte [esp+edx],0xdf
jbe @f
mov [esp+edx],byte 0xdf
@@:
add [esp+edx],byte 0x20
; does it have positive size? (otherwise it doesn't have sense)
or bx, bx
jle .exit
or cx, cx
jle .exit
 
dec edx
jns .loop
pop ecx
pop edx
ret
; make coordinates clientbox-relative
push eax
mov eax, [current_slot]
rol ebx, 16
add bx, word[eax + APPDATA.wnd_clientbox.left]
rol ebx, 16
rol ecx, 16
add cx, word[eax + APPDATA.wnd_clientbox.top]
rol ecx, 16
pop eax
 
incecx2:
push edx
push ecx
; basic checks passed, define the button
push ebx ecx edx
inc eax
mov [edi], ax
shl eax, 4
add edi, eax
; NOTE: this code doesn't rely on SYS_BUTTON struct, please revise it
; if you change something
mov ax, [CURRENT_TASK]
stosw
mov ax, dx
stosw ; button id number: bits 0-15
mov eax, ebx
rol eax, 16
stosd ; x start | x size
mov eax, ecx
rol eax, 16
stosd ; y start | y size
mov eax, edx
shr eax, 16
stosw ; button id number: bits 16-31
pop edx ecx ebx
 
mov edx,2
.loop:
; do we also need to draw the button?
test edx, 0x40000000
jnz .exit
 
cmp byte [esp+edx],0xeb
jbe @f
mov [esp+edx],byte 0xeb
@@:
add [esp+edx],byte 0x14
; draw button body
 
dec edx
jns .loop
pop ecx
pop edx
ret
pushad
 
drawbuttonframes:
; calculate window-relative coordinates
movzx edi, cx
shr ebx, 16
shr ecx, 16
mov eax, [TASK_BASE]
add ebx, [eax - twdw + WDATA.box.left]
add ecx, [eax - twdw + WDATA.box.top]
mov eax, ebx
shl eax, 16
mov ax, bx
add ax, word[esp + 16]
mov ebx, ecx
shl ebx, 16
mov bx, cx
 
push esi
; calculate initial color
mov ecx, esi
cmp [buttontype], 0
je @f
call button._.incecx2
 
; set button height counter
@@: mov edx, edi
 
.next_line:
call button._.button_dececx
push edi
push eax
push ebx
push ecx
push edx
xor edi, edi
call [draw_line]
pop edi
add ebx, 0x00010001
dec edx
jnz .next_line
 
popad
 
; draw button frame
 
push ebx ecx
 
; calculate window-relative coordinates
shr ebx,16
shr ecx,16
mov eax,[TASK_BASE]
 
add ebx,[eax-twdw + WDATA.box.left]
add ecx,[eax-twdw + WDATA.box.top]
 
; top border
mov eax, ebx
shl eax, 16
mov ax, bx
add ax, word [esp+8]
add ax, [esp + 4]
mov ebx, ecx
shl ebx, 16
mov bx, cx
92,17 → 175,19
push ebx
xor edi, edi
mov ecx, esi
call incecx
call button._.incecx
call [draw_line]
 
movzx edx,word [esp+4+4]
; bottom border
movzx edx, word[esp + 4 + 0]
add ebx,edx
shl edx,16
add ebx,edx
mov ecx,esi
call dececx
call button._.dececx
call [draw_line]
 
; left border
pop ebx
push edx
mov edx,eax
111,341 → 196,90
mov edx,ebx
shr edx,16
mov bx,dx
mov dx,[esp+4+4]
add bx,dx
add bx, [esp + 4 + 0]
pop edx
mov ecx,esi
call incecx
call button._.incecx
call [draw_line]
 
mov dx,[esp+8]
; right border
mov dx, [esp + 4]
add ax,dx
shl edx,16
add eax,edx
add ebx,1*65536
add ebx, 0x00010000
mov ecx,esi
call dececx
call button._.dececx
call [draw_line]
 
pop edx
pop ecx
pop ebx
pop eax
pop edi
pop esi
pop ecx ebx
 
.exit:
ret
 
button_dececx:
 
cmp [buttontype],dword 1
jne .finish
; je bdece
; ret
; bdece:
push eax
mov eax,0x01
cmp edi,20
jg @f
mov eax,0x02
@@:
test ecx,0xff
jz @f
sub ecx,eax
@@:
shl eax,8
test ecx,0xff00
jz @f
sub ecx,eax
@@:
shl eax,8
test ecx,0xff0000
jz @f
sub ecx,eax
@@:
pop eax
.finish:
ret
 
 
sys_button:
 
mov eax, [current_slot]
rol ebx, 16
add bx, word [eax+APPDATA.wnd_clientbox.left]
rol ebx, 16
rol ecx, 16
add cx, word [eax+APPDATA.wnd_clientbox.top]
rol ecx, 16
.forced:
 
test edx, 0x80000000
jnz remove_button
 
or bx, bx
jle noaddbutt
or cx, cx
jle noaddbutt
 
test edx, 0x40000000
jnz button_no_draw
 
pushad ; button body
movzx edi, cx
shr ebx, 16
shr ecx, 16
mov eax, [TASK_BASE]
add ebx, [eax-twdw + WDATA.box.left]
add ecx, [eax-twdw + WDATA.box.top]
mov eax, ebx
shl eax, 16
mov ax, bx
add ax, word [esp+16]
mov ebx, ecx
shl ebx, 16
mov bx, cx
mov ecx, esi
cmp [buttontype], 0
je @f
call incecx2
@@:
mov edx, edi
 
.newline:
call button_dececx
push edi
xor edi, edi
call [draw_line]
pop edi
add ebx, 1*65536+1 ; [ y start | y end ]
dec edx
jnz .newline
popad
 
call drawbuttonframes
 
button_no_draw:
 
; FIXME: mutex needed
syscall_button.remove_button:
and edx, 0x00ffffff
mov edi, [BTN_ADDR]
movzx eax, word [edi]
cmp eax, max_buttons
jge noaddbutt
inc eax
mov [edi], ax
 
shl eax, 4
add edi, eax
 
mov ax, [CURRENT_TASK]
stosw
mov ax, dx
stosw ; button id number: bits 0-15
mov eax, ebx
rol eax, 16
stosd ; x start | x size
mov eax, ecx
rol eax, 16
stosd ; y start | y size
mov eax, edx
shr eax, 16
stosw ; button id number: bits 16-31
 
noaddbutt:
 
ret
 
 
remove_button:
 
and edx, 0x7fffffff
 
rnewba2:
 
mov edi, [BTN_ADDR]
mov eax, edi
movzx ebx, word [edi]
mov ebx, [edi]
inc ebx
imul esi, ebx, SYS_BUTTON.sizeof
add esi, edi
xor ecx, ecx
add ecx, -SYS_BUTTON.sizeof
 
rnewba:
 
.next_button:
dec ebx
jz rnmba
jz .exit
 
add eax, 0x10
add ecx, SYS_BUTTON.sizeof
add esi, -SYS_BUTTON.sizeof
 
mov cx, [CURRENT_TASK]
cmp cx, [eax]
jnz rnewba
cmp dx, [eax+2]
jnz rnewba
; does it belong to our process?
mov ax, [CURRENT_TASK]
cmp ax, [esi + SYS_BUTTON.pslot]
jne .next_button
 
lea ecx, [ebx+1]
shl ecx, 4
mov ebx, eax
add eax, 0x10
; does the identifier match?
mov eax, dword[esi + SYS_BUTTON.id_hi - 2]
mov ax, [esi + SYS_BUTTON.id_lo]
and eax, 0x00ffffff
cmp edx, eax
jne .next_button
 
; okay, undefine it
mov ebx, esi
lea eax, [esi + SYS_BUTTON.sizeof]
call memmove
dec dword [edi]
jmp rnewba2
add ecx, -SYS_BUTTON.sizeof
jmp .next_button
 
rnmba:
 
.exit:
ret
 
find_pressed_button_frames:
 
pushad
 
movzx ebx,word [eax+0]
shl ebx,5
add ebx,window_data
mov ecx, [ebx+ WDATA.box.left] ; window x start
movzx edx,word [eax+4] ; button x start
add ecx,edx
push ecx
 
mov dx,[eax+6] ; button x size
add cx,dx
mov esi,ecx
inc esi
mov ecx, [ebx+WDATA.box.top] ; window y start
mov dx,[eax+8] ; button y start
add ecx,edx
mov ebx,ecx
mov dx,[eax+10] ; button y size
add dx,cx
inc dx
 
pop eax
 
; eax x beginning
; ebx y beginning
; esi x end
; edx y end
; ecx color
 
mov [pressed_button_eax],eax
mov [pressed_button_ebx],ebx
mov [pressed_button_ecx],ecx
mov [pressed_button_edx],edx
mov [pressed_button_esi],esi
 
popad
ret
 
uglobal
pressed_button_eax dd 0
pressed_button_ebx dd 0
pressed_button_ecx dd 0
pressed_button_edx dd 0
pressed_button_esi dd 0
endg
 
; negative button image
 
negativebutton:
; If requested, do not display button
; boarder on press.
test ebx,0x20000000
jz draw_negative_button
ret
draw_negative_button:
 
pushad
 
mov eax,[pressed_button_eax]
mov ebx,[pressed_button_ebx]
mov ecx,[pressed_button_ecx]
mov edx,[pressed_button_edx]
mov esi,[pressed_button_esi]
mov ecx,0x01000000
 
dec edx
push edx
inc edx
dec esi
push esi
inc esi
 
push eax
push ebx
push ecx
push edx
push edi
 
call [_display.disable_mouse]
 
bdbnewline:
mov edi,1 ; force
cmp eax,[esp+16]
jz bneg
cmp eax,[esp+20]
jz bneg
cmp ebx,[esp+12]
jz bneg
cmp ebx,[esp+24]
jnz nbneg
; jz bneg
; jmp nbneg
 
bneg:
 
call [putpixel]
 
nbneg:
 
inc eax
cmp eax,esi
jnz bdbnewline
mov eax,[esp+16]
inc ebx
cmp ebx,edx
jnz bdbnewline
 
add esp,28
 
popad
 
ret
 
; check buttons
 
 
; 0000 word process number
; 0002 word button id number : bits 0-15
; 0004 word x start
; 0006 word x size
; 0008 word y start
; 000A word y size
; 000C word button id number : bits 16-31
;
; button table in 0x10 increments
;
; first at 0x10
 
align 4
checkbuttons:
 
cmp [BTN_DOWN],byte 0 ; mouse buttons pressed
;------------------------------------------------------------------------------
check_buttons: ;///////////////////////////////////////////////////////////////
;------------------------------------------------------------------------------
; <description>
;------------------------------------------------------------------------------
cmp byte[BTN_DOWN], 0 ; mouse buttons pressed
jnz @f
;..................................... start 1/5 : modified by vhanla .............................
mov [bPressedMouseXY_B],0
;..................................... end 1/5 : modified by vhanla .............................
ret
@@:
pushad
 
@@: pushad
xor esi, esi
mov edi, [BTN_ADDR]
movzx edx, word [edi]
mov edx, [edi]
test edx, edx
jne @f
popad
ret
 
@@:
;..................................... start 2/5 : modified by vhanla .............................
;here i catch the coordinates when the mouse's button is clicked
push ax
@@: push ax
cmp [bPressedMouseXY_B],0;FALSE
jnz @f
mov [bPressedMouseXY_B],1;TRUE - it was already clicked
453,28 → 287,24
mov [mx],ax
mov ax,[MOUSE_Y]
mov [my],ax
@@:
pop ax
@@: pop ax
;and it is only refreshed after the mouse's button release
;..................................... end 2/5 : modified by vhanla .............................
 
push esi
inc edx
push edx
 
buttonnewcheck:
 
.buttonnewcheck:
pop edx
pop esi
inc esi
cmp edx,esi
jge bch
jge .bch
 
popad ; no button pressed
popad
ret
 
bch:
 
.bch:
push esi
push edx
mov eax,esi
482,67 → 312,56
add eax,edi
 
; check that button is at top of windowing stack
 
movzx ebx,word [eax]
movzx ebx, [eax + SYS_BUTTON.pslot]
movzx ecx,word [WIN_STACK + ebx * 2]
cmp ecx,[TASK_COUNT]
jne buttonnewcheck
jne .buttonnewcheck
 
; check that button start is inside window x/y end
 
movzx ebx,word [eax+0]
shl ebx,5
 
test [ebx+window_data+WDATA.fl_wstate],WSTATE_MINIMIZED
jnz buttonnewcheck
jnz .buttonnewcheck
 
; add ebx,window_data
; mov ecx,[window_data+ebx+8] ; window end X
movzx edx,word [eax+4] ; button start X
movzx edx, [eax + SYS_BUTTON.left]
cmp edx, [window_data+ebx+WDATA.box.width] ;ecx
jge buttonnewcheck
jge .buttonnewcheck
 
; mov ecx,[window_data+ebx+12] ; window end Y
movzx edx, word [eax+8] ; button start Y
movzx edx, [eax + SYS_BUTTON.top]
cmp edx, [window_data+ebx+WDATA.box.height] ;ecx
jge buttonnewcheck
jge .buttonnewcheck
 
; check coordinates
 
; mouse x >= button x ?
movzx ebx,word [eax+0]
shl ebx,5
add ebx,window_data
mov ecx, [ebx+WDATA.box.left] ; window x start
movzx edx,word [eax+4] ; button x start
mov ecx, [ebx + WDATA.box.left]
movzx edx, [eax + SYS_BUTTON.left]
add edx,ecx
;..................................... start 3/5 : modified by vhanla .............................
mov cx,[mx] ;mov cx,[MOUSE_X]
;..................................... end 3/5 : modified by vhanla .............................
cmp edx,ecx
jg buttonnewcheck
jg .buttonnewcheck
 
movzx ebx,word [eax+6] ; button x size
movzx ebx, [eax + SYS_BUTTON.width]
add edx,ebx
cmp ecx,edx
jg buttonnewcheck
jg .buttonnewcheck
 
; mouse y >= button y ?
movzx ebx,word [eax+0]
movzx ebx, [eax + SYS_BUTTON.pslot]
shl ebx,5
add ebx,window_data
mov ecx, [ebx+WDATA.box.top] ; window y start
movzx edx,word [eax+8] ; button y start
mov ecx, [ebx + WDATA.box.top]
movzx edx, [eax + SYS_BUTTON.top]
add edx,ecx
;..................................... start 4/5 : modified by vhanla .............................
mov cx,[my] ;mov cx,[MOUSE_Y]
;..................................... start 4/5 : modified by vhanla .............................
cmp edx,ecx
jg buttonnewcheck
jg .buttonnewcheck
 
movzx ebx,word [eax+10] ; button y size
movzx ebx, [eax + SYS_BUTTON.height]
add edx,ebx
cmp ecx,edx
jg buttonnewcheck
jg .buttonnewcheck
 
; mouse on button
 
549,27 → 368,21
pop edx
pop esi
 
mov bx,[eax+0xc] ; button id : bits 16-31
shl ebx,16
mov bx,[eax+2] ; button id : bits 00-16
mov ebx, dword[eax + SYS_BUTTON.id_hi - 2] ; button id : bits 16-31
mov bx, [eax + SYS_BUTTON.id_lo] ; button id : bits 00-16
push ebx
 
mov [MOUSE_DOWN],byte 1 ; no mouse down checks
call find_pressed_button_frames
call negativebutton
mov byte[MOUSE_DOWN], 1 ; no mouse down checks
call button._.negative_button
 
pushad
; // Alver 22.06.2008 // {
push eax
mov al, byte [BTN_DOWN]
mov al, [BTN_DOWN]
mov byte [btn_down_determ], al
pop eax
; } \\ Alver \\
 
cbwaitmouseup:
 
.cbwaitmouseup:
call checkidle
 
call [draw_pointer]
 
pushad
576,68 → 389,230
call stack_handler
popad
 
cmp [BTN_DOWN],byte 0 ; mouse buttons pressed ?
jnz cbwaitmouseup
cmp byte[BTN_DOWN], 0 ; mouse buttons pressed ?
jnz .cbwaitmouseup
popad
 
call negativebutton
mov [MOUSE_BACKGROUND],byte 0 ; no mouse background
mov [DONT_DRAW_MOUSE],byte 0 ; draw mouse
;..................................... start 5/5 : modified by vhanla .............................
call button._.negative_button
mov byte[MOUSE_BACKGROUND], 0 ; no mouse background
mov byte[DONT_DRAW_MOUSE], 0 ; draw mouse
 
; check coordinates
iglobal
mx dw 0x0 ; keeps the x mouse's position when it was clicked
my dw 0x0 ; keeps the y mouse's position when it was clicked
bPressedMouseXY_B db 0x0
btn_down_determ db 0x0 ; << // Alver 22.06.2008// <<
endg
pusha
 
pusha
; mouse x >= button x ?
movzx ebx,word [eax+0]
movzx ebx, [eax + SYS_BUTTON.pslot]
shl ebx,5
add ebx,window_data
mov ecx, [ebx+WDATA.box.left] ; window x start
movzx edx,word [eax+4] ; button x start
mov ecx, [ebx + WDATA.box.left]
movzx edx, [eax + SYS_BUTTON.left]
add edx,ecx
mov cx,[MOUSE_X]
cmp edx,ecx
jg no_on_button ;if we release the pointer out of the button area
jg .no_on_button ;if we release the pointer out of the button area
 
movzx ebx,word [eax+6] ; button x size
movzx ebx, [eax + SYS_BUTTON.width]
add edx,ebx
cmp ecx,edx
jg no_on_button
jg .no_on_button
 
; mouse y >= button y ?
movzx ebx,word [eax+0]
movzx ebx, [eax + SYS_BUTTON.pslot]
shl ebx,5
add ebx,window_data
mov ecx, [ebx+WDATA.box.top] ; window y start
movzx edx,word [eax+8] ; button y start
mov ecx, [ebx + WDATA.box.top]
movzx edx, [eax + SYS_BUTTON.top]
add edx,ecx
mov cx,[MOUSE_Y]
cmp edx,ecx
jg no_on_button
jg .no_on_button
 
movzx ebx,word [eax+10] ; button y size
movzx ebx, [eax + SYS_BUTTON.height]
add edx,ebx
cmp ecx,edx
jg no_on_button
jg .no_on_button
 
popa
mov [BTN_COUNT],byte 1 ; no of buttons in buffer
 
mov byte[BTN_COUNT], 1 ; no of buttons in buffer
pop ebx
mov [BTN_BUFF],ebx ; lets put the button id in buffer
push ebx
pusha
jmp yes_on_button
no_on_button:
mov [BTN_COUNT],byte 0 ; no of buttons in buffer
yes_on_button:
mov [MOUSE_DOWN],byte 0 ; mouse down -> do not draw
jmp .yes_on_button
 
.no_on_button:
mov byte[BTN_COUNT], 0 ; no of buttons in buffer
 
.yes_on_button:
mov byte[MOUSE_DOWN], 0 ; mouse down -> do not draw
popa
pop ebx
popa
ret
 
;..................................... end 5/5 : modified by vhanla ................................
;==============================================================================
;///// private functions //////////////////////////////////////////////////////
;==============================================================================
 
;------------------------------------------------------------------------------
button._.dececx: ;/////////////////////////////////////////////////////////////
;------------------------------------------------------------------------------
; <description>
;------------------------------------------------------------------------------
sub cl, 0x20
jnc @f
xor cl, cl
@@: sub ch, 0x20
jnc @f
xor ch, ch
@@: rol ecx, 16
sub cl, 0x20
jnc @f
xor cl, cl
@@: rol ecx, 16
ret
 
;------------------------------------------------------------------------------
button._.incecx: ;/////////////////////////////////////////////////////////////
;------------------------------------------------------------------------------
; <description>
;------------------------------------------------------------------------------
add cl, 0x20
jnc @f
or cl, -1
@@: add ch, 0x20
jnc @f
or ch, -1
@@: rol ecx, 16
add cl, 0x20
jnc @f
or cl, -1
@@: rol ecx, 16
ret
 
;------------------------------------------------------------------------------
button._.incecx2: ;////////////////////////////////////////////////////////////
;------------------------------------------------------------------------------
; <description>
;------------------------------------------------------------------------------
add cl, 0x14
jnc @f
or cl, -1
@@: add ch, 0x14
jnc @f
or ch, -1
@@: rol ecx, 16
add cl, 0x14
jnc @f
or cl, -1
@@: rol ecx, 16
ret
 
;------------------------------------------------------------------------------
button._.button_dececx: ;//////////////////////////////////////////////////////
;------------------------------------------------------------------------------
; <description>
;------------------------------------------------------------------------------
cmp [buttontype], 1
jne .finish
 
push eax
mov al, 1
cmp edi, 20
jg @f
mov al, 2
 
@@: sub cl, al
jnc @f
xor cl, cl
@@: sub ch, al
jnc @f
xor ch, ch
@@: rol ecx, 16
sub cl, al
jnc @f
xor cl, cl
@@: rol ecx, 16
 
pop eax
 
.finish:
ret
 
;------------------------------------------------------------------------------
button._.negative_button: ;////////////////////////////////////////////////////
;------------------------------------------------------------------------------
; <description>
;------------------------------------------------------------------------------
; If requested, do not display button border on press.
test ebx, 0x20000000
jz .draw_negative_button
ret
 
.draw_negative_button:
pushad
 
mov ebx, dword[eax + SYS_BUTTON.left]
mov ecx, dword[eax + SYS_BUTTON.top]
rol ebx, 16
rol ecx, 16
push ebx ecx
 
; calculate window-relative coordinates
shr ebx, 16
shr ecx, 16
movzx eax, word[eax + SYS_BUTTON.pslot]
shl eax, 5
add eax, window_data
add ebx, [eax + WDATA.box.left]
add ecx, [eax + WDATA.box.top]
 
xor edi, edi
inc edi
 
; top border
mov eax, ebx
shl eax, 16
mov ax, bx
add ax, [esp + 4]
mov ebx, ecx
shl ebx, 16
mov bx, cx
push ebx
mov ecx, 0x01000000
call [draw_line]
 
; bottom border
movzx edx, word[esp + 4 + 0]
add ebx, edx
shl edx, 16
add ebx, edx
call [draw_line]
 
; left border
pop ebx
push edx
mov edx, eax
shr edx, 16
mov ax, dx
mov edx, ebx
shr edx, 16
mov bx, dx
add bx, [esp + 4 + 0]
pop edx
add ebx, 0x00010000
dec bx
call [draw_line]
 
; right border
mov dx, [esp + 4]
add ax, dx
shl edx, 16
add eax, edx
call [draw_line]
 
pop ecx ebx
 
popad
ret
Property changes:
Added: svn:eol-style
+native
\ No newline at end of property