Как я делал современный шахматный шрифт и что из этого получилось

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

Шахматные фигуры

Перелопатив в сети уйму существующих шахматных шрифтов, я пришёл к нескольким выводам:

  1. Для подобных шрифтов отсутствует какой-либо стандарт.
  2. Символы в шрифтах от разных фабрик, могут иметь разные знакоместа, а сам шрифт имеет разный знаковый состав.
  3. Практически все шрифты доступные в сети выпущены до 2000 года.

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

Немного теории шрифта для создания шахматных диаграмм

Основных форм шахматных фигур - шесть:

  • [p] Пешка Pawn
  • [k] Король King
  • [q] Ферзь Queen
  • [r] Ладья Rook
  • [n] Конь Knight
  • [b] Слон Bishop

Именно по первым буквам латинского названия, расставлены эти фигуры в шахматных шрифтах, но далеко не во всех. Конь располагается на [n], второй букве из латинского названия, так как первая занята Королём.

Все фигуры разделены на два условных цвета: чёрные и белые. И того фигур уже получается 12. Плюс ко всему, фигура одного цвета может быть расположена как на белой, так и на чёрной клетке. В итоге нам понадобится 24 фигуры, но и это ещё не всё.

В шрифте должны присутствовать элементы для набора самой шахматной доски. Их понадобится 36:

элементы для набора самой шахматной доски

И совсем для полного комплекта, нам понадобятся ещё два элемента для создания пустой чёрной и белой клетки.

Идея для нового шрифта

Основная идея нового шахматного шрифта заключается в попытке упростить работу верстальщика и максимально автоматизировать ввод некоторых знаков.

Всё дело в том, что старые шахматные шрифты создавались с учётом старого софта. За это время софт шагнул достаточно далеко в плане поддержки OpenType фич. Было решено создать логику шрифта при помощи контекстных альтернатив ('calt').

Для того, чтобы символы нового шрифта отображались на всех раскладках, я использовал диапазон Basic Latin, что, впрочем, не ново для подобного типа шрифтов.

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

Вызов фигур на белой клетке

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

Вызов фигур на чёрном фоне

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

клавиши для набора игрового поля шахмат

Начну с элементов левой рамки. Первый и самый верхний символ левой рамки игрового поля, это [8], далее по убыванию строк до [1].

Следующим символом в строке идёт клетка игрового поля. Она может быть чёрная или белая, не зависимо от стоящего на ней символа. Понимая структуру игрового поля, я могу привязать нужной цвет клетки к нужной строке :)

Так как помимо просто пустой клетки определённого цвета, на ней может присутствовать шахматная фигура, мне потребуется написать соответствующий класс. Этот процесс, позволит более гибко писать код и не загромождать его.

Открываю панель Classes в FontLab и создаю новый OpenType класс. Простым перетаскиванием формирую кассу знаков класса. Пишу названия класса и сохраняю. Повторяю процедуру пока не получу четыре класса:

@WhiteFigures=[space b k n p q r uni00A0]
@WhiteFiguresBG=[plus v j m o w t equal]
@BlackFigures=[B K N P Q R]
@BlackFiguresBG=[V J M O W T]

панель Classes в FontLab

Порядок расположения символов и их количество для парных классов должен быть одинаков, иначе получится каша и компилятор OpenType в итоге выдаст ошибку.

Следующий шаг, это написание непосредственно саму фичу. Для этого иду в панель OpenType и создаю новую фичу кнопкой со знаком [+]. Заменяю стандартный формат xxxx на 'calt' и начинаю писать код.

feature calt {
  sub eight @WhiteFiguresBG' by @WhiteFigures;
  sub eight @BlackFiguresBG' by @BlackFigures;
 } calt;

панель OpenType

Теперь если набрать [8] и чёрную клетку [+], она поменяется на белую автоматически. Соответственно, если набрать любую фигуру, стоящую на чёрной клетке сразу после [8], она изменится на аналогичную, но стоящую теперь на белой клетке. Повторяю эту операцию и для других строк:

sub seven @WhiteFigures' by @WhiteFiguresBG;
sub seven @BlackFigures' by @BlackFiguresBG;
sub six @WhiteFiguresBG' by @WhiteFigures;
sub six @BlackFiguresBG' by @BlackFigures;
sub five @WhiteFigures' by @WhiteFiguresBG;
sub five @BlackFigures' by @BlackFiguresBG;
sub four @WhiteFiguresBG' by @WhiteFigures;
sub four @BlackFiguresBG' by @BlackFigures;
sub three @WhiteFigures' by @WhiteFiguresBG;
sub three @BlackFigures' by @BlackFiguresBG;
sub two @WhiteFiguresBG' by @WhiteFigures;
sub two @BlackFiguresBG' by @BlackFigures;
sub one @WhiteFigures' by @WhiteFiguresBG;
sub one @BlackFigures' by @BlackFiguresBG;

Я вам обещал «автомат» и это потихоньку начинает работать :).

А можно ли сделать так, что бы и остальной порядок клеток работал в автоматическом режиме?
Да, для этого всё и задумывалось!

Для дальнейшей автоматизации процесса понадобится написать следующий код:

sub @WhiteFigures @WhiteFigures' by @WhiteFiguresBG;
sub @BlackFigures @BlackFigures' by @BlackFiguresBG;
sub @BlackFigures @WhiteFigures' by @WhiteFiguresBG;
sub @WhiteFigures @BlackFigures' by @BlackFiguresBG;
sub @WhiteFiguresBG @WhiteFiguresBG' by @WhiteFigures;
sub @BlackFiguresBG @BlackFiguresBG' by @BlackFigures;
sub @BlackFiguresBG @WhiteFiguresBG' by @WhiteFigures;
sub @WhiteFiguresBG @BlackFiguresBG' by @BlackFigures;

Логика тут проста. Этот код осуществляет проверку символа, стоящего слева. Если вы попытаетесь ввести любую фигуру, стоящую на клетке того же цвета, она будет автоматически изменена на фигуру на клетке противоположного цвета.

Помните, что выше я писал, что для построения шахматных диаграмм нужно использовать 24 фигуры (фактически 12, так как остальные 12 вызываются нажатием клавиши Shift), с написанием данного кода проверки, необходимость в наборе 12 фигур полностью отпала, при чём оказались ненужными именно те, которые были построены с не совсем чёткой логикой.

Теперь пользователю остаётся запомнить расположение только шести фигур, так как остальные шесть вызываются при помощи нажатия клавиши Shift. Основные фигуры местоположение которых требуется запомнить:

  • [p] Пешка Pawn
  • [k] Король King
  • [q] Ферзь Queen
  • [r] Ладья Rook
  • [n] Конь Knight
  • [b] Слон Bishop

Строчные - белые, а прописные чёрные.

Немного шрифтового хулиганства

Немного здорового шрифтового хулиганства никогда не помешает:) Пользуясь случаем, напишу небольшой "автомат" для набора нижней рамки, имеющую обозначения a - h. Для этого мне понадобится написать ещё один класс:

@Letters=[exclam at numbersign dollar percent asciicircum ampersand asterisk];

Ну и использовать его в следующем коде:

sub exclam @Letters' by at;
sub exclam at @Letters' by numbersign;
sub exclam at numbersign @Letters' by dollar;
sub exclam at numbersign dollar @Letters' by percent;
sub exclam at numbersign dollar percent @Letters' by asciicircum;
sub exclam at numbersign dollar percent asciicircum @Letters' by ampersand;
sub exclam at numbersign dollar percent asciicircum ampersand @Letters' by asterisk;

Данный код привязывает все последующие символы к первому символу нижней рамки с литерой [a], которая вызывается с клавиатуры символом [!]. С появлением этого кода, вы можете не мучиться набором порядка символов от [!] до [*], с тем, чтобы выстроить рамку. Код автоматически воссоздаст нужный порядок символов нижней рамки. На деле это обозначает, что вы просто можете нажать на кнопку [!] восемь раз:)

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

sub space' hyphen by grave;
sub hyphen space' by nine;
sub space' exclam by asciitilde;
sub asterisk space' by parenleft;

Теперь можно компилировать код, настраивать метрики шрифта и заголовки, но это уже тема для совсем другой статьи. :)

Вся работа выполнена в программе FontLab Studio 5.2. Woff2 получен при помощи конвертера из .otf формата. Пока мои коллеги осваивают новые функции в OpenType Variable, я продолжаю свои эксперименты с возможностями фич формата OpenType :).

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

На этом всё!
Удачных шахматных партий!