View Issue Details

IDProjectCategoryView StatusLast Update
0001353SAS.ПланетаРефакторинг / Refactoringpublic10-10-2012 11:43
Reportervdemidov Assigned Tozed  
PrioritynormalSeveritymajorReproducibilityN/A
Status closedResolutionfixed 
Product Version.Nightly 
Target Version120808Fixed in Version120808 
Summary0001353: Убрать нафиг Vampyre Imaging Library
DescriptionЭто нетредсейфовое чудо-юдо меня достало.
Нужно заменить его отдельными либами типа LibJpeg и LibPng. Или возможно выковырять часть кода и сделать его тредсейфовым, хотя бы для нескольких используемых в САС.Планете форматов.
TagsNo tags attached.
Attached Files
libPNG12.zip (27,340 bytes)
PluginPNG.cpp (28,007 bytes)

Activities

zed

25-06-2012 13:11

manager   ~0007644

FreeImage: http://freeimage.sourceforge.net/ (есть API для Delphi).

vdemidov

25-06-2012 13:43

manager   ~0007647

Нужно будет посмотреть.

zed

25-06-2012 13:57

manager   ~0007649

Last edited: 25-06-2012 13:57

У неё как минимум 2 минуса:
- большой размер (~ 2,5 Мб)
- не предоставляет интерфейса для scanline методов, т.е. с изображениями работает в памяти

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

vdemidov

25-06-2012 14:03

manager   ~0007650

Может начнем с перехода на libjpeg читалку и писалку тайлов? Ты ж вроде ее уже сделал? Так включим по умолчанию. Плюс, хотя бы читалку png по-умолчанию сделаем не на вампире, а на libpng. И вот уже почти нет глобальных локов.

zed

25-06-2012 14:44

manager   ~0007651

Пробуй.

vdemidov

25-06-2012 17:44

manager   ~0007653

А что ты там наворотил кучу условной компиляции? Какую версию нужно использовать?

zed

25-06-2012 18:32

manager   ~0007659

Есть 2 версии libjpeg:
- быстрая (SSE,MMX и проч. оптимизации) jpeg62
- новая jpeg8, с lossless наворотами

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

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

vdemidov

25-06-2012 19:11

manager   ~0007661

Хорошо. А сможешь сейвер и лоадер для png сделать?

zed

26-06-2012 04:37

manager   ~0007664

Нет, пока что я за это не возьмусь.

vdemidov

26-06-2012 07:32

manager   ~0007667

>Нет, пока что я за это не возьмусь.
Плохо. Ты хотя бы уже разбирался с LibPng, а я туда ни разу не заглядывал.
А может все таки? Хотя бы запись в RGB и RGBA?

zed

26-06-2012 10:14

manager   ~0007681

Моё разбирательство с png ограничивается прочтением пары нагугленых статеек - этого хватило, чтобы кое-как написать склейку, но до полной поддержки формата там как до Луны. С jpeg было проще, в плане того, что там нет прозрачности и различных режимов глубины цвета. Хотя я и там не дам 100% гарантии, что оно откроет любой jpeg без ошибок.

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

Сейчас приаттачу недоделки (там, кстати, и примеры работы с libpng на Delphi имеются).

zed

26-06-2012 10:19

manager   ~0007682

Вдогонку приложил и PluginPNG.cpp - код из FreeImage, отвечающий за чтение/запись png. В принципе, достаточно просто транслировать на делфи (выкинув/заменив зависимости самого FreeImage).

vdemidov

03-07-2012 05:32

manager   ~0007750

Еще нужно посмотреть http://sourceforge.net/projects/gr32pnglibrary/

zed

16-07-2012 16:35

manager   ~0007802

Удалось уменьшить FreeImage.dll до 340Кб без потери функциональности. При этом, используются dll-ки libjpeg и libpng и доступны форматы: BMP, GIF, PNG, JPEG (можно ещё добавить ICO - вроде где-то просили его, чтобы можно было иконки карт из favicon.ico делать).

Завтра попробую прикрутить его к САСу и вытравить вампира (если он там больше нигде не используется).

vdemidov

16-07-2012 16:54

manager   ~0007803

Last edited: 16-07-2012 16:57

Отлично. Больше нигде не используется. И добавь таки ico. Для иконок карт сгодиться точно, и может еще где. Только проверь что бы оно с прозрачностью нормально работало.
PS: А в многопоточном режиме оно точно нормально работает? Не будет проблем как с вампиром?

zed

16-07-2012 17:01

manager   ~0007804

Пишут что да:
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).

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

zed

16-07-2012 19:01

manager   ~0007805

Облом: 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 в самой либе (изменения касались только кода САС).

vdemidov

17-07-2012 03:48

manager   ~0007806

А зачем ты вообще трогал Jpeg? Он с libjpeg прекрасно работает и скорость процентов на 50 выше чем у вампира на моем компе. Разницу в скорости png можно пережить, а гиф очень редко используется. Так что сойдет. И еще можешь добавить выбор библиотеки чтения-записи для каждого формата из конфига, а там разберемся.

zed

17-07-2012 07:42

manager   ~0007807

>А зачем ты вообще трогал Jpeg?
За компанию, чтобы посмотреть на него. Типа: "а вдруг там быстрее?".

>чтения-записи для каждого формата из конфига
Условную компиляцию или в ран-тайме? Там эта либа статически линкуется, и если нужно в ран-тайме определять какой формат юзать, то придётся ещё сильно ковырять и паскалевский враппер FreeImage.

vdemidov

17-07-2012 08:18

manager   ~0007808

Естественно в рантайме. Мне очень сильно не нравится условная компиляция она себя оправдывает, только в очень редких случаях.

zed

17-07-2012 08:55

manager   ~0007809

Если сейчас делать подключение FreeImage в рантайме, то мне придётся шаманить с условной компиляцией в FreeImage.pas, чтобы сделать выбор: подгружать либу динамически или в статике.

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

vdemidov

17-07-2012 09:16

manager   ~0007810

>Угу, а ты загляни в исходники libjpeg или libpng того же, там этих ifdef-ов столько, что волосы дыбом встают :)
Сам говоришь, что волосы дыбом встают. И потом это библиотеки, а не пользовательская программа, которой яыляется САС.Планета.

Но в общем мне без разницы.

zed

17-07-2012 09:57

manager   ~0007811

Пока суть да дело, может давай у вампира отключим jpeg и удалим его поддержку из САСа (ну, или в ifdef спрятать, на всякий пожарный). Размер exe-хи уменьшится.

vdemidov

17-07-2012 10:05

manager   ~0007812

Не вопрос отключай. Хотя размер exe меня в последнюю очередь волнует.

zed

17-07-2012 16:18

manager   ~0007814

Включил FreeImage. Либу (вместе с зависимостями) залил в релизный репо.
Завтрашняя ночнушка будет статически слинкована с этой либой.

Issue History

Date Modified Username Field Change
25-06-2012 12:49 vdemidov New Issue
25-06-2012 12:49 vdemidov Status new => confirmed
25-06-2012 12:49 vdemidov Severity minor => major
25-06-2012 12:49 vdemidov Reproducibility have not tried => N/A
25-06-2012 12:49 vdemidov Product Version => .Nightly
25-06-2012 12:49 vdemidov Target Version => 120808
25-06-2012 13:11 zed Note Added: 0007644
25-06-2012 13:43 vdemidov Note Added: 0007647
25-06-2012 13:57 zed Note Added: 0007649
25-06-2012 13:57 zed Note Edited: 0007649
25-06-2012 14:03 vdemidov Note Added: 0007650
25-06-2012 14:44 zed Note Added: 0007651
25-06-2012 17:44 vdemidov Note Added: 0007653
25-06-2012 18:32 zed Note Added: 0007659
25-06-2012 19:11 vdemidov Note Added: 0007661
26-06-2012 04:37 zed Note Added: 0007664
26-06-2012 07:32 vdemidov Note Added: 0007667
26-06-2012 10:14 zed Note Added: 0007681
26-06-2012 10:15 zed File Added: libPNG12.zip
26-06-2012 10:15 zed File Added: LibPng15_not_finished.zip
26-06-2012 10:15 zed File Added: PluginPNG.cpp
26-06-2012 10:19 zed Note Added: 0007682
03-07-2012 05:32 vdemidov Note Added: 0007750
16-07-2012 16:35 zed Note Added: 0007802
16-07-2012 16:54 vdemidov Note Added: 0007803
16-07-2012 16:57 vdemidov Note Edited: 0007803
16-07-2012 17:01 zed Note Added: 0007804
16-07-2012 19:01 zed Note Added: 0007805
17-07-2012 03:48 vdemidov Note Added: 0007806
17-07-2012 07:42 zed Note Added: 0007807
17-07-2012 08:18 vdemidov Note Added: 0007808
17-07-2012 08:55 zed Note Added: 0007809
17-07-2012 09:16 vdemidov Note Added: 0007810
17-07-2012 09:57 zed Note Added: 0007811
17-07-2012 10:05 vdemidov Note Added: 0007812
17-07-2012 16:18 zed Note Added: 0007814
25-07-2012 19:29 zed Status confirmed => resolved
25-07-2012 19:29 zed Fixed in Version => 120808
25-07-2012 19:29 zed Resolution open => fixed
25-07-2012 19:29 zed Assigned To => zed
10-10-2012 11:43 Tolik Status resolved => closed
08-08-2025 13:25 zed Category Рефакторинг => Рефакторинг / Refactoring