uses Crt, Graph, Drivers;
var Gd, Gm: Integer; E:TEvent;
    k,i,imsize,x1,x2,y1,y2:integer; x,y,t,dt:real;
type imarray=array[0..1] of byte;
var  p0,p1,p2:^imarray;
const r0=30; r1=00; r2=40; r3=63;
      g0=30; g1=00; g2=40; g3=63;
      b0=30; b1=00; b2=40; b3=63;
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);
setrgbpalette(0,r0,g0,b0);
setrgbpalette(1,r1,g1,b1);
setrgbpalette(2,r2,g2,b2);
setrgbpalette(3,r3,g3,b3);
for k:= 4 to  7 do setrgbpalette(k,r1,g1,b1);
for k:= 8 to 11 do setrgbpalette(k,r2,g2,b2);
for k:=12 to 15 do setrgbpalette(k,r3,g3,b3);
setcolor(12); setfillstyle(7,4); fillellipse(25,25,20,20);
setcolor(8); setfillstyle(1,8); fillellipse(25,25,7,7);
imsize:=imagesize(0,0,50,50);
getmem(p1,imsize); getimage(0,0,50,50,p1^);
setcolor(3); setfillstyle(1,3); bar(0,0,50,50);
getmem(p0,imsize); getimage(0,0,50,50,p0^);
setcolor(2);
for k:=1 to 100
do begin
   setfillstyle(random(12),2);
   x1:=random(640); y1:=random(480);
   x2:=x1+10+random(50); y2:=y1+10+random(50);
   bar(x1,y1,x2,y2)
   end;
setcolor(3);
for k:=1 to 100
do begin
   setfillstyle(random(12),3);
   fillellipse(random(640),random(480),10+random(20),10+random(20))
   end;
setcolor(1);
for k:=1 to 100
do begin
   setfillstyle(random(12),1);
   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;
getmem(p2,imsize);
putimage(0,0,p1^,orput);
x1:=25; y1:=25;
initevents;
while true
do begin
   if keypressed then begin doneevents; closegraph; exit end;
   getmouseevent(E);
   if E.What = evMouseDown
   then begin
        hidemouse;
        x2:=E.Where.X*8; y2:=E.Where.Y*8;
        if x2 < 25 then x2:=25; if x2 > 614 then x2:=614;
        if y2 < 25 then y2:=25; if y2 > 454 then x2:=454;
        dt:=5/sqrt(sqr(longint(x2-x1))+sqr(longint(y2-y1)));
        t:=0;
        while t < 1.
        do begin
           x:=x1+(x2-x1)*t; y:=y1+(y2-y1)*t;
           getimage(round(x)-25,round(y)-25,round(x)+25,round(y)+25,p2^);
           for i:=0 to imsize-1 do p2^[i]:=p2^[i] and p0^[i];
           for i:=0 to imsize-1 do p2^[i]:=p2^[i] or p1^[i];
           putimage(round(x)-25,round(y)-25,p2^,normalput);
           t:=t+dt
           end;
        x1:=round(x); y1:=round(y)
        end;
   showmouse
   end
end.


