kolibrios/kernel/trunk/gui/background.inc

597 lines
15 KiB
PHP
Raw Normal View History

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2023. All rights reserved. ;;
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
$Revision$
; 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, PAGE_SIZE-1
and ebx, -PAGE_SIZE
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
ret
;--------------------------------------
align 4
nosb3:
cmp ebx, 4 ; TILED / STRETCHED
jnz nosb4
mov [BgrDrawMode], ecx
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 + SYSCALL_STACK.eax], 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 + SYSCALL_STACK.eax], eax
and [bgrlockpid], 0
mov [bgrlock], 0
ret
;--------------------------------------
align 4
.err:
and dword [esp + SYSCALL_STACK.eax], 0
ret
;-------------------------------------
align 4
nosb7:
cmp ebx, 8
jnz nosb8
mov ecx, [current_slot]
mov ecx, [ecx + APPDATA.window]
xor eax, eax
xchg eax, [ecx + WDATA.draw_bgr_x]
mov [esp + SYSCALL_STACK.eax], eax ; eax = [left]*65536 + [right]
xor eax, eax
xchg eax, [ecx + WDATA.draw_bgr_y]
mov [esp + SYSCALL_STACK.ebx], eax ; ebx = [top]*65536 + [bottom]
ret
;---------------------------------------
align 4
nosb8:
cmp ebx, 9
jnz .exit
; 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 [background_window + WDATA.draw_data.left], eax
mov [background_window + WDATA.draw_data.top], ebx
mov [background_window + WDATA.draw_data.right], ecx
mov [background_window + WDATA.draw_data.bottom], edx
inc [REDRAW_BACKGROUND]
call wakeup_osloop
;--------------------------------------
align 4
.exit:
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 [background_window + WDATA.draw_data.left], 0
and [background_window + WDATA.draw_data.top], 0
push eax ebx
mov eax, [_display.width]
mov ebx, [_display.height]
dec eax
dec ebx
mov [background_window + WDATA.draw_data.right], eax
mov [background_window + WDATA.draw_data.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 + SYSCALL_STACK.eax], 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, PAGE_SIZE-1
and ebx, -PAGE_SIZE
sub ebx, 4
cmp ecx, ebx
ja .ret
mov eax, [ecx+eax]
and eax, 0xFFFFFF
mov [esp + SYSCALL_STACK.eax], eax
align 4
.ret:
ret
;------------------------------------------------------------------------------
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 .exit_39_3
sub esp, 4*3 ; local values
; get start offset
movzx eax, cx ; store y in eax
cmp eax, [BgrDataHeight]
jae .fail_39_3
mov [esp], eax ; save y
shr ecx, 16 ; ecx = x
cmp ecx, [BgrDataWidth]
jae .fail_39_3
imul eax, [BgrDataWidth]
add eax, ecx
imul eax, 3
mov [esp + 4*2], eax ; offset first poixel for copy
; get count pixels
movzx eax, dx ; h
shr edx, 16 ; w
add ecx, edx ; get RECT.right
cmp ecx, [BgrDataWidth]
jae .fail_39_3
; check area
mov ecx, [esp]
add ecx, eax
cmp ecx, [BgrDataHeight]
jae .fail_39_3
mov [esp + 4], eax ; save H
mov [esp], edx ; save W
; check buffer
add eax, edx
lea eax, [eax*3]
stdcall is_region_userspace, esi, eax
jnz .fail_39_3
; loop copy lines
mov edi, esi
mov esi, [img_background]
add esi, [esp + 4*2] ; add offset start copy
xor ecx, ecx ; index in line
cmp ecx, [esp + 4] ; check H == zerro
jz .exit_39_3
xor edx, edx ; offset in line
cld
.loop:
cmp ecx, [esp] ; check ecx < W
jae @f
mov eax, [esi + edx]
and eax, 0xFFFFFF
stosd ; [edi] = eax ; edi+=4;
inc ecx
add edx, 3
jmp .loop
@@:
xor edx, edx
mov eax, [BgrDataWidth]
lea esi, [esi + eax*2]
add esi, eax
mov ecx, edx
dec dword[esp + 4] ; h--
jnz .loop
; free stack
.exit_39_3:
add esp, 4*3
xor eax, eax
mov [esp + SYSCALL_STACK.eax], eax
ret
;--------------------------------------
align 4
.fail_39_3:
add esp, 4*3
mov [esp + SYSCALL_STACK.eax], -1
ret
;--------------------------------------
align 4
.nogb3:
dec ebx
jnz .nogb4
; sysfn 39.4:
mov eax, [BgrDrawMode]
;--------------------------------------
align 4
.nogb4:
mov [esp + SYSCALL_STACK.eax], 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