ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
Часть 10 9. Графическая плата Hercules ----------------------------------------------------------------- Данный раздел книги относится к Графической плате Hercules. Он позволит вам использовать набор расширенных команд Паскаля, описанный выше. Данная глава также представляет интерес для пользователей VGA, поскольку большинство плат VGA может выводить монохромную графику Hercules в графическом режиме IBM 7. Процедура MODEPSEUDOHERCULES была разработана для плат VGA в видео-режиме Hercules. 9.1 Процедуры для монохромных графических режимов ----------------------------------------------------------------- Ниже приводится листинг программы для активации монохромного графического видео-режима с разрешением 720*349 пикселей: Procedure ModePseudoHercules { Необходим модуля Turbo Pascal Graph.tpu } { Необходим файл Графического интерфейса Borland Herc.bgi } { Включает режим Hercules для расширенных плат VGA } procedure MODE(ModeHexNumber:integer); var Regs : Registers; { установка видео-режима } GraphMode, GraphDriver : integer; begin with Regs do begin { Подготовка AL,AH к прерыванию } AL := ModeHexNumber; { Переменная для видео-режима } AH := $00; { Функция: установка видео-режима } end; Intr($10,Regs); { Вызов прерывания HEX 10 } end; Procedure ModeHercules; { Инициализация графики } var GraphMode, GraphDriver : integer; begin GraphDriver := HercMono; GraphMode := HercMonoHi; Initgraph(GraphDriver,GraphMode,''); end; begin { Главное тело процедуры } Mode($7); { Включение режима IBM 7 } ModeHercules; { Режим монохромной графики Hercules } end; { Конец процедуры } 9.1.1 Монохромный графический режим Hercules и его инициализация ----------------------------------------------------------------- Turbo Pascal не требует новых методов программирования при работе в монохромных графических режимах графических плат IBM и платы Hercules. Причина состоит в том, что если в текущей директории имеется интерфейсная программа с расширением .BGI, то стандартная программа Паскаля PUTPIXEL доступна без всяких ограничений. Кроме того, графика должна инициализироваться посредством указания в операторе uses заголовка программы модуля GRAPH.TPU. Графический режим фактически активируется в главной программе или в подпрограмме. Следующий листинг относится к процедуре MODEHERCULES: Procedure ModeHercules; var GraphMode, GraphDriver : integer; begin GraphDriver := HercMono; GraphMode := HercMonoHi; Initgraph(GraphDriver,GrapMode,''); end; Данную процедуру можно встроить в любую программу. Вызов этой процедуры из главной программы командой "MODEHERCULES' делает доступными графические команды, включая желаемый видео-режим. Главная функция этой программы выполняется командой Паскаля INITGRAPH(...). Эта команда принимает в качестве параметров тип графической платы, желаемый графический режим и маршрут доступа к файлу графического интерфейса (если последний находится не в текущей директории). В случае монохромной платы Hercules и ее графического режима эта информация передается команде аббревиатурами HERCMONO и HERCMONOHI. Эти слова в Паскале зарезервированы. Аналогичные аббревиатуры существуют и для быстрого доступа к другим режимам IBM (MDA, CGA, EGA, MCGA и VGA). Вы также должны убедиться, что доступен необходимый файл Графического интерфейса Borland (с расширением .BGI). В случае платы Hercules это файл HERC.BGI. Он либо должен находиться в текущей директории, либо в программе должен быть задан маршрут к соответствующей директории. Если нужный .BGI-файл недоступен, программы графической инициализации не могут быть выполнены. В этом случае появится сообщение Turbo Pascal: "Graphic not initialized. Use initgraph" ("Графика не инициализирована. Воспользуйтесь initgraph"). После того, как модуль GRAPH.TPU указан в операторе "uses graph;" и использована команда установки видео-режима "INITGRAPH(ВидеоПлата, ВидеоРежим, Маршрут)", графические команды Паскаля будут доступны для использования. 9.1.2 Модификация программ VGA для платы Hercules ----------------------------------------------------------------- Не все пользователи имеют одновременно и плату VGA, и цветной аналоговый монитор. Однако, многие пользователи давно работают с монохромным режимом высокого разрешения Hercules. Данная конфигурация обычно не дает возможности пользователю использовать программное обеспечение для многоцветных режимов VGA и EGA. На первый взгляд может показаться, что программирования для VGA бесполезно с точки зрения пользователей монохромных плат, однако это не совсем так. Простой прием позволяет модифицировать набор расширенных команд Turbo Pascal т.о., чтобы он мог работать с монохромной платой Hercules. Пиксели, выводимые монохромными графическими платами, не могут быть изменены. Это означает, что истинная шкала серых тонов в данном случае недостижима, как и работа в цвете. Однако, мы можем моделировать шкалу серых тонов за счет использования для закрашивания изображения различных шаблонов штриховки. Это означает, что мы должны либо встроить эти шаблоны штриховки в процедуру рисования пикселей, либо объединять несколько пикселей т.о., чтобы они определяли одну растровую точку экрана. Поскольку определение более крупных растровых точек заметно снизит разрешение экрана, лучше пойти по пути встраивания шаблонов штриховки прямо в процедуру рисования пикселей. В следующей процедуре координаты x/y и номер цвета принимаются как значения типа integer. Допустимые значения координат в графическом режиме Hercules: от 0 до 720 по x и от 0 до 348 по y. Номера цветов допустимы от 0 до 255. Номер цвета далее обрабатывается процедурой. Младшие номера цветов имеют большую вероятность быть изображенными цветом 0 (черный). Старшим скорее будет присвоена 1 (белый). Номерам от 0 до 16 и от 241 до 255 всегда присваиваются черный и белый цвета, соответственно. Эти идеи отражает процедура PLOT(Hercules). Дополнительную информацию см. в ее листинге на дискете. 9.1.3 Палитра Hercules ----------------------------------------------------------------- Процедура PLOT() моделирует серые тона за счет шаблонов "штриховки", или, что более точно, за счет использования разной плотности точек. Имея возможность различения тонов, мы можем рассматривать эти различия как "цвет" и яркость. Выведя все эти серые тона последовательно друг за другом, мы получим очень полезную палитру, которая может лечь в основу дополнительных графических процедур. Хотя у нас и не будет 256 цветов режима VGA 19, мы все же получим утешительный приз в виде повышенного разрешения 720*348 монохромного режима. Такое повышенное разрешение частично компенсирует отсутствие цветов. Приводимая ниже короткая демонстрационная программа DEMOHERC выводит на экран в качестве "палитры" различные шаблоны штриховки (серые тона). Program DEMOHERC; uses crt,dos,graph,Hercules; var GraphMode, GraphDriver : integer Procedure ShowPalette; { Вывод палитры на экран } var x,y,Color:integer; { Определение переменных } begin { Точки с одинаковым оттенком серого } outtextxy(1,20,'Режим: Монохромная графика Hercules/режим IBM 7'); for Y := 100 to 200 do begin { рисование строками, сверху-вниз } for X := 0 to 720 do begin Color:=X div 2; if Color>255 then Color:=Color-256; plot(X,Y,Color); { Вывод на экран } end; end; end; begin GraphDriver := HercMono; GraphMode := HercMonoHi; InitGraph(GraphDriver, GraphMode,''); ShowPalette; end. В приведенной программе есть два момента, заслуживающих более подробного рассмотрения. Во-первых, в ней два вложенных цикла, в которых программа обрабатывает каждый из 720 на 348 пикселей экрана. Поскольку цвета палитры размещаются на экране по горизонтали, они коррелируют со значениями x. Это позволяет создать последовательность вертикальных полос, каждая из которых представляет отдельный цвет. Включив эту процедуру в программу, вы сможете использовать команду SHOWPALETTE для вывода на экран текущей палитры. В правой части экрана, начиная с позиции 512 по х, будут повторены первые цвета, чтобы был заполнен весь экран. 9.1.4 Присвоение и считывание цветов пикселей при помощи процедуры "PEEK(Hercules)" ----------------------------------------------------------------- Введя несколько дополнительных команд, мы сможем использовать все эти серые тона. Следующие команды были созданы специально для монохромного режима Hercules. При создании команды PLOT мы воспользовались стандартной командой Паскаля PUTPIXEL. Эта команда дает две возможности вывода на экран: с цветом 0 (черный) или 1 (белый). Соответствующая команда GETPIXEL используется для считывания номера цвета пикселя с координатами x,y и возврата полученного значения в переменной. procedure PEEK(x,y:integer; var OldColor:integer); { Возвращает номер цвета } begin { пикселя в графическом режиме } OldColor := GetPixel(x,y); end; Процедура PEEK имеет туже функцию, что и стандартная команда Паскаля GETPIXEL. Передача цвета здесь выполняется упрощенным способом. Далее команда PEEK() будет использована для поддержки совместимости с другими модулями. Однако, важно помнить, что данная версия процедуры PEEK не является настоящей противоположностью процедуры PLOT. Шаблоны штриховки, создающие серые тона, имеют смысл только для областей экрана. Считывание отдельного пикселя даст нам значение 0 или 1, что фактически ничего не скажет нам о "цвете" данной области. Однако этот способ тем не менее является лучшим для считывания информации о цвете каждого пикселя в целях передачи экранной информации. 9.1.5 Процедура BLOCK(Hercules) ----------------------------------------------------------------- Теперь, создав процедуры для монохромной графики PLOT и PEEK, мы легко сможем начать рисовать на экране фигуры. Примером может служить приводимая ниже процедура BLOCK, которая рисует на экране закрашенные прямоугольники. Она принимает экранные координаты, как это делает стандартная команда Паскаля BAR. Различие здесь состоит в том, что BLOCK кроме того принимает номер цвета из палитры серых тонов. Данная процедура построена на использовании процедуры PLOT, которая использует стандартную команду PUTPIXEL. Входные координаты проверяются и меняются местами, если расположены в неверном порядке. Затем заполнение прямоугольной области выполняется в двух вложенных циклах: procedure BLOCK(x1,y1,x2,y2:integer;Color:integer); var xk,yk,Save:integer; { Рисует цветной (закрашенный) прямоугольник } begin { При необходимости значения меняются местами } if x2 |