forked from teamnwah/openmw-tes3coop
Improve font file error handling
This commit is contained in:
parent
e73e975291
commit
b35f87ae7e
1 changed files with 39 additions and 11 deletions
|
@ -1,5 +1,7 @@
|
||||||
#include "fontloader.hpp"
|
#include "fontloader.hpp"
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
|
|
||||||
#include <OgreResourceGroupManager.h>
|
#include <OgreResourceGroupManager.h>
|
||||||
#include <OgreTextureManager.h>
|
#include <OgreTextureManager.h>
|
||||||
|
|
||||||
|
@ -121,6 +123,15 @@ namespace
|
||||||
return encoder.getUtf8(std::string(1, c));
|
return encoder.getUtf8(std::string(1, c));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fail (Ogre::DataStreamPtr file, const std::string& fileName, const std::string& message)
|
||||||
|
{
|
||||||
|
std::stringstream error;
|
||||||
|
error << "Font loading error: " << message;
|
||||||
|
error << "\n File: " << fileName;
|
||||||
|
error << "\n Offset: 0x" << std::hex << file->tell();
|
||||||
|
throw std::runtime_error(error.str());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Gui
|
namespace Gui
|
||||||
|
@ -173,20 +184,30 @@ namespace Gui
|
||||||
Ogre::DataStreamPtr file = Ogre::ResourceGroupManager::getSingleton().openResource(fileName);
|
Ogre::DataStreamPtr file = Ogre::ResourceGroupManager::getSingleton().openResource(fileName);
|
||||||
|
|
||||||
float fontSize;
|
float fontSize;
|
||||||
int one;
|
if (file->read(&fontSize, sizeof(fontSize)) < sizeof(fontSize))
|
||||||
file->read(&fontSize, sizeof(fontSize));
|
fail(file, fileName, "File too small to be a valid font");
|
||||||
|
|
||||||
file->read(&one, sizeof(int));
|
int one;
|
||||||
assert(one == 1);
|
if (file->read(&one, sizeof(int)) < sizeof(int))
|
||||||
file->read(&one, sizeof(int));
|
fail(file, fileName, "File too small to be a valid font");
|
||||||
assert(one == 1);
|
|
||||||
|
if (one != 1)
|
||||||
|
fail(file, fileName, "Unexpected value");
|
||||||
|
|
||||||
|
if (file->read(&one, sizeof(int)) < sizeof(int))
|
||||||
|
fail(file, fileName, "File too small to be a valid font");
|
||||||
|
|
||||||
|
if (one != 1)
|
||||||
|
fail(file, fileName, "Unexpected value");
|
||||||
|
|
||||||
char name_[284];
|
char name_[284];
|
||||||
file->read(name_, sizeof(name_));
|
if (file->read(name_, sizeof(name_)) < sizeof(name_))
|
||||||
|
fail(file, fileName, "File too small to be a valid font");
|
||||||
std::string name(name_);
|
std::string name(name_);
|
||||||
|
|
||||||
GlyphInfo data[256];
|
GlyphInfo data[256];
|
||||||
file->read(data, sizeof(data));
|
if (file->read(data, sizeof(data)) < sizeof(data))
|
||||||
|
fail(file, fileName, "File too small to be a valid font");
|
||||||
file->close();
|
file->close();
|
||||||
|
|
||||||
// Create the font texture
|
// Create the font texture
|
||||||
|
@ -194,12 +215,19 @@ namespace Gui
|
||||||
Ogre::DataStreamPtr bitmapFile = Ogre::ResourceGroupManager::getSingleton().openResource(bitmapFilename);
|
Ogre::DataStreamPtr bitmapFile = Ogre::ResourceGroupManager::getSingleton().openResource(bitmapFilename);
|
||||||
|
|
||||||
int width, height;
|
int width, height;
|
||||||
bitmapFile->read(&width, sizeof(int));
|
if (bitmapFile->read(&width, sizeof(int)) < sizeof(int))
|
||||||
bitmapFile->read(&height, sizeof(int));
|
fail(bitmapFile, bitmapFilename, "File too small to be a valid bitmap");
|
||||||
|
|
||||||
|
if (bitmapFile->read(&height, sizeof(int)) < sizeof(int))
|
||||||
|
fail(bitmapFile, bitmapFilename, "File too small to be a valid bitmap");
|
||||||
|
|
||||||
|
if (width <= 0 || height <= 0)
|
||||||
|
fail(bitmapFile, bitmapFilename, "Width and height must be positive");
|
||||||
|
|
||||||
std::vector<Ogre::uchar> textureData;
|
std::vector<Ogre::uchar> textureData;
|
||||||
textureData.resize(width*height*4);
|
textureData.resize(width*height*4);
|
||||||
bitmapFile->read(&textureData[0], width*height*4);
|
if (bitmapFile->read(&textureData[0], width*height*4) < (size_t)(width*height*4))
|
||||||
|
fail(bitmapFile, bitmapFilename, "Bitmap does not contain the specified number of pixels");
|
||||||
bitmapFile->close();
|
bitmapFile->close();
|
||||||
|
|
||||||
std::string resourceName;
|
std::string resourceName;
|
||||||
|
|
Loading…
Reference in a new issue