RageSurfaceUtils::OpenResult RageSurface_Load_JPEG( const RString &sPath, RageSurface *&ret, bool bHeaderOnly, RString &error ) { RageFile f; if( !f.Open( sPath ) ) { error = f.GetError(); return RageSurfaceUtils::OPEN_FATAL_ERROR; } char errorbuf[1024]; ret = RageSurface_Load_JPEG( &f, sPath, errorbuf ); if( ret == NULL ) { error = errorbuf; return RageSurfaceUtils::OPEN_UNKNOWN_FILE_FORMAT; // XXX } return RageSurfaceUtils::OPEN_OK; }
static RageSurface *TryOpenFile( RString sPath, bool bHeaderOnly, RString &error, RString format, bool &bKeepTrying ) { RageSurface *ret = NULL; RageSurfaceUtils::OpenResult result; if( !format.CompareNoCase("png") ) result = RageSurface_Load_PNG( sPath, ret, bHeaderOnly, error ); else if( !format.CompareNoCase("gif") ) result = RageSurface_Load_GIF( sPath, ret, bHeaderOnly, error ); else if( !format.CompareNoCase("jpg") || !format.CompareNoCase("jpeg") ) result = RageSurface_Load_JPEG( sPath, ret, bHeaderOnly, error ); else if( !format.CompareNoCase("bmp") ) result = RageSurface_Load_BMP( sPath, ret, bHeaderOnly, error ); else { error = "Unsupported format"; bKeepTrying = true; return NULL; } if( result == RageSurfaceUtils::OPEN_OK ) { ASSERT( ret != NULL ); return ret; } LOG->Trace( "Format %s failed: %s", format.c_str(), error.c_str() ); /* * The file failed to open, or failed to read. This indicates a problem that will * affect all readers, so don't waste time trying more readers. (OPEN_IO_ERROR) * * Errors fall in two categories: * OPEN_UNKNOWN_FILE_FORMAT: Data was successfully read from the file, but it's the * wrong file format. The error message always looks like "unknown file format" or * "Not Vorbis data"; ignore it so we always give a consistent error message, and * continue trying other file formats. * * OPEN_FATAL_ERROR: Either the file was opened successfully and appears to be the * correct format, but a fatal format-specific error was encountered that will probably * not be fixed by using a different reader (for example, an Ogg file that doesn't * actually contain any audio streams); or the file failed to open or read ("I/O * error", "permission denied"), in which case all other readers will probably fail, * too. The returned error is used, and no other formats will be tried. */ bKeepTrying = (result != RageSurfaceUtils::OPEN_FATAL_ERROR); switch( result ) { case RageSurfaceUtils::OPEN_UNKNOWN_FILE_FORMAT: bKeepTrying = true; error = "Unknown file format"; break; case RageSurfaceUtils::OPEN_FATAL_ERROR: /* The file matched, but failed to load. We know it's this type of data; * don't bother trying the other file types. */ bKeepTrying = false; break; default: break; } return NULL; }