Доброго всем времени суток!
Решил создать для libimg отдельную тему по следующим причинам:
- libimg используется далеко не только в kiv, разумно продолжать разговоры о ней в данной теме, а не в теме kiv
- добавил возможность чтения формата xcf (собственно, повод для поста)
Теперь подробнее. Xcf - родной формат для GIMP. Он поддерживает, кроме всего прочего, слои и режимы смешивания. Таким образом, в libimg теперь есть
функции для слияния слоёв. Кроме того, для некоторых режимов смешивания понадобились
преобразования цветовых пространств RGB<->HSV и RGB<->HSL. Эти функции в дальнейшем имеет смысл перенести в libimg.asm, но xcf - это первый многослойный формат, с которым я близко познакомился, и поэтому я не стал спешить. Когда будет добавляться поддержка другого многослойного формата, будет лучше видно, что и в каком виде следует туда перенести.
Поддержка формата не полная (нет текстовых слоёв), но остальное должно работать. Например, маски и невидимые слои:

Поддерживаются изображения с палитрой, в оттенках серого, rgb. Вот то, ради чего это всё затевалось (
kolibri_wallpaper_release.xcf):

Функции слияния пикселей с учётом альфа-канала написаны и использованием MMX. Впервые работал с MMX, сильно не бейте если что. Понимаю, что есть компьютеры, не поддерживающие эту технологию (а есть и с sse*), поэтому все подобные функции вынесены в отдельный файл composite_mmx.inc, подключаемый условной компиляцией
Code:
COMPOSITE_MODE equ MMX
...
match =MMX,COMPOSITE_MODE{include 'composite_mmx.inc'}
Потом можно добавить, например, composite_none.inc и composite_sse.inc и подключать при надобности их. Что-то вроде ключей компиляции)
Теперь у меня пара вопросов:
- Влияет ли на производительность смешивание MMX инструкций с обычными? Или MMX только с FPU не дружит? (читал, что регистры MMX хранят мантиссы чисел при операциях с FPU, поэтому предполагаю ответ нет)
- Критичен ли для скорости вызов небольшой функции при обработке каждого пикселя? Имеет ли смысл дублировать небольшие куски кода во избежание лишних call'ов?
Размер libimg.obj увеличился на 6170 байт в несжатом виде. Ревизия 1921.
Если на каких-то изображениях вылетает или показывает неправильно - прикрепляйте, постараюсь исправить.