М. Ву, Т. Девис, Дж. Нейдер, Д. Шрайнер - OpenGL. Руководство по программированию (Библиотека программиста) (2006) (1124363), страница 57
Текст из файла (страница 57)
Те же самые коинды используются для задания значений переменных 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е, Охсо. Ох31, ЭхсЗ, Листинг 8.2. От 6ШЬуСе »расе(] (ахОО, Охоа, 6С«ЬуСе 1еССегс (ОхОЭ, Охао, (Эх00, Ох00, (Эх68, Охоо, (ахаа, Эхоо, (Эхаа, ОхОО, (Ох00, Охоо, (Ох00, Охоо, (ахаО, Охао, (ахоо, охов, (Ох00, Охоо, (Эхоа, Охоо, (Эх90, Охоо, (ах60, Охао, (ах60, Охоо, (Охаа, Охао, (Эх09, Охоо, (ахоа. Охоо, (Ох60, ахоо. Охоо. = ( ОхсЗ, Охс7.
Охе7, Охсе, Охса, Охса, Охе7, ОхсЗ, ах(а, Охее, Эхса, Вхсо, ОхсЗ, Охс7, Охеу, ОксО, Охае, Охса, ОхсЗ. ЭхсЗ, Ох11, ОхсЗ. ЭхсЗ. Охсу, ЭхсО. Охсо, ОхсО, Охс7, ОхсЗ, Охсз, Охсо, Охсо, Охсо, ОхсО, Охсо, Охсо, ОхсЗ, ОхсЗ, ахс1, ОхсЗ, ОхсЗ, ОхсЗ, Ох16, Ох18, Ох19, Охса, Охоб, Эхаб, Охсс, Охда, Эх19, Охсо, Охса, ЭхсО, ОхсЗ, ОхсЗ, ОхсЗ, Охс1, Эхс1, Охд1, ОхсЗ. ЭхсЗ, ОхсЗ. Эхса. Охсо, Охсо, Эхд1, ОхдЬ, ОхсЗ, Эхсс, Охда, Ох10, ОхсЗ, ОхсЗ, ОхсЗ, Ох1«.
Охс7, ОхсЗ, Охсо, Охса, Охсо, ОхсЗ, ЭхсЗ, ОхсЗ. Эх1с, Охсо, ОксО, Эхса, Ох1с, ОхсО, Эхсо, Охсо, Охсо, Эх11, ОхсЗ, ОхсЗ, ах(а. Охса, Охса. Охоа, Ох06, Охаб, Охео, Ох10, Вхда, Охсо, Эхсо, Охсо, ОхсЗ, ОхдЬ, ах11, Охдь. Ох(Ь, Ох13, ОхсЗ, ОхсЗ. ЭхсЗ, Ох1е, Эхс7, 8хсЗ, ОхсЗ, ЭхсЗ, ЭхсЗ, Ох1е, Эхс7, ОхсЗ.
Охаб, ОхЗс, Ох16), ОхсЗ, Эхс7, Охге], Охса, Охе7, Ох7е), Охс7, Эхсе, Эхгс), Охса, Охсо, Эхгг], 8хса, Эхсо, Ох11), Охса, 6хе7, Ох7е], ОхсЗ, ОхсЗ, ОхсЗ), Эх18. Ох16. Ох7е). Вхоа, охоб. Эхоб), 8хсс, Охса, ЭхсЗ), Охсо, Охса, Охса), Эх(1, Охе7, ахсЗ), Ох13, ОхеЗ, ОхеЗ), ОхсЗ, Охе7. Эх7е], ОхсЗ, Эхс7, Эхге), ОхсЗ. ахба, ОхЗс), ОхсЗ, Эхс7, Ох1е], продолж»нов Ф Листинг 8.2 (лродолженое) (вхво, Охав, Охте, вхе7, Охоз, вхвз, вх07, (вхоо, Охоо, Ох18, Ох18, Ох18, вх18, Ох18, (вхво, Охав, Ох7е, вхе7, Охсз, вхсз, Охсз, (вхво, Охво, Ох18, вхзс, Охзс, Охбб, Охбб, (вхво, Охав. Охсз, вхе7, Ох!!, Ох!!, ОхбЬ, (вхоа, 9хвв, Охсз, Вхбб, Охбб, вхзс, Охзс, (вхвв, вхвв, Ох18, Ох18, Ох18, вх18, Ох18, (вхоо, Охав, Ох!!, Охсо, Охсо, вхбО.
Охзо, ): 61отпС !опто!Гав(; чотб шахейаз(егтопС(чотб) ( 61итпС т, ]; б]Р(хе]5Соге((6С ОМРАСК АС]6МНЕМТ, 1); гоп!О(гзеС = В]бепС(з(з(128); тог (! = 0,) = 'А'; ! < 26; !ьь,)++) 81МеиС(зС(сопСОссзес + ), 61 СОНР1СЕ В]В(Свар(В, 1З, О.в, 2.9, 1О.О, О.О, 81ЕпбС(зС(): Охсо, Охов, Охег, Ох7е), Ох18, Ох18, Ох18, Охт!).
охсЗ, охсЗ, охсЗ, вхсЗ), Охсз, Охсз, Охсз, Охсз). ОхсЗ, ОхсЗ, Охсз, ВхсЗ), Охзс, Охбб, Охбб. Вхсз), Охзс, вхбб, Охбб, Вхсз). Охов, Охоз, ОхОЗ, вхт!) Ох7е, Охев, Ох18, Ох18, Охсз, Охсз, Охсз, Охсз, ОхбЬ, Охсз, Ох18, Охзс, Ох18, вхзс, Ох7е, вхвс, ): 1еттегз(т]); ) 81МЕИС(ЗС((ОПСОс(ЗЕС + ' ', 61 СОНР1СЕ); 818(Свар(В, 13, 0.9, 2.8, 10.0, 0.9, зрасе); 81Епб!.! зС(); чо!б !п(С(чо!б) ( 815Пабеиобе1(6С РСАТ); шахейазСегяопС(): ча(б ргтп15(гтпб(спаг 'з) ( 81РовПАССг!Ь(6С С15Т 81Т); 811!в!Вазе(гоп!о!свет); 81са11стзсз(зсг1еп(з), бс ОН516ме0 Вчте 81РорАССг!'Ь(); /' Все, что находится выше этой строки, мо " описывающей шрифт. Чтобы зто сдепать, в команду шахейазтегтопт() перед тем, как г/ чотб бтзр]ду(чотб) ( 6С(1оаС нп!Се(3] = ( 1.0, 1.0, 1.0 ); (6СоЬу(е *) з); гпо бы размещаться в бибпиотеке, ы можете вызвать обратиться к ргтпс5сгтпв() б]С]еаг(6С СОСОК ВОРРЕК В]т); 81Со1огзгч(нп! Се); 81йаз(егроз2т(20, 60); Рг(п15(г(пб("ТНЕ 001СК ВКОИМ РОХ ЗОНР5"); 81йаз(егРозг((29, 48); рг(ПС5(г(пб("ОЧЕК А САЗУ 006"); 8]Р]озп(); ) 268 Глава 8 ° Вывод ликселов, битовых образов, шрифтов и изображений Изображения 269 Изображения Изображение — это почти что битовый образ, с той разницей, что вместо одного бита на пиксел прямоугольной области экрана изображение может содержать больше информации.