uses Crt, Graph;
var Gd, Gm: Integer;
    k,t,x1,y1,x2,y2: integer;
    pal1,pal2:array[0..15] of record r,g,b:integer end;
begin
 randomize;
 Gd := Detect;
 InitGraph(Gd, Gm, 'c:\bp\bgi');
 if GraphResult <> grOk then  Halt(1);
 for k:=0 to 15 do setpalette(k,k);
 for k:=0 to 15
 do case k div 4 of
    0: begin pal1[k].r:=63; pal1[k].g:=0;  pal1[k].b:=63 end;
    1: begin pal1[k].r:=8;  pal1[k].g:=8;  pal1[k].b:=8  end;
    2: begin pal1[k].r:=16; pal1[k].g:=16; pal1[k].b:=16 end;
    3: begin pal1[k].r:=30; pal1[k].g:=30; pal1[k].b:=30 end;
    end;
 for k:=0 to 15
 do case k mod 4 of
    0: begin pal2[k].r:=0;  pal2[k].g:=63; pal2[k].b:=0  end;
    1: begin pal2[k].r:=50; pal2[k].g:=50; pal2[k].b:=50 end;
    2: begin pal2[k].r:=00; pal2[k].g:=00; pal2[k].b:=00 end;
    3: begin pal2[k].r:=63; pal2[k].g:=63; pal2[k].b:=63 end;
    end;
 setfillstyle(1,4*1); setcolor(4*1);
 for k:=1 to 100
 do begin
    x1:=random(640); y1:=random(480);
    x2:=x1+10+random(50); y2:=y1+10+random(50);
    bar(x1,y1,x2,y2)
    end;
 setfillstyle(1,4*2); setcolor(4*2);
 for k:=1 to 100
 do fillellipse(random(640),random(480),10+random(20),10+random(20));
 setfillstyle(1,4*3); setcolor(4*0);
 for k:=1 to 100
 do begin
    x1:=random(640); y1:=random(480);
    x2:=x1+random(50); y2:=y1+random(50);
    bar3D(x1,y1,x2,y2,(x2-x1+1) div 4,TopOn)
    end;
 setwritemode(XORPut);
 setcolor(1);
 for k:=1 to 100 do line(random(640),random(480),random(640),random(480));
 setcolor(2);
 for k:=1 to 10000
 do begin
    x1:=random(640); y1:=random(480);
    x2:=x1+random(50); y2:=y1+random(100)-50;
    line(x1,y1,x2,y2)
    end;
 setcolor(3);
 for k:=1 to 500
 do begin
    x1:=random(640); y1:=random(480);
    x2:=x1+random(50); y2:=y1+random(50);
    rectangle(x1,y1,x2,y2)
    end;
 while true
 do begin
    if keypressed then begin CloseGraph; exit end;
    for t:=0 to 20
    do for k:=0 to 15
       do setrgbpalette(k,pal1[k].r+(pal2[k].r-pal1[k].r)*t div 20,
                          pal1[k].g+(pal2[k].g-pal1[k].g)*t div 20,
                          pal1[k].b+(pal2[k].b-pal1[k].b)*t div 20);
    delay(3000);
    for k:=0 to 15 do setrgbpalette(k,pal1[k].r,pal1[k].g,pal1[k].b);
    delay(1000)
    end
end.


