Something like this:
//! get suggested arguments for SGLT_convert and glTexImage2D(3x)
/*!
\param internalformat suggested internalformat
\param format suggested format
\param type suggested type
\return false on error
*/
extern int SGLT_getSuggestedArgs(SDL_Surface *src,
GLint *internalFormat,
GLenum *format, GLenum *type);
//! try to convert surface to format suitable for glTexImage2D(3x)
/*!
\param src the source surface (in)
\param internalformat internalformat which will be used
\param format format which will be used
\param type hint which type will be used (in/out)
\return surface where surface->pixels is suitable
for a call to glTexImage2D
or NULL on error
\note the returned surface may be the same as the src surface
if no conversion was necessary
*/
extern SDL_Surface * SGLT_convert(SDL_Surface *src,
GLint internalFormat,
GLenum format, GLenum type);
example usage: (no error checking done)
SDL_Surface* src=IMG_Load(…);
GLint internalFormat;
GLenum format,type;
SGLT_getSuggestedArgs(src,&internalformat,&format,&type);
SDL_Surface* t=SGLT_convert(src,internalformat,format,type);
if (t!=src) SDL_FreeSurface(src);
if (SDL_MUSTLOCK(t)) SDL_LockSurface(t);
glTexImage2D(xtarget,xlevel,internalFormat,
t->width,t->height,xborder,format,type,s->pixels);
if (SDL_MUSTLOCK(t)) SDL_UnlockSurface(t);
SDL_FreeSurface(t);
t=src=NULL;