Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Гущин_SDL.pdf
Скачиваний:
164
Добавлен:
17.03.2018
Размер:
1.09 Mб
Скачать

А.Н. ГУЩИН

ПРИМЕНЕНИЕ БИБЛИОТЕКИ SDL ДЛЯ РАЗРАБОТКИ ПРОГРАММ НА ЯЗЫКЕ C

Министерство образования и науки Российской Федерации Балтийский государственный технический университет «Военмех» Кафедра информационных систем и компьютерных технологий

А.Н. ГУЩИН

ПРИМЕНЕНИЕ БИБЛИОТЕКИ SDL ДЛЯ РАЗРАБОТКИ ПРОГРАММ НА ЯЗЫКЕ C

Учебное пособие

Санкт-Петербург

2014

УДК 004.432(075.8)

Г98

Гущин, А.Н.

Г98 Применение библиотеки SDL для разработки программ на языке C: учебное пособие / А.Н. Гущин; Балт. гос. техн. ун-т. – СПб., 2014.

– 118 с.

ISBN 978-5-85546-833-5

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

SDL-1.2.15, SDL_draw-1.2.13 и SDL_ttf-2.0.11 2,

построение графиков функций на дискретных графических дисплеях.

Предназначено для студентов всех специальностей и направлений, изучающих дисциплину «Программирование на языке высокого уровня (С/С++)».

УДК 004.432(075.8)

Р е ц е н з е н т ы : канд. техн. наук, проф., ст. науч. сотр. научно-исследовательской лаборатории Военного института (дополнительного профессионального образования)

ВУНЦ ВМФ «Военно-морская академия» А.Г. Кушнарев; канд. техн. наук, доц. БГТУ С.Г. Толмачев

Утверждено редакционно-издательским советом университета

ISBN 978-5-85546-833-5

А.Н. Гущин, 2014

 

БГТУ, 2014

Введение. Работа с клавиатурой и дисплеем

Потоковый (консольный) ввод-вывод. Самой простой мо-делью, восходящей к терминалам с использованием вместо дисплея электрических пишущих машинок, является модель потокового посимвольного ввода-вывода, когда все, что выводится на экран, рассматривается как один поток вывода, а все, что пользователь вводит с клавиатуры, – как один поток ввода. При этом у программиста имеются ограниченные возможности по расположению символов на экране: кроме последовательного вывода с переносом не помещающихся в строке символов на следующую строку возможен лишь вывод символов горизонтальной табуляции вперед, перевода строки и возврата курсора на начало строки («возврата каретки»), а также, в некоторых системах, вертикальная табуляция вниз и «прогон формата» – очистка экрана. Все эти возможности также восходят к управляющим последовательностям для терми-налов на основе печатающих машинок. При вводе информации пользователь сначала подготавливает данные с помощью предо-ставляемого ему однострочного текстового редактора и лишь по готовности подтверждает ввод нажатием определенной клавиши (как правило, «Ввод» или «Enter»). Программа же в это время, как правило, приостанавливает выполнение до получения данных от пользователя.

Достоинствами данной модели являются ее простота и возмож-ность реализации ограниченными аппаратными средствами. Имен-но такая модель принята в стандарте C89 языка программирования C. Она реализуется функциями для работы с файловыми потоками stdin и stdout, объявленными в заголовочном файле <stdio.h>.

Недостатки данной модели – ограниченность предоставляе-мых программисту выразительных возможностей при выводе информации (раскраска текста осуществляется «настройками терминала», т.е. средствами операционной системы (ОС), внешними по отношению к программе), а также невозможность непосред-ственного реагирования на нажатие тех или иных клавиш до ввода подготовленных данных для программы. Более того, данная модель не предполагает использования других устройств, предназ-наченных для ввода информации, таких как указательные устрой-ства типа «мышь» или «сенсорная панель».

Псевдографический пользовательский интерфейс. При рас-пространении цветных текстовых дисплеев и их контроллеров, позволяющих задавать атрибуты отдельных знакомест на дисплее, была разработана другая модель взаимодействия с пользователем – псевдографический пользовательский интерфейс. Еще одним фактором, способствовавшим ее распространению, было внедре-ние в широко распространенных контроллерах дисплеев расши-ренных символьных наборов и появления в ОС возможности заменять предопределенные наборы символов (разумеется, при соответствующей поддержке со стороны контроллера дисплея).

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

Характерными современными представителями программ, использующих данную модель взаимодействия с пользователем, являются файловые менеджеры FAR (ОС Windows) и mc (Midnight Commander для ОС семейств Linux, FreeBSD, OpenBSD и т.п.).

3

Непосредственная поддержка данной модели в стандарте C89 языка С отсутствует, для ее использования в программах необхо-димы либо средства конкретной операционной системы, либо сторонние переносимые между операционными системами биб-лиотеки, например такие, как ncurses.

Графический пользовательский интерфейс. Появление масссовых дисплеев и соответствующих им контроллеров, способных работать не только в текстовом, но и в графическом режиме, привело к более широкому, чем ранее, распространению графических пользовательских интерфейсов. Однако для многих распространенных персональных компьютеров (например, IBM PC-совместимых) основным режимом работы, используемым при включении и выполнении системных программ, долгое время оставался текстовый режим. То есть за переключение дисплея в графический режим должна была отвечать каждая программа самостоятельно, как и за обратное переключение перед завер-шением своей работы. Впоследствии, с распространением на пер-сональных компьютерах псевдомногозадачных и многозадачных ОС с собственным графическим пользовательским интерфейсом, за данное переключение стали отвечать сами ОС, исходя из своих потребностей и запросов выполняющихся под их управлением программ.

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

Независимо от конкретной реализации модель графического пользовательского интерфейса предполагает предоставление программе некоторой области вывода (в однозадачных ОС или, при явном указании, соответствующей всему физическому дис-плею). В пределах данной области имеется возможность как программно устанавливать атрибуты каждого минимального физического (определяемого сочетанием дисплея, его контроллера и установленного с помощью драйвера видеорежима) элемента изображения – пикселя (pixel – от PICture ELement), так и, во мно-гих системах, получать текущие значения атрибутов пикселя. В отличие от атрибутов знакомест в псевдографическом пользова-тельском интерфейсе у пикселя существует единственный атрибут – его цвет.

Наиболее распространенные в настоящее время устройства отображения графической информации для построения пользова-тельского интерфейса персональных компьютеров (мониторы или дисплеи), независимо от конкретной используемой технологии, можно рассматривать как прямоугольную матрицу светящихся пикселей, имеющих прямоугольную форму. Координаты пикселей по горизонтали и вертикали могут быть однозначно заданы целыми числами от нуля до N – 1, где N – число физических пикселей по горизонтали и вертикали соответственно (часто называемые соответственно горизонтальным разрешением или

разрешением по горизонтали и вертикальным разрешением или разрешением по вертикали, а

обозначение вида M×N, где M – горизонтальное разрешение, N – вертикальное разрешение, часто называют просто разрешением монитора). Кроме координат, для построения изображения на таких устройствах вывода необхо-димо задать состояние каждого пикселя.

Следует отметить, что первые использовавшиеся для построе-ния графических изображений мониторы были построены на основе электронно-лучевых трубок (ЭЛТ, или Cathode-Ray Tube – CRT), аналогичных телевизионным, и физически не могли под-держивать постоянное заданное состояние всех пикселей на экра-не. Видимость неизменного изображения на подобных мониторах создается последовательным «включением» пикселей на заданную яркость свечения в пределах каждой отдельной строки (как правило, слева направо) с дальнейшим переходом на следующую строку (как правило, сверху вниз) и так до засветки всех пикселей на экране, после чего процесс повторяется. При этом отображение всех пикселей на экране происходит столь быстро, что боль-шинство людей не успевает заметить погасание первого пикселя на мониторе прежде, чем он будет засвечен снова. Частота, с кото-рой происходит обновление всего экрана (сколько раз за одну секунду формируется полное изображение на экране), получила название частоты кадровой развертки. Частота, с которой проис-ходит обновление отдельной строки (сколько строк отображается за одну секунду, независимо от их принадлежности к различным кадрам), получила название частоты строчной развертки. Соответственно требуемое состояние

4

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

Впростейшем случае пиксель может иметь только два сос-тояния: «выключен» (не светится)

и«включен» (светится с яр-костью, определяемой настройками монитора, цвет свечения определяется конструкцией монитора). Для кодирования состоя-ния такого пикселя достаточно одного бита, поэтому можно сказать, что «глубина цвета составляет 1 бит на пиксель или 1 bpp (bits per pixel)». Принято считать, что выключенное состояние пикселя соответствует черному цвету, а включенное – белому, однако на практике создать абсолютно черный в выключенном состоянии (поглощающий весь падающий свет) и абсолютно бе-лый во включенном состоянии (излучающий равномерно хотя бы во всем видимом человеком диапазоне) невозможно. Тем не менее одно из названий подобных мониторов – «черно-белые», пусть даже белый цвет может быть зеленоватым или янтарным. В нас-тоящее время подобные мониторы, аппаратно поддерживающие только два состояния каждого пикселя, для универсальных персо-нальных компьютеров не встречаются. Однако подобный принцип формирования может использоваться в различных специальных приложениях.

Следующий способ формирования изображений – индиви-дуальное управление яркостью каждого пикселя. При этом, кроме двух крайних состояний – «выключен» и «включен на максималь-ную яркость», каждый пиксель может принимать одно из конеч-ного множества промежуточных состояний, соответствующих промежуточным значениям яркости. Поскольку цвет пикселя остается постоянным, аппаратно реализующие данный способ формирования изображений мониторы и соответствующие им видеоадаптеры получили название монохромных (одноцветных). Как правило, изображение на них формируется в оттенках серого цвета, но также встречаются варианты с оттенками зеленого и янтарного свечения пикселей. В настоящее время подобные мониторы для универсальных персональных компьютеров практи-чески не встречаются. Однако такой принцип формирования мо-жет использоваться в различных специальных приложениях, осо-бенно требующих высокого физического разрешения монитора для обеспечения четкости изображения, например в медицине.

Общее число потенциально возможных состояний пикселя определяется конструкцией монитора (возможностью физически управлять его яркостью), а максимальное количество фактически используемых состояний из потенциально возможных – совокуп-ностью аппаратных средств контроллера дисплея (дисплейного адаптера, видеоадаптера, «видеокарты»), его программного обес-печения (драйверов) и ОС. На каждом этапе формирования изо-бражения от собственно монитора до ОС можно сократить число используемых состояний. Теоретически возможна ситуация, когда, например, монитор может позволять задавать 4096 значений яркости пикселя (глубина цвета 12 бит на пиксель), но данный конкретный видеоадаптер может подавать на него управляющие сигналы, соответствующие только 256 значениям яркости от наименьшей до наибольшей (глубина цвета – 8 бит на пиксель), пропуская по несколько возможных значений между ними. Однако драйвер видеоадаптера может считать, что всего возможных зна-чений 64, выбирая только каждое четвертое (глубина цвета 6 бит на пиксель), а операционная система может не знать, как работать с 64 значениями яркости пикселя и выбирать из них только 16 (также каждое четвертое). Таким образом, понятие глубины цвета для монохромных мониторов может быть различным на физичес-ком и на программном уровне. Очевидно, что при задании мень-шей глубины цвета на программном уровне, при отображении на мониторе с большей глубиной цвета все пиксели с разными сос-тояниями будут различаться на мониторе по своей яркости. В противоположном случае, если программно задается большая глубина цвета, чем способен отобразить монитор, то часть пикселей с про-граммно заданными различными состояниями может отображать-ся на мониторе неразличимо.

Наиболее часто встречающиеся варианты программной глуби-ны цвета пикселей для монохромных изображений – 4, 8 и 16 бит на пиксель. Первое значение встречается достаточно редко, второе является наиболее распространенным, третье используется в спе-циальных случаях обработки изображений. Значения аппаратной глубины пикселей для наиболее распространенных монохромных мониторов, использовавшихся с персональными компьютерами, обычно составляло 8 бит на пиксель. Для специальных прило-жений глубина цвета определяется задачей.

Наиболее распространенный в настоящее время способ по-строения изображений на мониторах персональных компьютеров – индивидуальное управление яркостью и цветом каждого

пикселя. Поскольку создание светофильтра, по управляющему сигналу про-извольно

5

изменяющего спектральный состав пропускаемого света (пропуская только определенные участки видимого человеком спектра), весьма затруднительно, особенно с учетом размеров одного пикселя (десятые и сотые доли миллиметра), используются особенности восприятия цветов человеком. Они заключаются в том, что луч света некоторого цвета вызывает у подавляющего большинства людей такие же ощущения, как и собранные в один луч, например с помощью призмы, лучи света трех основных цветов с подобранным соотношением яркостей между ними. Такими основными цветами являются красный, зеленый и синий. По английским названиям этих цветов, соответственно red, green и blue, модель синтеза цвета светящейся точки из трех световых лучей основных цветов получила название RGB-модели или, сокращенно, RGB. Поскольку при этом происходит создание цветоощущения у человека за счет объединения воздействия трех различных цветов, а белый цвет требует объединения их в равных пропорциях на максимальной яркости, то такая модель называется аддитивной (от английского add – сложение).

При применении данного способа управления цветом пик-селей в мониторах для упрощения конструкции (чтобы не строить для каждого пикселя оптическую систему микроскопических размеров для сведения трех лучей света) используется другая особенность зрения человека – ограниченная способность к разли-чению близко расположенных объектов. Поэтому три монохром-ных источника света красного, зеленого и синего цветов, имеющих размеры в доли миллиметра и расположенных вплотную друг к другу, будут вызывать у подавляющего большинства людей те же ощущения, что и рассмотренный выше точечный источник света, полученный оптическим сложением трех соответствующих лучей. Данные источники света основных цветов, относящиеся к одному управляемому пикселю, получили название субпикселей. Таким образом, на аппаратном уровне управление яркостью и цветом одиночного пикселя монитора сводится к управлению яркостью свечения трех отдельных субпикселей основных цветов данного пикселя. При этом если все субпиксели выключены, то такое сос-тояние считают черным цветом пикселя, если все субпиксели включены на одинаковую максимальную яркость, – белым цве-том. Степень их соответствия собственно белому и черному цве-там определяется конструкцией, качеством изготовления и нас-тройками монитора. Если все субпиксели имеют некоторое одина-ковое значение яркости, промежуточное между максимальной и выключенным состоянием, то пиксель воспринимается как имею-щий оттенок серого цвета. Если два из трех субпикселей выключе-ны, то пиксель имеет один из основных цветов и яркость, опре-деляемую третьим включенным субпикселем. Все остальные цве-та, которые сможет увидеть человек на экране монитора, соответ-ствуют оставшимся комбинациям яркостей субпикселей. Степени яркости субпикселей называют компонентами цвета, а сами ис-пользуемые основные цвета – цветовыми каналами. Часто эти понятия отождествляют.

Аппаратная (на уровне непосредственно монитора) глубина цвета пикселя для цветного изображения равна утроенной глубине цвета субпикселей. Например, если для каждого субпикселя можно установить 256 различных состояний яркости (обычно 0 – выключен, 255 – максимальная яркость), т.е. глубина цвета в каж-дом канале составляет 8 бит на пиксель, то глубина цвета собственно пикселя будет составлять 24 бита на пиксель. Это позво-ляет задавать для каждого пикселя более 16 млн различных сос-тояний. Практически все современные мониторы и их контроллеры (видеокарты) позволят работать с глубиной цвета 24 бита на пик-сель на максимально возможном для данного монитора и видео-карты разрешении. Для повышения скорости обработки изображений также используется и является сейчас самым распростра-ненным режим работы с глубиной цвета 32 бита на пиксель. Фактически это тот же режим работы с 24 битами на пиксель, где для

представления

одного

пикселя

вместо

3

байт

используются

4

байта,

составляющие

одно

машинное

слова

на

компьютерах

с

32-разрядной архитектурой. При обработке на 64-разрядных ком-пьютерах 4 байта составляют ровно половину машинного слова, что также позволяет проводить пересылку данных об одном пикселе за одну операцию или пересылать данные сразу о двух пикселях.

Широко распространенные ранее видеоадаптеры и мониторы для персональных компьютеров, позволявшие попиксельно выво-дить цветные изображения, использовали и другие способы кодирования цветов пикселей. Например, видеоадаптер CGA с соответствующим монитором позволял задать для каждого пикселя один из четырех цветов (глубина цвета 2 бита на пик-сель). При этом общее количество цветов, которые мог отобразить монитор, было больше. Поэтому из общего числа возможных цве-тов программно можно было выбрать (установить) одну из аппа-

ратно

заданных

четверок

цветов –

палитру.

При

этом

заданный

2 битами цвет пикселя являлся номером одного из цветов в палит-ре.

Видеоадаптер выбирал

6

фактический цвет для отображения пикселя исходя из установленной палитры и номера цвета в палитре. Причем при смене палитры изменялся цвет для всех пикселей на мониторе, поскольку монитор CGA был построен на основе ЭЛТ. Впоследствии для персональных компьютеров были разработаны другие видеоадаптеры и мониторы, позволявшие использовать 16 либо заранее предустановленных цветов, либо 16 цветов, выбираемых из предустановленной палитры, 256 предустановленных или выбираемых из предустановленной палитры цветов и др. Соответственно в разное время широко исполь-зовались варианты цветного изображения с глубиной цвета от 2 до 8 бит на пиксель, с явным или неявным использованием палитр цветов.

Существенное изменение в принципы формирования цветных изображений внесла разработка мониторов с аналоговым интер-фейсом к видеоадаптеру (VGA). При этом преобразование кода цвета пикселя в значение уровней яркости субпикселей по трем цветовым каналам и выработка сигналов синхронизации строчной и кадровой развертки были полностью переданы видеоадаптеру. Это позволило программисту, даже при кодировании цвета пик-селя 256 значениями, самостоятельно создавать используемую палитру – соответствие кода цвета пикселя значениям цветовых компонентов для отображения на экране, поскольку в монитор подавался аналоговый сигнал, соответствующий уровню яркости субпикселей между минимальной и максимальной. Также это позволило в дальнейшем увеличивать глубину цвета и разрешение изображения на экране монитора (до тех пор, пока оно не выходит за физические возможности монитора) только за счет увеличения объема памяти видеоадаптера, изменения его внутреннего устрой-ства и программного обеспечения для взаимодействия с ОС (драйверов). Однако на возможности по увеличению максималь-ных значений глубины цвета и разрешения также влияют произ-водительность процессора, общей памяти и возможности ОС. По мере увеличения данных параметров широкое распространение (в видеоадаптерах получивших общее название SVGA – SuperVGA) получили видеорежимы с общим название HiColor или HighColor, использующие глубину цвета 15 или 16 бит на пиксель. В обоих случаях цвет каждого пикселя кодируется одним двухбайтовым целым числом. В первом случае все компоненты кодируются пятью битами каждый (5 бит на цветовой канал), а оставшийся бит либо не используется, либо применяется для специальных целей конкретными приложениями. Во втором случае два из трех цве-товых компонентов также кодируются пятью битами на пиксель, а третий компонент (как правило, зеленый) – шестью битами на пиксель. Поскольку для каждого пикселя в явном виде задаются значения цветовых компонентов (их соотношение), то палитра для таких видеорежимов не требуется. Однако при этом используются не все цвета, которые может воспроизвести монитор. Для увели-чения числа воспроизводимых цветов до 16 млн были разработаны рассмотренные ранее видеорежимы с глубиной цвета 24 или 32 бита на пиксель, в которых использует по 8 бит на цветовой канал. Такие видеорежимы получили общее название TrueColor («Истинный цвет»).

В отдельных задачах компьютерной обработки изображений встречаются способы представления пикселей с глубиной цвета 30, 36 и 48 бит на пиксель (соответственно, 10, 12 и 16 бит на каждый цветовой канал), а также представление в виде 16или 32-разрядных вещественных чисел, где выключенному пикселю соответствует значение 0,0000, а максимальной яркости суб-пикселя данного цветового канала – 1,0000. Все промежуточные значения представляются дробными числами в данном диапазоне. Существуют и другие цветовые модели, отличные от RGB, особенности которых и области применения рассмотрены в специальной литературе. В любом случае, если после обработки изображения с некоторым разрешением и глубиной цвета его приходится выводить на устройство отображения с меньшим разрешением и/или с меньшей глубиной цвета, возможна потеря информации в видимом пользователем изображении, по сравне-нию с самим изображением как набором данных. В противо-положной ситуации пользователь получит всю информацию, но визуально изображение на устройстве вывода может восприни-маться как имеющее слишком маленький размер или слишком грубые очертания или неестественные цвета. Аналогичная ситуа-ция возникает, если при обработке изображения используется цве-товая модель, отличная от RGB, а устройство вывода работает именно с ней (например, монитор). Тогда, если невозможно поставить в соответствие каждому цвету в используемой цветовой модели изображения конкретный цвет из воспроизводимых данным устройством, цвет может исказиться, даже если число различных цветов совпадает или в изображении используется меньше цветов. Если в монохромном изображении используются 16 бит для указания различных оттенков серого (всего 65536 возможных различных состояний пикселя), то на цветном мониторе, способном отображать 256

7

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

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

Средства ввода в графическом режиме, как правило, пред-полагают возможность для программиста самостоятельно опре-делять, требуется ли отображение вводимых пользователем сим-волов на экране или же только нажатие конкретных клавиш. Аналогично модели псевдографического пользовательского интер-фейса, как правило, предоставляется и возможность ожидания нажатия клавиш, и возможность проверки без ожидания, нажата ли хоть какая-то клавиша в данный момент с последующим опре-делением, какая именно. В качестве расширения второго способа часто применяется (реализуется библиотеками или операционной системой) подход с назначением обработчиков событий – спе-циальных подпрограмм, вызываемых в случае нажатия клавиш, перемещения мыши и т.п. Конкретная реализация подобной реак-ции на события может быть различной и требует рассмотрения в рамках конкретных библиотек. Следует добавить, что аналогич-ный подход встречается и в модели псевдографического пользовательского интерфейса, но получил там несколько меньшее распро-странение.

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

1. Основные возможности библиотеки семейства SDL

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

Simple DirectMedia Layer (сокращенно SDL) – это свободная кроссплатформенная библиотека, реализующая единый интерфейс к графической подсистеме, устройствам ввода и звуковой подсистеме, официально поддерживающая операционные системы Linux, Microsoft Windows и Mac OS X на уровне как исходных текстов, так и скомпонованных библиотек, а платформы iOS и Android – на уровне исходных текстов. SDL написана на языке C и может использоваться программами на большом числе языков программирования с различными парадигмами, для многих из которых необходимые расширения предоставляются разработ-чиками библиотеки. Данная библиотека активно используется при написании кроссплатформенных мультимедийных приложений, в основном компьютерных игр. Основная часть SDL содержит лишь весьма ограниченный, базовый набор возможностей, а допол-нительные функции (такие, как графические примитивы или вывод текста) обеспечиваются расширениями библиотеки. Сле-дует отметить, что, начиная с версии 2.0 (для объединения всех версий SDL 2.x и отличия их от SDL 1.x часто используется обозначение SDL2), SDL распространяется по лицензии zlib, а не LGPL, что позволяет более свободно использовать ее в ком-мерческих программах. Однако еще не все расширения переве-дены на распространение под данной лицензией, поэтому в учебных целях будем считать, что все компоненты SDL (в том числе дополнительные, не входящие в основной комплект поставки) распространяются на условиях LGPL. Следовательно, программы,

8

написанные с ее использованием, должны или рас-пространяться с полными исходными текстами, или применять динамическую компоновку с программой модулей библиотеки SDL (с помощью

.dll в Microsoft Windows или .so в Linux).

Структурно SDL (как и большинство графических библиотек, например современные библиотеки-эмуляторы Borland Graphics Interface для многозадачных ОС) можно рассматривать как отно-сительно «тонкую» прослойку между конкретной прикладной программой и конкретными программными интерфейсами кон-кретных операционных систем для работы с соответствующей аппаратурой (например, при работе с графикой скрывать от разра-ботчика прикладной программы особенности работы с DirectX или GDI в Microsoft Windows, Xlib или framebuffer в Linux и т.п.). Основные возможности SDL – поддержка операций над двумер-ными плоскостями пикселей (включая создание окон), обработка событий (от клавиатуры, мыши и таймера), а также работа со звуком и абстрагирование доступа к файлам.

Далее будут рассматриваться только основные возможности SDL для работы с изображениями на двумерных плоскостях, а также базовые возможности ряда дополнительных библиотек, а именно SDL_ttf для вывода текста (от разработчиков SDL) и SDL_draw для вывода базовых графических примитивов, таких как линии, эллипсы и прямоугольники (от группы отдельных раз-работчиков). Поскольку еще не все они полностью поддерживают SDL2, а во второй версии SDL несколько изменена логика работы с окнами и поверхностями рисования (в том числе для поддержки многооконного режима и нескольких дисплеев), то работа с ними будет рассматриваться на примере библиотек предыдущего поко-ления, а именно SDL 1.2.15, SDL_draw

1.2.13 и SDL_ttf 2.0.11.

2. Начало работы с SDL 1.2.15, SDL_draw 1.2.13 и SDL_ttf 2.0.11 в интегрированной среде разработки Dev-Cpp 4.9.9.2

под управлением Windows XP

Предположим, что исходно имеется персональный компьютер под управлением операционной системы Microsoft Windows XP, на котором установлена среда разработки Dev-Cpp 4.9.9.2 для всех пользователей. При этом установка была произведена в каталог C:\Dev-Cpp\, в дальнейшем именуемый «каталогом среды разра-ботки Dev-Cpp», в качестве языка пользовательского интерфейса выбран русский и включена возможность анализа заголовочных файлов для поиска функций, классов переменных и т.п.

Предположим также, что для упрощения работы с архивами на компьютере установлен свободно распространяемый файловый менеджер FAR 3.0 с модулем расширения arclite для работы с архивами в форматах zip, tar и tar.gz.

Для подготовки среды разработки Dev-Cpp с библиотеками SDL 1.2 и возможности выполнения созданных приложений в дальнейшем вне среды разработки потребуются следующие сво-бодно распространяемые файлы:

SDL-1.2.15.zip – исходные тексты библиотеки SDL. Если не заниматься их сборкой, то из данного файла понадобятся лишь заголовочные файлы.

SDL-1.2.15-devel-1.2.15-mingw32.tar.gz – архив с файлами для разработки программ в окружении mingw32 (такое же исполь-зуется в Dev-Cpp), содержит уже собранную динамическую биб-лиотеку SDL.dll для программ, использующих Win32 API, а также необходимые для ее подключения статические библиотеки.

SDL_draw-1.2.13.tar.gz – исходные тексты библиотеки графи-ческих примитивов SDL_draw. Потребуется собирать библиотеку средствами Dev-Cpp, соответствующий проект входит в состав архива.

SDL_ttf-2.0.11.zip – исходные тексты библиотеки SDL_ttf. Если не заниматься их сборкой, то из данного файла понадобятся лишь заголовочные файлы.

SDL_ttf-2.0.11-win32.zip – архив с уже собранной динами-ческой библиотекой SDL_ttf для программ, использующих Win32 API и с используемыми ею другими динамическими библиотеками: libfreetyp-6.dll и zlib1.dll. К двум последним прилагаются файлы лицензий.

CharisSILR.ttf – свободно распространяемый шрифт, включающий символы русского алфавита.

9

Подключение

к

среде

разработки

Dev-Cpp

библиотеки

SDL-1.2.15:

 

 

 

 

 

 

1. Выделяем

в

архиве

SDL-1.2.15.zip

все

файлы

вида

SDL-1.2.15\include\*.h и копируем выделенные файлы в подка-талог \include каталога среды разработки Dev-Cpp.

2. Выделяем в архиве SDL-1.2.15-devel-1.2.15-mingw32.tar.gz все файлы вида SDL-1.2.15- devel-1.2.15-mingw32.tar\SDL-1.2.15 \lib\libSDL*.* и копируем три выделенных файла в подкаталог

\lib каталога среды разработки Dev-Cpp.

Пример создания проекта, использующего только биб-лиотеку SDL-1.2.15 с

динамическим связыванием:

 

 

 

 

1.

Создаем новый каталог для проекта, например C:\SDLtest.

 

 

2.

Запускаем

среду

разработки

Dev-Cpp,

создаем

новый

C-проект типа Console Application с именем, например SDLtest, сохраняем файл проекта

SDLtest.dev в каталоге C:\SDLtest.

3.В файле main.c вместо автоматически созданной заготовки текста программы вводим следующий текст:

#include <SDL.h>

int main(int argc, char *argv[]){ SDL_Surface *screen;

SDL_Event event; SDL_Rect dst;

if (SDL_Init(SDL_INIT_VIDEO)) return 1;

screen=SDL_SetVideoMode(640, 480, 32, SDL_ANYFORMAT); if (!screen){

SDL_Quit(); return 1;

}

dst.x = 10; dst.y = 10; dst.w = 50; dst.h = 50;

SDL_FillRect(screen, &dst, SDL_MapRGB(screen->format,0,255,0)); SDL_Flip(screen);

while(SDL_WaitEvent(&event)){ if(event.type == SDL_QUIT ||

(event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE))

{

SDL_Quit(); return 0;

}

}

SDL_Quit(); return 2;

}

4.Из архива SDL-1.2.15-devel-1.2.15-mingw32.tar.gz копируем файл SDL-1.2.15-devel-1.2.15- mingw32.tar\SDL-1.2.15\bin\SDL.dll в каталог с созданным проектом (C:\SDLtest).

5.В параметрах проекта (меню «Проект/Параметры проекта») на вкладке «Параметры» добавляем в столбец «Компоновщик» строку:

-lmingw32 -lSDLmain -lSDL

6. Собираем и запускаем проект по клавише F9, и он успешно запускается: в верхнем левом углу с небольшим отступом от края на черном фоне – ярко-зеленый квадрат. Выход из программы по нажатию клавиши Esc или щелчку по системной кнопке закрытия окна в его заголовке.

Подключение к среде разработки Dev-Cpp библиотеки SDL_ttf-2.0.11:

1. Из архива SDL_ttf-2.0.11.zip копируем файл SDL_ttf-2.0.11 \SDL_ttf.h в подкаталог \include

каталога среды разработки

Dev-Cpp.

2. Из архива SDL_ttf-2.0.11-win32.zip копируем файл SDL_ttf.dll в подкаталог \lib каталога среды разработки Dev-Cpp.

10

Пример создания проекта, использующего библиотеки SDL-1.2.15 и SDL_ttf-2.0.11 с динамическим связыванием:

1. Создаем новый каталог для проекта, например C:\SDLttftest.

2. Запускаем среду разработки Dev-Cpp, создаем новый C-проект типа Console Application с именем, например SDLttftest, сохраняем файл проекта

SDLttftest.dev в каталоге C:\SDLttftest.

3. В файле main.c вместо автоматически созданной заготовки текста программы вводим следующий текст:

#include <SDL.h> #include <SDL_ttf.h>

int main(int argc, char *argv[])

{

SDL_Surface *screen; SDL_Event event; TTF_Font *fnt = NULL; SDL_Color text_color; SDL_Rect dest;

SDL_Surface *text_surface = NULL;

/* Строка "Привет, Мир!" в кодировке utf8 */ char hello_world[]="Привет, Мир!"; if (SDL_Init(SDL_INIT_VIDEO))

return 1;

if (TTF_Init()) return 1;

if(!(screen=SDL_SetVideoMode(640,480,32,SDL_ANYFORMAT))){ TTF_Quit();

SDL_Quit(); return 1;

}

if(!(fnt = TTF_OpenFont("CharisSILR.ttf", 29))){ TTF_Quit();

SDL_Quit(); return 3;

}

dest.x = 200; dest.y = 100; dest.w = 1; dest.h = 1; text_color.r = 0; text_color.g = 0;

text_color.b = 255;

if(text_surface = TTF_RenderUTF8_Solid(fnt, hello_world, text_color)){ SDL_BlitSurface(text_surface, NULL, screen, &dest); SDL_FreeSurface(text_surface);

text_surface = NULL;

}

SDL_Flip(screen); while(SDL_WaitEvent(&event)){

if(event.type == SDL_QUIT || (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE))

{

TTF_CloseFont(fnt); TTF_Quit(); SDL_Quit();

return 0;

}

}

TTF_CloseFont(fnt); TTF_Quit(); SDL_Quit();

return 2;

11

}

4.Из архива SDL-1.2.15-devel-1.2.15-mingw32.tar.gz копируем файл SDL-1.2.15-devel-1.2.15- mingw32.tar\SDL-1.2.15\bin\SDL.dll в каталог с созданным проектом (C:\SDLttftest).

5.Выделяем в архиве SDL_ttf-2.0.11-win32.zip все файлы вида *.dll и копируем в каталог с созданным проектом (C:\SDLttftest).

6.В параметрах проекта (меню «Проект/Параметры проекта»), на вкладке «Параметры» добавляем в столбец «Компоновщик» строку

-lmingw32 -lSDLmain –lSDL –lSDL_ttf

7.Копируем файл CharisSILR.ttf в каталог с созданным проектом (C:\SDLttftest).

8.Собираем и запускаем проект по клавише F9, и он успешно запускается: на экран выводится ярко-синяя надпись «Привет, Мир!». Выход из программы – по нажатию клавиши Esc или щелчку по системной кнопке закрытия окна в его заголовке.

Сборка библиотеки SDL_draw-1.2.13 из исходных текстов:

1.Из архива SDL_draw-1.2.13.tar.gz копируем каталог SDL_draw-1.2.13.tar\SDL_draw-1.2.13 в

корень диска C: – получаем каталог C:\SDL_draw-1.2.13\ (диск C: приведен для примера; вместо него возможно любое другое расположение, но далее будет рассматриваться именно такой пример).

2.В каталоге C:\SDL_draw-1.2.13\Dev-Cpp\ открываем проект SDL_draw_static.dev.

3.Выполняем в среде разработки Dev-Cpp команду «Перестроить все» (меню «Выполнить/Перестроить все»). В каталоге C:\SDL_draw-1.2.13\Dev-Cpp\ появляется новый файл libSDL_draw.a (статическая библиотека). Закрываем проект.

4.В каталоге C:\SDL_draw-1.2.13\Dev-Cpp\ открываем проект SDL_draw_dynamic.dev.

5.В параметрах проекта (меню «Проект/Параметры проекта»), на вкладке «Параметры», в столбце «Компоновщик» заменяем вторую строку на следующую:

–lSDL

6. Выполняем в среде разработки Dev-Cpp команду «Перестроить все» (меню «Выполнить/Перестроить все»). В каталоге C:\SDL_draw-1.2.13\Dev-Cpp\ появляется новый файл SDL_draw.dll (динамическая библиотека). Закрываем проект.

Подключение к среде разработки Dev-Cpp библиотеки SDL_draw-1.2.13:

1. Из каталога C:\SDL_draw-1.2.13\include копируем файл SDL_draw.h в подкаталог \include

каталога

среды

разработки

Dev-Cpp.

 

 

2. Из каталога C:\SDL_draw-1.2.13\Dev-Cpp\ копируем файл SDL_draw.dll в подкаталог \lib

каталога

среды

разработки

Dev-Cpp.

 

 

Пример создания проекта, использующего библиотеки SDL-1.2.15 и SDL_draw-1.2.13 с

динамическим связыванием:

 

 

 

 

1.

Создаем новый каталог для проекта, например C:\SDLdrawtest.

 

 

2.

Запускаем

среду

разработки

Dev-Cpp,

создаем

новый

C-проект типа Console Application с именем, например SDLdrawtest, сохраняем файл проекта

SDLdrawtest.dev в каталоге C:\ SDLdrawtest.

3. В файле main.c вместо автоматически созданной заготовки текста программы вводим следующий текст:

#include <SDL.h> #include <SDL_draw.h>

int main(int argc, char *argv[])

{

SDL_Surface *screen; SDL_Event event;

if (SDL_Init(SDL_INIT_VIDEO)) return 1;

screen = SDL_SetVideoMode(640,480,32,SDL_ANYFORMAT); if (!screen){

SDL_Quit();

12

Соседние файлы в предмете Программирование