/*
 *  call-seq:
 *    Surface.load_from_string( data [,type] )  ->  Surface
 *
 *  Load an image file from memory (in the form of the given data) to a Surface.
 *  If the image has an alpha channel (e.g. PNG with transparency), the Surface
 *  will as well. If the image cannot be loaded (for example if the image
 *  format is unsupported), will raise SDLError.
 *
 *  This method is only usable if Rubygame was compiled with the SDL_image
 *  library; you can check Rubygame::VERSIONS[:sdl_image] to see if it was.
 *
 *  This method takes these arguments:
 *  data:: a string containing the data for the image, such as IO::read would
 *         return.
 *  type:: The type of file that the image is (i.e. 'TGA').  Case is not 
 *         important.  If absent, the library will try to automatically
 *         detect the type.
 *
 *  These formats may be supported, but some may not be available on a
 *  particular system.
 *  BMP:: "Windows Bitmap" format.
 *  GIF:: "Graphics Interchange Format."
 *  JPG:: "Independent JPEG Group" format.
 *  LBM:: "Linear Bitmap" format (?)
 *  PCX:: "PC Paintbrush" format
 *  PNG:: "Portable Network Graphics" format.
 *  PNM:: "Portable Any Map" format. (i.e., PPM, PGM, or PBM)
 *  TGA:: "Truevision TARGA" format.
 *  TIF:: "Tagged Image File Format"
 *  XCF:: "eXperimental Computing Facility" (GIMP native format).
 *  XPM:: "XPixMap" format.
 */
VALUE rbgm_image_load_from_string( int argc, VALUE *argv, VALUE obj)
{
        Check_Type(argv[0], T_STRING);
        /* There's probably a better way of using a string as raw data than this,
         * but I don't know it. */
        void *raw = (void *)RSTRING_PTR(argv[0]);
        int len = RSTRING_LEN(argv[0]);
        
        SDL_RWops *rw = SDL_RWFromMem(raw,len);
        
        SDL_Surface *surf;
        if(argc > 1) {
                Check_Type(argv[1], T_STRING);
                surf = IMG_LoadTyped_RW(rw, 1,StringValuePtr(argv[1]));
        } else {
                surf = IMG_Load_RW(rw,1);
        }
        
        if(surf == NULL)
        {
                rb_raise(eSDLError,"Couldn't load image from string: %s", IMG_GetError());
        }
        return Data_Wrap_Struct( cSurface, 0, SDL_FreeSurface, surf);  
}