source: git/src/glbitmapfont.h @ 614d60b

RELEASE/1.2debug-cidebug-ci-sanitisersstereowalls-datawalls-data-hanging-as-warning
Last change on this file since 614d60b was 614d60b, checked in by Olly Betts <olly@…>, 10 years ago

lib/Makefile.am,lib/make-pixel-font,src/glbitmapfont.cc,
src/glbitmapfont.h: Embed the font data for the first 256 Unicode
codepoints into the compiled aven binary to reduce start up
overhead. Any additional codepoints are loaded from a data file
only if/when a character >= U+100 is actually needed (as before).

  • Property mode set to 100644
File size: 2.4 KB
RevLine 
[a1614eb]1//
2//  glbitmapfont.h
3//
4//  Draw text using glBitmap.
5//
[cba8bf34]6//  Copyright (C) 2011,2013,2014 Olly Betts
[a1614eb]7//
8//  This program is free software; you can redistribute it and/or modify
9//  it under the terms of the GNU General Public License as published by
10//  the Free Software Foundation; either version 2 of the License, or
11//  (at your option) any later version.
12//
13//  This program is distributed in the hope that it will be useful,
14//  but WITHOUT ANY WARRANTY; without even the implied warranty of
15//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16//  GNU General Public License for more details.
17//
18//  You should have received a copy of the GNU General Public License
19//  along with this program; if not, write to the Free Software
20//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
21//
22
23#ifndef GLBITMAPFONT_H_INCLUDED
24#define GLBITMAPFONT_H_INCLUDED
25
26#include "wx.h"
27
[ee63994]28#ifdef HAVE_GL_GL_H
29# include <GL/gl.h>
30#elif defined HAVE_OPENGL_GL_H
31# include <OpenGL/gl.h>
[a1614eb]32#endif
33
34class BitmapFont {
35    enum {
[36b4cd7]36        // The highest character point to generate an OpenGL list for.
[a1614eb]37        //
[36b4cd7]38        // We can't generate a GL list for every Unicode character, so we
39        // generate them for the first BITMAPFONT_MAX_CHAR characters and then
40        // use glBitmap directly to draw other characters if they are needed.
41        //
42        // FIXME: We could perhaps even store strings consisting of only the
43        // first 256 points as ISO8859-1.
[a1614eb]44        BITMAPFONT_MAX_CHAR = 256
45    };
46
47    int gllist_base;
48
[36b4cd7]49    mutable unsigned char ** extra_chars;
50
51    unsigned char char_width[BITMAPFONT_MAX_CHAR];
52
[cba8bf34]53    void init_extra_chars() const;
54
55    int glyph_width(wxChar ch) const;
56
[36b4cd7]57    void write_glyph(wxChar ch) const;
[a1614eb]58
[614d60b]59    wxString font_file;
60
[a1614eb]61  public:
62
[614d60b]63    BitmapFont() : gllist_base(0), extra_chars(0) { }
[a1614eb]64
65    ~BitmapFont() {
66        if (gllist_base)
67            glDeleteLists(gllist_base, BITMAPFONT_MAX_CHAR);
68    }
69
70    bool load(const wxString & font_file);
71
72    // Hard-code for now.
73    int get_font_size() const { return 16; }
74
75    void get_text_extent(const wxChar *s, size_t len, int *width, int *height) const {
76        if (width) {
77            int total_width = 0;
78            while (len--) {
[6f9b20d]79                int ch = *s++;
[a1614eb]80                if (ch < BITMAPFONT_MAX_CHAR)
81                    total_width += char_width[ch];
[d4d6909]82                else
[cba8bf34]83                    total_width += glyph_width(ch);
[a1614eb]84            }
85            *width = total_width;
86        }
87        if (height) {
88            *height = get_font_size() + 1;
89        }
90    }
91
92    void write_string(const wxChar *s, size_t len) const;
93};
94
95#endif
Note: See TracBrowser for help on using the repository browser.