forked from KolibriOS/kolibrios
Rustem Gimadutdinov (rgimad)
c62096989f
git-svn-id: svn://kolibrios.org@8590 a494cfbc-eb01-0410-851d-a64ba20cac60
588 lines
14 KiB
NASM
588 lines
14 KiB
NASM
diff16 'tp-common.asm',0,$
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc clear_selection ;////////////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
push eax ebx
|
|
mov eax,[cur_editor.SelStart.Y]
|
|
mov ebx,[cur_editor.Caret.Y]
|
|
cmp eax,ebx
|
|
jle @f
|
|
xchg eax,ebx
|
|
@@: push [cur_editor.Caret.X] [cur_editor.Caret.Y]
|
|
pop [cur_editor.SelStart.Y] [cur_editor.SelStart.X]
|
|
pop ebx eax
|
|
ret
|
|
endp
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc pt_in_rect ;/////////////////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
cmp eax,[ecx+0x0]
|
|
jl @f
|
|
cmp ebx,[ecx+0x4]
|
|
jl @f
|
|
cmp eax,[ecx+0x8]
|
|
jg @f
|
|
cmp ebx,[ecx+0xC]
|
|
jg @f
|
|
stc
|
|
ret
|
|
@@: clc
|
|
ret
|
|
endp
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc check_bottom_right ;/////////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
push eax
|
|
mov eax,[cur_editor.TopLeft.Y]
|
|
or eax,eax
|
|
jns @f
|
|
xor eax,eax
|
|
mov [cur_editor.TopLeft.Y],eax
|
|
@@: add eax,[lines.scr]
|
|
cmp eax,[cur_editor.Lines.Count]
|
|
jbe .lp1
|
|
mov eax,[cur_editor.Lines.Count]
|
|
sub eax,[lines.scr]
|
|
jns @f
|
|
xor eax,eax
|
|
@@: mov [cur_editor.TopLeft.Y],eax
|
|
.lp1: mov eax,[cur_editor.TopLeft.X]
|
|
or eax,eax
|
|
jns @f
|
|
xor eax,eax
|
|
mov [cur_editor.TopLeft.X],eax
|
|
@@: add eax,[columns.scr]
|
|
cmp eax,[cur_editor.Columns.Count]
|
|
jbe .exit
|
|
mov eax,[cur_editor.Columns.Count]
|
|
sub eax,[columns.scr]
|
|
jns @f
|
|
xor eax,eax
|
|
@@: mov [cur_editor.TopLeft.X],eax
|
|
.exit:
|
|
pop eax
|
|
ret
|
|
endp
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc get_real_length ;////////////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
mov eax,[esi+EDITOR_LINE_DATA.Size]
|
|
|
|
@@: cmp byte[esi+eax+sizeof.EDITOR_LINE_DATA-1],' '
|
|
jne @f
|
|
dec eax
|
|
jnz @b
|
|
@@: ret
|
|
endp
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc get_line_offset ;////////////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
; Input:
|
|
; ECX = line number
|
|
; Output:
|
|
; ESI = line data offset
|
|
;-----------------------------------------------------------------------------
|
|
push eax ecx
|
|
mov esi,[cur_editor.Lines]
|
|
@@: dec ecx
|
|
js .exit
|
|
mov eax,[esi+EDITOR_LINE_DATA.Size]
|
|
lea esi,[esi+eax+sizeof.EDITOR_LINE_DATA]
|
|
jmp @b
|
|
.exit:
|
|
pop ecx eax
|
|
ret
|
|
endp
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc init_sel_vars ;//////////////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
pushad
|
|
mov [sel.selected],1
|
|
mov eax,[ebp+EDITOR.SelStart.X]
|
|
mov ebx,[ebp+EDITOR.SelStart.Y]
|
|
mov ecx,[ebp+EDITOR.Caret.X]
|
|
mov edx,[ebp+EDITOR.Caret.Y]
|
|
cmp ebx,edx
|
|
jl .lp2
|
|
jne @f
|
|
cmp eax,ecx
|
|
jl .lp2
|
|
jne .lp1
|
|
dec [sel.selected]
|
|
jmp .lp2
|
|
@@: xchg ebx,edx
|
|
.lp1: xchg eax,ecx
|
|
.lp2: mov [sel.begin.x],eax
|
|
mov [sel.begin.y],ebx
|
|
mov [sel.end.x],ecx
|
|
mov [sel.end.y],edx
|
|
popad
|
|
ret
|
|
endp
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc get_scroll_vars ;////////////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
; Input:
|
|
; EAX = maximum data size (units)
|
|
; EBX = visible data size (units)
|
|
; ECX = current data position (units)
|
|
; EDX = scrolling area size (pixels)
|
|
; Output:
|
|
; EAX = srcoller offset (pixels)
|
|
; EBX = scroller size (pixels)
|
|
;-----------------------------------------------------------------------------
|
|
push eax ebx edx
|
|
; sub eax,ebx
|
|
mov esi,eax
|
|
mov eax,edx
|
|
imul ebx
|
|
idiv esi
|
|
cmp eax,[esp]
|
|
jge .null
|
|
cmp eax,AMINS
|
|
jge @f
|
|
neg eax
|
|
add eax,AMINS
|
|
sub [esp],eax
|
|
mov eax,AMINS
|
|
@@: mov [esp+4],eax ; scroller size
|
|
mov eax,[esp]
|
|
imul ecx
|
|
idiv esi
|
|
or eax,eax
|
|
jns @f
|
|
xor eax,eax
|
|
@@: mov [esp+8],eax ; scroller offset
|
|
add eax,[esp+4]
|
|
cmp eax,[esp]
|
|
jle @f
|
|
@@:
|
|
pop edx ebx eax
|
|
ret
|
|
.null:
|
|
mov dword[esp+4],0
|
|
mov dword[esp+8],0
|
|
jmp @b
|
|
endp
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc uint2strz ;//////////////////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
dec ebx
|
|
jz @f
|
|
xor edx,edx
|
|
div ecx
|
|
push edx
|
|
call uint2strz
|
|
pop eax
|
|
@@: cmp al,10
|
|
sbb al,$69
|
|
das
|
|
stosb
|
|
ret
|
|
endp
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc uint2str ;///////////////////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
cmp eax,ecx
|
|
jb @f
|
|
xor edx,edx
|
|
div ecx
|
|
push edx
|
|
call uint2str
|
|
pop eax
|
|
@@: cmp al,10
|
|
sbb al,$69
|
|
das
|
|
stosb
|
|
ret
|
|
endp
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc strlen ;/////////////////////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
push ebx
|
|
mov ebx,eax
|
|
xor eax,eax
|
|
@@: cmp byte[ebx+eax],0
|
|
je @f
|
|
inc eax
|
|
jmp @b
|
|
@@: pop ebx
|
|
ret
|
|
endp
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc rgb_to_gray ;////////////////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
push 0 eax
|
|
and dword[esp],0x000000FF
|
|
fild dword[esp]
|
|
fmul [float_gray_b]
|
|
shr eax,8
|
|
mov [esp],eax
|
|
and dword[esp],0x000000FF
|
|
fild dword[esp]
|
|
fmul [float_gray_g]
|
|
faddp
|
|
shr eax,8
|
|
and eax,0x000000FF
|
|
mov [esp],eax
|
|
fild dword[esp]
|
|
fmul [float_gray_r]
|
|
faddp
|
|
frndint
|
|
fist dword[esp]
|
|
fist dword[esp+1]
|
|
fistp dword[esp+2]
|
|
pop eax
|
|
add esp,4
|
|
ret
|
|
endp
|
|
|
|
;float_gray_r dd 0.30f
|
|
;float_gray_g dd 0.59f
|
|
;float_gray_b dd 0.11f
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc get_active_menu_item ;///////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
pushad
|
|
mov [mi_cur],0
|
|
mcall 37,1
|
|
movsx ebx,ax
|
|
sar eax,16
|
|
mov ecx,__rc
|
|
pushd 2 0 (main_menu.width+7) (ATOPH-2)
|
|
popd [__rc+0xC] [__rc+0x8] [__rc+0x4] [__rc+0x0]
|
|
; add [__rc+0xC],ATOPH-2
|
|
call pt_in_rect
|
|
jnc .outside_menu
|
|
m2m dword[ecx+0x8],dword[ecx+0x0]
|
|
mov edx,main_menu
|
|
@@: inc [mi_cur]
|
|
movzx esi,word[edx+0]
|
|
add [ecx+0x8],esi
|
|
call pt_in_rect
|
|
jc .exit
|
|
m2m dword[ecx+0x0],dword[ecx+0x8]
|
|
add edx,8+1
|
|
movzx esi,byte[edx-1]
|
|
add edx,esi
|
|
cmp byte[edx+8],0
|
|
jne @b
|
|
mov [mi_cur],0
|
|
.exit:
|
|
popad
|
|
ret
|
|
.outside_menu:
|
|
or [mi_cur],-1
|
|
@@: popad
|
|
ret
|
|
endp
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc get_active_popup_item ;//////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
pushad
|
|
mov [pi_cur],0
|
|
mcall 37,1
|
|
movsx ebx,ax
|
|
sar eax,16
|
|
mov ecx,__rc
|
|
mov dword[ecx+0x0],0
|
|
mov dword[ecx+0x4],0
|
|
movzx edx,[ebp+POPUP.width]
|
|
mov dword[ecx+0x8],edx
|
|
movzx edx,[ebp+POPUP.height]
|
|
mov dword[ecx+0xC],edx
|
|
call pt_in_rect
|
|
jnc .outside_window
|
|
inc dword[ecx+0x0]
|
|
mov dword[ecx+0x4],2
|
|
dec dword[ecx+0x8]
|
|
mov dword[ecx+0xC],2+POP_IHEIGHT-1
|
|
mov edx,[ebp+POPUP.data]
|
|
@@: inc [pi_cur]
|
|
inc edx
|
|
movzx esi,byte[edx-1]
|
|
cmp byte[edx],'-'
|
|
jne .lp1
|
|
pushd [ecx+0xC]
|
|
sub dword[ecx+0xC],POP_IHEIGHT-POP_SHEIGHT
|
|
call pt_in_rect
|
|
popd [ecx+0xC]
|
|
jc .separator
|
|
add dword[ecx+0x4],POP_SHEIGHT
|
|
add dword[ecx+0xC],POP_SHEIGHT
|
|
jmp .lp3
|
|
.lp1: call pt_in_rect
|
|
jnc .lp2
|
|
mov eax,[pi_cur]
|
|
test byte[ebp+eax-1],1
|
|
jnz .exit
|
|
jmp .separator
|
|
.lp2: add dword[ecx+0x4],POP_IHEIGHT
|
|
add dword[ecx+0xC],POP_IHEIGHT
|
|
add edx,esi
|
|
inc edx
|
|
movzx esi,byte[edx-1]
|
|
.lp3: add edx,esi
|
|
cmp byte[edx],0
|
|
jne @b
|
|
.separator:
|
|
mov [pi_cur],0
|
|
.exit:
|
|
popad
|
|
ret
|
|
.outside_window:
|
|
or [pi_cur],-1
|
|
jmp .exit
|
|
endp
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc line_add_spaces ;////////////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
; Input:
|
|
; ESI = line offset
|
|
; ECX = needed line length
|
|
; Output:
|
|
; EAX = delta
|
|
;-----------------------------------------------------------------------------
|
|
xor eax,eax
|
|
pushad
|
|
mov edx,[esi+EDITOR_LINE_DATA.Size]
|
|
cmp ecx,edx
|
|
jbe .exit
|
|
sub ecx,edx
|
|
lea eax,[ecx+sizeof.EDITOR_LINE_DATA]
|
|
call editor_realloc_lines
|
|
mov [esp+4*7],eax
|
|
add esi,eax
|
|
push ecx
|
|
mov edi,[cur_editor.Lines]
|
|
add edi,[cur_editor.Lines.Size] ; !!! CHECK THIS!!! add edi,[edi-4]
|
|
dec edi
|
|
mov eax,esi
|
|
mov esi,edi
|
|
sub esi,ecx
|
|
lea ecx,[eax+sizeof.EDITOR_LINE_DATA]
|
|
add ecx,edx
|
|
push ecx
|
|
neg ecx
|
|
lea ecx,[esi+ecx+1]
|
|
std
|
|
rep movsb
|
|
pop edi ecx
|
|
add [eax+EDITOR_LINE_DATA.Size],ecx
|
|
mov al,' '
|
|
cld
|
|
rep stosb
|
|
.exit:
|
|
popad
|
|
ret
|
|
endp
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc delete_selection ;///////////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
; call init_sel_vars
|
|
|
|
cmp [sel.selected],0
|
|
je .exit.2
|
|
|
|
pushad
|
|
mov ecx,[sel.begin.y]
|
|
cmp ecx,[sel.end.y]
|
|
je .single_line
|
|
call get_line_offset
|
|
and [esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
|
|
or [esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
|
|
mov ecx,[sel.begin.x]
|
|
call line_add_spaces
|
|
add esi,eax
|
|
lea edi,[esi+sizeof.EDITOR_LINE_DATA]
|
|
mov ecx,[sel.end.y]
|
|
call get_line_offset
|
|
call get_real_length
|
|
cmp eax,[sel.end.x]
|
|
jbe @f
|
|
mov eax,[sel.end.x]
|
|
@@: mov ecx,[esi+EDITOR_LINE_DATA.Size]
|
|
sub ecx,eax
|
|
mov ebx,[sel.begin.x]
|
|
add ebx,ecx
|
|
mov [edi-sizeof.EDITOR_LINE_DATA+EDITOR_LINE_DATA.Size],ebx
|
|
add edi,[sel.begin.x]
|
|
lea esi,[esi+eax+sizeof.EDITOR_LINE_DATA]
|
|
mov ecx,[cur_editor.Lines]
|
|
add ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
|
|
sub ecx,esi
|
|
cld
|
|
rep movsb
|
|
mov eax,[sel.end.y]
|
|
sub eax,[sel.begin.y]
|
|
sub [cur_editor.Lines.Count],eax
|
|
jmp .exit
|
|
|
|
.single_line:
|
|
call get_line_offset
|
|
and [esi+EDITOR_LINE_DATA.Flags],not EDITOR_LINE_FLAG_SAVED
|
|
or [esi+EDITOR_LINE_DATA.Flags],EDITOR_LINE_FLAG_MOFIFIED
|
|
call get_real_length
|
|
cmp eax,[sel.begin.x]
|
|
jbe .exit
|
|
mov ecx,[sel.end.x]
|
|
cmp ecx,eax
|
|
jbe @f
|
|
mov ecx,eax
|
|
@@: sub ecx,[sel.begin.x]
|
|
sub [esi+EDITOR_LINE_DATA.Size],ecx
|
|
lea edi,[esi+sizeof.EDITOR_LINE_DATA]
|
|
add edi,[sel.begin.x]
|
|
lea esi,[edi+ecx]
|
|
mov ecx,[cur_editor.Lines]
|
|
add ecx,[cur_editor.Lines.Size] ;*** add ecx,[ecx-4]
|
|
sub ecx,esi
|
|
cld
|
|
rep movsb
|
|
|
|
.exit:
|
|
mov eax,[sel.begin.x]
|
|
mov [cur_editor.Caret.X],eax
|
|
mov [cur_editor.SelStart.X],eax
|
|
mov eax,[sel.begin.y]
|
|
mov [cur_editor.Caret.Y],eax
|
|
mov [cur_editor.SelStart.Y],eax
|
|
|
|
mov ecx,[cur_editor.Lines.Count]
|
|
call get_line_offset
|
|
mov eax,[esi+EDITOR_LINE_DATA.Size]
|
|
lea esi,[esi+eax+sizeof.EDITOR_LINE_DATA]
|
|
mov eax,[cur_editor.Lines]
|
|
add eax,[cur_editor.Lines.Size] ;*** add eax,[eax-4]
|
|
sub esi,eax
|
|
lea eax,[esi+4096]
|
|
call editor_realloc_lines
|
|
|
|
popad
|
|
mov [cur_editor.Modified],1
|
|
clc
|
|
ret
|
|
|
|
.exit.2:
|
|
stc
|
|
ret
|
|
endp
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc get_selection_size ;/////////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
push ecx esi
|
|
mov ecx,[sel.end.y]
|
|
inc ecx
|
|
call get_line_offset
|
|
mov eax,esi
|
|
mov ecx,[sel.begin.y]
|
|
call get_line_offset
|
|
sub eax,esi
|
|
pop esi ecx
|
|
ret
|
|
endp
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc get_lines_in_file ;//////////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
; Input:
|
|
; ESI = data pointer
|
|
; ECX = data length
|
|
; Output:
|
|
; EAX = lines number
|
|
; EBX = extra length after tabs expansion
|
|
;-----------------------------------------------------------------------------
|
|
push ecx edx esi 0
|
|
or ebx,-1
|
|
xor edx,edx
|
|
.lp0: inc ebx
|
|
.lp1: dec ecx
|
|
jle .lp2
|
|
lodsb
|
|
cmp al,0
|
|
je .lp2
|
|
cmp al,9
|
|
je .TB
|
|
cmp al,10
|
|
je .LF
|
|
cmp al,13
|
|
je .CR
|
|
inc edx
|
|
jmp .lp1
|
|
.lp2: lea eax,[ebx+1]
|
|
pop ebx esi edx ecx
|
|
ret
|
|
|
|
.CR: cmp byte[esi],10
|
|
jne .LF
|
|
lodsb
|
|
.LF: xor edx,edx
|
|
jmp .lp0
|
|
.TB: and edx,00000111b
|
|
add dword[esp],ATABW
|
|
sub [esp],edx
|
|
xor edx,edx
|
|
jmp .lp1
|
|
endp
|
|
|
|
;-----------------------------------------------------------------------------
|
|
proc update_caption ;/////////////////////////////////////////////////////////
|
|
;-----------------------------------------------------------------------------
|
|
lea esi,[cur_editor.FilePath]
|
|
mov edi,s_title
|
|
|
|
xor ecx,ecx
|
|
@@: lodsb
|
|
cmp al,0
|
|
je @f
|
|
stosb
|
|
inc ecx
|
|
jmp @b
|
|
@@:
|
|
push ecx
|
|
mov dword[edi],' - '
|
|
add edi,3
|
|
mov esi,htext
|
|
mov ecx,htext.size
|
|
cld
|
|
rep movsb
|
|
|
|
mov al,0
|
|
stosb
|
|
|
|
mcall 71,1,s_title
|
|
|
|
cmp [do_not_draw],0
|
|
jne @f
|
|
lea esi,[cur_editor.FilePath]
|
|
mov edi,tb_opensave.text
|
|
mov ecx,[esp]
|
|
cld
|
|
rep movsb
|
|
pop ecx
|
|
mov [tb_opensave.length],cl
|
|
clc
|
|
ret
|
|
@@:
|
|
add esp,4
|
|
clc
|
|
ret
|
|
endp
|
|
|