X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fvideo%2Ftexture_manager.cpp;h=70b0e950c1522e60cba59f6eddf602e28a383253;hb=43db9a6c44b6ee544e7694d1bb234ba559b0849c;hp=976dad04bc300ea4c3d46f96a552e92b997a506a;hpb=888c9a76491619375d2d1221f6fd6c0b7e97cbec;p=supertux.git diff --git a/src/video/texture_manager.cpp b/src/video/texture_manager.cpp index 976dad04b..70b0e950c 100644 --- a/src/video/texture_manager.cpp +++ b/src/video/texture_manager.cpp @@ -118,15 +118,45 @@ TextureManager::create_image_texture(const std::string& filename) return result; } catch (const std::runtime_error& err) { - // on error, try loading placeholder file const std::string dummy_texture_fname = "images/engine/missing.png"; - if (filename != dummy_texture_fname) { + if (filename == dummy_texture_fname) throw err; + + // on error, try loading placeholder file + try { + Texture* tex = create_image_texture(dummy_texture_fname); - log_warning << "Couldn't load texture '" << filename << "': " << err.what() << std::endl; + log_warning << "Couldn't load texture '" << filename << "' (now using dummy texture): " << err.what() << std::endl; return tex; + + } catch (...) { + + // on error (when loading placeholder), try using empty surface + try { + + SDL_Surface* image = SDL_CreateRGBSurface(0, 1024, 1024, 8, 0, 0, 0, 0); + if(image == 0) { + throw err; + } + + Texture* result = 0; + try { + result = new_texture(image); + result->set_filename("-dummy-texture-.png"); + } catch(...) { + delete result; + SDL_FreeSurface(image); + throw err; + } + + SDL_FreeSurface(image); + log_warning << "Couldn't load texture '" << filename << "' (now using empty one): " << err.what() << std::endl; + return result; + + // on error (when trying to use empty surface), give up + } catch (const std::runtime_error& err) { + throw err; + } } - // if this also failed, escalate error - throw err; } } @@ -159,6 +189,9 @@ TextureManager::save_texture(GL::Texture* texture) SavedTexture saved_texture; saved_texture.texture = texture; glBindTexture(GL_TEXTURE_2D, texture->get_handle()); + + //this doesn't work with OpenGL ES (but we don't need it on the GP2X anyway) +#ifndef GL_VERSION_ES_CM_1_0 glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &saved_texture.width); glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, @@ -179,6 +212,7 @@ TextureManager::save_texture(GL::Texture* texture) glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, saved_texture.pixels); +#endif saved_textures.push_back(saved_texture);