Тема: Moving Balls demo
Для отображения на экране изображения с движущимися шариками используется библиотека Buf2D.
Почему-то функция buf_create_f_img не создаёт 32-битный буфер, хотя, казалось бы, что этому мешает?
Пришлось самостоятельно это сделать.
Структура содержит поле Color:
TBuf2DBuffer = packed record
Img: Pointer;
Left: SmallInt;
Top: SmallInt;
Width: LongWord;
Height: LongWord;
Color: LongWord;
BPP: Byte;
end;
но всё равно почему-то нужно указывать цвет параметром Color ещё и тут:
buf2d_clear: procedure(var Buffer: TBuf2DBuffer; Color: LongWord); stdcall;
Непонятно, для чего это так дублируется(либо в структуре поле Color лишнее, либо лишний параметр Color в функции buf2d_clear)?
Насколько понял, на самом деле функция buf2d_bit_blt_transp работает с изображением с инвертированным альфа-каналом.
Да, это и указано в документации
Если a=255 то пиксель прозрачный, если 0 не прозрачный.
хотя может показаться не очень привычным: необходимо сначала преобразовать изображение к такому формату.
То есть, я хочу сказать, что имея изначально правильное 32-битное BGRA изображение, придётся в нём предварительно инвертировать альфа-канал(обычно так не делают).
Ссылки по теме:
В примере используются некоторые стандартные функции(Power, Exp, Ln, ...)
В примере используется функция Ln — логарифм.
В стандартном System для Delphi 2005 и новее она вот такая
function Ln(const X: Extended): Extended;
asm
FLD X // загрузили наше число
FLDLN2 // загрузили ln(2)
FXCH // поменяли местами загруженные числа
FYL2X // нашли логарифм
FWAIT
end;
А более ранние версии Delphi(например, Delphi 7) похоже просто инлайнят этот код, но инструкции генерируют те же самые.
Так вот, я сделал по-другому:
function Ln(const X: Extended): Extended;
asm
FLDLN2 // загрузили ln(2)
FLD X // загрузили наше число
FYL2X // нашли логарифм
end;
У меня всё так же работает как положено.
Я убрал FWAIT, но дело не в этом.
Как можно заметить, я загрузил числа в обратном порядке, и поэтому не пришлось их менять местами с помощью FXCH.
Вот и не понятно, какой великий смысл был в исходном варианте(загрузить в другом порядке и потом поменять местами)? Ведь разработчики Delphi явно же понимали, что делают.
Также используется функция Exp, я её не стал копипастить из стандартного System.
Используемый в данный момент вариант содержит меньшее количество команд по сравнению со стандартным.
В примере в некоторой степени используется ООП
TBall = object
Freq: Single;
Len: Single;
Rad: Single;
ImgBuf: TBuf2DBuffer;
procedure Draw;
procedure Init(i: LongInt);
end;
Исходный код — MovingBalls.7z.
Скомпилированное приложение — MovingBalls.kex.
MovingBalls.7z 9 Кб, 51 скачиваний с 2022-01-30
MovingBalls.kex 5.5 Кб, 58 скачиваний с 2022-01-30
MovingBalls.PNG 90.21 Кб, 38 скачиваний с 2022-01-30