source: git/src/glbitmapfont.h @ a72ed95

RELEASE/1.2debug-cidebug-ci-sanitisersstereowalls-data
Last change on this file since a72ed95 was 7ada45b, checked in by Olly Betts <olly@…>, 10 years ago

configure.ac,src/glbitmapfont.cc,src/glbitmapfont.h: For platforms
which support mmap(), just mmap the extra font data, which on Linux
seems to typically be about twice as quick as loading it via fread()
or read(). For other platforms, use read() instead of fread(), since
that seems fractionally faster, and means more code in common with
the mmap case.

  • Property mode set to 100644
File size: 2.4 KB
Line 
1//
2//  glbitmapfont.h
3//
4//  Draw text using glBitmap.
5//
6//  Copyright (C) 2011,2013,2014 Olly Betts
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
28#ifdef HAVE_GL_GL_H
29# include <GL/gl.h>
30#elif defined HAVE_OPENGL_GL_H
31# include <OpenGL/gl.h>
32#endif
33
34class BitmapFont {
35    enum {
36        // The highest character point to generate an OpenGL list for.
37        //
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.
44        BITMAPFONT_MAX_CHAR = 256
45    };
46
47    int gllist_base;
48
49    mutable const unsigned char * extra_data;
50
51    mutable int * extra_chars;
52
53    unsigned char char_width[BITMAPFONT_MAX_CHAR];
54
55    void init_extra_chars() const;
56
57    int glyph_width(wxChar ch) const;
58
59    void write_glyph(wxChar ch) const;
60
61    wxString font_file;
62
63  public:
64
65    BitmapFont() : gllist_base(0), extra_data(0), extra_chars(0) { }
66
67    ~BitmapFont() {
68        if (gllist_base)
69            glDeleteLists(gllist_base, BITMAPFONT_MAX_CHAR);
70    }
71
72    bool load(const wxString & font_file);
73
74    // Hard-code for now.
75    int get_font_size() const { return 16; }
76
77    void get_text_extent(const wxChar *s, size_t len, int *width, int *height) const {
78        if (width) {
79            int total_width = 0;
80            while (len--) {
81                int ch = *s++;
82                if (ch < BITMAPFONT_MAX_CHAR)
83                    total_width += char_width[ch];
84                else
85                    total_width += glyph_width(ch);
86            }
87            *width = total_width;
88        }
89        if (height) {
90            *height = get_font_size() + 1;
91        }
92    }
93
94    void write_string(const wxChar *s, size_t len) const;
95};
96
97#endif
Note: See TracBrowser for help on using the repository browser.