From: Mikko Rasa Date: Sun, 5 Dec 2010 18:53:05 +0000 (+0000) Subject: Use a RefPtr to store font texture X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=commitdiff_plain;h=aceaa08be594ac708efcd0b68e5d08547cbcbbe1 Use a RefPtr to store font texture Rename default_size to native_size Use keyword overloading for inline textures Avoid rendering strings with undefined color --- diff --git a/makefont.py b/makefont.py index c61c1d5a..1651ace6 100755 --- a/makefont.py +++ b/makefont.py @@ -8,7 +8,7 @@ def convert_def(fn): line=src.readline() tw,th,fh,fa,fd=map(int, line.split()) - result="default_size %d;\n"%fh + result="native_size %d;\n"%fh result+="ascent %.3f;\n"%(float(fa)/fh) result+="descent %.3f;\n"%(float(fd)/fh) @@ -30,7 +30,7 @@ def make_font(fn, size): if os.system("ttf2png \"%s\" -o makefont-tmp.png -d makefont-tmp.def -t -p -s %d"%(fn, size)): raise Exception("Could not execute ttf2png") - result="texture_inline\n{\n" + result="texture\n{\n" result+=maketex.make_tex("makefont-tmp.png") result+="};\n" result+=convert_def("makefont-tmp.def") diff --git a/source/font.cpp b/source/font.cpp index ae2cb289..ae407d1d 100644 --- a/source/font.cpp +++ b/source/font.cpp @@ -19,33 +19,22 @@ namespace Msp { namespace GL { Font::Font(): - tex(0), - own_tex(false), - default_size(1), + native_size(1), ascent(1), descent(0) { } -Font::~Font() -{ - if(own_tex) - delete tex; -} - void Font::set_texture(const Texture2D &t) { - if(own_tex) - delete tex; - - tex = &t; - own_tex = false; + texture = &t; + texture.keep(); } const Texture2D &Font::get_texture() const { - if(!tex) + if(!texture) throw InvalidState("No texture"); - return *tex; + return *texture; } void Font::add_glyph(unsigned code, float x1, float y1, float x2, float y2, float w, float h, float ox, float oy, float adv) @@ -76,16 +65,13 @@ float Font::get_string_width(const string &str, Codecs::Decoder &dec) const void Font::draw_string(const string &str, Codecs::Decoder &dec) const { - Immediate imm((TEXCOORD2, VERTEX2)); + Immediate imm((TEXCOORD2, COLOR4_UBYTE, VERTEX2)); draw_string(str, dec, imm); } void Font::draw_string(const string &str, Codecs::Decoder &dec, PrimitiveBuilder &pbuilder) const { - if(!tex) - throw InvalidState("No texture"); - - Bind bind_tex(tex, true); + Bind bind_tex(get_texture(), true); float x = 0; unsigned count = 0; @@ -140,12 +126,16 @@ Font::Loader::Loader(Font &f, Collection &c): void Font::Loader::init() { - add("default_size", &Font::default_size); - add("ascent", &Font::ascent); - add("descent", &Font::descent); - add("texture", &Font::tex); - add("texture_inline", &Loader::texture_inline); - add("glyph", &Loader::glyph); + add("native_size", &Font::native_size); + add("ascent", &Font::ascent); + add("descent", &Font::descent); + add("texture", &Loader::texture); + add("texture", &Loader::texture_ref); + add("glyph", &Loader::glyph); + + // Deprecated aliases + add("default_size", &Font::native_size); + add("texture_inline", &Loader::texture); } void Font::Loader::glyph(unsigned c) @@ -156,12 +146,17 @@ void Font::Loader::glyph(unsigned c) obj.glyphs.insert(GlyphMap::value_type(c, gl)); } -void Font::Loader::texture_inline() +void Font::Loader::texture() { RefPtr tex = new Texture2D; load_sub(*tex); - obj.tex = tex.release(); - obj.own_tex = true; + obj.texture = tex; +} + +void Font::Loader::texture_ref(const string &name) +{ + obj.texture = get_collection().get(name); + obj.texture.keep(); } diff --git a/source/font.h b/source/font.h index 123373ea..fcc5c9f5 100644 --- a/source/font.h +++ b/source/font.h @@ -28,10 +28,12 @@ public: public: Loader(Font &); Loader(Font &, Collection &); + private: void init(); void glyph(unsigned); - void texture_inline(); + void texture(); + void texture_ref(const std::string &); }; private: @@ -55,21 +57,20 @@ private: typedef std::map GlyphMap; - const Texture2D *tex; - bool own_tex; - float default_size; + RefPtr texture; + float native_size; float ascent; float descent; GlyphMap glyphs; public: Font(); - ~Font(); void set_texture(const Texture2D &); const Texture2D &get_texture() const; void add_glyph(unsigned, float, float, float, float, float, float, float, float, float); - float get_default_size() const { return default_size; } + float get_native_size() const { return native_size; } + float get_default_size() const { return native_size; } // Deprecated float get_ascent() const { return ascent; } float get_descent() const { return descent; }