[SDL] Converting a surface to another color

Viktor Dick dickviktor at gmx.net
Mon Jan 1 06:21:12 PST 2007


Thanks @ all who helped! The following code works now:

----------
SDL_Surface* create_surface(int size)
{
	SDL_Surface* tmp = SDL_CreateRGBSurface(SDL_SWSURFACE, size, size, 32,
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
                        0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff);
#else
                        0x000000ff, 0x0000ff00, 0x00ff0000,	0xff000000);
#endif
	SDL_Surface* result = NULL;
	if( tmp ) {
		result = SDL_DisplayFormat( tmp );
		SDL_FreeSurface( tmp );
	};
	if (!result) cerr << SDL_GetError();
	return result;
};

SDL_Surface* create_marble(int d, Uint8 r, Uint8 g, Uint8 b, bool
top2bottom)
//diameter, red, green, blue. If top2bottom is true, the gradient will
go from top(full given color) to bottom (white).
{
	SDL_Surface* gradient = create_surface(d);
	if (top2bottom)
		for (int i=0; i<d; i++) hlineRGBA(gradient, 0, d, i,
r+(0xff-r)*i/d,g+(0xff-g)*i/d, b+(0xff-b)*i/d, 0xff);
	else
		for (int i=0; i<d; i++) hlineRGBA(gradient, 0, d, d-i,
r+(0xff-r)*i/d,g+(0xff-g)*i/d, b+(0xff-b)*i/d, 0xff);
	SDL_Surface* tmp = create_surface(d);
	filledCircleRGBA(tmp, d/2, d/2, d/2-1, 0, 1, 0, 0xff);
	SDL_SetColorKey(tmp, SDL_SRCCOLORKEY | SDL_RLEACCEL,
SDL_MapRGB(tmp->format, 0, 1, 0));
	drawsurface(tmp,gradient);
	SDL_FreeSurface(tmp);
	SDL_SetColorKey(gradient, SDL_SRCCOLORKEY | SDL_RLEACCEL,
SDL_MapRGB(gradient->format, 0,0,0));
	return gradient;
};


Josh Matthews schrieb:
> Your best bet would probably be creating a default image in the GIMP
> with an alpha mask, then load that with SDL_Image and overwrite the
> pixel data.  Alternatively, you could avoid the alpha mask and just use
> a color key by creating an image with an inverted circle filled with
> pink.  In SDL, make a surface, fill it with your gradient, then copy the
> pink pixels into your surface from your image, set the surface's color
> key and voila!
> 
> On 12/31/06, *Viktor Dick* <dickviktor at gmx.net
> <mailto:dickviktor at gmx.net>> wrote:
> 
>     Thanks. If I understand rightly, the gradient function would put the
>     lines with lineColor or something like that. Is there someone that could
>     give me some code how to apply an alpa mask? I'm not familiar with
>     transparency under SDL and I did not found any tutorial explaining this
>     well enough.
>     Thanks.
> 
>     Josh Matthews schrieb:
>     > What if you had a gradient function that created rectangles, then
>     used a
>     > circular alpha mask?
>     >
>     > On 12/31/06, *Viktor Dick* < dickviktor at gmx.net
>     <mailto:dickviktor at gmx.net>
>     > <mailto:dickviktor at gmx.net <mailto:dickviktor at gmx.net>>> wrote:
>     >
>     >     Hello,
>     >     I'm trying to write a simple 2D-program with SDL (I do not want to
>     >     use OpenGL).
>     >     It is almost ready, but at the moment I paint the marbles of the
>     >     players with
>     >     filledCircleColor. I have painted a circle with gimp with a
>     gradient
>     >     from red
>     >     (bottom) to white (top) so it looks better. I can load the
>     image to
>     >     the program,
>     >     but I need more colors and I do not want create an extra file for
>     >     each color. I
>     >     need also blue, green etc. marbles. Does anyone know how to change
>     >     the color in
>     >     a loaded surface? In the far future, it should also be possible to
>     >     let the users
>     >     switch their colors, so it would not be possible to give a
>     picture
>     >     of each
>     >     possible color with the package.
>     >     Thanks
>     >     Viktor
>     >
>     >
>     >     _______________________________________________
>     >     SDL mailing list
>     >     SDL at libsdl.org <mailto:SDL at libsdl.org> <mailto:SDL at libsdl.org
>     <mailto:SDL at libsdl.org>>
>     >     http://www.libsdl.org/mailman/listinfo/sdl
>     <http://www.libsdl.org/mailman/listinfo/sdl>
>     >
>     >
>     >
>     >
>     > --
>     > Cheers,
>     > Josh
>     >
>     > PGP: http://revvy.box43.net/Josh_Matthews.asc
>     >
>     >
>     >
>     ------------------------------------------------------------------------
> 
>     >
>     > _______________________________________________
>     > SDL mailing list
>     > SDL at libsdl.org <mailto:SDL at libsdl.org>
>     > http://www.libsdl.org/mailman/listinfo/sdl
>     <http://www.libsdl.org/mailman/listinfo/sdl>
> 
> 
>     _______________________________________________
>     SDL mailing list
>     SDL at libsdl.org <mailto:SDL at libsdl.org>
>     http://www.libsdl.org/mailman/listinfo/sdl
>     <http://www.libsdl.org/mailman/listinfo/sdl>
> 
> 
> 
> 
> -- 
> Cheers,
> Josh
> 
> PGP: http://revvy.box43.net/Josh_Matthews.asc
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> SDL mailing list
> SDL at libsdl.org
> http://www.libsdl.org/mailman/listinfo/sdl





More information about the SDL mailing list