Bladeren bron

Polycode doesn't crash now if invalid font file is specified. Will now destroy fonts on exit.

Ivan Safrin 14 jaren geleden
bovenliggende
commit
a58e4a109f

File diff suppressed because it is too large
+ 204 - 204
Core/Build/Mac OS X/PolyCore.xcodeproj/project.xcworkspace/xcuserdata/ivansafrin.xcuserdatad/UserInterfaceState.xcuserstate


+ 2 - 0
Core/Contents/Include/PolyFont.h

@@ -40,6 +40,8 @@ namespace Polycode {
 			
 			FT_Face getFace();
 			bool isValid();
+			
+			bool loaded;
 		private:
 			unsigned char *buffer;
 			bool valid;

+ 1 - 0
Core/Contents/Source/PolyCoreServices.cpp

@@ -120,6 +120,7 @@ CoreServices::~CoreServices() {
 	delete tweenManager;
 	delete resourceManager;
 	delete soundManager;
+	delete fontManager;
 	instanceMap.clear();
 	overrideInstance = NULL;
 	

+ 22 - 15
Core/Contents/Source/PolyFont.cpp

@@ -28,23 +28,28 @@ Font::Font(String fileName) {
 	FT_Library FTLibrary;
 	FT_Init_FreeType(&FTLibrary);
 	
+	loaded = false;
+	buffer = NULL;
 	OSFILE *file = OSBasics::open(fileName, "rb");
-	OSBasics::seek(file, 0, SEEK_END);	
-	long progsize = OSBasics::tell(file);
-	OSBasics::seek(file, 0, SEEK_SET);
-	buffer = (unsigned char*)malloc(progsize);
-	memset(buffer, 0, progsize);
-	OSBasics::read(buffer, progsize, 1, file);
+	if(file) {
+		OSBasics::seek(file, 0, SEEK_END);	
+		long progsize = OSBasics::tell(file);
+		OSBasics::seek(file, 0, SEEK_SET);
+		buffer = (unsigned char*)malloc(progsize);
+		memset(buffer, 0, progsize);
+		OSBasics::read(buffer, progsize, 1, file);
 	
-	valid = true;
-	if(FT_New_Memory_Face(FTLibrary, buffer, progsize, 0, &ftFace) != 0) {
-		Logger::log("Error loading font %s\n", fileName.c_str());
-		valid = false;
-	}
+		valid = true;
+		if(FT_New_Memory_Face(FTLibrary, buffer, progsize, 0, &ftFace) != 0) {
+			Logger::log("Error loading font %s\n", fileName.c_str());
+			valid = false;
+		}
 	
-	FT_Select_Charmap(ftFace, FT_ENCODING_UNICODE);	
-	//FT_New_Face(FTLibrary, fileName.c_str(), 0, &ftFace);	
-//	free(buffer);
+		FT_Select_Charmap(ftFace, FT_ENCODING_UNICODE);	
+		loaded = true;
+	} else {
+		Logger::log("Invalid font file specified (%s)\n", fileName.c_str());	
+	}
 }
 
 bool Font::isValid() {
@@ -52,7 +57,9 @@ bool Font::isValid() {
 }
 
 Font::~Font() {
-	free(buffer);
+	if(buffer) {
+		free(buffer);
+	}
 }
 
 FT_Face Font::getFace() {

+ 13 - 5
Core/Contents/Source/PolyFontManager.cpp

@@ -29,15 +29,23 @@ FontManager::FontManager() {
 }
 
 FontManager::~FontManager() {
-
+	for(int i=0; i < fonts.size(); i++) {
+		FontEntry entry = fonts[i];
+		delete entry.font;
+	}
+	fonts.clear();
 }
 
 void FontManager::registerFont(String fontName, String fontPath) {
 	Font *font = new Font(fontPath);
-	FontEntry newEntry;
-	newEntry.font = font;
-	newEntry.fontName = fontName;
-	fonts.push_back(newEntry);
+	if(font->loaded) {
+		FontEntry newEntry;
+		newEntry.font = font;
+		newEntry.fontName = fontName;
+		fonts.push_back(newEntry);
+	} else {
+		delete font;
+	}
 }
 
 Font *FontManager::getFontByName(String fontName) {

Some files were not shown because too many files changed in this diff