JSplitter v4.3.4 / 3.9.7 [07.10.2026]

Список разделов › foobar2000 › Плагины

Описание: Все о плагинах, компонентах, расширениях

  • 12

Сообщение #1 LUR » 21.03.2018, 05:06

Плагин представляет собой панель, совмещающую функциональность сплиттера (контейнера для панелей других плагинов) и хоста скриптов JavaScript.

Особенности функционала:

1. Панели добавляются в сплиттер в произвольном порядке, где с ними можно работать как с обычными окнами Windows, а именно: перемещать, изменять их размер, сворачивать, разворачивать, закрывать. Т.е. при работе с плагином foobar2000 превращается в приложение с MDI интерфейсом (Multi Document Interface). Для точного позиционирования панелей предусмотрено отображение координат и их редактирование "на лету" в заголовке окна панели (полезно при дизайне интерфейса сборки). Также имеется возможность настраивать цвета и шрифт заголовка окон панелей.
Функциональность сплиттера работает как в DUI, так и в CUI.

1.PNG


2. Поддерживается режим редактирования разметки как в DUI так и в CUI в традиционной для них манере. Поддерживается также управление размещением панелей в сплиттере через стандартный "размещатель" Columns UI.
3. В основе хоста скриптов лежит Spider Monkey Panel от TheQwertiest, соответственно имеет все возможности данной панели + дополнительные расширения API, касающиеся сплиттера. Также в проект активно вносятся изменения из "мода" Spider Monkey Panel за авторством marc2k3
4. Поддерживается управление панелями в сплиттере из скриптов. Возможно программно перемещать, скрывать, изменять размер панелей.
5. Имеется специальное API для быстрого создания кнопок в корне панели и обработки их нажатия.

ПРИМЕЧАНИЕ О ВЕРСИЯХ
Ввиду того, что последней ESR (Extended Support Release) версией движка JavaScript SpiderMonkey, поддерживающей Windows 7, является 102.15.1esr, решено сделать форк основной версии JSplitter и сделать из него ветку 3.x. Все изменения, вносимые в последнюю версию JSplitter (кроме движка), будут добавляться и туда. Единственная разница между веткой 4.x и 3.x в движке JavaScript: В 3.x будет всегда один и тот же движок 102.15.1esr, а в 4.x - самый свежий ESR.

СКАЧАТЬ
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ

Версия 3.9.7 (для пользователей Windows 7)
АНГЛИЙСКАЯ ВЕРСИЯ
РУССКАЯ ВЕРСИЯ

Краткое руководство
Для добавления панелей в сплиттер можно воспользоваться следующими способами:

1. С помощью контекстного меню панели плагина:

2.PNG


2. С помощью стандартного размещателя Columns UI:

4.PNG


3. С помощью списка панелей, вызываемого из контекстного меню плагина:

10.png


либо окна редактирования скрипта (см. скриншот). Список панелей можно также использовать для добавления, удаления, переупорядочивания панелей, а также изменения их положения и размеров вручную (двойной щелчок по соответствующему полю):

Снимок.PNG


4. В стандартном режиме редактирования разметки (Default UI / Columns UI)

9.png


Все добавляемые панели можно вручную перемещать, изменять их размер, сворачивать, разворачивать, закрывать. У каждого окна в заголовке имеется меню для настройки некоторых опций:

3.PNG


ВНИМАНИЕ! Порядок размещения панелей в сплиттере зависит от глубины их визуального расположения. Самое верхнее окно будет последним в списке. Если вы активируете мышкой какую-либо панель, она переместится в конец списка. Учитывайте это при использовании функции GetPanelByIndex (см. ниже). Чтобы случайных перемещений по списку не происходило, вы можете заблокировать панель (см. ниже)

Show caption - включает/отключает отображение рамки (бордюра) окна панели
Locked - заблокировать панель. С установленной галочкой окно не реагирует на попытки переместить/изменить/закрыть окно.
Show coords - отобразить координаты. В заголовке окна будут отображены координаты окна, которые будут обновляться по мере перемещения/изменения размера окна.
Support pseudo transparency - некоторым окнам необходима поддержка "прозрачности". С включенной опцией плагин будет заменять фон окна панели на содержимое корневого окна плагина. Т.е. например все, что нарисовано в скрипте с помощью on_paint(gr) будет скопировано в окно.

В режиме отображения координат можно вводить необходимые координаты вручную кликнув по нужной координате или изменить название панели:

7.PNG


Настройки внешнего вида окон панелей расположены здесь:

8.png


Show tools menu for panels' caption - включает/отключает меню для заголовка окон панелей.
Move panels with middle button - позволяет перемещать панели при помощи средней кнопки мыши. Полезно когда бордюр окна скрыт (меню Show caption).
Align panels to edges of each other when dragging - выравнивать панели по краям друг друга при перетаскивании окошек. Полезно при построении интерфейса сборки, где панели должны быть расположены плотно друг к другу.
Show scrollbars for out-of-view panels - экспериментальная функция показа полос прокрутки, если панели выходят из зоны видимости. Прокручиваются только панели, содержимое отрисованного окна не меняется и не скроллится.
Hide panels on close - скрывать окна вместо их закрытия. Полезно для временного скрытия панели с помощью кнопки закрытия окна. Вернуть обратно окна можно в размещателе Columns UI сняв галочку Hidden с панели (или из "списка панелей" см. выше):

6.PNG



Программный интерфейс
Базовое API всегда зависит от плагина, на котором основана текущая версия JSplitter. Документация к плагину прилагается. Плюс к этому доступны следующие дополнения для объекта window:

window.GetPanel(caption) - получить объект для доступа к панели по тексту заголовка. Будет возвращена первая панель, совпавшая по тексту с аргументом. Текст панели указывается в заголовке. По умолчанию он имеет значение имени плагина панели, но его можно изменить как напрямую в заголовке окна (Show coords -> Click in caption text), так и в размещателе Columns UI (Use custom title)
window.GetPanelByIndex(index) - получить объект для доступа к панели по индексу. Вообще порядок изначально тот, в котором добавляются панели, но так же порядок можно увидеть в размещателе Columns UI, там же его и изменить.
window.CreateButton(x, y, images, hover_images) - создать кнопку в сплиттере. Кнопка будет создана в корне окна и будет размещена по координатам (x, y). Также функции передаются изображения для задания внешнего вида кнопки. Собственно от количества изображений images, переданных функции, будет зависеть количество состояний, которые может принимать кнопка. hover_images - изображения кнопки, отображающиеся при наведении курсора мыши. Функция достаточно гибкая для создания различного вида кнопок, например:
var path = fb.FoobarPath + "themes\\lur\\black\\bio.png";
var hpath = fb.FoobarPath + "themes\\lur\\black\\bio_on.png";
var a = window.CreateButton(0, 0, path, hpath); - создает обычную кнопку с картинкой bio.png, которая меняется на bio_on.png при наведении курсора мыши
var b = window.CreateButton(0, 0, [path, hpath], null); - создает чекбокс-кнопку. Обычное состояние - bio.png, нажатое (галочка установлена) - bio_on.png. Обратите внимание, что изображения для наведения курсора отсутствуют. Обычно чекбоксам они и не нужны, но можно их установить при желании.
var c = window.CreateButton(0, 0, [path1, path2, path3], [path1_on, path2_on, path3_on]); - можно создать кнопку с тремя (и более) состояниями. Они будут циклически переключаться при нажатии. Текущее состояние кнопки можно будет получить с помощью свойства кнопки State (см. ниже).
Также можно создать группу радио-кнопок (взаимоисключающих) с помощью следующей функции:
window.RadioButtons(buttons) - создает группу радио-кнопок. Принимает в качестве аргумента массив кнопок. Каждая кнопка должна иметь не менее двух состояний, иначе функция свалится. Пример:
var a = window.CreateButton(0, 0, [path, hpath], null);
var b = window.CreateButton(30, 0, [path, hpath], null);
window.RadioButtons([a, b]);
Теперь при нажатии на одну кнопку (состояние 1), другая будет "отключаться" (переходить в состояние 0) и наоборот.
window.GetButton(id) - получить кнопку по значению ее идентификатора (Button.ID)
window.RemoveButton(button) - удаляет кнопку
window.HandOnButtons - переключает курсор мыши для всех кнопок либо на руку, либо на стрелку. Данное свойство также действует на все создаваемые впоследствии кнопки. У каждой кнопки это свойство можно менять индивидуально (см. ниже).

Введены вспомогательные методы для управления главным окном плеера.
window.FoobarWindowX - возвращает и устанавливает положение главного окна foobar2000 по оси X.
window.FoobarWindowY - возвращает и устанавливает положение главного окна foobar2000 по оси Y.
window.FoobarWindowWidth - возвращает и устанавливает ширину главного окна foobar2000.
window.FoobarWindowHeight - возвращает и устанавливает высоту главного окна foobar2000.

Так как JSplitter не получает никакой информации о передвижении мыши над панелями самих плагинов, но иногда это требуется, то введено API для получения данных событий. Перед использованием данного API его необходимо явно разрешить в настройках JSplitter (опция "Track mouse over panels (for on_panel_mouse_*)"/"Отслеживать мышь над панелями (для on_panel_mouse_*)").
window.TrackMouseEnterLeaveOnPanels = true; - включает отслеживание входа/выхода курсора мыши из области панелей. По умолчанию false. Для обработки событий используются следующие функции:
on_panel_mouse_enter(name) - событие входа курсора в область панели, name - имя панели
on_panel_mouse_leave(name) - событие выхода курсора из области панели, name - имя панели
window.TrackMouseMoveOnPanels = true; - включает отслеживание позиции курсора мыши в пределах области панели. По умолчанию false. Для обработки события используется следующая функция:
on_panel_mouse_move(name, x, y, mask) - событие перемещения курсора в пределах области панели, name - имя панели, x,y - координаты точки на панели

Объекты, получаемые при помощи функций, указанных выше, имеют следующие свойства и методы:

ПАНЕЛИ (GetPanel, GetPanelByIndex)
Свойства:
(readonly) String Name;
(read, write) String Text;
(read, write) boolean Hidden;
(read, write) boolean Locked;
(read, write) boolean ShowCaption;
(read, write) boolean SupportPseudoTransparency;
(read, write) int X;
(read, write) int Y;
(read, write) int Width;
(read, write) int Height;
(read, write) boolean TopMost;
(read, write) boolean EraseBackground;
Методы:
void Show(show = true);
void Move(x, y, width, height, repaintParent = false);

КНОПКИ (CreateButton, GetButton)
Свойства:
(readonly) ushort ID;
(read, write) int X;
(read, write) int Y;
(read, write) int Width;
(read, write) int Height;
(read, write) boolean Hidden;
(read, write) boolean HandOnHover;
(read, write) Function Click;
(read, write) uint State;
Методы:
void Show(show = true);
void Move(x, y);
void Resize(width, height);

Назначение свойств и методов объектов довольно прозрачно. При назначении ширины или высоты кнопки в ноль, ширина и высота автоматически высчитываются (как и просто при создании кнопки) из максимальной ширины и высоты изображений. Отдельного упоминания заслуживает обработка нажатий кнопок. Она осуществляется 2-мя
путями:

1. При помощи задания свойства Click объекта кнопки:
var a = window.CreateButton(0, 0, [path, hpath], null);
a.Click = function() { do_something(); }

2. При помощи специального callback'a, который вызывается при нажатии ВСЕХ кнопок, созданных с помощью window.CreateButton:
function on_button_click(id) - принимает идентификатор кнопки, который можно получить через свойство кнопки ID.
switch(id) {
case a.ID:
do_something();
break;
}


ПРИМЕЧАНИЕ: В отличие от панелей, существующих вне зависимости от скрипта, кнопки создаются только программно с помощью скрипта и всегда уничтожаются при выгрузке скрипта.


ДОКУМЕНТАЦИЯ
https://dima-lur.github.io/jsplitter/

Пример конфигурации
Распаковать в папку с чистым портативным фубаром.
СКАЧАТЬ

Пример от zeremy

История версий
Версия 4.3.4 [07.10.2026]
  • [ИСПРАВЛЕНИЕ] Исправлена ошибка инвалидации шрифта GDI+, загруженного с помощью utils.LoadFont. Обращение к свойству GdiFont.Name могло инвалидировать внутренний объект шрифта GDI+ и приводить к падению foobar2000 при последующих операциях рисования GDI+, например GdiGraphics.DrawString.
  • [ИСПРАВЛЕНИЕ] Исправлено падение, которое могло происходить при выходе из foobar2000 во время финализации объектов JavaScript. Реэнтерабельная обработка оконных сообщений при освобождении COM-объектов могла попытаться выполнить ожидающие задания JavaScript после того, как контекст JavaScript уже был уничтожен. Жизненный цикл завершения работы и очистка ресурсов также усилены для защиты от реэнтерабельной финализации.
  • [ОБНОВЛЕНИЕ] Расширен метод MenuObject.SetDefault: теперь в качестве параметра можно передавать не только ID пункта, но и другой объект MenuObject, что позволяет назначить само подменю пунктом по умолчанию.

Версия 4.3.3 [06.10.2026]
  • [ИСПРАВЛЕНИЕ] Исправлено некорректное преобразование component-specific locations (например, 3dydfy://) в пути файловой системы в fb.AddLocationsAsync и plman.AddLocations. Относительные пути к файлам по-прежнему разрешаются относительно текущего скрипта, include-файла или файла Worker.
  • [ИСПРАВЛЕНИЕ] Удалён завершающий разделитель пути из %jsplitter_fb2k% и %jsplitter_fb2k_profile%, чтобы они соответствовали ожидаемому синтаксису путей Title Formatting и не создавали двойные разделители при составлении путей.

Версия 4.3.2 [05.10.2026]
  • [ИСПРАВЛЕНИЕ] Исправлена визуальная «белая вспышка», которая всегда появлялась при запуске foobar2000 независимо от текущей темы. Теперь JSplitter самостоятельно отрисовывает начальный фон панели в соответствии с текущей темой интерфейса до начала выполнения скрипта.
  • [ОБНОВЛЕНИЕ] Убраны ненужные hit testing и обработка курсора в режиме FbWindow.FrameStyle NoBorder в случаях, когда такое поведение неприменимо (например, когда MinWidth == MaxWidth).
  • [НОВОЕ] Добавлены методы FbTitleFormat.EvalActivePlaylistItem и FbTitleFormat.EvalPlaylistItem для вычисления выражений Title Formatting в контексте плейлиста, включая специфичные для плейлиста поля, такие как %list_index% и %list_total%.
  • [НОВОЕ] Добавлен метод MenuObject.SetDefault для назначения пункта меню по умолчанию, который отображается жирным шрифтом. Пункт по умолчанию можно переназначить повторным вызовом метода с другим ID.

Версия 4.3.1 [03.10.2026]
  • [НОВОЕ] Добавлены две глобальные переменные Title Formatting: %jsplitter_fb2k% и %jsplitter_fb2k_profile%, предоставляющие пути к каталогам установки и профиля foobar2000. Эти же значения доступны в качестве переменных окружения процесса. Добавлен отдельный раздел Title Formatting в документации с описанием всех переменных JSplitter.
  • [ОБНОВЛЕНИЕ] Метод FbWindow.SetPseudoCaption расширен необязательным параметром maximize_on_dblclk, позволяющим разворачивать и восстанавливать главное окно двойным щелчком по области псевдозаголовка.
  • [ОБНОВЛЕНИЕ] Унифицировано разрешение относительных файловых путей во всех поддерживаемых API, принимающих пути к файлам, включая скрипты панелей, подключаемые файлы и Workers. Относительные пути разрешаются относительно расположения вызывающего скрипта с последующим поиском в предусмотренных каталогах.
  • [НОВОЕ] Добавлено свойство window.ScriptInfo.Path, возвращающее полный файловый путь к основному скрипту панели в системном формате или пустую строку для скриптов, загружаемых из памяти.
  • [ИСПРАВЛЕНИЕ] Исправлено возможное падение в fb.ShowPictureViewer при невозможности открыть файл изображения, если его путь содержит фигурные скобки.

Версия 4.3.0 [02.10.2026]
  • [ОБНОВЛЕНИЕ] Движок JavaScript обновлён до SpiderMonkey 153.4.0esr.
  • [НОВОЕ] Добавлена поддержка ES-модулей. Файлы .mjs, выбранные в качестве файловых скриптов панели, теперь загружаются как ES-модули с поддержкой относительных статических импортов, вложенных и циклических зависимостей, именованных экспортов и экспорта по умолчанию, кеширования модулей, import.meta.url, путей с Unicode и корректной передачи ошибок при загрузке, разборе и выполнении модулей.
  • [ОБНОВЛЕНИЕ] foobar2000 SDK обновлён до версии от 2026-10-01.
  • [НОВОЕ] API FbWindow расширен системными командами для управления главным окном foobar2000: Minimize, Maximize, Restore и Close, а также свойствами IsMinimized и IsMaximized для проверки состояния окна.
  • [НОВОЕ] Добавлено свойство window.IsToolbar, позволяющее определить, размещена ли панель JSplitter на панели инструментов Columns UI.

Версия 4.2.2 [28.09.2026]
  • [НОВОЕ] Добавлены потоковые API файлового ввода-вывода для обработки больших файлов без загрузки всего их содержимого в память JavaScript. utils.OpenTextReader и utils.OpenTextWriter обеспечивают построчное чтение и запись текста с выбором кодировки, а utils.OpenBinaryReader и utils.OpenBinaryWriter позволяют читать и записывать двоичные данные через повторно используемые буферы Uint8Array. API доступны как в панели, так и в Worker.
  • [ОБНОВЛЕНИЕ] Расширена поддержка кодировок в utils.ReadTextFile и utils.WriteTextFile. Чтение текста теперь единообразно поддерживает UTF-8, UTF-16LE/BE, UTF-32LE/BE и поддерживаемые кодовые страницы Windows, включая автоматическое определение кодировки при соответствующем запросе. WriteTextFile теперь также принимает кодовую страницу для выходного файла вместо ограничения только UTF-8 и может опционально записывать BOM для UTF-8, UTF-16 и UTF-32. Для совместимости существующие значения по умолчанию для UTF-8 не изменены.
  • [НОВОЕ] Добавлен Worker.RunAsync для удобного однократного выполнения фоновой работы без ручного создания и управления постоянным Worker. Каждый вызов создаёт временный полноценный Worker realm/поток, структурно клонирует переданные аргументы в него, выполняет пользовательский синхронный или асинхронный JavaScript callback, структурно клонирует результат обратно в панель и после этого автоматически завершает Worker. Метод предназначен для достаточно крупных изолированных задач, например обработки больших файлов, где отдельный протокол обмена сообщениями с Worker лишь добавлял бы лишний шаблонный код.
  • [НОВОЕ] Добавлен нативный SQLite API, доступный как в панели, так и в Worker, если процесс foobar2000 предоставляет совместимую библиотеку SQLite. utils.OpenDatabase открывает файловые базы данных или базы в памяти и возвращает объект SQLiteDatabase с прямым выполнением SQL, параметризованными запросами, транзакциями и повторно используемыми подготовленными выражениями через SQLiteStatement. Значения JavaScript могут безопасно передаваться как SQL-параметры, строки результата возвращаются как обычные JavaScript-объекты, а значения SQLite BLOB представлены как Uint8Array. Относительные пути к базе используют разрешение путей относительно скрипта JSplitter; также поддерживаются базы :memory:.
  • [НОВОЕ] Добавлен utils.LoadFont для загрузки пользовательских TrueType/OpenType-шрифтов непосредственно из пакетов скриптов без их установки в Windows. Загруженные шрифты являются приватными для процесса foobar2000, становятся доступны API шрифтов GDI и Direct2D и используются совместно панелями и Worker. Относительные пути разрешаются относительно текущего скрипта JSplitter, благодаря чему шрифты можно распространять вместе с основным скриптом, подключаемыми файлами или исходниками Worker. Повторная загрузка одного и того же файла безопасна, а загруженные шрифты остаются доступны на протяжении всего времени работы процесса foobar2000.
  • [НОВОЕ] Добавлен API fb.Window для управления главным окном foobar2000 непосредственно из скриптов панели. API предоставляет текущую позицию и внешний размер окна, позволяет перемещать и изменять его размер, переключаться между стандартной рамкой, режимом без заголовка и режимом без рамки, входить и выходить из полноэкранного режима, а также задавать ограничения минимального и максимального размера. В Default User Interface также можно скрывать и восстанавливать главное меню и строку состояния. Настройки применяются непосредственно к главному окну foobar2000 и могут динамически изменяться во время работы. Начиная с этого выпуска window.FoobarWindowX, window.FoobarWindowY, window.FoobarWindowWidth, window.FoobarWindowHeight и window.MoveFoobarWindow устарели и будут удалены в будущих версиях. В новом коде следует использовать свойства геометрии fb.Window и Move.
  • [ОБНОВЛЕНИЕ] utils.GetWaveformAsync расширен опциональным callback on_progress. Готовые диапазоны огибающей waveform теперь могут передаваться ещё во время декодирования, позволяя интерфейсу waveform появляться постепенно, не дожидаясь завершения декодирования всего трека. Callback получает каждый новый диапазон Float32Array вместе с его смещением в выходном массиве и может вернуть false, чтобы отменить устаревший запрос декодирования. Возвращаемый Promise по-прежнему разрешается полным waveform после нормального завершения декодирования. Добавлен пример.
  • [НОВОЕ] В расширенные настройки JSplitter добавлен параметр «Формат заголовка статистики воспроизведения». Он задаёт выражение Title Formatting, используемое для идентификации треков во внутреннем индексе статистики воспроизведения JSplitter, и позволяет изменить схему сопоставления для библиотек, где стандартного идентификатора $lower(%artist% - %title%) недостаточно. Изменение настройки требует перезапуска foobar2000.
  • [ОБНОВЛЕНИЕ] Расширен fb.ShowPictureViewer. Помимо непосредственного открытия изображения по пути к файлу, теперь он может принимать FbMetadbHandle и опциональный тип обложки альбома. В этом варианте foobar2000 самостоятельно находит и открывает требуемое изображение, включая как встроенные, так и внешние обложки.
  • [НОВОЕ] Добавлены API выбора звуковых потоков для мультимедийных файлов с несколькими потоками. fb.GetAudioStreams перечисляет все звуковые потоки, предоставляемые активным входным декодером, и возвращает для каждого полные данные FbFileInfo вместе с индексом потока, состоянием потока по умолчанию и текущим пользовательским выбором. fb.SetAudioStream сохраняет выбранный поток для трека и, если применяется к воспроизводимому в данный момент элементу, перезапускает воспроизведение так, чтобы новый поток применился немедленно с продолжением примерно с текущей позиции. Выбор потоков использует штатный input stream selector foobar2000, а SetAudioStream требует foobar2000 2.0 или новее.
  • [ИСПРАВЛЕНИЕ] Исправлена обработка сохранённых компоновок JSplitter, содержащих ссылки на UI Elements из компонентов, которые больше не установлены или временно недоступны. Отсутствующие дочерние элементы теперь обрабатываются безопасно и представлены заглушкой UI Element not found вместо неправильного восстановления или инициализации панели.
  • [ИСПРАВЛЕНИЕ] Исправлено периодическое зависание при перезапуске foobar2000 после обновления или удаления используемого в данный момент пакета скриптов. Перезапуск теперь запрашивается только после полного закрытия Package Manager и диалога настройки панели, что предотвращает зависание завершения работы во вложенном модальном цикле сообщений.
  • [ОБНОВЛЕНИЕ] Движок редактора исходного кода обновлён до Scintilla 5.6.7.

Версия 1.0 [20.03.2018]
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев


  • −

Сообщение #461 LUR » 25.02.2026, 07:01

Версия 4.1.0 beta 4 [25.02.2026]

● [BUG] Исправлена ​​утечка объектов GDI.
● [BUG] Исправлена ​​ошибка измерения текстовых строк с пробелами в конце в режиме Direct2D.
● Обновлен движок JS до SpiderMonkey 140.8.0esr
● Обновлен редактор исходного кода до Scintilla 5.5.9

Версия 3.7.9 [25.02.2026]

● Изменения см. в JSplitter v4.1.0 beta 4 (кроме обновления движка JS)
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев

  • −

Сообщение #462 yeyo » 27.02.2026, 07:36

Thanks for the update!!
The test found that the CPU usage is high (i7-6700HQ) after updating from "4.0.4.4-beta" to "4.1.0 beta 4", and the same code, the CPU usage of "4.1.0 beta 4" is more than 3 times that of the "4.0.4.4-beta" version (high usage for a long time)
yeyo
Репутация: 1
С нами: 4 года 1 месяц

  • −

Сообщение #463 LUR » 27.02.2026, 11:26

yeyo:the CPU usage of "4.1.0 beta 4" is more than 3 times that of the "4.0.4.4-beta" version
Give me an example. I can't read tea leaves.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев

  • −

Сообщение #464 dreamawake » 04.03.2026, 07:13

Hi LUR, recently I am trying the "Pseudotransparency" property of the panels, in order to develop a theme using the cover art as the background simply thru a base panel. But it looks that the Pseudotransparent panels are unable to realtimely refresh when the background changes (you have to switch the active panel -- changing the focused panel, or resize all panels to refresh the Pseudotransparent panels). Could you please look at it if specified scripts is needed or it is a bug (from SMP?). I upload a small video as attached.
Video_2026-03-04_121149.mp4
(973.9 КБ) Скачиваний: 155
dreamawake
Репутация: 3
С нами: 3 года 6 месяцев

  • −

Сообщение #465 LUR » 06.03.2026, 17:05

dreamawake:But it looks that the Pseudotransparent panels are unable to realtimely refresh when the background changes
This is not a bug. This has always been the case with all pseudo-transparencies; that's why they're called pseudo-transparents. To update the background in a child window, you need to "nudge" it, call a repaint, or resize the window.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев

  • −

Сообщение #466 dreamawake » 07.03.2026, 05:15

This is not a bug. This has always been the case with all pseudo-transparencies; that's why they're called pseudo-transparents. To update the background in a child window, you need to "nudge" it, call a repaint, or resize the window.
Yes, It is. Thank you.
Another thing, I found that when changing the size of the Pseudotransparent panel, from left and top border will cause dithering effect of the background, but from right and bottom border will be perfect. This might be a deficiency. Please see attached video for reference.

Video_2026-03-07_100755.mp4
(647.29 КБ) Скачиваний: 153
dreamawake
Репутация: 3
С нами: 3 года 6 месяцев

  • −

Сообщение #467 LUR » 07.03.2026, 13:36

dreamawake:This might be a deficiency
This is the normal behavior for resizing from the left and top, and I can't fix it. You can see for yourself that everything falls into place in the end. This is simply a resizing effect for Windows, and it is present in many applications. And this effect doesn't depend on the presence of pseudo-transparency; you can do this without transparency and display the image, for example:

Код: Выделить всё
gr.DrawImage(img, 0, 0, windows.Width, windows.Height, 0, 0, img.Width, img.Height);

and see the effect of resizing, when the rendering catches up with the resize. And this is only for the resize at the top and left, that's just how it worked out historically.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев

  • −

Сообщение #468 LUR » 07.03.2026, 23:18

Версия 4.1.0 beta 4 [25.02.2026]

  • [BUG] Исправлена ​​утечка объектов GDI.
  • [BUG] Исправлена ​​ошибка измерения текстовых строк с пробелами в конце в режиме Direct2D.
  • Обновлен движок JS до SpiderMonkey 140.8.0esr
  • Обновлен редактор исходного кода до Scintilla 5.5.9

Версия 4.1.0 beta 5 [01.03.2026]

  • [BUG] Исправление D2DBitmap.RotateFlip
  • [FEATURE] Добавлены utils.ReadBinaryFile и utils.WriteBinaryFile для чтения/записи бинарных файлов. Методы работают с объектами Uint8Array в качестве входных/выходных буферов.
  • [FEATURE] Добавлен метод GetPixelData в GdiBtmap и D2DBitmap для получения буфера (Uint8Array) содержащего пиксельные данные в указанном формате (см. документацию)
  • [FEATURE] Добавлен метод CreateImageFromPixelData в GdiBtmap и D2DBitmap, предназначенный для создания битмапа из указанного буфера пиксельных данных (Uint8Array) в указанном формате (см. документацию).
  • [FEATURE] Добавлен метод GetColourSchemeJSONV2 в GdiBtmap и D2DBitmap для получения цветовой схемы изображения с помощью нового алгоритма (K-means++ с Oklab).
  • Обновлен редактор исходного кода до Scintilla 5.6.0

Версия 4.1.0 beta 6 [03.03.2026]

  • [BUG] Эффекты переставали работать после использования D2DBitmap.RotateFlip
  • [BUG] Исправлена установка параметров статистики для FbMetadbHandle (например, SetLoved, SetPlaycount...)
  • [BUG] Примеры скриптов, показанные в окне конфигурации, не отражали фактическое дерево папок

Версия 4.1.0 beta 7 [07.03.2026]

  • [BUG] В D2DBitmap.RotateFlip буфер отрисовки не очищался
  • [BUG] Функции отрисовки примитивов Direct2D (линии, прямоугольники и т. д.) были скорректированы в точном соответствии с поведением рендеринга в GDI+
  • [BUG] Шрифты, которые не распознаются в Direct2D по своему "имени GDI", теперь успешно создаются с правильным именем и толщиной.
  • [BUG] Исправлена ​​ошибка D2DGraphics.FillGradRect
  • [FEATURE] Добавлен метод D2DGraphics.FillGradRectV2, который создает градиент с любым количеством цветов (см. документацию)
  • [FEATURE] Добавлен второй необязательный параметр minChroma к GetColourSchemeJSONV2 в GdiBitmap и D2DBitmap для фильтрации начального выбора кластеров по значению хроматичности. Теперь для начальных центров алгоритм выбирает только цвета со значением насыщенности >= minChroma (по умолчанию: 0, безопасное значение, отфильтровывающее множество очень темных цветов: 0.02). Если запрошенных кластеров (параметр count) больше, чем кандидатов, он выбирает оставшиеся центры из всех оставшихся пикселей (кроме уже выбранных).
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев

  • −

Сообщение #469 yeyo » 10.03.2026, 12:46

LUR:
LUR:yeyo:
the CPU usage of "4.1.0 beta 4" is more than 3 times that of the "4.0.4.4-beta" version
Give me an example. I can't read tea leaves.
It may be because my CPU is too old, please ignore this discussion.

I spent some time testing D2D and found a problem with the cover data broadcast reception: I used Clone()、CreateRawBitmap() to clone the cover and use NotifyOthers to notify other panels, use on_notify_data in other panels to receive, and use gdi.CreateImage, GetGraphics, gr.GdiDrawBitmap, ReleaseGraphics(gr) to draw the received cover image data. Unfortunately, the image was not drawn, but the same code is in GDI mode works and draws fine, it means GdiDrawBitmap only works in GDI, is there a way to make GdiDrawBitmap work in D2D mode too? No need to save the received cover data as a temporary image file before drawing the image?
yeyo
Репутация: 1
С нами: 4 года 1 месяц

  • −

Сообщение #470 LUR » 10.03.2026, 13:54

yeyo, try this:
Код: Выделить всё
let img = gdi.Image(`${fb.ComponentPath}\\samples\\d2d\\images\\icons8-car-production-96.png`);
let i = gdi.CreateImage(100, 100);
let g = i.GetGraphics();
g.DrawImage( img, 0, 0, i.Width, i.Width, 0, 0, img.Width, img.Width) ;
i.ReleaseGraphics(g);
let ir = i.CreateRawBitmap();

function on_paint(gr) {
    gr.GdiDrawBitmap( ir, 0, 0, ir.Width, ir.Height, 0, 0, ir.Width, ir.Height) ;
}

It works for me. The only reason you're not getting anything is because you're calling bitmap methods before ReleaseGraphics. The principle is this: first, draw on the bitmap, call the release, and only then work with other methods of the bitmap itself. In GDI, you didn't have to do this.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев

  • −

Сообщение #471 yeyo » 10.03.2026, 17:34

LUR:yeyo, try this:
Код: Выделить всё
let img = gdi.Image(`${fb.ComponentPath}\\samples\\d2d\\images\\icons8-car-production-96.png`);
let i = gdi.CreateImage(100, 100);
let g = i.GetGraphics();
g.DrawImage( img, 0, 0, i.Width, i.Width, 0, 0, img.Width, img.Width) ;
i.ReleaseGraphics(g);
let ir = i.CreateRawBitmap();

function on_paint(gr) {
    gr.GdiDrawBitmap( ir, 0, 0, ir.Width, ir.Height, 0, 0, ir.Width, ir.Height) ;
}

It works for me. The only reason you're not getting anything is because you're calling bitmap methods before ReleaseGraphics. The principle is this: first, draw on the bitmap, call the release, and only then work with other methods of the bitmap itself. In GDI, you didn't have to do this.

Hi,LUR,Thanks for the reply!
Referring to your sample code, I still haven't found an effective solution, I attach the effective introduction code in GDI mode, create two new JSP panels, import the code in the two files respectively, and play the audio track with the cover, you will find that the cover data can be Notify and Received normally, and then specify window.DrawMode = 1 at the beginning of the two file codes, in the console you will find that the Received panel can receive image height and width data normally, but the drawing is invalid, trying to use your method has not solved it.
Вложения
cover-test.zip
(1012 байт) Скачиваний: 96
yeyo
Репутация: 1
С нами: 4 года 1 месяц

  • −

Сообщение #472 LUR » 12.03.2026, 05:46

yeyo:in the console you will find that the Received panel can receive image height and width data normally, but the drawing is invalid, trying to use your method has not solved it.
When D2D drawing is initialized, a factory and a device are created. All resources created for this device are intended only for this device. Therefore, attempting to transfer a bitmap for drawing on another device should fail. This is a D2D limitation. You can get the js object and see its properties (width, height), but the drawing itself will not work. The only thing you can do in this case is to copy the pixel data and recreate the bitmap.

Код: Выделить всё
function on_notify_data(name, info) {
    if (name === COVER_NOTIFICATION_NAME) {
        const coverData = info.GetPixelData();
        if (cover) cover = null;
        cover = gdi.CreateImageFromPixelData(coverData, info.Width, info.Height);
        window.Repaint();
    }
}
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев

  • −

Сообщение #473 yeyo » 12.03.2026, 07:34

LUR:The only thing you can do in this case is to copy the pixel data and recreate the bitmap.
Thanks for clarifying, it worked.
yeyo
Репутация: 1
С нами: 4 года 1 месяц

  • −

Сообщение #474 LUR » 16.03.2026, 03:49

Версия 4.1.0 beta 8 [16.03.2026]

  • D2DGraphics.FillGradRect и D2DGraphics.FillGradRectV2: рендеринг градиентов, содержащих полупрозрачные цвета, был скорректирован в соответствии с рендерингом в режиме GDI.
  • [BUG] D2DGraphics.MeasureString был скорректирован для измерения строк без пробелов в конце, как в режиме GDI
  • D2DGraphics.DrawImage: обработка входных параметров была скорректирована таким образом, чтобы работать как в режиме GDI, а именно:
    • При указании отрицательных значений dstW и dstH изображение зеркально отображается
    • При указании srcW и srcH больше исходных размеров изображения изображение масштабируется в противоположном направлении
    • Отображение повернутого изображения с обрезкой по прямоугольнику src, большему, чем исходное, было скорректировано в соответствии с режимом GDI
  • [BUG] Исправлена ​​ошибка в D2DGraphics.FillSolidRect
  • Список эффектов значительно расширен (см. документацию модуля Effects). Добавлено несколько примеров.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев

  • −

Сообщение #475 yeyo » 19.03.2026, 13:35

Hi,LUR!
In D2D mode, use:
Код: Выделить всё
gr.DrawLine(ww/2, 10, ww/2, wh-10, 1, 0xFF000000);
Draw a vertical line. When dragging the window height or width, a curvature will appear at the top of the line. There is no such problem under GDI.
I recorded a video, please note the change in curvature at the top of the line.
Video_2026-03-19_183211.mp4
(269.91 КБ) Скачиваний: 97
yeyo
Репутация: 1
С нами: 4 года 1 месяц

  • −

Сообщение #476 LUR » 19.03.2026, 15:32

yeyo:When dragging the window height or width, a curvature will appear at the top of the line.
Will be fixed in next release.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев

  • −

Сообщение #477 yeyo » 20.03.2026, 08:38

Hi LUR, using D2D mode, foobar2000 takes more than twice as long to start up as in GDI mode. Adding a JSP panel to a clean foobar2000 instance and loading the built-in jsplaylist-mod playlist, foobar2000 takes about 400ms to start up in GDI mode, but about 1000ms in D2D mode (based on the foobar2000 console output). Conclusion: foobar2000 startup time in D2D mode is more than twice that in GDI. Are there any plans to optimize this?
yeyo
Репутация: 1
С нами: 4 года 1 месяц

  • −

Сообщение #478 LUR » 20.03.2026, 16:41

yeyo:Are there any plans to optimize this?
No. Believe me, nothing extra is done there, so there is nothing to optimize.
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев

  • −

Сообщение #479 LUR » 20.04.2026, 00:43

Версия 4.1.0 beta 10 [19.04.2026]

  • [БАГ] Исправлена ​​ошибка в D2DGraphics.CalcTextHeight, чтобы воспроизвести поведение в GDI в отношении переносов строк.
  • [БАГ] Для режима рисования D2D добавлены проверки результата ID2D1RenderTarget::EndDraw в D2DBitmap.ReleaseGraphics и on_paint (теперь они приводят к сбою скрипта, если EndDraw вернул ошибку).
  • [БАГ] [БАГ] [БАГ] Исправления в примерах regor
  • [БАГ] FbPlaylistManager.GetGUID больше не приводит к сбою скрипта, если индекс плейлиста выходит за пределы диапазона, и в этом случае просто возвращает пустую строку.
  • [БАГ] Сообщение об отрисовке иногда зависает в очереди сообщений
  • [БАГ] Добавлена ​​зависимость от DT_CALCRECT к DT_BOTTOM и DT_VCENTER в D2DGraphics.DrawText для соответствия скриптам, написанным для GDI
  • [ФУНКЦИЯ] Добавлен utils.FontPicker (см. документацию)
  • [ФУНКЦИЯ] Теперь диалоговое окно, отображаемое utils.ColourPicker, центрируется относительно своего непосредственного родительского элемента
  • [ОБНОВЛЕНИЕ] Обновлен движок JavaScript до SpiderMonkey 140.9.1esr
  • [ОБНОВЛЕНИЕ] Обновлен движок редактора исходного кода до Scintilla 5.6.1
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев

  • −

Сообщение #480 LUR » 22.04.2026, 03:32

Версия 4.1.0 beta 11 [22.04.2026]

  • [БАГ] Исправлены D2DBitmap.GetColourSchemeJSON и D2DBitmap.GetColourSchemeJSONV2 для учета значения альфа-канала
  • [ОШИБКА] Исправлена ​​ошибка в D2DGraphics.DrawText, теперь учитывается флаг DT_SINGLELINE при вертикальном выравнивании
  • [ОБНОВЛЕНИЕ] Обновлен движок JavaScript до SpiderMonkey 140.10.0esr
LUR M
Автор темы, Модератор
Откуда: Минск
Репутация: 451
С нами: 13 лет 11 месяцев