Re: iterating through colors

Search this archive.

From: Patrick Mochel (mochelp@ironarm.com)
Date: Fri 14 Jul 2000 - 07:30:21 IDT


Thanks for the example, but it wasn't quite _exactly_ what I was looking
for.  I've attached a file with what I was trying to do (well, for the
most part).  I haven't quite got a smooth transition to and from
green:  it uses 6 bits while red and blue use 5, so I increment and
decrement green by 1.5, since its max value is 0x2f, (~1.5 * 0x1f)...but
is' not smooth...


On Tue, 11 Jul 2000, Sergio Masci wrote:

> > 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