Uint32 OpenGLGraphics::CreateSurface ( Uint32 _width, Uint32 _height, bool _isColorKeyed ) { OpenGLTexture *tex = new OpenGLTexture(); tex->Create ( _width, _height, _isColorKeyed ); Uint32 ret = m_textures.insert ( tex ); return ret; }
Uint32 OpenGLGraphics::LoadImage ( const char *_filename, bool _isColorKeyed ) { ARCReleaseAssert ( _filename != NULL ); // Load the image from RAM. SDL_Surface* src = g_app->m_resource->GetImage ( _filename ); // use SDL_Image to load the image ARCReleaseAssert ( src != NULL ); Uint32 oldWidth = 0, oldHeight = 0; Uint32 rmask, gmask, bmask, amask; #if SDL_BYTEORDER == SDL_BIG_ENDIAN rmask = 0xff000000; gmask = 0x00ff0000; bmask = 0x0000ff00; amask = 0x000000ff; #else rmask = 0x000000ff; gmask = 0x0000ff00; bmask = 0x00ff0000; amask = 0xff000000; #endif Uint32 targetW = src->w, targetH = src->h; if ( !g_openGL->GetSetting ( OPENGL_TEX_ALLOW_NPOT, false ) ) { oldWidth = targetW, oldHeight = targetH; if ( !isPowerOfTwo ( targetW ) ) targetW = nearestPowerOfTwo ( targetW ); if ( !isPowerOfTwo ( targetH ) ) targetH = nearestPowerOfTwo ( targetH ); ARCReleaseAssert ( isPowerOfTwo ( targetW * targetH ) ); } if ( g_openGL->GetSetting ( OPENGL_TEX_FORCE_SQUARE, false ) ) { targetH = targetW = std::max ( targetW, targetH ); } OpenGLTexture *tex = new OpenGLTexture(); Uint32 ret = m_textures.insert ( tex ); tex->Dispose(); tex->Create ( targetW, targetH, _isColorKeyed ); ARCReleaseAssert ( tex->m_sdlSurface != NULL ); if ( _isColorKeyed && m_colorKeySet ) { SDL_FillRect ( tex->m_sdlSurface, NULL, ZERO_ALPHA & m_colorKey ); SDL_SetColorKey ( tex->m_sdlSurface, SDL_SRCCOLORKEY | SDL_RLEACCEL, m_colorKey ); } SDL_SetAlpha ( tex->m_sdlSurface, 0, SDL_ALPHA_OPAQUE ); SDL_BlitSurface ( src, NULL, tex->m_sdlSurface, NULL ); SDL_FreeSurface ( src ); tex->Damage(); return ret; }