Allow programs to draw negative pixels and lines

Save window bounds (not just position) before rolling up or maximizing
New functions:
  48/7 - get skin margins
  48/8 - set window skin

git-svn-id: svn://kolibrios.org@52 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Mihail Semenyako (mike.dld) 2006-03-04 11:58:09 +00:00
parent df5b0209d7
commit 9b4ba85ac2
5 changed files with 77 additions and 19 deletions

View File

@ -31,16 +31,17 @@
cache_max equ 1919 ; max. is 1919*512+0x610000=0x6ffe00 cache_max equ 1919 ; max. is 1919*512+0x610000=0x6ffe00
ERROR_DISK_BASE equ 1 ERROR_SUCCESS = 0
ERROR_UNSUPPORTED_FS equ 2 ERROR_DISK_BASE = 1
ERROR_UNKNOWN_FS equ 3 ERROR_UNSUPPORTED_FS = 2
ERROR_PARTITION equ 4 ERROR_UNKNOWN_FS = 3
ERROR_FILE_NOT_FOUND equ 5 ERROR_PARTITION = 4
ERROR_END_OF_FILE equ 6 ERROR_FILE_NOT_FOUND = 5
ERROR_MEMORY_POINTER equ 7 ERROR_END_OF_FILE = 6
ERROR_DISK_FULL equ 8 ERROR_MEMORY_POINTER = 7
ERROR_FAT_TABLE equ 9 ERROR_DISK_FULL = 8
ERROR_ACCESS_DENIED equ 10 ERROR_FAT_TABLE = 9
ERROR_ACCESS_DENIED = 10
PUSHAD_EAX equ [esp+28] PUSHAD_EAX equ [esp+28]
PUSHAD_ECX equ [esp+24] PUSHAD_ECX equ [esp+24]

View File

@ -87,9 +87,9 @@ parse_skin_data:
and ecx,127 and ecx,127
cld cld
rep movsb rep movsb
mov eax,dword[ebx+SKIN_PARAMS.margin.left] mov eax,dword[ebx+SKIN_PARAMS.margin.right]
mov dword[_skinmargins+0],eax mov dword[_skinmargins+0],eax
mov eax,dword[ebx+SKIN_PARAMS.margin.top] mov eax,dword[ebx+SKIN_PARAMS.margin.bottom]
mov dword[_skinmargins+4],eax mov dword[_skinmargins+4],eax
mov ebx,[ebp+SKIN_HEADER.bitmaps] mov ebx,[ebp+SKIN_HEADER.bitmaps]

View File

@ -268,6 +268,13 @@ display_settings:
; input : ecx = [left]*65536+[right] ; input : ecx = [left]*65536+[right]
; edx = [top]*65536+[bottom] ; edx = [top]*65536+[bottom]
; output : nothing ; output : nothing
; eax = 7 ; get skin margins
; input : nothing
; output : eax = [left]*65536+[right]
; ebx = [top]*65536+[bottom]
; eax = 8 ; set window skin
; input : ecx = pointer to file info block
; output : eax = FS error code
pushad pushad
@ -309,9 +316,7 @@ display_settings:
jne no_com_colours jne no_com_colours
mov [windowtypechanged],dword 1 mov [windowtypechanged],dword 1
mov esi,[0x3010] mov esi,[0x3010]
add esi,0x10 add esi,[esi+0x10]
add ebx,[esi]
mov esi,ebx
mov edi,common_colours mov edi,common_colours
and ecx,127 and ecx,127
cld cld
@ -384,6 +389,55 @@ display_settings:
ret ret
no_set_workarea: no_set_workarea:
cmp eax,7 ; get skin margins
jne no_get_skinmargins
popad
mov eax,dword[_skinmargins+0]
mov [esp+36],eax
mov eax,dword[_skinmargins+4]
mov [esp+24],eax
ret
no_get_skinmargins:
cmp eax,8 ; set window skin
jne no_set_skin
mov eax,ebx
mov edi,[0x3010]
add ebx,[edi+0x10] ; abs start of info block
pushd [ebx+0] [ebx+4] [ebx+8] [ebx+12]
mov dword[ebx+0],0 ; read
mov dword[ebx+4],0 ; from the beginning
mov dword[ebx+8],64 ; 32 KBytes maximum
mov ecx,skin_data+64*512
sub ecx,[edi+0x10]
mov dword[ebx+12],ecx ; destination
push eax
pushad
call file_system
popad
pop eax
popd [ebx+12] [ebx+8] [ebx+4] [ebx+0]
cmp eax,ERROR_SUCCESS
je @f
cmp eax,ERROR_END_OF_FILE
jne .exit
@@: cmp [skin_data+64*512+SKIN_HEADER.ident],'SKIN'
mov eax,ERROR_UNKNOWN_FS
jne .exit
mov esi,skin_data+64*512
mov edi,skin_data
mov ecx,(64*512)/4
rep movsd
call parse_skin_data
call calculatescreen
mov dword[esp+32+36],0
jmp redraw_screen_direct
.exit:
mov [esp+32+36],eax
popad
ret
no_set_skin:
popad popad
ret ret
@ -1324,8 +1378,8 @@ checkwindows:
@@: mov [reposition],cl @@: mov [reposition],cl
cmp [reposition],1 ; save new X and Y start cmp [reposition],1 ; save new position and size
jne no_xy_save jne no_bounds_save
; <IP 28.08.2004> ; <IP 28.08.2004>
push esi edi ecx push esi edi ecx
mov esi,edi mov esi,edi
@ -1333,12 +1387,12 @@ checkwindows:
shr edi,5 shr edi,5
shl edi,8 shl edi,8
add edi,0x80000+0x90 add edi,0x80000+0x90
mov ecx,2 mov ecx,4
cld cld
rep movsd rep movsd
pop ecx edi esi pop ecx edi esi
; </IP 28.08.2004> ; </IP 28.08.2004>
no_xy_save: no_bounds_save:
pushad ; WINDOW SHADE/FULLSCREEN pushad ; WINDOW SHADE/FULLSCREEN

View File

@ -4600,6 +4600,7 @@ align 4
syscall_drawrect: ; DrawRect syscall_drawrect: ; DrawRect
mov edi,ecx mov edi,ecx
and edi,0x80FFFFFF
test ax,ax test ax,ax
je drectr je drectr
test bx,bx test bx,bx

View File

@ -305,8 +305,10 @@ __sys_putpixel:
test edi,1 ; force ? test edi,1 ; force ?
jnz .forced jnz .forced
; not forced: ; not forced:
push ecx ; save 24th bit in case negative pixel wanted
call checkpixel call checkpixel
test ecx,ecx test ecx,ecx
pop ecx
jnz .exit jnz .exit
.forced: .forced:
cmp [ScreenWidth], eax cmp [ScreenWidth], eax