AIMP Forum
AIMP for PC => Плагины / Plugins => Дополнения / Addons => Визуализации / Visualizations => Topic started by: Black_AVP_Bim on October 31, 2024, 16:06:06
-
[catalog_card=1320]
Тот же Wave, только вид в полярных координатах.
Проверено VirusTotal (https://www.virustotal.com/gui/file/b048ba7a0a11c29c5a3a8e81f901c4e949d5ee91ede684a40ad68a17e2b8cefd?nocache=1)
-
Круто!
-
От себя бы предложил рисовать новый кадр поверх предыдущего с небольшой полупрозрачностью.
-
Приходила мне такая мысль в голову - частое мелькание несколько напрягает. Но тогда придётся переходить на битмапы, боюсь тормоза будут.
Сейчас всё рисуется прямо на FCanvas обычным PolyLine, даже на 4К мониторе во весь экран нагрузка на проц не превышает 10..12%.
-
Можно опционально сделать. Да, BitBlt расходует время, но некритичное.
-
Можно еще проще: Предыдущий кадр уже присутствует на DC, при вызове функции отрисовки заливать DC не черным, а полупрозрачным черным (см. acFillRect).
-
Можно еще проще: Предыдущий кадр уже присутствует на DC, при вызове функции отрисовки заливать DC не черным, а полупрозрачным черным (см. acFillRect).
Вот, я так и пытался сделать, но как бы не менял байт прозрачности в $FF000000, та канва, что FCanvas, затирается полностью.
Возможно, надо делать опять через промежуточный буфер, попробую ещё.
-
Попробовал рисовать на канве ACLBitmapLayer, затем затирать acFillRect полупрозрачным чёрным, результат тот же. Похоже, любое рисование линий убивает прозрачность, как и CopyRect.
Попутно вопрос: надо ли освобождать дескриптор контекста у ACLBitmapLayer.Canvas при выходе из процедуры?
-
ACLBitmapLayer.Canvas при выходе из процедуры
Нет, он сам грохнется вместе с Layer-ом.
Похоже, любое рисование линий убивает прозрачность, как и CopyRect
Странно, не должно быть такого. Как именно ты делаешь?
-
Странно, не должно быть такого. Как именно ты делаешь?
Фрагмент из Draw:
BGDib.Canvas.Handle := DC;
try
acFillRect(BGDib.Canvas, Rect(0, 0, FWidth, FHeight), $40000000);
//...............................................................................................
BGDib.Canvas.Pen.Width := 1;
BGDib.Canvas.Pen.Color := clRed;
BGDib.Canvas.PolyLine(Points);
// ..........................................................
finally
// BGDib.Canvas.Handle := 0;
end;
-
Вот тут ошибка:
BGDib.Canvas.Handle := DC;
Таким образом ты рисуешь не на BGDib, а на DC.
Вместо этого нужно делать так:
acBitBlt(BGDib.Canvas.Handle, DC, BGDib.ClientRect, TPoint.Zero);
ну и перед выходом из процедуры - обратное действо на DC
-
Конечно, можно рисовать и напрямую на DC (минуя вообще всякие Canvas-ы и Bitmap-ы, будет заметно быстрее).
Если возьмешь последнюю версию ACL, там в ACL.Graphic.Ex есть ExPainter, который позволяет рисовать с альфа-каналом на любом контексте.
Использовать его как-то так:
ExPainter.BeginPaint(DC)
.. тут что-то рисуем.
ExPainter.EndPaint
-
Таким образом ты рисуешь не на BGDib, а на DC.
Точно, ведь! Ну, мозги уже стариковские, на элементарный вещах уже спотыкаюсь.
Но один момент: как копилятор выбирает нужную функцию из:
procedure acFillRect(ACanvas: TCanvas; const ARect: TRect; AColor: TAlphaColor); overload;
procedure acFillRect(ACanvas: TCanvas; const ARect: TRect; AColor: TAlphaColor; ARadius: Integer); overload;
procedure acFillRect(ACanvas: TCanvas; const ARect: TRect; AColor: TColor); overload;
точнее, как отличает TAlphaColor от TColor.
У меня заработало только с вызовом функции, что с радиусом заливает, видимо потому, что число параметров другое.
-
Если явно тип у переменной / константы не указан - может подобрать только по знаковому/беззнаковому значению.
Чтобы точно быть уверенным, можешь сделать так:
acFillRect(BGDib.Canvas, Rect(0, 0, FWidth, FHeight), TAlphaColor($40000000));
-
Чтобы точно быть уверенным, можешь сделать так:
acFillRect(BGDib.Canvas, Rect(0, 0, FWidth, FHeight), TAlphaColor($40000000));
Да, так работает, а без приведения типа, видимо, вызывается та процедура с TColor.
-
Вариант с затуханием - https://disk.yandex.ru/d/c8YwNLsbVM5z8w
VirusTotal не ругается.
Вроде, получше смотрится.
-
Кстати, работает и на том DC, что передаётся в Draw, без TACLBitmapLayer
acFillRect(FCanvas, Rect(0, 0, FWidth, FHeight), TAlphaColor($50000000));
всё дело именно в TAlphaColor.
-
Поизвращался немного над последней версией. Ссылка прежняя на ЯД.
(https://www.aimp.ru/forum/index.php?action=dlattach;topic=73604.0;attach=72716)
-
PolarWaves v1.2 (ссылка в первом посте).
Добавил диалог настроек, скорее из спортивного интереса, дабы поглубже познакомиться с AIMP SDK, чем из соображения практической целесообразности.