Слайд 1Вывод текста и шрифты
Отвагин Алексей Владимирович, доцент каф. ЭВМ, к.т.н.,
а. 505-5
Слайд 208/13/2019
Содержание
Понятие шрифта, характеристики шрифта
Виды шрифтов
Вывод текста в графическом интерфейсе
Слайд 308/13/2019
Основные понятия
Шрифт представляет собой набор шаблонов для представления символов некоторого
языка или алфавита
В компьютерной терминологии совокупность символов языка называется набором
символов (charset)
Кодировка – представление заданного набора символов одним или несколькими байтами информации
Слайд 408/13/2019
Кодировки
Содержат 256 символов (первые 128 стандартные)
Вторая половина содержит символы
национальных алфавитов, денежных знаков, дополнительные символы и т.д.
Идентификатор кодировки от
0 до 255
Слайд 508/13/2019
Unicode
Новый стандарт кодировок (16 разрядное представление)
Позволяет представить большинство символов различных
языков мира
Группируется на логические зоны для представления отдельных классов символов
Слайд 608/13/2019
Глиф
Кодировка определяет лишь логическую группировку и представление символов
Графическая форма символа
называется глифом
Слайд 708/13/2019
Свойства глифов
Обычно существует однозначное соответствие между кодом символа и глифом
Глифы
могут определяться контекстом использования символа
Глиф может быть составным
Глиф может являться
комбинацией символов - лигатурой
Слайд 808/13/2019
Примеры сложных глифов
Слайд 908/13/2019
Элементы глифов
Базовая линия
Ножка
Засечка
Внутрибуквенный просвет
Надстрочный элемент
Полуовал
Ушко
Х-высота
Подстрочный элемент
Петля
Связь
Каплевидный элемент
Слайд 1008/13/2019
Определение шрифта
Шрифт – совокупность глифов, обладающих сходным графическим стилем, для
которой определено отображение кодировки в глифы
Шрифт может поддерживать несколько кодировок
Глифы
являются базовым компонентом шрифта
Слайд 1108/13/2019
Имя шрифта
Имя шрифта – символьная строка, определяющая его семейство и
начертание
Семейство – группа шрифтов, обладающая сходным начертанием и одним названием
Начертание
– видоизменение шрифта в семействе (нормальное, полужирное, наклонное, подчеркнутое и т.д.)
Слайд 1208/13/2019
Разновидности шрифтов
Моноширинный – все символы имеют одинаковую ширину (консольные шрифты)
Пропорциональный
– глифы имеют разную ширину
Roman – переменная толщина линий и
засечки
Swiss – переменная толщина без засечек
Modern – постоянная толщина линий без засечек
Script – имитация рукописного текста
Decorative – без ограничений
Слайд 1308/13/2019
Примеры семейств шрифтов
Слайд 1408/13/2019
Методы представления шрифта
Растровые шрифты
Векторные шрифты
Шрифты TrueType
Слайд 1508/13/2019
Растровые шрифты
Пикселы, образующие глиф, являются растровым изображением
Для разных разрешений экрана
требуются разные наборы шрифтов
Шрифты плохо масштабируются к произвольному размеру
Слайд 1608/13/2019
Заголовок шрифта
typedef struct { WORD Version; // 0x200 для 2.0,
0x300 для 3.00
DWORD Size; // Размер файла шрифта
CHAR Copyright[60];
WORD Type;
// Растровый, если Type & 1 == 0
WORD Points; // Номинальный размер в пойнтах (1/72 дюйма)
WORD VertRes; // Вертикальное разрешение
WORD HorizRes; // Горизонтальное разрешение
WORD Ascent;
WORD Descent;
WORD IntLeading;
WORD ExtLeading;
BYTE Italic;
BYTE Underline;
BYTE StrikeOut;
WORD Weight;
BYTE CharSet;
WORD PixWidth; // 0 для пропорционального
WORD PixHeight;
BYTE Family; // Семейство
WORD AvgWidth; // Ширина символа 'x‘
WORD MaxWidth; // Максимальная ширина
BYTE FirstChar; // Первый символ
BYTE LastChar; // Последний символ
BYTE DefaultChar; // Заполнитель
BYTE BreakChar; // Пробел } FontHeader20;
Слайд 1808/13/2019
Векторные шрифты
Глиф описывается последовательностью линейных отрезков
Различие шрифтов в представлении данных
глифа
Для представления используется специальная грамматика
Шрифты неплохо масштабируются
Слайд 1908/13/2019
Грамматика векторных шрифтов
::= { }
::=
{ }
::= 0x80
::=
Слайд 2008/13/2019
Шрифты TrueType
Разработаны компанией Apple
Контуры глифа представляются прямыми линиями и кривыми
При
масштабировании кривые остаются плавными
Векторные шрифты определяют линии, а TrueType –
контуры глифа
Слайд 2108/13/2019
Отображение шрифта
Загружается контур шрифта и подается в растеризатор
Контур масштабируется до
нужного размера в точках для нужной разрешающей способности устройства
Подсказки применяются
к контуру, искажая его, чтобы сформировать контур, приспособленный к сетке
Преобразованный контур заполняется пикселами, создавая растровый точечный рисунок
Растровый точечный рисунок кэшируется и используется далее при выводе шрифта
Слайд 2208/13/2019
Представление символов шрифта
Контур глифа состоит из ряда связанных контуров
и линий, которые определены рядом точек, описывающих квадратичные B-сплайны
Используются два
типа точек, чтобы определить кривые: те, которые находятся на кривой и те, которые не находятся
Прямые линии определяются их оконечными точками
Слайд 2308/13/2019
Растеризатор
Представляет собой стековую машину, управляемую простым языком
Реализует сложные алгоритмы на
основе информации, хранящейся в глифах шрифта
Слайд 2408/13/2019
Растеризация шрифта TrueType
Выполняется подгонкой глифа с помощью специальных команд
Обеспечивает:
Одинаковую толщину
линий
Сохранение размеров внутри одного глифа и между глифами
Сохранение симметрии и
других элементов глифа (например, засечек)
Слайд 2508/13/2019
Подгонка при растеризации
Слайд 2608/13/2019
Логические шрифты
Используются для вывода в графическом интерфейсе
Обеспечивают независимость от устройства
Поддерживают
использование кодировок
Позволяют создавать шрифты заданного размера
Реализуют некоторые начертания (подчеркивание и
перечеркивание)
Слайд 2708/13/2019
Структура описания шрифта
sealed class Font : MarshalByRefObject, ICloneable, ISerializable, IDisposable
{
public Font(...);
// Свойства
public bool Bold { get; }
public FontFamily FontFamily
{ get; }
public byte GdiCharSet { get; }
public bool GdiVerticalFont { get; }
public int Height { get; }
public bool Italic { get; }
public string Name { get; }
public float Size { get; }
public float SizeInPoints { get; }
public bool Strikeout { get; }
public FontStyle Style { get; }
public bool Underline { get; }
public GraphicsUnit Unit { get; }
}
Слайд 2808/13/2019
Структура описания семейства шрифтов
sealed class FontFamily : MarshalByRefObject, IDisposable {
public
FontFamily(string name);
// Свойства
public static FontFamily[] Families { get; }
public
static FontFamily GenericMonospace { get; }
public static FontFamily GenericSansSerif { get; }
public static FontFamily GenericSerif { get; }
public string Name { get; }
// Методы
public int GetCellAscent(FontStyle style);
public int GetCellDescent(FontStyle style);
public int GetEmHeight(FontStyle style);
public static FontFamily[] GetFamilies(Graphics graphics);
public int GetLineSpacing(FontStyle style);
public string GetName(int language);
public bool IsStyleAvailable(FontStyle style);
}
Слайд 2908/13/2019
Создание шрифта
FontFamily family =
new FontFamily("Arial");
Font font =
new Font(family, 12,
FontStyle.Bold | FontStyle.Italic);
После создания шрифта GDI подбирает соответствующий ему
физический шрифт
Слайд 3008/13/2019
Функция вывода текста
Выводит строку
using( Font font = new Font("Arial",
12) ) {
// Обрезает строку по символу
// перевода
строки
g.DrawString("line 1\nline 2", font, Brushes.Black, 10, 10);
}
Выводит строку, обрезая ее в границах прямоугольника
g.DrawString("a long string...", font, Brushes.Black, this.ClientRectangle);
Слайд 3108/13/2019
Форматирование текста
enum StringFormatFlags {
0, // По умолчанию
DirectionRightToLeft, // Вывод справа
налево
DirectionVertical, // Вывод сверху вниз
DisplayFormatControl, // Вывод управляющих символов
FitBlackBox, //
Помещать глифы внутрь границ
LineLimit, // Вывод только полных строк
MeasureTrailingSpaces, // Учитывать пробелы
NoClip, // Не обрезать текст
NoWrap, // Не воспринимать \n или \t
}
Слайд 3208/13/2019
Вывод с форматированием
StringFormat format = new StringFormat();
format.FormatFlags = StringFormatFlags.DirectionVertical |
StringFormatFlags.NoWrap;
g.DrawString("...", font, brush, rect, format);
Слайд 3308/13/2019
Отсечение строк
enum StringTrimming {
None, // без отсечения
Character, // Отсечение по
ближайшему символу
EllipsisCharacter, // По ближайшему символу + …
Word, // По
ближайшему слову
EllipsisWord, // По ближайшему слову + …
EllipsisPath, // Отсечение с … в середине
}
Слайд 3408/13/2019
Функции выравнивания
enum StringAlignment {
Center,
Near, // В зависимости от
направления вывода
Far, // В зависимости от направления вывода
}
format.Alignment = StringAlignment.Center;
format.LineAlignment = StringAlignment.Center;
Слайд 3508/13/2019
Сглаживание шрифтов
SingleBitPerPixelGridFit – Символ выводится согласно глифу, сглаживаются кривые.
SingleBitPerPixel -
Символ выводится согласно глифу.
AntiAliasGridFit- Символ выводится согласно сглаженному глифу с
учетом подсказок.
AntiAlias - Символ выводится согласно сглаженному глифу без учета подсказок сглаживания.
ClearTypeGridFit - Символ выводится согласно глифу ClearType с учетом подсказок сглаживания.