Характерная черта предлагаемых вниманию читателей новых версий опубликованного в [Л] редактора шрифтов - наличие в них модуля распознавания символов, который существенно облегчает и ускоряет процесс анализа и загрузки в редактор шрифтов, ранее созданных с помощью других средств. Кроме того, они предоставляют пользователю более совершенные механизмы создания и редактирования шрифтов.
Создание нового шрифта (знакогенератора) для ЖКИ "с нуля" - задача в принципе несложная, однако весьма кропотливая. Значительно проще "подогнать" под свои требования шрифт, найденный в одном из доступных источников, чаще всего в Интернете. Исходя из этих соображений, автор считает, что радиолюбители чаще всего используют редактор шрифта (далее - редактор) именно для корректировки "чужого" шрифта. Однако, если параметры исходного шрифта неизвестны, процесс его загрузки в редактор довольно сложен. Желание ликвидировать эти сложности и послужило толчком к разработке обновлённых версий редактора. Предлагаю вниманию читателей две его новые версии: базовую (CG-Edit 2.50) и одну из её модификаций (CG-Edit 2.52).
По сравнению с версией, описанной в [Л], в редакторе версии 2.50 унифицирована процедура загрузки файла шрифта. Ранее процедуры загрузки "своих" и "чужих" (созданных в других редакторах) файлов были различными. "Свои" файлы загружались без указания параметров содержащегося в них шрифта, так как эта информация имелась в имени файла.
Для "чужих" файлов такая операция требовала ручного ввода параметров формата, вида развёртки и типа изображения (позитивное или негативное). Конечно, если бы создатели шрифтов каким-либо образом закладывали в файл информацию о параметрах, вводить такие файлы в редактор было бы проще. Но, к сожалению, на практике это встречается крайне редко.
Обычно для получения этой информации требуется анализировать содержимое файла шрифта, что далеко не просто, либо действовать методом проб и ошибок, неоднократно загружая незнакомый шрифт с перебором всевозможных комбинаций его параметров в ожидании увидеть в окне редактирования не хаотический набор точек, а осмысленные очертания символов. Однако простой перебор многочисленных вариантов слишком утомителен.
В новой версии редактора модуль распознавания автоматически определяет необходимые параметры шрифта, находящегося в загружаемом файле, после чего выполняются его загрузка и отображение. Принцип работы этого модуля сводится к следующему. Байты из файла он поочерёдно разворачивает в матрицах, размеры которых соответствуют типичным форматам представления символов (от 6x8 до 24x24 пкс) на экране ЖКИ. Затем эти матрицы модуль сравнивает с матрицами-образцами, в которых развёрнуты образцовые символы. При этом он перебирает все возможные варианты. Результат сравнения - коэффициент корреляции (от 0 до 1) изображений, находящихся в рабочей и образцовой матрицах.
Понятно, что изображение символа в матрице будет максимально приближено к его образцовому начертанию, если параметры его развёртки в матрице совпадают с параметрами анализируемого шрифта. В результате выполнения циклов по всем возможным параметрам формируется трёхмерный массив коэффициентов корреляции. Анализ этого массива позволяет определить значения параметров, с наибольшей достоверностью соответствующие анализируемому шрифту.
Кроме определения трёх абсолютно необходимых для работы редактора параметров шрифта (формата знакоместа, вида развёртки и типа изображения), редактор выделяет в кодовой таблице четыре зоны: 20H-2FH (основные математические знаки и знаки препинания), 30H-39H (десятичные цифры), 41H-7EH (буквы латиницы), C0H-FFH (буквы кириллицы). Он даёт пользователю оценку наличия распознанных символов в каждой из этих зон.
Но все символы зоны модуль не анализирует. Это существенно увеличило бы продолжительность его работы и объём программы-редактора. В каждой зоне он обрабатывает только первые четыре символа, применяя следующие критерии её наличия:
- распознаны любые два символа из четырёх с коэффициентом корреляции не менее 0,85 каждый;
- распознаны любые три символа из четырёх с коэффициентом корреляции не менее 0,7 каждый;
- произведение коэффициентов корреляции всех четырёх символов не менее 0,179 (что соответствует среднему коэффициенту корреляции 0,65).
Шрифт считается распознанным, если в файле найдена хотя бы одна из перечисленных выше зон.
В ходе своей работы модуль идентифицирует и правильно загружает неполные шрифты с кириллическим шрифтом. Полный шрифт отличается от неполного тем, что содержит столько байт, сколько требуется для описания 224 отображаемых символов кодовой таблицы WIN-1251 (находящиеся в области 0-1FH управляющие символы не учитываются). Например, в шрифте формата 8x8 каждый символ описывают восемь байтов, следовательно, размер его образа 8x224 = 1792 байта. В таком шрифте символы размещены в порядке, соответствующем кодовой таблице: первый символ - всегда пробел, следующий - восклицательный знак и так далее. При этом совершенно не обязательно, чтобы все символы были правильно описаны. В шрифте могут быть и пустые зоны. Полный шрифт, содержащий образы всех символов кодовой таблицы, обеспечивает работу индикаторов, не имеющих встроенного знакогенератора.
Однако далеко не всегда использование полного шрифта оправдано. Например, некоторые контроллеры ЖКИ (например, T6963C) имеют встроенный знакогенератор, содержащий лишь первую половину кодовой таблицы (интервал кодов символов 20Н-7EН) и не содержащий символов кириллицы и других алфавитов, кроме латинского. Для полноценной работы с индикаторами, построенными с использованием подобных контроллеров, необходимо загрузить в ОЗУ знакогенератора, если оно имеется, образы недостающих символов с кодами 0С0Н-0FFН. Конечно, можно выполнить такую загрузку из полного шрифта, однако примерно три четверти его объёма не будут использованы и бесполезно займут место в памяти устройства, иногда немалое. Например, объём полного шрифта с матрицей 16x24 пкс свыше 10 Кбайт, а держать в памяти микроконтроллера лишние 6...7 Кбайт - непозволительная роскошь.
В подобных случаях используют неполные шрифты, которые содержат образы символов не всей кодовой таблицы, а только некоторых её частей. Объём такого шрифта меньше, чем полного, а размещение символов в нём может и не соответствовать принятому в кодовой таблице. На практике чаще всего встречаются неполные шрифты, содержащие только кириллицу. Именно их используют для "русификации" индикаторов, знакогенераторы которых встроенной кириллицы не имеют. Встречаются неполные шрифты, содержащие лишь символы цифр, а на иностранных сайтах много неполных шрифтов с символами самых разных алфавитов.
Как известно из [Л], в ходе работы редактор формирует в ОЗУ образ шрифта, причём всегда полного, расположение символов в котором соответствует их порядку в кодовой таблице WIN-1251. Поскольку расположение в шрифте символов с кодами 20H-7FH всегда одинаково, эту часть загружают в образ без каких-либо преобразований.
Точно такая же ситуация с неполным цифровым шрифтом. Однако отображение чисел требует наличия в шрифте не только символов цифр 0-9 с кодами 30H-39H, но ещё и ряда дополнительных символов (пробела, запятой, точки и так далее). Поэтому обычно цифровой шрифт содержит символы с кодами 20H-3FH, расположенные в соответствии с кодовой таблицей. Эти два вида неполных шрифтов редактор загружает в образ с его начала.
Иная ситуация с неполным шрифтом, содержащим только кириллицу. В нём первый символ не пробел (20H), а кириллическая буква А (0С0H). Такая ситуация распознаётся. Неполный кириллический шрифт будет загружен в образ, начиная с позиции, отведённой для символа с кодом 0C0H. Во-первых, это соответствует логике размещения символов в кодовой таблице и облегчает навигацию по символам в ходе редактирования, а во-вторых, позволяет производить в необходимых случаях такое полезное действие, как "склеивание" полного шрифта из двух неполных, содержащих соответственно латиницу и кириллицу.
При анализе неполного шрифта с кириллицей модуль распознавания дополнительно проверяет объём его образа. Если он больше допустимого (а это означает, что в нём находятся не только 64 символа с кодами 0CH- 0FFH, но и какая-то другая информация), файл будет загружен как полный шрифт, но его первым символом станет не символ пробела, а буква А. Этим редактор предоставляет пользователю возможность самому разобраться в содержимом шрифта.
Через модуль распознавания проходят все файлы шрифтов независимо от их происхождения. Но ключевую информацию, содержащуюся в имени файла, созданного с помощью первой версии редактора, он игнорирует, что позволяет вовсе отказаться от неё, упростив структуру имени файла.
Понятно, что возможности алгоритма распознавания ограничены и вполне возможны безуспешные попытки автоматической загрузки. В этом случае редактор предложит загрузить файл, предварительно указав параметры шрифта вручную. Также не исключено, что редактор распознаёт шрифт неправильно. Чтобы выйти из этой ситуации, пользователю дана возможность не согласиться с решением программы и перейти к ручному вводу параметров шрифта.
Во всех случаях ручного ввода параметров шрифт будет загружен в образ с начальной позиции независимо от того, какой шрифт (полный или неполный) находится в файле.
В новую версию редактора добавлена также возможность копирования символа с одного знакоместа на другое внутри текущего шрифта. Введены режимы "Карандаш" и "Ластик", позволяющие рисовать мышью символ внутри знакоместа. Это облегчает создание или редактирование символов, особенно для шрифтов больших форматов. Увеличено число способов развёртки байтов в матрице знакоместа. Добавлена возможность записи в файл непрерывного фрагмента образа шрифта произвольной длины, т. е. создания файла с неполным шрифтом.
Загрузка файла шрифта в редактор
После выбора пользователем в стандартном диалоге Windows загружаемого файла редактор автоматически запускает процедуру распознавания параметров содержащегося в нём шрифта. Если параметры шрифта не могут быть определены, на экран будет выведено сообщение, предлагающее задать их в ручном режиме. Причиной этого может быть либо неизвестный программе формат содержащегося в файле шрифта, либо существенное отличие начертания символов в нём от образцов. После подтверждения пользователем согласия на ручной ввод параметров будет открыто окно их ввода. На этом этапе от загрузки выбранного файла можно и отказаться.
Если редактор распознал полный или неполный без кириллицы шрифт, то на экран будет выведено сообщение с параметрами распознанного шрифта. Следует иметь в виду, что слово "нет" рядом с названием группы символов не означает, что символы в этой группе вовсе отсутствуют. В общем случае это лишь свидетельство того, что редактор не смог распознать четыре первых символа группы.
Далее пользователь может либо разрешить загрузку файла, используя параметры, определённые модулем распознавания, либо ввести параметры шрифта вручную, либо отказаться от загрузки файла.
Если же редактор распознал неполный кириллический шрифт, то возможна его загрузка с наложением на уже находящийся в памяти компьютера образ шрифта либо загрузка с предварительной очисткой текущего образа. Как отмечалось ранее, такой шрифт редактор всегда загружает в образ, начиная с позиции русской буквы А (код символа 0C0H).
Операция наложения на текущий образ позволяет создать полный шрифт из двух частей, иными словами "русифицировать" шрифт, не имевший кириллического шрифта. Для этого следует сначала загрузить в редактор шрифт, который требуется русифицировать, а затем загрузить неполный кириллический шрифт в режиме наложения.
Однако следует иметь в виду, что для правильной склейки абсолютно необходимо, чтобы оба шрифта (находящийся в текущем образе и загружаемый) имели одинаковые параметры, в противном случае получится неработоспособный продукт. Чтобы не дать пользователю совершить подобную ошибку, редактор всегда хранит параметры ранее загруженного шрифта и при обнаружении неполного кириллического шрифта сравнивает с ними его параметры. Если они соответствуют друг другу, об этом выводится сообщение и нажатием на экранную кнопку "Да" может быть разрешена загрузка файла с наложением. При нажатии на экранную кнопку "Нет" загрузка будет выполнена с предварительной очисткой образа шрифта, находящегося в памяти. Допускается также отказ от загрузки (экранной кнопкой "Отмена").
При несовпадении форматов предусмотрена только загрузка шрифта в предварительно очищенный образ ("Да") либо отказ от загрузки ("Нет").
Главное окно редактора после загрузки или создания шрифта показано на рис. 1. В целом оно такое же, как в [Л], за исключением нескольких изменений, о которых будет рассказано далее.
Рис. 1. Главное окно редактора после загрузки или создания шрифта
Копирование символа из одного знакоместа в другое
Эту операцию выполняют в области выбора символа. Следует дважды щёлкнуть левой кнопкой мыши по символу-источнику. Фон его знакоместа станет синим (символ Б на рис. 1). Затем щёлкнуть один раз по символу-приёмнику. Операция завершена. Синий фон символа-источника будет снят, а фон символа-приёмника станет красным и символ будет выведен на редактирование. Если символ-источник выделен ошибочно, то для выхода из режима копирования достаточно щёлкнуть по этому символу ещё раз.
Режимы "Карандаш" и "Ластик"
Чтобы включить режим "Карандаш", необходимо нажать и удерживать клавишу Shift. В этом режиме элементы знакоместа, по которым перемещают курсор мыши, меняют цвет на синий. Нажимать на кнопки мыши не требуется. После отпускания клавиши Shift редактор возвращается в обычный режим редактирования, в котором каждый щелчок кнопкой мыши по элементу знакоместа инвертирует состояние этого элемента.
Для включения режима "Ластик" следует нажать и удерживать клавишу Ctrl. Курсор мыши станет оставлять в знакоместе белый след. Для выхода из режима достаточно клавишу Ctrl отпустить.
Виды развёртки байтов
В новой версии редактора можно задать два варианта вертикальной и два варианта горизонтальной развёртки байтов в знакоместе. Они представлены на рис. 2. Вертикальному режиму из первой версии редактора соответствует режим "Вертикальный 1", горизонтальному - "Горизонтальный 1".
Рис. 2. Два варианта вертикальной и два варианта горизонтальной развёртки байтов в знакоместе
Чтобы пользователю было легче ориентироваться при выборе нужного вида развёртки байта, изменён вид окна ввода параметров шрифта, которое открывается при создании нового шрифта или при ручном вводе его параметров в ходе загрузки. Теперь оно содержит графическую подсказку для выбранного вида развёртки - один из четырёх фрагментов рис. 2.
В только что открытом окне видны только экранная кнопка "Отмена" и поле выбора формата знакоместа. Остальные элементы появятся только после того, как этот выбор будет сделан. Нажатие на экранную кнопку "Изменить вид развёртки" сопровождается открытием окна, аналогичного описанному выше.
В открывшемся окне будет отмечен текущий вид развёртки. Его можно заменить любым допустимым (допустимые виды развёртки были рассмотрены в [Л]). Экранная кнопка "Отмена" в окне отсутствует. Чтобы выполнить такую операцию, достаточно нажать на экранную кнопку "ОК", не меняя вида развёртки.
Создание файлов неполных шрифтов
Первая версия редактора во всех случаях записывала на диск файл полного шрифта. В новой версии можно сохранять в файле любую непрерывную последовательность образов символов кодовой таблицы, т. е. создавать файлы неполных шрифтов.
Для создания такого файла необходимо отметить в поле "Выходной файл" пункт "Неполный ЗГ". В поле появятся два окна ввода с названиями "Символы: с..." и "по...". В эти окна вводят коды первого и последнего подлежащих записи символов (согласно кодовой таблице). По умолчанию указана вся кодовая таблица - полный шрифт.
Необходимые значения можно вводить вручную, однако редактор позволяет сделать это более удобным способом. В области выбора символа щёлкните мышью по первому символу интервала (его фон станет красным), после чего дважды щёлкните мышью в окне ввода "Символы с...". Код выделенного символа появится в этом окне.
Затем щёлкните один раз по последнему символу интервала и дважды в окне ввода "по...". В нём появится код последнего символа. После этого следует выбрать нужный вариант форматирования информации в выходном файле, требуемый тип изображения символов (позитив или негатив) и нажать на экранную кнопку "Сохранить знакогенератор".
Редактор по умолчанию строит имя сохраняемого файла так же, как было описано в [Л], с той лишь разницей, что к символу вида развёртки байта он добавляет цифру 1 или 2. Если сохраняемый шрифт неполный, то в конце сформированного для него имени редактор добавляет символы LAT для шрифта, не содержащего кириллицы, или RUS для содержащего только кириллицу. Имя получает расширение .fnt во всех случаях. Например, имя файла Font12x16v1nRUS.fnt означает, что в нём находится неполный кириллический шрифт формата 12x16, развёртка байтов вертикальная 1, негативное изображение.
Как уже отмечалось, рассматриваемая версия редактора не анализирует имя загружаемого файла, поэтому пользователь имеет право заменить предложенное программой имя сохраняемого файла (включая расширение) любым другим по своему усмотрению. Но всё-таки рекомендуется давать файлам осмысленные имена, позволяющие судить о содержимом файла, не открывая его.
Прочие изменения
После анализа списка форматов знакомест, с которыми работает редактор, из него удалён практически не используемый формат 24x16 пкс. Несколько изменён облик главного окна редактора. В остальном версия 2.50 редактора не имеет отличий от описанной в [Л].
Особенности редактора версии 2.52
В кодовой таблице WIN-1251 символы с кодами 7FH-BFH не относятся к основным символам латиницы или кириллицы и используются крайне редко. Очень часто в полном шрифте эта об-ластьостаётся пустой или почти пустой. Как было отмечено в [J1], в этой области можно размещать произвольные символы, необходимые для вывода на индикатор в конкретном устройстве, для которого разрабатывается шрифт. В предыдущих версиях редактора содержимое этой группы в поле выбора символов соответствовало кодовой таблице WIN-1251 и никак не отражало её истинного состояния.
Конечно, было бы неплохо отображать в поле выбора истинное начертание символов, в том числе в процессе их редактирования. Однако перенос символа из области редактирования в область выбора в общем случае требует его масштабирования, а масштабирование растровой графики, с которой работает редактор, влечёт значительные искажения изображения.
Символ при масштабировании искажается ввиду того, что его исходное изображение в матрице знакоместа имеет недостаточное разрешение, и при переходе к другому разрешению элементы изображения сливаются или дробятся непредсказуемым образом. Поэтому от переноса с масштабированием пришлось отказаться, поскольку перенесённый символ становился, как правило, нечитаемым.
Однако в версии 2.52 появилась сигнализация о наличии символов в области 7FH-BFH, что позволяет лучше ориентироваться в ней. При запуске редактора эта область поля выбора символов пуста (рис. 3). Но в процессе загрузки файла шрифта редактор проверяет наличие символов в каждом её знакоместе. Считается, что символ имеется, если хотя бы один разряд любого байта его образа имеет значение 1. Если такое знакоместо обнаружено, то в соответствующую ячейку области выбора будет выведен символ с кодом 95н (жирная точка в центре знакоместа), как показано на рис. 4. Это свидетельство того, что здесь присутствует некоторый символ. Увидеть и изменить его начертание можно, выбрав эту ячейку для редактирования. При создании в этой области нового символа соответствующая ячейка области выбора символов также будет отмечена жирной точкой.
Рис. 3. Поле выбора символов
Рис. 4. Поле выбора символов
Если знакоместо символа, находящегося в рассматриваемой области, очищено (например, в результате нажатия на экранную кнопку "Стереть"), то соответствующая ему ячейка области выбора символов также очищается. Это не соответствует принятому в редакторе принципу индикации факта редактирования символов. В других областях шрифта о любом редактировании символа (в том числе его полном стирании) сигнализирует выделение этого символа в области выбора полужирным шрифтом увеличенного размера. Поэтому описанное выше исключение из правил нужно просто запомнить.
В остальном редактор версии 2.52 полностью аналогичен версии 2.50. В состав обновлённых редакторов обеих версий входят исполняемый файл CGE-250.exe или CGE-252.exe и папка Model, в которой размещены десять файлов: t0.mod-t5.mod и v0.bmp-v3.bmp. Эти файлы недопустимо удалять, переименовывать или переносить в другое место. Редактор не требует установки и может быть размещён в любом месте (в том числе на съёмных носителях). Единственное условие - папка Model должна находиться в той же папке, что и исполняемый файл.
Описанные в статье программы имеются здесь.
Литература
Савченко А. Редактор растровых шрифтов для графических ЖКИ. - Радио, 2016, № 3, с. 25-27.
Автор: А. Савченко, пос. Зеленоградский Московской обл.