View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0001353 | SAS.Планета | Рефакторинг / Refactoring | public | 25-06-2012 12:49 | 10-10-2012 11:43 |
| Reporter | vdemidov | Assigned To | zed | ||
| Priority | normal | Severity | major | Reproducibility | N/A |
| Status | closed | Resolution | fixed | ||
| Product Version | .Nightly | ||||
| Target Version | 120808 | Fixed in Version | 120808 | ||
| Summary | 0001353: Убрать нафиг Vampyre Imaging Library | ||||
| Description | Это нетредсейфовое чудо-юдо меня достало. Нужно заменить его отдельными либами типа LibJpeg и LibPng. Или возможно выковырять часть кода и сделать его тредсейфовым, хотя бы для нескольких используемых в САС.Планете форматов. | ||||
| Tags | No tags attached. | ||||
| Attached Files | |||||
|
|
FreeImage: http://freeimage.sourceforge.net/ (есть API для Delphi). |
|
|
Нужно будет посмотреть. |
|
|
У неё как минимум 2 минуса: - большой размер (~ 2,5 Мб) - не предоставляет интерфейса для scanline методов, т.е. с изображениями работает в памяти Если сильно захотеть, то можно отключить ненужные форматы и уменьшить тем самым размер либы, и можно добавить экспорт оригинальных функций из libjpeg, libpng и др. для которых доступны scanline методы. Но это надо ковырять оригинал. |
|
|
Может начнем с перехода на libjpeg читалку и писалку тайлов? Ты ж вроде ее уже сделал? Так включим по умолчанию. Плюс, хотя бы читалку png по-умолчанию сделаем не на вампире, а на libpng. И вот уже почти нет глобальных локов. |
|
|
Пробуй. |
|
|
А что ты там наворотил кучу условной компиляции? Какую версию нужно использовать? |
|
|
Есть 2 версии libjpeg: - быстрая (SSE,MMX и проч. оптимизации) jpeg62 - новая jpeg8, с lossless наворотами В САСе включена быстрая. Если/когда буду делать lossless jpeg надо будет либо включать обе версии, либо оставлять только новую. В условной компиляции ещё можно выбрать статическую, либо динамическую линковку. Сейчас включена динамическая. |
|
|
Хорошо. А сможешь сейвер и лоадер для png сделать? |
|
|
Нет, пока что я за это не возьмусь. |
|
|
>Нет, пока что я за это не возьмусь. Плохо. Ты хотя бы уже разбирался с LibPng, а я туда ни разу не заглядывал. А может все таки? Хотя бы запись в RGB и RGBA? |
|
|
Моё разбирательство с png ограничивается прочтением пары нагугленых статеек - этого хватило, чтобы кое-как написать склейку, но до полной поддержки формата там как до Луны. С jpeg было проще, в плане того, что там нет прозрачности и различных режимов глубины цвета. Хотя я и там не дам 100% гарантии, что оно откроет любой jpeg без ошибок. К тому же, у png нет актуального заголовочника. Есть только для libpng12. Я было начал актуализировать его, но где-то на сотой функции (из ~ 250) таки выдохся и оставил это дело до лучших времён. Сейчас приаттачу недоделки (там, кстати, и примеры работы с libpng на Delphi имеются). |
|
|
Вдогонку приложил и PluginPNG.cpp - код из FreeImage, отвечающий за чтение/запись png. В принципе, достаточно просто транслировать на делфи (выкинув/заменив зависимости самого FreeImage). |
|
|
Еще нужно посмотреть http://sourceforge.net/projects/gr32pnglibrary/ |
|
|
Удалось уменьшить FreeImage.dll до 340Кб без потери функциональности. При этом, используются dll-ки libjpeg и libpng и доступны форматы: BMP, GIF, PNG, JPEG (можно ещё добавить ICO - вроде где-то просили его, чтобы можно было иконки карт из favicon.ico делать). Завтра попробую прикрутить его к САСу и вытравить вампира (если он там больше нигде не используется). |
|
|
Отлично. Больше нигде не используется. И добавь таки ico. Для иконок карт сгодиться точно, и может еще где. Только проверь что бы оно с прозрачностью нормально работало. PS: А в многопоточном режиме оно точно нормально работает? Не будет проблем как с вампиром? |
|
|
Пишут что да: 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). Код выглядит довольно стройно, либа живёт уже не первый год и много кем используется. Как оно окажется на самом деле - увидим. |
|
|
Облом: 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 можно пережить, а гиф очень редко используется. Так что сойдет. И еще можешь добавить выбор библиотеки чтения-записи для каждого формата из конфига, а там разберемся. |
|
|
>А зачем ты вообще трогал Jpeg? За компанию, чтобы посмотреть на него. Типа: "а вдруг там быстрее?". >чтения-записи для каждого формата из конфига Условную компиляцию или в ран-тайме? Там эта либа статически линкуется, и если нужно в ран-тайме определять какой формат юзать, то придётся ещё сильно ковырять и паскалевский враппер FreeImage. |
|
|
Естественно в рантайме. Мне очень сильно не нравится условная компиляция она себя оправдывает, только в очень редких случаях. |
|
|
Если сейчас делать подключение FreeImage в рантайме, то мне придётся шаманить с условной компиляцией в FreeImage.pas, чтобы сделать выбор: подгружать либу динамически или в статике. >она себя оправдывает, только в очень редких случаях Угу, а ты загляни в исходники libjpeg или libpng того же, там этих ifdef-ов столько, что волосы дыбом встают :) Ни одна, уважающая себя библиотека, не обходится без условной компиляции. |
|
|
>Угу, а ты загляни в исходники libjpeg или libpng того же, там этих ifdef-ов столько, что волосы дыбом встают :) Сам говоришь, что волосы дыбом встают. И потом это библиотеки, а не пользовательская программа, которой яыляется САС.Планета. Но в общем мне без разницы. |
|
|
Пока суть да дело, может давай у вампира отключим jpeg и удалим его поддержку из САСа (ну, или в ifdef спрятать, на всякий пожарный). Размер exe-хи уменьшится. |
|
|
Не вопрос отключай. Хотя размер exe меня в последнюю очередь волнует. |
|
|
Включил FreeImage. Либу (вместе с зависимостями) залил в релизный репо. Завтрашняя ночнушка будет статически слинкована с этой либой. |
| 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 |