LINUX.ORG.RU
ФорумTalks

Simple Viewer GL v3.1.0 — просмотрщик изображений

 , ,


2

1

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

Краткое описание

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

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

PNG, JPEG, JPEG 2000, PSD, AI, EPS, XCF (GIMP image format), GIF, SVG, TIFF, TARGA, ICO, ICNS (Apple Icon Image), BMP, PNM, DDS, XWD, SCR (ZX-Spectrum screen), XPM, WebP, OpenEXR.

Работает в GNU/Linux, FreeBSD и macOS.

Новое в 3.1.0

  • Добавлена поддержка формата SVG.
  • Переработана поддержка XCF (GIMP image format).
  • Исправлена ошибка загрузки DDS/DXT5.
  • Фиксы связанные с WebP и LCMS2.
  • Улучшено определение формата JPEG.
  • Улучшена обработка ошибок TIFF.
  • Исправлены ошибки, найденные участниками данной ветки.

Где взять?

Проект Simple Viewer GL доступен на BitBucket.

Как я использую вьювер

  1. Жму enter в midnight commander на заинтересовавшем меня файле. С помощью мышки выбираю нужную мне область изображения, что бы определить ее характеристики (позиция/разме спрайта в атласе, определения origin/hotspot спрайта, определение цвета пикселя).

  2. В консоли sviewgl . -r для рекурсивного просмотра всех изображений в директории. Иногда использую параметр -a для определения формата по содержимому файла.

  3. Помечаю с помощью кнопки del файлы для удаления. После чего жму ctrl+del и помеченный файлы удаляются.

★★★★★

Последнее исправление: andreyu (всего исправлений: 2)

Ответ на: комментарий от imul

Посмотри почту.

Спасибо, письмо поймал. Отвечу чуть позже.

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

Параметр был переименован в full_screen = true

Да, уже нашёл. Надо бы в примере config-файла поправить.

Это баг. Но у меня не воспроизводится. Крешдамп создается?

У меня тоже перестал воспроизводиться, не знаю, что я сделал. Будем считать, что показалось :)

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

Ещё сразу фичу запрошу: сделать, чтобы по home/end переходило на первую/последнюю картинки.

PgUp / PgDn предназначены для переключения страниц в многостраничном файле (tiff, gif).

А HOME/END разве используются при просмотре многостраничных файлов?

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

А HOME/END разве используются при просмотре многостраничных файлов?

Упс, неправильно прочел ваше сообщение. Home/End не используются, значит можно реализовать их поддержку для перехода к первому/последнему файлу в списке.

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

Это баг. Но у меня не воспроизводится. Крешдамп создается?

У меня воспроизводится, backtrace снял:

$ gdb --args sviewgl . -f            
GNU gdb (GDB) 8.2.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from sviewgl...done.
(gdb) r
Starting program: /usr/bin/sviewgl . -f
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
[New Thread 0x7ffff5807700 (LWP 20883)]
[New Thread 0x7fffef55a700 (LWP 20884)]
[Thread 0x7ffff5807700 (LWP 20883) exited]
[New Thread 0x7ffff5807700 (LWP 20885)]
[Thread 0x7ffff5807700 (LWP 20885) exited]
[New Thread 0x7ffff5807700 (LWP 20886)]
[Thread 0x7ffff5807700 (LWP 20886) exited]
[New Thread 0x7ffff5807700 (LWP 20887)]
[Thread 0x7ffff5807700 (LWP 20887) exited]
[New Thread 0x7ffff5807700 (LWP 20888)]
[Thread 0x7ffff5807700 (LWP 20888) exited]
[New Thread 0x7ffff5807700 (LWP 20889)]
[Thread 0x7ffff5807700 (LWP 20889) exited]
[New Thread 0x7ffff5807700 (LWP 20890)]
[Thread 0x7ffff5807700 (LWP 20890) exited]
[New Thread 0x7ffff5807700 (LWP 20891)]
[Thread 0x7ffff5807700 (LWP 20891) exited]
[New Thread 0x7ffff5807700 (LWP 20892)]
[Thread 0x7ffff5807700 (LWP 20892) exited]
[New Thread 0x7ffff5807700 (LWP 20893)]
[Thread 0x7ffff5807700 (LWP 20893) exited]
[New Thread 0x7ffff5807700 (LWP 20894)]
[Thread 0x7ffff5807700 (LWP 20894) exited]
[New Thread 0x7ffff5807700 (LWP 20895)]
[Thread 0x7ffff5807700 (LWP 20895) exited]
[New Thread 0x7ffff5807700 (LWP 20896)]
[Thread 0x7ffff5807700 (LWP 20896) exited]
[New Thread 0x7ffff5807700 (LWP 20897)]
[Thread 0x7ffff5807700 (LWP 20897) exited]
[New Thread 0x7ffff5807700 (LWP 20898)]
[Thread 0x7ffff5807700 (LWP 20898) exited]
[New Thread 0x7ffff5807700 (LWP 20899)]
[Thread 0x7ffff5807700 (LWP 20899) exited]
[New Thread 0x7ffff5807700 (LWP 20900)]
[Thread 0x7ffff5807700 (LWP 20900) exited]
[New Thread 0x7ffff5807700 (LWP 20901)]
[Thread 0x7ffff5807700 (LWP 20901) exited]
[New Thread 0x7ffff5807700 (LWP 20903)]
[Thread 0x7ffff5807700 (LWP 20903) exited]
[New Thread 0x7ffff5807700 (LWP 20904)]
[Thread 0x7ffff5807700 (LWP 20904) exited]
[New Thread 0x7ffff5807700 (LWP 20905)]
[Thread 0x7ffff5807700 (LWP 20905) exited]
(EE) GLFW error (65540) 'Invalid window size 0x0'
sviewgl: /build/glfw/src/glfw-3.3/src/window.c:529: glfwSetWindowPos: Assertion `window != NULL' failed.

Thread 1 "sviewgl" received signal SIGABRT, Aborted.
0x00007ffff631f82f in raise () from /usr/lib/libc.so.6
(gdb) bt
#0  0x00007ffff631f82f in raise () from /usr/lib/libc.so.6
#1  0x00007ffff630a672 in abort () from /usr/lib/libc.so.6
#2  0x00007ffff630a548 in __assert_fail_base.cold.0 () from /usr/lib/libc.so.6
#3  0x00007ffff6317db6 in __assert_fail () from /usr/lib/libc.so.6
#4  0x00007ffff7c15830 in glfwSetWindowPos () from /usr/lib/libglfw.so.3
#5  0x0000555555605f24 in (anonymous namespace)::createWindowedWindow (width=0, height=0, parent=0x5555557b9ac0, config=...) at /home/exl/Downloads/simple-viewer-gl/src/main.cpp:183
#6  0x00005555556069bf in main (argc=3, argv=0x7fffffffe0d8) at /home/exl/Downloads/simple-viewer-gl/src/main.cpp:402
(gdb) quit
A debugging session is active.

        Inferior 1 [process 20879] will be killed.

Quit anyway? (y or n) y
EXL ★★★★★
()
Ответ на: комментарий от EXL

У меня воспроизводится, backtrace снял:

Супер, попробую пофиксить.

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

EXL и Beewek, пофиксил переключение режима. Судя по логу, проблема была в размере окна в конфиге.

Обновка в ветке development. Проверьте у себя, если все хорошо, то залью в master.

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

Теперь такое при нажатии на Enter:

$ sviewgl . -f
X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  12 (X_ConfigureWindow)
  Value in failed request:  0x0
  Serial number of failed request:  1695
  Current serial number in output stream:  1697
EXL ★★★★★
()

Фон заливки по клавише [c] меняется как-нибудь? А то 0x0000FF сильно уж выедает глаза. Я бы взял какой-нибудь нейтральный вроде 0x0E0E0E.

Нашёл в конфиге. P.S. «checkboard» => «checkerboard»

И ещё такая неприятность имеется: в начале запуска, когда создаётся окно, на непродолжительное время в нём виден контекст другого окна/мусор/чёрный экран:

http://esxi.z-lab.me:666/~exl_lab/movies/sviewgl_test2.gif

Может быть туда Splash Screen какой-нибудь воткнуть, типа «Loading…»?

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

Нашёл в конфиге. P.S. «checkboard» => «checkerboard»

Откуда это? Параметр называется hide_checkboard а цвет однотонного фона задается с помощью background_{r,g,b}.

Может быть туда Splash Screen какой-нибудь воткнуть, типа «Loading…»?

Раньше он был. Уже не помню причину, по которой от него избавился. А косяк при старте вьювера нужно будет пофиксить. Похоже, что в это время виден «грязный» фреймбуфер.

Попробуйте добавить в src/main.cpp:382 (сразу после создания окна) этот код:

viewer.onRender();
andreyu ★★★★★
() автор топика
Ответ на: комментарий от EXL

Теперь такое при нажатии на Enter:

Есть ли в текущей директории картинки, загрузилось ли до нажатия enter что-либо?

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

Откуда это? Параметр называется hide_checkboard а цвет однотонного фона задается с помощью background_{r,g,b}.

Ну да, с этим я разобрался.

https://bitbucket.org/andreyu/simple-viewer-gl/src/8d1fe391cccc0d18fe15f2c449e2556f1af8f045/config.example#lines-48

Попробуйте добавить в src/main.cpp:382 (сразу после создания окна) этот код:

После этого падает с:

sviewgl: /build/glfw/src/glfw-3.3/src/window.c:542: glfwGetWindowSize: Assertion `window != NULL' failed.
EXL ★★★★★
()
Ответ на: комментарий от andreyu

Есть ли в текущей директории картинки, загрузилось ли до нажатия enter что-либо?

Да, всё загрузилось и нормально. Нажимаю Enter – окно ресайзится в 640x480, перестраивается примерно в 0,0 по x,y и дальше крашится с этой иксовой ошибкой. Возможно баг где-то в GLFW.

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

После этого падает с:

Точняк, нужно добавлять в строку 387, до начала цикла while (!glfwWindowShouldClose(window)).

andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu
$ git diff src/main.cpp
diff --git a/src/main.cpp b/src/main.cpp
index a7e8890..6438ce5 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -382,8 +382,10 @@ int main(int argc, char* argv[])
 
         if (window != nullptr)
         {
+//            viewer.onRender();
             setup(window);
             viewer.setWindow(window);
+            viewer.onRender();
 
             bool updateSizePos = false;
 

Нет, всё так же мусор/чёрный экран при запуске.

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

Нажимаю Enter – окно ресайзится в 640x480, перестраивается примерно в 0,0 по x,y и дальше крашится с этой иксовой ошибкой. Возможно баг где-то в GLFW.

P.S. Я как-то сталкивался с подобным странным багом, но не в Linux, а в Haiku. Там в одной игре тоже вместо ресайза окна и контекста, окно убивалось и создавалась заново и тамошний порт SDL2-библиотеки приходил от такого поведения в ужас. Пришлось делать так, чтобы было всегда лишь одно окно, у которого периодически менялись параметры вроде fullscreen (без изменения режима), width, height и пр.

Возможно здесь похожая ситуация на GLFW.

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

Там делается очистка фреймбуфера, но потом в него рендерится загружаемая картинка. Позже посмотрю, почему там мусор. Видимо придется переписать логику отрисовки.

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

Возможно здесь похожая ситуация на GLFW.

Я использую shared opengl context. А какая версия glfw используется?

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

Залил поддержку HOME / END в ветку development.

О, класс! Я не ожидал такой быстрой реакции, запилил сам :) Получилось почти один-в-один:)

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

Могу ещё потестить на Wayland (glfw-wayland), но позже. Нужно?

Если не сложно. Интересно узнать, будет ли вьювер вообще работать.

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

О, класс! Я не ожидал такой быстрой реакции, запилил сам :) Получилось почти один-в-один:)

Ну да, там простая реализация.

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

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

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

Version : 3.3-2

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

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

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

Увы, фикс только частичный - предотвращение создания окна размером 0х0. Но у EXL этот фикс проблему не решил.

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

Конечно, можно.

https://yadi.sk/d/xDeiFmSa3A9m6u

Создан в Inkscape, пока что единственный способ его нормально открыть в отличной от inkscape программе, это проект от RazrFalcon или Firefox/GoogleChrome

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

Конечно, можно.

Спасибо.

Создан в Inkscape, пока что единственный способ его нормально открыть в отличной от inkscape программе, это проект от RazrFalcon или Firefox/GoogleChrome

Значит буду ждать, когда RazrFalcon избавится от лишних зависимостей и когда его пакет появится в macbrew и разных линукс-дистрибутивах.

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

Там ещё одна проблема - любая svg картинка, которая у меня есть растягивается в ширину, например, эта https://yadi.sk/d/yiHcAZKyr2ZQ7Q. Но у меня 4k монитор и dpi отличное от дефолтного, может в этом где-то проблема. При этом, условный eog нормально её отображает.

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

Там ещё одна проблема - любая svg картинка, которая у меня есть растягивается в ширину, например, эта https://yadi.sk/d/yiHcAZKyr2ZQ7Q.

У меня на версии из ветки development отрендерилось так: https://imgur.com/tpDSrrZ

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

Интересно узнать, будет ли вьювер вообще работать.

Да, оно работает на Wayland, Fedora 29. Только заголовка окна нет у программы, как и у всех нативных Wayland-приложений. Но это гномовцы должны фиксить через поддержку SSD (Server-Side Decorations).

А так всё точно так же, как и с X.Org-версией:

  1. При запуске похоже всегда чёрный экран сначала (на X.Org был иногда мусор или контекст другого окна) а потом уже рендерится картинка.

  2. В версии без фикса на полноэкранном режиме после нажатия на Enter – падение.

  3. В development-версии с фиксом при нажатии на Enter очень странный баг, но падений нету. Странный баг такой: после нажатия на Enter и переключения в оконный режим окно полностью пропадает и остаётся только картинка. Как будто это FRAMELESS окно. Если у этой картинки пропадает фокус, то появляется окно, контекст которого полностью окрашивается в чёрный, а когда фокус появляется – снова рендерится всё как надо. Повторное пропадание фокуса уже ничего не меняет. Такое ощущение что рендеринг куда-то не туда идёт, когда окно пересоздаётся подобным образом.

P.S. Зато та GIF’ка которую я скинул заработала. Похоже это проблема в giflib, который на Fedora 29 без этого бага.

$ rpm -qi giflib-devel
Name        : giflib-devel
Version     : 5.1.4
Release     : 2.fc29
EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 3)
Ответ на: комментарий от EXL

А так всё точно так же, как и с X.Org-версией:

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

P.S. Зато та GIF’ка которую я скинул заработала

А вот это странно, т.к. gif2rgb из комплекта giflib 5.1.4 не может ее загрузить и сообщает о такой же ошибке. Пробовал собирать gif2rgb из giflib 5.2.0 - аналогичная ошибка.

Потом по кишкам giflib пройдусь и посмотрю, где проблема.

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

CMYK в JPG и редко TIFF.

Для CMYK в JPEG делаю так:

const bool isCMYK = cinfo.jpeg_color_space == JCS_CMYK || cinfo.jpeg_color_space == JCS_YCCK;
if (isCMYK == false)
{
     cinfo.out_color_space = JCS_RGB; // convert to RGB
}

Для TIFF полагаюсь на дефолтное поведение библиотеки.

Кроме того, для обоих форматов есть поддержка embedded ICC-профилей.

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

А у меня так.

Печально.

Добавьте этот код в src/formats/formatsvg.cpp:86 (после строки const auto scale = std::min(sw, sh);):

::printf("Config SVG size: %.1f x %.1f\n", mw, mh);
::printf("Image size: %.1f x %.1f\n", image->width, image->width);
::printf("Calculated scale: %.1f x %.1f\n", sw, sh);
::printf("Selected scale: %.1f\n", scale);

Интересен выхлоп после загрузки этого svg.

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

Магия, не иначе.

Да, что-то странное. А сделайте скриншот с включенным бордюром - хоткей «b».

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

Где-то масштабирование не происходит.

Или NanoSVG косячит, или я не умею его готовить. Такой косяк только с этим SVG или с любым?

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

Согласен. Доработал scrot. Теперь у моего есть опция

Хорошее решение. Доработка ушла в мейнстрим?

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

Только с этим. Ну и его аналогами, обработанными точно так же. Так что при желании можно поковырять и найти что именно мешает нормальному отображению.

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

Только с этим. Ну и его аналогами, обработанными точно так же.

А что за особенная обработка, что она меняет относительно «необработанного» файла?

Залил обновку в ветку development. Если будет время, проверьте правильно ли рендерит этот файл новый билд.

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

Доработка ушла в мейнстрим?

Пока нет, но надо заняться.

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

Работает.

Спасибо, значит мой косяк был.

andreyu ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.