*****************************************************************/
/* CONVOLVE.C - Turbo C 2.0 implementation of image convolution */
/* ---------- by Wesley G. Faler. All code is "as is". There */
/* is NO copyright. Use this code as you will, and if you make */
/* money at it, good for you. */
/*****************************************************************/
#include<slib.h>
#include<sio.h>
#include<graphics.h>
#include<alloc.h>
#include<ctype.h>
int load_cut(char *fname);
int load_convolution_maix(char *fname);
int convolve_image(void);
int swap_pictures(void);
int minx,maxx,miny,maxy;
int LOADPAGE=0;
int ENHANCEPAGE=1;
int *cmat, *pmat, *vmat;
int cmx,cmy,cmnum;
suct palettetype palette,newpal;
int driver,mode;
int cleancut=-1;
int init_graphics(void)
{
driver=DETECT; mode=0;
detectgraph(&driver,&mode);
if(driver==VGA) mode=VGAMED;
initgraph(&driver,&mode,"");
getpalette(&palette);
getpalette(&newpal);
}
int cleanup_image(void)
{
int i,j,num,x,y,k;
if(cleancut<0) return;
setactivepage(LOADPAGE);
setvisualpage(ENHANCEPAGE);
for(x=minx;x<maxx;x ) {
for(y=miny;y<maxy;y ) {
if(getpixel(x,y)!=0) num=-1;
else num=0;
for(j=-1;j<2;j ) {
for(i=-1;i<2;i ) {
if(getpixel(x i,y j)!=0) num ;
}
}
if(num>cleancut) {
k=getpixel(x,y);
setactivepage(ENHANCEPAGE);
putpixel(x,y,k);
setactivepage(LOADPAGE);
}
}
}
k=ENHANCEPAGE; ENHANCEPAGE=LOADPAGE; LOADPAGE=k;
}
void show_test_image(void)
{
int i;
minx=cmx; miny=cmy;
maxx=100 minx; maxy=100 miny;
setcolor(1);
moveto(minx,miny);
randomize();
for(i=0;i<20;i )
lineto(random(100) minx,random(100) miny);
for(i=0;i<10;i )
fillellipse(random(50) 25 minx,random(50) 25 miny,random(25),random(25));
}
main()
{
char fname[50];
int flag=0;
load_convolution_maix("maix.dat");
printf(".CUT file (1) or test image (0)?");
scanf("%d",&flag);
flag= flag? 1:0;
if(flag) {
fflush(sin);
printf("filename to process:");
gets(fname);
}
printf("Delete pixels with x or fewer neighbors. x=");
scanf("%d",&cleancut);
if(cleancut>8) cleancut=8;
init_graphics();
setactivepage(1); cleardevice();
setactivepage(0); cleardevice();
setactivepage(LOADPAGE); setvisualpage(LOADPAGE);
if(flag) load_cut(fname);
else show_test_image();
cleanup_image();
setvisualpage(ENHANCEPAGE);
convolve_image();
swap_pictures();
restorecrtmode();
}
int toggle_colors(char c)
{
c=tolower(c);
c=c-'a';
if(c<0 || c>=palette.size) return 0;
newpal.colors[c]= palette.colors[c]-newpal.colors[c];
setpalette(c,newpal.colors[c]);
return 1;
}
int swap_pictures(void)
{
int mode=0;
char a;
setvisualpage(LOADPAGE);
for(;;) {
a=getch();
if(a==27) return;
if(toggle_colors(a)) continue;
if(mode==0) setvisualpage(ENHANCEPAGE);
if(mode==1) setvisualpage(LOADPAGE);
mode=1-mode;
}
}