19.5.5.3. Низкоуровневое управление палитрой EGA/VGA. В графическом режиме нет проблем поменять палитру (если, конечно, в ПЭВМ стоит плата EGA, VGA или IBM8514). Но это невозможно сделать в текстовом режиме, поскольку рассмотренные выше процедуры работают только после инициализации графики. Можно напрямую изменять программную палитру, даже в текстовом режиме, используя функцию 10H прерывания 10H. Надо только правильно закодировать аппаратный цвет. Структура байта, представляющего собой один аппаратный цвет (составляемый смешением компонентов), показана на рис. 19.25.

- 447 -

-- Бит → Компонент цвета

0 -- B → синий, интенсивность 2/3

1 -- G → зелёный, интенсивность 2/3

2 -- R → красный, интенсивность 2/3

3 -- b → синий, интенсивность 1/3

4 -- g → зелёный, интенсивность 1/3

5 -- r → красный, интенсивность 1/3

6 -- не используется

7 -- не используется

Рис. 19.25

Как видно, для каждого чистого цвета R, G и В имеется возможность получить три градации яркости: 1/3 интенсивности, 2/3 интенсивности и 1/3+2/3=1 интенсивности. Кроме того, возможны различные комбинации битов в регистрах. Возможное количество цветов равно двум в степени шесть (это 64 — от 0 до 63).

Как заменить программный цвет номер ColorNum на аппаратный RGBrgb, построенный по схеме рис. 19.25, показано на рис. 19.26. Для вызова прерывания требуется подключение модуля DOS.

| USES DOS; { необходим модуль DOS }

| PROCEDURE SetPalColor( ColorNum, RGBrgb : ShortInt );

| VAR

| Regs : Registers; { нужна для вызова DOS.Intr() }

| BEGIN

| with Regs do begin

| { действия с полями Regs }

| AX := $1000; { AL=$00, AH=$10 }

| BL := ColorNum; { номер изменяемого цвета }

| BH := RGBrgb { присваиваемое ему значение }

| end; {with}

| Intr( $10, Regs ) { прерывание 10H - сервис EGA }

| END;

Рис. 19.26

- 448 -

<p>19.6. Битовые графические операции</p><p>19.6.1. Битовые операции</p>

19.6.1.1. Опрос пикселов. Турбо Паскаль позволяет организовать прямой доступ к каждому пикселу экрана. Делается это функцией

GetPixel( X, Y : Integer )

которая возвращает значение типа Word — номер цвета пиксела с координатами (X,Y). Поскольку обычно номер цвета лежит в диапазоне 0..15 или меньше, значащим является только младший байт.

Приведем пример процедуры копирования изображения с графического экрана на одноцветный принтер (рис. 19.27). Это адаптированная версия процедуры из пакета Turbo Graphix Toolbox 4.0. Ее алгоритм довольно прост: поскольку на принтере можно воспроизвести только два цвета — черный и белый, то каждый пиксел экрана проверяется на совпадение с фоном. Если цвет есть (т.е. его значение не равно фоновому), то на принтер выводится точка, если цвета нет, то точка не выводится. В процедуру CopyToPRN передаются координаты прямоугольной области экрана X1... Y2 и два цвета, принимаемые за фоновые. Один из них — действительно фон, а второй может понадобиться, если в изображении есть область иного цвета, служащая фоном для надписей или чего-либо другого.

| CRT, Printer, Graph; { используются эти модули }

| PROCEDURE CopyToPRN(X1,Y1,X2,Y2:Integer;Bk1,Bk2 : Word;

| Inverse : Boolean; Mode : Byte );

| { Mode : 1 = двойная плотность (д/п) 120 точек/дюйм } { 2 = д/п, высокая скорость 120 точек/дюйм } { 3 = четверная плотность 240 точек/дюйм } { 0, 4, 5 = 80 точек/дюйм }

| { 6 = 90 точек/дюйм }

| { Для EPSON-принтеров не из ряда FX задавать Mode=1 }

| { Inverse : если True, то фон печати будет черным }

| VAR

| ScanLine : Integer; {текущая выводимая строка печати }

| n1, n2 : Byte; {специальные значения для принтера }

Рис. 19.27

- 449 -

| { Составление байта для вывода графики на печать }

| FUNCTION ConstructByte( X,Y : Integer) : Byte;

| CONST

| Bits : Array[0..7] of Byte = ( 128,64,32,16,8,4,2,1 );

| { десятичные веса 7-го,6-го,..,0-го бита в байте }

| VAR

| P : Word; { цвет точки (пиксела) }

| CByte, Bit : Byte; { байт и номер бита в нем }

Перейти на страницу:

Поиск

Похожие книги