OpenGL. Руководство по программированию (Библиотека программиста) (2006). Ву М., Девис Т., Нейдер Дж., Шрайнер Д (1124475), страница 56
Текст из файла (страница 56)
Если используется векторная форма команды, все координаты помещаются в массив соогг(а В варианте я1И(пбоиРоэ2'() аргумент г неявно равен О. Для получения текущих координат растра (ранее установленных а1маэсегРоэ*() ялв я1И)пбоиРоэ*()) вы можете использовать запрос я1беСЕ1оатч() с первым 264 Глава 8 ° Вывод пикселов, битовых образов, шрифтов и изображений аргументом, равным БС СОКРЕМТ РА5ТЕК Р051Т10М. Второй аргумент должен быль указателем на массив значений (х, у, г, т) в формате с плавающей запятой. Из результата вызова к16еСВ001еапу() с первым аргументом БС СОРРЕМТ КА5ТЕК Р051Т10М НАС10 можно узнать, действительна (уа)Ы) ли текущая позиция растра.
Вывод битового образа Установив необходимую позицию растра, вы можете использовать команду 818! Свар() для вывода данных. тЬ к18! сваР(С(Яге( т(с(гЬ, СЕз(ге( Ье(8ЬД С1()оаС х,ы СЕйоаС Ум, С(.боаС хы СЕЛоас уы, сопзс С) иЬусе "Ь(стар); Рисует битовый образ, указанный аргументом Ьйтар, значение которого представляет собой указатель на данные изображения. Битовый образ располагается в соответствии с текущей позицией растра. Если она недействительна, ничего це происходит. Аргументы ЫгЬЬ и Ье!8ЬГ залают ширину и высоту битового образа в пикселах.
Ширина не обязана быть кратной 8, хотя при сохранении данные будут выровнены по значению 8. (В примере с буквой Р избыток «мусорных» битов правее левых (О нс принципиален: все равно 818! с!вар () отрисует столько битов, сколько нужно, в нашем случае — 10 у каждого ряда.) Используйте аргументы хы, и у,„для описания начальных координат битового образа относительно текущей позиции растра (положительные значения поднимают рисунок вверх и смешают вправо; отрицательные— сдвигают вниз и влево); аргументы х», и у„отвечают за приращения текущей позиции растра — ее координаты х и у изменятся на эти значения после завершения операции (рис, 8,2).
и= (О (х»„ у ) = (0,0) (х,, у;) = (М,о) ь=(2 00 11,0 Рмс. 8.2. Битовый образ и связанные с ним параметры Такое разграничение «обязанностей» удобно тем, что позволяет размещать произвольным образом символы, опущенные ниже базовой линии (обычно с подстрочными элементами, такие как «8», «)» и «у»), буквы с орнаментом или перекошенные влево символы (в шрифтах с левым наклоном). По окончании рисования образа текущая позиция растра смещается на значения х„и у»«(Если вашей целью является лишь перемещение текущей позиции, лучше вызвать 818! Свар() с аргументом ЬЫтар, установленным в МВСС, и нулевыми значениями ширины и высоты (гвЫ(Ь и Ье(РЬг).) Для стандартной латиницы у„ обычно задается как 0.0, а х», положительно (в соответствии с направлением Битовые образы и шрифты 265 письма слева направо). Для иврита (шрифт НеЬге»ч), где направление письма противоположное, значение хи, соответственно, отрицательное.
Для шрифтов, предполагающих вывод знаков в столбец вертикально, хи равно О, а уи — ненулевое, На рис. 8.2 для каждого экземпляра буквы Г текущая позиция передвигается вправо на 11 пикселов, тем самым образуется межсимвольный интервал шириной в пиксел. Поскольку х»„, у»„, х„и уи — числа вещественные, то и размер символов не ограничивается только целыми значениями. Хотя при отображении символов от расположения их по пикселам на растровых экранах никуда не уйти, все равно текушая позиция вычисляется в формате с плаваюшей ваня~ой, с целью избежать накопления погрешности при выводе последующих символов. Например, если код примера с буквой г модифицировать таким образом, чтобы хи стало равным 11.5 вместо 12, и продолжить рисование дальше, интервал между буквами будет либо 1, вибо 2 пиксела, что максимально приближено к требуемой дистанции в 1,5 пиксела.
ПРИМЕЧАНИЕ Предлагаемые средства не позволяют поворачивать символы растровых шрифтов, поскольку предполагают выравнивание битового образа относительно осей х и у буфера кадров. Также не поддерживается масштабирование битовых образов. Выбор цвета для битового образа Вы уже знакомы с командами я1601ог'() и я11лпех*() для установки текущего шгета или его индекса на примере геометрических примитивов.
Те же самые коинды используются для задания значений переменных 6С СОКЙЕИТ КА5ТЕР (0(ОВ и 6С СОККЕМТ ИА5ТЕК 1ИОЕХ, отображающих битовые образы. Параметры состояния цвета растра определяются значением текущего цвета с помощью вызова я1йаз(егроз*(), и для нас это — подвох. Ответим на вопрос, каким окажется цвет битового образа в следующем фрагменте кода? »1(о)огзт(1.0. 1.В, 1.0); Г" белий (Паз(егРо»3(ч(ро»(т»ол); 1!(о!огзт(1.В, 0.0, 0.0); Г' красный */ я(вывар(....): Эго может быть неожиданным для вас, но он — белый. Это значение было присвоено параметру состояния 6С СОйкЕМТ ЙА5ТЕР СОСОК при вызове 61йазтегРозЗУч().
Второй вызов — 6160\огЗТ() — изменил значение 6( СОККЕМТ СОСОК в расчете яа обработку геометрических примитивов, но вовсе не цвет битового образа. Узнать значение текушего цвета растра или его индекса можно, воспользовавшись командой я16етЕ1оатч() пли я16е(1лтеяегч() с указанием 6С СОЙКЕМТ кА5ТЕй СОСОК или 61 СцййЕИТ КА5ТЕй 1МОЕХ в качестве первого аргумента. Шрифты и списки отображения Вобщем и целом списки отображения были рассмотрены в главе 7. Тем не менее кть несколько команд управления списками отображения, более уместных при 266 Глава 8 ° Вывод пикселов, битовых образов, шрифтов и изображений обработке строк символов.
При чтении этого раздела имейте в виду, что все представленные здесь идеи в той же мере применимы не только к битовым образам, но и к геометрическим примитивам — точкам, линиям и многоугольникам. (См, раздел «Выполнение составных списков отображения» главы 7, как пример геометрически описываемого шрифта.) Шрифт обычно состоит нз набора символов, идентифицируемых номерами (как правило, АЗСП-кодом). Для стандартной АЗСП-таблицы заглавная буква А имеет номер 65,  — 66 и т. д. Строка «1)АВ» представляется тремя индексами — 68, 65, 66. В простейшем приближении список отображения с номером 65 рисует букву А, с номером 66 — букву В и т. д, Чтобы вывести строку с кодами 68, 65, 66, нужно просто выполнить соответствующие списки отображения.
Вы можете использовать команду 816 а1!ьа вгз () несколькими способамп: уоап Х1са11Ш»1»(6(а(ае! п, 6(еооа Суре, СОО»1 6суо1о '11»га): Здесь первый аргумент, и, указывает количество символов для рисования, гуре— обычно 6( ВУТЕ, а 1ыГз — массив кодов символов. Поскольку многие приложения требуют отображения строк символов различными шрифтами и с разными размерами, этот самый простой подход неприемлем. Вы бы наверняка хотели выводить букву А по ее колу вне зависимости от активного на данный момент шрифта.
Нельзя ассоциировать буквы А, В и С одного шрифта с кодами 1065, 1066, 1067, а другого шрифта — с кодами 2065, 2066, 2067, так как индекс ограничен числом 256 по причине 8-разрядности байта. Лучшее решение — добавить смещение к каждому элементу строки перед выбором списка отображения. В этом случае можно было бы воспользоваться предыдущими цифрами, Так, чтобы вьшести символы шрифта 1, нужно запать смен(ение 1000 и обратиться к спискам с номерами 65, 66 и 67. Чтобы отобразить ту же строку шрифтом 2, можно задать смешение 2000 и воспользоваться темп же списками, Чтобы установить смещение, используйте команду 81Е(зсВазе(). Для предшествующего примера она должна быть вызвана со значением 1000 пли 2000 в качестве аргумента (единственного).
Теперь вы нуждаетесь только в списке последовательных неиспользуемых индексов, который предоставляет вызов к16ео(1 эгэ (): 6(о)пг Х16епс(»Г»(6(а~ге~ гапке); Эта функция возврашает блок из галде идентификаторов. Они помечаются как «используемые», даже если списки пока пустые, с той целью, чтобы дальнейшие вызовы к16епЕ1эгз () не возвращали больше эти номера (пока вы явно не отмените это действие). Поэтому, если вы используете 4 как аргумент и если к16епь(згз () вернула 81, вы можете присвоить своим спискам отображения номера 81, 82, 83 и 84.
Если 816еп()з ге () не находит свободного диапазона требуемой длины, она возвращает О. (Заметьте, что команда к1пе1егее(згз () позволяет быстро удалить все списки, связанные со шрифтом, одним действием.) В большинстве американских и европейских шрифтов количество символов невелико (меньше 256), поэтому такие символы представимы однобайтовыми индексами. В отличие от них, азиатские шрифты требуют объемных наборов символов, и для них кодирование «байт-на-символ» не представляется возможным. Битовые образы и шрифты 267 ОрепОЕ поддерживает строки, составленные из 1-, 2-, 3- или 4-байтовых симво- лов, посредством задания аргумента Фуре функции а16а111(ага(). Этот пара- метр может принимать следующие значения: 61 ОМ516МЕО ВУТЕ 61 ОН516мео 5ноат 6С ОМ516МЕО 1МТ 6Е 2 ВУТЕ5 6С 4 ВУТЕ5 61 ВУТЕ 61 5НОМТ 61 1МТ 6С ЕСОАТ 6С 3 ВУТЕ5 (См.
раздел «Вьсполнение составных списков отображения» главы 7 для получе- ння более подробной информации.) Описание и использование полного шрифта Команда 61В(саар() в сочетании с механизмом списков отображения, о котором говорилось в предыдущем разделе, облегчает задачу описания растровых шрифтов.
В листинге 8.2 представлены символы шрифта в кодировке АБСП и в верхнем регистре. В этом примере все символы имеют одинаковую ширину, но так бывает не всегда. После определения символов программа печатает сообщение «ТНЕ Я()]СК ВВОЪ]х] ГОХ 31)МРБ ОЧЕК А ЕАКУ Е)ОО.» Код из листинга 8.2 напоминает пример с буквой Г, за исключением того, что каждый битовый образ хранится в своем собственном списке. Когда вы добавляете смещение, возвращенное функцией а16епс(зсз(), идентификатор списка отображения равен АБСП-коду символа. ~е се л- жение символов полного шрифта; (оп(.с Охоа, Охоо, Охоо, Ох00. Охоо, Эх00, Охоо, Охоа, Ох06); |а- лк ~ие ле.д'и но- уе- ля не ИН лво" ~ым. обра Охоо, (](13] ОхсЗ, Ох1«, Ох7е, Эх1с, Эх(1, Охсо, Ох7е, ЭхсЗ, ах7«, Ох7с, ОхсЗ, Эх(1, ОхсЗ. Охс7. Ох7е, Охсо.