ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 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-1) and (yk<349) and (yk>-1) then
     Plot(xk,yk,Color);   { Рисование точки }
    end;
end; end;
     
     Один из   циклов   рисует  горизонтальные  линии,  а  второй
управляет координатами y (или тем,  сколько раз рисуется  линия),
пока прямоугольник    не    будет   завершен.   Ниже   приводится
демонстрационная программа, в которой используется готовый модуль
HERCULES.TPU (рассматриваемый ниже).
     
program DEMO_BLOCK_HERCULES;
uses crt,dos,graph,Hercules;   { Модуль Hercules обязателен }
var x,y : integer;
    ch  : char;
begin
 randomize;
 ModeHercules;
 outtextxy(1,20,' Block(x1,y1,x2,y2,Color:Integer);');
 outtextxy(1,28,'  ... в палитре серых тонов    ');
 Zerokey;
 repeat
    x:=random(random(720))+1;y:=random(174)+60;
    Block(x,y,x+x div 10,y+x div 10,random(265));
 until keypressed;
 closegraph;
 restorecrtmode;
end.
     

9.1.6  Процедура CIRCLE/DISK(Hercules)
-----------------------------------------------------------------
     
     Процедуры CIRCLE   и  DISC  (см.  их  листинге  на  дискете)
используются для  рисования  закрашенных  кругов  и  эллипсов   в
монохромном графическом    режиме.   Они   также   построены   на
рассмотренных выше процедурах. В них входит команда MODEHERCULES,
включающая графический  режим,  и  команда PLOT,  используемая для
рисования.
     
     Это означает, что данные процедуры должны также быть включены в
любую программу,  использующая новые команды.  В противном случае
CIRCLE и DISK не работают.
     
     CIRCLE и DISK принимают  координаты  x/y  центральной  точки
формы, значения  радиуса  по  x  и  по  y,  а  также номер цвета.
Отрицательные значения радиуса устанавливаются равными 0, так как
в реальной  графике  окружность  с размером меньше одной точки не
определена.
     
     Листинги CIRCLE    и    DISK    идентичны    процедурам    с
соответствующими именами  из  модуля  VGA19.TPU,  и  повторять их
здесь мы не станем. Листинги демонстрационных программ DEMOCIRCLE
/ DISK / FRAME(HERCULES) см. на дискетах.
     
9.1.7  Рисование линий и рамок в монохромном графическом режиме
-----------------------------------------------------------------
     
     Листинги этих    процедур     идентичны     процедурам     с
соответствующими  именами  из  модуля  VGA19.TPU,  и повторять их
здесь мы не станем.
     
     Они также используют новую процедуру PLOT для Hercules. Ниже
приводится демонстрационная   программа,  использующая  процедуры
LINE и FRAME в графическом режиме Hercules:
     
program DEMO_FRAME_HERCULES;
uses crt,dos,graph,Hercules;   { Модуль Hercules обязателен }
var x,y,z : integer;
    ch  : char;
    sta : string;
begin
 randomize;
 HerculesMode;
 for x:=-5 to 75 do
   frame(50+x*4,50+x*4,670-x*4,298-x*4,x +160);
 Zerokey;
 ch:=readkey;
 closegraph;
 restorecrtmode;
end.
                              
     
9.2  Специализированные графические команды для Hercules
-----------------------------------------------------------------
     
     Данный раздел описывает дополнительные команды,  расширяющие
возможности процедур, рассмотренных нами выше. В частности, будут
использованы процедуры  BLOCK,  LINE  и  DISK.  Каждая  из   этих
процедур может  нарисовать  форму,  заполнив  ее  одним цветом из
монохромной палитры серых тонов.  Для того, чтобы придать объекту
трехмерный вид,  необходимо создать шаблоны заполнения, состоящие
из диапазона серых тонов.
     
     Снова модифицируем  команду  LINE,  создав  из  нее  команду
FEATHER. Мы  также создадим для нашего расширенного набора команд
Hercules упрощенную  процедуру  рисования  линий  и  назовем   ее
HORIZONTAL. Модифицированной   командой  рисования  блоков  снова
будет COLUMN,  а  DISK  будет  модифицирована  и   получит   имя
BALL(Hercules).
     
     Также будут     созданы     их    дополнительные    вариации
MIXHORIZONTAL, MIXBALL и  MIXCOLUMN.  Последние  также  входят  в
готовый модуль расширения для Hercules,  но они не так важны, как
были в VGA19.TPU.  Это связано с тем,  что  смешивание  различных
шаблонов заполнения   в   монохромном   режиме   не  имеет  столь
отчетливого эффекта.
     
     Листинги процедур  идентичны  соответствующим  процедурам  из
модуля VGA19.TPU.  Мы  отсылаем  читателя  к листингу и подробным
описаниям, приводимым в соответствующем разделе книги.
     
9.2.1  "Серые тона палитры"
-----------------------------------------------------------------
     
     Важным требованием   к   заполнению   форм  разными  цветами
"палитры" в монохромном  режиме  является  способ  задания  самой
палитры. При заполнении формы диапазоном номеров палитры в случае
произвольного расположения   в   палитре   шаблонов    заполнения
получающееся в    результате   заполнение   формы   также   будет
произвольным, что   не   даст   получить   эффект    трехмерности
изображения.
     
     Сама палитра является результатом работы процедуры PLOT. Это
та самая процедура, в которой происходит создание различных серых
тонов шаблонов  штриховки.  Эта процедура разрабатывалась с таким
расчетом, чтобы создавать гладкую прогрессию серых тонов палитры.
Таким образом,  любой  выбранный  диапазон  цветов  палитры будет
равномерным, без зазоров или резких скачков яркости.  На  дискете
вы можете  посмотреть  листинги  дополнительных  демонстрационных
программ.
     
     Прежде чем считать наш  набор  расширенных  команд  Hercules
для моделирования   режима   VGA   19   полным,   нам  нужно  еще
позаботиться об одном моменте.
     
     Хорошей идеей является закрашивать весь  экран  одним  серым
тоном или шаблоном заполнения,  прежде чем приступать к рисованию
картинки на переднем плане.  В противном  случае  детали  рисунка
могут быть  потеряны при наложении конфликтующего фонового цвета.
В цветных графических режимах это легко сделать  командой  CLRSCR
при выбранном цвете фона.
     
     Однако стандартная  команда  CLRSCR в данном случае не очень
подходит, поскольку  не  все  функции  монохромного  графического
режима DOS-совместимы. Такие процедуры, как BLOCK, не годятся для
выполнения функций вроде очистки  экрана.  Вложенные  циклы  этих
программ слишком медленны для этого.
     
     Нам понадобится   еще   одна  дополнительная  программа  для
очистки экранной памяти и  заполнения  экрана  нейтральным  серым
цветом из  палитры.  Лучше  всего  для  очистки  экранной  памяти
повторить включение видео-режима и инициализацию  графики.  Затем
экран в цикле программы заполняется серым тоном из палитры.
     
Program GreyBackground;
 uses crt,dos,graph;
 var X,Y,Z,Color:integer;
     ch         : Char;
Procedure ModeHercules;
 var GraphMode, GraphDriver:integer;
 begin
   GraphDriver:=HercMono; GraphMode:=HercMonoHi;
   Initgraph(GraphDriver,GraphMode,'');
 end;
begin
ModeHercules; directvideo:=false;
outtextxy(20,25,'Пример: серый фон');
for x:=0 to 10000 do
  PutPixel(Random(721),Random(80),1);
for x:=0 to 10000 do
  PutPixel(Random(721),Random(268)+80,1);
for x:=0 to 10000 do
  PutPixel(Random(Random(722)),Random(349),1);
  repeat
  for x:=0 to 30000 do
    PutPixel(Random(Random(Random(723))),Random(349),0);
  until keypressed;
  outtextxy(20,25,'Пример: серый фон');
  ch:=readkey; closegraph; restorecrtmode;
end.
     
9.3  Моделирование режима VGA 19 в режиме Hercules
-----------------------------------------------------------------
     
     Главное различие  между  процедурами  в  модуле  Hercules  и
модуле VGA19  состоит  в  процедуре   PLOT.   Кроме   того,   при
использовании этих программ в разных видео-режимах не забывайте о
разнице в размере экрана. Монохромный графический экран позволяет
иметь 720  строк  по  горизонтали  на  349 строк по вертикали.  В
противном случае функции из стандартного модуля  GRAPH.TPU  можно
было бы использовать без какого-либо переопределения.
     
     Процедуры для  сглаживания  и  смешения  цветов  режима 19 в
модуль Hercules  не  включены,  поскольку  они  несовместимы   по
аппаратному обеспечению.
     
     Новый модуль   также  позволяет  использование  мини-текста.
Процедуры MINIPRINT,  MINITEXTXY и GLASPRINT были  модифицированы
для работы в новой среде.  С учетом этих изменений модуль Паскаля
VGA19.PAS/VGA19.TPU превратился   в    новый    модуль    Паскаля
HERCULES.PAS/HERCULES.TPU. Полный     листинг     этого    модуля
поставляется на дискетах с программами.


Яндекс цитирования