Вверх ↑
Этот топик читают: Гость
Ответов: 1291
Рейтинг: 47
#1: 2013-08-29 19:54:24 ЛС | профиль | цитата
Пытаюсь испоьзовать компонент эффектов, почему этот код не работает?

Вот в этом коде из KolJanFX.pas видно что ошибка возникает после использования указателя массива P1:

Buf[0,0]:=P1[CX*3];

Сообщение ShowMessage не проходит после этой строки.
Удалось заставить работать только эффект Flip.

Что не так с использованием PByteArray? Есть какая-то хиасмовская специфика?



procedure SplitBlur(var Clip: PBitmap; Amount: integer);
var P0,P1,P2: PByteArray;
CX,X,Y: integer;
Buf: array [0..3,0..2] of byte;
begin
if Amount=0 then Exit;
for Y:=0 to pred(Clip.Height) do
begin
//ShowMessage('SplitBlur'+Int2Str(pred(Clip.Height)));
P0:=Clip.ScanLine[Y];
if Y-Amount<0 then P1:=Clip.ScanLine[Y] else P1:=Clip.ScanLine[Y-Amount]; {Y-Amount>0}
if Y+Amount<Clip.Height then P2:=Clip.ScanLine[Y+Amount] else P2:=Clip.ScanLine[Clip.Height-Y]; {Y+Amount>=Height}
for X:=0 to pred(Clip.Width) do
begin
// ShowMessage('SplitBlur2'+Int2Str(pred(Clip.Width)));
if X-Amount<0 then CX:=X else CX:=X-Amount; {X-Amount>0}
ShowMessage('SplitBlur2 '+Int2Str(pred(Clip.Width)));
Buf[0,0]:=P1[CX*3];
ShowMessage('SplitBlur3 '+Int2Str(pred(Clip.Width)));
Buf[0,1]:=P1[CX*3+1];
Buf[0,2]:=P1[CX*3+2];
Buf[1,0]:=P2[CX*3];
Buf[1,1]:=P2[CX*3+1];
Buf[1,2]:=P2[CX*3+2];
if X+Amount<Clip.Width then CX:=X+Amount else CX:=Clip.Width-X; {X+Amount>=Width}
Buf[2,0]:=P1[CX*3];
Buf[2,1]:=P1[CX*3+1];
Buf[2,2]:=P1[CX*3+2];
Buf[3,0]:=P2[CX*3];
Buf[3,1]:=P2[CX*3+1];
Buf[3,2]:=P2[CX*3+2];
P0[X*3]:=(Buf[0,0]+Buf[1,0]+Buf[2,0]+Buf[3,0]) shr 2;
P0[X*3+1]:=(Buf[0,1]+Buf[1,1]+Buf[2,1]+Buf[3,1]) shr 2;
P0[X*3+2]:=(Buf[0,2]+Buf[1,2]+Buf[2,2]+Buf[3,2]) shr 2;
ShowMessage('SplitBlur3'+Int2Str(pred(Clip.Width)));
end;
end;
end;
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 1376
Рейтинг: 197
#2: 2013-08-29 20:06:56 ЛС | профиль | цитата
Aziz писал(а):
хиасмовская специфика
подразумевает наличие неработающей схемы и чего требуется... Возможно: представление PByteArray тех времён изменилось, на данный момент. Вывод: сделать указатель на тип самосозданного массива и им оперировать себя
карма: 1

0
Ответов: 1291
Рейтинг: 47
#3: 2013-08-31 03:11:36 ЛС | профиль | цитата
А как это практически? Я не силен в указателях..

Да схема как 5 копеек - измененный компонент и пример Барби:

Отключил в kolmath.pas обработчик ошибок err.pas чтоб запускался. И еще ковырял функцию Trunc (применил Round(X)) в kolmath чтобы устранить ошибку

\kolmath.pas(826) Error: Incompatible types: 'Integer' and 'Extended'


Плюс вырезал некоторые директивы компилятора на которые он ругался. И после всего этого удивляюсь почему не работает..))) Но он по-любому не хотел работать..

Все эффекты не работают из-за применения неправильного в них указателя. Только flip пашет. Кто заставит все это работать тому огромный мегареспект! Пытался копать сам. Нашел что в Хиасмовском пакете код эффекта осветления используемый в компоненте Эффект кнопки совпадает почти с кодом эффекта Ligthness - и там тоже используется этот указатель - но все работает:

Add(Img_ButEff,9847711,420,350)
{
}


Думаю, многим пригодится этот полезный компонент для работы с графикой. Надо его осилить. Эти указатели..

janfx_1.1_mod.rar
barbie.rar
------------ Дoбавленo в 03.11:
Спасибо ребятам, мою проблему решили:
http://forum.hiasm.com/forum.html?q=3&t=49899
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
файлы: 2janfx_1.1_mod.rar [54.7KB] [466], barbie.rar [555.4KB] [482]
3
Сообщение
...
Прикрепленные файлы
(файлы не залиты)