LINUX.ORG.RU

Simple Viewer GL 3.3.1

 , , , ,


0

1

Simple Viewer GL – лёгкий однооконный просмотрщик изображений.

Многое из того, что раньше делалось на CPU, теперь выполняется на GPU.

В строке статуса, которую можно отключать клавишей i, отображается базовая информация: формат, разрешение, размер в памяти (CPU + GPU), размер на диске. В режиме информации о пикселе, который включается клавишей p, отображается бабл с информацией о позиции, цвете пикселя, параметрах выделенной области.

Simple Viewer GL умеет определять тип файла по его сигнатуре (параметр -a), а не только по расширению файла. Поддерживается рекурсивный обход директории (параметр -r).

Есть возможность менять в рантайме тип фона (три базовых цвета + шахматная доска) окна или задавать кастомный цвет, что удобно при просмотре изображений с прозрачными пикселями.

Поддерживаемые форматы:

  • PNG
  • JPEG
  • JPEG 2000
  • HEIF
  • PSD (Adobe Photoshop)
  • AI (Adobe Illustrator)
  • EPS
  • XCF (GIMP)
  • GIF
  • SVG
  • TIFF
  • TARGA
  • ICO
  • ICNS (Apple Icon Image)
  • BMP
  • PNM
  • DDS
  • XWD
  • SCR (ZX-Spectrum screen)
  • XPM
  • WebP
  • OpenEXR

Поддерживаются GNU/Linux, FreeBSD и macOS. Существует сторонний форк для Windows.

Новое в Simple Viewer GL 3.3.1:

  • переработана архитектура вьювера;
  • а потому и новый чуть более гибкий рендерер;
  • благодаря рендереру профили и прочие преобразования перенёс с CPU на GPU;
  • благодаря переработанной архитектуре починил и загрузку, и прогресс (спиннер);
  • значительно снизился расход памяти. Теперь память по возможности выделяется только под несколько чанков. Нет полной распакованной копии изображения в памяти;
  • информация о пикселе тянется из видеокарты;
  • счётчик расхода памяти учитывает видеопамять;
  • добавил превью для форматов которые его поддерживают. Если есть превью в EXIF, то беру из него;
  • переработал интерфейс. Переделал рендерер, обновил и ImGui из ветки с поддержкой докинга окон;
  • новый попап EXIF в доке справа, а в него добавил категории и поиск;
  • переработал панель статуса. Просто сделал удобнее её внутри, а заодно поправил визуал;
  • теперь панель статуса не перекрывает изображение. И вообще, любое закреплённое у края окно не перекрывает изображение;
  • расширил поддержку PSD. Теперь поддерживаются практически все вариации;
  • добавил поддержку HEIF (AVIF/HEIC);
  • починил greyscale jpeg2k – теперь яркость корректная;
  • добавил поддержку цветовых профилей там, где их не было, но формат их поддерживал;
  • и ещё кучу того, что и вспомнить не могу, а логи читайте сами, мне лень.

Наверняка что-нибудь отломал, поэтому буду рад замечаниям и советам.

Лицензия GPL-2.0.

>>> Simple Viewer GL on GitHub

★★★★★

Проверено: dataman ()
Последнее исправление: hobbit (всего исправлений: 5)

v3.3.1

А CMake пишет:

****************************************
*           Simple Viewer GL           *
*                v1.0.0                *
****************************************

Кому верить? :)

Ещё и ругается:

simple-viewer-gl/src/version.cpp:10:10: fatal error: version.h: No such file or directory
   10 | #include <version.h>
      |          ^~~~~~~~~~~
compilation terminated.
dataman ★★★★★
()
Последнее исправление: dataman (всего исправлений: 1)
Ответ на: комментарий от dataman
****************************************
*           Simple Viewer GL           *
*                v3.3.1                *
****************************************
*            Release Build             *
****************************************

Собирал через make release, как указано в инструкции

annulen ★★★★★
()
Ответ на: комментарий от annulen

Собирал через make release

А я c cmake -G Ninja -B build.

как указано в инструкции

Так собралось. :)


Какие-то флюиды, не иначе. Теперь с Ninja тоже собралось.

dataman ★★★★★
()
Последнее исправление: dataman (всего исправлений: 1)

У меня падает при попытке использовать полноэкранный режим:

Thread 1 "sviewgl" received signal SIGSEGV, Segmentation fault.
0x00007ffff7cbcff4 in Xutf8LookupString () from /usr/lib64/libX11.so.6
(gdb) bt
#0  0x00007ffff7cbcff4 in Xutf8LookupString () from /usr/lib64/libX11.so.6
#1  0x00007ffff7e775ad in ?? () from /usr/lib64/libglfw.so.3
#2  0x000055555562355d in cWindow::pollEvents (this=0x7fffffffd340) at /home/ktokarev/src/git/simple-viewer-gl/src/Window.cpp:401
#3  0x000055555562563c in main (argc=2, argv=0x7fffffffd8a8) at /home/ktokarev/src/git/simple-viewer-gl/src/main.cpp:296
(gdb) 
annulen ★★★★★
()
Ответ на: комментарий от annulen

У меня не падает, но открывает полновэкранный режим на основном мониторе, а не на котором было окно (по возвращении в оконный режим остаётся на основном экране).

UPD:

libX11.so.6

WM: KWin (Wayland)

IIIypuk ★★★★★
()
Последнее исправление: IIIypuk (всего исправлений: 1)
Ответ на: комментарий от IIIypuk

Спасибо, изучу в ближайшее время.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

Странно.

Да не, это у меня что-то с копией случилось. После git-clear всё нормально.

dataman ★★★★★
()
Ответ на: комментарий от andreyu

Что за видео драйвер / карта?

У меня тоже падает после нажатия Enter. NVIDIA GeForce GTX 1050 Mobile / 550.163.01-4 / KDE Plasma 6.5.4 (X11).

dataman ★★★★★
()

просмотр картинки через опенгл. это прямо какой-то новый уровень извращений.

bernd ★★★★★
()

Многое из того, что раньше делалось на CPU, теперь выполняется на GPU, только хуже и медленней.

kirill_rrr ★★★★★
()

Тема Ленки не раскрыта.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от bernd

А у тебя какое DE и оконный менеджер? Если гном, кеды или типа того с композитором (не чисто программным), то всё что ты видишь на экране это OpenGL, через Clutter, Cogl.

LINUX-ORG-RU ★★★★★
()

Наверняка что-нибудь отломал, поэтому буду рад замечаниям и советам.

Собрал просто как make

****************************************
*           Simple Viewer GL           *
*                v3.3.1                *
****************************************
*            Release Build             *
****************************************
* [+] OpenGL found                     *
* [+] GLFW3 found                      *
* [+] Threads found                    *
* [+] X11 found                        *
* [+] ZLib found                       *
* [+] PNG support enabled              *
* [+] JPEG support enabled             *
* [ ] EXIF support dropped             *
* [+] LCMS2 support enabled            *
* [ ] OpenJPEG2 support dropped        *
* [+] GIF support enabled              *
* [+] TIFF support enabled             *
* [+] WebP support enabled             *
* [ ] OpenEXR support dropped          *
* [+] Curl support enabled             *
* [ ] HEIF support dropped             *
****************************************
-- Configuring done (18.3s)
-- Generating done (0.2s)

Запустил из каталога сборки ./sviewgl, поперетягивал картинки мышкой, работает, перетянул каталог с картинками, работает. Перетянул каталог ~/Загрузки с разным мусором, без картинок.

dron@gnu:~/Рабочий-стол/simple-viewer-gl$ ./sviewgl 
Using default config.
terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string: construction from null is not valid
Аварийный останов      ./sviewgl
dron@gnu:~/Рабочий-стол/simple-viewer-gl$ 
LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от kirill_rrr

Потому что незачем тратить драгоценное время процессора на просмотр фоток с летних шашлыков. Ему и без этого есть чем заняться.

apt_install_lrzsz ★★★★
()
Ответ на: комментарий от apt_install_lrzsz

Как раз процессору быстрее самому просмотреть фотку чем строчить openGL-вызовы для отрисовки джипега на видеокарте. Возможно когда размер холста переваливает за 100Мпикс что то и меняется, но это к счастью весьма редкий сценарий.

kirill_rrr ★★★★★
()
Последнее исправление: kirill_rrr (всего исправлений: 1)

https://i.imgur.com/O4GR8PQ.png

1. Сверху сабж, снизу feh. Если приблизить и присмотреться, то в отличии от feh, присутствует какая-то пикселизация на границе объекта(да и не только на границе).

2. Понажимал много раз на Enter и получил

Upd: Уточнение, падает если нажать Enter и не отпускать. Падает после 2го переключения.

sviewgl: /var/tmp/portage/media-libs/glfw-3.4/work/glfw-3.4/src/input.c:274: _glfwInputKey: Проверочное утверждение «window != NULL» не выполнено.
fish: Job 1, './sviewgl ~/Pictures/' terminated by signal SIGABRT (Abort)

Также если нажать Enter подряд много раз, то переключение происходит ещё несколько секунд. Может промежуточные переключения туда-сюда стоит скипать?

3. Ожидал по PgUp\PgDown перехода к следующей\предыдущей картинке в каталоге, но не сработало, переключило на пустую.

Loki13 ★★★★★
()
Последнее исправление: Loki13 (всего исправлений: 2)
Ответ на: комментарий от kirill_rrr

Мне кажется это из-за энергосбережения на ноутах, там выводить процессор из спячки намного дороже по аккуму, чем сделать всё это на GPU.

Loki13 ★★★★★
()
Ответ на: комментарий от dataman

Спасибо.

Для создания окна и контекста используется GLFW. Или я не умею его готовить, или что-то с ним не так, но для переключения режима мне когда-то пришлось делать костыли.

Частично костыли делались для поддержки тайловых оконных менеджеров, включая hyprland.

Возможно, это повод перейти на наливную реализацию. Но очень не хочется заниматься инициализацией контекста, обработки инпута, drag-n-drop и клипбордом врукопашную. Но намек я понял, спасибо.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от bernd

просмотр картинки через опенгл. это прямо какой-то новый уровень извращений.

Ага, у меня же есть CPU, зачем мне использовать GPU.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от kirill_rrr

Многое из того, что раньше делалось на CPU, теперь выполняется на GPU, только хуже и медленней.

А можно в контексте вьювера пояснить, что стало медленнее после переноса вычислений на GPU?

Я вижу лишь ускорение. Тот же LUT (ICC) на CPU на моих тестовых образцах выполнялся 10+ секунд, а теперь это делается на GPU.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Спасибо, похоже что в fmtlib прилетело что-то неперевариваемое. Разберемся.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от unixnik

С одним конём? )

Кони нынче дорогие, хватило только на одного :)

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

Только сумма. Есть смысл разделить?

Нет разумеется, как и в сумме. У подавляющего большинства пользователей просто нет и никогда не будет изображений для которых это имеет значение. Но всё-равно прикольно, поэтому можно и разделить :)

zabbal ★★★★☆
()
Ответ на: комментарий от andreyu

Было бы прикольно.

У вас походу глаз замылился:

размер в памяти (CPU + GPU)

У них вся память - это кэш l1, l2 и тд. Осмелюсь предположить, что имели в виду ram/vram 🐱

zanac1
()
Ответ на: комментарий от Loki13

Там там же двойная петля получается, цпу-гпу-цпу-гпу. Что что, а спать он точно не будет ни при каких условиях. Даже если удастся сделать zero copy - всё равно надо проснуться и много раз обменяться вызовами между приложением, ядром и видеокартой.

Уже многократно проверено - простые короткие задачи ускоряются именно отключением аппаратного ускорения если у тебя есть хотя бы коре2. ДАже на Распбри Пи 4 (кортекс-а72) это не так уж очевидно кто быстрее. Другое дело если вебЖЛ со сценой на тысячи полигонов, какй нибудь новый 2ГИС. Но тут то один!

kirill_rrr ★★★★★
()
Последнее исправление: kirill_rrr (всего исправлений: 4)
Ответ на: комментарий от kirill_rrr

Это надо изучать алгоритмы декодирования и обработки изображений. Возможно вот эти управляющие команды можно на одном медленном ядре делать не пробуждая все, а если будешь декодировать и обрабатывать, то пробуждай всю печку. Но опять же, без тестов(10000 картинок на CPU и 10000 картинок на GPU) я бы не брался утверждать что больше сожрет батареи. ТС вон говорит что какие-то алгоритмы у него получились на GPU в 10 раз быстрее(10 сек на процессоре было).

Уже многократно проверено - простые короткие задачи

Картинка с зеркалки на кучу мегапикселей, это простая задача? Она у меня отрисовывается прямо видно глазами что не мгновенно и когда переключаешь их одну за одной это некомфортно и хочется ускорить. И это 12 ядерный проц десктопный. IO мало вероятно что виновато, там NVME шустрый.

Loki13 ★★★★★
()
Последнее исправление: Loki13 (всего исправлений: 1)
Ответ на: комментарий от Loki13
  1. Сверху сабж, снизу feh. Если приблизить и присмотреться, то в отличии от feh, присутствует какая-то пикселизация на границе объекта(да и не только на границе).

FEH мылит?

  1. Понажимал много раз на Enter и получил

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

  1. Ожидал по PgUp\PgDown перехода к следующей\предыдущей картинке в каталоге, но не сработало, переключило на пустую.

Регрессия. Заметил баг не сразу, поэтому отложил его починку на следующий раз.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от IIIypuk

открывает полновэкранный режим на основном мониторе, а не на котором было окно (по возвращении в оконный режим остаётся на основном экране).

Пофиксил. Сегодня залью разом все фиксы.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

FEH мылит?

Мне сложно сказать. Но я бы не назвал это мылом. Могу попробовать в ещё кучке просмотрщиков, чтобы понять как должно быть при эталонном декодировании. Есть какой эталонный просмотрщик?

Loki13 ★★★★★
()
Ответ на: комментарий от andreyu

Это вьювер или професиональный цветокоректор? От вьювера с simple в названии ждёшь скорее что он запустится быстрее feh, нарисует картинку в окне так быстро как только возможно сделать декодирование ну и мгновенной реакции и отсутствие лагов при масштабировании и например перемещении. Так что я имею в виду общий принцип - не надо тянуть на ГПУ всё с чем ЦПУ и так справялется быстрее 50мс даже если ему 15 лет. Вот внедрили тотальный openGL в интерфейсы - теперь анимации в qt5/6/гтк3+ начали подлагивать. Внедрили в веб - тот же 2Гис стал тормозным, хотя рисует всё то же самое пиксель в пиксель.

kirill_rrr ★★★★★
()
Ответ на: комментарий от Loki13

Мне сложно сказать. Но я бы не назвал это мылом. Могу попробовать в ещё кучке просмотрщиков, чтобы понять как должно быть при эталонном декодировании.

Было бы здорово узнать результаты сравнения.

Есть какой эталонный просмотрщик?

Может браузер при 100% зуме?

andreyu ★★★★★
() автор топика
Ответ на: комментарий от kirill_rrr

Это вьювер или професиональный цветокоректор?

Он ничего не корректирует, а лишь старается отобразить корректно изображение. На мой взгляд, это основная фича вьювера.

От вьювера с simple в названии ждёшь скорее что он запустится быстрее feh, нарисует картинку в окне так быстро как только возможно сделать декодирование ну и мгновенной реакции и отсутствие лагов при масштабировании и например перемещении.

Он все это делает дольше?

Так что я имею в виду общий принцип - не надо тянуть на ГПУ всё с чем ЦПУ и так справялется быстрее 50мс даже если ему 15 лет.

Я не слышал про этот «общий» принцип. В любом случае, считаю странной претензию к вьюверу из-за использования GPU для вывода картинки.

Вот внедрили тотальный openGL в интерфейсы - теперь анимации в qt5/6/гтк3+ начали подлагивать.

Тот случай, когда CPU новый, а GPU 15 лет на службе? :)

У меня какая-то старая Nvidia, но лагов анимации в Hyprland не вижу.

Внедрили в веб - тот же 2Гис стал тормозным, хотя рисует всё то же самое пиксель в пиксель.

Я не пользуюсь 2Гис напостоянку, но не помню, чтобы мог назвать его шустрым. В любом случае, при чем тут мой вьювер?

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

Было бы здорово узнать результаты сравнения.

В gwenview как у тебя, в showfoto(который часть Digikam) как в feh. Так что 1-1 пока что(ну или 2-2).

Пикселят: simpleviewer, showfoto, kolourpaint, krita

Мажут: feh, gwenview, firefox, vivaldi, qutebrowser, imv, swayimg

Что смог - потестировал.

Loki13 ★★★★★
()
Ответ на: комментарий от zabbal

А зачем там libcurl? Что просмотрщик картинок делает с сетью?

Умеет тянуть картинку по сети. Было время, когда мне нужно было смотреть картинки, на которые мне присылали ссылки. Надоело их скачивать, смотреть, удалять. Поэтому и добавил такую функциональность.

С помощью CURL он качает картинку во временную директорию, показывает ее, а картинку удаляет.

Если фича не нужна, то можно запретить ее с помощью DISABLE_CURL_SUPPORT.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от Loki13

Картинка с зеркалки на кучу мегапикселей, это простая задача?

Да не то чтобы сложная. Пи3/кортекс-А53 feh 1 ядро 2 секунды, причём через vnc, а на пи4/кортекс-а72 - полсекунды. Кэнон 24Мписк. В обоих случаях я не уверен что задействованы инструкции neon (+30-100%).

С другой стороны вращение уже целых 3 секунды, а видеокарта должна была бы сделать почти мгновенно.

kirill_rrr ★★★★★
()
Последнее исправление: kirill_rrr (всего исправлений: 1)
Ответ на: комментарий от Loki13

Что смог - потестировал.

Спасибо за труд. Буду считать, что мой вьювер честно отображает картинку. В любом случае, я его именно для этого и делал - помощь в геймдеве.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от zabbal

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

Судя по комментариям от пользователей, которые я получал, всегда найдется тот, у кого есть потребность в чем-то необычном.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от zanac1

Осмелюсь предположить, что имели в виду ram/vram 🐱

Все верно.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

Спасибо за труд. Буду считать, что мой вьювер честно отображает картинку. В любом случае, я его именно для этого и делал - помощь в геймдеве.

Не за что. В идеале, кмк, настройку бы добавить сглаживать или нет. Для просмотра фото, сглаживание предпочтительнее выглядит. Для работы - согласен, без сглаживания правильнее.

Loki13 ★★★★★
()
Ответ на: комментарий от kirill_rrr

а видеокарта должна была бы сделать почти мгновенно.

Видеокарте вообще все равно, где будет расположен вертекс. Так что вращения и флипы на GPU бесплатные.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от Loki13

Можно попробовать сделать шейдер, который регулирует сглаживание. Закину ее в список задач, но когда за нее возьмусь не знаю.

andreyu ★★★★★
() автор топика
Ответ на: комментарий от kirill_rrr

Я только что проверил на 12 ядерном 3900X картинку png 600dpi, 9910x7016 в пикселях. Отрисовывает секунду примерно. Когда таких картинок много и по ним надо ходить, это больно. Справедливости ради, сабж ничем не помог, скорость примерно та же что и у feh(который на CPU думаю).

Loki13 ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.