From a540a71a13171d918ad1b314376415be105a8f98 Mon Sep 17 00:00:00 2001 From: "Marat Zakiyanov (Mario79)" Date: Mon, 26 Mar 2012 21:10:43 +0000 Subject: [PATCH] Function 25 - put image area on the background layer git-svn-id: svn://kolibrios.org@2509 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/core/syscall.inc | 2 +- kernel/trunk/docs/sysfuncr.txt | 20 ++++++++ kernel/trunk/docs/sysfuncs.txt | 20 ++++++++ kernel/trunk/kernel.asm | 90 ++++++++++++++++++++++++++++++++-- 4 files changed, 127 insertions(+), 5 deletions(-) diff --git a/kernel/trunk/core/syscall.inc b/kernel/trunk/core/syscall.inc index ee4a819403..773aca85a3 100644 --- a/kernel/trunk/core/syscall.inc +++ b/kernel/trunk/core/syscall.inc @@ -145,7 +145,7 @@ iglobal dd sys_settime ; 22-setting date,time,clock and alarm-clock dd sys_wait_event_timeout ; 23-TimeOutWaitForEvent dd syscall_cdaudio ; 24-PlayCdTrack,StopCd and GetCdPlaylist - dd undefined_syscall ; 25-reserved + dd syscall_putarea_backgr ; 25-Put Area to background dd sys_getsetup ; 26-GetMidiBase,GetKeymap,GetShiftKeymap,. dd undefined_syscall ; 27-reserved dd undefined_syscall ; 28-reserved diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index ede434f591..d565c28853 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -1506,6 +1506,26 @@ dd 1675 * Функция поддерживается только для ATAPI-устройств (CD и DVD). * Примером использования функции является приложение CD_tray. +====================================================================== +========== Функция 25 - записать область на слой фона. =============== +====================================================================== +Параметры: + * eax = 25 - номер функции + * ebx = указатель на предварительно выделенную область памяти, + где размещено исходное изображение в формате BBGGRRTTBBGGRRTT... + * ecx = [размер по оси x]*65536 + [размер по оси y] + * edx = [координата по оси x]*65536 + [координата по оси y] +Возвращаемое значение: + * функция не возвращает значения +Замечания: + * Координаты области - это координаты верхнего левого угла + области относительно экрана. + * Размер изображения в байтах есть 4*xsize*ysize. + * TT - байт указатель прозрачности, в настоящее время: + от 1 до FF - непрозрачно, от 0 - прозрачно. + * Функция размещает изображение не на фоновое изображение (ф.15), + а напрямую в LFB. Опции ф.15 для ф. 25 не имеют смысла. + ====================================================================== ===== Функция 26, подфункция 1 - получить базовый порт MPU MIDI. ===== ====================================================================== diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index 668c3f89e1..91351a153d 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -1491,6 +1491,26 @@ Returned value: Remarks: * The function is supported only for ATAPI devices (CD and DVD). * An example of usage of the function is the application CD_tray. + +====================================================================== +======= Function 25 - put image area on the background layer. ======== +====================================================================== +Paramters: + * eax = 25 - function number + * ebx = pointer to the previously allocated memory area, + where placed the source images in a format BBGGRRTTBBGGRRTT... + * ecx = [size on axis x]*65536 + [size on axis y] + * edx = [coordinate on axis x]*65536 + [coordinate on axis y] +Returned value: + * function does not return value +Remarks: + * Coordinates of the image are coordinates of the upper left corner + of the image relative to the screen. + * Size of the image in bytes is 4*xsize*ysize + * TT - byte pointer of transparency, at current version: + 1 to FF - opaque, 0 - transparent. + * The function places the image directly to LFB. It is not for + background image f.15. Options f.15 to f.25 does not make sense. ====================================================================== ======== Function 26, subfunction 1 - get MPU MIDI base port. ======== diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 80fb2594da..4b81afd3bb 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -4687,9 +4687,8 @@ syscall_getpixel: ; GetPixel call dword [GETPIXEL]; eax - x, ebx - y mov [esp + 32], ecx ret - +;----------------------------------------------------------------------------- align 4 - syscall_getarea: ;eax = 36 ;ebx = pointer to bufer for img BBGGRRBBGGRR... @@ -4725,9 +4724,12 @@ syscall_getarea: add ebp, edi add ebx, edx - +;-------------------------------------- +align 4 .start_y: push ecx edx +;-------------------------------------- +align 4 .start_x: push eax ebx ecx add eax, ecx @@ -4749,9 +4751,89 @@ syscall_getarea: jnz .start_y popad ret - +;----------------------------------------------------------------------------- align 4 +syscall_putarea_backgr: +;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 + 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, [_WinMapAddress] + 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 + + popad + ret +;----------------------------------------------------------------------------- +align 4 syscall_drawline: ; DrawLine mov edi, [TASK_BASE]