[net.sources] Graphics source in C: hsalgs/bbackfill.c

ken@turtleva.UUCP (Ken Turkowski) (12/16/83)

echo x - hsalgs/bbackfill.c
cat >hsalgs/bbackfill.c <<'!Funky!Stuff!'

/* bbackfill.c - fill in partially covered pixels with background */


main(argc,argv)
int argc;	char **argv;
{   short j,i,Xres,Xofset,Yres,Yofset;
    double atof(),redb,grnb,blub;

    bbopen();		/* get Big Buffer */

    Xres = 640;    Xofset = 0;    Yres = 484;    Yofset = 0;
    if (argc < 2)  redb = grnb = blub = 0;
    else if ((argc == 4) || (argc == 8))
    {   redb = atof(argv[1]);   grnb = atof(argv[2]);   blub = atof(argv[3]);
	if ((redb <= 1.) && (grnb <= 1.) && (blub <= 1.))
	{   redb *= 255;    grnb *= 255;    blub *= 255;   }
	if (redb > 255) redb = 255;    if (redb < 0) redb = 0;
	if (grnb > 255) grnb = 255;    if (grnb < 0) grnb = 0;
	if (blub > 255) blub = 255;    if (blub < 0) blub = 0;
	else if (argc == 8)
	{   Xres = atoi(argv[4]);	Xofset = atoi(argv[5]);
	    Yres = atoi(argv[6]);	Yofset = atoi(argv[7]);
	}
    }
    else error("Usage: bbackfill [redbyte grnbyte blubyte [Xres Xofset Yres Yofset]]\n");
 
    for (j=Yres+Yofset-1; j>=Yofset; j--)
    {   unsigned long line[640];
	bbread(Xofset,j,line,Xres);
        for (i=0; i<Xres; i++)
	{   double oldcvr,red,grn,blu;
	    oldcvr = line[i] >> 24;		red = (line[i] >> 16) & 255;
	    grn = (line[i] >> 8) & 255;		blu = line[i] & 255;
	    if ((oldcvr > 0.) && (oldcvr < 255.)) /* check for blend w/ bkgrd */
	    {   double cvrcomp,cvr;
		cvr = oldcvr/255.;
		cvrcomp = 1. - cvr;		/* uncovered part of pixel */
		red = red * cvr + cvrcomp * redb;
		grn = grn * cvr + cvrcomp * grnb;
		blu = blu * cvr + cvrcomp * blub;
		if (red > 255)  red = 255;
		if (grn > 255)  grn = 255;
		if (blu > 255)  blu = 255;
		line[i] = ((short)oldcvr << 24) | ((short)red << 16) |
			  ((short)grn << 8)     |  (short)blu;
	    }
	}
	bbwrite(Xofset,j,line,Xres);
    }
}




!Funky!Stuff!