1. faster GUI: calculatescreen

2. fixed sysfunc 1 - put pixel which was completely broken

git-svn-id: svn://kolibrios.org@112 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Ivan Poddubny 2006-08-01 14:09:42 +00:00
parent fca11d7700
commit 849b393cad
4 changed files with 133 additions and 56 deletions

View File

@ -978,10 +978,10 @@ terminate: ; terminate application
; call systest
sti ; .. and life goes on
; movzx eax,word [dlx]
; movzx ebx,word [dly]
; movzx ecx,word [dlxe]
; movzx edx,word [dlye]
mov eax, [dlx]
mov ebx, [dly]
mov ecx, [dlxe]
mov edx, [dlye]
call calculatescreen
xor eax, eax
xor esi, esi

View File

@ -47,18 +47,17 @@ setwindowdefaults:
; ecx = ex
; edx = ey
; èäåÿ: ïåðåáðàòü âñå îêíà, íà÷èíàÿ ñ ñàìîãî íèæíåãî,
; è äëÿ êàæäîãî âûçâàòü setscreen
; è äëÿ ïîïàâøèõ â çàäàííóþ îáëàñòü
; ÷àñòåé îêîí âûçâàòü setscreen
align 4
calculatescreen:
pushad
pushfd
cli
push edx ecx ebx eax
mov esi, 1
xor eax, eax
xor ebx, ebx
mov ecx, [0xFE00]
mov edx, [0xFE04]
call setscreen
mov ebp, [0x3004] ; number of processes
@ -75,21 +74,53 @@ calculatescreen:
add edi, window_data
test [edi+WDATA.fl_wstate], WSTATE_MINIMIZED
jnz .not_wnd
mov eax, [edi+WDATA.left]
cmp eax, [esp+RECT.right]
ja .out_of_bounds
mov ebx, [edi+WDATA.top]
cmp ebx, [esp+RECT.bottom]
ja .out_of_bounds
mov ecx, [edi+WDATA.width]
add ecx, eax
cmp ecx, [esp+RECT.left]
jb .out_of_bounds
mov edx, [edi+WDATA.height]
add edx, ebx
cmp edx, [esp+RECT.top]
jb .out_of_bounds
cmp eax, [esp+RECT.left]
jae @f
mov eax, [esp+RECT.left]
@@:
cmp ebx, [esp+RECT.top]
jae @f
mov ebx, [esp+RECT.top]
@@:
cmp ecx, [esp+RECT.right]
jbe @f
mov ecx, [esp+RECT.right]
@@:
cmp edx, [esp+RECT.bottom]
jbe @f
mov edx, [esp+RECT.bottom]
@@:
push esi
movzx esi, word [0xC400 + esi * 2]
call setscreen
pop esi
.not_wnd:
.out_of_bounds:
inc esi
dec ebp
jnz .new_wnd
.finish:
pop eax ebx ecx edx
popfd
popad
ret
@ -97,6 +128,9 @@ ret
virtual at esp
ff_x dd ?
ff_y dd ?
ff_width dd ?
ff_xsz dd ?
ff_ysz dd ?
ff_scale dd ?
@ -186,15 +220,12 @@ pushad
push eax
mov eax, [0xFE00] ; screen_sx
inc eax
imul eax, ebx ;ebx
add eax, [esp] ;eax
imul eax, ebx
add eax, [esp]
add eax, WinMapAddress
mov ebp, eax
mov edi, [edi]
; mov eax, esi
; shl eax, 5
; add edi, [eax+0x3000+0x10]
pop eax
; eax = x_start
@ -204,16 +235,30 @@ pushad
; esi = process_number
; edi = &shape
; [scale]
push edx ecx ;ebx eax
xor ebx, ebx
align 4
push edx ecx ; for loop - x,y size
mov ecx, esi
shl ecx, 5
mov edx, [window_data+ecx+WDATA.top]
push [window_data+ecx+WDATA.width] ; for loop - width
mov ecx, [window_data+ecx+WDATA.left]
sub ebx, edx
sub eax, ecx
push ebx eax ; for loop - x,y
add [ff_xsz], eax
add [ff_ysz], ebx
mov ebx, [ff_y]
.ff_new_y:
xor edx, edx
align 4
mov edx, [ff_x]
.ff_new_x:
; -- body --
mov ecx, [ff_scale]
mov eax, [ff_xsz]
mov eax, [ff_width]
inc eax
shr eax, cl
push ebx edx
shr ebx, cl
@ -221,13 +266,11 @@ pushad
imul eax, ebx
add eax, edx
pop edx ebx
add eax, edi ;[ff_shape]
add eax, edi
call .read_byte
; cmp byte [eax], 1
; jne @f
test al,al
jz @f
mov eax, esi ; [ff_proc]
mov eax, esi
mov [ebp], al
@@:
; -- end body --
@ -236,14 +279,14 @@ pushad
cmp edx, [ff_xsz]
jb .ff_new_x
sub ebp, [ff_xsz]
add ebp, [ff_x]
add ebp, [0xFE00] ; screen.x
inc ebp
inc ebx
cmp ebx, [ff_ysz]
jb .ff_new_y
pop ecx edx ; eax ebx first
add esp, 4
add esp, 24
popad
ret
@ -389,6 +432,10 @@ display_settings:
jg .lp2
mov [screen_workarea.bottom],ebx
.lp2: call repos_windows
mov eax, 0
mov ebx, 0
mov ecx, [0xfe00]
mov edx, [0xfe04]
call calculatescreen
; jmp redraw_screen_direct
.exit:
@ -436,7 +483,13 @@ display_settings:
mov ecx,(64*512)/4
rep movsd
call parse_skin_data
pushad
mov eax, 0
mov ebx, 0
mov ecx, [0xfe00]
mov edx, [0xfe04]
call calculatescreen
popad
mov dword[esp+32+36],0
jmp redraw_screen_direct
.exit:
@ -1006,15 +1059,18 @@ minimize_window:
cli
or [eax+WDATA.fl_wstate], WSTATE_MINIMIZED
mov edi, eax
call calculatescreen
;call calculatescreen
mov eax, [edi+WDATA.left]
mov [dlx], eax
add eax, [edi+WDATA.width]
mov [dlxe], eax
mov eax, [edi+WDATA.top]
mov [dly], eax
add eax, [edi+WDATA.height]
mov [dlye], eax
mov ecx, eax
add ecx, [edi+WDATA.width]
mov [dlxe], ecx
mov ebx, [edi+WDATA.top]
mov [dly], ebx
mov edx, ebx
add edx, [edi+WDATA.height]
mov [dlye], edx
call calculatescreen
xor esi, esi
xor eax, eax
call redrawscreen
@ -1046,6 +1102,12 @@ restore_minimized_window:
call setscreen
jmp .done
.no_uppermost:
mov eax, [edi+WDATA.left]
mov ebx, [edi+WDATA.top]
mov ecx, eax
mov edx, ebx
add ecx, [edi+WDATA.width]
add edx, [edi+WDATA.height]
call calculatescreen
.done:
mov [0xfff4],byte 0 ; no mouse under
@ -1482,10 +1544,18 @@ checkwindows:
cmp [reposition],0
je retwm
mov [edi+WDATA.fl_redraw],1
mov [0xfff5],byte 1 ; no mouse
push eax ebx ecx edx
mov eax,[edi+00]
mov ebx,[edi+04]
mov ecx,[edi+8]
mov edx,[edi+12]
add ecx,eax
add edx,ebx
call calculatescreen
mov eax,[oldc+00]
mov ebx,[oldc+04]
mov ecx,[oldc+8]
@ -1498,6 +1568,9 @@ checkwindows:
mov eax,edi
call redrawscreen
mov [edi+WDATA.fl_redraw],1
mov ecx,100 ; wait to avoid mouse residuals
waitre2:
mov [0xfff5],byte 1

View File

@ -4667,9 +4667,9 @@ syscall_setpixel: ; SetPixel
mov edx,[0x3010]
add eax,[edx-twdw]
add ebx,[edx-twdw+4]
; xor edi,edi ; no force
mov edi,1
; call [disable_mouse]
xor edi,edi ; no force
;mov edi,1
call [disable_mouse]
jmp [putpixel]
align 4

View File

@ -36,6 +36,10 @@ endg
sub [screen_workarea.bottom],ebx
call repos_windows
mov eax, 0
mov ebx, 0
mov ecx, [0xfe00]
mov edx, [0xfe04]
call calculatescreen
.resolution_wasnt_changed: