Page 1 of 1

SysFn35:GetPixel

Posted: Fri Oct 14, 2016 9:23 pm
by 0CodErr
[b]Ghost[/b] wrote:Наткнулся на 35 (GetPixel) - подумал, может её переделать? Сейчас приложение сначала узнаёт ширину экрана, перемножает её на x.coord потом ядро делает обратную работу.
[b]sysfuncs.txt[/b] wrote:Parameters:
* eax = 35
* ebx = y*xsize+x, where
* (x,y) = coordinates of a pixel (beginning from 0)
* xsize = horizontal screen size
Может и действительно переделать?

Re: SysFn35:GetPixel

Posted: Fri Nov 04, 2016 5:13 pm
by 0CodErr
Это прямо какое-то извращение из-за одного пикселя :)

Code: Select all

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

Re: SysFn35:GetPixel

Posted: Fri Nov 11, 2016 9:30 pm
by CleverMouse
Не используйте функцию 35. Тем более что вам вряд ли нужен только один пиксель. Используйте функцию 36.

Re: SysFn35:GetPixel

Posted: Fri Nov 11, 2016 10:36 pm
by 0CodErr
CleverMouse wrote:вам вряд ли нужен только один пиксель
Иногда бывает нужен.
viewtopic.php?f=42&t=2650
viewtopic.php?f=38&t=1450

Re: SysFn35:GetPixel

Posted: Fri Nov 11, 2016 11:07 pm
by Pathoswithin
Там, где нужен один пиксель, не нужна производительность. Там, где нужен участок, попиксельная работа отпадает.

Re: SysFn35:GetPixel

Posted: Sat Nov 12, 2016 12:30 am
by art_zh
0CodErr
Если критикуешь какое-нибудь извращение - тогда предложи что-нибудь получше.

В растровой графике все пиксели лежат в массиве шириной Width и высотой Height.
Точка с координатами (X,Y) определяется элементом этого массива с номером (Y*Width+X), и никак иначе.

Ну если у твоего монитора фиксированное разрешение 1024х768, тогда умножение+сложение можешь соптимизировать битовым сдвигом с OR-маской по X-координате.
Так будет гораздо быстрее, но учти что
- это будет работать только на твоем компьютере, и
- в ядре десятки подобных растрово-пиксельных компутаций, вся оконная система на них построена.

Re: SysFn35:GetPixel

Posted: Thu Nov 17, 2016 7:30 pm
by CleverMouse
art_zh, а ты на функцию syscall_getpixel посмотрел перед своим постом? А в инструкцию div там тебя носом ткнуть?
0CodErr, Pathoswithin: и даже для одного пикселя можно использовать функцию 36.

Re: SysFn35:GetPixel

Posted: Fri Nov 18, 2016 12:13 am
by killerkirill
CleverMouse
Функция 35 изначально была хорошо задумана, чтото такое нужно для векторной графики и анимашек
(например стрелочные часы, надо запомнить старые пикселы под линией прежде чем её рисовать).
А параметры функции оптимизированы чтобы ядро разгрузить и в программах можно упростить код.
А потом наверно у когото на EGA-мониторе она не работала и Mr Turjanmaa замкнул всё на GETPIXEL через div :lol:
Но это не значит что она совсем лишняя и нельзя её доделать.

Re: SysFn35:GetPixel

Posted: Fri Nov 18, 2016 12:37 am
by Leency
: Забавно, когда человек написал за 6 лет всего 4 комментария и при этом знает кто такой Turjanmaa и как реализована GETPIXEL.

Re: SysFn35:GetPixel

Posted: Fri Nov 18, 2016 12:54 am
by killerkirill
Leency
не GETPIXEL, a syscall_getpixel.

Re: SysFn35:GetPixel

Posted: Fri Nov 18, 2016 3:49 pm
by 0CodErr
CleverMouse wrote:и даже для одного пикселя можно использовать функцию 36.
Ну это в принципе тоже вариант.

Re: SysFn35:GetPixel

Posted: Fri Nov 18, 2016 11:06 pm
by art_zh
CleverMouse
Миледи, Ваша грубость не делает этот мир лучше.

Leency
Имея недолгий опыт общения с Маратом и Ёгевом, Кирюха очень редко сюда заходит.
Но вообще-то в системе он разбирается неплохо.