This topic is now archived and is closed to further replies.

Ronin Magus

Creating a copy of SDL_Surface?

Recommended Posts

I''m trying to make an exact copy of an SDL_Surface, for the purpose of implementing an operator= function for my Image class. I''ve written a function which uses memcpy and CreateRGBSurface (with a set pixel depth, which I don''t like.. I''d want my pixel depth to vary.) The original surface, its transparent RGB colors (ints transr, transg, transb) are stored in an Image class. I''m wondering if there is a better way to copy the Surface than what I have implemented below, it seems terrible cumbersome and limited (by the depth in the call to SDL_CreateRGBSurfaceFrom. Could anyone at least tell me how to determine the depth of a surface?)
Image & Image::operator=(const Image & img)
	unsigned char * newPixels = NULL;
	unsigned int surfaceSize;
	// free the surface if there is already one loaded in this image


	surfaceSize =>w *>h *>format->BytesPerPixel;

	newPixels = new unsigned char[surfaceSize];

	// copy the data

	memcpy(newPixels,>pixels, surfaceSize);

	surf = SDL_CreateRGBSurfaceFrom(newPixels,>w,>h, 24,>pitch,>format->Rmask,>format->Gmask,>format->Bmask,>format->Amask);

	SetTransparent(img.transr, img.transg, img.transb);

	return *this;

Share this post

Link to post
Share on other sites>format->BytesPerPixel

Isn't that giving you the depth?

In cas you want bit-depth (not pixel-depth), do this:>format->BitsPerPixel

BTW, surface->pixels may be NULL, you should SDL_LockSurface() before accessing the pixels, and SDL_UnlockSurface() after.

More BTW:
You're leaking memory, unless you delete[] the surface->pixel later (and you only use this class with your own bitmaps, never ones returned from SDL_CreateRGBSurface() or SDL_LoadBMP() ).

A better solution would be something like this:

  • Create a new surface with SDL_CreateRGBSurface (not SDL_CreateRGBSurfaceFrom), using the same width/height/depth values as your original surface
  • Lock both surfaces
  • memcpy the original->pixels into the new->pixels
  • Unlock both surfaces

[edited by - TravisWells on March 16, 2003 11:34:39 PM]

Share this post

Link to post
Share on other sites