diff --git a/kernel/trunk/core/syscall.inc b/kernel/trunk/core/syscall.inc index 7e09c0091a..239265ebb9 100644 --- a/kernel/trunk/core/syscall.inc +++ b/kernel/trunk/core/syscall.inc @@ -219,7 +219,7 @@ iglobal dd undefined_syscall ; 33-reserved dd undefined_syscall ; 34-reserved dd syscall_getpixel ; 35-GetPixel - dd undefined_syscall ; 36-reserved + dd syscall_getarea ; 36-GetArea dd cross_order ; 37-GetMousePosition_ScreenRelative,. dd syscall_drawline ; 38-DrawLine dd cross_order ; 39-GetBackgroundSize,ReadBgrData,. diff --git a/kernel/trunk/docs/sysfuncr.txt b/kernel/trunk/docs/sysfuncr.txt index 841cbabef2..c2189bd246 100644 --- a/kernel/trunk/docs/sysfuncr.txt +++ b/kernel/trunk/docs/sysfuncr.txt @@ -1728,6 +1728,22 @@ dd 638 функций) через селектор gs. Параметры текущего видеорежима можно получить функцией 61. +====================================================================== +=============== Функция 36 - прочитать область экрана. ============== +====================================================================== +Параметры: + * eax = 36 - номер функции + * ebx = указатель на предварительно выделенную область памяти, + куда будет помещено изображение в формате BBGGRRBBGGRR... + * ecx = [размер по оси x]*65536 + [размер по оси y] + * edx = [координата по оси x]*65536 + [координата по оси y] +Возвращаемое значение: + * функция не возвращает значения +Замечания: + * Координаты изображения - это координаты верхнего левого угла + изображения относительно окна. + * Размер изображения в байтах есть 3*xsize*ysize. + ====================================================================== ==================== Функция 37 - работа с мышью. ==================== ====================================================================== diff --git a/kernel/trunk/docs/sysfuncs.txt b/kernel/trunk/docs/sysfuncs.txt index 92a1ac9d62..8ea17a58ab 100644 --- a/kernel/trunk/docs/sysfuncs.txt +++ b/kernel/trunk/docs/sysfuncs.txt @@ -1706,6 +1706,22 @@ Remarks: to videomemory through the selector gs. To get parameters of the current videomode, use function 61. +====================================================================== +=============== Function 36 - read screen area. =============== +====================================================================== +Paramters: + * eax = 36 - function number + * ebx = pointer on the previously allocated area of memory, + where will be placed the image in the format BBGGRRBBGGRR... + * 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 window. + * Size of the image in bytes is 3*xsize*ysize. + ====================================================================== =================== Function 37 - work with mouse. =================== ====================================================================== diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 2ab599a7d3..4c93e7aa79 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -5087,6 +5087,60 @@ syscall_getpixel: ; GetPixel mov [esp + 32], ecx ret +align 4 + +syscall_getarea: +;eax = 36 +;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 + ; eax - x, ebx - y + mov edx,ecx + + shr ecx,16 + and edx,0xffff + mov esi,ecx + ; ecx - size x, edx - size y +.start_y: + push ecx +.start_x: + push eax ebx ecx edx esi edi + add eax,ecx + add ebx,edx + call dword [GETPIXEL] ; eax - x, ebx - y + pop edi esi + + mov eax,ecx + pop edx ecx + + push ecx edx + + dec edx + lea edx,[edx*3] + imul edx,esi + dec ecx + lea ecx,[ecx*3] + add edx,ecx + add edx,edi + mov [edx],ax + shr eax,16 + mov [edx+2],al + + pop edx ecx ebx eax + + dec ecx + jnz .start_x + pop ecx + dec edx + jnz .start_y + popad + ret align 4