diff --git a/kernel/trunk/gui/background.inc b/kernel/trunk/gui/background.inc new file mode 100644 index 0000000000..f466e71104 --- /dev/null +++ b/kernel/trunk/gui/background.inc @@ -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 - + ; edx - + ; 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 + + +