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);
void SetSize (size_t size);
void* library;
void* face;
void* faceMemory;
private:

View File

@@ -292,7 +292,10 @@ namespace lime {
#ifdef LIME_FREETYPE
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
return 0;
#endif
@@ -1377,4 +1380,4 @@ extern "C" int lime_register_prims () {
return 0;
}
}

View File

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