[KERNEL] Add sysfn 39.3 - copy rect of background image to buffer.

Previously was only 39.2 that reads one pixel from background image.
(39.2 is shomehow useless due to big context switching overhead if you trying to read some area of pixels using 39.2)

git-svn-id: svn://kolibrios.org@9458 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Rustem Gimadutdinov (rgimad) 2021-12-22 17:10:59 +00:00
parent 78e0396849
commit 3d99a055b8
3 changed files with 135 additions and 14 deletions

View File

@ -2023,6 +2023,24 @@ path db 'HD0/1',0
* Есть парная функция установки точки на фоновом изображении - * Есть парная функция установки точки на фоновом изображении -
подфункция 2 функции 15. подфункция 2 функции 15.
---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_GET_RECT (39)
======================================================================
== Функция 39, подфункция 3 - получить прямоугольную область фона =
======================================================================
Параметры:
* eax = 39 - номер функции
* ebx = 3 - номер подфункции
* ecx = [x]*65536 + [y]
* edx = [width]*65536 + [height]
* esi = адрес буфера
Возвращаемое значение:
* eax = 0 - успех
* eax = -1 - ошибка
Замечания:
* Функция копирует указанную прямоугольную область в буфер в формате
0x00RRGGBB
---------------------- Константы для регистров: ---------------------- ---------------------- Константы для регистров: ----------------------
eax - SF_BACKGROUND_GET (39) eax - SF_BACKGROUND_GET (39)
====================================================================== ======================================================================

View File

@ -2004,6 +2004,24 @@ Remarks:
* There is a pair function to set pixel on the background image - * There is a pair function to set pixel on the background image -
subfunction 2 of function 15. subfunction 2 of function 15.
---------------------- Constants for registers: ----------------------
eax - SF_BACKGROUND_GET_RECT (39)
======================================================================
== Function 39, subfunction 3 - get rect from the background image. =
======================================================================
Parameters:
* eax = 39 - function number
* ebx = 3 - subfunction number
* ecx = [x]*65536 + [y]
* edx = [width]*65536 + [height]
* esi = buffer address
Returned value:
* eax = 0 - success
* eax = -1 - error
Remarks:
* Function copies specified rectangle of background image to buffer
in 0x00RRGGBB format
---------------------- Constants for registers: ---------------------- ---------------------- Constants for registers: ----------------------
eax - SF_BACKGROUND_GET (39) eax - SF_BACKGROUND_GET (39)
====================================================================== ======================================================================

View File

@ -3053,10 +3053,10 @@ force_redraw_background:
ret ret
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
align 4 align 4
sys_getbackground: sys_getbackground: ; sysfn 39
; cmp eax,1 ; SIZE
dec ebx dec ebx
jnz nogb1 jnz .nogb1
; sysfn 39.1:
mov eax, [BgrDataWidth] mov eax, [BgrDataWidth]
shl eax, 16 shl eax, 16
mov ax, word [BgrDataHeight] mov ax, word [BgrDataHeight]
@ -3064,17 +3064,15 @@ sys_getbackground:
ret ret
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
align 4 align 4
nogb1: .nogb1:
; cmp eax,2 ; PIXEL
dec ebx dec ebx
jnz nogb2 jnz .nogb2
; sysfn 39.2:
mov eax, [img_background] mov eax, [img_background]
test ecx, ecx test ecx, ecx
jz @f jz @f
cmp eax, static_background_data cmp eax, static_background_data
jz .ret jz .ret
;--------------------------------------
align 4 align 4
@@: @@:
mov ebx, [mem_BACKGROUND] mov ebx, [mem_BACKGROUND]
@ -3088,22 +3086,109 @@ align 4
and eax, 0xFFFFFF and eax, 0xFFFFFF
mov [esp+32], eax mov [esp+32], eax
;--------------------------------------
align 4 align 4
.ret: .ret:
ret ret
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------
align 4 align 4
nogb2: .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
; cmp eax,4 ; TILED / STRETCHED 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 dec ebx
dec ebx jnz .nogb4
jnz nogb4 ; sysfn 39.4:
mov eax, [BgrDrawMode] mov eax, [BgrDrawMode]
;-------------------------------------- ;--------------------------------------
align 4 align 4
nogb4: .nogb4:
mov [esp+32], eax mov [esp+32], eax
ret ret
;------------------------------------------------------------------------------ ;------------------------------------------------------------------------------