Changeset 614d60b in git


Ignore:
Timestamp:
28/01/14 01:36:19 (6 years ago)
Author:
Olly Betts <olly@…>
Branches:
line_contents, master, stereo, travis-osx
Children:
aac3336
Parents:
11c7eb6
Message:

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).

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • ChangeLog

    r11c7eb6 r614d60b  
     1Tue Jan 28 01:34:15 GMT 2014  Olly Betts <olly@survex.com>
     2
     3        * lib/Makefile.am,lib/make-pixel-font,src/glbitmapfont.cc,
     4          src/glbitmapfont.h: Embed the font data for the first 256 Unicode
     5          codepoints into the compiled aven binary to reduce start up
     6          overhead.  Any additional codepoints are loaded from a data file
     7          only if/when a character >= U+100 is actually needed (as before).
     8
    19Tue Jan 28 00:08:18 GMT 2014  Olly Betts <olly@survex.com>
    210
  • lib/Makefile.am

    r11c7eb6 r614d60b  
    3232 INSTALL.OSX
    3333
    34 MAINTAINERCLEANFILES = $(msg_files) de_DE.po unifont.pixelfont
     34MAINTAINERCLEANFILES = $(msg_files) de_DE.po unifont.pixelfont preload_font.h
    3535
    36 dist_pkgdata_DATA = print.ini bcra3.svx bcra5.svx $(msg_files) unifont.pixelfont
     36dist_pkgdata_DATA = print.ini bcra3.svx bcra5.svx $(msg_files) unifont.pixelfont preload_font.h
    3737
    3838appsdir = $(datadir)/applications
     
    4646mime_DATA = survex.keys
    4747
    48 unifont.pixelfont: $(srcdir)/make-pixel-font
     48unifont.pixelfont preload_font.h: $(srcdir)/make-pixel-font
    4949        $(srcdir)/make-pixel-font
    5050
  • lib/make-pixel-font

    r11c7eb6 r614d60b  
    1818    }
    1919    $ch = hex($ch);
    20 #    print "$ch:\n";
     20    if ($ch == 256) {
     21        close O;
     22        open O, '<', 'unifont.pixelfont' or die $!;
     23        open P, '>', 'preload_font.h' or die $!;
     24        print P "static const unsigned char fontdata_preloaded[] = {";
     25        my $c = 0;
     26        while (<O>) {
     27            for (split //, $_) {
     28                if ($c++ % 8 == 0) {
     29                    print P "\n   ";
     30                }
     31                printf P "% 4d,", ord $_;
     32            }
     33        }
     34        print P "\n};\n";
     35        close P;
     36        close O;
     37        open O, '>', 'unifont.pixelfont' or die $!;
     38    }
    2139
    2240    while (++$last_ch < $ch) {
  • src/glbitmapfont.cc

    r11c7eb6 r614d60b  
    3030#include "useful.h"
    3131#include "wx.h"
     32
     33#include "../lib/preload_font.h"
    3234
    3335#define CHECK_GL_ERROR(M, F) do { \
     
    4244
    4345bool
    44 BitmapFont::load(const wxString & font_file)
    45 {
    46     if (fh) fclose(fh);
    47 #ifdef __WXMSW__
    48     fh = _wfopen(font_file.fn_str(), L"rb");
    49 #else
    50     fh = fopen(font_file.mb_str(), "rb");
    51 #endif
    52 
    53     if (!fh) {
    54         return false;
    55     }
     46BitmapFont::load(const wxString & font_file_)
     47{
     48    font_file = font_file_;
    5649
    5750    if (!gllist_base) {
     
    5952    }
    6053
    61     unsigned char buf[32];
    62 
     54    const unsigned char * p = fontdata_preloaded;
     55    const unsigned char * end = p + sizeof(fontdata_preloaded);
    6356    for (int ch = 0; ch < BITMAPFONT_MAX_CHAR; ++ch) {
    6457        glNewList(gllist_base + ch, GL_COMPILE);
    6558        CHECK_GL_ERROR("BitmapFont::load", "glNewList");
    66         int b = GETC(fh);
    67         if (b == EOF) {
    68             fclose(fh);
     59        if (p == end) {
    6960            return false;
    7061        }
    71         unsigned int byte_width = b;
     62        unsigned int byte_width = *p++;
    7263
    7364        char_width[ch] = (byte_width & 0x0f) + 2;
     
    7768        int n = 0;
    7869        if (byte_width) {
    79             b = GETC(fh);
    80             if (b == EOF) {
    81                 fclose(fh);
     70            if (p == end) {
    8271                return false;
    8372            }
    84             unsigned int start_and_n = b;
     73            unsigned int start_and_n = *p++;
    8574            start = start_and_n >> 4;
    8675            n = (start_and_n & 15) + 1;
    87             if (fread(buf, n * byte_width, 1, fh) != 1) {
    88                 fclose(fh);
     76
     77            if (end - p < n * byte_width) {
    8978                return false;
    9079            }
     
    9382        // Even if there's nothing to display, we want to advance the
    9483        // raster position.
    95         glBitmap(8 * byte_width, n, 0, -start, char_width[ch], 0, buf);
     84        glBitmap(8 * byte_width, n, 0, -start, char_width[ch], 0, p);
    9685        CHECK_GL_ERROR("BitmapFont::load", "glBitmap");
    9786        glEndList();
    9887        CHECK_GL_ERROR("BitmapFont::load", "glEndList");
     88
     89        p += n * byte_width;
    9990    }
    10091
     
    118109BitmapFont::init_extra_chars() const
    119110{
    120     long here = ftell(fh);
    121     if (here == -1 || fseek(fh, 0, SEEK_END) < 0)
    122         return;
    123     long data_len = ftell(fh);
    124     if (data_len == -1)
    125         return;
    126     data_len -= here;
     111#ifdef __WXMSW__
     112    FILE * fh = _wfopen(font_file.fn_str(), L"rb");
     113#else
     114    FILE * fh = fopen(font_file.mb_str(), "rb");
     115#endif
     116
     117    long data_len = 0;
     118    if (fh && fseek(fh, 0, SEEK_END) >= 0) {
     119        data_len = ftell(fh);
     120        if (data_len == -1)
     121            data_len = 0;
     122    }
    127123    unsigned char * data = new unsigned char [data_len];
    128     if (fseek(fh, here, SEEK_SET) < 0 ||
    129         fread(data, data_len, 1, fh) != 1) {
    130         delete data;
    131         return;
    132     }
     124    if (data_len && (fseek(fh, 0, SEEK_SET) < 0 ||
     125               fread(data, data_len, 1, fh) != 1)) {
     126        data_len = 0;
     127        // FIXME: do something better.  wxGetApp().ReportError(m);
     128        // We have this message available: Error in format of font file “%s”
     129        // fprintf(stderr, "Couldn't load extended font.\n");
     130    }
     131    if (fh)
     132        fclose(fh);
     133
    133134    extra_chars = new unsigned char * [0x10000 - BITMAPFONT_MAX_CHAR];
    134 
    135135    for (int i = 0; i < 0x10000 - BITMAPFONT_MAX_CHAR; ++i) {
    136136        if (data_len <= 0) {
     
    149149        }
    150150    }
    151     fclose(fh);
    152     fh = NULL;
    153151}
    154152
     
    162160        init_extra_chars();
    163161
    164     unsigned int byte_width = 0;
    165162    int width = 8;
    166163
    167164    const unsigned char * p = extra_chars[ch - BITMAPFONT_MAX_CHAR];
    168165    if (p) {
    169         byte_width = *p++;
     166        unsigned int byte_width = *p;
    170167        width = (byte_width & 0x0f) + 2;
    171168    }
     
    204201    // raster position.
    205202    glBitmap(8 * byte_width, n, 0, -start, width, 0, p);
     203    CHECK_GL_ERROR("BitmapFont::write_glyph", "glBitmap");
    206204}
    207205
  • src/glbitmapfont.h

    r11c7eb6 r614d60b  
    4949    mutable unsigned char ** extra_chars;
    5050
    51     mutable FILE * fh;
    52 
    5351    unsigned char char_width[BITMAPFONT_MAX_CHAR];
    5452
     
    5957    void write_glyph(wxChar ch) const;
    6058
     59    wxString font_file;
     60
    6161  public:
    6262
    63     BitmapFont() : gllist_base(0), extra_chars(0), fh(0) { }
     63    BitmapFont() : gllist_base(0), extra_chars(0) { }
    6464
    6565    ~BitmapFont() {
    6666        if (gllist_base)
    6767            glDeleteLists(gllist_base, BITMAPFONT_MAX_CHAR);
    68         if (fh)
    69             fclose(fh);
    7068    }
    7169
Note: See TracChangeset for help on using the changeset viewer.