INCLUDE "H6:RGBCIRCL.ACT" ;from task Midpoint circle algorithm RGB black,white,yellow,blue DEFINE PTR="CARD" TYPE PointB=[BYTE px,py] TYPE Queue=[PTR qfront,qrear,qdata INT capacity] PROC QueueInit(Queue POINTER q) DEFINE MAXSIZE="500" CARD ARRAY a(MAXSIZE) q.qfront=0 q.qrear=0 q.capacity=MAXSIZE q.qdata=a RETURN BYTE FUNC IsQueueEmpty(Queue POINTER q) IF q.qfront=q.qrear THEN RETURN (1) FI RETURN (0) PROC QueuePush(Queue POINTER q PointB POINTER p) PTR rear PointB POINTER tmp rear=q.qrear+1 IF rear=q.capacity THEN rear=0 FI IF rear=q.qfront THEN Break() FI tmp=q.qdata+q.qrear*2 tmp.px=p.px tmp.py=p.py q.qrear=rear RETURN PROC QueuePop(Queue POINTER q PointB POINTER p) PointB POINTER tmp IF IsQueueEmpty(q) THEN Break() FI tmp=q.qdata+q.qfront*2 p.px=tmp.px p.py=tmp.py q.qfront==+1 IF q.qfront=q.capacity THEN q.qfront=0 FI RETURN PROC DrawImage(RgbImage POINTER img BYTE x,y) RGB POINTER p BYTE i,j p=img.data FOR j=0 TO img.h-1 DO FOR i=0 TO img.w-1 DO IF RgbEqual(p,yellow) THEN Color=1 ELSEIF RgbEqual(p,white) THEN Color=2 ELSEIF RgbEqual(p,blue) THEN Color=3 ELSE Color=0 FI Plot(x+i,y+j) p==+RGBSIZE OD OD RETURN PROC FloodFill(RgbImage POINTER img BYTE x0,y0 RGB POINTER col) Queue q RGB c,tmp PointB p GetRgbPixel(img,x0,y0,c) IF RgbEqual(c,col) THEN RETURN FI p.px=x0 p.py=y0 QueueInit(q) QueuePush(q,p) WHILE IsQueueEmpty(q)=0 DO QueuePop(q,p) x0=p.px y0=p.py GetRgbPixel(img,x0,y0,tmp) IF RgbEqual(tmp,c) THEN SetRgbPixel(img,x0,y0,col) IF x0>0 THEN GetRgbPixel(img,x0-1,y0,tmp) IF RgbEqual(tmp,c) THEN p.px=x0-1 p.py=y0 QueuePush(q,p) FI FI IF x00 THEN GetRgbPixel(img,x0,y0-1,tmp) IF RgbEqual(tmp,c) THEN p.px=x0 p.py=y0-1 QueuePush(q,p) FI FI IF y0