Merge pull request #580 from james4k/font-leaks

Fix Font leaks
This commit is contained in:
Joshua Granick
2015-09-21 17:11:50 -07:00
3 changed files with 35 additions and 11 deletions

View File

@@ -62,7 +62,9 @@ namespace lime {
int RenderGlyphs (value indices, Bytes *bytes); int RenderGlyphs (value indices, Bytes *bytes);
void SetSize (size_t size); void SetSize (size_t size);
void* library;
void* face; void* face;
void* faceMemory;
private: private:

View File

@@ -292,7 +292,10 @@ namespace lime {
#ifdef LIME_FREETYPE #ifdef LIME_FREETYPE
Font *font = (Font*)(intptr_t)fontHandle; Font *font = (Font*)(intptr_t)fontHandle;
return alloc_wstring (font->GetFamilyName ()); wchar_t *name = font->GetFamilyName ();
value result = alloc_wstring (name);
delete name;
return result;
#else #else
return 0; return 0;
#endif #endif
@@ -1377,4 +1380,4 @@ extern "C" int lime_register_prims () {
return 0; return 0;
} }

View File

@@ -355,7 +355,9 @@ namespace lime {
Font::Font (Resource *resource, int faceIndex) { Font::Font (Resource *resource, int faceIndex) {
this->library = 0;
this->face = 0; this->face = 0;
this->faceMemory = 0;
if (resource) { if (resource) {
@@ -372,6 +374,7 @@ namespace lime {
FT_Face face; FT_Face face;
FILE_HANDLE *file = NULL; FILE_HANDLE *file = NULL;
unsigned char *faceMemory = NULL;
if (resource->path) { if (resource->path) {
@@ -379,6 +382,7 @@ namespace lime {
if (!file) { if (!file) {
FT_Done_FreeType (library);
return; return;
} }
@@ -390,19 +394,21 @@ namespace lime {
} else { } else {
Bytes data = Bytes (resource->path); Bytes data = Bytes (resource->path);
unsigned char *buffer = (unsigned char*)malloc (data.Length ()); faceMemory = (unsigned char*)malloc (data.Length ());
memcpy (buffer, data.Data (), data.Length ()); memcpy (faceMemory, data.Data (), data.Length ());
lime::fclose (file); lime::fclose (file);
file = 0; file = 0;
error = FT_New_Memory_Face (library, buffer, data.Length (), faceIndex, &face);
error = FT_New_Memory_Face (library, faceMemory, data.Length (), faceIndex, &face);
} }
} else { } else {
unsigned char *buffer = (unsigned char*)malloc (resource->data->Length ()); faceMemory = (unsigned char*)malloc (resource->data->Length ());
memcpy (buffer, resource->data->Data (), resource->data->Length ()); memcpy (faceMemory, resource->data->Data (), resource->data->Length ());
error = FT_New_Memory_Face (library, buffer, resource->data->Length (), faceIndex, &face); error = FT_New_Memory_Face (library, faceMemory, resource->data->Length (), faceIndex, &face);
} }
@@ -415,7 +421,9 @@ namespace lime {
if (!error) { if (!error) {
this->library = library;
this->face = face; this->face = face;
this->faceMemory = faceMemory;
/* Set charmap /* Set charmap
* *
@@ -439,6 +447,12 @@ namespace lime {
} }
} else {
FT_Done_FreeType (library);
free (faceMemory);
} }
} }
@@ -449,12 +463,17 @@ namespace lime {
Font::~Font () { Font::~Font () {
if (face) { if (library) {
//FT_Done_Face ((FT_Face)face); FT_Done_FreeType ((FT_Library)library);
library = 0;
face = 0;
} }
free (faceMemory);
faceMemory = 0;
} }