Notes |
|
(0007644)
|
zed
|
25-06-2012 13:11
|
|
FreeImage: http://freeimage.sourceforge.net/ (есть API для Delphi). |
|
|
|
|
|
(0007649)
|
zed
|
25-06-2012 13:57
|
|
У неё как минимум 2 минуса:
- большой размер (~ 2,5 Мб)
- не предоставляет интерфейса для scanline методов, т.е. с изображениями работает в памяти
Если сильно захотеть, то можно отключить ненужные форматы и уменьшить тем самым размер либы, и можно добавить экспорт оригинальных функций из libjpeg, libpng и др. для которых доступны scanline методы. Но это надо ковырять оригинал.
|
|
|
|
Может начнем с перехода на libjpeg читалку и писалку тайлов? Ты ж вроде ее уже сделал? Так включим по умолчанию. Плюс, хотя бы читалку png по-умолчанию сделаем не на вампире, а на libpng. И вот уже почти нет глобальных локов. |
|
|
(0007651)
|
zed
|
25-06-2012 14:44
|
|
|
|
|
А что ты там наворотил кучу условной компиляции? Какую версию нужно использовать? |
|
|
(0007659)
|
zed
|
25-06-2012 18:32
|
|
Есть 2 версии libjpeg:
- быстрая (SSE,MMX и проч. оптимизации) jpeg62
- новая jpeg8, с lossless наворотами
В САСе включена быстрая. Если/когда буду делать lossless jpeg надо будет либо включать обе версии, либо оставлять только новую.
В условной компиляции ещё можно выбрать статическую, либо динамическую линковку. Сейчас включена динамическая. |
|
|
|
Хорошо. А сможешь сейвер и лоадер для png сделать? |
|
|
(0007664)
|
zed
|
26-06-2012 04:37
|
|
Нет, пока что я за это не возьмусь. |
|
|
|
>Нет, пока что я за это не возьмусь.
Плохо. Ты хотя бы уже разбирался с 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). |
|
|
|
Еще нужно посмотреть 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 в самой либе (изменения касались только кода САС). |
|
|
|
А зачем ты вообще трогал Jpeg? Он с libjpeg прекрасно работает и скорость процентов на 50 выше чем у вампира на моем компе. Разницу в скорости png можно пережить, а гиф очень редко используется. Так что сойдет. И еще можешь добавить выбор библиотеки чтения-записи для каждого формата из конфига, а там разберемся. |
|
|
(0007807)
|
zed
|
17-07-2012 07:42
|
|
>А зачем ты вообще трогал Jpeg?
За компанию, чтобы посмотреть на него. Типа: "а вдруг там быстрее?".
>чтения-записи для каждого формата из конфига
Условную компиляцию или в ран-тайме? Там эта либа статически линкуется, и если нужно в ран-тайме определять какой формат юзать, то придётся ещё сильно ковырять и паскалевский враппер FreeImage. |
|
|
|
Естественно в рантайме. Мне очень сильно не нравится условная компиляция она себя оправдывает, только в очень редких случаях. |
|
|
(0007809)
|
zed
|
17-07-2012 08:55
|
|
Если сейчас делать подключение FreeImage в рантайме, то мне придётся шаманить с условной компиляцией в FreeImage.pas, чтобы сделать выбор: подгружать либу динамически или в статике.
>она себя оправдывает, только в очень редких случаях
Угу, а ты загляни в исходники libjpeg или libpng того же, там этих ifdef-ов столько, что волосы дыбом встают :)
Ни одна, уважающая себя библиотека, не обходится без условной компиляции. |
|
|
|
>Угу, а ты загляни в исходники libjpeg или libpng того же, там этих ifdef-ов столько, что волосы дыбом встают :)
Сам говоришь, что волосы дыбом встают. И потом это библиотеки, а не пользовательская программа, которой яыляется САС.Планета.
Но в общем мне без разницы. |
|
|
(0007811)
|
zed
|
17-07-2012 09:57
|
|
Пока суть да дело, может давай у вампира отключим jpeg и удалим его поддержку из САСа (ну, или в ifdef спрятать, на всякий пожарный). Размер exe-хи уменьшится. |
|
|
|
Не вопрос отключай. Хотя размер exe меня в последнюю очередь волнует. |
|
|
(0007814)
|
zed
|
17-07-2012 16:18
|
|
Включил FreeImage. Либу (вместе с зависимостями) залил в релизный репо.
Завтрашняя ночнушка будет статически слинкована с этой либой. |
|