Changeset cba8bf34 in git


Ignore:
Timestamp:
27/01/14 05:39:31 (6 years ago)
Author:
Olly Betts <olly@…>
Branches:
line_contents, master, stereo, travis-osx
Children:
19a5798
Parents:
c7627d4
Message:

src/glbitmapfont.cc,src/glbitmapfont.h:
BitmapFont::get_text_extent() now uses the width of all glyphs,
rather than assuming all those > BITMAPFONT_MAX_CHAR have width 16.

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • ChangeLog

    rc7627d4 rcba8bf34  
     1Mon Jan 27 05:37:02 GMT 2014  Olly Betts <olly@survex.com>
     2
     3        * src/glbitmapfont.cc,src/glbitmapfont.h:
     4          BitmapFont::get_text_extent() now uses the width of all glyphs,
     5          rather than assuming all those > BITMAPFONT_MAX_CHAR have width 16.
     6
    17Mon Jan 27 05:32:12 GMT 2014  Olly Betts <olly@survex.com>
    28
  • src/glbitmapfont.cc

    rc7627d4 rcba8bf34  
    116116
    117117void
     118BitmapFont::init_extra_chars() const
     119{
     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;
     127    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    }
     133    extra_chars = new unsigned char * [0x10000 - BITMAPFONT_MAX_CHAR];
     134
     135    for (int i = 0; i < 0x10000 - BITMAPFONT_MAX_CHAR; ++i) {
     136        if (data_len <= 0) {
     137            extra_chars[i] = NULL;
     138            continue;
     139        }
     140        extra_chars[i] = data;
     141        unsigned int byte_width = *data++;
     142        byte_width >>= 6;
     143
     144        if (byte_width) {
     145            unsigned int start_and_n = *data;
     146            int n = (start_and_n & 15) + 1;
     147            data += n * byte_width + 1;
     148            data_len -= n * byte_width + 1;
     149        }
     150    }
     151    fclose(fh);
     152    fh = NULL;
     153}
     154
     155int
     156BitmapFont::glyph_width(wxChar ch) const
     157{
     158#if SIZEOF_WXCHAR > 2
     159    if (ch >= 0x10000) return 0;
     160#endif
     161    if (!extra_chars)
     162        init_extra_chars();
     163
     164    unsigned int byte_width = 0;
     165    int width = 8;
     166
     167    const unsigned char * p = extra_chars[ch - BITMAPFONT_MAX_CHAR];
     168    if (p) {
     169        byte_width = *p++;
     170        width = (byte_width & 0x0f) + 2;
     171    }
     172
     173    return width;
     174}
     175
     176void
    118177BitmapFont::write_glyph(wxChar ch) const
    119178{
     
    121180    if (ch >= 0x10000) return;
    122181#endif
    123     if (!extra_chars) {
    124         long here = ftell(fh);
    125         if (here == -1 || fseek(fh, 0, SEEK_END) < 0)
    126             return;
    127         long data_len = ftell(fh);
    128         if (data_len == -1)
    129             return;
    130         data_len -= here;
    131         unsigned char * data = new unsigned char [data_len];
    132         if (fseek(fh, here, SEEK_SET) < 0 ||
    133             fread(data, data_len, 1, fh) != 1) {
    134             delete data;
    135             return;
    136         }
    137         extra_chars = new unsigned char * [0x10000 - BITMAPFONT_MAX_CHAR];
    138 
    139         for (int i = 0; i < 0x10000 - BITMAPFONT_MAX_CHAR; ++i) {
    140             if (data_len <= 0) {
    141                 extra_chars[i] = NULL;
    142                 continue;
    143             }
    144             extra_chars[i] = data;
    145             unsigned int byte_width = *data++;
    146             byte_width >>= 6;
    147 
    148             if (byte_width) {
    149                 unsigned int start_and_n = *data;
    150                 int n = (start_and_n & 15) + 1;
    151                 data += n * byte_width + 1;
    152                 data_len -= n * byte_width + 1;
    153             }
    154         }
    155         fclose(fh);
    156         fh = NULL;
    157     }
     182    if (!extra_chars)
     183        init_extra_chars();
    158184
    159185    unsigned int byte_width = 0;
  • src/glbitmapfont.h

    rc7627d4 rcba8bf34  
    44//  Draw text using glBitmap.
    55//
    6 //  Copyright (C) 2011,2013 Olly Betts
     6//  Copyright (C) 2011,2013,2014 Olly Betts
    77//
    88//  This program is free software; you can redistribute it and/or modify
     
    5353    unsigned char char_width[BITMAPFONT_MAX_CHAR];
    5454
     55    void init_extra_chars() const;
     56
     57    int glyph_width(wxChar ch) const;
     58
    5559    void write_glyph(wxChar ch) const;
    5660
     
    7983                    total_width += char_width[ch];
    8084                else
    81                     total_width += 16; // FIXME: look up the width...
     85                    total_width += glyph_width(ch);
    8286            }
    8387            *width = total_width;
Note: See TracChangeset for help on using the changeset viewer.