diff --git a/src/modules/font/freetype/Font.h b/src/modules/font/freetype/Font.h index f8dfa6231..b50469573 100644 --- a/src/modules/font/freetype/Font.h +++ b/src/modules/font/freetype/Font.h @@ -73,4 +73,4 @@ namespace freetype } // font } // love -#endif // LOVE_FONT_FREETYPE_FONT_H \ No newline at end of file +#endif // LOVE_FONT_FREETYPE_FONT_H diff --git a/src/modules/font/freetype/TrueTypeRasterizer.cpp b/src/modules/font/freetype/TrueTypeRasterizer.cpp index ce5a0e2a1..e00428a62 100644 --- a/src/modules/font/freetype/TrueTypeRasterizer.cpp +++ b/src/modules/font/freetype/TrueTypeRasterizer.cpp @@ -51,10 +51,15 @@ namespace freetype metrics.ascent = s.ascender >> 6; metrics.descent = s.descender >> 6; metrics.height = s.height >> 6; + + ref = WeakReference::obtain(this); } TrueTypeRasterizer::~TrueTypeRasterizer() { + ref->destroy(); + ref->release(); + FT_Done_Face(face); data->release(); } @@ -116,4 +121,4 @@ namespace freetype } // freetype } // font -} // love \ No newline at end of file +} // love diff --git a/src/modules/font/freetype/TrueTypeRasterizer.h b/src/modules/font/freetype/TrueTypeRasterizer.h index 6fc13db0b..d16e69ce5 100644 --- a/src/modules/font/freetype/TrueTypeRasterizer.h +++ b/src/modules/font/freetype/TrueTypeRasterizer.h @@ -24,6 +24,7 @@ // LOVE #include #include +#include // TrueType2 #include @@ -51,6 +52,8 @@ namespace freetype // File data Data * data; + + WeakReference * ref; public: TrueTypeRasterizer(FT_Library library, Data * data, int size); @@ -67,4 +70,4 @@ namespace freetype } // font } // love -#endif // LOVE_FONT_FREETYPE_TRUE_TYPE_RASTERIZER_H \ No newline at end of file +#endif // LOVE_FONT_FREETYPE_TRUE_TYPE_RASTERIZER_H diff --git a/src/modules/font/freetype/wrap_Font.cpp b/src/modules/font/freetype/wrap_Font.cpp index e04d52978..6bd88aeb1 100644 --- a/src/modules/font/freetype/wrap_Font.cpp +++ b/src/modules/font/freetype/wrap_Font.cpp @@ -49,7 +49,7 @@ namespace freetype int size = luaL_checkint(L, 2); t = instance->newRasterizer(d, size); } - + luax_newtype(L, "Rasterizer", FONT_RASTERIZER_T, t); return 1; } diff --git a/src/modules/graphics/opengl/Font.cpp b/src/modules/graphics/opengl/Font.cpp index 10046413e..bfb50fe6a 100644 --- a/src/modules/graphics/opengl/Font.cpp +++ b/src/modules/graphics/opengl/Font.cpp @@ -40,9 +40,9 @@ namespace opengl { Font::Font(love::font::Rasterizer * r, const Image::Filter& filter) - : rasterizer(r), height(r->getHeight()), lineHeight(1), mSpacing(1), filter(filter) + : height(r->getHeight()), lineHeight(1), mSpacing(1), filter(filter) { - r->retain(); + rasterizer = WeakReference::obtain(r); love::font::GlyphData * gd = r->getGlyphData(32); type = (gd->getFormat() == love::font::GlyphData::FORMAT_LUMINANCE_ALPHA ? FONT_TRUETYPE : FONT_IMAGE); delete gd; @@ -51,6 +51,7 @@ namespace opengl Font::~Font() { + rasterizer->destroy(); rasterizer->release(); unloadVolatile(); } @@ -83,13 +84,15 @@ namespace opengl Font::Glyph * Font::addGlyph(int glyph) { + if (!rasterizer->isValid) return 0; + love::font::Rasterizer *r = (love::font::Rasterizer*) rasterizer->getData(); Glyph * g = new Glyph; g->list = glGenLists(1); if (g->list == 0) { // opengl failed to generate the list delete g; return NULL; } - love::font::GlyphData *gd = rasterizer->getGlyphData(glyph); + love::font::GlyphData *gd = r->getGlyphData(glyph); g->spacing = gd->getAdvance(); int w = gd->getWidth(); int h = gd->getHeight(); diff --git a/src/modules/graphics/opengl/Font.h b/src/modules/graphics/opengl/Font.h index ef4d44a8e..680efc0c1 100644 --- a/src/modules/graphics/opengl/Font.h +++ b/src/modules/graphics/opengl/Font.h @@ -28,6 +28,7 @@ // LOVE #include +#include #include #include @@ -56,7 +57,7 @@ namespace opengl int spacing; }; - love::font::Rasterizer * rasterizer; + WeakReference *rasterizer; int height; float lineHeight; diff --git a/src/scripts/boot.lua b/src/scripts/boot.lua index bd5e3286d..c91da091c 100644 --- a/src/scripts/boot.lua +++ b/src/scripts/boot.lua @@ -321,6 +321,7 @@ function love.init() for i, v in ipairs(love._version_compat) do if c.version == v then compat = true + break end end if not compat then diff --git a/src/scripts/boot.lua.h b/src/scripts/boot.lua.h index 88ac8841c..0398c1e38 100644 --- a/src/scripts/boot.lua.h +++ b/src/scripts/boot.lua.h @@ -544,6 +544,7 @@ const unsigned char boot_lua[] = 0x09, 0x09, 0x69, 0x66, 0x20, 0x63, 0x2e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x3d, 0x20, 0x76, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x09, 0x09, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, + 0x09, 0x09, 0x09, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x0a, 0x09, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x0a, 0x09, 0x69, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65,