19.5.2. Задание типа заливки
В модуле Graph предусмотрены процедуры, с помощью которых можно заполнить (залить) определенным «узором» любую замкнутую область изображения. Вид «узора» задается так называемым шаблоном заливки. В Турбо Паскале предопределен ряд стандартных шаблонов, но кроме того, имеется возможность конструировать собственные.
19.5.2.1. Построение шаблона заливки. Рассмотрим, как можно получить на экране полутоновые изображений любого цвета из стандартного набора цветов, т.е. как расширить за счет введения полутоновых заполнений цветовые возможности адаптера. Составим шаблоны для заливки полутоновых изображений (рис. 19.21).
На этом рисунке изображены типовые матрицы 8x8, используя которые можно создать полутоновые изображения любыми двумя
- 436 -
Рис. 19.21
цветами. Тип переменной для задания матрицы заполнения объявлен в модуле Graph как массив:
| TYPE
FillPatternType : Array [1..8] of Byte
Таким образом, каждую матрицу можно представить, как показано на рис. 19.22.
Рис. 19.22
- 437 -
Если рассмотреть первую строку в шаблоне 25%-го заполнения, то получится 01000100 в двоичной системе счисления (68 в десятеричной или $44 в шестнадцатиричной). Следующая строка — 00010001 в двоичной (17 в десятеричной или $11 в шестнадцатеричной) и т.д. В результате мы можем получить константу
CONST
Fill_25 : FillPatternType =
( $44, $17, $44, $17, $44, $17, $44, $17 )
Подобные константы можно задать для любого из шаблонов с рис. 19.21. Если программы должны работать на ПЭВМ с монохромным дисплеем (MDA, Hercules), то наличие разных по яркости шаблонов заполнения может скомпенсировать отсутствие цветных возможностей у монитора.
19.5.2.2. Назначение шаблона заполнения (заливки). Оно производится процедурой
SetFillStyte( Pattern : Word; Color : Word )
где параметр Pattern определяет вид шаблона заливки, a Color — его цвет. Все разрешенные значения параметра Pattern предопределены в модуле Graph в виде констант:
CONST
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 { заливка, определенная программистом }
Наиболее интересна здесь константа UserFill. Она используется для определения типа заливки, который предварительно был задан в программе. Для задания своего нового шаблона необходимо воспользоваться процедурой
SetFillPattern(PattMatrix : FillPatternType; Color : Word)
передав ей в параметре PattMatrix матрицу шаблона заливки и указав цвет параметром Color. Эта процедура по действию, вообще говоря,
- 438 -
аналогична SetFillStyle, но устанавливает только «самодельные» шаблоны. Процедура SetFillStyle удобнее, особенно в приложениях деловой графики (гистограммы, круговые диаграммы и т.п.). Задавая хотя бы раз новый шаблон, мы автоматически связываем его со значением UserFill и далее можем манипулировать всеми тринадцатью шаблонами. Если же задать UserFill, не определив перед этим новый шаблон, то функция GraphResult возвратит значение -11 (grError) и все установки вида шаблона и цвета останутся прежними. По умолчанию устанавливается шаблон SolidFill и цвет с номером, максимальным для текущего графического режима.
Несколько слов о назначении цвета при заливке. В обеих процедурах назначения шаблона переменная Color определяет цвет, которым исполняется шаблон. Цвет фона при этом остается неизменным. Это создает некоторые трудности при создании цветовой смеси. Например, цвет фона обычно задается черным (Black), а требуется создать 50%-ю смесь коричневого и синего цветов. Казалось бы, просто: рисуем фигуру, заливаем ее сплошным коричневым и потом заливаем ее 50%-м шаблоном синего. Однако после этих операций получится фигура, залитая чисто синим 50%-и яркости. Дело в том, что процедуры заливки в Турбо Паскале реализованы, на наш взгляд, не очень корректно (чего нельзя сказать о реализации этих процедур в системе Quick Pascal фирмы Microsoft): там, где в двоичном коде шаблона стоят единицы, процедуры ставят точки цвета Color, а там, где нули, — вместо того чтобы ничего не рисовать, они ставят точки цвета текущего фона. Выход из этой ситуации может быть найден с помощью средств, описанных в разд. 19.5. «Управление палитрой».
19.5.2.3. Анализ шаблона заполнения. Рассмотрим процедуры получения информации о текущих установках шаблонов заливки. Так, процедура
GetFillSettings(VAR FillType : FillSettingsType )
возвращает в переменной FillType предопределенного типа
TYPE
FillSettingsType = RECORD
Pattern : Word; { шаблон }
Color : Word; { цвет }
END;
номер шаблона из списка, представленного при описании процедуры SetFillStyle (поле Pattern), и цвет, которым наносится этот шаблон (поле Color). Если значение поля Pattern оказалось равным UserFill,
- 439 -
то для получения подробной информации следует вызвать процедуру
GetFillPattern( VAR PattMatrix : FillPatternType )
возвращающую в переменной типа FillPatternType матрицу последнего определенного пользователем шаблона.