Немасштабируемые векторные шрифты
Posted: Sat Nov 26, 2011 2:48 pm
Задумка зародилась здесь, но в том сабже была оффтопиком.
По ходу реализации конкретный формат новых шрифтов и код парсера много раз менялась: код цепочки из 3-битного ужался до 2бит на угол, максимальный размел символа - до 12х21, введены стандартные реперные точки и обработка симметричных линий, и т.п.
Но основные идеи во многом остаются прежними:
1) шрифты состоят из символов (chars), символы - из штрихов (ticks); отдельные штрихи могут быть общими для разных символов и даже шрифтов.
2) шрифты кодируются 256-элементными 2-байтными таблицами, каждый элемент которых содержит информацию о соответствующей цепочке в таблице штрихов, числе штрихов и (для пропорциональных шрифтов) ширине символа.
3) каждый элемент в таблице штрихов - это 2-байтовое битовое поле, содержащее информацию о реперной точке (откуда начинается рисование), начальном векторе, и номере штриха. Форматы этих битовых полей различаются для разных ротационных групп штрихов (см. ниже)
4) каждый штрих (tick) представляет собой связную цепочку пикселей, не содержащую разрывов и острых углов. В битовом поле каждого штриха кодируются не пиксели, а углы: 00 = прямо; 01 = вперед и вправо; 10 = вперед и влево; 11 = направо (под прямым углом). Для отрисовки конкретного штриха требуется дополнительно задать начальные условия: направление и исходную координату (реперную точку) рисования.
5) в общем случае начальный вектор кодируется 3 битами. Но существуют важные группы штрихов, для которых на направлении можно сэкономить:
- прямые линии: требуют только 2 бит для вектора, и не имеют поворотов;
- центрально-симметричные фигуры (например, квадрат) - требуют только 1 бита для вектора;
- ротационные инварианты (например, точка) - не нуждаются в начальном векторе.
Для этих штрихов предусмотрено специальное кодирование.
работа еще не закончена. детали и конкретные форматы - будут чуть позже, на Вики и здесь. пока что жду комментов.
По ходу реализации конкретный формат новых шрифтов и код парсера много раз менялась: код цепочки из 3-битного ужался до 2бит на угол, максимальный размел символа - до 12х21, введены стандартные реперные точки и обработка симметричных линий, и т.п.
Но основные идеи во многом остаются прежними:
1) шрифты состоят из символов (chars), символы - из штрихов (ticks); отдельные штрихи могут быть общими для разных символов и даже шрифтов.
2) шрифты кодируются 256-элементными 2-байтными таблицами, каждый элемент которых содержит информацию о соответствующей цепочке в таблице штрихов, числе штрихов и (для пропорциональных шрифтов) ширине символа.
3) каждый элемент в таблице штрихов - это 2-байтовое битовое поле, содержащее информацию о реперной точке (откуда начинается рисование), начальном векторе, и номере штриха. Форматы этих битовых полей различаются для разных ротационных групп штрихов (см. ниже)
4) каждый штрих (tick) представляет собой связную цепочку пикселей, не содержащую разрывов и острых углов. В битовом поле каждого штриха кодируются не пиксели, а углы: 00 = прямо; 01 = вперед и вправо; 10 = вперед и влево; 11 = направо (под прямым углом). Для отрисовки конкретного штриха требуется дополнительно задать начальные условия: направление и исходную координату (реперную точку) рисования.
5) в общем случае начальный вектор кодируется 3 битами. Но существуют важные группы штрихов, для которых на направлении можно сэкономить:
- прямые линии: требуют только 2 бит для вектора, и не имеют поворотов;
- центрально-симметричные фигуры (например, квадрат) - требуют только 1 бита для вектора;
- ротационные инварианты (например, точка) - не нуждаются в начальном векторе.
Для этих штрихов предусмотрено специальное кодирование.
работа еще не закончена. детали и конкретные форматы - будут чуть позже, на Вики и здесь. пока что жду комментов.