Очерк о Калибрилле. Часть 1

Продолжение очерка о Калибрилле читайте здесь.

Начало. Версия 1.0

Сегодня я хочу рассказать об истории создания программы калибровки мониторов Calibrilla и о том, почему я вообще углубился в эту тему.

Нелюбовь Фотошопа к профилю Самсунга

Всё началось не в таком уж и далёком 2008 году, а именно 30 ноября, когда я купил новый 24-дюймовый ЖК-монитор Samsung SyncMaster 245B взамен безвременно почившего ЭЛТ-монитора Sony GDM-5001PT японской сборки, купленного ещё 5 июня 1998 года за 1400 долларов (8750 руб.). Да, было время, когда за доллар давали всего шесть с четвертью рублей.

Установив имевшиеся в комплекте драйверы я, как ни в чём не бывало, запустил Фотошоп. Вот тут то и началось самое интересное. Фотошоп при запуске выдал сообщение о неисправности профиля: «Возможно профиль монитора "Samsung – Natural Color Pro 1.0 ICM" неисправен. Перезапустите программное обеспечение калибровки монитора.» (или то же самое по английски: «The monitor profile "Samsung – Natural Color Pro 1.0 ICM" appears to be defective. Please rerun your monitor calibration software.»).

The monitor profile "Samsung – Natural Color Pro 1.0 ICM" appears to be defective. Please rerun your monitor calibration software.

Я ответил, что в любом случае профиль использовать, и после загрузки Фотошопа я увидел, что белый цвет в фотошопе (и в палитре и на редактируемом изображении) стал жестоко жёлтым, вот таким:

Жёлтый цвет на палитре Фотошопа

Это явление мне крайне не понравилось, и я решил разобраться в его причинах. Но Интернет на мой вопрос полноценного ответа так и не дал. Я нашёл несколько ссылок на похожие вопросы на русскоязычных форумах, в ответ на которые без лишних разъяснений давалась рекомендация тупо заменить профиль монитора на другой, такой как, например, «sRGB Color Space Profile», находящийся в системе по умолчанию. Причём все вопрошавшие после получения такого ответа были жутко довольны и больше ничего не выясняли. То, что монитор использует не совсем свой профиль особенно никого не волновало, хотя особо продвинутые и рекомендовали сделать индивидуальную калибровку и построение профиля хотя бы такими средствами, как Adobe Gamma. Меня же заинтересовала конкретная закавыка в официальном профиле от Samsung, которая приводила к такой реакции программы Фотошоп. Ведь не будет достаточно известная компания в течение длительного времени тупо лепить дефектные профили! Хотелось выяснить истинную причину.

Замечу, что на англоязычных форумах по этому вопросу рекомендации были аналогичными. Кроме того, там жаловались на невежливую и низкоквалифицированную службу технической поддержки Самсунга, отсутствие письменных ответов на запросы по электронной почте и т.п. Те, кто всё же достучались до службы поддержки, получили рекомендацию тупо заменить их драйвер монитора на универсальный системный драйвер:

http://ars.samsung.com/customer/usa/jsp/faqs/faqs_view.jsp
?isARS=Y&SIT%20E_ID=1&AT_ID=102581&ARS_ID=9904569

То есть, очевидно, что на самом Самсунге о проблеме знают, но не решают её. Почему? Думаю, что это может косвенно свидетельствовать о том, что именно такой профиль раскрывает полный потенциал монитора Самсунг, и разработчики не хотят урезать этот потенциал более умеренным профилем в угоду компании Adobe. Из этого следует, что Adobe просто предусмотрела не все возможные варианты?

Кстати, это не первый камень, бросаемый мною в огород Adobe. Ещё мне не нравится, что «принт скрин» (слепок экрана), сделанный с монитора в системе Windows, и поэтому имеющей подразумеваемое «виндовское» разрешение 96 точек на дюйм, всегда вставляется в фотошоп со значением 72 точки на дюйм, даже, несмотря на принудительную установку этого значения в его настройках по умолчанию. Кстати, об этой любви фотошопа к разрешению в 72 точки на дюйм я уже писал ранее в своей статье:

http://novikovmaxim.narod.ru/articles/web_help/96or72.htm

Итак, копался я с различным софтом по калибровке и исследованию профилей довольно долго, но поскольку ранее вообще не имел никакого представления о системе управления цветом, то так ничего и не понял. Но нет худа без добра. В процессе исследования мне зачем-то понадобилось сравнивать текущие значения в LUT видеоадаптера со значениями, сохранёнными в файле ранее. Удобной программы для этого я не нашёл, поэтому быстренько накидал на Дельфи простенькую утилиту, отображающую рядом две таблицы LUT и позволяющую считывать и записывать данные в LUT и в файл. Так, 10 декабря 2008 года, родилась первая версия программы Calibrilla:

Calibrilla 1.0

Как видите, Калибрилла с самого начала поддерживала более одного монитора (в первой версии — два). Но пока функция автозагрузчика значений в LUT не поддерживалась. Для моих исследований этот функционал был не нужен.

Выбор языка программирования

Немного расскажу о выборе языка программирования для написания Калибриллы. Свои первые программы для компьютера БК0010-01 я писал в 1992 году на Бейсике, который знал ещё со времён учёбы в ПТУ. Затем был ассемблер — сначала для БК0010-01, а затем и для IBM-PC. Причём погрузился я в ассемблер довольно глубоко, и несколько лет он был у меня основным языком программирования. Когда же настало время писать много и быстро (2001 год), в том числе и под базы данных, стало очевидно, что на ассемблере я далеко не уеду. Мне пришлось провести исследование ассортимента сред высокоуровневого программирования. На тот момент основной выбор был между Visual FoxPro, Си, Си++ и Дельфи.

Опыт программирования на Visual FoxPro у меня был, и был он весьма негативным из-за глючности среды, ни с того ни с сего запарывающей проекты на корню, наличия огромного числа различных команд, зачастую устаревших, тянущихся из прежних версий и т.п. Было очевидно, что, превратившись в монстра, среда умирает. Время показало, что я не ошибся. Так и вышло — просуществовав ещё 3 года (до 2004) Microsoft перестала выпускать новые версии, в 2007 выпустила последний пакет апдейтов, а в 2009 — последние заплатки.

Теперь немного про Си и Си++. Язык Си входил в комплект сред разработки под Си++. Среды для программирования на Си++ были и у Microsoft и у Borland, но последний был более популярен среди программистов. К продуктам Microsoft в то время вообще относились не очень хорошо из-за глючности выпускаемых ею в то время операционных систем Windows 3.1 и Windows 95. Положение не спасла даже более-менее стабильная Windows 98, а выправляться ситуация начала только после сведения этой «попсовой» ветки систем с профессиональной веткой NT (Windows Millenium + Windows 2000 = Windows XP). Поэтому, если бы мой выбор пал на Си++, я бы выбрал Borland C++ Builder.

Однако, при выборе языка я повернулся в сторону Дельфи. Причиной этому была родная и хорошо развитая поддержка управления базами данных и наличие в комплекте своего движка баз данных InterBase, с которым у Дельфи было полное взаимопонимание. Кроме того, Дельфи позиционировалась, как среда для быстрого написания приложений, а для меня в то время это было весьма актуально. Таким образом, основным моим языком программирования стал Дельфи. Поэтому и Калибрилла написана именно на этом языке.

Выбор названия программы

Стоит сказать пару слов и о самом наименовании программы. В названии хотелось отразить её суть — калибровку монитора посредством изменения значений в LUT. Ранее у меня уже была программа калибровки сенсоров телефона Siemens на платформе контроллера EGOLD (http://novikovmaxim.narod.ru/products/calibrat/calibrat.htm). Называлась она Siemens Calibrator. Назвать программу тоже Calibrator я не захотел во избежание путаницы.

Возникло несколько вариантов названия — Calibrat, Calibrella и т.п.. Тогда я стал вбивать их в интернет-поисковик, чтобы найти слово, по которому будет наименьшее число ссылок. В результате Calibrella плавно перетекло в Calibrilla. Поисковик по этому слову на весь Интернет не выдал ни одной записи. Поэтому было решено назвать программу Калибриллой, что было созвучно и с калибровкой, и с привычной на слух модной в тот период Мозиллой.

Некоторые соображения насчёт природы упомянутого выше конфликта фотошопа с профилем

Вернёмся ненадолго к описанной в самом начале проблеме. Почему же фотошопу не нравится профиль Самсунга? Положение немного прояснилось после второго подхода к выяснению причин этого странного явления. Выяснилось, что Фотошопу не нравятся значения в тегах gXYZ и bXYZ — координаты зелёного и синего колорантов цветового пространства монитора Samsung. Если подставить туда значения из стандартного системного профиля, или значения, близкие к ним, то профиль проглатывается фотошопом и последний желтизну в своей палитре не выдаёт.

Продолжаем рассуждать, по возможности, логически. Как работает система управления цветом? Если у меня в систему установлен правильный профиль монитора, фотошоп (как и другие программы, поддерживающие систему управления цветом) должен отображать мне на картинке белый всегда белым, т.е. таким, каким он был на другой машине при разработке просматриваемого мною графического файла. Этот цвет не должен зависеть ни от цветового пространства монитора, установленного на той машине (если это пространство для той системы правильно), ни от рабочего цветового пространства, в котором этот графический файл создавался и которое туда (в этот файл) внедрёно. Замечу, что это же касается и всех остальных цветов, вмещающихся в цветовой охват профиля моего монитора. Как я уже упомянул, точно так же должны вести себя и другие программы, отображающие изображения с использованием системы управления цветом — именно в этом состоит смысл использования профилей.

В моём же случае получается, что в другой программе, поддерживающей систему управления цветом, файл с внедрённым профилем sRGB (при установленном в системе якобы глючном профиле самсунга) отображается правильно, а в фотошопе при тех же условиях — нет. В нём всё окрашивается в упомянутые выше жёлтые тона. Отсюда следует, что проблема скорее в фотошопе, а не в профиле.

Программы отображения изображений, поддерживающие систему управление цветом, пересчитывает изображение из внедрённого пространства sRGB в системное самсунговское и отображает его так, как оно было нарисовано в рабочем пространстве sRGB. Фотошоп же спотыкается на самсунговском профиле (о чём сообщает вышеупомянутым окном сообщения), и пересчитывает изображение из внедрённого sRGB во что-то непонятное. Вернуть белый цвет можно только прямым внедрением в картинку того же самсунговского профиля (который тоже, к счастью, внедряется испорченным), что заставляет фотошоп конвертировать из испорченного самсунговского в испорченный самсунговский (то есть, фактически, не конвертировать вообще).

Складывается ощущение, что при считывании профиля фотошоп пытается каким-то хитрым алгоритмом угадать, находятся ли координаты колорантов профиля в допустимых границах, и если ему кажется, что нет, то выдаёт ошибку и пытаясь её скомпенсировать, ошибочно смещая при этом точку белого.

Интересное наблюдение — если фотошоп (CS5) ругается на профиль, то в случае любого ответа (применить или отбросить профиль) при отображении интерфейса происходит некоторая задержка в отображении пунктов меню «Анализ» и «3D». То есть, Фотошоп после загрузки основной своей части, что-то активно пересчитывает…

На настоящий момент причина вышеописанных явлений до сих пор не выяснена. Большая просьба всем, кто владеет какой-то дополнительной информацией по этому вопросу, озвучить её в гостевой книге или личным письмом. Хочется всё же как-то прояснить этот вопрос.

Версия 1.1

Спустя буквально два дня после релиза первой версии, а именно 12 декабря 2008 года, вышла версия 1.1 с некоторыми улучшениями. Так, в этой версии была добавлена возможность считывания в таблицу отдельных цветовых каналов, сохранённых утилитой ICC Profile Inspector, добавлена кнопка полной очистки содержимого таблиц, подкорректирован значок программы и изменён цвет графиков второго монитора, чтобы они отличались от первого.

Calibrilla 1.1

Версия 1.2

Одновременно с доработкой программы я читал много различных форумов по данной тематике, и наткнулся на чью-то жалобу об отсутствии в свободном доступе загрузчиков LUT, которые поддерживали бы одновременно два монитора. Тут я подумал, что несложно будет добавить этот функционал к моей утилите, и тогда, возможно, она станет популярной.

Подумано — сделано. Опять спустя 2 дня, 14 декабря 2008 года, в сети появляется версия 1.2 с поддержкой двухмониторной загрузки в LUT. Текстовые файлы с сохранёнными в них из Калибриллы данными просто передавались ей в качестве параметров командной строки при загрузке ОС. Запуск программы с параметрами осуществлялся из меню автозагрузки, строка в которой прописывалась вручную. Никаких изменений в интерфейсе у этой версии произведено не было.

Однако, с этой версией связано одно интересное событие, положившее начало поддержки многоязычности. Спустя год после релиза, а именно в декабре 2009 года, я получил письмо от Юозаса Мурейки (Juozas Mureika) из Клайпеды с просьбой перевести Калибриллу на английский язык, потому что в интерфейсе все русские буквы при запуске на нерусских локалях операционной системы становятся кракозябрами. В качестве эксперимента по удалению кракозябр я перекомпилировал проект под UNICODE-совместимой 2010-ой версией Дельфи, и отправил результат ему на тестирование. В ответ он написал, что русские буквы появились, и прислал мне переведённую им на английский язык программу. Скриншот раритета прилагаю:

Calibrilla 1.2 EN

Переведённую программу я в комплект поставки так и не включил. Не хотелось публиковать результат полумер (всё таки это была не компиляция англоязычной версии, а правка ресурсов уже скомпилированного приложения). В дальнейшем я всё же планировал полноценный перевод, а на базе прошедшей проверку тестовой версии родилась UNICODE-версия 1.3, речь о которой пойдёт далее.

Версия 1.3

Эта версия родилась 21 декабря 2009 года, то есть спустя год после релиза предыдущей русскоязычной версии. Она была создана на основе тестовой версии 1.2+, отправленной Юозасу Мурейке. Как я уже писал выше, он пожаловался мне на некорректное отображение русских букв в интерфейсе версии 1.2, проявляющееся на нерусских локалях (это явления, известные, как кракозябры и знаки вопросов). Сей факт не только затруднял работу с моей программой, но и осложнял перевод интерфейса, который он пытался проделать в редакторе ресурсов.

Просьба состояла в переводе программы на английский язык. Однако я был ещё к этому не готов в техническом смысле. Перевести несколько слов — не проблема. А вот как осуществить смену языков программно я тогда не знал. Поддерживать же два разноязычных проекта мне не хотелось. Самое большое, что я мог тогда сделать – это просто перекомпилировать программу в вышедшей как раз тогда новой версией Delphi 2010, поддерживающей UNICODE, что и было сделано. В результате русская кодировка стала отображаться правильно на любых локалях. Версия получила номер 1.3:

Calibrilla 1.3

Кроме перехода на UNICODE, программа стала поддерживать стиль Windows XP и выглядеть поэтому более симпатично и современно.

Версия 1.4

В марте 2010 года, спустя три месяца после выпуска версии 1.3, на меня вышел Алексей — специалист по допечатной подготовке (icc-online.ucoz.ru). Он предложил свои услуги в качестве генератора идей по развитию Калибриллы и её бета-тестированию в реальных условиях.

Я подумал, что глупо было бы отказываться от помощи специалиста в вопросе, в котором я мало что понимаю. К тому же, в свете своего желания купить в ближайшем будущем цифровую зеркалку и заняться обработкой снятых ею RAW с последующей их распечаткой, я понимал, что в скором времени мне потребуются соответствующие знания по цветовой настройке своей системы. Поэтому, переборов небольшой приступ лени развивать продукт, я таки дал согласие.

Мы приступили к существенной переработке программы, в том числе и её внешнего вида. Номер вновь разрабатываемой версии я определил, как 2.0. В процессе бета-тестирования уже готового продукта 2.0 выяснилось, что в некоторых многомониторных системах он ошибается с определением мониторов.

Надо заметить, что процедура определения мониторов в системе Windows весьма запутанна. Помимо обычных мониторов, в ней имеются какие-то виртуальные разного назначения и т.п. Кроме того, в соответствующих API-функциях используются параметры, документирования которых я не нашёл. Например, возник вопрос, как интерпретировать результаты работы функции EnumDisplayDevices() в многомониторных системах. В случае двухмониторной системы она выдаёт для каждого выхода видеокарты одинаковый список мониторов, различающийся лишь флагами StateFlags, хотя каждому выходу соответствует лишь один монитор. У одного выхода видеокарты первый монитор имеет флаг DISPLAY_DEVICE_ATTACHED_TO_DESKTOP, а второй — флаги DISPLAY_DEVICE_ATTACHED_TO_DESKTOP и DISPLAY_DEVICE_MULTI_DRIVER, а у второго — наоборот. Как правильно интерпретировать такой результат? Что за флаг такой — DISPLAY_DEVICE_MULTI_DRIVER? Вразумительного описания последнего флага я не получил до сих пор.

В ходе многочисленных проб и ошибок мне удалось всё же написать функцию, которая стала определять мониторы правильно. Она была включена в состав версии 2.0, но мне хотелось всё же исправить эту функцию и в программе со старым интерфейсом на тот случай, если кому-то понадобится такой вариант программы. Ведь в новом интерфейсе две таблицы не могли оторбражаться одновременно, как раньше, а я ведь писал первые версии программы именно для такого одновременного отображения значений таблиц рядом.

Новая функция определения мониторов была включена в состав старой версии программы 1.3, и её номер был увеличен до 1.4. Кроме того, в этой версии программа получила программное ограничение на минимальный размер своего окна. Программа была выложена в сеть 27 марта 2010 года, одновременно с версией 2.0.

Продолжение очерка о Калибрилле читайте здесь.