Искусство программирования

Потихоньку ковыряю исходники dcraw

Жесть: после отпиливания (по живому, расстановкой #if 0 в почти произвольных местах) примерно 3/4 программы (из 8500 строчек осталось 2500), остаток продолжает довольно осмысленно работать. Не удивлюсь, если он регенерирует к утру.

Надо сказать, что особенности материала (а разобрать данные от 160 разных фотокамер - это не шутки) наложились на особенности стиля автора. Взять, например, детектирование конкретной модели цифровика Canon по ширине картинки.

Comments

О, да! У меня от кода dcraw уже неделю шок не проходит...

Ширина сенсора вполне себе сигнатура - мне это тоже показалось прикольным, но в общем без негативных эмоций. А вот всякие diff -= (1 << len) - !shl; меня просто в ступор вводят. Т.е. если ты так пишешь, то хотя бы комментарии ставь, а если не любишь комментировать, то пиши простыми развернутыми конструкциями без этих чертовых сишных вывертов.
Но в итоге его куски я просто стараюсь не трогать без особой нужды, иначе потом очень трудно вклеивать изменения из новых версий.

Меня, честно говоря, взбесило вот это:

if (raw_width == 2672 && val < 512) val += 2;

diff -= (1 << len) - !shl;

А Вы под какую ось эту штуку собираете? Я под Windows собирал, но полностью собрать получилось только из бод cygwin'а. Что-то вот подумалось, что может существуют более прямые методы...

Ну я пока и вовсе под FreeBSD.

А виндовую - проще брать готовый бинарник, их есть.

Готовый бинарник - это не спортивно :)

Да я уже привык к такому стилю опенсорса. Стараюсь не трогать его, если нельзя взять и использовать как есть, либо обойтись небольшими точечными изменениями, а писать сам все.

Написание своего dcraw похоже вообще никто не осилил.

Дык написать-то не проблема. Вот тестирование мало кто осилит :)

А что значит "никто"? Вроде бы рав-конверторов масса. Или они используют куски кода из DCRAW'а?

Ага, большинство - использует (включая, например, Adobe). Вот наверное C1 - исключение, ну так и камер сильно меньше поддерживает.

Надо будет, как руки дойдут, сделать несколько бинарных сигнатур из тамошних таблиц. Может быть и в C1 найдутся следы.

Тестирование, кстати, несложно автоматизировать.

Дык написать-то не проблема

На "160 камер" ? Или на одну ?

Форматов там все же не 160, скорее всего.

А вот протестировать это - да, проблема большая.

Форматов там - не 160. Но вот матриц CAM - XYZ - 180 штучек.

А в детекторе камер - 1200 строчек, не считая того детектора, который TIFF разбирает, там еще 980

Не, работа проделана гигантская и я сильно сомневаюсь, что ее можно за разумное время повторить.

>>>>Не удивлюсь, если он регенерирует к утру.
Ну и как? Исин жив? :)))))))))))

Не удивила, а скорее умилила попытка Dave Coffin усидеть на двух стульях: заставить dcraw работать как с lcms, так и без неё. Вылилось это в 2 не пересекающихся пути преобразования цветовых пространств: convert_to_rgb(), использующая матрицу rgb_cam (считается в adobe_coeff()); и "CMS-way", - средствами lcms (apply_profile()), используется, если явно указан профиль (хотя бы входной).

Имхо, всё можно было бы упростить, если использовать для этого только lcms с генерацией профиля "на лету", по таблицам, если он не задан явно...

На самом деле, я не согласен. Во-первых, lcms появилась позже dcraw и прикручена потом (сбоку).

Во-вторых, lcms - это далеко не подарок в смысле точности (см всю подборку прямо в этом блоге: http://blog.lexa.ru/tags/cmm )