Page 1 of 1

SysFn39.2:GetBackgroundPixel

Posted: Sat Oct 29, 2016 11:05 am
by 0CodErr
API KolibriOS порой очень удивляет.
* ecx = offset
* Offset for pixel with coordinates (x,y)
is calculated as (x+y*xsize)*3.
Это ещё сначала xsize надо узнать. То есть, ещё один вызов SysFn. А ведь ядро это и так знает.
Returned value:
* eax = 0x00RRGGBB - pixel color, if offset is valid
(less than 0x160000-16)
* eax = 2 otherwise
Ну уж pixel color, конечно, не может быть равен 2 :lol:

Re: SysFn39.2:GetBackgroundPixel

Posted: Mon Nov 07, 2016 5:57 pm
by 0CodErr
Сейчас вот так делаю

Code: Select all

{39.2}    Function  GetBackgroundPixel(X, Y: Integer): Dword; StdCall;
          Asm
                  push   ebx
          // at first need to know Background.Width
                  mov    eax, 39
                  mov    ebx, 1
                  int    64
          // at now eax = (Width << 16) | Height       
          // need to make ecx = (X + Y * Background.Width) * 3      
                  shr    eax, 16
                  mul    Y
                  add    eax, X
                  mov    ecx, eax
                  add    ecx, eax
                  add    ecx, eax                  
          // and now GetBackgroundPixel
                  mov    eax, 39
                  mov    ebx, 2
                  int    64            
                  pop    ebx
          End;

Re: SysFn39.2:GetBackgroundPixel

Posted: Mon Nov 07, 2016 6:41 pm
by CleverMouse
Это вредная функция. Один пиксель вряд ли кому-нибудь нужен, а делать по системному вызову на пиксель в больших объёмах - тормозно. Используй 15.6/15.7.

Re: SysFn39.2:GetBackgroundPixel

Posted: Mon Nov 07, 2016 6:54 pm
by 0CodErr
CleverMouse, да я абсолютно согласен, что это тормозно. Но GetBackgroundSize всё равно придётся делать. Да, в любом случае, если пикселей >2, то MapBackground + UnMapBackground будет лучше.