forked from KolibriOS/kolibrios
fix prior, add gui/background.inc
git-svn-id: svn://kolibrios.org@9487 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
c8ddc27015
commit
99ad9a6ca7
612
kernel/trunk/gui/background.inc
Normal file
612
kernel/trunk/gui/background.inc
Normal file
@ -0,0 +1,612 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2021. All rights reserved. ;;
|
||||
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
$Revision: 0 $
|
||||
|
||||
; Background graphics implementation
|
||||
|
||||
uglobal
|
||||
; bgrchanged dd 0x0
|
||||
align 4
|
||||
bgrlockpid dd 0
|
||||
bgrlock db 0
|
||||
endg
|
||||
;--------------------------------------
|
||||
align 4
|
||||
sys_background:
|
||||
cmp ebx, 1 ; BACKGROUND SIZE
|
||||
jnz nosb1
|
||||
test ecx, ecx
|
||||
jz sbgrr
|
||||
|
||||
test edx, edx
|
||||
jz sbgrr
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
;;Maxis use atomic bts for mutexes 4.4.2009
|
||||
bts dword [bgrlock], 0
|
||||
jnc @f
|
||||
call change_task
|
||||
jmp @b
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
mov [BgrDataWidth], ecx
|
||||
mov [BgrDataHeight], edx
|
||||
; mov [bgrchanged],1
|
||||
|
||||
pushad
|
||||
; return memory for old background
|
||||
mov eax, [img_background]
|
||||
cmp eax, static_background_data
|
||||
jz @f
|
||||
stdcall kernel_free, eax
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
; calculate RAW size
|
||||
xor eax, eax
|
||||
inc eax
|
||||
cmp [BgrDataWidth], eax
|
||||
jae @f
|
||||
mov [BgrDataWidth], eax
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
cmp [BgrDataHeight], eax
|
||||
jae @f
|
||||
mov [BgrDataHeight], eax
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
mov eax, [BgrDataWidth]
|
||||
imul eax, [BgrDataHeight]
|
||||
lea eax, [eax*3]
|
||||
; it is reserved with aligned to the boundary of 4 KB pages,
|
||||
; otherwise there may be exceptions a page fault for vesa20_drawbackground_tiled
|
||||
; because the 32 bit read is used for high performance: "mov eax,[esi]"
|
||||
shr eax, 12
|
||||
inc eax
|
||||
shl eax, 12
|
||||
mov [mem_BACKGROUND], eax
|
||||
; get memory for new background
|
||||
stdcall kernel_alloc, eax
|
||||
test eax, eax
|
||||
jz .memfailed
|
||||
mov [img_background], eax
|
||||
jmp .exit
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.memfailed:
|
||||
; revert to static monotone data
|
||||
mov [img_background], static_background_data
|
||||
xor eax, eax
|
||||
inc eax
|
||||
mov [BgrDataWidth], eax
|
||||
mov [BgrDataHeight], eax
|
||||
mov [mem_BACKGROUND], 4
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.exit:
|
||||
popad
|
||||
mov [bgrlock], 0
|
||||
;--------------------------------------
|
||||
align 4
|
||||
sbgrr:
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
nosb1:
|
||||
cmp ebx, 2 ; SET PIXEL
|
||||
jnz nosb2
|
||||
|
||||
mov eax, [img_background]
|
||||
test ecx, ecx
|
||||
jz @f
|
||||
cmp eax, static_background_data
|
||||
jz .ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
mov ebx, [mem_BACKGROUND]
|
||||
add ebx, 4095
|
||||
and ebx, -4096
|
||||
sub ebx, 4
|
||||
cmp ecx, ebx
|
||||
ja .ret
|
||||
|
||||
mov ebx, [eax+ecx]
|
||||
and ebx, 0xFF000000;255*256*256*256
|
||||
and edx, 0x00FFFFFF;255*256*256+255*256+255
|
||||
add edx, ebx
|
||||
mov [eax+ecx], edx
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.ret:
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
nosb2:
|
||||
cmp ebx, 3 ; DRAW BACKGROUND
|
||||
jnz nosb3
|
||||
;--------------------------------------
|
||||
align 4
|
||||
draw_background_temp:
|
||||
mov [background_defined], 1
|
||||
call force_redraw_background
|
||||
;--------------------------------------
|
||||
align 4
|
||||
nosb31:
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
nosb3:
|
||||
cmp ebx, 4 ; TILED / STRETCHED
|
||||
jnz nosb4
|
||||
cmp ecx, [BgrDrawMode]
|
||||
je nosb41
|
||||
mov [BgrDrawMode], ecx
|
||||
;--------------------------------------
|
||||
align 4
|
||||
nosb41:
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
nosb4:
|
||||
cmp ebx, 5 ; BLOCK MOVE TO BGR
|
||||
jnz nosb5
|
||||
|
||||
; add check pointer
|
||||
stdcall is_region_userspace, ecx, esi
|
||||
jnz .fin
|
||||
|
||||
cmp [img_background], static_background_data
|
||||
jnz @f
|
||||
test edx, edx
|
||||
jnz .fin
|
||||
cmp esi, 4
|
||||
ja .fin
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
; bughere
|
||||
mov eax, ecx
|
||||
mov ebx, edx
|
||||
add ebx, [img_background];IMG_BACKGROUND
|
||||
mov ecx, esi
|
||||
call memmove
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.fin:
|
||||
ret
|
||||
;---------------------------------------
|
||||
align 4
|
||||
nosb5:
|
||||
cmp ebx, 6
|
||||
jnz nosb6
|
||||
;--------------------------------------
|
||||
align 4
|
||||
;;Maxis use atomic bts for mutex 4.4.2009
|
||||
@@:
|
||||
bts dword [bgrlock], 0
|
||||
jnc @f
|
||||
call change_task
|
||||
jmp @b
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
mov eax, [current_slot_idx]
|
||||
mov [bgrlockpid], eax
|
||||
cmp [img_background], static_background_data
|
||||
jz .nomem
|
||||
stdcall user_alloc, [mem_BACKGROUND]
|
||||
mov [esp+32], eax
|
||||
test eax, eax
|
||||
jz .nomem
|
||||
mov ebx, eax
|
||||
shr ebx, 12
|
||||
or dword [page_tabs+(ebx-1)*4], MEM_BLOCK_DONT_FREE
|
||||
mov esi, [img_background]
|
||||
shr esi, 12
|
||||
mov ecx, [mem_BACKGROUND]
|
||||
add ecx, 0xFFF
|
||||
shr ecx, 12
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.z:
|
||||
mov eax, [page_tabs+ebx*4]
|
||||
test al, 1
|
||||
jz @f
|
||||
call free_page
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
mov eax, [page_tabs+esi*4]
|
||||
or al, PG_UWR
|
||||
mov [page_tabs+ebx*4], eax
|
||||
mov eax, ebx
|
||||
shl eax, 12
|
||||
invlpg [eax]
|
||||
inc ebx
|
||||
inc esi
|
||||
loop .z
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.nomem:
|
||||
and [bgrlockpid], 0
|
||||
mov [bgrlock], 0
|
||||
;--------------------------------------
|
||||
align 4
|
||||
nosb6:
|
||||
cmp ebx, 7
|
||||
jnz nosb7
|
||||
cmp [bgrlock], 0
|
||||
jz .err
|
||||
mov eax, [current_slot_idx]
|
||||
cmp [bgrlockpid], eax
|
||||
jnz .err
|
||||
mov eax, ecx
|
||||
mov ebx, ecx
|
||||
shr eax, 12
|
||||
mov ecx, [page_tabs+(eax-1)*4]
|
||||
test cl, MEM_BLOCK_USED or MEM_BLOCK_DONT_FREE
|
||||
jz .err
|
||||
jnp .err
|
||||
push eax
|
||||
shr ecx, 12
|
||||
dec ecx
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
and dword [page_tabs+eax*4], 0
|
||||
mov edx, eax
|
||||
shl edx, 12
|
||||
push eax
|
||||
invlpg [edx]
|
||||
pop eax
|
||||
inc eax
|
||||
loop @b
|
||||
pop eax
|
||||
and dword [page_tabs+(eax-1)*4], not MEM_BLOCK_DONT_FREE
|
||||
stdcall user_free, ebx
|
||||
mov [esp+32], eax
|
||||
and [bgrlockpid], 0
|
||||
mov [bgrlock], 0
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.err:
|
||||
and dword [esp+32], 0
|
||||
ret
|
||||
;-------------------------------------
|
||||
align 4
|
||||
nosb7:
|
||||
cmp ebx, 8
|
||||
jnz nosb8
|
||||
|
||||
mov ecx, [current_slot]
|
||||
xor eax, eax
|
||||
xchg eax, [ecx+APPDATA.draw_bgr_x]
|
||||
mov [esp + 32], eax ; eax = [left]*65536 + [right]
|
||||
xor eax, eax
|
||||
xchg eax, [ecx+APPDATA.draw_bgr_y]
|
||||
mov [esp + 20], eax ; ebx = [top]*65536 + [bottom]
|
||||
ret
|
||||
;---------------------------------------
|
||||
align 4
|
||||
nosb8:
|
||||
cmp ebx, 9
|
||||
jnz nosb9
|
||||
; ecx = [left]*65536 + [right]
|
||||
; edx = [top]*65536 + [bottom]
|
||||
mov eax, [_display.width]
|
||||
mov ebx, [_display.height]
|
||||
; check [right]
|
||||
cmp cx, ax
|
||||
jae .exit
|
||||
; check [left]
|
||||
ror ecx, 16
|
||||
cmp cx, ax
|
||||
jae .exit
|
||||
; check [bottom]
|
||||
cmp dx, bx
|
||||
jae .exit
|
||||
; check [top]
|
||||
ror edx, 16
|
||||
cmp dx, bx
|
||||
jae .exit
|
||||
|
||||
movzx eax, cx ; [left]
|
||||
movzx ebx, dx ; [top]
|
||||
|
||||
shr ecx, 16 ; [right]
|
||||
shr edx, 16 ; [bottom]
|
||||
|
||||
mov [background_defined], 1
|
||||
|
||||
mov [draw_data+32 + RECT.left], eax
|
||||
mov [draw_data+32 + RECT.top], ebx
|
||||
|
||||
mov [draw_data+32 + RECT.right], ecx
|
||||
mov [draw_data+32 + RECT.bottom], edx
|
||||
|
||||
inc [REDRAW_BACKGROUND]
|
||||
call wakeup_osloop
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.exit:
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
nosb9:
|
||||
ret
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
|
||||
align 4
|
||||
uglobal
|
||||
BG_Rect_X_left_right dd 0x0
|
||||
BG_Rect_Y_top_bottom dd 0x0
|
||||
endg
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
|
||||
align 4
|
||||
force_redraw_background:
|
||||
and [draw_data+32 + RECT.left], 0
|
||||
and [draw_data+32 + RECT.top], 0
|
||||
push eax ebx
|
||||
mov eax, [_display.width]
|
||||
mov ebx, [_display.height]
|
||||
dec eax
|
||||
dec ebx
|
||||
mov [draw_data+32 + RECT.right], eax
|
||||
mov [draw_data+32 + RECT.bottom], ebx
|
||||
pop ebx eax
|
||||
inc [REDRAW_BACKGROUND]
|
||||
call wakeup_osloop
|
||||
ret
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
|
||||
align 4
|
||||
sys_getbackground: ; sysfn 39
|
||||
dec ebx
|
||||
jnz .nogb1
|
||||
; sysfn 39.1:
|
||||
mov eax, [BgrDataWidth]
|
||||
shl eax, 16
|
||||
mov ax, word [BgrDataHeight]
|
||||
mov [esp+32], eax
|
||||
ret
|
||||
;---------------------------------------
|
||||
align 4
|
||||
.nogb1:
|
||||
dec ebx
|
||||
jnz .nogb2
|
||||
; sysfn 39.2:
|
||||
mov eax, [img_background]
|
||||
test ecx, ecx
|
||||
jz @f
|
||||
cmp eax, static_background_data
|
||||
jz .ret
|
||||
align 4
|
||||
@@:
|
||||
mov ebx, [mem_BACKGROUND]
|
||||
add ebx, 4095
|
||||
and ebx, -4096
|
||||
sub ebx, 4
|
||||
cmp ecx, ebx
|
||||
ja .ret
|
||||
|
||||
mov eax, [ecx+eax]
|
||||
|
||||
and eax, 0xFFFFFF
|
||||
mov [esp+32], eax
|
||||
align 4
|
||||
.ret:
|
||||
ret
|
||||
;------------------------------------------------------------------------------
|
||||
align 4
|
||||
.x dd ?
|
||||
.y dd ?
|
||||
.w dd ?
|
||||
.h dd ?
|
||||
.subrect_startptr dd ?
|
||||
.subrect_bytes dd ?
|
||||
align 4
|
||||
.nogb2:
|
||||
dec ebx
|
||||
jnz .nogb3
|
||||
; sysfn 39.3 read background subrect to buffer
|
||||
; ecx - <x, y>
|
||||
; edx - <w, h>
|
||||
; esi - buffer of 0x00RRGGBB
|
||||
mov eax, [img_background]
|
||||
cmp eax, static_background_data
|
||||
jz .ret_39_3
|
||||
align 4
|
||||
@@:
|
||||
movzx eax, cx ; store y in eax
|
||||
mov [.y], eax
|
||||
|
||||
shr ecx, 16 ; ecx = x
|
||||
mov [.x], ecx
|
||||
|
||||
imul eax, [BgrDataWidth]
|
||||
add eax, ecx
|
||||
imul eax, 3
|
||||
mov [.subrect_startptr], eax
|
||||
|
||||
movzx eax, dx ; store h in eax
|
||||
mov [.h], eax
|
||||
|
||||
shr edx, 16 ; edx = w
|
||||
mov [.w], edx
|
||||
|
||||
imul eax, edx
|
||||
mov [.subrect_bytes], eax
|
||||
|
||||
; check bounds
|
||||
mov ebx, [mem_BACKGROUND]
|
||||
add ebx, 4095
|
||||
and ebx, -4096
|
||||
sub ebx, 4
|
||||
add eax, [.subrect_startptr]
|
||||
cmp eax, ebx
|
||||
ja .fail_39_3
|
||||
|
||||
; copy contents
|
||||
mov edi, [img_background]
|
||||
xor ecx, ecx ; ecx - row index
|
||||
.copy_rect:
|
||||
cmp ecx, [.h]
|
||||
jae .end_copy_rect
|
||||
|
||||
xor edx, edx ; edx - column index
|
||||
.copy_row:
|
||||
cmp edx, [.w]
|
||||
jae .end_copy_row
|
||||
|
||||
mov ebx, ecx
|
||||
imul ebx, [BgrDataWidth]
|
||||
add ebx, edx
|
||||
imul ebx, 3
|
||||
add ebx, [.subrect_startptr]
|
||||
mov eax, [edi + ebx]
|
||||
mov ebx, ecx
|
||||
imul ebx, [.w]
|
||||
add ebx, edx
|
||||
and eax, 0xFFFFFF
|
||||
mov [esi + ebx*4], eax
|
||||
|
||||
inc edx
|
||||
jmp .copy_row
|
||||
.end_copy_row:
|
||||
|
||||
inc ecx
|
||||
jmp .copy_rect
|
||||
.end_copy_rect:
|
||||
xor eax, eax
|
||||
mov [esp+32], eax
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.fail_39_3:
|
||||
mov eax, -1
|
||||
align 4
|
||||
.ret_39_3:
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.nogb3:
|
||||
dec ebx
|
||||
jnz .nogb4
|
||||
; sysfn 39.4:
|
||||
mov eax, [BgrDrawMode]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.nogb4:
|
||||
mov [esp+32], eax
|
||||
ret
|
||||
;-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
align 4
|
||||
syscall_putarea_backgr: ; sysfn 25
|
||||
;eax = 25
|
||||
;ebx = pointer to bufer for img BBGGRRBBGGRR...
|
||||
;ecx = [size x]*65536 + [size y]
|
||||
;edx = [start x]*65536 + [start y]
|
||||
pushad
|
||||
mov edi, ebx
|
||||
mov eax, edx
|
||||
shr eax, 16
|
||||
mov ebx, edx
|
||||
and ebx, 0xffff
|
||||
dec eax
|
||||
dec ebx
|
||||
; eax - x, ebx - y
|
||||
mov edx, ecx
|
||||
shr ecx, 16
|
||||
and edx, 0xffff
|
||||
mov esi, ecx
|
||||
; ecx - size x, edx - size y
|
||||
mov ebp, edx
|
||||
|
||||
lea ebp, [ebp*4]
|
||||
imul ebp, esi
|
||||
stdcall is_region_userspace, edi, ebp
|
||||
jnz .exit
|
||||
|
||||
mov ebp, edx
|
||||
|
||||
dec ebp
|
||||
shl ebp, 2
|
||||
|
||||
imul ebp, esi
|
||||
|
||||
mov esi, ecx
|
||||
dec esi
|
||||
shl esi, 2
|
||||
|
||||
add ebp, esi
|
||||
add ebp, edi
|
||||
|
||||
add ebx, edx
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.start_y:
|
||||
push ecx edx
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.start_x:
|
||||
push eax ecx
|
||||
add eax, ecx
|
||||
|
||||
mov ecx, [ebp]
|
||||
rol ecx, 8
|
||||
test cl, cl ; transparensy = 0
|
||||
jz .no_put
|
||||
|
||||
xor cl, cl
|
||||
ror ecx, 8
|
||||
|
||||
pushad
|
||||
mov edx, [d_width_calc_area + ebx*4]
|
||||
add edx, [_display.win_map]
|
||||
movzx edx, byte [eax+edx]
|
||||
cmp dl, byte 1
|
||||
jne @f
|
||||
|
||||
call dword [PUTPIXEL]; eax - x, ebx - y
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
popad
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.no_put:
|
||||
pop ecx eax
|
||||
|
||||
sub ebp, 4
|
||||
dec ecx
|
||||
jnz .start_x
|
||||
|
||||
pop edx ecx
|
||||
dec ebx
|
||||
dec edx
|
||||
jnz .start_y
|
||||
|
||||
.exit:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user