LINUX.ORG.RU
ФорумTalks

Новая версия Simple Viewer GL готова к тестированию


0

0

Сегодня ночью переделал вьювер графических форматов. Основные изменения - переход на OpenGL и отказ от проприетарной Gfl SDK в пользу открытой Imlib2.

Переход на OpenGL позволил повысить скорость и качество масштабирования, скорость скроллинга большого изображения в окне вьювера (за счет аппаратного ускорения). Так же добавил возможность скроллинга и изменения масштаба с помощью мышки. Переход на Imlib2 избавил от пропариетарщины и от поддержки более 100 графических форматов.

К сожалению Imlib2 не может загрузить тестовый JPEG созданный в GIMP - ругается на не поддерживаемый формат. Другие пріложения, основанные на Imlib2 тоже не могут загрузить этот файл. В то время как libjpeg корректно его загружает. Так что в дальнейшем для загрузки JPEG я буду опять использовать libjpeg. Тем более, что поддержка EXIF очень нужна.

Подробнее о Simple Viewer GL у меня в блоге.

Исходные коды доступны из SVN-репозитория:

svn co https://simpleviewer.svn.sourceforge.net/svnroot/simpleviewer simpleviewer

★★★★★

tuxr simpleviewer $ make
g++ -O2 -c -Wall -I/usr/include src/fileslist.cpp -o src/fileslist.o
src/fileslist.cpp: In member function ‘bool CFilesList::ParseDir()’:
src/fileslist.cpp:44: ошибка: нет декларации ‘printf’ в этой области видимости
src/fileslist.cpp: In member function ‘const char* CFilesList::GetName(int)’:
src/fileslist.cpp:122: ошибка: нет декларации ‘printf’ в этой области видимости
make: *** [src/fileslist.o] Ошибка 1

Фич-реквест: масштабирование, как в ACDSee4. Выделить прямоугольник мышкой => левый клик для масштабирования выделенного, средний клик для возврата к предыдущему масштабу.

TuxR ★★★★
()

Нет чтобы OpenCL сразу... Так-то аппаратно ускоренным просмотрщиком уже не удивишь :)

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

ps: с gcc 4.4 очень много ощибок сборки из-за отсутствия
#include stdio.h stdlib.h string.h

src/main.cpp: In function 'void ShowHelp(const char*)':
src/main.cpp:68: error: invalid conversion from 'const char*' to 'char*'



src/window.o: In function `CWindow::createTextures(int, int, bool, unsigned char*)':
window.cpp:(.text+0xdaf): undefined reference to `gluErrorString'
collect2: ld returned 1 exit status

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

> libim, freeglut3, что-то еще требуется для сборки?

Там Makefile есть, в нем все прописано и должно собираться командой make.

нужны libImlib2 (он в зависимости от требований потянет zlib, giflib, libpng, jpeg, tiff), libGL, libglut. По идее на этом все.

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

> make: *** [src/fileslist.o] Ошибка 1

Какая версия GCC?

Фич-реквест: масштабирование, как в ACDSee4. Выделить прямоугольник мышкой => левый клик для масштабирования выделенного, средний клик для возврата к предыдущему масштабу.


Выделение мышкой будет, но не для масштабирования, а для определения координат выделенной области.

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

> в принципе есть gliv (на gtkglext) зависимостей меньше
в чем фишка simpleviewer ?

Прежде, чем писать свой вьювер (а это было около 2х лет назад) я перебрал множество других. Наиболее подходящими под мои требования были feh, gliv, kview. Но у каждого из них были свои недостатки.
А gliv и вовсе плохо работал с большими имиджами. Я не уверен, что он мог загружать картинку по размеру большую, чем максимальный размер текстуры, поддерживаемый картой.

Но, немаловажной для меня фичей, которой не хватало всем вьюверм, было не умение бегать корректно по списку файлов. К примеру, есть в некой директории куча имиджей. Я запускаю вьювер так:
$ some_viewer /path_to_image_dir/some_image.jpg
После я хочу переместиться на следующую/предыдущую картинку в директории - а вот не получается. Или вьювер не умеет этого, или перебор он делает без сортировки относительно первого загруженного имиджа.
Мой же вьювер умеет это. Кроме прочего у него нет никакого интерфейса, который мне просто не нужен.

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

> Нет чтобы OpenCL сразу... Так-то аппаратно ускоренным просмотрщиком уже не удивишь :)

Так я и не удивляю, просто делюсь тем, что для меня удобно ;)

По поводу OpenCL - во вьювере негде использовать, не переписывать же мне всякие libjpeg, libpng ;)

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

> ps: картинки кажет, gif анимацию не умеет, а хотелось бы

Не умеет, увы. Более того, в отличие от предыдущей версии, не умеет мультистраничные имиджи показывать вообще :(
Прикручу libjpeg, libpng, займусь прикручиванием анимацией в gif.

andreyu ★★★★★
() автор топика

Забрал из svn'а, попробовал собрать и сразу вспомнилась одна картинка, сравнивающая установку приложений в Windows и в GNU/Linux... компиляцию с помощью Makefile, а не Code::Blocks, кто-то вообще проверял? ) Там не хватает в нескольких местах stdio.h и в main'е жалуется на const char* вместо char*

Работает вроде более менее шустро, за счет OpenGL радует скорость рендера :)

и качество масштабирования

Думается мне линейная интерполяция с помощью видеокарты мало чем отличается от программной ) А вот прикрутить bicubic и пр. режимы масштабирования, как в mplayer, было бы отлично.

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

Спасибо за то, что уделили время.

ps: с gcc 4.4 очень много ощибок сборки из-за отсутствия

#include stdio.h stdlib.h string.h



Да, что то в 4.4 снова намудрили с хидерами.

src/main.cpp: In function 'void ShowHelp(const char*)':

src/main.cpp:68: error: invalid conversion from 'const char*' to 'char*'



Странно, мой man заявляет такой прототип функции:
char *strrchr(const char *s, int c);

src/window.o: In function `CWindow::createTextures(int, int, bool, unsigned char*)':

window.cpp:(.text+0xdaf): undefined reference to `gluErrorString'


collect2: ld returned 1 exit status

Хм, как же у меня оно находится? Но на всякий случай добавлю в Makefile.

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

> Там не хватает в нескольких местах stdio.h и в main'е жалуется на const char* вместо char*

Попробую угадать - GCC-4.4.x ;)

Думается мне линейная интерполяция с помощью видеокарты мало чем отличается от программной )


По качеству может и не отличается, а вот по скорости разница ОЧЕНЬ заметна ;)

А вот прикрутить bicubic и пр. режимы масштабирования, как в mplayer, было бы отлично.


Я подумаю, но не уверен, что решусь на такое.

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

>http://rghost.ru/1313675

попробуйте это
я подправила заголовки и добавила -lGLU

Спасибо. Мог-бы и сам, но что-то совсем лень. =) Собралось, запустилось.

andreyu:

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

Согласен, в feh лично мне не хватает именно этого (ну и масштабирования)). Доделаете управление мышкой - смену изображения прокруткой и функцию «fit image to window (quick algorithm);» с увеличением, можно будет заменить feh.

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

я подправила заголовки и добавила -lGLU

Дважды подключается один и тот же хидер в window.cpp для надежности? ;)

#include "window.h"
#include "main.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#include <math.h>
#include <string.h>
#include <stdlib.h>
andreyu ★★★★★
() автор топика
Ответ на: комментарий от andreyu

Попробую угадать - GCC-4.4.x ;)

ага, он самый, с его более строгими требованиями к некоторым моментам )

По качеству может и не отличается, а вот по скорости разница ОЧЕНЬ заметна ;)

скорость это да, но фразу про качество писал явно маркетолог в душе :)

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

> Доделаете управление мышкой - смену изображения прокруткой

Колесо мыши меняет масштаб изображения.

и функцию «fit image to window (quick algorithm);» с увеличением, можно будет заменить feh.


Это есть - кнопочка 's'.

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

см выше ) мне тоже лениво, 1 раз набила все три,
а дальше только мышкой вставила в редактор, так все равно подключится только 1 раз )

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

> скорость это да, но фразу про качество писал явно маркетолог в душе :)

До этого (в версии без GL) качество было хуже ;)

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

До этого (в версии без GL) качество было хуже ;)

хммм, там использовалось масштабирование с фильтрацией аля GL_NEAREST? :)

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

> см выше ) мне тоже лениво, 1 раз набила все три,

а дальше только мышкой вставила в редактор, так все равно подключится только 1 раз )


В любом случае спасибо. Сча соберу GCC-4.4.x и проверю еще раз. Через часик залью обновление. За одно добавлю пару новых фич.

andreyu ★★★★★
() автор топика

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

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

> хммм, там использовалось масштабирование с фильтрацией аля GL_NEAREST? :)

По умолчанию да. Но была отдельная кнопочка 'b' которая масштабировала изображение с хорошим качеством. Только это было очень долго. И масштаб можно было изменять только <= 100%. Сейчас можно менять масштаб в любую сторону.

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

> На моем компе почему-то у вашей программы глюки с отрисовкой, когда изменяю размер окна.

Если вас не затруднит:
1. Опишите подробнее глюк. Скриншот будет полезен.
2. Какая видеокарта?
3. Какой драйвер и версия используются?

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

и функцию «fit image to window (quick algorithm);» с увеличением, можно будет заменить feh.

Это есть - кнопочка 's'.

Не увеличивает. То, что больше экрана уменьшает нормально.

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

> >Это есть - кнопочка 's'.

Не увеличивает. То, что больше экрана уменьшает нормально.


Верно, этот режим для того, что бы вписать большое изображение в окно. Но не наоборот. Сделано специально.

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

Увеличить можно с помощью '+' или колеса мыши.

andreyu ★★★★★
() автор топика

Вопрос к знающим, как установить class / instance / role у GLUT-приложения? Как это делать с помощью Xlib я знаю.

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

Вот скриншот: http://img265.imageshack.us/img265/9436/81465588.png

tim@tim-laptop:~/Projects/simpleviewerGL$
tim@tim-laptop:~/Projects/simpleviewerGL$ glxinfo |grep -i opengl
OpenGL vendor string: Tungsten Graphics, Inc
OpenGL renderer string: Mesa DRI Mobile Intel® GM45 Express Chipset GEM 20091221 DEVELOPMENT
OpenGL version string: 1.4 (2.1 Mesa 7.9-devel)
OpenGL extensions:
tim@tim-laptop:~/Projects/simpleviewerGL$

Среда гном, как видно, по скрину. Менеджер... компиз.

С этим:
export LIBGL_ALWAYS_SOFTWARE=1
export LIBGL_ALWAYS_INDIRECT=1
работает нормально, глюков нет.

hibou ★★★★★
()

Обновил версию в SVN:
- собирается под gcc-4.4;
- обновил Makefile;
- обновил проект c::b;
- обрабатываются параметры командной строки: -i, -c, -s, -f, -C RRGGBB commands;

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

> На моем компе почему-то у вашей программы глюки с отрисовкой, когда изменяю размер окна.

Попробуйте свежую версию.

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

многие форматы не поддерживает, зато по файлам ходит :) На OpenGL уже есть вьюверы - gliv и ksquirrel как минимум, можно было бы прикрутить к ним правильное хождение по файлам.

alex_custov ★★★★★
()

не компилится.

src/window.o: In function `CWindow::createTextures(int, int, bool, unsigned char*)':
window.cpp:(.text+0x155d): undefined reference to `CQuadImage::CQuadImage(int)'
window.cpp:(.text+0x168f): undefined reference to `CQuadImage::Update(int, unsigned char const*)'

патч >_>

Index: src/window.cpp
===================================================================
--- src/window.cpp      (revision 10)
+++ src/window.cpp      (working copy)
@@ -7,6 +7,7 @@

 #include "window.h"
 #include "main.h"
+#include "quadimage.h"

 #include <math.h>
 #include <iostream>
Index: Makefile
===================================================================
--- Makefile    (revision 10)
+++ Makefile    (working copy)
@@ -11,7 +11,8 @@
        src/imageloader.cpp \
        src/infobar.cpp \
        src/main.cpp \
-       src/window.cpp
+       src/window.cpp \
+       src/quadimage.cpp

 OBJECTS=$(SOURCES:.cpp=.o)
 EXECUTABLE=sviewgl

alex_custov ★★★★★
()
Ответ на: комментарий от andreyu
src/window.o: In function `CWindow::createTextures(int, int, bool, unsigned char*)':
window.cpp:(.text+0x139f): undefined reference to `CQuadImage::CQuadImage(int)'
window.cpp:(.text+0x14ba): undefined reference to `CQuadImage::Update(int, unsigned char const*)'
collect2: ld returned 1 exit status

Я так пониманию, что это та же проблема, которую описала Сильви? Вот неужели нельзя было исправить?!

hibou ★★★★★
()
Ответ на: комментарий от andreyu
  • Все то же самое с искажениями при изменении размеров окна. Хорошо, сделаем скидку на дурацкий интеловский драйвер и красноглазую мезу у меня.
  • На полный экран она у меня не развернулась. Точнее, сработало как распахнуть окно, а не полный экран. В исходное положение тоже не вернулась, пришлось мышкой окно изменять - что бесит! Оконный менеджер - компиз, но это не должно быть важно, потому что команды ведь стандартные.
  • При открытии файла, в имени которого используется кириллица, в заголовке окна крякозябры.
  • Нелогичное поведение - программа запускается только если передать ей файл как параметр, но при этом пролистывает изображения в директории. Уж легче звездочку передать.
  • Если указываешь звездочку, то если в той директории есть другие директории, почему-то пытается открыть одну из. Почему не сразу файл?
  • Нет drag-n-drop.
  • Комбинации клавиш можно переопределить?

    Привереда я, да. :)

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

> многие форматы не поддерживает, зато по файлам ходит :)

Всему свое время.

На OpenGL уже есть вьюверы - gliv и ksquirrel как минимум, можно было бы прикрутить к ним правильное хождение по файлам.


Кроме хождения по файлам у них есть и другие недостатки.

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

> Я так пониманию, что это та же проблема, которую описала Сильви? Вот неужели нельзя было исправить?!

Нет, другая. Makefile исправил и обновил. Добавлять хидер в src/window.cpp было не нужно - он подключен в src/window.cpp.

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

> Все то же самое с искажениями при изменении размеров окна.

Ок, поищу компьютер с такой картой.

Хорошо, сделаем скидку на дурацкий интеловский драйвер и красноглазую мезу у меня.


Не думаю, что тут виноват драйвер.

На полный экран она у меня не развернулась. Точнее, сработало как распахнуть окно, а не полный экран. В исходное положение тоже не вернулась, пришлось мышкой окно изменять - что бесит! Оконный менеджер - компиз, но это не должно быть важно, потому что команды ведь стандартные.


Угу, средствами Xlib это делается достаточно легко. С помощью GLUT что то не так. Поищу решение.

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


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

Нет drag-n-drop.


И скорее всего не будет.

Комбинации клавиш можно переопределить?


Да, это в планах.

Привереда я, да. :)


Нет, наоборот - очень полезный отчет.

andreyu ★★★★★
() автор топика

- добавил рекурсивный обход вложенных директорий (параметр -r);
- добавил отображение рамки вокруг имиджа (параметр -b или кнопка 'b');

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

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

Может, я чего-то не понимаю, но gpicview это умеет, правда там без gl

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

> Может, я чего-то не понимаю, но gpicview это умеет, правда там без gl

Действительно, умеет.
Но не умеет того, что умеет мой вьювер:

- возможность отобразить фон в виде шахматной доски (переключение по хоткею);
- рекурсивный обход вложенных директорий;
- отображение информации о файле (переключение по хоткею);
- рисовать рамку вокруг картинки (переключение по хоткею);
- быстрое скролирование большой картинки;
- быстрое масштабирование (даже когда происходит изменение размеров окна);
- наверное что то еще ;)

Пока нет, но будет:

- отображение координаты под курсоромж
- отображение цвета пикселя под курсором;
- повороты и флипы картинки;
- отображение координат и размеров выделенной области;
- отключение сглаживания при увеличении масштаба в x2, x4, x6, x8, ... раз;
- наверное что то еще будет, но TODO лист дома ;)

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

наверно, я не вхожу в целевую аудиторию) смотреть фоточки я скорее буду в gpicview (быстрый, а надежность opengl на открытых дровах ATI не очень:)

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

> наверно, я не вхожу в целевую аудиторию) смотреть фоточки я скорее буду в gpicview (быстрый, а надежность opengl на открытых дровах ATI не очень:)

Собственно говоря, изначально целевой аудиторией был лишь я да мои друзья ;)

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