Заливка площадных фигур "прозрачными" шаблонами
При заполнении замкнутых областей тем или иным узором изменению цвета подвергаются все пикселы, попадающие под биты шаблона. Под "прозрачным" шаблоном мы будем понимать такой вариант заполнения, при котором единичные пикселы шаблона тем или иным способом взаимодействуют с пикселами изображения, а нулевые биты шаблона не изменяют цвет соответствующих элементов рисунка. Таким образом, в шаблоне могут быть созданы участки, сквозь которые просвечивает прежний рисунок или его фон.
Идея создания такого эффекта довольно проста. Из прямоугольной области черного экрана (цвет рисования по умолчанию равен 15, а цвет фона равен 0), на которую предстоит наложить прозрачный шаблон, логически вырезаются и запоминаются два битовых массива. 0дин из них формируется путем обычного наложения шаблона с его будущим цветом, а второй — также путем обычного наложения шаблона, получающегося в результате инвертирования битов исходного шаблона. Цвет такого "антишаблона" устанавливается равным 15 (в двоичном представлении такой цвет имеет код 1111). Второй массив предназначен для сохранения кодов цвета тех пикселов изображения, которые попадут под нулевые биты исходного шаблона, т. е. для прорезания в изображении траектории, образуемой единичными битами шаблона. Выполняется такое вырезание путем наложения "антимассива" на изображение по операции AND. На расчищенное таким образом место по операции X0R наносится изображение исходного шаблона.
В приведенной ниже программе область изображения представлена квадратом (0,0,300,300), закрашенным цветом fon, который выбирается случайным образом. В точках с координатами (60,60) и (240,240) проводятся красные окружности радиусом в 30 пикселов. "Прозрачный" и обычный шаблоны, покрывающие квадратные области размером 100x100, своими центрами совпадают с центрами окружностей. Их узор состоит из пилообразных линий цвета c1, а цвет фоновых пикселов — черный (по умолчанию).
Результат работы программы лучше увидеть своими глазами. После вывода очередного изображения программа ждет нажатия любой клавиши и прекращает работу, опознав код клавиши <Esc>.
Программа 8_12.с
/* "Прозрачный шаблон"*/
#include <graphics.h>
#include <stdlib.h>
#include <alloc.h>
main () {
int gd=0,gm;
int cl,fon;
char q,
patl[] = {0x81,0x42,0x24,0x18,0x00,0x00,0x00, 0x00},
pat2[] = {0x7E,0xBD,0xDB,0xE7,0xFF,0xFF,0xFF, 0xFF};
int xyl[]={0,0,300,0,300,300,0,300} ;
long k;
char far *pl,*p2;
initgraph(Sgd,&gm,"") ;
k=imagesize(10,10,110,110) ;
pl=farmalloc(k); /* Запрос памяти */
p2=farmalloc(k);
m:
fon=random(15)+1;
ml:
cl=random(15)+1;
if((cl==fon)) goto ml; /*3апоминание битового образа шаблона в заливаемой области*/
setfillstyle(12,0);
setfillpattern(patl,cl);
bar(10,10,110,110);
getimage(10,10,110,110,pi); /*3апоминание битового образа антишаблона V
setfillstyle(12,0);
setfillpattern(pat2,15);
bar(10,10,110,110);
getimage(10,10,110,110,p2); /*Формирование изображения */
setfillstyle(l,fon);
fillpoly(4,xyl);
setcolor (4);
circle(60,60,30) ; /* Вырезание профиля шаблона */
putimage(10,10,р2,AND_PUT); /*Вклеивание "прозрачного" шаблона*/
putimage(10, 10,pl,X0R_PUT) ; /*3аливка обьмным непрозрачным шаблоном*/
setcolor (4);
circle(240,240,30);
setfillstyle(12,0);
setfillpattern(patl,cl);
bar(190,190,290,290); /* 0жидание нажатия клавиши. Выход по нажатию Esc*/
q=getch();
if(q != 0xlb) goto m;
closegraph(); }