SASGIS - SAS.Планета
View Issue Details
0001353SAS.ПланетаРефакторингpublic25-06-2012 12:4910-10-2012 11:43
vdemidov 
zed 
normalmajorN/A
closedfixed 
.Nightly 
120808120808 
0001353: Убрать нафиг Vampyre Imaging Library
Это нетредсейфовое чудо-юдо меня достало.
Нужно заменить его отдельными либами типа LibJpeg и LibPng. Или возможно выковырять часть кода и сделать его тредсейфовым, хотя бы для нескольких используемых в САС.Планете форматов.
No tags attached.
zip libPNG12.zip (27,340) 26-06-2012 10:15
http://www.sasgis.org/mantis/file_download.php?file_id=861&type=bug
zip LibPng15_not_finished.zip (69,050) 26-06-2012 10:15
http://www.sasgis.org/mantis/file_download.php?file_id=862&type=bug
cpp PluginPNG.cpp (28,007) 26-06-2012 10:15
http://www.sasgis.org/mantis/file_download.php?file_id=863&type=bug
Issue History
25-06-2012 12:49vdemidovNew Issue
25-06-2012 12:49vdemidovStatusnew => confirmed
25-06-2012 12:49vdemidovSeverityminor => major
25-06-2012 12:49vdemidovReproducibilityhave not tried => N/A
25-06-2012 12:49vdemidovProduct Version => .Nightly
25-06-2012 12:49vdemidovTarget Version => 120808
25-06-2012 13:11zedNote Added: 0007644
25-06-2012 13:43vdemidovNote Added: 0007647
25-06-2012 13:57zedNote Added: 0007649
25-06-2012 13:57zedNote Edited: 0007649bug_revision_view_page.php?bugnote_id=7649#r3744
25-06-2012 14:03vdemidovNote Added: 0007650
25-06-2012 14:44zedNote Added: 0007651
25-06-2012 17:44vdemidovNote Added: 0007653
25-06-2012 18:32zedNote Added: 0007659
25-06-2012 19:11vdemidovNote Added: 0007661
26-06-2012 04:37zedNote Added: 0007664
26-06-2012 07:32vdemidovNote Added: 0007667
26-06-2012 10:14zedNote Added: 0007681
26-06-2012 10:15zedFile Added: libPNG12.zip
26-06-2012 10:15zedFile Added: LibPng15_not_finished.zip
26-06-2012 10:15zedFile Added: PluginPNG.cpp
26-06-2012 10:19zedNote Added: 0007682
03-07-2012 05:32vdemidovNote Added: 0007750
16-07-2012 16:35zedNote Added: 0007802
16-07-2012 16:54vdemidovNote Added: 0007803
16-07-2012 16:57vdemidovNote Edited: 0007803bug_revision_view_page.php?bugnote_id=7803#r3785
16-07-2012 17:01zedNote Added: 0007804
16-07-2012 19:01zedNote Added: 0007805
17-07-2012 03:48vdemidovNote Added: 0007806
17-07-2012 07:42zedNote Added: 0007807
17-07-2012 08:18vdemidovNote Added: 0007808
17-07-2012 08:55zedNote Added: 0007809
17-07-2012 09:16vdemidovNote Added: 0007810
17-07-2012 09:57zedNote Added: 0007811
17-07-2012 10:05vdemidovNote Added: 0007812
17-07-2012 16:18zedNote Added: 0007814
25-07-2012 19:29zedStatusconfirmed => resolved
25-07-2012 19:29zedFixed in Version => 120808
25-07-2012 19:29zedResolutionopen => fixed
25-07-2012 19:29zedAssigned To => zed
10-10-2012 11:43TolikStatusresolved => closed

Notes
(0007644)
zed   
25-06-2012 13:11   
FreeImage: http://freeimage.sourceforge.net/ (есть API для Delphi).
(0007647)
vdemidov   
25-06-2012 13:43   
Нужно будет посмотреть.
(0007649)
zed   
25-06-2012 13:57   
У неё как минимум 2 минуса:
- большой размер (~ 2,5 Мб)
- не предоставляет интерфейса для scanline методов, т.е. с изображениями работает в памяти

Если сильно захотеть, то можно отключить ненужные форматы и уменьшить тем самым размер либы, и можно добавить экспорт оригинальных функций из libjpeg, libpng и др. для которых доступны scanline методы. Но это надо ковырять оригинал.

(0007650)
vdemidov   
25-06-2012 14:03   
Может начнем с перехода на libjpeg читалку и писалку тайлов? Ты ж вроде ее уже сделал? Так включим по умолчанию. Плюс, хотя бы читалку png по-умолчанию сделаем не на вампире, а на libpng. И вот уже почти нет глобальных локов.
(0007651)
zed   
25-06-2012 14:44   
Пробуй.
(0007653)
vdemidov   
25-06-2012 17:44   
А что ты там наворотил кучу условной компиляции? Какую версию нужно использовать?
(0007659)
zed   
25-06-2012 18:32   
Есть 2 версии libjpeg:
- быстрая (SSE,MMX и проч. оптимизации) jpeg62
- новая jpeg8, с lossless наворотами

В САСе включена быстрая. Если/когда буду делать lossless jpeg надо будет либо включать обе версии, либо оставлять только новую.

В условной компиляции ещё можно выбрать статическую, либо динамическую линковку. Сейчас включена динамическая.
(0007661)
vdemidov   
25-06-2012 19:11   
Хорошо. А сможешь сейвер и лоадер для png сделать?
(0007664)
zed   
26-06-2012 04:37   
Нет, пока что я за это не возьмусь.
(0007667)
vdemidov   
26-06-2012 07:32   
>Нет, пока что я за это не возьмусь.
Плохо. Ты хотя бы уже разбирался с LibPng, а я туда ни разу не заглядывал.
А может все таки? Хотя бы запись в RGB и RGBA?
(0007681)
zed   
26-06-2012 10:14   
Моё разбирательство с png ограничивается прочтением пары нагугленых статеек - этого хватило, чтобы кое-как написать склейку, но до полной поддержки формата там как до Луны. С jpeg было проще, в плане того, что там нет прозрачности и различных режимов глубины цвета. Хотя я и там не дам 100% гарантии, что оно откроет любой jpeg без ошибок.

К тому же, у png нет актуального заголовочника. Есть только для libpng12. Я было начал актуализировать его, но где-то на сотой функции (из ~ 250) таки выдохся и оставил это дело до лучших времён.

Сейчас приаттачу недоделки (там, кстати, и примеры работы с libpng на Delphi имеются).
(0007682)
zed   
26-06-2012 10:19   
Вдогонку приложил и PluginPNG.cpp - код из FreeImage, отвечающий за чтение/запись png. В принципе, достаточно просто транслировать на делфи (выкинув/заменив зависимости самого FreeImage).
(0007750)
vdemidov   
03-07-2012 05:32   
Еще нужно посмотреть http://sourceforge.net/projects/gr32pnglibrary/
(0007802)
zed   
16-07-2012 16:35   
Удалось уменьшить FreeImage.dll до 340Кб без потери функциональности. При этом, используются dll-ки libjpeg и libpng и доступны форматы: BMP, GIF, PNG, JPEG (можно ещё добавить ICO - вроде где-то просили его, чтобы можно было иконки карт из favicon.ico делать).

Завтра попробую прикрутить его к САСу и вытравить вампира (если он там больше нигде не используется).
(0007803)
vdemidov   
16-07-2012 16:54   
(edited on: 16-07-2012 16:57)
Отлично. Больше нигде не используется. И добавь таки ico. Для иконок карт сгодиться точно, и может еще где. Только проверь что бы оно с прозрачностью нормально работало.
PS: А в многопоточном режиме оно точно нормально работает? Не будет проблем как с вампиром?

(0007804)
zed   
16-07-2012 17:01   
Пишут что да:
FreeImage is easy to use, fast, multithreading safe, compatible with all 32-bit or 64-bit versions of Windows, and cross-platform (works both with Linux and Mac OS X).

Код выглядит довольно стройно, либа живёт уже не первый год и много кем используется. Как оно окажется на самом деле - увидим.
(0007805)
zed   
16-07-2012 19:01   
Облом: FreeImage тормознутее, чем текущая реализация вампира с глобальным локом.

Чтение тайлов (вампир + libjpeg)/FreeImage:
jpg: 0.0013/0.0030;
png: 0.0008/0.0013;
gif: 0.0013/0.0082(!)

Так что, думаю не стоит с ним связываться. А ещё называется "fast"...

Но есть и положительный момент - ковырялся с libjpeg-turbo и оптимизировал открытие жпегов до скорости, сравнимой с png (0.0008), за счёт использования цветового пространства BGRA в самой либе (изменения касались только кода САС).
(0007806)
vdemidov   
17-07-2012 03:48   
А зачем ты вообще трогал Jpeg? Он с libjpeg прекрасно работает и скорость процентов на 50 выше чем у вампира на моем компе. Разницу в скорости png можно пережить, а гиф очень редко используется. Так что сойдет. И еще можешь добавить выбор библиотеки чтения-записи для каждого формата из конфига, а там разберемся.
(0007807)
zed   
17-07-2012 07:42   
>А зачем ты вообще трогал Jpeg?
За компанию, чтобы посмотреть на него. Типа: "а вдруг там быстрее?".

>чтения-записи для каждого формата из конфига
Условную компиляцию или в ран-тайме? Там эта либа статически линкуется, и если нужно в ран-тайме определять какой формат юзать, то придётся ещё сильно ковырять и паскалевский враппер FreeImage.
(0007808)
vdemidov   
17-07-2012 08:18   
Естественно в рантайме. Мне очень сильно не нравится условная компиляция она себя оправдывает, только в очень редких случаях.
(0007809)
zed   
17-07-2012 08:55   
Если сейчас делать подключение FreeImage в рантайме, то мне придётся шаманить с условной компиляцией в FreeImage.pas, чтобы сделать выбор: подгружать либу динамически или в статике.

>она себя оправдывает, только в очень редких случаях
Угу, а ты загляни в исходники libjpeg или libpng того же, там этих ifdef-ов столько, что волосы дыбом встают :)
Ни одна, уважающая себя библиотека, не обходится без условной компиляции.
(0007810)
vdemidov   
17-07-2012 09:16   
>Угу, а ты загляни в исходники libjpeg или libpng того же, там этих ifdef-ов столько, что волосы дыбом встают :)
Сам говоришь, что волосы дыбом встают. И потом это библиотеки, а не пользовательская программа, которой яыляется САС.Планета.

Но в общем мне без разницы.
(0007811)
zed   
17-07-2012 09:57   
Пока суть да дело, может давай у вампира отключим jpeg и удалим его поддержку из САСа (ну, или в ifdef спрятать, на всякий пожарный). Размер exe-хи уменьшится.
(0007812)
vdemidov   
17-07-2012 10:05   
Не вопрос отключай. Хотя размер exe меня в последнюю очередь волнует.
(0007814)
zed   
17-07-2012 16:18   
Включил FreeImage. Либу (вместе с зависимостями) залил в релизный репо.
Завтрашняя ночнушка будет статически слинкована с этой либой.