                             ГЛАВА 12.

                           МОДУЛЬ GRAPH.

     Модуль Graph реализует  полную  библиотеку  из  более  чем  50
графических   программ,   начиная  от  высокоуровневых,  таких  как
SetViewPort,      Circle,      Bar3D      или      DrawPoly      до
бит-ориентированных, таких  как GetImage и PutImage. Поддерживаются
несколько типов линий и  стилей  заполнения,  существует  несколько
типов шрифтов,    которые    можно   увеличивать,   выравнивать   и
ориентировать вертикально или горизонтально.
     Для того  чтобы  компилировать  программу,  которая использует
модуль Graph, Вам требуется Ваш исходный код, компилятор и доступ к
стандартным  модулям  в  TURBO.TPL и модулю Graph в GRAPH.TPU.  Для
того чтобы выполнить программу,  которая использует  модуль  Graph,
Вам необходим один или более графических драйверов (.BGI файлы, см.
ниже). Кроме того, если Ваша программа использует штриховые шрифты,
Вам потребуется один или более файлов шрифтов (.CHR).


                             Драйверы.

     Графические драйверы   поддерживают   следующие    графические
адаптеры (и полностью совместимые с ними):

          - CGA
          - MCGA
          - EGA
          - VGA
          - Hercules
          - AT&T 400 строк
          - 3270 PC
          - IBM-8514

     Каждый драйвер содержит код и данные,  хранящиеся в  отдельном
файле. Во   время   выполнения,   процедура   InitGraph  определяет
графическое устройство,  загружает и инициализирует соответствующий
графический драйвер,   переводит  систему  в  графический  режим  и
возвращает управление вызывающей  программе.  Процедура  CloseGraph
выгружает   драйвер   из   памяти   и   восстанавливает  предыдущий
видеорежим.  Вы можете переключиться между графическим и  текстовым
режимами используя RestoreCrtMode и SetGraphMode.  Для того,  чтобы
загрузить Ваш собственный драйвер или выключить  его  в  .EXE,  см.
RegisterBGIDriver в  Справочном  руководстве  по библиотеке.
     Graph поддерживает  конфигурацию  с  двумя  мониторами.  Когда
Graph инициализируется  вызовом InitGraph,  соответствующий монитор
будет выбран для запрошенного графического драйвера и режима. Когда
графическая программа   завершается,  предыдущий  видеорежим  будет
восстановлен. Если в конфигурации с двумя мониторами  будет  вызван
InitGraph с   режимом  автообнаружения,  Graph  выберет  монитор  и
графический адаптер на  котором  будет  поддерживаться  графический
вывод с более высоким качеством.

   CGA.BGI         Драйвер для IBM CGA, MCGA
   EGAVGA.BGI      Драйвер для IBM EGA, VGA
   HERC.BGI        Драйвер для монохромного Hercules
   ATT.BGI         Драйвер для AT&T 6300 (400 строк)
   PC3270.BGI      Драйвер для IBM 3270 PC
   IBM8514.BGI     Драйвер для IBM 8514


                        Поддержка IBM 8514.

     Turbo Pascal   поддерживает   графический  адаптер  IBM  8514,
который имеет высокое разрешение 1024х768 и палитру цветов  256  из
списка 256K цветов. Имя файла драйвера - IBM8514.BGI.
     Графический адаптер IBM 8514 не может быть правильно распознан
автоматически (он    будет   распознаваться   как   адаптер   VGA).
Следовательно, для использования IBM 8514,  переменной  GraphDriver
должно  быть  присвоено  значение  IBM8514 (оно определено в модуле
Graph) при вызове InitGraph.  DetectGraph или DETECT с InitGraph не
должны использоваться   с  IBM  8514  (если  только  Вы  не  хотите
эмулировать режим VGA).
     Адаптер IBM  8514  поддерживает  режимы  IBM8514Lo (640x480) и
IBM8514Hi (1024x768).  Обе эти константы определены в модуле Graph.
     IBM 8514  использует три 6-ти битовые значения для определения
цветов. Определены 6-битовые Red (красный),  Green (зеленый) и Blue
(синий) компоненты для каждого определенного цвета. Для определения
цвета в библиотеку BGI добавлена новая программа:

  procedure SetRGBPalette(ColorNum, Red, Green, Blue: Word);

     Аргумент ColorNum определяет номер цвета в палитре.
     ColorNum задается  в  диапазоне 0-255 (десятичные).  Аргументы
Red,  Green,  Blue определяют значение цвета для элемента  палитры.
Для определения палитры используются 6 старших битов младшего байта
каждого из этих параметров.
     Другие программы   манипуляции   с   палитрой  из  графической
библиотеки не могут использоваться с драйвером IBM 8514  (такие как
SetAllPalette, SetPalette, GetPalette).
     Для совместимости  с  другими  графическими  адаптерами   IBM,
модуль  Graph  определяет  первые  16  значений  палитры  IBM 8514,
соответствующие   цветам   EGA/VGA.   Эти   значения   могут   быть
использованы как  они определены или изменены,  используя программу
SetRGBPalette.
     Программа FloodFill  не работает на адаптере IBM 8514.
     Эти же ограничения действуют при использовании  VGA  в  режиме
256 цветов.


                       Координатная система.

     Верхний левый угол графического экрана  определен  как  (0,0).
Значение Х или колонки увеличиваются направо. Значение Y или строки
увеличиваются вниз.  Так в режиме 320x200 на адаптере CGA  экранные
координаты  каждого  из четырех углов и точка в центре экрана будут
представлены:

              Рис. 12.1. Экран с координатами (X,Y).

                 (0,0)                   (319,0)
                    +———————————————————————+
                    |                       |
                    |       (159,99)        |
                    |           .           |
                    |                       |
                    |                       |
                    |                       |
                    +———————————————————————+
                  (0,199)                  (319,199)


                        Текущий указатель.

     Многие графические  системы  поддерживают   понятие   текущего
указателя  (CP  -  Current  Pointer).  CP подобен понятию курсора в
текстовом режиме, но в отличие от курсора CP не виден.

         Write('ABC');

     В текстовом режиме оператор  Write  будет  помещать  курсор  в
колонку  непосредственно после символа C.  Если C помещен в колонку
80,  то курсор передвинется в первую колонку следующей строки. Если
C  помещен  в  колонку 80 25-ой строки,  то весь экран сдвинется на
одну строку вверх и курсор будет в первой колонке 25 строки.
         MoveTo(0, 0);
         LineTo(20, 20);
     В графическом  режиме  оператор  LineTo  поместит  CP  в точку
(20,20). Выведенная линия  будет  отсечена  в  текущем  окне,  если
отсечение включено. Заметим, что CP никогда не отсекается.
     Команда MoveTo эквивалентна GotoXY.  Она  используется  только
для  перемещения  CP.  Следующие команды перемещают CP:  InitGraph,
MoveTo, MoveRel,   LineTo,    LineRel,    OutText,    SetGraphMode,
GraphDefaults, ClearDevice, SetViewPort, ClearViewPort.
     Примечание: последние 5 команд перемещают CP в (0,0).


                              Текст.

     Побитовый шрифт  с  матрицей 8х8 и несколько штриховых шрифтов
определены  для  вывода  текста  в   графическом   режиме.   Символ
побитового шрифта   определен   в  матрице  8х8  пикселов  (точек).
Штриховый шрифт  определен   серией   отрезков,   которые   говорят
графической системе как рисовать шрифт.
     Удобство использованоя штрихового шрифта проявляется, когда Вы
начинаете  рисовать  большие  символы.  Поскольку  штриховый  шрифт
определен отрезками, он остается хорошего разрешения и качества при
увеличении.
     Когда побитовый шрифт  увеличивается,  матрица  умножается  на
коэффициент    масштабирования,    и    как    только   коэффициент
масштабирования становится большим,  разрешения символов становится
грубым. Для небольших символов побитовый шрифт будет эффективен, но
для большого текста Вы захотите использовать штриховый шрифт.
     Выравнивание графического    текста   управляется   процедурой
SetTextJustify. Масштабирование   и   выбор   шрифта   производится
процедурой SetTextStyle.   Графический   текст   выводится  вызовом
процедуры OutText или OutTextXY.  Запрос текущих  установок  текста
производится  процедурой GetTextSettings.  Размер штрихового шрифта
может быть определен процедурой SetUserCharSize.
     Каждый штриховой   шрифт   хранится   в   отдельном   файле  с
расширением .CHR.  Файлы  шрифтов  могут  быть  загружены  с  диска
автоматически модулем  Graph во время выполнения (как описано), или
они могут быть включены в пользовательскую программу  или загружены
ей и "зарегистрированы" модулем Graph.
     Специальная программа BINOBJ.EXE  обеспечивает  преобразование
файла шрифтов   (или   любого   двоичного   файла  данных,  который
соответствует ему) в файл .OBJ, который может быть включен в модуль
или программу,  используя директиву компилятора {$L}. Это позволяет
программе иметь все файлы шрифтов, встроенные в .EXE файл. (Читайте
комментарий в начале программы GRLINK.PAS на дистрибутивном диске).


                          Фигуры и стили.

     Существует большое число программ для рисования  и  заполнения
фигур,   включая   точки,   линии,   окружности,   дуги,   эллипсы,
прямоугольники, многоугольники,  полосы,  3-х   мерные   полосы   и
сектора.  Использование  SetLineStyle  позволяет управлять толщиной
линий и типом: сплошная, точками или тип, определенный Вами.
     Использование SetFillStyle   и   SetFillPartern,   FillPoly  и
FloodPoly позволяет заполнять многоугольник штриховкой  или  другим
стилем.


                      Окна и битовые образы.

     Процедура SetViewPort заставляет все выводные команды работать
относительно прямоугольной  области  экрана (окна или поля вывода).
Точки,  линии,  фигуры  -  весь  графический  вывод  -  зависит  от
определения  окна  (его  координат) до тех пор,  пока окно не будет
изменено.  Другие программы  обеспечивают  очистку  окна  и  чтение
текущего определения окна. Если отсечение активно, весь графический
вывод отсекается по границам текущего окна. Заметим, что CP никогда
не отсекается.
     GetPixel и PutPixel обеспечивают чтение пикселов.  GetImage  и
PutImage  могут  быть использованы для сохранения и вывода на экран
прямоугольной области экрана. Они обеспечивают полный набор битовых
операции (копирование, xor, or, and, not).


                         Страницы и цвет.

     Существует ряд других программ,  включая поддержку  нескольких
графических  страниц  (только  для  EGA,  VGA,  Hercules;  особенно
полезны для мультипликации), палитры, цвета и т.п.


                         Обработка ошибок.

     Внутренние ошибки   в   модуле   Graph  возвращаются  функцией
GraphResult.   GraphResult   возвращает   код   ошибки    последней
графической операции. Коды ошибок определены в таблице 12.2.
     Следующие программы устанавливают GraphResult:

       Bar                  ImageSize              SetFillPattern
       Bar3D                InitGraph              SetFillStyle
       ClearViewPort        InstallUserDriver      SetGraphBufSize
       CloseGraph           InstallUserFont        SetGraphMode
       DelectGraph          PieSlice               SetLineStyle
       DrawPoly             RegisterBGIdriver      SetPalette
       FillPoly             RegisterBGIfont        SetTextJustify
       FloodFill            SetAllPalette          SetTextStyle
       GetGraphMode

     Заметим, что GraphResult  устанавливается  в  ноль  после  его
вызова. Следовательно,   программист   должен   запомнить  значение
GraphResult во   временной   переменной,    а    затем    проверять
его.


                          Начало работы.

     Пример простой программы:

     program GraphText;
     uses
       Graph;
     var
       GraphDriver,
       GraphMode,
       ErrorCode : Integer;
     begin
       GraphDriver :=Detect;
       InitGraph(GraphDriver, GraphMode,'C:\DRIVERS');
       ErrorCode :=GraphResult;
       if ErrorCode <> grOK then     {ошибка  }
       begin
         Writeln('Graphics error: ', GraphErrorMsg(ErrorCode));
         Writeln('Program aborted...');
         Halt(1);
       end;
       Rectangle(0, 0, GetMaxX, GetMaxY); {рисовать прямоугольник
                                           на весь экран}
       SetTextJustify(CenterText, CenterText);  {центрировать
                                                 текст}
       SetTextStyle(DefaultFint, Horez Dir 3);
       OutTextXY(GetMaxX  div  2,  GetMaxY  div  2,
                 'Borland Graphics interface (BGI)');
       Readln;
       CloseGraph;
     end.  {GraphTest}

     Программа начинается с вызова InitGraph, который автоматически
определяет  аппаратуру  и  загружает  соответствующий   графический
драйвер (из справочника С:\DRIVERS). Если графическое устройство не
распознано или во время инициализации  произошла  ошибка,  выдается
сообщение об   ошибке  и  программа  завершается.  Иначе,  чертится
прямоугольник по краю экрана и в центре экрана выводится текст.
     Примечание: Адаптеры  AT&T  400  и  IBM 8514 нельзя распознать
автоматически. Для использования этих драйверов Вам  нужно отменить
автообнаружение  и  передать  в InitGraph код драйвера и правильный
код графического режима. Например, чтобы использовать драйвер AT&T,
замените строки 9 и 10 в предыдущем примере на:

        GraphDriver := ATT400;
        GraphMode   := ATT400Hi;
        InitGraph(GraphDriver, GraphMode, 'C:\DRIVERS');

     Это указывает  системе загрузить драйвер AT&T 400 и установить
графический режим 640x400 точек.
     Приведенный ниже пример демонстрирует возможность переключения
между графическим и текстовым режимами:

   program GraphText;
   uses
     Graph;
   var
     GraphDriver,
     GraphMode,
     ErrorCode : Integer;
   begin
     GraphDriver :=Detect;
     InitGraph(GraphDriver, GraphMode, 'C:\DRIVERS');
     ErrorCode :=GraphResult;
     if ErrorCode <> grOK then     {ошибка}
     begin
        Writeln(Graphics error: ', GraphErrorMsg(ErrorCode));
        Writeln('Program aborted...');
        Halt(1);
      end;
      OutText('InGraphiesMode. Press<Return>');
      Readln;
      RestoreCRTMode;
      Writeln('Now in text mode. Press<Return>');
      Readln;
      SetGraphMode(GraphMode);
      OutText('Back in Graphics mode. Press<Return>');
      Readln;
      CloseGraph;
    end. {GraphTest}


     Заметим, что вызов SetGraphMode устанавливает  все графические
параметры (палитру,  текущий указатель, цвета и т.п.) в значение по
умолчанию.
     Вызов CloseGraph  вoсстанавливает  видеорежим,   который   был
установлен до  вызова InitGraph и освобождает память,  используемую
графическим драйвером.


           Пользовательские программы управления кучей.

     Модуль Graph   использует   две  программы  управления  кучей:
GraphGetMem и GraphFreeMem.  GraphGetMem  распределяет  память  для
драйверов графического устройства, шрифтов и сканирующего буфера.
     GraphFreeMem освобождает   память   распределенную   драйверу.
Стандартные программы имеют вид:

     procedure GraphGetMem (var P: Pointer; Size: Word);
     procedure GraphFreeMem (var P: Pointer; Size: Word);

     Модуль Graph  определяет  два  указателя  для  ссылки  на  эти
стандартные программы. Эти указатели определены так:

 var
   GraphGetMemPtr : Pointer; {указатель на программу распределения
                              памяти}
   GraphFreeMemPtr : Pointer; {указатель на программу освобождения
                               памяти}

     Программы управления  кучей,  ссылки  на  которые  хранятся  в
GraphGetMemPtr и  GraphFreeMemPtr,  вызываются  модулем  Graph  для
распределения и освобождения памяти для:
     - многоцелевого буфера,  размер которого может быть установлен
программой SetGraphBufSize (по умолчанию 4 Кбайта)
     - драйвера устройства, загружаемого InitGraph (*.BGI файлы)
     - файла  штрихового  шрифта,  загружаемого SetTextStyle (*.CHR
файлы)
     Графический буфер   всегда   распределяется  в  куче.  Драйвер
устройства распределяется в куче,  если только  Ваша  программа  не
загрузила его и не установила связь при помощи RegisterBGIdriver; и
файл шрифтов распределяется в куче,  когда Вы  выбираете  штриховой
шрифт используя  SetTextStyle,  если  только  Ваша программа его не
загрузила или не связала, используя вызов RegisterBGIfont.
     При инициализации  модуля  Graph  эти  указатели  указывают на
стандартные программы распределения и освобождения  памяти, которые
определены в   разделе   implementation  модуля  Graph.  Вы  можете
вставить  Ваши  программы  управления  памятью   присвоением   этим
указателям адресов этих программ. Ваши программы должны иметь такой
же список параметров,  что и стандартные программы  и  должны  быть
объявлены как дальние (far).
     Приведенный ниже   пример    демонстрирует    пользовательские
программы распределения   и   освобождения   памяти.  Заметим,  что
использование  MgExitProc  автоматически  вызывает  CloseGraph  при
завершении программы:

     program UserHeapManagment;
     {показывает как пользователь может составлять программы
      управления памятью, используя модуль Graph}
     uses
        Graph;
     var
        GraphDriver, GraphMode: Integer;
        ErrorCode: Integer;  { Используется для запоминания кода
                               возвращаемого GraphResult }

        PreGraphExitProc: Pointer; { Используется для сохранения
                                     первоначальной процедуры
                                     выхода }

       ($F+)  { Программа должна быть дальней модели }

     procedure MyGetMeM(var P: Pointer; Size: Word); far;
     { Распределяет  память для драйвера графического
       устройства, шрифта и сканирующего буфера }
     begin
       GetMet(P, Size);
     end; { MyGetMem }

     procedure MyFreeMem(var P: Pointer; Size: Word); far;
     { Освобождает память графического драйвера, шрифта и
       сканирующего буфера }
     begin
        if P <> nil then   { Не освобождает если указатель nil
                             (пустой)}
        begin
           FreeMen(P, Size);
           P := nil;
        end;
     end; { MyFreeMem }

     procedure MyExitProc; far;
     { Получает управление при завершении программы }
     begin
        ExitProc :=  PreGraphExitProc; { Восстанавливает перво-
                                         начальную процедуру }
        CloseGraph; { Очищает кучу }
     end; ( MyExitProc )

     ($F-)
     begin
        { Инсталирует программу выхода }
        PreGraphExitProc := ExitProc;
        ExitProc := @MyExitProc;
        GraphGetMemPtr := @MyGetMem;  { Управление распределением
                                        памяти }
        GraphFreeMemPtr := @MyFreeMem; { Управление освобождением
                                         памяти }
        GraphDriver := Detect;
        InitGraph(GraphDriver, GraphMode, '');
        ErrorCode := GraphResult;
        if ErrorCode <> grOk then
        begin
           Writeln('Graphics error: ', GraphErrorMsg(ErrorCode));
           Readln;
           Halt(1);
        end;
        Line(0, 0, GetMaxX, GetMaxY);
        OutTextXY(1, 1, 'Press <Return>:');
        Readln;
     end.   { UserHeapManagment }


             Константы, типы и переменные модуля Graph.

                             Константы.

      Используйте эти константы драйверов  и  режимов  с InitGraph,
DetectGraph и GetModeRange:

———————————————————————————————————————————————————————————————————
  Константа      Значение              Описание
———————————————————————————————————————————————————————————————————
  Detect             0       Запрашивает   автообнаружение
  CGA                1
  MCGA               2
  EGA                3
  EGA64              4
  EGAMono            5
  IBM8514            6
  HercMono           7
  ATT400             8
  VGA                9
  PC3270            10
  CurrentDriver   -128    Передается в GetModeRange

  CGAC0              0    320x200 палитра 0: LightGreen,
                          LightRed, Yellow; 1 страница
  CGAC1              1    320x200 палитра 1: LightCyan,
                          LightMagenta, White; 1 страница
  CGAC2              2    320x200 палитра 2: Green,
                          Red, Brown; 1 страница
  CGAC3              3    320x200 палитра 3: Cyan,
                          Magenta, LightGray; 1 страница
  CGAHi              4    640x200 1 страница

  MCGAC0             0    320x200 палитра 0: LightGreen,
                          LightRed, Yellow; 1 страница
  MCGAC1             1    320x200 палитра 1: LightCyan,
                          LightMagenta, White; 1 страница
  MCGAC2             2    320x200 палитра 2: Green,
                          Red, Brown; 1 страница
  MCGAC3             3    320x200 палитра 3: Cyan,
                          Magenta, LightGray; 1 страница
  MCGAMed            4    640x200 1 страница
  MCGAHi             5    640x480 1 страница

  EGALo              0    640x200 16 цветов 4 страницы
  EGAHi              1    640x350 16 цветов 2 страницы
  EGA64Lo            0    640x200 16 цветов 1 страница
  EGA64Hi            1    640x350 4 цвета  1 страница
  EGAMonoHi          3    640x350 64K: 1 страница;
                          256K: 2 страницы

  HercMonoHi         0    720x348 2 страницы

  ATT400C0           0    320x200 палитра 0: LightGreen,
                          LightRed, Yellow; 1 страница
  ATT400C1           1    320x200 палитра 1: LightCyan,
                          LightMagenta, White; 1 страница
  ATT400C2           2    320x200 палитра 2: Green,
                          Red, Brown; 1 страница
  ATT400C3           3    320x200 палитра 3: Cyan,
                          Magenta, LightGray; 1 страница
  ATT400Med          4    640x200 1 страница
  ATT400Hi           5    640x400 1 страница

  VGALo              0    640x200 16 цветов 4 страницы
  VGAMed             1    640x350 16 цветов 2 страницы
  VGAHi              2    640x480 16 цветов 1 страница

  PC3270Hi           0    720x350 1 страница

  IBM8514LO          0    640x480 256 цветов
  IBM8514HI          1    1024x768 256 цветов
———————————————————————————————————————————————————————————————————

     Значения ошибок, возвращаемые GraphResult:

            Таблица 12.2. Значения ошибок GraphResult.

———————————————————————————————————————————————————————————————————
Константа          Значение             Описание
———————————————————————————————————————————————————————————————————
  grOk                0     нет ошибок
  grNoInitGraph      -1     графика не инициализированна
                            (используйте InitGraph)
  grNotDetected      -2     графическое устройство не обнаружено
  grFileNotFound     -3     файл драйвера устройства не найден
  grInvalidDriver    -4     неправильный файл драйвера устройства
  grNoLoadMem        -5     не достаточно памяти для загрузки
                            драйвера
  grNoScanMem        -6     выход за пределы памяти при заполнении
                            (scan fill)
  grNoFloodMem       -7     выход за пределы памяти при заполнении
                            (flood fill)
  grFontNotFound     -8     файл шрифта не найден
  grNoFontMem        -9     не достаточно памяти для загрузки
                            шрифта
  grInvalidMode     -10     неверный графический режим для этого
                            драйвера
  grError           -11     графическая ошибка
  grIOerror         -12     ошибка графического ввода/вывода
  grInvalidFont     -13     неверный файл шрифта
  grInvalidFontNum  -14     неверный номер шрифта
———————————————————————————————————————————————————————————————————

                   SetPalette  и SetAllPalette.

     Используйте   эти   константы   цветов   с   SetPalette    и
SetAllPalette: 

   ———————————————————————————————
    Константа        Значение
   ———————————————————————————————
     Black              0
     Blue               1
     Green              2
     Cyan               3
     Red                4
     Magenta            5
     Brown              6
     LightGray          7
     DarkGray           8
     LightBlue          9
     LightGreen        10
     LightCyan         11
     LightRed          12
     LightMagenta      13
     Yellow            14
     White             15
   ———————————————————————————————


                          SetRGBPalette.

     Эти константы цветов могут быть  использованы с  SetRGBPalette
для выбора стандартных EGA цветов на графическом адаптере IBM 8514:

   ———————————————————————————————
    Константа       Значение
   ———————————————————————————————
    EGABlack           0 темные цвета 
    EGABlue            1
    EGAGreen           2
    EGACyan            3
    EGARed             4
    EGAMagenta         5
    EGABrown          20
    EGALightGray       7

    EGADarkGray       56  светлые цвета
    EGALightBlue      57
    EGALightGreen     58
    EGALightCyan      59
    EGALightRed       60
    EGALightMagenta   61
    EGAYellow         62
    EGAWhite          63
   ———————————————————————————————


                      Константы типов линий.

     Используйте эти константы  типов  линий  с  GetLineSettings  и
SetLineStyle: 

   ———————————————————————————————
    Константа       Значение
   ———————————————————————————————
     SolidLn          0
     DottedLn         1
     CenterLn         2
     DashedLn         3
     UserBitLn        4  Тип линии, определяемый пользователем
     NormWidth        1
     ThickWidth       3
   ———————————————————————————————


                   Константы управления шрифтом.

    Используйте эти  константы  с  GetTextSettings  и SetTextStyle:

   ———————————————————————————————
    Константа       Значение
   ———————————————————————————————
     DefaultFont       0  8x8 битовый шрифт
     TriplexFont       1  Штриховые шрифты
     SmallFont         2
     SansSerifFont     3
     GothicFont        4

     HorizDir          0  слева направо
     VertDir           1  снизу вверх

     UserCharSize      0  размер символа, определяемый
                          пользователем
   ———————————————————————————————


                      Константы выравнивания.

     Эти константы   управляют   горизонтальным   и    вертикальным
выравниванием для SetTextJustify:

   ———————————————————————————————
    Константа       Значение
   ———————————————————————————————
     LeftText          0
     CenterText        1
     RightText         2

     BottomText        0
     CenterText        1 (уже определена выше)
     TopText           2
   ———————————————————————————————


                       Константы отсечения.

     Используйте эти  константы  с   SetViewPort   для   управления
отсечением.  При  ClipOn  графический  вывод  будет  отсекаться  по
границе окна:

   ———————————————————————————————
    Константа       Значение
   ———————————————————————————————
     ClipOn          True
     ClipOff         False
   ———————————————————————————————


                         Константы полосы.

     Эти константы используются с Bar3D, чтобы указать будет ли 3-х
мерная вершина рисоваться на верху полосы:

   ———————————————————————————————
    Константа       Значение
   ———————————————————————————————
     TopOn           True
     TopOff          False
   ———————————————————————————————


                   Константы шаблона заполнения.

     Эти шаблоны    заполнения   используются   GetFillSettings   и
SetFillStyle. Используйте  SetFillPattern  для  определения  Вашего
собственного стиля         заполнения,        затем        вызовите
SetFillStyle(UserFill,  SomeColor) и сделайте свой шаблон активным:

——————————————————————————————————————————————————————————————
    Константа       Значение
——————————————————————————————————————————————————————————————
    EmptyFill          0  заполняет цветом фона
    SolidFill          1  заполняет основным цветом
    LineFill           2  --- заполнение
    LtSlashFill        3  /// заполнение
    SlashFill          4  /// заполнение толстыми линиями
    BkSlashFill        5  \\\ заполнение толстыми линиями
    LtBkSlashFill      6  \\\ заполнение
    HatchFill          7  редкая штриховка
    XHatchFill         8  плотная штриховка
    InterleaveFill     9  пересекающиеся линии
    WideDotFill       10  редкие точки
    CloseDotFill      11  плотные точки
    UserFill          12  определенный пользователем стиль
——————————————————————————————————————————————————————————————


                        Битовые операторы.

     Используйте эти битовые операторы с PutImage и SetWriteMode:

   ——————————————————————————————————————
       Константа          Значение
   ——————————————————————————————————————
       CopyPut            0    { MOV }
       XORPut             1    { XOR }

   Используйте эти операции только с PutImage:

       OrPut              2    { OR  }
       AndPut             3    { AND }
       NotPut             4    { NOT }
   ——————————————————————————————————————


                        Константа палитры.

     Эта константа     используется     GetPalette,     GetDefault,
SetAllPalette и определяет запись PaletteType:

   ———————————————————————————————
    Константа       Значение
   ———————————————————————————————
    MaxColors         15
   ———————————————————————————————


                               Типы

     Эта запись  используется  с  GetPalette,  GetDefaultPalette  и
SetAllPalette:

  type
    PaletteType = record
        Size   : Byte;
        Colors : array (0.. MaxColors) of Shortint;
  end;

     Эта запись используется с GetLineSettings:

     type
       LineSettingsType = record
           LineStyle : Word;
           Pattern   : Word;
           Thickness : Word;
     end;

     Эта запись используется с GetTextSettings:

     type
       TextSettingsType = record
           Font      : Word;
           Direction : Word;
           CharSize  : Word;
           Horiz     : Word;
           Vert      : Word;
     end;

     Эта запись используется с GetFillSettings:

     type
       FillSettingsType = record
           Pattern : Word;
           Color   : Word;
     end;

     Эта запись используется с GetFillPattern и SetFillPattern:

     type
       FillPatternType = array [1..8] of Byte; { определяемый
                        пользователем стиль }

     Этот тип определен для Вашего удобства.  Заметим, что оба поля
типа Integer:

     type
       PointType = record
          X,Y: Integer;
     end;

     Эта запись используется с GetViewSettings для получения данных
о текущем окне:

   type
     ViemPortType = integer;
       X1, Y1, X2, Y2: Integer;
       Clip          : Boolean;
   end;

     Эта запись   используется   с   GetArcCoords   и   может  быть
использована для получения информации о последнем  вызове  Arc  или
Ellipse:

   type
     ArcCoordsType = record
        X, Y          : Integer;
        Xstart, Ystart: Integer;
        Xend, Yend    : Integer;
   end;


                            Переменные.

     Эти переменные  указывают на программы управления кучей модуля
Graph.  Если  Ваша  программа  использует   собственные   программы
управления памятью, присвойте адреса Ваших программ распределения и
освобождения памяти переменным GraphGetMemPrt и GraphFreeMemPrt:

——————————————————————————————————————————————————————————————
 Переменная        Значение
——————————————————————————————————————————————————————————————
GraphGetMemPrt      Pointer  (распределение кучи)
GraphFreeMemPrt     Pointer  (освобождение кучи)
——————————————————————————————————————————————————————————————

                            Процедуры.

               Таблица 12.3. Процедуры модуля Graph.

———————————————————————————————————————————————————————————————————
   Arc               Рисует дугу от начального угла к конечному,
                     используя (X,Y) как центр

   Bar               Рисует полосу, используя текущий стиль и цвет.

   Bar3D             Рисует 3-х мерную полосу, используя текущий
                     стиль и цвет.

   Circle            Рисует окружность, используя (X,Y) как центр.

   ClearDevice       Очищает экран и устанавливает текущий указатель
                     (CP) в начало.

   ClearViewPort     Очищает окно.

   CloseGraph        Закрывает графическую систему.

   DetectGraph       Проверяет аппаратуру и определяет какой
                     графический драйвер и в каком режиме
                     используется.

   DrawPoly          Рисует многоугольник текущим цветом и типом
                     линии.

   Ellipse           Рисует эллиптическую дугу от начального угла
                     к конечному, используя (X,Y) как центр.

   FillEllipse       Рисует заполненный эллипс, используя (X,Y) как
                     центр и XRadius и YRadius как горизонтальные
                     и вертикальные оси.

   FillPoly          Заполняет многоугольник, используя
                     сканирование.

   FloodFill         Заполняет ограниченную область, используя
                     текущий шаблон и цвет заполнения.

   GetArcCoords      Позволяет запросить координаты команды Arc.

   GetAspectRatio    Возвращает разрешение экрана из которого может
                     быть вычислен относительный аспект
                     (Xasp/Yasp).

   GetFillPattern    Возвращает шаблон  заполнения, установленный
                     последним вызовом SetFillPattern.

   GetFillSettings   Позволяет запросить текущий шаблон и цвет,
                     установленные SetFillStyle или SetFillPattern.

   GetImage          Сохраняет битовый образ указанной части экрана
                     в буфере.

   GetLineSettings   Возвращает текущие стиль, шаблон и толщину
                     линии, установленные SetLineStyle.

   GetModeRange      Возвращает минимальный и максимальный
                     графические режимы для данного драйвера.

   GetPalette        Возвращает текущую палитру и ее размер.

   GetTextSettings   Возвращает текущий шрифт, направление, размер
                     и выравнивание текста, установленные
                     SetTextStyle и SetTextJustify.

   GetViewSettings   Позволяет запросить текущие параметры окна и
                     отсечения.

   GraphDefaults     Устанавливает текущий указатель (CP) в начало
                     и переустанавливает графическую систему.

   InitGraph         Инициализирует графическую систему и
                     устанавливает устройство в графический режим.

   Line              Рисует линию от (X1,Y1) к (X2,Y2).

   LineRel           Рисует линию от текущего указателя (CP) к
                     точке, лежащей на заданном растоянии.

   LineTo            Рисует линию от текущего указателя к (X,Y).

   MoveRel           Передвигает текущий указатель (CP) на заданное
                     расстояние от его текущей позиции.

   MoveTo            Передвигает текущий указатель (CP) в (X,Y).

   OutText           Выводит текст на экран от текущего указателя.

   OutTextXY         Выводит текст на экран.

   PieSlice          Рисует и заполняет сектор, используя (X,Y) как
                     центр и рисуя от начального угла к конечному.

   PutImage          Выводит битовый образ на экран.

   PutPixel          Рисует точку (пиксел) в (X,Y).

   Rectangle         Рисует прямоугольник, используя текущий цвет и
                     тип линии.

   RestoreCRTMode    Восстанавливает видеорежим, который был до
                     инициализации графики.

   Sector            Рисует и заполняет сектор эллипса.

   SetActivePage     Устанавливает  активную  страницу для
                     графического вывода.

   SetAllPalette     Изменяет цвет палитры.

   SetAspectRatio    Изменяет значение относительного аспекта.

   SetBkColor        Устанавливает цвет фона.

   SetColor          Устанавливает основной цвет, которым  будет
                     осуществляться рисование.

   SetFillPattern    Выбирает шаблон заполнения, определенный
                     пользователем.

   SetFillStyle      Устанавливает шаблон заполнения и цвет.

   SetGraphBufSize   Позволяет изменить размер буфера для функций
                     заполнения.

   SetGraphMode      Переводит систему в графический режим и
                     очищает экран.

   SetLineStyle      Устанавливает текущие толщину и стиль линии.

   SetPalette        Изменяет один цвет палитры, указанный через
                     ColorNum и Color.

   SetRGBPallete     Позволяет модифицизовать палитру для IBM 8514
                     и VGA.

   SetTextJustify    Устанавливает выравнивание текста,
                     используемое OutText и OutTextXY.

   SetTextStyle      Устанавливает текущий шрифт, стиль и размер
                     текста.

   SetUserCharSize   Позволяет изменить ширину и высоту  символа
                     для штрихового шрифта.

   SetViewPort       Устанавливает текущее окно для графического
                     вывода.

   SetVisualPage     Устанавливает номер видимой графической
                     страницы.

   SetWriteMode      Устанавливает режим вывода (копирование или
                     XOR) для линий, рисуемых с DrawPoly, Line,
                     LineRel, LineTo, Rectangle.
———————————————————————————————————————————————————————————————————

                               Функции

                Таблица 12.4. Функции модуля Graph.

———————————————————————————————————————————————————————————————————
   GetBkColor        Возвращает текущий фоновый цвет.

   GetColor          Возвращает текущий цвет.

   GetDefaultPalette Возвращает   аппаратную   палитру   в   записи
                     PaletteType.

   GetDriverName     Вoзвращает строку с именем текущего драйвера.

   GetGraphMode      Возвращает текущий графический режим.

   SetMaxColor       Возвращает максимальный цвет, который можно
                     задать в SetColor.

   GetMaxMode        Возвращает номер максимального режима текущего
                     загруженного драйвера.

   GetMaxX           Возврашает максимальный Х (разрешение по
                     горизонтали) для текущего графического
                     драйвера и режима.

   GetMaxY           Возвращает максимальный Y (разрешение по
                     вертикали) для текущего графического
                     драйвера и режима.

   GetModeName       Возвращает строку с именем указанного
                     графического режимаю.

   GetPaletteSize    Возвращает размер таблицы  палитры.

   GetPixel          Возвращает цвет точки в (X,Y).

   GetX              Возвращает координату X текущей позиции (CP).

   GetY              Возвращает координату Y текущей позиции (СР).

   GraphErrorMsg     Возвращает строку сообщения об ошибке для
                     заданного кода ErrorCode.

   GraphResult       Возвращает код ошибки для последней
                     графической операции.

   ImageSize         Возвращает число байт, требуемое для
                     заполнения прямоугольной области экрана.

   InstallUserDriver Устанавливает  пользовательский  драйвер
                     устройства в BGI таблицу драйверов устройств.

   InstallUserFont   Устанавливает новый шрифт, который не встроен
                     в BGI систему.

   RegisterBGIdriver Регистрирует  драйвер BGI для графической
                     системы.

   RegisterBGIfont   Регистрирует шрифт BGI для графической
                     системы.

   TextHeight        Возвращает высоту строки в пикселах.

   TextWidth         Возвращает ширину строки в пикселах.
———————————————————————————————————————————————————————————————————

   Для детального описания этих процедур и функций  см.  Справочное
руководство по библиотеке.
