Управление видеостраницами




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

SetVisualPage(Page: Word)

которая устанавливает «видимой» на экране видеостраницу номер Page, и процедура

SetActivePage(Page: Word) {454}

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

На рис. 19.30 показан типичный пример использования этих процедур.

(* Пример только для адаптеров EGA и VGA!!! *) USES Graph, CRT; { используется Graph и CRT } {$I initgraf.pas} { процедура инициализации } PROCEDURE Forms(kadr:Byte); { рисование кадров 0..3 } CONST Radius: Array [0..3] of Integer = (20, 40, 60, 80); VAR r, rr: Integer; { радиусы эллипсов в кадрах } BEGIN r:= Radius[kadr]; { максимальный радиус } rr:= 0; { радиус вложенного эллипса } repeat Ellipse(GetMaxX div 2,GetMaxY div 2, 0, 360, r, rr); Inc(rr, 5) until rr>=r; END; PROCEDURE AnimEGAVGA; { процедура смены кадров } CONST ms = 60; { задержка между кадрами, мс } VAR i: Byte; { параметр циклов смены } BEGIN Repeat { цикл до нажатия клавиши... } for i:=0 to 3 do begin { Смена видеостраниц: прямо } SetVisualPage(i); Delay(ms) end; for i:=3 downto 0 do begin {... и обратно } SetVisualPage(i); Delay(ms) end; until KeyPressed; { условие окончания показа } END; VAR (* ОСНОВНАЯ ЧАСТЬ ПРИМЕРА *) i: Byte; { параметр (номер кадра) } BEGIN GrInit; { инициализация графики } SetGraphMode(EGALo); { режим EGA, 640x200, 4 стр. }

Рис. 19.30 {455}

for i:=3 downto 0 do begin { Цикл заполнения страниц: } SetVisualPage(Succ(i) mod 4); { Видим "пустоту" } SetActivePage(i); {и готовим кадр } Forms(i) { рисунок кадра } end; {for} AnimEGAVGA; { начало "оживления" кадров } CloseGraph { закрытие режима графики } END.

Рис. 19.30 (окончание)

Здесь показано использование процедур SetActivePage и SetVisualPage для алгоритма «кадровой» мультипликации. Особенность ее заключается в том, что все кадры (здесь их четыре) сначала записываются на соответствующие страницы, а затем производится последовательное переключение отображения страниц на дисплей процедурой SetVisualPage.

Графические окна

В системе BGI-графики вводится термин «viewport». Точного аналога этого слова в русском языке нет, если не считать заимствования «вьюпорт». Специальный словарь дает следующее разъяснение: «вьюпорт — это область просмотра, окно экрана, в компьютерной графике — часть пространства отображения, в которой изображается и просматривается часть моделируемого объекта». Мы будем использовать термин «графическое окно». При образовании графического окна получается как бы «экран в экране» заданного размера. В модуле Graph для описания графического окна объявлен следующий тип и две константы:

TYPE

ViewPortType = RECORD

X1, Y1, X2,Y2: Integer; { границы окна }

Clip: Boolean; { режим отсечения }

END;

CONST

ClipOn = True; { отсечение по границе окна включено }

ClipOff = False; { отсечение по границе окна выключено }

Здесь первые элементы записи — это координаты прямоугольной области (графического окна), как их принято задавать, a Clip — это параметр, указывающий графической системе, что делать с изобра-{456}жением, попавшим за пределы этой области. Clip может принимать два значения. Значение ClipOn указывает на то, что все элементы изображения (например, линия line(X3, Y3, X4, Y4) на рис. 19.31) обрезаются по границам графического окна, a ClipOff указывает на то, что все рисуется без изменений, как бы «не глядя» на границы окна.

 
──────────────────── ─ ─ ─ ─

(0, 0) (GETMaxX, 0)

 

 

(X1, Y1)

 

(X3, Y3)
(X2, Y2)
(X4, Y4)

 

 

(0, GetMaxY) (GetMaxX, GetMaxY)

Рис. 19.31

Объявление графического окна производится процедурой

SetViewPort(Х1, Y1, Х2, Y2: Integer; ClipMode: Boolean)

где входные параметры соответствуют полям записи типа ViewPortType. После выполнения этой процедуры все текущие установки станут относиться к окну. Текущий указатель (графический курсор) установится в его левый верхний угол, и туда же переносится начало системы координат устройства. Другими словами, мы получим локальную систему координат устройства. Если параметры процедуры заданы неправильно, то функция GraphResult возвратит ошибку grError (‑11).

Назначение графического окна можно использовать для перемещения начала системы координат. Так, если задать окно вызовом

SetViewPort(GetMaxX div 2, GetMaxY div 2, GetMaxX, GetMaxY, ClipOff);

то получим систему координат с началом в центре экрана. При этом станет «видимой» адресация отрицательных координат. Графическое окно не меняет масштаба системы координат, а лишь выбирает систему отсчета адресуемых пикселов.

Для опроса текущих параметров графического окна служит процедура

GetViewSettings(VAR ViewSettings: ViewPortType) {457}

Если воспользоваться ею сразу же после инициализации графического режима, то обнаружится, что графическим окном является весь экран. Это говорит о том, что для системы безразлично, какое графическое устройство отображает результат, поскольку графическое окно представляет собой некоторый универсальный интерфейс между графической программной системой и графическим устройством вывода.

Для очистки рабочего пространства графического окна в модуле Graph существует специальная процедура

ClearViewPort

Она работает следующим образом:

1) устанавливает цвет заполнения равным текущему цвету фонда;

2) вызывает процедуру Bar с теми же значениями координат; что и у процедуры SetViewPort, вызванной перед этим;

3) перемещает текущий указатель в точку (0, 0).

Несмотря на то, что понятие графического окна является общим для всех процедур и функций, одна процедура все же работает не по правилам: процедура PutImage в силу особенностей программной реализации работает одинаково как для значения параметра Clip, равного ClipOn, так и для ClipOff. Помните об этом, и обязательно проверяйте в программе условия помещения всего изображения в графическом окне.

Вывод текста

Вывод текста в графическом режиме имеет ряд отличий от подобных действий в текстовом режиме. Основное отличие состоит в том, что все действия производятся только со строковыми константами и переменными. Вся числовая информация должна предварительно преобразовываться в строковую (процедурой Str). Другое отличие — в том, что можно использовать различные шрифты.

Выбор шрифта и стиля

В комплектах поставки пакета Турбо Паскаль, начиная с версии 4.0, есть файлы с расширением.CHR. Это набор штриховых шрифтов, которые могут быть использованы для вывода информации. Поскольку они построены не матричным способом (как сделаны стандартные шрифты для текстового режима), а векторным, становятся возможными манипуляции размерами шрифтов без потери качества их изображения. {458}

Всего с пакетом Турбо Паскаль поставляется четыре шрифта (хотя можно, используя отдельный специальный пакет, самостоятельно расширить их набор). Кроме того, доступен системный матричный шрифт 8x8 для графических режимов (всегда доступны символы с ASCII-кодами от 0 до 127 и символы с кодами от 128 до 255 при условии, что их матрицы загружены в память ПЭВМ). Для обозначения этих пяти шрифтов введены константы:

CONST

DefaultFont = 0; { матричный шрифт 8x8 (по умолчанию) }

TriplexFont = 1; { полужирный шрифт }

SmallFont = 2; { светлый шрифт (тонкое начертание) }

SansSerifFont = 3; { книжная гарнитура (рубленый шрифт) }

GothicFont = 4; { готический шрифт }

DefaultFont — это уже упоминавшийся матричный шрифт 8x8. Если не принимать никаких действий по смене шрифта, то будет принят именно он.

Активизация любого из названных шрифтов осуществляется процедурой

SetTextStyle(Font, Direction: Word; CharSize: Word)

Здесь параметр Font — номер шрифта (например, одна из описанных выше констант), Direction — расположение текста (по умолчанию принимается горизонтальное). Возможны лишь две ориентации текста, обозначенные константами:

CONST

HorizDir = 0; { горизонтальная, слева направо }

VertDir = 1; { вертикальная, снизу вверх }

При значении Direction, равном VertDir, все символы будут повернуты против часовой стрелки на 90° и выводятся снизу вверх. Однако на самом деле есть еще один вариант регулирования направления шрифтов. Если задать Direction=2, то буквы будут повернуты так же, как и при Direction=VertDir, но вывод строки будет производиться горизонтально, слева направо.

Размер каждого символа устанавливается параметром CharSize, диапазон изменения которого составляет от 1 до 10. Стандартное значение CharSize для матричного шрифта 8x8 равно единице, а для штриховых шрифтов — четырем. Однако это можно не запоминать: достаточно передать в CharSize значение 0, и шрифт будет выводиться в стандартном размере. Чтобы продемонстрировать, как влияет этот параметр на размер изображения, можно задать CharSize=2 для {459} шрифта DefaultFont, и на экран будет выведен символ в матрице 16x16. Штриховые же шрифты задаются по-другому: в некоторой единичной системе координат описывается последовательное прохождение контура, образующего символ. Поскольку координаты каждой следующей точки контура заданы относительно предыдущей, то и модификация шрифта (увеличение, расширение и т.п.) производится простым умножением этих координат на соответствующее число.

При каждом вызове процедурой SetTexStyle какого-либо шрифта он читается с диска и загружается в память. Это обстоятельство вносит некоторые сложности. Во-первых, если программа использует штриховые шрифты, необходимо, чтобы файлы соответствующих шрифтов находились в известном каталоге совместно с BGI-файлами. В противном случае, не найдя их, система будет использовать DefaultFont, т.е. матричный шрифт 8x8. Во-вторых, при быстром переключении между несколькими штриховыми шрифтами будет происходить задержка программы на время, необходимое для считывания соответствующего шрифта с диска. Это случается потому, что в рабочей памяти может храниться только один штриховый шрифт. Чтобы определить результат чтения файла шрифта с диска и загрузки его в память, можно проверить значение функции GraphResult. Перечень значений, возвращаемых ею в этом случае, приведен в табл. 19.6.

Таблица 19.6

GraphResult Смысл значения
  Успешное выполнение операции
-8 Файл CHR не найден
-9 Не хватает памяти для загрузки выбранного шрифта
-11 Ошибка графики
-12 Ошибка ввода-вывода
-13 Неправильное содержимое файла шрифта
-14 Неправильный номер шрифта


Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-11-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: