В очередной раз взяться за обновление редактора растровых шрифтов CG-Edit [1-3] автора заставила сугубо практическая необходимость. Для одной из его разработок потребовались шрифты с высотой символа 40-56 пкс. Так как возможности редактора предыдущих версий ограничивались форматом знакоместа 32x32 пкс, пришлось его усовершенствовать.
Попытка решить задачу "малой кровью", просто внедрив в программу недостающие форматы знакомест, оказалась непродуктивной. Дело в том, что с увеличением размеров знакоместа существенно растёт число пикселов в нём, и создание символов становится весьма утомительным вследствие большого числа операций изменения состояния пикселов. Например, если знакоместо формата 8x8 содержит 64 пиксела, то в знакоместе формата 40x48 их уже 1920.
В среднем изображение символа занимает около половины площади знакоместа, значит, для создания символа в формате 8x8 требуется обработать в среднем 30 пикселов, а в формате 40x48 - около тысячи. Если в первом случае нужный символ можно довольно быстро создать, просто щёлкая мышью по требуемым пикселам, то во втором делать это слишком долго и утомительно. Имевшиеся в предыдущих версиях программы CG-Edit инструменты "Карандаш" и "Ластик" [2] облегчают этот труд, однако при создании символов больших форматов их возможностей становится явно недостаточно.
При доработке программы в неё добавлены новые инструменты, применение которых упрощает и ускоряет создание "больших" шрифтов.
Увеличение формата текущего шрифта - инструмент масштабирования, воздействующий на все символы текущего (загруженного в программу) шрифта. Он создаёт шрифт большего формата из меньшего, например, 40x48 из 8x8. Новый шрифт автоматически загружается в программу, заменяя собой исходный, и становится текущим. Вид развёртки и позитивное либо негативное отображение символов остаются такими же, как в исходном шрифте. Это накладывает ограничения на допустимый формат создаваемого шрифта. Например, из шрифта формата 8x8 с горизонтальной развёрткой программа не сможет создать шрифт формата 12x16, для которого допустима только вертикальная развёртка (подробнее об этом в [1]).
Примеры работы инструмента приведены на рис. 1 (8x8 преобразован в 32x40) и рис. 2 (16x16 преобразован в 40x48). Полученные с его помощью символы большого размера обычно приходится редактировать. Дело в том, что масштабирование растровых изображений обычно приводит к их искажению (появлению так называемых артефактов). Кроме того, детализация символов большого размера остаётся такой же, как маленьких. Тем не менее значительно проще и быстрее поправить несколько пикселов увеличенного символа, чем строить его заново. Но иногда воспользоваться масштабированием не удаётся. Например, если планируемое начертание символов большого размера существенно отличается от такового в имеющихся шрифтах меньших форматов. Это характерно именно для больших шрифтов, в которых возможны десятки вариантов начертания символов.
Рис. 1. Пример работы инструмента масштабирования
Рис. 2. Пример работы инструмента масштабирования
Линия - этот инструмент соединяет две произвольные точки знакоместа отрезком прямой линии синего цвета.
Ломаная линия - этот инструмент создаёт внутри знакоместа последовательность отрезков прямой линии синего цвета, причём начало каждого следующего отрезка совпадает с концом предыдущего.
Заливка - этот инструмент закрасит синим цветом область произвольной формы внутри знакоместа. Эта область должна иметь непрерывную границу из пикселов синего цвета. При отсутствии границы или разрывах в ней программа сообщает об ошибке и прекращает выполнение операции.
Окружность - этот инструмент позволяет нарисовать в пределах знакоместа окружность толщиной 1 пкс требуемого радиуса. Для этого сначала в знакоместе отмечают щелчком левой кнопки мыши пиксел, который станет центром будущей окружности. Его цвет станет голубым. Затем курсор устанавливают на любой пиксел, отстоящий от центра на требуемое расстояние (радиус окружности). После щелчка по нему левой кнопкой мыши программа построит требуемую окружность. Центр её останется подсвеченным голубым цветом, и если теперь щёлкнуть по любому другому пикселу, будет построена ещё одна окружность с тем же центром. Так можно построить любое число концентрических окружностей. Построение неполных окружностей (дуг) не предусмотрено. Ненужную часть окружности просто стирают. Если для следующих окружностей требуется сменить центр, то устанавливают курсор на нужное место и щёлкают правой кнопкой мыши. После этого программа будет строить окружности вокруг нового центра.
Увеличение и уменьшение высоты символа - эта пара инструментов изменяет высоту редактируемого символа на один пиксел. При наведении на знакоместо курсора мыши включённые пикселы редактируемого символа в строке, где находится курсор, будут окрашены в голубой цвет, как показано на рис. 3 слева. После щелчка правой кнопкой мыши по выделенной строке произойдёт следующее. Если задано уменьшение высоты символа, выделенная строка будет удалена, а всё, что находилось выше её, опустится вниз на один пиксел, как показано на рис. 3 справа. При увеличении высоты символа всё, что находится выше выделенной строки, будет сдвинуто на один пиксел вверх, а на освободившемся месте будет продублирована выделенная строка. Операция увеличения высоты не будет выполнена, если верхняя строка знакоместа не пуста.
Рис. 3. Уменьшение высоты символа
Расширение или сжатие символа - эти инструменты расширяют или сжимают редактируемый символ. После выбора одного из них и наведения курсора мыши на знакоместо через включённые пикселы символа пройдёт колонка выделения голубого цвета, положение которой будет соответствовать положению курсора (слева на рис. 4). Далее всё происходит аналогично увеличению или уменьшению высоты символа, но перемещается вправо или влево та часть изображения символа, которая находится левее выделенной колонки. Результат расширения показан на рис. 4 справа. Операция расширения не выполняется, если крайняя левая колонка знакоместа не пуста.
Рис. 4. Расширение символа
В обновлённой программе остались неизменными инструменты сдвига символа по горизонтали и вертикали, его отражения по горизонтали и удаления. Изменился лишь инструмент "Откат". Он стал многоуровневым с возможностью как перехода к предыдущим состояниям, так и возврата к сделанным изменениям. Стек хранения изменений имеет шесть уровней. На самом нижнем уровне всегда находится исходное (до начала редактирования) изображение символа, а на остальных хранятся результаты пяти последних изменений. Однако в стеке не сохраняются результаты изменения состояния одиночных пикселов, сдвигов изображения символа во всех направлениях и его зеркального отражения по горизонтали. Эти операции легко отменить иными способами. Например, сдвиг символа влево отменяется его сдвигом вправо.
В новой версии программы изменён и ряд доступных форматов шрифта. Поскольку прямоугольная форма знакоместа более естественна по сравнению с квадратной, из него удалены "квадратные" форматы, за исключением широко распространённых 8x8 и 16x16. Теперь ряд допустимых форматов выглядит так: 6x8, 8x8, 12x16, 16x16, 16x24, 24x32, 32x40, 40x48, 48x56.
Усовершенствован алгоритм распознавания символов. Во-первых, устранена имевшаяся в предыдущих версиях программы ненадёжность распознавания видов развёртки загружаемого шрифта (чаще всего путались "Горизонтально 1" и "Горизонтально 2"). Это было характерно для шрифтов форматов 6x8 и 8x8. Причина - в характере начертания первых четырёх символов зоны "Знаки" [2], по которым программа распознаёт вид развёртки. Почти все они симметричны по горизонтали и выглядят одинаково при развёртке как слева направо, так и в обратном направлении. Первые два символа (пробел и "!") горизонтально симметричны по определению, ещё один ("#"), хотя и несимметричен, но малый формат знакоместа не позволяет придать ему истинное наклонное начертание, поэтому он приобретает горизонтальную симметрию. Так что три из четырёх символов этой зоны распознавались с одинаковой достоверностью для обоих видов горизонтальной развёртки, а этого в ряде случаев [2] достаточно для ошибочного решения о направлении развёртки. Алгоритм распознавания выбирал из двух видов горизонтальной развёртки тот, который встречался ему первым, а это всегда был "Горизонтально 1".
В новом варианте программы изменён набор ключевых символов для зоны "Знаки". Теперь это символы с кодами 20Н, 25Н, 26Н, 2FK Кроме того, для обнаружения зоны теперь требуется наличие всех четырёх ключевых символов, а произведение их коэффициентов корреляции с моделями должно быть не менее 0,179, что соответствует среднему коэффициенту корреляции 0,65.
Стал более гибким вывод информации о наличии и отсутствии символов по зонам. Если ранее результат распознавания зоны выдавался как "Да" или "Нет", при этом результат "Нет" означал, что символы не распознаны [2], то в новой версии программы результат распознавания зоны имеет следующие варианты:
"Да" - зона распознана;
"???" - все ключевые символы зоны присутствуют, однако существенно отличаются от моделей;
"Нет" - один или несколько ключевых символов отсутствуют, по имеющимся сделать вывод о распознавании зоны невозможно.
При запуске программы открывается такое же окно, как в предыдущих версиях. Но после начала работы со шрифтом его панель "Выбор символа" приобретает вид, показанный на рис. 5. Здесь появились две новые экранные кнопки - "Создать модель" (о её функции пойдёт речь в конце статьи) и "Увеличить шрифт", нажатием на которую запускают механизм увеличения формата текущего шрифта. Предлагается выбрать требуемый формат из выпадающего списка, после чего будет выполнено преобразование и полученный шрифт загружен в программу (станет текущим). Оперативный возврат к исходному шрифту не предусмотрен.
Рис. 5. Панель программы "Выбор символа"
На панели "Редактирование знакоместа", справа от него и под ним, расположены экранные кнопки выбора инструментов редактирования. Все они имеют мнемонические изображения и всплывающие подсказки, так что разобраться с их функциями не представляет труда.
Экранными кнопками без фиксации (они расположены ниже редактируемого знакоместа) запускают инструменты, которые не требуют дополнительных действий, кроме нажатия на саму кнопку. Например, "Сдвиг символа" или "Отразить по горизонтали". Особенность кнопок управления механизмом отката ("Откат" и "Вернуть") в том, что каждая из них видиматолько тогда, когда реализуемая с её помощью функция доступна. Если, например, откат невозможен, то и соответствующая кнопка не видна.
Работу инструментов, требующих, кроме нажатия на кнопку, ещё каких-либо действий, запускают экранными кнопками с фиксацией, расположенными справа от редактируемого знакоместа. Пример такого инструмента - "Заливка". После его выбора нажатием на соответствующую кнопку с помощью мыши выполняют действия, необходимые для заливки области.
Нажатая экранная кнопка с фиксацией приобретает красный цвет. Выключают выбранный инструмент повторным нажатием на эту кнопку либо выбором другого инструмента.
В остальном обновлённая программа соответствует версии 2.55 [3]. Её комплект состоит из исполняемого файла CGE261.exe, файла библиотеки Comdlg32.ocx и двух папок Model и Pict, содержащих вспомогательные файлы. Всё это вместе с исполняемым файлом должно быть помещено в одну папку. Для старых версий операционной системы Windows (например, Windows XP) этого достаточно. Но при попытке запуска программы под управлением более современных версий (Windows 7, Windows 10) иногда выводится сообщение, показанное на рис. 6. Оно означает, что программа "не видит" указанный файл в своей папке, его нужно поместить в системную папку и зарегистрировать в ней. Для этого в 32-разрядных версиях Windows следует выполнить следующие несложные действия:
- скопировать файл Comdlg32.ocx из папки программы в системную папку C:WindowsSystem32;
- в той же папке C:Windows System32 найти файл cmd.exe и щёлкнуть по нему правой кнопкой мыши;
- в открывшемся меню выбрать "Запуск от имени администратора";
- в открывшемся консольном окне ввести команду и нажать на клавишу Enter;
- перезагрузить операционную систему.
Рис. 6. Сообщение программы
В 64-разрядных версиях Windows нужно выполнить те же самые операции, пользуясь вместо папки C:Windows System32 папкой C:WindowsSysWOW64.
Если программа не распознаёт некоторый шрифт автоматически, а это необходимо, проблему можно решить, изменив набор моделей символов, которыми программа пользуется при распознавании. Такая проблема обычно возникает для шрифтов больших форматов (более 16x16). Её порождает разнообразие вариантов начертания символов в этих форматах. Если в формате 8x8 можно реализовать лишь два-три разумных варианта, то в формате 32x40 их число достигает нескольких десятков.
Чтобы программа правильно распознала шрифт конкретного начертания, среди включённых в неё моделей должны присутствовать близкие по начертанию к ключевым символам этого шрифта. В рассматриваемой версии программы заложена идентификация каждого ключевого символа по четырём различным моделям. Но это не означает, что в каждом формате возможно распознавание лишь четырёх вариантов начертания символов. На самом деле число их гораздо больше, поскольку многие различаются лишь незначительными деталями. Это позволяет модулю распознавания идентифицировать несколько разных шрифтов по одному набору моделей.
Заложенный в модуль критерий требует, чтобы коэффициент корреляции между реальным изображением символа и его моделью был не менее 0,65, что допускает довольно большие различия. Но если модуль всё-таки не распознаёт нужный шрифт, можно научить его делать это. Для этого необходимо заложить в программу модели, соответствующие требуемому шрифту.
В комплекте программы есть папка Model с девятью файлами. Каждый из них содержит набор моделей для одного из перечисленных выше форматов зна-комест: от t0.mod для формата 6x8 до t8.mod для формата 48x56. Набор моделей представляет собой неполный знакогенератор с четырьмя вариантами начертания каждого ключевого символа. Всего в нём 64 символа - по четыре ключевых символа в четырёх вариантах для четырёх зон. Характерные особенности моделей - позитивное изображение символов, развёртка "Вертикально 1", каждый символ сдвинут в левый нижний угол знакоместа. Размещение символов в файле моделей показано в таблице на примере шрифта формата 8x8.
Таблица
Содержимое файлов моделей этого и других форматов можно увидеть и отредактировать с помощью самой программы CG-Edit. Чтобы загрузить в редактор такой файл, нужно в окне ввода имени загружаемого файла установить фильтр "Все файлы", перейти в папку Model и выбрать из списка нужный файл моделей. Соответствующий этому файлу формат знакоместа и вид развёртки "Вертикально 1" придётся установить вручную.
После этого содержимое файла можно просматривать и редактировать как обычно, а затем сохранить отредактированный вариант обязательно под прежним именем. Рекомендуется предварительно сохранить копию старого файла под другим именем, иначе восстановить его содержимое будет невозможно.
В программе появился инструмент, который позволяет автоматически откорректировать файл моделей, внеся в него ключевые символы из текущего (загруженного в программу) шрифта. Для этого нужно загрузить в программу неопознанный автоматически шрифт (возможно, придётся потрудиться, подбирая параметры, которые неизвестны заранее). Затем нажать на экранную кнопку "Создать модель", находящуюся на панели "Выбор символов". Откроется окно, в котором будет предложено выбрать строку файла моделей. В неё будут автоматически загружены в качестве ключевых соответствующие символы текущего шрифта. После этого, указав, если нужно, на необходимость сохранить исходный файл моделей, нажмите на экранную кнопку ОК. Будет выполнено следующее:
- развёртка текущего шрифта преобразована в "Вертикально 1", если она была иной;
- исходный файл моделей сохранён, если это было задано, в папке Model под тем же именем, но с расширением .old;
- необходимые символы перенесены со сдвигом в левый нижний угол знакоместа в файл моделей;
- обновлённый файл моделей сохранён под прежним именем;
- восстановлен исходный вид развёртки текущего шрифта.
Чтобы облегчить разработку и редактирование символов большого размера, реализован вывод на экран информации о координатах курсора мыши в знакоместе (в пикселах). Начало отсчёта координат - левый верхний угол знакоместа. Кроме того, при работе с инструментом "Окружность" после задания её центра на экран выводится предполагаемое значение радиуса будущей окружности в зависимости от текущего положения курсора относительно её центра. Вся эта информация отображается в правой верхней части панели "Редактирование знакоместа".
Программа CG-Edit версии 2.61 и все необходимые для её работы файлы находятся здесь.
Литература
1. Савченко А. Редактор растровых шрифтов для графических ЖКИ. - Радио, 2016, №3, с. 25-27.
2. Савченко А. Новые возможности редактора растровых шрифтов для ЖКИ. - Радио, 2016, № 10, с. 33-36.
3. Савченко А. Создание файлов знакогенераторов в формате Intel HEX с помощью обновлённой программы CG-Edit. - Радио, 2017, №5, с. 24, 25.
Автор: А. Савченко, пос. Зеленоградский Московской обл.