Re: iterating through colors

Search this archive.

From: Sergio Masci (sergio@titan.demon.co.uk)
Date: Tue 11 Jul 2000 - 21:20:12 IDT


> This is another generic graphics programming question, but hopefully
> someone will know the answer.
> 
> How do I iteratate through the colors?  It seems like it should be simple,
> but it's not behaving as expected.  I'm writing a little something that
> draws a color wheel on the screen at 800x600x64K.  Just for kicks, suppose
> that it's just drawing vertical lines, so the code looks like this:
> 
> ...
> color = 0;
> for (xnow = 0; xnow < xmax; xnow++)
>   gl_line(xnow,0,xnow,ymax,color++);
> ...
> 
> I come up with about 13 identical sections of color fading.
> the same happens if I do 
> 
> vga_setcolor(color++);
> vga_drawline(xnow,0,xnow,ymax);
> 
> 
> Is there a way that I can do what I am trying simply?
> 
> Regards,
> 
> -patrick


I don't use the gl libraries or the vga_setcolor or vga_drawline
functions so I cannot give a concrete answer BUT it looks to me as
though the colour is a direct copy of the hardware pixel used in the
800x600x64K mode. In this mode the colours are packed into a 16 bit word
something like 6:5:5 or 6:6:4 I cannot remember exactly.

Try experimenting with the following:

float	fx, fy, fz;
int	x, y
	red, green, blue, pixel;

for (x=0; x<800; x++)
{
	for (y=0; y<600; y++)
	{
		fx = (float)x / 799;
		fy = (float)y / 599;
		fz = sqrt(x * x + y * y) / sqrt(799*799 + 599*599);

		red   = 0x2f * fx;
		blue  = 0x1f * fy;
		green = 0x1f * fz;

		pixel = (red << 10) | (green << 5) | blue;

		vga_setcolor(pixel);
		vga_drawline(x,y,x,y);
	}
}

You should end up with a box, one corner of which should be black,
diagnally opposit will be white, one other corner should be blue and the
last should be red (no pure green since this component is generated from
blue and red and so does not exist in this square without them).

Regards
Sergio


This archive was generated by hypermail 2.1.4 : Wed 21 Jan 2004 - 22:10:23 IST