git repos / blockattack-game

blame: source/code/Libs/NFont.cpp

normal view · raw

925b7e58 sago007 2011-04-25 16:35 1
/*
925b7e58 sago007 2011-04-25 16:35 2
NFont v2.0.0: A bitmap font class for SDL
925b7e58 sago007 2011-04-25 16:35 3
by Jonathan Dearborn 2-4-10
925b7e58 sago007 2011-04-25 16:35 4
(class adapted from Florian Hufsky)
925b7e58 sago007 2011-04-25 16:35 5
925b7e58 sago007 2011-04-25 16:35 6
License:
925b7e58 sago007 2011-04-25 16:35 7
    The short:
925b7e58 sago007 2011-04-25 16:35 8
    Use it however you'd like, but keep the copyright and license notice 
925b7e58 sago007 2011-04-25 16:35 9
    whenever these files or parts of them are distributed in uncompiled form.
925b7e58 sago007 2011-04-25 16:35 10
    
925b7e58 sago007 2011-04-25 16:35 11
    The long:
925b7e58 sago007 2011-04-25 16:35 12
Copyright (c) 2010 Jonathan Dearborn
925b7e58 sago007 2011-04-25 16:35 13
925b7e58 sago007 2011-04-25 16:35 14
Permission is hereby granted, free of charge, to any person obtaining a copy
925b7e58 sago007 2011-04-25 16:35 15
of this software and associated documentation files (the "Software"), to deal
925b7e58 sago007 2011-04-25 16:35 16
in the Software without restriction, including without limitation the rights
925b7e58 sago007 2011-04-25 16:35 17
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
925b7e58 sago007 2011-04-25 16:35 18
copies of the Software, and to permit persons to whom the Software is
925b7e58 sago007 2011-04-25 16:35 19
furnished to do so, subject to the following conditions:
925b7e58 sago007 2011-04-25 16:35 20
925b7e58 sago007 2011-04-25 16:35 21
The above copyright notice and this permission notice shall be included in
925b7e58 sago007 2011-04-25 16:35 22
all copies or substantial portions of the Software.
925b7e58 sago007 2011-04-25 16:35 23
925b7e58 sago007 2011-04-25 16:35 24
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
925b7e58 sago007 2011-04-25 16:35 25
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
925b7e58 sago007 2011-04-25 16:35 26
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
925b7e58 sago007 2011-04-25 16:35 27
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
925b7e58 sago007 2011-04-25 16:35 28
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
925b7e58 sago007 2011-04-25 16:35 29
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
925b7e58 sago007 2011-04-25 16:35 30
THE SOFTWARE.
925b7e58 sago007 2011-04-25 16:35 31
*/
925b7e58 sago007 2011-04-25 16:35 32
#include "NFont.h"
925b7e58 sago007 2011-04-25 16:35 33
925b7e58 sago007 2011-04-25 16:35 34
char* NFont::buffer = NULL;
925b7e58 sago007 2011-04-25 16:35 35
NFont::AnimData NFont::data;
925b7e58 sago007 2011-04-25 16:35 36
925b7e58 sago007 2011-04-25 16:35 37
#define MIN(a,b) (a < b? a : b)
925b7e58 sago007 2011-04-25 16:35 38
#define MAX(a,b) (a > b? a : b)
925b7e58 sago007 2011-04-25 16:35 39
925b7e58 sago007 2011-04-25 16:35 40
// Static setters
925b7e58 sago007 2011-04-25 16:35 41
void NFont::setAnimData(void* data)
925b7e58 sago007 2011-04-25 16:35 42
{
925b7e58 sago007 2011-04-25 16:35 43
    NFont::data.userVar = data;
925b7e58 sago007 2011-04-25 16:35 44
}
925b7e58 sago007 2011-04-25 16:35 45
925b7e58 sago007 2011-04-25 16:35 46
void NFont::setBuffer(unsigned int size)
925b7e58 sago007 2011-04-25 16:35 47
{
925b7e58 sago007 2011-04-25 16:35 48
    delete[] buffer;
925b7e58 sago007 2011-04-25 16:35 49
    if(size > 0)
925b7e58 sago007 2011-04-25 16:35 50
        buffer = new char[size];
925b7e58 sago007 2011-04-25 16:35 51
    else
925b7e58 sago007 2011-04-25 16:35 52
        buffer = new char[1024];
925b7e58 sago007 2011-04-25 16:35 53
}
925b7e58 sago007 2011-04-25 16:35 54
925b7e58 sago007 2011-04-25 16:35 55
925b7e58 sago007 2011-04-25 16:35 56
// Static functions
925b7e58 sago007 2011-04-25 16:35 57
char* NFont::copyString(const char* c)
925b7e58 sago007 2011-04-25 16:35 58
{
925b7e58 sago007 2011-04-25 16:35 59
    if(c == NULL) return NULL;
925b7e58 sago007 2011-04-25 16:35 60
925b7e58 sago007 2011-04-25 16:35 61
    int count = 0;
925b7e58 sago007 2011-04-25 16:35 62
    for(; c[count] != '\0'; count++);
925b7e58 sago007 2011-04-25 16:35 63
925b7e58 sago007 2011-04-25 16:35 64
    char* result = new char[count+1];
925b7e58 sago007 2011-04-25 16:35 65
925b7e58 sago007 2011-04-25 16:35 66
    for(int i = 0; i < count; i++)
925b7e58 sago007 2011-04-25 16:35 67
    {
925b7e58 sago007 2011-04-25 16:35 68
        result[i] = c[i];
925b7e58 sago007 2011-04-25 16:35 69
    }
925b7e58 sago007 2011-04-25 16:35 70
925b7e58 sago007 2011-04-25 16:35 71
    result[count] = '\0';
925b7e58 sago007 2011-04-25 16:35 72
    return result;
925b7e58 sago007 2011-04-25 16:35 73
}
925b7e58 sago007 2011-04-25 16:35 74
925b7e58 sago007 2011-04-25 16:35 75
Uint32 NFont::getPixel(SDL_Surface *Surface, int x, int y)  // No Alpha?
925b7e58 sago007 2011-04-25 16:35 76
{
925b7e58 sago007 2011-04-25 16:35 77
    Uint8* bits;
925b7e58 sago007 2011-04-25 16:35 78
    Uint32 bpp;
925b7e58 sago007 2011-04-25 16:35 79
925b7e58 sago007 2011-04-25 16:35 80
    if(x < 0 || x >= Surface->w)
925b7e58 sago007 2011-04-25 16:35 81
        return 0;  // Best I could do for errors
925b7e58 sago007 2011-04-25 16:35 82
925b7e58 sago007 2011-04-25 16:35 83
    bpp = Surface->format->BytesPerPixel;
925b7e58 sago007 2011-04-25 16:35 84
    bits = ((Uint8*)Surface->pixels) + y*Surface->pitch + x*bpp;
925b7e58 sago007 2011-04-25 16:35 85
925b7e58 sago007 2011-04-25 16:35 86
    switch (bpp)
925b7e58 sago007 2011-04-25 16:35 87
    {
925b7e58 sago007 2011-04-25 16:35 88
        case 1:
925b7e58 sago007 2011-04-25 16:35 89
            return *((Uint8*)Surface->pixels + y * Surface->pitch + x);
925b7e58 sago007 2011-04-25 16:35 90
            break;
925b7e58 sago007 2011-04-25 16:35 91
        case 2:
925b7e58 sago007 2011-04-25 16:35 92
            return *((Uint16*)Surface->pixels + y * Surface->pitch/2 + x);
925b7e58 sago007 2011-04-25 16:35 93
            break;
925b7e58 sago007 2011-04-25 16:35 94
        case 3:
925b7e58 sago007 2011-04-25 16:35 95
            // Endian-correct, but slower
925b7e58 sago007 2011-04-25 16:35 96
            Uint8 r, g, b;
925b7e58 sago007 2011-04-25 16:35 97
            r = *((bits)+Surface->format->Rshift/8);
925b7e58 sago007 2011-04-25 16:35 98
            g = *((bits)+Surface->format->Gshift/8);
925b7e58 sago007 2011-04-25 16:35 99
            b = *((bits)+Surface->format->Bshift/8);
925b7e58 sago007 2011-04-25 16:35 100
            return SDL_MapRGB(Surface->format, r, g, b);
925b7e58 sago007 2011-04-25 16:35 101
            break;
925b7e58 sago007 2011-04-25 16:35 102
        case 4:
925b7e58 sago007 2011-04-25 16:35 103
            return *((Uint32*)Surface->pixels + y * Surface->pitch/4 + x);
925b7e58 sago007 2011-04-25 16:35 104
            break;
925b7e58 sago007 2011-04-25 16:35 105
    }
925b7e58 sago007 2011-04-25 16:35 106
925b7e58 sago007 2011-04-25 16:35 107
    return 0;  // Best I could do for errors
925b7e58 sago007 2011-04-25 16:35 108
}
925b7e58 sago007 2011-04-25 16:35 109
925b7e58 sago007 2011-04-25 16:35 110
SDL_Rect NFont::rectUnion(const SDL_Rect& A, const SDL_Rect& B)
925b7e58 sago007 2011-04-25 16:35 111
{
925b7e58 sago007 2011-04-25 16:35 112
    Sint16 x,x2,y,y2;
925b7e58 sago007 2011-04-25 16:35 113
    x = MIN(A.x, B.x);
925b7e58 sago007 2011-04-25 16:35 114
    y = MIN(A.y, B.y);
925b7e58 sago007 2011-04-25 16:35 115
    x2 = MAX(A.x+A.w, B.x+B.w);
925b7e58 sago007 2011-04-25 16:35 116
    y2 = MAX(A.y+A.h, B.y+B.h);
925b7e58 sago007 2011-04-25 16:35 117
    SDL_Rect result = {x, y, x2 - x, y2 - y};
925b7e58 sago007 2011-04-25 16:35 118
    return result;
925b7e58 sago007 2011-04-25 16:35 119
}
925b7e58 sago007 2011-04-25 16:35 120
925b7e58 sago007 2011-04-25 16:35 121
SDL_Surface* NFont::copySurface(SDL_Surface *Surface)
925b7e58 sago007 2011-04-25 16:35 122
{
925b7e58 sago007 2011-04-25 16:35 123
    return SDL_ConvertSurface(Surface, Surface->format, Surface->flags);
925b7e58 sago007 2011-04-25 16:35 124
}
925b7e58 sago007 2011-04-25 16:35 125
925b7e58 sago007 2011-04-25 16:35 126
SDL_Surface* NFont::verticalGradient(SDL_Surface* targetSurface, Uint32 top, Uint32 bottom, int heightAdjust)
925b7e58 sago007 2011-04-25 16:35 127
{
925b7e58 sago007 2011-04-25 16:35 128
    SDL_Surface* surface = targetSurface;
925b7e58 sago007 2011-04-25 16:35 129
    if(surface == NULL)
925b7e58 sago007 2011-04-25 16:35 130
        return NULL;
925b7e58 sago007 2011-04-25 16:35 131
    
925b7e58 sago007 2011-04-25 16:35 132
    Uint8 tr, tg, tb;
925b7e58 sago007 2011-04-25 16:35 133
925b7e58 sago007 2011-04-25 16:35 134
    SDL_GetRGB(top, surface->format, &tr, &tg, &tb);
925b7e58 sago007 2011-04-25 16:35 135
925b7e58 sago007 2011-04-25 16:35 136
    Uint8 br, bg, bb;
925b7e58 sago007 2011-04-25 16:35 137
925b7e58 sago007 2011-04-25 16:35 138
    SDL_GetRGB(bottom, surface->format, &br, &bg, &bb);
925b7e58 sago007 2011-04-25 16:35 139
925b7e58 sago007 2011-04-25 16:35 140
    bool useCK = (surface->flags & SDL_SRCALPHA) != SDL_SRCALPHA;  // colorkey if no alpha
925b7e58 sago007 2011-04-25 16:35 141
    Uint32 colorkey = surface->format->colorkey;
925b7e58 sago007 2011-04-25 16:35 142
925b7e58 sago007 2011-04-25 16:35 143
    Uint8 r, g, b, a;
925b7e58 sago007 2011-04-25 16:35 144
    float ratio;
925b7e58 sago007 2011-04-25 16:35 145
    Uint32 color;
925b7e58 sago007 2011-04-25 16:35 146
    int temp;
925b7e58 sago007 2011-04-25 16:35 147
925b7e58 sago007 2011-04-25 16:35 148
    for (int x = 0, y = 0; y < surface->h; x++)
925b7e58 sago007 2011-04-25 16:35 149
    {
925b7e58 sago007 2011-04-25 16:35 150
        if (x >= surface->w)
925b7e58 sago007 2011-04-25 16:35 151
        {
925b7e58 sago007 2011-04-25 16:35 152
            x = 0;
925b7e58 sago007 2011-04-25 16:35 153
            y++;
925b7e58 sago007 2011-04-25 16:35 154
925b7e58 sago007 2011-04-25 16:35 155
            if (y >= surface->h)
925b7e58 sago007 2011-04-25 16:35 156
                break;
925b7e58 sago007 2011-04-25 16:35 157
        }
925b7e58 sago007 2011-04-25 16:35 158
925b7e58 sago007 2011-04-25 16:35 159
        ratio = (y - 2)/float(surface->h - heightAdjust);  // the neg 3s are for full color at top and bottom
925b7e58 sago007 2011-04-25 16:35 160
925b7e58 sago007 2011-04-25 16:35 161
        if(!useCK)
925b7e58 sago007 2011-04-25 16:35 162
        {
925b7e58 sago007 2011-04-25 16:35 163
            color = getPixel(surface, x, y);
925b7e58 sago007 2011-04-25 16:35 164
            SDL_GetRGBA(color, surface->format, &r, &g, &b, &a);  // just getting alpha
925b7e58 sago007 2011-04-25 16:35 165
        }
925b7e58 sago007 2011-04-25 16:35 166
        else
925b7e58 sago007 2011-04-25 16:35 167
            a = SDL_ALPHA_OPAQUE;
925b7e58 sago007 2011-04-25 16:35 168
925b7e58 sago007 2011-04-25 16:35 169
        // Get and clamp the new values
925b7e58 sago007 2011-04-25 16:35 170
        temp = int(tr*(1-ratio) + br*ratio);
925b7e58 sago007 2011-04-25 16:35 171
        r = temp < 0? 0 : temp > 255? 255 : temp;
925b7e58 sago007 2011-04-25 16:35 172
925b7e58 sago007 2011-04-25 16:35 173
        temp = int(tg*(1-ratio) + bg*ratio);
925b7e58 sago007 2011-04-25 16:35 174
        g = temp < 0? 0 : temp > 255? 255 : temp;
925b7e58 sago007 2011-04-25 16:35 175
925b7e58 sago007 2011-04-25 16:35 176
        temp = int(tb*(1-ratio) + bb*ratio);
925b7e58 sago007 2011-04-25 16:35 177
        b = temp < 0? 0 : temp > 255? 255 : temp;
925b7e58 sago007 2011-04-25 16:35 178
925b7e58 sago007 2011-04-25 16:35 179
925b7e58 sago007 2011-04-25 16:35 180
        color = SDL_MapRGBA(surface->format, r, g, b, a);
925b7e58 sago007 2011-04-25 16:35 181
925b7e58 sago007 2011-04-25 16:35 182
925b7e58 sago007 2011-04-25 16:35 183
        if(useCK)
925b7e58 sago007 2011-04-25 16:35 184
        {
925b7e58 sago007 2011-04-25 16:35 185
            if(getPixel(surface, x, y) == colorkey)
925b7e58 sago007 2011-04-25 16:35 186
                continue;
925b7e58 sago007 2011-04-25 16:35 187
            if(color == colorkey)
925b7e58 sago007 2011-04-25 16:35 188
                color == 0? color++ : color--;
925b7e58 sago007 2011-04-25 16:35 189
        }
925b7e58 sago007 2011-04-25 16:35 190
925b7e58 sago007 2011-04-25 16:35 191
        // make sure it isn't pink
925b7e58 sago007 2011-04-25 16:35 192
        if(color == SDL_MapRGBA(surface->format, 0xFF, 0, 0xFF, a))
925b7e58 sago007 2011-04-25 16:35 193
            color--;
925b7e58 sago007 2011-04-25 16:35 194
        if(getPixel(surface, x, y) == SDL_MapRGBA(surface->format, 0xFF, 0, 0xFF, SDL_ALPHA_OPAQUE))
925b7e58 sago007 2011-04-25 16:35 195
            continue;
925b7e58 sago007 2011-04-25 16:35 196
925b7e58 sago007 2011-04-25 16:35 197
        int bpp = surface->format->BytesPerPixel;
925b7e58 sago007 2011-04-25 16:35 198
        Uint8* bits = ((Uint8 *)surface->pixels) + y*surface->pitch + x*bpp;
925b7e58 sago007 2011-04-25 16:35 199
925b7e58 sago007 2011-04-25 16:35 200
        /* Set the pixel */
925b7e58 sago007 2011-04-25 16:35 201
        switch(bpp) {
925b7e58 sago007 2011-04-25 16:35 202
            case 1:
925b7e58 sago007 2011-04-25 16:35 203
                *((Uint8 *)(bits)) = (Uint8)color;
925b7e58 sago007 2011-04-25 16:35 204
                break;
925b7e58 sago007 2011-04-25 16:35 205
            case 2:
925b7e58 sago007 2011-04-25 16:35 206
                *((Uint16 *)(bits)) = (Uint16)color;
925b7e58 sago007 2011-04-25 16:35 207
                break;
925b7e58 sago007 2011-04-25 16:35 208
            case 3: { /* Format/endian independent */
925b7e58 sago007 2011-04-25 16:35 209
                r = (color >> surface->format->Rshift) & 0xFF;
925b7e58 sago007 2011-04-25 16:35 210
                g = (color >> surface->format->Gshift) & 0xFF;
925b7e58 sago007 2011-04-25 16:35 211
                b = (color >> surface->format->Bshift) & 0xFF;
925b7e58 sago007 2011-04-25 16:35 212
                *((bits)+surface->format->Rshift/8) = r;
925b7e58 sago007 2011-04-25 16:35 213
                *((bits)+surface->format->Gshift/8) = g;
925b7e58 sago007 2011-04-25 16:35 214
                *((bits)+surface->format->Bshift/8) = b;
925b7e58 sago007 2011-04-25 16:35 215
                }
925b7e58 sago007 2011-04-25 16:35 216
                break;
925b7e58 sago007 2011-04-25 16:35 217
            case 4:
925b7e58 sago007 2011-04-25 16:35 218
                *((Uint32 *)(bits)) = (Uint32)color;
925b7e58 sago007 2011-04-25 16:35 219
                break;
925b7e58 sago007 2011-04-25 16:35 220
        }
925b7e58 sago007 2011-04-25 16:35 221
925b7e58 sago007 2011-04-25 16:35 222
    }
925b7e58 sago007 2011-04-25 16:35 223
    return surface;
925b7e58 sago007 2011-04-25 16:35 224
}
925b7e58 sago007 2011-04-25 16:35 225
925b7e58 sago007 2011-04-25 16:35 226
925b7e58 sago007 2011-04-25 16:35 227
// Constructors
925b7e58 sago007 2011-04-25 16:35 228
NFont::NFont()
925b7e58 sago007 2011-04-25 16:35 229
{
925b7e58 sago007 2011-04-25 16:35 230
    init();
925b7e58 sago007 2011-04-25 16:35 231
}
925b7e58 sago007 2011-04-25 16:35 232
925b7e58 sago007 2011-04-25 16:35 233
NFont::NFont(SDL_Surface* src)
925b7e58 sago007 2011-04-25 16:35 234
{
925b7e58 sago007 2011-04-25 16:35 235
    init();
925b7e58 sago007 2011-04-25 16:35 236
    load(src);
925b7e58 sago007 2011-04-25 16:35 237
}
925b7e58 sago007 2011-04-25 16:35 238
925b7e58 sago007 2011-04-25 16:35 239
NFont::NFont(SDL_Surface* dest, SDL_Surface* src)
925b7e58 sago007 2011-04-25 16:35 240
{
925b7e58 sago007 2011-04-25 16:35 241
    init();
925b7e58 sago007 2011-04-25 16:35 242
    load(src);
925b7e58 sago007 2011-04-25 16:35 243
    setDest(dest);
925b7e58 sago007 2011-04-25 16:35 244
}
925b7e58 sago007 2011-04-25 16:35 245
925b7e58 sago007 2011-04-25 16:35 246
#ifdef NFONT_USE_TTF
925b7e58 sago007 2011-04-25 16:35 247
NFont::NFont(TTF_Font* ttf, SDL_Color fg)
925b7e58 sago007 2011-04-25 16:35 248
{
925b7e58 sago007 2011-04-25 16:35 249
    init();
925b7e58 sago007 2011-04-25 16:35 250
    load(ttf, fg);
925b7e58 sago007 2011-04-25 16:35 251
}
925b7e58 sago007 2011-04-25 16:35 252
NFont::NFont(TTF_Font* ttf, SDL_Color fg, SDL_Color bg)
925b7e58 sago007 2011-04-25 16:35 253
{
925b7e58 sago007 2011-04-25 16:35 254
    init();
925b7e58 sago007 2011-04-25 16:35 255
    load(ttf, fg, bg);
925b7e58 sago007 2011-04-25 16:35 256
}
925b7e58 sago007 2011-04-25 16:35 257
NFont::NFont(const char* filename_ttf, Uint32 pointSize, SDL_Color fg, int style)
925b7e58 sago007 2011-04-25 16:35 258
{
925b7e58 sago007 2011-04-25 16:35 259
    init();
925b7e58 sago007 2011-04-25 16:35 260
    load(filename_ttf, pointSize, fg, style);
925b7e58 sago007 2011-04-25 16:35 261
}
925b7e58 sago007 2011-04-25 16:35 262
NFont::NFont(const char* filename_ttf, Uint32 pointSize, SDL_Color fg, SDL_Color bg, int style)
925b7e58 sago007 2011-04-25 16:35 263
{
925b7e58 sago007 2011-04-25 16:35 264
    init();
925b7e58 sago007 2011-04-25 16:35 265
    load(filename_ttf, pointSize, fg, bg, style);
925b7e58 sago007 2011-04-25 16:35 266
}
925b7e58 sago007 2011-04-25 16:35 267
925b7e58 sago007 2011-04-25 16:35 268
NFont::NFont(SDL_Surface* dest, TTF_Font* ttf, SDL_Color fg)
925b7e58 sago007 2011-04-25 16:35 269
{
925b7e58 sago007 2011-04-25 16:35 270
    init();
925b7e58 sago007 2011-04-25 16:35 271
    load(ttf, fg);
925b7e58 sago007 2011-04-25 16:35 272
    setDest(dest);
925b7e58 sago007 2011-04-25 16:35 273
}
925b7e58 sago007 2011-04-25 16:35 274
NFont::NFont(SDL_Surface* dest, TTF_Font* ttf, SDL_Color fg, SDL_Color bg)
925b7e58 sago007 2011-04-25 16:35 275
{
925b7e58 sago007 2011-04-25 16:35 276
    init();
925b7e58 sago007 2011-04-25 16:35 277
    load(ttf, fg, bg);
925b7e58 sago007 2011-04-25 16:35 278
    setDest(dest);
925b7e58 sago007 2011-04-25 16:35 279
}
925b7e58 sago007 2011-04-25 16:35 280
NFont::NFont(SDL_Surface* dest, const char* filename_ttf, Uint32 pointSize, SDL_Color fg, int style)
925b7e58 sago007 2011-04-25 16:35 281
{
925b7e58 sago007 2011-04-25 16:35 282
    init();
925b7e58 sago007 2011-04-25 16:35 283
    load(filename_ttf, pointSize, fg, style);
925b7e58 sago007 2011-04-25 16:35 284
    setDest(dest);
925b7e58 sago007 2011-04-25 16:35 285
}
925b7e58 sago007 2011-04-25 16:35 286
NFont::NFont(SDL_Surface* dest, const char* filename_ttf, Uint32 pointSize, SDL_Color fg, SDL_Color bg, int style)
925b7e58 sago007 2011-04-25 16:35 287
{
925b7e58 sago007 2011-04-25 16:35 288
    init();
925b7e58 sago007 2011-04-25 16:35 289
    load(filename_ttf, pointSize, fg, bg, style);
925b7e58 sago007 2011-04-25 16:35 290
    setDest(dest);
925b7e58 sago007 2011-04-25 16:35 291
}
925b7e58 sago007 2011-04-25 16:35 292
#endif
925b7e58 sago007 2011-04-25 16:35 293
925b7e58 sago007 2011-04-25 16:35 294
void NFont::init()
925b7e58 sago007 2011-04-25 16:35 295
{
925b7e58 sago007 2011-04-25 16:35 296
    src = NULL;
925b7e58 sago007 2011-04-25 16:35 297
    dest = NULL;
925b7e58 sago007 2011-04-25 16:35 298
925b7e58 sago007 2011-04-25 16:35 299
    maxPos = 0;
925b7e58 sago007 2011-04-25 16:35 300
925b7e58 sago007 2011-04-25 16:35 301
    height = 0; // ascent+descent
925b7e58 sago007 2011-04-25 16:35 302
925b7e58 sago007 2011-04-25 16:35 303
    maxWidth = 0;
925b7e58 sago007 2011-04-25 16:35 304
    baseline = 0;
925b7e58 sago007 2011-04-25 16:35 305
    ascent = 0;
925b7e58 sago007 2011-04-25 16:35 306
    descent = 0;
925b7e58 sago007 2011-04-25 16:35 307
925b7e58 sago007 2011-04-25 16:35 308
    lineSpacing = 0;
925b7e58 sago007 2011-04-25 16:35 309
    letterSpacing = 0;
925b7e58 sago007 2011-04-25 16:35 310
    
925b7e58 sago007 2011-04-25 16:35 311
    if(buffer == NULL)
925b7e58 sago007 2011-04-25 16:35 312
        buffer = new char[1024];
925b7e58 sago007 2011-04-25 16:35 313
}
925b7e58 sago007 2011-04-25 16:35 314
925b7e58 sago007 2011-04-25 16:35 315
NFont::~NFont()
925b7e58 sago007 2011-04-25 16:35 316
{}
925b7e58 sago007 2011-04-25 16:35 317
925b7e58 sago007 2011-04-25 16:35 318
925b7e58 sago007 2011-04-25 16:35 319
// Loading
925b7e58 sago007 2011-04-25 16:35 320
bool NFont::load(SDL_Surface* FontSurface)
925b7e58 sago007 2011-04-25 16:35 321
{
925b7e58 sago007 2011-04-25 16:35 322
    src = FontSurface;
925b7e58 sago007 2011-04-25 16:35 323
    if (src == NULL)
925b7e58 sago007 2011-04-25 16:35 324
    {
925b7e58 sago007 2011-04-25 16:35 325
        printf("\n ERROR: NFont given a NULL surface\n");
925b7e58 sago007 2011-04-25 16:35 326
        return false;
925b7e58 sago007 2011-04-25 16:35 327
    }
925b7e58 sago007 2011-04-25 16:35 328
925b7e58 sago007 2011-04-25 16:35 329
    int x = 1, i = 0;
925b7e58 sago007 2011-04-25 16:35 330
    
925b7e58 sago007 2011-04-25 16:35 331
    // memset would be faster
925b7e58 sago007 2011-04-25 16:35 332
    for(int j = 0; j < 256; j++)
925b7e58 sago007 2011-04-25 16:35 333
    {
925b7e58 sago007 2011-04-25 16:35 334
        charWidth[j] = 0;
925b7e58 sago007 2011-04-25 16:35 335
        charPos[j] = 0;
925b7e58 sago007 2011-04-25 16:35 336
    }
925b7e58 sago007 2011-04-25 16:35 337
925b7e58 sago007 2011-04-25 16:35 338
    SDL_LockSurface(src);
925b7e58 sago007 2011-04-25 16:35 339
925b7e58 sago007 2011-04-25 16:35 340
    Uint32 pixel = SDL_MapRGB(src->format, 255, 0, 255); // pink pixel
925b7e58 sago007 2011-04-25 16:35 341
    
925b7e58 sago007 2011-04-25 16:35 342
    maxWidth = 0;
925b7e58 sago007 2011-04-25 16:35 343
    
925b7e58 sago007 2011-04-25 16:35 344
    // Get the character positions and widths
925b7e58 sago007 2011-04-25 16:35 345
    while (x < src->w)
925b7e58 sago007 2011-04-25 16:35 346
    {
925b7e58 sago007 2011-04-25 16:35 347
        if(getPixel(src, x, 0) != pixel)
925b7e58 sago007 2011-04-25 16:35 348
        {
925b7e58 sago007 2011-04-25 16:35 349
            charPos[i] = x;
925b7e58 sago007 2011-04-25 16:35 350
            charWidth[i] = x;
925b7e58 sago007 2011-04-25 16:35 351
            while(x < src->w && getPixel(src, x, 0) != pixel)
925b7e58 sago007 2011-04-25 16:35 352
                x++;
925b7e58 sago007 2011-04-25 16:35 353
            charWidth[i] = x - charWidth[i];
925b7e58 sago007 2011-04-25 16:35 354
            if(charWidth[i] > maxWidth)
925b7e58 sago007 2011-04-25 16:35 355
                maxWidth = charWidth[i];
925b7e58 sago007 2011-04-25 16:35 356
            i++;
925b7e58 sago007 2011-04-25 16:35 357
        }
925b7e58 sago007 2011-04-25 16:35 358
925b7e58 sago007 2011-04-25 16:35 359
        x++;
925b7e58 sago007 2011-04-25 16:35 360
    }
925b7e58 sago007 2011-04-25 16:35 361
925b7e58 sago007 2011-04-25 16:35 362
    maxPos = x - 1;
925b7e58 sago007 2011-04-25 16:35 363
925b7e58 sago007 2011-04-25 16:35 364
925b7e58 sago007 2011-04-25 16:35 365
    pixel = getPixel(src, 0, src->h - 1);
925b7e58 sago007 2011-04-25 16:35 366
    int j;
925b7e58 sago007 2011-04-25 16:35 367
    setBaseline();
925b7e58 sago007 2011-04-25 16:35 368
    
925b7e58 sago007 2011-04-25 16:35 369
    // Get the max ascent
925b7e58 sago007 2011-04-25 16:35 370
    j = 1;
925b7e58 sago007 2011-04-25 16:35 371
    while(j < baseline && j < src->h)
925b7e58 sago007 2011-04-25 16:35 372
    {
925b7e58 sago007 2011-04-25 16:35 373
        x = 0;
925b7e58 sago007 2011-04-25 16:35 374
        while(x < src->w)
925b7e58 sago007 2011-04-25 16:35 375
        {
925b7e58 sago007 2011-04-25 16:35 376
            if(getPixel(src, x, j) != pixel)
925b7e58 sago007 2011-04-25 16:35 377
            {
925b7e58 sago007 2011-04-25 16:35 378
                ascent = baseline - j;
925b7e58 sago007 2011-04-25 16:35 379
                j = src->h;
925b7e58 sago007 2011-04-25 16:35 380
                break;
925b7e58 sago007 2011-04-25 16:35 381
            }
925b7e58 sago007 2011-04-25 16:35 382
            x++;
925b7e58 sago007 2011-04-25 16:35 383
        }
925b7e58 sago007 2011-04-25 16:35 384
        j++;
925b7e58 sago007 2011-04-25 16:35 385
    }
925b7e58 sago007 2011-04-25 16:35 386
    
925b7e58 sago007 2011-04-25 16:35 387
    // Get the max descent
925b7e58 sago007 2011-04-25 16:35 388
    j = src->h - 1;
925b7e58 sago007 2011-04-25 16:35 389
    while(j > 0 && j > baseline)
925b7e58 sago007 2011-04-25 16:35 390
    {
925b7e58 sago007 2011-04-25 16:35 391
        x = 0;
925b7e58 sago007 2011-04-25 16:35 392
        while(x < src->w)
925b7e58 sago007 2011-04-25 16:35 393
        {
925b7e58 sago007 2011-04-25 16:35 394
            if(getPixel(src, x, j) != pixel)
925b7e58 sago007 2011-04-25 16:35 395
            {
925b7e58 sago007 2011-04-25 16:35 396
                descent = j - baseline+1;
925b7e58 sago007 2011-04-25 16:35 397
                j = 0;
925b7e58 sago007 2011-04-25 16:35 398
                break;
925b7e58 sago007 2011-04-25 16:35 399
            }
925b7e58 sago007 2011-04-25 16:35 400
            x++;
925b7e58 sago007 2011-04-25 16:35 401
        }
925b7e58 sago007 2011-04-25 16:35 402
        j--;
925b7e58 sago007 2011-04-25 16:35 403
    }
925b7e58 sago007 2011-04-25 16:35 404
    
925b7e58 sago007 2011-04-25 16:35 405
    
925b7e58 sago007 2011-04-25 16:35 406
    height = ascent + descent;
925b7e58 sago007 2011-04-25 16:35 407
    
925b7e58 sago007 2011-04-25 16:35 408
925b7e58 sago007 2011-04-25 16:35 409
    if((src->flags & SDL_SRCALPHA) != SDL_SRCALPHA)
925b7e58 sago007 2011-04-25 16:35 410
    {
925b7e58 sago007 2011-04-25 16:35 411
        pixel = getPixel(src, 0, src->h - 1);
925b7e58 sago007 2011-04-25 16:35 412
        SDL_UnlockSurface(src);
925b7e58 sago007 2011-04-25 16:35 413
        SDL_SetColorKey(src, SDL_SRCCOLORKEY, pixel);
925b7e58 sago007 2011-04-25 16:35 414
    }
925b7e58 sago007 2011-04-25 16:35 415
    else
925b7e58 sago007 2011-04-25 16:35 416
        SDL_UnlockSurface(src);
925b7e58 sago007 2011-04-25 16:35 417
925b7e58 sago007 2011-04-25 16:35 418
    return true;
925b7e58 sago007 2011-04-25 16:35 419
}
925b7e58 sago007 2011-04-25 16:35 420
925b7e58 sago007 2011-04-25 16:35 421
bool NFont::load(SDL_Surface* destSurface, SDL_Surface* FontSurface)
925b7e58 sago007 2011-04-25 16:35 422
{
925b7e58 sago007 2011-04-25 16:35 423
    setDest(destSurface);
925b7e58 sago007 2011-04-25 16:35 424
    return load(FontSurface);
925b7e58 sago007 2011-04-25 16:35 425
}
925b7e58 sago007 2011-04-25 16:35 426
925b7e58 sago007 2011-04-25 16:35 427
#ifdef NFONT_USE_TTF
925b7e58 sago007 2011-04-25 16:35 428
bool NFont::load(TTF_Font* ttf, SDL_Color fg, SDL_Color bg)
925b7e58 sago007 2011-04-25 16:35 429
{
925b7e58 sago007 2011-04-25 16:35 430
    if(ttf == NULL)
925b7e58 sago007 2011-04-25 16:35 431
        return false;
925b7e58 sago007 2011-04-25 16:35 432
    SDL_Surface* surfs[127 - 33];
925b7e58 sago007 2011-04-25 16:35 433
    int width = 0;
925b7e58 sago007 2011-04-25 16:35 434
    int height = 0;
925b7e58 sago007 2011-04-25 16:35 435
    
925b7e58 sago007 2011-04-25 16:35 436
    char buff[2];
925b7e58 sago007 2011-04-25 16:35 437
    buff[1] = '\0';
925b7e58 sago007 2011-04-25 16:35 438
    for(int i = 0; i < 127 - 33; i++)
925b7e58 sago007 2011-04-25 16:35 439
    {
925b7e58 sago007 2011-04-25 16:35 440
        buff[0] = i + 33;
925b7e58 sago007 2011-04-25 16:35 441
        surfs[i] = TTF_RenderText_Shaded(ttf, buff, fg, bg);
925b7e58 sago007 2011-04-25 16:35 442
        width += surfs[i]->w;
925b7e58 sago007 2011-04-25 16:35 443
        height = (height < surfs[i]->h)? surfs[i]->h : height;
925b7e58 sago007 2011-04-25 16:35 444
    }
925b7e58 sago007 2011-04-25 16:35 445
    
925b7e58 sago007 2011-04-25 16:35 446
    #if SDL_BYTEORDER == SDL_BIG_ENDIAN
925b7e58 sago007 2011-04-25 16:35 447
        SDL_Surface* result = SDL_CreateRGBSurface(SDL_SWSURFACE,width + 127 - 33 + 1,height,24, 0xFF0000, 0x00FF00, 0x0000FF, 0);
925b7e58 sago007 2011-04-25 16:35 448
    #else
925b7e58 sago007 2011-04-25 16:35 449
        SDL_Surface* result = SDL_CreateRGBSurface(SDL_SWSURFACE,width + 127 - 33 + 1,height,24, 0x0000FF, 0x00FF00, 0xFF0000, 0);
925b7e58 sago007 2011-04-25 16:35 450
    #endif
925b7e58 sago007 2011-04-25 16:35 451
    Uint32 pink = SDL_MapRGB(result->format, 255, 0, 255);
925b7e58 sago007 2011-04-25 16:35 452
    Uint32 bgcolor = SDL_MapRGB(result->format, bg.r, bg.g, bg.b);
925b7e58 sago007 2011-04-25 16:35 453
    
925b7e58 sago007 2011-04-25 16:35 454
    SDL_Rect pixel = {1, 0, 1, 1};
925b7e58 sago007 2011-04-25 16:35 455
    SDL_Rect line = {1, 0, 1, result->h};
925b7e58 sago007 2011-04-25 16:35 456
    
925b7e58 sago007 2011-04-25 16:35 457
    int x = 1;
925b7e58 sago007 2011-04-25 16:35 458
    SDL_Rect dest = {x, 0, 0, 0};
925b7e58 sago007 2011-04-25 16:35 459
    for(int i = 0; i < 127 - 33; i++)
925b7e58 sago007 2011-04-25 16:35 460
    {
925b7e58 sago007 2011-04-25 16:35 461
        pixel.x = line.x = x-1;
925b7e58 sago007 2011-04-25 16:35 462
        SDL_FillRect(result, &line, bgcolor);
925b7e58 sago007 2011-04-25 16:35 463
        SDL_FillRect(result, &pixel, pink);
925b7e58 sago007 2011-04-25 16:35 464
        
925b7e58 sago007 2011-04-25 16:35 465
        SDL_BlitSurface(surfs[i], NULL, result, &dest);
925b7e58 sago007 2011-04-25 16:35 466
        
925b7e58 sago007 2011-04-25 16:35 467
        x += surfs[i]->w + 1;
925b7e58 sago007 2011-04-25 16:35 468
        dest.x = x;
925b7e58 sago007 2011-04-25 16:35 469
        
925b7e58 sago007 2011-04-25 16:35 470
        SDL_FreeSurface(surfs[i]);
925b7e58 sago007 2011-04-25 16:35 471
    }
925b7e58 sago007 2011-04-25 16:35 472
    pixel.x = line.x = x-1;
925b7e58 sago007 2011-04-25 16:35 473
    SDL_FillRect(result, &line, bgcolor);
925b7e58 sago007 2011-04-25 16:35 474
    SDL_FillRect(result, &pixel, pink);
925b7e58 sago007 2011-04-25 16:35 475
    
925b7e58 sago007 2011-04-25 16:35 476
    return load(result);
925b7e58 sago007 2011-04-25 16:35 477
}
925b7e58 sago007 2011-04-25 16:35 478
925b7e58 sago007 2011-04-25 16:35 479
925b7e58 sago007 2011-04-25 16:35 480
bool NFont::load(TTF_Font* ttf, SDL_Color fg)
925b7e58 sago007 2011-04-25 16:35 481
{
925b7e58 sago007 2011-04-25 16:35 482
    if(ttf == NULL)
925b7e58 sago007 2011-04-25 16:35 483
        return false;
925b7e58 sago007 2011-04-25 16:35 484
    SDL_Surface* surfs[127 - 33];
925b7e58 sago007 2011-04-25 16:35 485
    int width = 0;
925b7e58 sago007 2011-04-25 16:35 486
    int height = 0;
925b7e58 sago007 2011-04-25 16:35 487
    
925b7e58 sago007 2011-04-25 16:35 488
    char buff[2];
925b7e58 sago007 2011-04-25 16:35 489
    buff[1] = '\0';
925b7e58 sago007 2011-04-25 16:35 490
    for(int i = 0; i < 127 - 33; i++)
925b7e58 sago007 2011-04-25 16:35 491
    {
925b7e58 sago007 2011-04-25 16:35 492
        buff[0] = i + 33;
925b7e58 sago007 2011-04-25 16:35 493
        surfs[i] = TTF_RenderText_Blended(ttf, buff, fg);
925b7e58 sago007 2011-04-25 16:35 494
        width += surfs[i]->w;
925b7e58 sago007 2011-04-25 16:35 495
        height = (height < surfs[i]->h)? surfs[i]->h : height;
925b7e58 sago007 2011-04-25 16:35 496
    }
925b7e58 sago007 2011-04-25 16:35 497
    
925b7e58 sago007 2011-04-25 16:35 498
    #if SDL_BYTEORDER == SDL_BIG_ENDIAN
925b7e58 sago007 2011-04-25 16:35 499
        SDL_Surface* result = SDL_CreateRGBSurface(SDL_SWSURFACE,width + 127 - 33 + 1,height,32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF);
925b7e58 sago007 2011-04-25 16:35 500
    #else
925b7e58 sago007 2011-04-25 16:35 501
        SDL_Surface* result = SDL_CreateRGBSurface(SDL_SWSURFACE,width + 127 - 33 + 1,height,32, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000);
925b7e58 sago007 2011-04-25 16:35 502
    #endif
925b7e58 sago007 2011-04-25 16:35 503
    Uint32 pink = SDL_MapRGBA(result->format, 255, 0, 255, SDL_ALPHA_OPAQUE);
925b7e58 sago007 2011-04-25 16:35 504
    
925b7e58 sago007 2011-04-25 16:35 505
    SDL_SetAlpha(result, 0, SDL_ALPHA_OPAQUE);
925b7e58 sago007 2011-04-25 16:35 506
    
925b7e58 sago007 2011-04-25 16:35 507
    SDL_Rect pixel = {1, 0, 1, 1};
925b7e58 sago007 2011-04-25 16:35 508
    
925b7e58 sago007 2011-04-25 16:35 509
    int x = 1;
925b7e58 sago007 2011-04-25 16:35 510
    SDL_Rect dest = {x, 0, 0, 0};
925b7e58 sago007 2011-04-25 16:35 511
    for(int i = 0; i < 127 - 33; i++)
925b7e58 sago007 2011-04-25 16:35 512
    {
925b7e58 sago007 2011-04-25 16:35 513
        pixel.x = x-1;
925b7e58 sago007 2011-04-25 16:35 514
        SDL_FillRect(result, &pixel, pink);
925b7e58 sago007 2011-04-25 16:35 515
        
925b7e58 sago007 2011-04-25 16:35 516
        SDL_SetAlpha(surfs[i], 0, SDL_ALPHA_OPAQUE);
925b7e58 sago007 2011-04-25 16:35 517
        SDL_BlitSurface(surfs[i], NULL, result, &dest);
925b7e58 sago007 2011-04-25 16:35 518
        
925b7e58 sago007 2011-04-25 16:35 519
        x += surfs[i]->w + 1;
925b7e58 sago007 2011-04-25 16:35 520
        dest.x = x;
925b7e58 sago007 2011-04-25 16:35 521
        
925b7e58 sago007 2011-04-25 16:35 522
        SDL_FreeSurface(surfs[i]);
925b7e58 sago007 2011-04-25 16:35 523
    }
925b7e58 sago007 2011-04-25 16:35 524
    pixel.x = x-1;
925b7e58 sago007 2011-04-25 16:35 525
    SDL_FillRect(result, &pixel, pink);
925b7e58 sago007 2011-04-25 16:35 526
    
925b7e58 sago007 2011-04-25 16:35 527
    SDL_SetAlpha(result, SDL_SRCALPHA, SDL_ALPHA_OPAQUE);
925b7e58 sago007 2011-04-25 16:35 528
    
925b7e58 sago007 2011-04-25 16:35 529
    return load(result);
925b7e58 sago007 2011-04-25 16:35 530
}
925b7e58 sago007 2011-04-25 16:35 531
925b7e58 sago007 2011-04-25 16:35 532
925b7e58 sago007 2011-04-25 16:35 533
bool NFont::load(const char* filename_ttf, Uint32 pointSize, SDL_Color fg, int style)
925b7e58 sago007 2011-04-25 16:35 534
{
925b7e58 sago007 2011-04-25 16:35 535
    if(!TTF_WasInit() && TTF_Init() < 0)
925b7e58 sago007 2011-04-25 16:35 536
    {
925b7e58 sago007 2011-04-25 16:35 537
        printf("Unable to initialize SDL_ttf: %s \n", TTF_GetError());
925b7e58 sago007 2011-04-25 16:35 538
        return false;
925b7e58 sago007 2011-04-25 16:35 539
    }
925b7e58 sago007 2011-04-25 16:35 540
    
925b7e58 sago007 2011-04-25 16:35 541
    TTF_Font* ttf = TTF_OpenFont(filename_ttf, pointSize);
925b7e58 sago007 2011-04-25 16:35 542
    
925b7e58 sago007 2011-04-25 16:35 543
    if(ttf == NULL)
925b7e58 sago007 2011-04-25 16:35 544
    {
925b7e58 sago007 2011-04-25 16:35 545
        printf("Unable to load TrueType font: %s \n", TTF_GetError());
925b7e58 sago007 2011-04-25 16:35 546
        return false;
925b7e58 sago007 2011-04-25 16:35 547
    }
925b7e58 sago007 2011-04-25 16:35 548
    TTF_SetFontStyle(ttf, style);
925b7e58 sago007 2011-04-25 16:35 549
    bool result = load(ttf, fg);
925b7e58 sago007 2011-04-25 16:35 550
    TTF_CloseFont(ttf);
925b7e58 sago007 2011-04-25 16:35 551
    return result;
925b7e58 sago007 2011-04-25 16:35 552
}
925b7e58 sago007 2011-04-25 16:35 553
925b7e58 sago007 2011-04-25 16:35 554
bool NFont::load(const char* filename_ttf, Uint32 pointSize, SDL_Color fg, SDL_Color bg, int style)
925b7e58 sago007 2011-04-25 16:35 555
{
925b7e58 sago007 2011-04-25 16:35 556
    if(!TTF_WasInit() && TTF_Init() < 0)
925b7e58 sago007 2011-04-25 16:35 557
    {
925b7e58 sago007 2011-04-25 16:35 558
        printf("Unable to initialize SDL_ttf: %s \n", TTF_GetError());
925b7e58 sago007 2011-04-25 16:35 559
        return false;
925b7e58 sago007 2011-04-25 16:35 560
    }
925b7e58 sago007 2011-04-25 16:35 561
    
925b7e58 sago007 2011-04-25 16:35 562
    TTF_Font* ttf = TTF_OpenFont(filename_ttf, pointSize);
925b7e58 sago007 2011-04-25 16:35 563
    
925b7e58 sago007 2011-04-25 16:35 564
    if(ttf == NULL)
925b7e58 sago007 2011-04-25 16:35 565
    {
925b7e58 sago007 2011-04-25 16:35 566
        printf("Unable to load TrueType font: %s \n", TTF_GetError());
925b7e58 sago007 2011-04-25 16:35 567
        return false;
925b7e58 sago007 2011-04-25 16:35 568
    }
925b7e58 sago007 2011-04-25 16:35 569
    TTF_SetFontStyle(ttf, style);
925b7e58 sago007 2011-04-25 16:35 570
    bool result = load(ttf, fg, bg);
925b7e58 sago007 2011-04-25 16:35 571
    TTF_CloseFont(ttf);
925b7e58 sago007 2011-04-25 16:35 572
    return result;
925b7e58 sago007 2011-04-25 16:35 573
}
925b7e58 sago007 2011-04-25 16:35 574
925b7e58 sago007 2011-04-25 16:35 575
#endif
925b7e58 sago007 2011-04-25 16:35 576
925b7e58 sago007 2011-04-25 16:35 577
925b7e58 sago007 2011-04-25 16:35 578
925b7e58 sago007 2011-04-25 16:35 579
void NFont::freeSurface()
925b7e58 sago007 2011-04-25 16:35 580
{
925b7e58 sago007 2011-04-25 16:35 581
    SDL_FreeSurface(src);
925b7e58 sago007 2011-04-25 16:35 582
}
925b7e58 sago007 2011-04-25 16:35 583
925b7e58 sago007 2011-04-25 16:35 584
925b7e58 sago007 2011-04-25 16:35 585
925b7e58 sago007 2011-04-25 16:35 586
// Drawing
925b7e58 sago007 2011-04-25 16:35 587
SDL_Rect NFont::drawToSurface(int x, int y, const char* text) const
925b7e58 sago007 2011-04-25 16:35 588
{
925b7e58 sago007 2011-04-25 16:35 589
    const char* c = text;
925b7e58 sago007 2011-04-25 16:35 590
    unsigned char num;
925b7e58 sago007 2011-04-25 16:35 591
    SDL_Rect srcRect, dstRect, copyS, copyD;
925b7e58 sago007 2011-04-25 16:35 592
    data.dirtyRect = makeRect(x, y, 0, 0);
925b7e58 sago007 2011-04-25 16:35 593
    
925b7e58 sago007 2011-04-25 16:35 594
    if(c == NULL || src == NULL || dest == NULL)
925b7e58 sago007 2011-04-25 16:35 595
        return data.dirtyRect;
925b7e58 sago007 2011-04-25 16:35 596
    
925b7e58 sago007 2011-04-25 16:35 597
    srcRect.y = baseline - ascent;
925b7e58 sago007 2011-04-25 16:35 598
    srcRect.h = dstRect.h = height;
925b7e58 sago007 2011-04-25 16:35 599
    dstRect.x = x;
925b7e58 sago007 2011-04-25 16:35 600
    dstRect.y = y;
925b7e58 sago007 2011-04-25 16:35 601
    
925b7e58 sago007 2011-04-25 16:35 602
    int newlineX = x;
925b7e58 sago007 2011-04-25 16:35 603
    
925b7e58 sago007 2011-04-25 16:35 604
    for(; *c != '\0'; c++)
925b7e58 sago007 2011-04-25 16:35 605
    {
925b7e58 sago007 2011-04-25 16:35 606
        if(*c == '\n')
925b7e58 sago007 2011-04-25 16:35 607
        {
925b7e58 sago007 2011-04-25 16:35 608
            dstRect.x = newlineX;
925b7e58 sago007 2011-04-25 16:35 609
            dstRect.y += height + lineSpacing;
925b7e58 sago007 2011-04-25 16:35 610
            continue;
925b7e58 sago007 2011-04-25 16:35 611
        }
925b7e58 sago007 2011-04-25 16:35 612
        
925b7e58 sago007 2011-04-25 16:35 613
        if (*c == ' ')
925b7e58 sago007 2011-04-25 16:35 614
        {
925b7e58 sago007 2011-04-25 16:35 615
            dstRect.x += charWidth[0] + letterSpacing;
925b7e58 sago007 2011-04-25 16:35 616
            continue;
925b7e58 sago007 2011-04-25 16:35 617
        }
925b7e58 sago007 2011-04-25 16:35 618
        unsigned char ctest = (unsigned char)(*c);
925b7e58 sago007 2011-04-25 16:35 619
        // Skip bad characters
925b7e58 sago007 2011-04-25 16:35 620
        if(ctest < 33 || (ctest > 126 && ctest < 161))
925b7e58 sago007 2011-04-25 16:35 621
            continue;
925b7e58 sago007 2011-04-25 16:35 622
        if(dstRect.x >= dest->w)
925b7e58 sago007 2011-04-25 16:35 623
            continue;
925b7e58 sago007 2011-04-25 16:35 624
        if(dstRect.y >= dest->h)
925b7e58 sago007 2011-04-25 16:35 625
            continue;
925b7e58 sago007 2011-04-25 16:35 626
        
925b7e58 sago007 2011-04-25 16:35 627
        num = ctest - 33;  // Get array index
925b7e58 sago007 2011-04-25 16:35 628
        if(num > 126) // shift the extended characters down to the correct index
925b7e58 sago007 2011-04-25 16:35 629
            num -= 34;
925b7e58 sago007 2011-04-25 16:35 630
        srcRect.x = charPos[num];
925b7e58 sago007 2011-04-25 16:35 631
        srcRect.w = dstRect.w = charWidth[num];
925b7e58 sago007 2011-04-25 16:35 632
        copyS = srcRect;
925b7e58 sago007 2011-04-25 16:35 633
        copyD = dstRect;
925b7e58 sago007 2011-04-25 16:35 634
        SDL_BlitSurface(src, &srcRect, dest, &dstRect);
925b7e58 sago007 2011-04-25 16:35 635
        if(data.dirtyRect.w == 0 || data.dirtyRect.h == 0)
925b7e58 sago007 2011-04-25 16:35 636
            data.dirtyRect = dstRect;
925b7e58 sago007 2011-04-25 16:35 637
        else
925b7e58 sago007 2011-04-25 16:35 638
            data.dirtyRect = rectUnion(data.dirtyRect, dstRect);
925b7e58 sago007 2011-04-25 16:35 639
        srcRect = copyS;
925b7e58 sago007 2011-04-25 16:35 640
        dstRect = copyD;
925b7e58 sago007 2011-04-25 16:35 641
        
925b7e58 sago007 2011-04-25 16:35 642
        dstRect.x += dstRect.w + letterSpacing;
925b7e58 sago007 2011-04-25 16:35 643
    }
925b7e58 sago007 2011-04-25 16:35 644
    
925b7e58 sago007 2011-04-25 16:35 645
    return data.dirtyRect;
925b7e58 sago007 2011-04-25 16:35 646
}
925b7e58 sago007 2011-04-25 16:35 647
925b7e58 sago007 2011-04-25 16:35 648
SDL_Rect NFont::drawToSurfacePos(int x, int y, NFont::AnimFn posFn) const
925b7e58 sago007 2011-04-25 16:35 649
{
925b7e58 sago007 2011-04-25 16:35 650
    data.font = this;
925b7e58 sago007 2011-04-25 16:35 651
    data.dest = dest;
925b7e58 sago007 2011-04-25 16:35 652
    data.src = src;
925b7e58 sago007 2011-04-25 16:35 653
    data.text = buffer;  // Buffer for efficient drawing
925b7e58 sago007 2011-04-25 16:35 654
    data.height = height;
925b7e58 sago007 2011-04-25 16:35 655
    data.charPos = charPos;
925b7e58 sago007 2011-04-25 16:35 656
    data.charWidth = charWidth;
925b7e58 sago007 2011-04-25 16:35 657
    data.maxX = maxPos;
925b7e58 sago007 2011-04-25 16:35 658
    data.dirtyRect = makeRect(x,y,0,0);
925b7e58 sago007 2011-04-25 16:35 659
925b7e58 sago007 2011-04-25 16:35 660
    data.index = -1;
925b7e58 sago007 2011-04-25 16:35 661
    data.letterNum = 0;
925b7e58 sago007 2011-04-25 16:35 662
    data.wordNum = 1;
925b7e58 sago007 2011-04-25 16:35 663
    data.lineNum = 1;
925b7e58 sago007 2011-04-25 16:35 664
    data.startX = x;  // used as reset value for line feed
925b7e58 sago007 2011-04-25 16:35 665
    data.startY = y;
925b7e58 sago007 2011-04-25 16:35 666
    
925b7e58 sago007 2011-04-25 16:35 667
    int preFnX = x;
925b7e58 sago007 2011-04-25 16:35 668
    int preFnY = y;
925b7e58 sago007 2011-04-25 16:35 669
    
925b7e58 sago007 2011-04-25 16:35 670
    const char* c = buffer;
925b7e58 sago007 2011-04-25 16:35 671
    unsigned char num;
925b7e58 sago007 2011-04-25 16:35 672
    SDL_Rect srcRect, dstRect, copyS, copyD;
925b7e58 sago007 2011-04-25 16:35 673
    
925b7e58 sago007 2011-04-25 16:35 674
    if(c == NULL || src == NULL || dest == NULL)
925b7e58 sago007 2011-04-25 16:35 675
        return makeRect(x,y,0,0);
925b7e58 sago007 2011-04-25 16:35 676
    
925b7e58 sago007 2011-04-25 16:35 677
    srcRect.y = baseline - ascent;
925b7e58 sago007 2011-04-25 16:35 678
    srcRect.h = dstRect.h = height;
925b7e58 sago007 2011-04-25 16:35 679
    dstRect.x = x;
925b7e58 sago007 2011-04-25 16:35 680
    dstRect.y = y;
925b7e58 sago007 2011-04-25 16:35 681
    
925b7e58 sago007 2011-04-25 16:35 682
    for(; *c != '\0'; c++)
925b7e58 sago007 2011-04-25 16:35 683
    {
925b7e58 sago007 2011-04-25 16:35 684
        data.index++;
925b7e58 sago007 2011-04-25 16:35 685
        data.letterNum++;
925b7e58 sago007 2011-04-25 16:35 686
        
925b7e58 sago007 2011-04-25 16:35 687
        if(*c == '\n')
925b7e58 sago007 2011-04-25 16:35 688
        {
925b7e58 sago007 2011-04-25 16:35 689
            data.letterNum = 1;
925b7e58 sago007 2011-04-25 16:35 690
            data.wordNum = 1;
925b7e58 sago007 2011-04-25 16:35 691
            data.lineNum++;
925b7e58 sago007 2011-04-25 16:35 692
925b7e58 sago007 2011-04-25 16:35 693
            x = data.startX;  // carriage return
925b7e58 sago007 2011-04-25 16:35 694
            y += height + lineSpacing;
925b7e58 sago007 2011-04-25 16:35 695
            continue;
925b7e58 sago007 2011-04-25 16:35 696
        }
925b7e58 sago007 2011-04-25 16:35 697
        if (*c == ' ')
925b7e58 sago007 2011-04-25 16:35 698
        {
925b7e58 sago007 2011-04-25 16:35 699
            data.letterNum = 1;
925b7e58 sago007 2011-04-25 16:35 700
            data.wordNum++;
925b7e58 sago007 2011-04-25 16:35 701
            
925b7e58 sago007 2011-04-25 16:35 702
            x += charWidth[0] + letterSpacing;
925b7e58 sago007 2011-04-25 16:35 703
            continue;
925b7e58 sago007 2011-04-25 16:35 704
        }
925b7e58 sago007 2011-04-25 16:35 705
        unsigned char ctest = (unsigned char)(*c);
925b7e58 sago007 2011-04-25 16:35 706
        // Skip bad characters
925b7e58 sago007 2011-04-25 16:35 707
        if(ctest < 33 || (ctest > 126 && ctest < 161))
925b7e58 sago007 2011-04-25 16:35 708
            continue;
925b7e58 sago007 2011-04-25 16:35 709
        //if(x >= dest->w) // This shouldn't be used with position control
925b7e58 sago007 2011-04-25 16:35 710
        //    continue;
925b7e58 sago007 2011-04-25 16:35 711
        num = ctest - 33;
925b7e58 sago007 2011-04-25 16:35 712
        if(num > 126) // shift the extended characters down to the array index
925b7e58 sago007 2011-04-25 16:35 713
            num -= 34;
925b7e58 sago007 2011-04-25 16:35 714
        srcRect.x = charPos[num];
925b7e58 sago007 2011-04-25 16:35 715
        srcRect.w = dstRect.w = charWidth[num];
925b7e58 sago007 2011-04-25 16:35 716
        
925b7e58 sago007 2011-04-25 16:35 717
        preFnX = x;  // Save real position
925b7e58 sago007 2011-04-25 16:35 718
        preFnY = y;
925b7e58 sago007 2011-04-25 16:35 719
925b7e58 sago007 2011-04-25 16:35 720
        // Use function pointer to get final x, y values
925b7e58 sago007 2011-04-25 16:35 721
        posFn(x, y, data);
925b7e58 sago007 2011-04-25 16:35 722
        
925b7e58 sago007 2011-04-25 16:35 723
        dstRect.x = x;
925b7e58 sago007 2011-04-25 16:35 724
        dstRect.y = y;
925b7e58 sago007 2011-04-25 16:35 725
        
925b7e58 sago007 2011-04-25 16:35 726
        copyS = srcRect;
925b7e58 sago007 2011-04-25 16:35 727
        copyD = dstRect;
925b7e58 sago007 2011-04-25 16:35 728
        SDL_BlitSurface(src, &srcRect, dest, &dstRect);
925b7e58 sago007 2011-04-25 16:35 729
        if(data.dirtyRect.w == 0 || data.dirtyRect.h == 0)
925b7e58 sago007 2011-04-25 16:35 730
            data.dirtyRect = dstRect;
925b7e58 sago007 2011-04-25 16:35 731
        else
925b7e58 sago007 2011-04-25 16:35 732
            data.dirtyRect = rectUnion(data.dirtyRect, dstRect);
925b7e58 sago007 2011-04-25 16:35 733
        srcRect = copyS;
925b7e58 sago007 2011-04-25 16:35 734
        dstRect = copyD;
925b7e58 sago007 2011-04-25 16:35 735
        
925b7e58 sago007 2011-04-25 16:35 736
        x = preFnX;  // Restore real position
925b7e58 sago007 2011-04-25 16:35 737
        y = preFnY;
925b7e58 sago007 2011-04-25 16:35 738
        
925b7e58 sago007 2011-04-25 16:35 739
        x += dstRect.w + letterSpacing;
925b7e58 sago007 2011-04-25 16:35 740
    }
925b7e58 sago007 2011-04-25 16:35 741
    
925b7e58 sago007 2011-04-25 16:35 742
    return data.dirtyRect;
925b7e58 sago007 2011-04-25 16:35 743
}
925b7e58 sago007 2011-04-25 16:35 744
925b7e58 sago007 2011-04-25 16:35 745
SDL_Rect NFont::draw(int x, int y, const char* formatted_text, ...) const
925b7e58 sago007 2011-04-25 16:35 746
{
925b7e58 sago007 2011-04-25 16:35 747
    if(formatted_text == NULL)
925b7e58 sago007 2011-04-25 16:35 748
        return makeRect(x, y, 0, 0);
925b7e58 sago007 2011-04-25 16:35 749
925b7e58 sago007 2011-04-25 16:35 750
    va_list lst;
925b7e58 sago007 2011-04-25 16:35 751
    va_start(lst, formatted_text);
925b7e58 sago007 2011-04-25 16:35 752
    vsprintf(buffer, formatted_text, lst);
925b7e58 sago007 2011-04-25 16:35 753
    va_end(lst);
925b7e58 sago007 2011-04-25 16:35 754
925b7e58 sago007 2011-04-25 16:35 755
    return drawToSurface(x, y, buffer);
925b7e58 sago007 2011-04-25 16:35 756
}
925b7e58 sago007 2011-04-25 16:35 757
925b7e58 sago007 2011-04-25 16:35 758
SDL_Rect NFont::drawCenter(int x, int y, const char* formatted_text, ...) const
925b7e58 sago007 2011-04-25 16:35 759
{
925b7e58 sago007 2011-04-25 16:35 760
    if(formatted_text == NULL)
925b7e58 sago007 2011-04-25 16:35 761
        return makeRect(x, y, 0, 0);
925b7e58 sago007 2011-04-25 16:35 762
925b7e58 sago007 2011-04-25 16:35 763
    va_list lst;
925b7e58 sago007 2011-04-25 16:35 764
    va_start(lst, formatted_text);
925b7e58 sago007 2011-04-25 16:35 765
    vsprintf(buffer, formatted_text, lst);
925b7e58 sago007 2011-04-25 16:35 766
    va_end(lst);
925b7e58 sago007 2011-04-25 16:35 767
925b7e58 sago007 2011-04-25 16:35 768
    char* str = copyString(buffer);
925b7e58 sago007 2011-04-25 16:35 769
    char* del = str;
925b7e58 sago007 2011-04-25 16:35 770
925b7e58 sago007 2011-04-25 16:35 771
    // Go through str, when you find a \n, replace it with \0 and print it
925b7e58 sago007 2011-04-25 16:35 772
    // then move down, back, and continue.
925b7e58 sago007 2011-04-25 16:35 773
    for(char* c = str; *c != '\0';)
925b7e58 sago007 2011-04-25 16:35 774
    {
925b7e58 sago007 2011-04-25 16:35 775
        if(*c == '\n')
925b7e58 sago007 2011-04-25 16:35 776
        {
925b7e58 sago007 2011-04-25 16:35 777
            *c = '\0';
925b7e58 sago007 2011-04-25 16:35 778
            drawToSurface(x - getWidth("%s", str)/2, y, str);
925b7e58 sago007 2011-04-25 16:35 779
            *c = '\n';
925b7e58 sago007 2011-04-25 16:35 780
            c++;
925b7e58 sago007 2011-04-25 16:35 781
            str = c;
925b7e58 sago007 2011-04-25 16:35 782
            y += height;
925b7e58 sago007 2011-04-25 16:35 783
        }
925b7e58 sago007 2011-04-25 16:35 784
        else
925b7e58 sago007 2011-04-25 16:35 785
            c++;
925b7e58 sago007 2011-04-25 16:35 786
    }
925b7e58 sago007 2011-04-25 16:35 787
    char s[strlen(str)+1];
925b7e58 sago007 2011-04-25 16:35 788
    strcpy(s, str);
925b7e58 sago007 2011-04-25 16:35 789
    delete[] del;
925b7e58 sago007 2011-04-25 16:35 790
    
925b7e58 sago007 2011-04-25 16:35 791
    return drawToSurface(x - getWidth("%s", s)/2, y, s);
925b7e58 sago007 2011-04-25 16:35 792
}
925b7e58 sago007 2011-04-25 16:35 793
925b7e58 sago007 2011-04-25 16:35 794
SDL_Rect NFont::drawRight(int x, int y, const char* formatted_text, ...) const
925b7e58 sago007 2011-04-25 16:35 795
{
925b7e58 sago007 2011-04-25 16:35 796
    if(formatted_text == NULL)
925b7e58 sago007 2011-04-25 16:35 797
        return makeRect(x, y, 0, 0);
925b7e58 sago007 2011-04-25 16:35 798
925b7e58 sago007 2011-04-25 16:35 799
    va_list lst;
925b7e58 sago007 2011-04-25 16:35 800
    va_start(lst, formatted_text);
925b7e58 sago007 2011-04-25 16:35 801
    vsprintf(buffer, formatted_text, lst);
925b7e58 sago007 2011-04-25 16:35 802
    va_end(lst);
925b7e58 sago007 2011-04-25 16:35 803
925b7e58 sago007 2011-04-25 16:35 804
    char* str = copyString(buffer);
925b7e58 sago007 2011-04-25 16:35 805
    char* del = str;
925b7e58 sago007 2011-04-25 16:35 806
925b7e58 sago007 2011-04-25 16:35 807
    for(char* c = str; *c != '\0';)
925b7e58 sago007 2011-04-25 16:35 808
    {
925b7e58 sago007 2011-04-25 16:35 809
        if(*c == '\n')
925b7e58 sago007 2011-04-25 16:35 810
        {
925b7e58 sago007 2011-04-25 16:35 811
            *c = '\0';
925b7e58 sago007 2011-04-25 16:35 812
            drawToSurface(x - getWidth("%s", str), y, str);
925b7e58 sago007 2011-04-25 16:35 813
            *c = '\n';
925b7e58 sago007 2011-04-25 16:35 814
            c++;
925b7e58 sago007 2011-04-25 16:35 815
            str = c;
925b7e58 sago007 2011-04-25 16:35 816
            y += height;
925b7e58 sago007 2011-04-25 16:35 817
        }
925b7e58 sago007 2011-04-25 16:35 818
        else
925b7e58 sago007 2011-04-25 16:35 819
            c++;
925b7e58 sago007 2011-04-25 16:35 820
    }
925b7e58 sago007 2011-04-25 16:35 821
    char s[strlen(str)+1];
925b7e58 sago007 2011-04-25 16:35 822
    strcpy(s, str);
925b7e58 sago007 2011-04-25 16:35 823
    delete[] del;
925b7e58 sago007 2011-04-25 16:35 824
    
925b7e58 sago007 2011-04-25 16:35 825
    return drawToSurface(x - getWidth("%s", s), y, s);
925b7e58 sago007 2011-04-25 16:35 826
}
925b7e58 sago007 2011-04-25 16:35 827
925b7e58 sago007 2011-04-25 16:35 828
SDL_Rect NFont::drawPos(int x, int y, NFont::AnimFn posFn, const char* text, ...) const
925b7e58 sago007 2011-04-25 16:35 829
{
925b7e58 sago007 2011-04-25 16:35 830
    va_list lst;
925b7e58 sago007 2011-04-25 16:35 831
    va_start(lst, text);
925b7e58 sago007 2011-04-25 16:35 832
    vsprintf(buffer, text, lst);
925b7e58 sago007 2011-04-25 16:35 833
    va_end(lst);
925b7e58 sago007 2011-04-25 16:35 834
925b7e58 sago007 2011-04-25 16:35 835
    return drawToSurfacePos(x, y, posFn);
925b7e58 sago007 2011-04-25 16:35 836
}
925b7e58 sago007 2011-04-25 16:35 837
925b7e58 sago007 2011-04-25 16:35 838
SDL_Rect NFont::drawAll(int x, int y, NFont::AnimFn allFn, const char* text, ...) const
925b7e58 sago007 2011-04-25 16:35 839
{
925b7e58 sago007 2011-04-25 16:35 840
    va_list lst;
925b7e58 sago007 2011-04-25 16:35 841
    va_start(lst, text);
925b7e58 sago007 2011-04-25 16:35 842
    vsprintf(buffer, text, lst);
925b7e58 sago007 2011-04-25 16:35 843
    va_end(lst);
925b7e58 sago007 2011-04-25 16:35 844
925b7e58 sago007 2011-04-25 16:35 845
    allFn(x, y, data);
925b7e58 sago007 2011-04-25 16:35 846
    return data.dirtyRect;
925b7e58 sago007 2011-04-25 16:35 847
}
925b7e58 sago007 2011-04-25 16:35 848
925b7e58 sago007 2011-04-25 16:35 849
925b7e58 sago007 2011-04-25 16:35 850
925b7e58 sago007 2011-04-25 16:35 851
925b7e58 sago007 2011-04-25 16:35 852
// Getters
925b7e58 sago007 2011-04-25 16:35 853
SDL_Surface* NFont::getDest() const
925b7e58 sago007 2011-04-25 16:35 854
{
925b7e58 sago007 2011-04-25 16:35 855
    return dest;
925b7e58 sago007 2011-04-25 16:35 856
}
925b7e58 sago007 2011-04-25 16:35 857
925b7e58 sago007 2011-04-25 16:35 858
SDL_Surface* NFont::getSurface() const
925b7e58 sago007 2011-04-25 16:35 859
{
925b7e58 sago007 2011-04-25 16:35 860
    return src;
925b7e58 sago007 2011-04-25 16:35 861
}
925b7e58 sago007 2011-04-25 16:35 862
925b7e58 sago007 2011-04-25 16:35 863
int NFont::getHeight(const char* formatted_text, ...) const
925b7e58 sago007 2011-04-25 16:35 864
{
925b7e58 sago007 2011-04-25 16:35 865
    if(formatted_text == NULL)
925b7e58 sago007 2011-04-25 16:35 866
        return height;
925b7e58 sago007 2011-04-25 16:35 867
925b7e58 sago007 2011-04-25 16:35 868
    va_list lst;
925b7e58 sago007 2011-04-25 16:35 869
    va_start(lst, formatted_text);
925b7e58 sago007 2011-04-25 16:35 870
    vsprintf(buffer, formatted_text, lst);
925b7e58 sago007 2011-04-25 16:35 871
    va_end(lst);
925b7e58 sago007 2011-04-25 16:35 872
925b7e58 sago007 2011-04-25 16:35 873
    int numLines = 1;
925b7e58 sago007 2011-04-25 16:35 874
    const char* c;
925b7e58 sago007 2011-04-25 16:35 875
925b7e58 sago007 2011-04-25 16:35 876
    for (c = buffer; *c != '\0'; c++)
925b7e58 sago007 2011-04-25 16:35 877
    {
925b7e58 sago007 2011-04-25 16:35 878
        if(*c == '\n')
925b7e58 sago007 2011-04-25 16:35 879
            numLines++;
925b7e58 sago007 2011-04-25 16:35 880
    }
925b7e58 sago007 2011-04-25 16:35 881
925b7e58 sago007 2011-04-25 16:35 882
    //   Actual height of letter region + line spacing
925b7e58 sago007 2011-04-25 16:35 883
    return height*numLines + lineSpacing*(numLines - 1);  //height*numLines;
925b7e58 sago007 2011-04-25 16:35 884
}
925b7e58 sago007 2011-04-25 16:35 885
925b7e58 sago007 2011-04-25 16:35 886
int NFont::getWidth(const char* formatted_text, ...) const
925b7e58 sago007 2011-04-25 16:35 887
{
925b7e58 sago007 2011-04-25 16:35 888
    if (formatted_text == NULL)
925b7e58 sago007 2011-04-25 16:35 889
        return 0;
925b7e58 sago007 2011-04-25 16:35 890
925b7e58 sago007 2011-04-25 16:35 891
    va_list lst;
925b7e58 sago007 2011-04-25 16:35 892
    va_start(lst, formatted_text);
925b7e58 sago007 2011-04-25 16:35 893
    vsprintf(buffer, formatted_text, lst);
925b7e58 sago007 2011-04-25 16:35 894
    va_end(lst);
925b7e58 sago007 2011-04-25 16:35 895
925b7e58 sago007 2011-04-25 16:35 896
    const char* c;
925b7e58 sago007 2011-04-25 16:35 897
    int charnum = 0;
925b7e58 sago007 2011-04-25 16:35 898
    int width = 0;
925b7e58 sago007 2011-04-25 16:35 899
    int bigWidth = 0;  // Allows for multi-line strings
925b7e58 sago007 2011-04-25 16:35 900
925b7e58 sago007 2011-04-25 16:35 901
    for (c = buffer; *c != '\0'; c++)
925b7e58 sago007 2011-04-25 16:35 902
    {
925b7e58 sago007 2011-04-25 16:35 903
        charnum = (unsigned char)(*c) - 33;
925b7e58 sago007 2011-04-25 16:35 904
925b7e58 sago007 2011-04-25 16:35 905
        // skip spaces and nonprintable characters
925b7e58 sago007 2011-04-25 16:35 906
        if(*c == '\n')
925b7e58 sago007 2011-04-25 16:35 907
        {
925b7e58 sago007 2011-04-25 16:35 908
            bigWidth = bigWidth >= width? bigWidth : width;
925b7e58 sago007 2011-04-25 16:35 909
            width = 0;
925b7e58 sago007 2011-04-25 16:35 910
        }
925b7e58 sago007 2011-04-25 16:35 911
        else if (*c == ' ' || charnum > 222)
925b7e58 sago007 2011-04-25 16:35 912
        {
925b7e58 sago007 2011-04-25 16:35 913
            width += charWidth[0];
925b7e58 sago007 2011-04-25 16:35 914
            continue;
925b7e58 sago007 2011-04-25 16:35 915
        }
925b7e58 sago007 2011-04-25 16:35 916
925b7e58 sago007 2011-04-25 16:35 917
        width += charWidth[charnum];
925b7e58 sago007 2011-04-25 16:35 918
    }
925b7e58 sago007 2011-04-25 16:35 919
    bigWidth = bigWidth >= width? bigWidth : width;
925b7e58 sago007 2011-04-25 16:35 920
925b7e58 sago007 2011-04-25 16:35 921
    return bigWidth;
925b7e58 sago007 2011-04-25 16:35 922
}
925b7e58 sago007 2011-04-25 16:35 923
925b7e58 sago007 2011-04-25 16:35 924
int NFont::getAscent(const char character) const
925b7e58 sago007 2011-04-25 16:35 925
{
925b7e58 sago007 2011-04-25 16:35 926
    unsigned char test = (unsigned char)character;
925b7e58 sago007 2011-04-25 16:35 927
    if(test < 33 || test > 222 || (test > 126 && test < 161))
925b7e58 sago007 2011-04-25 16:35 928
        return 0;
925b7e58 sago007 2011-04-25 16:35 929
    unsigned char num = (unsigned char)character - 33;
925b7e58 sago007 2011-04-25 16:35 930
    // Get the max ascent
925b7e58 sago007 2011-04-25 16:35 931
    int x = charPos[num];
925b7e58 sago007 2011-04-25 16:35 932
    int i, j = 1, result = 0;
925b7e58 sago007 2011-04-25 16:35 933
    Uint32 pixel = getPixel(src, 0, src->h - 1); // bg pixel
925b7e58 sago007 2011-04-25 16:35 934
    while(j < baseline && j < src->h)
925b7e58 sago007 2011-04-25 16:35 935
    {
925b7e58 sago007 2011-04-25 16:35 936
        i = charPos[num];
925b7e58 sago007 2011-04-25 16:35 937
        while(i < x + charWidth[num])
925b7e58 sago007 2011-04-25 16:35 938
        {
925b7e58 sago007 2011-04-25 16:35 939
            if(getPixel(src, i, j) != pixel)
925b7e58 sago007 2011-04-25 16:35 940
            {
925b7e58 sago007 2011-04-25 16:35 941
                result = baseline - j;
925b7e58 sago007 2011-04-25 16:35 942
                j = src->h;
925b7e58 sago007 2011-04-25 16:35 943
                break;
925b7e58 sago007 2011-04-25 16:35 944
            }
925b7e58 sago007 2011-04-25 16:35 945
            i++;
925b7e58 sago007 2011-04-25 16:35 946
        }
925b7e58 sago007 2011-04-25 16:35 947
        j++;
925b7e58 sago007 2011-04-25 16:35 948
    }
925b7e58 sago007 2011-04-25 16:35 949
    return result;
925b7e58 sago007 2011-04-25 16:35 950
}
925b7e58 sago007 2011-04-25 16:35 951
925b7e58 sago007 2011-04-25 16:35 952
int NFont::getAscent(const char* formatted_text, ...) const
925b7e58 sago007 2011-04-25 16:35 953
{
925b7e58 sago007 2011-04-25 16:35 954
    if(formatted_text == NULL)
925b7e58 sago007 2011-04-25 16:35 955
        return ascent;
925b7e58 sago007 2011-04-25 16:35 956
    
925b7e58 sago007 2011-04-25 16:35 957
    va_list lst;
925b7e58 sago007 2011-04-25 16:35 958
    va_start(lst, formatted_text);
925b7e58 sago007 2011-04-25 16:35 959
    vsprintf(buffer, formatted_text, lst);
925b7e58 sago007 2011-04-25 16:35 960
    va_end(lst);
925b7e58 sago007 2011-04-25 16:35 961
    
925b7e58 sago007 2011-04-25 16:35 962
    int max = 0;
925b7e58 sago007 2011-04-25 16:35 963
    const char* c = buffer;
925b7e58 sago007 2011-04-25 16:35 964
    
925b7e58 sago007 2011-04-25 16:35 965
    for (; *c != '\0'; c++)
925b7e58 sago007 2011-04-25 16:35 966
    {
925b7e58 sago007 2011-04-25 16:35 967
        int asc = getAscent(*c);
925b7e58 sago007 2011-04-25 16:35 968
        if(asc > max)
925b7e58 sago007 2011-04-25 16:35 969
            max = asc;
925b7e58 sago007 2011-04-25 16:35 970
    }
925b7e58 sago007 2011-04-25 16:35 971
    return max;
925b7e58 sago007 2011-04-25 16:35 972
}
925b7e58 sago007 2011-04-25 16:35 973
925b7e58 sago007 2011-04-25 16:35 974
int NFont::getDescent(const char character) const
925b7e58 sago007 2011-04-25 16:35 975
{
925b7e58 sago007 2011-04-25 16:35 976
    unsigned char test = (unsigned char)character;
925b7e58 sago007 2011-04-25 16:35 977
    if(test < 33 || test > 222 || (test > 126 && test < 161))
925b7e58 sago007 2011-04-25 16:35 978
        return 0;
925b7e58 sago007 2011-04-25 16:35 979
    unsigned char num = (unsigned char)character - 33;
925b7e58 sago007 2011-04-25 16:35 980
    // Get the max descent
925b7e58 sago007 2011-04-25 16:35 981
    int x = charPos[num];
925b7e58 sago007 2011-04-25 16:35 982
    int i, j = src->h - 1, result = 0;
925b7e58 sago007 2011-04-25 16:35 983
    Uint32 pixel = getPixel(src, 0, src->h - 1); // bg pixel
925b7e58 sago007 2011-04-25 16:35 984
    while(j > 0 && j > baseline)
925b7e58 sago007 2011-04-25 16:35 985
    {
925b7e58 sago007 2011-04-25 16:35 986
        i = charPos[num];
925b7e58 sago007 2011-04-25 16:35 987
        while(i < x + charWidth[num])
925b7e58 sago007 2011-04-25 16:35 988
        {
925b7e58 sago007 2011-04-25 16:35 989
            if(getPixel(src, i, j) != pixel)
925b7e58 sago007 2011-04-25 16:35 990
            {
925b7e58 sago007 2011-04-25 16:35 991
                result = j - baseline;
925b7e58 sago007 2011-04-25 16:35 992
                j = 0;
925b7e58 sago007 2011-04-25 16:35 993
                break;
925b7e58 sago007 2011-04-25 16:35 994
            }
925b7e58 sago007 2011-04-25 16:35 995
            i++;
925b7e58 sago007 2011-04-25 16:35 996
        }
925b7e58 sago007 2011-04-25 16:35 997
        j--;
925b7e58 sago007 2011-04-25 16:35 998
    }
925b7e58 sago007 2011-04-25 16:35 999
    return result;
925b7e58 sago007 2011-04-25 16:35 1000
}
925b7e58 sago007 2011-04-25 16:35 1001
925b7e58 sago007 2011-04-25 16:35 1002
int NFont::getDescent(const char* formatted_text, ...) const
925b7e58 sago007 2011-04-25 16:35 1003
{
925b7e58 sago007 2011-04-25 16:35 1004
    if(formatted_text == NULL)
925b7e58 sago007 2011-04-25 16:35 1005
        return descent;
925b7e58 sago007 2011-04-25 16:35 1006
    
925b7e58 sago007 2011-04-25 16:35 1007
    va_list lst;
925b7e58 sago007 2011-04-25 16:35 1008
    va_start(lst, formatted_text);
925b7e58 sago007 2011-04-25 16:35 1009
    vsprintf(buffer, formatted_text, lst);
925b7e58 sago007 2011-04-25 16:35 1010
    va_end(lst);
925b7e58 sago007 2011-04-25 16:35 1011
    
925b7e58 sago007 2011-04-25 16:35 1012
    int max = 0;
925b7e58 sago007 2011-04-25 16:35 1013
    const char* c = buffer;
925b7e58 sago007 2011-04-25 16:35 1014
    
925b7e58 sago007 2011-04-25 16:35 1015
    for (; *c != '\0'; c++)
925b7e58 sago007 2011-04-25 16:35 1016
    {
925b7e58 sago007 2011-04-25 16:35 1017
        int des = getDescent(*c);
925b7e58 sago007 2011-04-25 16:35 1018
        if(des > max)
925b7e58 sago007 2011-04-25 16:35 1019
            max = des;
925b7e58 sago007 2011-04-25 16:35 1020
    }
925b7e58 sago007 2011-04-25 16:35 1021
    return max;
925b7e58 sago007 2011-04-25 16:35 1022
}
925b7e58 sago007 2011-04-25 16:35 1023
925b7e58 sago007 2011-04-25 16:35 1024
int NFont::getSpacing() const
925b7e58 sago007 2011-04-25 16:35 1025
{
925b7e58 sago007 2011-04-25 16:35 1026
    return letterSpacing;
925b7e58 sago007 2011-04-25 16:35 1027
}
925b7e58 sago007 2011-04-25 16:35 1028
925b7e58 sago007 2011-04-25 16:35 1029
int NFont::getLineSpacing() const
925b7e58 sago007 2011-04-25 16:35 1030
{
925b7e58 sago007 2011-04-25 16:35 1031
    return lineSpacing;
925b7e58 sago007 2011-04-25 16:35 1032
}
925b7e58 sago007 2011-04-25 16:35 1033
925b7e58 sago007 2011-04-25 16:35 1034
int NFont::getBaseline() const
925b7e58 sago007 2011-04-25 16:35 1035
{
925b7e58 sago007 2011-04-25 16:35 1036
    return baseline;
925b7e58 sago007 2011-04-25 16:35 1037
}
925b7e58 sago007 2011-04-25 16:35 1038
925b7e58 sago007 2011-04-25 16:35 1039
int NFont::getMaxWidth() const
925b7e58 sago007 2011-04-25 16:35 1040
{
925b7e58 sago007 2011-04-25 16:35 1041
    return maxWidth;
925b7e58 sago007 2011-04-25 16:35 1042
}
925b7e58 sago007 2011-04-25 16:35 1043
925b7e58 sago007 2011-04-25 16:35 1044
925b7e58 sago007 2011-04-25 16:35 1045
925b7e58 sago007 2011-04-25 16:35 1046
925b7e58 sago007 2011-04-25 16:35 1047
925b7e58 sago007 2011-04-25 16:35 1048
// Setters
925b7e58 sago007 2011-04-25 16:35 1049
void NFont::setSpacing(int LetterSpacing)
925b7e58 sago007 2011-04-25 16:35 1050
{
925b7e58 sago007 2011-04-25 16:35 1051
    letterSpacing = LetterSpacing;
925b7e58 sago007 2011-04-25 16:35 1052
}
925b7e58 sago007 2011-04-25 16:35 1053
925b7e58 sago007 2011-04-25 16:35 1054
void NFont::setLineSpacing(int LineSpacing)
925b7e58 sago007 2011-04-25 16:35 1055
{
925b7e58 sago007 2011-04-25 16:35 1056
    lineSpacing = LineSpacing;
925b7e58 sago007 2011-04-25 16:35 1057
}
925b7e58 sago007 2011-04-25 16:35 1058
925b7e58 sago007 2011-04-25 16:35 1059
void NFont::setDest(SDL_Surface* Dest)
925b7e58 sago007 2011-04-25 16:35 1060
{
925b7e58 sago007 2011-04-25 16:35 1061
    dest = Dest;
925b7e58 sago007 2011-04-25 16:35 1062
}
925b7e58 sago007 2011-04-25 16:35 1063
925b7e58 sago007 2011-04-25 16:35 1064
int NFont::setBaseline(int Baseline)
925b7e58 sago007 2011-04-25 16:35 1065
{
925b7e58 sago007 2011-04-25 16:35 1066
    if(Baseline >= 0)
925b7e58 sago007 2011-04-25 16:35 1067
        baseline = Baseline;
925b7e58 sago007 2011-04-25 16:35 1068
    else
925b7e58 sago007 2011-04-25 16:35 1069
    {
925b7e58 sago007 2011-04-25 16:35 1070
        // Get the baseline by checking a, b, and c and averaging their lowest y-value.
925b7e58 sago007 2011-04-25 16:35 1071
        // Is there a better way?
925b7e58 sago007 2011-04-25 16:35 1072
        Uint32 pixel = getPixel(src, 0, src->h - 1);
925b7e58 sago007 2011-04-25 16:35 1073
        int heightSum = 0;
925b7e58 sago007 2011-04-25 16:35 1074
        int x, i, j;
925b7e58 sago007 2011-04-25 16:35 1075
        for(unsigned char avgChar = 64; avgChar < 67; avgChar++)
925b7e58 sago007 2011-04-25 16:35 1076
        {
925b7e58 sago007 2011-04-25 16:35 1077
            x = charPos[avgChar];
925b7e58 sago007 2011-04-25 16:35 1078
            
925b7e58 sago007 2011-04-25 16:35 1079
            j = src->h - 1;
925b7e58 sago007 2011-04-25 16:35 1080
            while(j > 0)
925b7e58 sago007 2011-04-25 16:35 1081
            {
925b7e58 sago007 2011-04-25 16:35 1082
                i = x;
925b7e58 sago007 2011-04-25 16:35 1083
                while(i - x < charWidth[64])
925b7e58 sago007 2011-04-25 16:35 1084
                {
925b7e58 sago007 2011-04-25 16:35 1085
                    if(getPixel(src, i, j) != pixel)
925b7e58 sago007 2011-04-25 16:35 1086
                    {
925b7e58 sago007 2011-04-25 16:35 1087
                        heightSum += j;
925b7e58 sago007 2011-04-25 16:35 1088
                        j = 0;
925b7e58 sago007 2011-04-25 16:35 1089
                        break;
925b7e58 sago007 2011-04-25 16:35 1090
                    }
925b7e58 sago007 2011-04-25 16:35 1091
                    i++;
925b7e58 sago007 2011-04-25 16:35 1092
                }
925b7e58 sago007 2011-04-25 16:35 1093
                j--;
925b7e58 sago007 2011-04-25 16:35 1094
            }
925b7e58 sago007 2011-04-25 16:35 1095
        }
925b7e58 sago007 2011-04-25 16:35 1096
        baseline = int(heightSum/3.0f + 0.5f);  // Round up and cast
925b7e58 sago007 2011-04-25 16:35 1097
    }
925b7e58 sago007 2011-04-25 16:35 1098
    return baseline;
925b7e58 sago007 2011-04-25 16:35 1099
}
925b7e58 sago007 2011-04-25 16:35 1100
925b7e58 sago007 2011-04-25 16:35 1101
925b7e58 sago007 2011-04-25 16:35 1102
925b7e58 sago007 2011-04-25 16:35 1103
925b7e58 sago007 2011-04-25 16:35 1104
925b7e58 sago007 2011-04-25 16:35 1105
925b7e58 sago007 2011-04-25 16:35 1106
1970-01-01 00:00 1107