git repos / blockattack-game

blame: source/code/Libs/NFont.cpp

normal view · raw

a133dbce sago007 2016-03-26 10:05 1
/*
34c3d60c sago007 2016-12-23 16:31 2
NFont: A font class for SDL and SDL_Renderer
a133dbce sago007 2016-03-26 10:05 3
by Jonathan Dearborn
34c3d60c sago007 2016-12-23 16:31 4
34c3d60c sago007 2016-12-23 16:31 5
See NFont.h for license info.
a133dbce sago007 2016-03-26 10:05 6
*/
a133dbce sago007 2016-03-26 10:05 7
a133dbce sago007 2016-03-26 10:05 8
#include "NFont.h"
a133dbce sago007 2016-03-26 10:05 9
#include "SDL_FontCache.h"
a133dbce sago007 2016-03-26 10:05 10
a133dbce sago007 2016-03-26 10:05 11
#include <cmath>
a133dbce sago007 2016-03-26 10:05 12
#include <cstdio>
a133dbce sago007 2016-03-26 10:05 13
#ifndef M_PI
a133dbce sago007 2016-03-26 10:05 14
    #define M_PI 3.14159265358979323846
a133dbce sago007 2016-03-26 10:05 15
#endif
a133dbce sago007 2016-03-26 10:05 16
a133dbce sago007 2016-03-26 10:05 17
#include <string>
a133dbce sago007 2016-03-26 10:05 18
#include <cstring>
a133dbce sago007 2016-03-26 10:05 19
#include <list>
a133dbce sago007 2016-03-26 10:05 20
using std::string;
a133dbce sago007 2016-03-26 10:05 21
using std::list;
a133dbce sago007 2016-03-26 10:05 22
a133dbce sago007 2016-03-26 10:05 23
#ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 24
#define NFont_Target GPU_Target
a133dbce sago007 2016-03-26 10:05 25
#define NFont_Image GPU_Image
a133dbce sago007 2016-03-26 10:05 26
#define NFont_Log GPU_LogError
a133dbce sago007 2016-03-26 10:05 27
#else
a133dbce sago007 2016-03-26 10:05 28
#define NFont_Target SDL_Renderer
a133dbce sago007 2016-03-26 10:05 29
#define NFont_Image SDL_Texture
a133dbce sago007 2016-03-26 10:05 30
#define NFont_Log SDL_Log
a133dbce sago007 2016-03-26 10:05 31
#endif
a133dbce sago007 2016-03-26 10:05 32
a133dbce sago007 2016-03-26 10:05 33
#define MIN(a,b) ((a) < (b)? (a) : (b))
34c3d60c sago007 2016-12-23 16:31 34
#define MAX(a,b) ((a) > (b)? (a) : (b))
34c3d60c sago007 2016-12-23 16:31 35
a133dbce sago007 2016-03-26 10:05 36
#define NFONT_BUFFER_SIZE 1024
a133dbce sago007 2016-03-26 10:05 37
a133dbce sago007 2016-03-26 10:05 38
// vsnprintf replacement adapted from Valentin Milea:
a133dbce sago007 2016-03-26 10:05 39
// http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010
a133dbce sago007 2016-03-26 10:05 40
#if defined(_MSC_VER) && _MSC_VER < 1900
a133dbce sago007 2016-03-26 10:05 41
a133dbce sago007 2016-03-26 10:05 42
#define vsnprintf c99_vsnprintf
a133dbce sago007 2016-03-26 10:05 43
a133dbce sago007 2016-03-26 10:05 44
static int c99_vsnprintf(char *outBuf, size_t size, const char *format, va_list ap)
a133dbce sago007 2016-03-26 10:05 45
{
a133dbce sago007 2016-03-26 10:05 46
    int count = -1;
a133dbce sago007 2016-03-26 10:05 47
a133dbce sago007 2016-03-26 10:05 48
    if (size != 0)
a133dbce sago007 2016-03-26 10:05 49
        count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap);
a133dbce sago007 2016-03-26 10:05 50
    if (count == -1)
a133dbce sago007 2016-03-26 10:05 51
        count = _vscprintf(format, ap);
a133dbce sago007 2016-03-26 10:05 52
a133dbce sago007 2016-03-26 10:05 53
    return count;
a133dbce sago007 2016-03-26 10:05 54
}
a133dbce sago007 2016-03-26 10:05 55
a133dbce sago007 2016-03-26 10:05 56
#endif
a133dbce sago007 2016-03-26 10:05 57
a133dbce sago007 2016-03-26 10:05 58
a133dbce sago007 2016-03-26 10:05 59
a133dbce sago007 2016-03-26 10:05 60
static inline SDL_Surface* createSurface24(Uint32 width, Uint32 height)
a133dbce sago007 2016-03-26 10:05 61
{
a133dbce sago007 2016-03-26 10:05 62
    #if SDL_BYTEORDER == SDL_BIG_ENDIAN
a133dbce sago007 2016-03-26 10:05 63
        return SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 24, 0xFF0000, 0x00FF00, 0x0000FF, 0);
a133dbce sago007 2016-03-26 10:05 64
    #else
a133dbce sago007 2016-03-26 10:05 65
        return SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 24, 0x0000FF, 0x00FF00, 0xFF0000, 0);
a133dbce sago007 2016-03-26 10:05 66
    #endif
a133dbce sago007 2016-03-26 10:05 67
}
a133dbce sago007 2016-03-26 10:05 68
a133dbce sago007 2016-03-26 10:05 69
static inline SDL_Surface* createSurface32(Uint32 width, Uint32 height)
a133dbce sago007 2016-03-26 10:05 70
{
a133dbce sago007 2016-03-26 10:05 71
    #if SDL_BYTEORDER == SDL_BIG_ENDIAN
a133dbce sago007 2016-03-26 10:05 72
        return SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 32, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF);
a133dbce sago007 2016-03-26 10:05 73
    #else
a133dbce sago007 2016-03-26 10:05 74
        return SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, 32, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000);
a133dbce sago007 2016-03-26 10:05 75
    #endif
a133dbce sago007 2016-03-26 10:05 76
}
a133dbce sago007 2016-03-26 10:05 77
a133dbce sago007 2016-03-26 10:05 78
static inline char* copyString(const char* c)
a133dbce sago007 2016-03-26 10:05 79
{
a133dbce sago007 2016-03-26 10:05 80
    if(c == NULL)
a133dbce sago007 2016-03-26 10:05 81
        return NULL;
a133dbce sago007 2016-03-26 10:05 82
a133dbce sago007 2016-03-26 10:05 83
    char* result = new char[strlen(c)+1];
a133dbce sago007 2016-03-26 10:05 84
    strcpy(result, c);
a133dbce sago007 2016-03-26 10:05 85
a133dbce sago007 2016-03-26 10:05 86
    return result;
a133dbce sago007 2016-03-26 10:05 87
}
a133dbce sago007 2016-03-26 10:05 88
a133dbce sago007 2016-03-26 10:05 89
static inline Uint32 getPixel(SDL_Surface *Surface, int x, int y)
a133dbce sago007 2016-03-26 10:05 90
{
a133dbce sago007 2016-03-26 10:05 91
    Uint8* bits;
a133dbce sago007 2016-03-26 10:05 92
    Uint32 bpp;
a133dbce sago007 2016-03-26 10:05 93
a133dbce sago007 2016-03-26 10:05 94
    if(x < 0 || x >= Surface->w)
a133dbce sago007 2016-03-26 10:05 95
        return 0;  // Best I could do for errors
a133dbce sago007 2016-03-26 10:05 96
a133dbce sago007 2016-03-26 10:05 97
    bpp = Surface->format->BytesPerPixel;
a133dbce sago007 2016-03-26 10:05 98
    bits = ((Uint8*)Surface->pixels) + y*Surface->pitch + x*bpp;
a133dbce sago007 2016-03-26 10:05 99
a133dbce sago007 2016-03-26 10:05 100
    switch (bpp)
a133dbce sago007 2016-03-26 10:05 101
    {
a133dbce sago007 2016-03-26 10:05 102
        case 1:
a133dbce sago007 2016-03-26 10:05 103
            return *((Uint8*)Surface->pixels + y * Surface->pitch + x);
a133dbce sago007 2016-03-26 10:05 104
            break;
a133dbce sago007 2016-03-26 10:05 105
        case 2:
a133dbce sago007 2016-03-26 10:05 106
            return *((Uint16*)Surface->pixels + y * Surface->pitch/2 + x);
a133dbce sago007 2016-03-26 10:05 107
            break;
a133dbce sago007 2016-03-26 10:05 108
        case 3:
a133dbce sago007 2016-03-26 10:05 109
            // Endian-correct, but slower
a133dbce sago007 2016-03-26 10:05 110
            Uint8 r, g, b;
a133dbce sago007 2016-03-26 10:05 111
            r = *((bits)+Surface->format->Rshift/8);
a133dbce sago007 2016-03-26 10:05 112
            g = *((bits)+Surface->format->Gshift/8);
a133dbce sago007 2016-03-26 10:05 113
            b = *((bits)+Surface->format->Bshift/8);
a133dbce sago007 2016-03-26 10:05 114
            return SDL_MapRGB(Surface->format, r, g, b);
a133dbce sago007 2016-03-26 10:05 115
            break;
a133dbce sago007 2016-03-26 10:05 116
        case 4:
a133dbce sago007 2016-03-26 10:05 117
            return *((Uint32*)Surface->pixels + y * Surface->pitch/4 + x);
a133dbce sago007 2016-03-26 10:05 118
            break;
a133dbce sago007 2016-03-26 10:05 119
    }
a133dbce sago007 2016-03-26 10:05 120
a133dbce sago007 2016-03-26 10:05 121
    return 0;  // FIXME: Handle errors better
a133dbce sago007 2016-03-26 10:05 122
}
a133dbce sago007 2016-03-26 10:05 123
a133dbce sago007 2016-03-26 10:05 124
static inline void setPixel(SDL_Surface* surface, int x, int y, Uint32 color)
a133dbce sago007 2016-03-26 10:05 125
{
a133dbce sago007 2016-03-26 10:05 126
    int bpp = surface->format->BytesPerPixel;
a133dbce sago007 2016-03-26 10:05 127
    Uint8* bits = ((Uint8 *)surface->pixels) + y*surface->pitch + x*bpp;
a133dbce sago007 2016-03-26 10:05 128
a133dbce sago007 2016-03-26 10:05 129
    /* Set the pixel */
a133dbce sago007 2016-03-26 10:05 130
    switch(bpp)
a133dbce sago007 2016-03-26 10:05 131
    {
a133dbce sago007 2016-03-26 10:05 132
        case 1:
a133dbce sago007 2016-03-26 10:05 133
            *((Uint8 *)(bits)) = (Uint8)color;
a133dbce sago007 2016-03-26 10:05 134
            break;
a133dbce sago007 2016-03-26 10:05 135
        case 2:
a133dbce sago007 2016-03-26 10:05 136
            *((Uint16 *)(bits)) = (Uint16)color;
a133dbce sago007 2016-03-26 10:05 137
            break;
a133dbce sago007 2016-03-26 10:05 138
        case 3: { /* Format/endian independent */
a133dbce sago007 2016-03-26 10:05 139
            Uint8 r,g,b;
a133dbce sago007 2016-03-26 10:05 140
            r = (color >> surface->format->Rshift) & 0xFF;
a133dbce sago007 2016-03-26 10:05 141
            g = (color >> surface->format->Gshift) & 0xFF;
a133dbce sago007 2016-03-26 10:05 142
            b = (color >> surface->format->Bshift) & 0xFF;
a133dbce sago007 2016-03-26 10:05 143
            *((bits)+surface->format->Rshift/8) = r;
a133dbce sago007 2016-03-26 10:05 144
            *((bits)+surface->format->Gshift/8) = g;
a133dbce sago007 2016-03-26 10:05 145
            *((bits)+surface->format->Bshift/8) = b;
a133dbce sago007 2016-03-26 10:05 146
            }
a133dbce sago007 2016-03-26 10:05 147
            break;
a133dbce sago007 2016-03-26 10:05 148
        case 4:
a133dbce sago007 2016-03-26 10:05 149
            *((Uint32 *)(bits)) = (Uint32)color;
a133dbce sago007 2016-03-26 10:05 150
            break;
a133dbce sago007 2016-03-26 10:05 151
    }
a133dbce sago007 2016-03-26 10:05 152
}
a133dbce sago007 2016-03-26 10:05 153
a133dbce sago007 2016-03-26 10:05 154
static inline void drawPixel(SDL_Surface *surface, Sint16 x, Sint16 y, Uint32 color, Uint8 alpha)
a133dbce sago007 2016-03-26 10:05 155
{
a133dbce sago007 2016-03-26 10:05 156
	if(x > surface->clip_rect.x + surface->clip_rect.w || x < surface->clip_rect.x || y > surface->clip_rect.y + surface->clip_rect.h || y < surface->clip_rect.y)
a133dbce sago007 2016-03-26 10:05 157
        return;
a133dbce sago007 2016-03-26 10:05 158
a133dbce sago007 2016-03-26 10:05 159
    switch (surface->format->BytesPerPixel)
a133dbce sago007 2016-03-26 10:05 160
    {
a133dbce sago007 2016-03-26 10:05 161
        case 1: { /* Assuming 8-bpp */
a133dbce sago007 2016-03-26 10:05 162
a133dbce sago007 2016-03-26 10:05 163
                Uint8 *pixel = (Uint8 *)surface->pixels + y*surface->pitch + x;
a133dbce sago007 2016-03-26 10:05 164
a133dbce sago007 2016-03-26 10:05 165
                Uint8 dR = surface->format->palette->colors[*pixel].r;
a133dbce sago007 2016-03-26 10:05 166
                Uint8 dG = surface->format->palette->colors[*pixel].g;
a133dbce sago007 2016-03-26 10:05 167
                Uint8 dB = surface->format->palette->colors[*pixel].b;
a133dbce sago007 2016-03-26 10:05 168
                Uint8 sR = surface->format->palette->colors[color].r;
a133dbce sago007 2016-03-26 10:05 169
                Uint8 sG = surface->format->palette->colors[color].g;
a133dbce sago007 2016-03-26 10:05 170
                Uint8 sB = surface->format->palette->colors[color].b;
a133dbce sago007 2016-03-26 10:05 171
a133dbce sago007 2016-03-26 10:05 172
                dR = dR + ((sR-dR)*alpha >> 8);
a133dbce sago007 2016-03-26 10:05 173
                dG = dG + ((sG-dG)*alpha >> 8);
a133dbce sago007 2016-03-26 10:05 174
                dB = dB + ((sB-dB)*alpha >> 8);
a133dbce sago007 2016-03-26 10:05 175
a133dbce sago007 2016-03-26 10:05 176
                *pixel = SDL_MapRGB(surface->format, dR, dG, dB);
a133dbce sago007 2016-03-26 10:05 177
a133dbce sago007 2016-03-26 10:05 178
        }
a133dbce sago007 2016-03-26 10:05 179
        break;
a133dbce sago007 2016-03-26 10:05 180
a133dbce sago007 2016-03-26 10:05 181
        case 2: { /* Probably 15-bpp or 16-bpp */
a133dbce sago007 2016-03-26 10:05 182
a133dbce sago007 2016-03-26 10:05 183
                Uint32 Rmask = surface->format->Rmask, Gmask = surface->format->Gmask, Bmask = surface->format->Bmask, Amask = surface->format->Amask;
a133dbce sago007 2016-03-26 10:05 184
                Uint16 *pixel = (Uint16 *)surface->pixels + y*surface->pitch/2 + x;
a133dbce sago007 2016-03-26 10:05 185
                Uint32 dc = *pixel;
a133dbce sago007 2016-03-26 10:05 186
                Uint32 R,G,B,A=0;
a133dbce sago007 2016-03-26 10:05 187
a133dbce sago007 2016-03-26 10:05 188
                R = ((dc & Rmask) + (( (color & Rmask) - (dc & Rmask) ) * alpha >> 8)) & Rmask;
a133dbce sago007 2016-03-26 10:05 189
                G = ((dc & Gmask) + (( (color & Gmask) - (dc & Gmask) ) * alpha >> 8)) & Gmask;
a133dbce sago007 2016-03-26 10:05 190
                B = ((dc & Bmask) + (( (color & Bmask) - (dc & Bmask) ) * alpha >> 8)) & Bmask;
a133dbce sago007 2016-03-26 10:05 191
                if( Amask )
a133dbce sago007 2016-03-26 10:05 192
                    A = ((dc & Amask) + (( (color & Amask) - (dc & Amask) ) * alpha >> 8)) & Amask;
a133dbce sago007 2016-03-26 10:05 193
a133dbce sago007 2016-03-26 10:05 194
                *pixel= R | G | B | A;
a133dbce sago007 2016-03-26 10:05 195
a133dbce sago007 2016-03-26 10:05 196
        }
a133dbce sago007 2016-03-26 10:05 197
        break;
a133dbce sago007 2016-03-26 10:05 198
a133dbce sago007 2016-03-26 10:05 199
        case 3: { /* Slow 24-bpp mode, usually not used */
a133dbce sago007 2016-03-26 10:05 200
            Uint8 *pix = (Uint8 *)surface->pixels + y * surface->pitch + x*3;
a133dbce sago007 2016-03-26 10:05 201
            Uint8 rshift8=surface->format->Rshift/8;
a133dbce sago007 2016-03-26 10:05 202
            Uint8 gshift8=surface->format->Gshift/8;
a133dbce sago007 2016-03-26 10:05 203
            Uint8 bshift8=surface->format->Bshift/8;
a133dbce sago007 2016-03-26 10:05 204
            Uint8 ashift8=surface->format->Ashift/8;
a133dbce sago007 2016-03-26 10:05 205
a133dbce sago007 2016-03-26 10:05 206
a133dbce sago007 2016-03-26 10:05 207
a133dbce sago007 2016-03-26 10:05 208
                Uint8 dR, dG, dB, dA;
a133dbce sago007 2016-03-26 10:05 209
                Uint8 sR, sG, sB, sA;
a133dbce sago007 2016-03-26 10:05 210
a133dbce sago007 2016-03-26 10:05 211
                pix = (Uint8 *)surface->pixels + y * surface->pitch + x*3;
a133dbce sago007 2016-03-26 10:05 212
a133dbce sago007 2016-03-26 10:05 213
                dR = *((pix)+rshift8);
a133dbce sago007 2016-03-26 10:05 214
                dG = *((pix)+gshift8);
a133dbce sago007 2016-03-26 10:05 215
                dB = *((pix)+bshift8);
a133dbce sago007 2016-03-26 10:05 216
                dA = *((pix)+ashift8);
a133dbce sago007 2016-03-26 10:05 217
a133dbce sago007 2016-03-26 10:05 218
                sR = (color>>surface->format->Rshift)&0xff;
a133dbce sago007 2016-03-26 10:05 219
                sG = (color>>surface->format->Gshift)&0xff;
a133dbce sago007 2016-03-26 10:05 220
                sB = (color>>surface->format->Bshift)&0xff;
a133dbce sago007 2016-03-26 10:05 221
                sA = (color>>surface->format->Ashift)&0xff;
a133dbce sago007 2016-03-26 10:05 222
a133dbce sago007 2016-03-26 10:05 223
                dR = dR + ((sR-dR)*alpha >> 8);
a133dbce sago007 2016-03-26 10:05 224
                dG = dG + ((sG-dG)*alpha >> 8);
a133dbce sago007 2016-03-26 10:05 225
                dB = dB + ((sB-dB)*alpha >> 8);
a133dbce sago007 2016-03-26 10:05 226
                dA = dA + ((sA-dA)*alpha >> 8);
a133dbce sago007 2016-03-26 10:05 227
a133dbce sago007 2016-03-26 10:05 228
                *((pix)+rshift8) = dR;
a133dbce sago007 2016-03-26 10:05 229
                *((pix)+gshift8) = dG;
a133dbce sago007 2016-03-26 10:05 230
                *((pix)+bshift8) = dB;
a133dbce sago007 2016-03-26 10:05 231
                *((pix)+ashift8) = dA;
a133dbce sago007 2016-03-26 10:05 232
a133dbce sago007 2016-03-26 10:05 233
        }
a133dbce sago007 2016-03-26 10:05 234
        break;
a133dbce sago007 2016-03-26 10:05 235
a133dbce sago007 2016-03-26 10:05 236
        case 4: { /* Probably 32-bpp */
a133dbce sago007 2016-03-26 10:05 237
            Uint32 Rmask = surface->format->Rmask, Gmask = surface->format->Gmask, Bmask = surface->format->Bmask, Amask = surface->format->Amask;
a133dbce sago007 2016-03-26 10:05 238
            Uint32* pixel = (Uint32*)surface->pixels + y*surface->pitch/4 + x;
a133dbce sago007 2016-03-26 10:05 239
            Uint32 source = *pixel;
a133dbce sago007 2016-03-26 10:05 240
            Uint32 R,G,B,A;
a133dbce sago007 2016-03-26 10:05 241
            R = color & Rmask;
a133dbce sago007 2016-03-26 10:05 242
            G = color & Gmask;
a133dbce sago007 2016-03-26 10:05 243
            B = color & Bmask;
a133dbce sago007 2016-03-26 10:05 244
            A = 0;  // keep this as 0 to avoid corruption of non-alpha surfaces
a133dbce sago007 2016-03-26 10:05 245
a133dbce sago007 2016-03-26 10:05 246
            // Blend and keep dest alpha
a133dbce sago007 2016-03-26 10:05 247
            if( alpha != SDL_ALPHA_OPAQUE ){
a133dbce sago007 2016-03-26 10:05 248
                R = ((source & Rmask) + (( R - (source & Rmask) ) * alpha >> 8)) & Rmask;
a133dbce sago007 2016-03-26 10:05 249
                G = ((source & Gmask) + (( G - (source & Gmask) ) * alpha >> 8)) & Gmask;
a133dbce sago007 2016-03-26 10:05 250
                B = ((source & Bmask) + (( B - (source & Bmask) ) * alpha >> 8)) & Bmask;
a133dbce sago007 2016-03-26 10:05 251
            }
a133dbce sago007 2016-03-26 10:05 252
            if(Amask)
a133dbce sago007 2016-03-26 10:05 253
                A = (source & Amask);
a133dbce sago007 2016-03-26 10:05 254
a133dbce sago007 2016-03-26 10:05 255
            *pixel = R | G | B | A;
a133dbce sago007 2016-03-26 10:05 256
        }
a133dbce sago007 2016-03-26 10:05 257
        break;
a133dbce sago007 2016-03-26 10:05 258
    }
a133dbce sago007 2016-03-26 10:05 259
}
a133dbce sago007 2016-03-26 10:05 260
a133dbce sago007 2016-03-26 10:05 261
static inline NFont::Rectf rectUnion(const NFont::Rectf& A, const NFont::Rectf& B)
a133dbce sago007 2016-03-26 10:05 262
{
a133dbce sago007 2016-03-26 10:05 263
    float x,x2,y,y2;
a133dbce sago007 2016-03-26 10:05 264
    x = MIN(A.x, B.x);
a133dbce sago007 2016-03-26 10:05 265
    y = MIN(A.y, B.y);
a133dbce sago007 2016-03-26 10:05 266
    x2 = MAX(A.x+A.w, B.x+B.w);
a133dbce sago007 2016-03-26 10:05 267
    y2 = MAX(A.y+A.h, B.y+B.h);
a133dbce sago007 2016-03-26 10:05 268
    NFont::Rectf result(x, y, MAX(0, x2 - x), MAX(0, y2 - y));
a133dbce sago007 2016-03-26 10:05 269
    return result;
a133dbce sago007 2016-03-26 10:05 270
}
a133dbce sago007 2016-03-26 10:05 271
a133dbce sago007 2016-03-26 10:05 272
// Adapted from SDL_IntersectRect
a133dbce sago007 2016-03-26 10:05 273
static inline NFont::Rectf rectIntersect(const NFont::Rectf& A, const NFont::Rectf& B)
a133dbce sago007 2016-03-26 10:05 274
{
a133dbce sago007 2016-03-26 10:05 275
    NFont::Rectf result;
a133dbce sago007 2016-03-26 10:05 276
	float Amin, Amax, Bmin, Bmax;
a133dbce sago007 2016-03-26 10:05 277
a133dbce sago007 2016-03-26 10:05 278
	// Horizontal intersection
a133dbce sago007 2016-03-26 10:05 279
	Amin = A.x;
a133dbce sago007 2016-03-26 10:05 280
	Amax = Amin + A.w;
a133dbce sago007 2016-03-26 10:05 281
	Bmin = B.x;
a133dbce sago007 2016-03-26 10:05 282
	Bmax = Bmin + B.w;
a133dbce sago007 2016-03-26 10:05 283
	if(Bmin > Amin)
a133dbce sago007 2016-03-26 10:05 284
	        Amin = Bmin;
a133dbce sago007 2016-03-26 10:05 285
	result.x = Amin;
a133dbce sago007 2016-03-26 10:05 286
	if(Bmax < Amax)
a133dbce sago007 2016-03-26 10:05 287
	        Amax = Bmax;
a133dbce sago007 2016-03-26 10:05 288
	result.w = Amax - Amin > 0 ? Amax - Amin : 0;
a133dbce sago007 2016-03-26 10:05 289
a133dbce sago007 2016-03-26 10:05 290
	// Vertical intersection
a133dbce sago007 2016-03-26 10:05 291
	Amin = A.y;
a133dbce sago007 2016-03-26 10:05 292
	Amax = Amin + A.h;
a133dbce sago007 2016-03-26 10:05 293
	Bmin = B.y;
a133dbce sago007 2016-03-26 10:05 294
	Bmax = Bmin + B.h;
a133dbce sago007 2016-03-26 10:05 295
	if(Bmin > Amin)
a133dbce sago007 2016-03-26 10:05 296
	        Amin = Bmin;
a133dbce sago007 2016-03-26 10:05 297
	result.y = Amin;
a133dbce sago007 2016-03-26 10:05 298
	if(Bmax < Amax)
a133dbce sago007 2016-03-26 10:05 299
	        Amax = Bmax;
a133dbce sago007 2016-03-26 10:05 300
	result.h = Amax - Amin > 0 ? Amax - Amin : 0;
a133dbce sago007 2016-03-26 10:05 301
a133dbce sago007 2016-03-26 10:05 302
	return result;
a133dbce sago007 2016-03-26 10:05 303
}
a133dbce sago007 2016-03-26 10:05 304
a133dbce sago007 2016-03-26 10:05 305
static inline SDL_Surface* copySurface(SDL_Surface *Surface)
a133dbce sago007 2016-03-26 10:05 306
{
a133dbce sago007 2016-03-26 10:05 307
    return SDL_ConvertSurface(Surface, Surface->format, Surface->flags);
a133dbce sago007 2016-03-26 10:05 308
}
a133dbce sago007 2016-03-26 10:05 309
a133dbce sago007 2016-03-26 10:05 310
a133dbce sago007 2016-03-26 10:05 311
a133dbce sago007 2016-03-26 10:05 312
a133dbce sago007 2016-03-26 10:05 313
a133dbce sago007 2016-03-26 10:05 314
a133dbce sago007 2016-03-26 10:05 315
a133dbce sago007 2016-03-26 10:05 316
a133dbce sago007 2016-03-26 10:05 317
a133dbce sago007 2016-03-26 10:05 318
NFont::Color::Color()
a133dbce sago007 2016-03-26 10:05 319
    : r(0), g(0), b(0), a(255)
a133dbce sago007 2016-03-26 10:05 320
{}
a133dbce sago007 2016-03-26 10:05 321
NFont::Color::Color(Uint8 r, Uint8 g, Uint8 b)
a133dbce sago007 2016-03-26 10:05 322
    : r(r), g(g), b(b), a(255)
a133dbce sago007 2016-03-26 10:05 323
{}
a133dbce sago007 2016-03-26 10:05 324
NFont::Color::Color(Uint8 r, Uint8 g, Uint8 b, Uint8 a)
a133dbce sago007 2016-03-26 10:05 325
    : r(r), g(g), b(b), a(a)
a133dbce sago007 2016-03-26 10:05 326
{}
a133dbce sago007 2016-03-26 10:05 327
NFont::Color::Color(const SDL_Color& color)
a133dbce sago007 2016-03-26 10:05 328
    : r(color.r), g(color.g), b(color.b), a(color.a)
a133dbce sago007 2016-03-26 10:05 329
{}
a133dbce sago007 2016-03-26 10:05 330
a133dbce sago007 2016-03-26 10:05 331
NFont::Color& NFont::Color::rgb(Uint8 R, Uint8 G, Uint8 B)
a133dbce sago007 2016-03-26 10:05 332
{
a133dbce sago007 2016-03-26 10:05 333
    r = R;
a133dbce sago007 2016-03-26 10:05 334
    g = G;
a133dbce sago007 2016-03-26 10:05 335
    b = B;
a133dbce sago007 2016-03-26 10:05 336
a133dbce sago007 2016-03-26 10:05 337
    return *this;
a133dbce sago007 2016-03-26 10:05 338
}
a133dbce sago007 2016-03-26 10:05 339
a133dbce sago007 2016-03-26 10:05 340
NFont::Color& NFont::Color::rgba(Uint8 R, Uint8 G, Uint8 B, Uint8 A)
a133dbce sago007 2016-03-26 10:05 341
{
a133dbce sago007 2016-03-26 10:05 342
    r = R;
a133dbce sago007 2016-03-26 10:05 343
    g = G;
a133dbce sago007 2016-03-26 10:05 344
    b = B;
a133dbce sago007 2016-03-26 10:05 345
    a = A;
a133dbce sago007 2016-03-26 10:05 346
a133dbce sago007 2016-03-26 10:05 347
    return *this;
a133dbce sago007 2016-03-26 10:05 348
}
a133dbce sago007 2016-03-26 10:05 349
a133dbce sago007 2016-03-26 10:05 350
NFont::Color& NFont::Color::color(const SDL_Color& color)
a133dbce sago007 2016-03-26 10:05 351
{
a133dbce sago007 2016-03-26 10:05 352
    r = color.r;
a133dbce sago007 2016-03-26 10:05 353
    g = color.g;
a133dbce sago007 2016-03-26 10:05 354
    b = color.b;
a133dbce sago007 2016-03-26 10:05 355
    a = color.a;
a133dbce sago007 2016-03-26 10:05 356
a133dbce sago007 2016-03-26 10:05 357
    return *this;
a133dbce sago007 2016-03-26 10:05 358
}
a133dbce sago007 2016-03-26 10:05 359
a133dbce sago007 2016-03-26 10:05 360
SDL_Color NFont::Color::to_SDL_Color() const
a133dbce sago007 2016-03-26 10:05 361
{
a133dbce sago007 2016-03-26 10:05 362
    SDL_Color c = {r, g, b, a};
a133dbce sago007 2016-03-26 10:05 363
    return c;
a133dbce sago007 2016-03-26 10:05 364
}
a133dbce sago007 2016-03-26 10:05 365
a133dbce sago007 2016-03-26 10:05 366
a133dbce sago007 2016-03-26 10:05 367
a133dbce sago007 2016-03-26 10:05 368
a133dbce sago007 2016-03-26 10:05 369
NFont::Rectf::Rectf()
a133dbce sago007 2016-03-26 10:05 370
    : x(0), y(0), w(0), h(0)
a133dbce sago007 2016-03-26 10:05 371
{}
a133dbce sago007 2016-03-26 10:05 372
a133dbce sago007 2016-03-26 10:05 373
NFont::Rectf::Rectf(float x, float y)
a133dbce sago007 2016-03-26 10:05 374
    : x(x), y(y), w(0), h(0)
a133dbce sago007 2016-03-26 10:05 375
{}
a133dbce sago007 2016-03-26 10:05 376
a133dbce sago007 2016-03-26 10:05 377
NFont::Rectf::Rectf(float x, float y, float w, float h)
a133dbce sago007 2016-03-26 10:05 378
    : x(x), y(y), w(w), h(h)
a133dbce sago007 2016-03-26 10:05 379
{}
a133dbce sago007 2016-03-26 10:05 380
a133dbce sago007 2016-03-26 10:05 381
NFont::Rectf::Rectf(const SDL_Rect& rect)
a133dbce sago007 2016-03-26 10:05 382
    : x(rect.x), y(rect.y), w(rect.w), h(rect.h)
a133dbce sago007 2016-03-26 10:05 383
{}
a133dbce sago007 2016-03-26 10:05 384
a133dbce sago007 2016-03-26 10:05 385
#ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 386
NFont::Rectf::Rectf(const GPU_Rect& rect)
a133dbce sago007 2016-03-26 10:05 387
    : x(rect.x), y(rect.y), w(rect.w), h(rect.h)
a133dbce sago007 2016-03-26 10:05 388
{}
a133dbce sago007 2016-03-26 10:05 389
#endif
a133dbce sago007 2016-03-26 10:05 390
a133dbce sago007 2016-03-26 10:05 391
SDL_Rect NFont::Rectf::to_SDL_Rect() const
a133dbce sago007 2016-03-26 10:05 392
{
a133dbce sago007 2016-03-26 10:05 393
    SDL_Rect r = {int(x), int(y), int(w), int(h)};
a133dbce sago007 2016-03-26 10:05 394
    return r;
a133dbce sago007 2016-03-26 10:05 395
}
a133dbce sago007 2016-03-26 10:05 396
a133dbce sago007 2016-03-26 10:05 397
#ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 398
GPU_Rect NFont::Rectf::to_GPU_Rect() const
a133dbce sago007 2016-03-26 10:05 399
{
a133dbce sago007 2016-03-26 10:05 400
    return GPU_MakeRect(x, y, w, h);
a133dbce sago007 2016-03-26 10:05 401
}
a133dbce sago007 2016-03-26 10:05 402
#endif
a133dbce sago007 2016-03-26 10:05 403
a133dbce sago007 2016-03-26 10:05 404
a133dbce sago007 2016-03-26 10:05 405
a133dbce sago007 2016-03-26 10:05 406
a133dbce sago007 2016-03-26 10:05 407
a133dbce sago007 2016-03-26 10:05 408
a133dbce sago007 2016-03-26 10:05 409
a133dbce sago007 2016-03-26 10:05 410
char* NFont::buffer = NULL;  // Shared buffer for efficient drawing
a133dbce sago007 2016-03-26 10:05 411
a133dbce sago007 2016-03-26 10:05 412
a133dbce sago007 2016-03-26 10:05 413
// Constructors
a133dbce sago007 2016-03-26 10:05 414
NFont::NFont()
a133dbce sago007 2016-03-26 10:05 415
{
a133dbce sago007 2016-03-26 10:05 416
    init();
a133dbce sago007 2016-03-26 10:05 417
}
a133dbce sago007 2016-03-26 10:05 418
34c3d60c sago007 2016-12-23 16:31 419
NFont::NFont(const NFont& font)
34c3d60c sago007 2016-12-23 16:31 420
{
34c3d60c sago007 2016-12-23 16:31 421
    init();
34c3d60c sago007 2016-12-23 16:31 422
    // FIXME: Duplicate font data
34c3d60c sago007 2016-12-23 16:31 423
}
34c3d60c sago007 2016-12-23 16:31 424
a133dbce sago007 2016-03-26 10:05 425
#ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 426
NFont::NFont(TTF_Font* ttf)
a133dbce sago007 2016-03-26 10:05 427
{
a133dbce sago007 2016-03-26 10:05 428
    init();
a133dbce sago007 2016-03-26 10:05 429
    load(ttf, FC_GetDefaultColor(font));
a133dbce sago007 2016-03-26 10:05 430
}
a133dbce sago007 2016-03-26 10:05 431
NFont::NFont(TTF_Font* ttf, const NFont::Color& color)
a133dbce sago007 2016-03-26 10:05 432
{
a133dbce sago007 2016-03-26 10:05 433
    init();
a133dbce sago007 2016-03-26 10:05 434
    load(ttf, color);
a133dbce sago007 2016-03-26 10:05 435
}
a133dbce sago007 2016-03-26 10:05 436
NFont::NFont(const char* filename_ttf, Uint32 pointSize)
a133dbce sago007 2016-03-26 10:05 437
{
a133dbce sago007 2016-03-26 10:05 438
    init();
a133dbce sago007 2016-03-26 10:05 439
    load(filename_ttf, pointSize);
a133dbce sago007 2016-03-26 10:05 440
}
a133dbce sago007 2016-03-26 10:05 441
NFont::NFont(const char* filename_ttf, Uint32 pointSize, const NFont::Color& color, int style)
a133dbce sago007 2016-03-26 10:05 442
{
a133dbce sago007 2016-03-26 10:05 443
    init();
a133dbce sago007 2016-03-26 10:05 444
    load(filename_ttf, pointSize, color, style);
a133dbce sago007 2016-03-26 10:05 445
}
a133dbce sago007 2016-03-26 10:05 446
NFont::NFont(SDL_RWops* file_rwops_ttf, Uint8 own_rwops, Uint32 pointSize, const NFont::Color& color, int style)
a133dbce sago007 2016-03-26 10:05 447
{
a133dbce sago007 2016-03-26 10:05 448
    init();
a133dbce sago007 2016-03-26 10:05 449
    load(file_rwops_ttf, own_rwops, pointSize, color, style);
a133dbce sago007 2016-03-26 10:05 450
}
a133dbce sago007 2016-03-26 10:05 451
a133dbce sago007 2016-03-26 10:05 452
#else
a133dbce sago007 2016-03-26 10:05 453
a133dbce sago007 2016-03-26 10:05 454
NFont::NFont(NFont_Target* renderer, TTF_Font* ttf)
a133dbce sago007 2016-03-26 10:05 455
{
a133dbce sago007 2016-03-26 10:05 456
    init();
a133dbce sago007 2016-03-26 10:05 457
    load(renderer, ttf, FC_GetDefaultColor(font));
a133dbce sago007 2016-03-26 10:05 458
}
a133dbce sago007 2016-03-26 10:05 459
NFont::NFont(NFont_Target* renderer, TTF_Font* ttf, const NFont::Color& color)
a133dbce sago007 2016-03-26 10:05 460
{
a133dbce sago007 2016-03-26 10:05 461
    init();
a133dbce sago007 2016-03-26 10:05 462
    load(renderer, ttf, color);
a133dbce sago007 2016-03-26 10:05 463
}
a133dbce sago007 2016-03-26 10:05 464
NFont::NFont(NFont_Target* renderer, const char* filename_ttf, Uint32 pointSize)
a133dbce sago007 2016-03-26 10:05 465
{
a133dbce sago007 2016-03-26 10:05 466
    init();
a133dbce sago007 2016-03-26 10:05 467
    load(renderer, filename_ttf, pointSize);
a133dbce sago007 2016-03-26 10:05 468
}
a133dbce sago007 2016-03-26 10:05 469
NFont::NFont(NFont_Target* renderer, const char* filename_ttf, Uint32 pointSize, const NFont::Color& color, int style)
a133dbce sago007 2016-03-26 10:05 470
{
a133dbce sago007 2016-03-26 10:05 471
    init();
a133dbce sago007 2016-03-26 10:05 472
    load(renderer, filename_ttf, pointSize, color, style);
a133dbce sago007 2016-03-26 10:05 473
}
a133dbce sago007 2016-03-26 10:05 474
NFont::NFont(NFont_Target* renderer, SDL_RWops* file_rwops_ttf, Uint8 own_rwops, Uint32 pointSize, const NFont::Color& color, int style)
a133dbce sago007 2016-03-26 10:05 475
{
a133dbce sago007 2016-03-26 10:05 476
    init();
a133dbce sago007 2016-03-26 10:05 477
    load(renderer, file_rwops_ttf, own_rwops, pointSize, color, style);
a133dbce sago007 2016-03-26 10:05 478
}
a133dbce sago007 2016-03-26 10:05 479
#endif
a133dbce sago007 2016-03-26 10:05 480
a133dbce sago007 2016-03-26 10:05 481
a133dbce sago007 2016-03-26 10:05 482
NFont::~NFont()
a133dbce sago007 2016-03-26 10:05 483
{
a133dbce sago007 2016-03-26 10:05 484
    FC_FreeFont(font);
a133dbce sago007 2016-03-26 10:05 485
}
a133dbce sago007 2016-03-26 10:05 486
a133dbce sago007 2016-03-26 10:05 487
34c3d60c sago007 2016-12-23 16:31 488
NFont& NFont::operator=(const NFont& font)
34c3d60c sago007 2016-12-23 16:31 489
{
34c3d60c sago007 2016-12-23 16:31 490
    // FIXME: Duplicate font data
34c3d60c sago007 2016-12-23 16:31 491
    return *this;
34c3d60c sago007 2016-12-23 16:31 492
}
34c3d60c sago007 2016-12-23 16:31 493
a133dbce sago007 2016-03-26 10:05 494
void NFont::init()
a133dbce sago007 2016-03-26 10:05 495
{
a133dbce sago007 2016-03-26 10:05 496
    font = FC_CreateFont();
a133dbce sago007 2016-03-26 10:05 497
a133dbce sago007 2016-03-26 10:05 498
    if(buffer == NULL)
a133dbce sago007 2016-03-26 10:05 499
        buffer = new char[NFONT_BUFFER_SIZE];
a133dbce sago007 2016-03-26 10:05 500
}
a133dbce sago007 2016-03-26 10:05 501
a133dbce sago007 2016-03-26 10:05 502
a133dbce sago007 2016-03-26 10:05 503
a133dbce sago007 2016-03-26 10:05 504
a133dbce sago007 2016-03-26 10:05 505
a133dbce sago007 2016-03-26 10:05 506
a133dbce sago007 2016-03-26 10:05 507
void NFont::setLoadingString(const char* str)
a133dbce sago007 2016-03-26 10:05 508
{
a133dbce sago007 2016-03-26 10:05 509
    FC_SetLoadingString(font, str);
a133dbce sago007 2016-03-26 10:05 510
}
a133dbce sago007 2016-03-26 10:05 511
a133dbce sago007 2016-03-26 10:05 512
#ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 513
bool NFont::load(TTF_Font* ttf)
a133dbce sago007 2016-03-26 10:05 514
#else
a133dbce sago007 2016-03-26 10:05 515
bool NFont::load(NFont_Target* renderer, TTF_Font* ttf)
a133dbce sago007 2016-03-26 10:05 516
#endif
a133dbce sago007 2016-03-26 10:05 517
{
a133dbce sago007 2016-03-26 10:05 518
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 519
    return load(ttf, FC_GetDefaultColor(font));
a133dbce sago007 2016-03-26 10:05 520
    #else
a133dbce sago007 2016-03-26 10:05 521
    return load(renderer, ttf, Color(0,0,0,255));
a133dbce sago007 2016-03-26 10:05 522
    #endif
a133dbce sago007 2016-03-26 10:05 523
}
a133dbce sago007 2016-03-26 10:05 524
a133dbce sago007 2016-03-26 10:05 525
#ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 526
bool NFont::load(TTF_Font* ttf, const NFont::Color& color)
a133dbce sago007 2016-03-26 10:05 527
#else
a133dbce sago007 2016-03-26 10:05 528
bool NFont::load(NFont_Target* renderer, TTF_Font* ttf, const NFont::Color& color)
a133dbce sago007 2016-03-26 10:05 529
#endif
a133dbce sago007 2016-03-26 10:05 530
{
a133dbce sago007 2016-03-26 10:05 531
    if(ttf == NULL)
a133dbce sago007 2016-03-26 10:05 532
        return false;
a133dbce sago007 2016-03-26 10:05 533
a133dbce sago007 2016-03-26 10:05 534
    #ifndef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 535
    if(renderer == NULL)
a133dbce sago007 2016-03-26 10:05 536
        return false;
a133dbce sago007 2016-03-26 10:05 537
    #endif
a133dbce sago007 2016-03-26 10:05 538
a133dbce sago007 2016-03-26 10:05 539
    FC_ClearFont(font);
a133dbce sago007 2016-03-26 10:05 540
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 541
    return FC_LoadFontFromTTF(font, ttf, color.to_SDL_Color());
a133dbce sago007 2016-03-26 10:05 542
    #else
a133dbce sago007 2016-03-26 10:05 543
    return FC_LoadFontFromTTF(font, renderer, ttf, color.to_SDL_Color());
a133dbce sago007 2016-03-26 10:05 544
    #endif
a133dbce sago007 2016-03-26 10:05 545
}
a133dbce sago007 2016-03-26 10:05 546
a133dbce sago007 2016-03-26 10:05 547
#ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 548
bool NFont::load(const char* filename_ttf, Uint32 pointSize)
a133dbce sago007 2016-03-26 10:05 549
#else
a133dbce sago007 2016-03-26 10:05 550
bool NFont::load(NFont_Target* renderer, const char* filename_ttf, Uint32 pointSize)
a133dbce sago007 2016-03-26 10:05 551
#endif
a133dbce sago007 2016-03-26 10:05 552
{
a133dbce sago007 2016-03-26 10:05 553
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 554
    return load(filename_ttf, pointSize, Color(0,0,0,255));
a133dbce sago007 2016-03-26 10:05 555
    #else
a133dbce sago007 2016-03-26 10:05 556
    return load(renderer, filename_ttf, pointSize, Color(0,0,0,255));
a133dbce sago007 2016-03-26 10:05 557
    #endif
a133dbce sago007 2016-03-26 10:05 558
}
a133dbce sago007 2016-03-26 10:05 559
a133dbce sago007 2016-03-26 10:05 560
#ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 561
bool NFont::load(const char* filename_ttf, Uint32 pointSize, const NFont::Color& color, int style)
a133dbce sago007 2016-03-26 10:05 562
#else
a133dbce sago007 2016-03-26 10:05 563
bool NFont::load(NFont_Target* renderer, const char* filename_ttf, Uint32 pointSize, const NFont::Color& color, int style)
a133dbce sago007 2016-03-26 10:05 564
#endif
a133dbce sago007 2016-03-26 10:05 565
{
a133dbce sago007 2016-03-26 10:05 566
    FC_ClearFont(font);
a133dbce sago007 2016-03-26 10:05 567
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 568
    return FC_LoadFont(font, filename_ttf, pointSize, color.to_SDL_Color(), style);
a133dbce sago007 2016-03-26 10:05 569
    #else
a133dbce sago007 2016-03-26 10:05 570
    return FC_LoadFont(font, renderer, filename_ttf, pointSize, color.to_SDL_Color(), style);
a133dbce sago007 2016-03-26 10:05 571
    #endif
a133dbce sago007 2016-03-26 10:05 572
}
a133dbce sago007 2016-03-26 10:05 573
a133dbce sago007 2016-03-26 10:05 574
#ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 575
bool NFont::load(SDL_RWops* file_rwops_ttf, Uint8 own_rwops, Uint32 pointSize, const NFont::Color& color, int style)
a133dbce sago007 2016-03-26 10:05 576
#else
a133dbce sago007 2016-03-26 10:05 577
bool NFont::load(NFont_Target* renderer, SDL_RWops* file_rwops_ttf, Uint8 own_rwops, Uint32 pointSize, const NFont::Color& color, int style)
a133dbce sago007 2016-03-26 10:05 578
#endif
a133dbce sago007 2016-03-26 10:05 579
{
a133dbce sago007 2016-03-26 10:05 580
    FC_ClearFont(font);
a133dbce sago007 2016-03-26 10:05 581
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 582
    return FC_LoadFont_RW(font, file_rwops_ttf, own_rwops, pointSize, color.to_SDL_Color(), style);
a133dbce sago007 2016-03-26 10:05 583
    #else
a133dbce sago007 2016-03-26 10:05 584
    return FC_LoadFont_RW(font, renderer, file_rwops_ttf, own_rwops, pointSize, color.to_SDL_Color(), style);
a133dbce sago007 2016-03-26 10:05 585
    #endif
a133dbce sago007 2016-03-26 10:05 586
}
a133dbce sago007 2016-03-26 10:05 587
a133dbce sago007 2016-03-26 10:05 588
a133dbce sago007 2016-03-26 10:05 589
a133dbce sago007 2016-03-26 10:05 590
void NFont::free()
a133dbce sago007 2016-03-26 10:05 591
{
a133dbce sago007 2016-03-26 10:05 592
    FC_ClearFont(font);
a133dbce sago007 2016-03-26 10:05 593
}
a133dbce sago007 2016-03-26 10:05 594
a133dbce sago007 2016-03-26 10:05 595
a133dbce sago007 2016-03-26 10:05 596
a133dbce sago007 2016-03-26 10:05 597
NFont::Rectf NFont::draw(NFont_Target* dest, float x, float y, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 598
{
a133dbce sago007 2016-03-26 10:05 599
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 600
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 601
a133dbce sago007 2016-03-26 10:05 602
    va_list lst;
a133dbce sago007 2016-03-26 10:05 603
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 604
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 605
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 606
a133dbce sago007 2016-03-26 10:05 607
    return FC_Draw(font, dest, x, y, "%s", buffer);
a133dbce sago007 2016-03-26 10:05 608
}
a133dbce sago007 2016-03-26 10:05 609
a133dbce sago007 2016-03-26 10:05 610
/*static int getIndexPastWidth(const char* text, int width, const int* charWidth)
a133dbce sago007 2016-03-26 10:05 611
{
a133dbce sago007 2016-03-26 10:05 612
    int charnum;
a133dbce sago007 2016-03-26 10:05 613
    int len = strlen(text);
a133dbce sago007 2016-03-26 10:05 614
a133dbce sago007 2016-03-26 10:05 615
    for (int index = 0; index < len; index++)
a133dbce sago007 2016-03-26 10:05 616
    {
a133dbce sago007 2016-03-26 10:05 617
        char c = text[index];
a133dbce sago007 2016-03-26 10:05 618
        charnum = (unsigned char)(c) - 33;
a133dbce sago007 2016-03-26 10:05 619
a133dbce sago007 2016-03-26 10:05 620
        // spaces and nonprintable characters
a133dbce sago007 2016-03-26 10:05 621
        if (c == ' ' || charnum > 222)
a133dbce sago007 2016-03-26 10:05 622
        {
a133dbce sago007 2016-03-26 10:05 623
            width -= charWidth[0];
a133dbce sago007 2016-03-26 10:05 624
        }
a133dbce sago007 2016-03-26 10:05 625
        else
a133dbce sago007 2016-03-26 10:05 626
            width -= charWidth[charnum];
a133dbce sago007 2016-03-26 10:05 627
a133dbce sago007 2016-03-26 10:05 628
        if(width <= 0)
a133dbce sago007 2016-03-26 10:05 629
            return index;
a133dbce sago007 2016-03-26 10:05 630
    }
a133dbce sago007 2016-03-26 10:05 631
    return 0;
a133dbce sago007 2016-03-26 10:05 632
}*/
a133dbce sago007 2016-03-26 10:05 633
a133dbce sago007 2016-03-26 10:05 634
a133dbce sago007 2016-03-26 10:05 635
a133dbce sago007 2016-03-26 10:05 636
/*static list<string> explode(const string& str, char delimiter)
a133dbce sago007 2016-03-26 10:05 637
{
a133dbce sago007 2016-03-26 10:05 638
    list<string> result;
a133dbce sago007 2016-03-26 10:05 639
a133dbce sago007 2016-03-26 10:05 640
    size_t oldPos = 0;
a133dbce sago007 2016-03-26 10:05 641
    size_t pos = str.find_first_of(delimiter);
a133dbce sago007 2016-03-26 10:05 642
    while(pos != string::npos)
a133dbce sago007 2016-03-26 10:05 643
    {
a133dbce sago007 2016-03-26 10:05 644
        result.push_back(str.substr(oldPos, pos - oldPos));
a133dbce sago007 2016-03-26 10:05 645
        oldPos = pos+1;
a133dbce sago007 2016-03-26 10:05 646
        pos = str.find_first_of(delimiter, oldPos);
a133dbce sago007 2016-03-26 10:05 647
    }
a133dbce sago007 2016-03-26 10:05 648
a133dbce sago007 2016-03-26 10:05 649
    result.push_back(str.substr(oldPos, string::npos));
a133dbce sago007 2016-03-26 10:05 650
a133dbce sago007 2016-03-26 10:05 651
    return result;
a133dbce sago007 2016-03-26 10:05 652
}*/
a133dbce sago007 2016-03-26 10:05 653
a133dbce sago007 2016-03-26 10:05 654
NFont::Rectf NFont::drawBox(NFont_Target* dest, const Rectf& box, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 655
{
a133dbce sago007 2016-03-26 10:05 656
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 657
        return Rectf(box.x, box.y, 0, 0);
a133dbce sago007 2016-03-26 10:05 658
a133dbce sago007 2016-03-26 10:05 659
    va_list lst;
a133dbce sago007 2016-03-26 10:05 660
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 661
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 662
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 663
a133dbce sago007 2016-03-26 10:05 664
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 665
    return FC_DrawBox(font, dest, box.to_GPU_Rect(), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 666
    #else
a133dbce sago007 2016-03-26 10:05 667
    return FC_DrawBox(font, dest, box.to_SDL_Rect(), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 668
    #endif
a133dbce sago007 2016-03-26 10:05 669
}
a133dbce sago007 2016-03-26 10:05 670
a133dbce sago007 2016-03-26 10:05 671
static FC_AlignEnum translate_enum_NFont_to_FC(NFont::AlignEnum align)
a133dbce sago007 2016-03-26 10:05 672
{
a133dbce sago007 2016-03-26 10:05 673
    switch(align)
a133dbce sago007 2016-03-26 10:05 674
    {
a133dbce sago007 2016-03-26 10:05 675
    case NFont::LEFT:
a133dbce sago007 2016-03-26 10:05 676
        return FC_ALIGN_LEFT;
a133dbce sago007 2016-03-26 10:05 677
    case NFont::CENTER:
a133dbce sago007 2016-03-26 10:05 678
        return FC_ALIGN_CENTER;
a133dbce sago007 2016-03-26 10:05 679
    case NFont::RIGHT:
a133dbce sago007 2016-03-26 10:05 680
        return FC_ALIGN_RIGHT;
a133dbce sago007 2016-03-26 10:05 681
    default:
a133dbce sago007 2016-03-26 10:05 682
        return FC_ALIGN_LEFT;
a133dbce sago007 2016-03-26 10:05 683
    }
a133dbce sago007 2016-03-26 10:05 684
}
a133dbce sago007 2016-03-26 10:05 685
a133dbce sago007 2016-03-26 10:05 686
NFont::Rectf NFont::drawBox(NFont_Target* dest, const Rectf& box, AlignEnum align, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 687
{
a133dbce sago007 2016-03-26 10:05 688
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 689
        return Rectf(box.x, box.y, 0, 0);
a133dbce sago007 2016-03-26 10:05 690
a133dbce sago007 2016-03-26 10:05 691
    va_list lst;
a133dbce sago007 2016-03-26 10:05 692
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 693
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 694
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 695
a133dbce sago007 2016-03-26 10:05 696
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 697
    return FC_DrawBoxAlign(font, dest, box.to_GPU_Rect(), translate_enum_NFont_to_FC(align), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 698
    #else
a133dbce sago007 2016-03-26 10:05 699
    return FC_DrawBoxAlign(font, dest, box.to_SDL_Rect(), translate_enum_NFont_to_FC(align), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 700
    #endif
a133dbce sago007 2016-03-26 10:05 701
}
a133dbce sago007 2016-03-26 10:05 702
a133dbce sago007 2016-03-26 10:05 703
NFont::Rectf NFont::drawBox(NFont_Target* dest, const Rectf& box, const Scale& scale, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 704
{
a133dbce sago007 2016-03-26 10:05 705
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 706
        return Rectf(box.x, box.y, 0, 0);
a133dbce sago007 2016-03-26 10:05 707
a133dbce sago007 2016-03-26 10:05 708
    va_list lst;
a133dbce sago007 2016-03-26 10:05 709
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 710
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 711
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 712
a133dbce sago007 2016-03-26 10:05 713
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 714
    return FC_DrawBoxScale(font, dest, box.to_GPU_Rect(), FC_MakeScale(scale.x, scale.y), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 715
    #else
a133dbce sago007 2016-03-26 10:05 716
    return FC_DrawBoxScale(font, dest, box.to_SDL_Rect(), FC_MakeScale(scale.x, scale.y), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 717
    #endif
a133dbce sago007 2016-03-26 10:05 718
}
a133dbce sago007 2016-03-26 10:05 719
a133dbce sago007 2016-03-26 10:05 720
NFont::Rectf NFont::drawBox(NFont_Target* dest, const Rectf& box, const Color& color, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 721
{
a133dbce sago007 2016-03-26 10:05 722
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 723
        return Rectf(box.x, box.y, 0, 0);
a133dbce sago007 2016-03-26 10:05 724
a133dbce sago007 2016-03-26 10:05 725
    va_list lst;
a133dbce sago007 2016-03-26 10:05 726
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 727
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 728
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 729
a133dbce sago007 2016-03-26 10:05 730
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 731
    return FC_DrawBoxColor(font, dest, box.to_GPU_Rect(), color.to_SDL_Color(), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 732
    #else
a133dbce sago007 2016-03-26 10:05 733
    return FC_DrawBoxColor(font, dest, box.to_SDL_Rect(), color.to_SDL_Color(), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 734
    #endif
a133dbce sago007 2016-03-26 10:05 735
}
a133dbce sago007 2016-03-26 10:05 736
a133dbce sago007 2016-03-26 10:05 737
NFont::Rectf NFont::drawBox(NFont_Target* dest, const Rectf& box, const Effect& effect, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 738
{
a133dbce sago007 2016-03-26 10:05 739
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 740
        return Rectf(box.x, box.y, 0, 0);
a133dbce sago007 2016-03-26 10:05 741
a133dbce sago007 2016-03-26 10:05 742
    va_list lst;
a133dbce sago007 2016-03-26 10:05 743
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 744
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 745
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 746
a133dbce sago007 2016-03-26 10:05 747
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 748
    return FC_DrawBoxEffect(font, dest, box.to_GPU_Rect(), FC_MakeEffect(translate_enum_NFont_to_FC(effect.alignment), FC_MakeScale(effect.scale.x, effect.scale.y), effect.color.to_SDL_Color()), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 749
    #else
a133dbce sago007 2016-03-26 10:05 750
    return FC_DrawBoxEffect(font, dest, box.to_SDL_Rect(), FC_MakeEffect(translate_enum_NFont_to_FC(effect.alignment), FC_MakeScale(effect.scale.x, effect.scale.y), effect.color.to_SDL_Color()), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 751
    #endif
a133dbce sago007 2016-03-26 10:05 752
}
a133dbce sago007 2016-03-26 10:05 753
a133dbce sago007 2016-03-26 10:05 754
NFont::Rectf NFont::drawColumn(NFont_Target* dest, float x, float y, Uint16 width, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 755
{
a133dbce sago007 2016-03-26 10:05 756
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 757
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 758
a133dbce sago007 2016-03-26 10:05 759
    va_list lst;
a133dbce sago007 2016-03-26 10:05 760
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 761
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 762
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 763
a133dbce sago007 2016-03-26 10:05 764
    return FC_DrawColumn(font, dest, x, y, width, "%s", buffer);
a133dbce sago007 2016-03-26 10:05 765
}
a133dbce sago007 2016-03-26 10:05 766
a133dbce sago007 2016-03-26 10:05 767
NFont::Rectf NFont::drawColumn(NFont_Target* dest, float x, float y, Uint16 width, AlignEnum align, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 768
{
a133dbce sago007 2016-03-26 10:05 769
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 770
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 771
a133dbce sago007 2016-03-26 10:05 772
    va_list lst;
a133dbce sago007 2016-03-26 10:05 773
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 774
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 775
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 776
a133dbce sago007 2016-03-26 10:05 777
    return FC_DrawColumnAlign(font, dest, x, y, width, translate_enum_NFont_to_FC(align), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 778
}
a133dbce sago007 2016-03-26 10:05 779
a133dbce sago007 2016-03-26 10:05 780
NFont::Rectf NFont::drawColumn(NFont_Target* dest, float x, float y, Uint16 width, const Scale& scale, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 781
{
a133dbce sago007 2016-03-26 10:05 782
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 783
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 784
a133dbce sago007 2016-03-26 10:05 785
    va_list lst;
a133dbce sago007 2016-03-26 10:05 786
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 787
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 788
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 789
a133dbce sago007 2016-03-26 10:05 790
    return FC_DrawColumnScale(font, dest, x, y, width, FC_MakeScale(scale.x, scale.y), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 791
}
a133dbce sago007 2016-03-26 10:05 792
a133dbce sago007 2016-03-26 10:05 793
NFont::Rectf NFont::drawColumn(NFont_Target* dest, float x, float y, Uint16 width, const Color& color, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 794
{
a133dbce sago007 2016-03-26 10:05 795
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 796
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 797
a133dbce sago007 2016-03-26 10:05 798
    va_list lst;
a133dbce sago007 2016-03-26 10:05 799
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 800
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 801
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 802
a133dbce sago007 2016-03-26 10:05 803
    return FC_DrawColumnColor(font, dest, x, y, width, color.to_SDL_Color(), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 804
}
a133dbce sago007 2016-03-26 10:05 805
a133dbce sago007 2016-03-26 10:05 806
NFont::Rectf NFont::drawColumn(NFont_Target* dest, float x, float y, Uint16 width, const Effect& effect, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 807
{
a133dbce sago007 2016-03-26 10:05 808
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 809
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 810
a133dbce sago007 2016-03-26 10:05 811
    va_list lst;
a133dbce sago007 2016-03-26 10:05 812
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 813
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 814
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 815
a133dbce sago007 2016-03-26 10:05 816
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 817
    return FC_DrawColumnEffect(font, dest, x, y, width, FC_MakeEffect(translate_enum_NFont_to_FC(effect.alignment), FC_MakeScale(effect.scale.x, effect.scale.y), effect.color.to_SDL_Color()), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 818
    #else
a133dbce sago007 2016-03-26 10:05 819
    return FC_DrawColumnEffect(font, dest, x, y, width, FC_MakeEffect(translate_enum_NFont_to_FC(effect.alignment), FC_MakeScale(effect.scale.x, effect.scale.y), effect.color.to_SDL_Color()), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 820
    #endif
a133dbce sago007 2016-03-26 10:05 821
}
a133dbce sago007 2016-03-26 10:05 822
a133dbce sago007 2016-03-26 10:05 823
a133dbce sago007 2016-03-26 10:05 824
a133dbce sago007 2016-03-26 10:05 825
NFont::Rectf NFont::draw(NFont_Target* dest, float x, float y, const Scale& scale, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 826
{
a133dbce sago007 2016-03-26 10:05 827
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 828
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 829
a133dbce sago007 2016-03-26 10:05 830
    va_list lst;
a133dbce sago007 2016-03-26 10:05 831
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 832
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 833
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 834
a133dbce sago007 2016-03-26 10:05 835
    return FC_DrawScale(font, dest, x, y, FC_MakeScale(scale.x, scale.y), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 836
}
a133dbce sago007 2016-03-26 10:05 837
a133dbce sago007 2016-03-26 10:05 838
NFont::Rectf NFont::draw(NFont_Target* dest, float x, float y, AlignEnum align, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 839
{
a133dbce sago007 2016-03-26 10:05 840
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 841
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 842
a133dbce sago007 2016-03-26 10:05 843
    va_list lst;
a133dbce sago007 2016-03-26 10:05 844
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 845
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 846
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 847
a133dbce sago007 2016-03-26 10:05 848
    return FC_DrawAlign(font, dest, x, y, translate_enum_NFont_to_FC(align), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 849
}
a133dbce sago007 2016-03-26 10:05 850
a133dbce sago007 2016-03-26 10:05 851
NFont::Rectf NFont::draw(NFont_Target* dest, float x, float y, const Color& color, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 852
{
a133dbce sago007 2016-03-26 10:05 853
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 854
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 855
a133dbce sago007 2016-03-26 10:05 856
    va_list lst;
a133dbce sago007 2016-03-26 10:05 857
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 858
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 859
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 860
a133dbce sago007 2016-03-26 10:05 861
    return FC_DrawColor(font, dest, x, y, color.to_SDL_Color(), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 862
}
a133dbce sago007 2016-03-26 10:05 863
a133dbce sago007 2016-03-26 10:05 864
a133dbce sago007 2016-03-26 10:05 865
NFont::Rectf NFont::draw(NFont_Target* dest, float x, float y, const Effect& effect, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 866
{
a133dbce sago007 2016-03-26 10:05 867
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 868
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 869
a133dbce sago007 2016-03-26 10:05 870
    va_list lst;
a133dbce sago007 2016-03-26 10:05 871
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 872
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 873
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 874
a133dbce sago007 2016-03-26 10:05 875
    return FC_DrawEffect(font, dest, x, y, FC_MakeEffect(translate_enum_NFont_to_FC(effect.alignment), FC_MakeScale(effect.scale.x, effect.scale.y), effect.color.to_SDL_Color()), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 876
}
a133dbce sago007 2016-03-26 10:05 877
a133dbce sago007 2016-03-26 10:05 878
a133dbce sago007 2016-03-26 10:05 879
a133dbce sago007 2016-03-26 10:05 880
a133dbce sago007 2016-03-26 10:05 881
// Getters
a133dbce sago007 2016-03-26 10:05 882
a133dbce sago007 2016-03-26 10:05 883
a133dbce sago007 2016-03-26 10:05 884
NFont::FilterEnum NFont::getFilterMode() const
a133dbce sago007 2016-03-26 10:05 885
{
a133dbce sago007 2016-03-26 10:05 886
    FC_FilterEnum f = FC_GetFilterMode(font);
a133dbce sago007 2016-03-26 10:05 887
    if(f == FC_FILTER_LINEAR)
a133dbce sago007 2016-03-26 10:05 888
        return NFont::LINEAR;
a133dbce sago007 2016-03-26 10:05 889
    return NFont::NEAREST;
a133dbce sago007 2016-03-26 10:05 890
}
a133dbce sago007 2016-03-26 10:05 891
a133dbce sago007 2016-03-26 10:05 892
Uint16 NFont::getHeight() const
a133dbce sago007 2016-03-26 10:05 893
{
a133dbce sago007 2016-03-26 10:05 894
    return FC_GetLineHeight(font);
a133dbce sago007 2016-03-26 10:05 895
}
a133dbce sago007 2016-03-26 10:05 896
a133dbce sago007 2016-03-26 10:05 897
Uint16 NFont::getHeight(const char* formatted_text, ...) const
a133dbce sago007 2016-03-26 10:05 898
{
a133dbce sago007 2016-03-26 10:05 899
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 900
        return 0;
a133dbce sago007 2016-03-26 10:05 901
a133dbce sago007 2016-03-26 10:05 902
    va_list lst;
a133dbce sago007 2016-03-26 10:05 903
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 904
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 905
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 906
a133dbce sago007 2016-03-26 10:05 907
    return FC_GetHeight(font, "%s", buffer);
a133dbce sago007 2016-03-26 10:05 908
}
a133dbce sago007 2016-03-26 10:05 909
a133dbce sago007 2016-03-26 10:05 910
Uint16 NFont::getWidth(const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 911
{
a133dbce sago007 2016-03-26 10:05 912
    if (formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 913
        return 0;
a133dbce sago007 2016-03-26 10:05 914
a133dbce sago007 2016-03-26 10:05 915
    va_list lst;
a133dbce sago007 2016-03-26 10:05 916
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 917
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 918
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 919
a133dbce sago007 2016-03-26 10:05 920
    return FC_GetWidth(font, "%s", buffer);
a133dbce sago007 2016-03-26 10:05 921
}
a133dbce sago007 2016-03-26 10:05 922
a133dbce sago007 2016-03-26 10:05 923
a133dbce sago007 2016-03-26 10:05 924
NFont::Rectf NFont::getCharacterOffset(Uint16 position_index, int column_width, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 925
{
a133dbce sago007 2016-03-26 10:05 926
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 927
        return Rectf(0,0,0,0);
a133dbce sago007 2016-03-26 10:05 928
a133dbce sago007 2016-03-26 10:05 929
    va_list lst;
a133dbce sago007 2016-03-26 10:05 930
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 931
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 932
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 933
a133dbce sago007 2016-03-26 10:05 934
    return FC_GetCharacterOffset(font, position_index, column_width, "%s", buffer);
a133dbce sago007 2016-03-26 10:05 935
}
a133dbce sago007 2016-03-26 10:05 936
a133dbce sago007 2016-03-26 10:05 937
// Given an offset (x,y) from the text draw position (the upper-left corner), returns the character position (UTF-8 index)
a133dbce sago007 2016-03-26 10:05 938
Uint16 NFont::getPositionFromOffset(float x, float y, int column_width, NFont::AlignEnum align, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 939
{
a133dbce sago007 2016-03-26 10:05 940
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 941
        return 0;
a133dbce sago007 2016-03-26 10:05 942
a133dbce sago007 2016-03-26 10:05 943
    va_list lst;
a133dbce sago007 2016-03-26 10:05 944
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 945
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 946
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 947
a133dbce sago007 2016-03-26 10:05 948
    return FC_GetPositionFromOffset(font, x, y, column_width, translate_enum_NFont_to_FC(align), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 949
}
a133dbce sago007 2016-03-26 10:05 950
a133dbce sago007 2016-03-26 10:05 951
a133dbce sago007 2016-03-26 10:05 952
Uint16 NFont::getColumnHeight(Uint16 width, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 953
{
a133dbce sago007 2016-03-26 10:05 954
    if(formatted_text == NULL || width == 0)
a133dbce sago007 2016-03-26 10:05 955
        return 0;
a133dbce sago007 2016-03-26 10:05 956
a133dbce sago007 2016-03-26 10:05 957
    va_list lst;
a133dbce sago007 2016-03-26 10:05 958
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 959
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 960
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 961
a133dbce sago007 2016-03-26 10:05 962
    return FC_GetColumnHeight(font, width, "%s", buffer);
a133dbce sago007 2016-03-26 10:05 963
}
a133dbce sago007 2016-03-26 10:05 964
a133dbce sago007 2016-03-26 10:05 965
int NFont::getAscent(const char character)
a133dbce sago007 2016-03-26 10:05 966
{
a133dbce sago007 2016-03-26 10:05 967
    return FC_GetAscent(font, "%c", character);
a133dbce sago007 2016-03-26 10:05 968
}
a133dbce sago007 2016-03-26 10:05 969
a133dbce sago007 2016-03-26 10:05 970
int NFont::getAscent() const
a133dbce sago007 2016-03-26 10:05 971
{
a133dbce sago007 2016-03-26 10:05 972
    return FC_GetAscent(font, NULL);
a133dbce sago007 2016-03-26 10:05 973
}
a133dbce sago007 2016-03-26 10:05 974
a133dbce sago007 2016-03-26 10:05 975
int NFont::getAscent(const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 976
{
a133dbce sago007 2016-03-26 10:05 977
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 978
        return FC_GetAscent(font, NULL);
a133dbce sago007 2016-03-26 10:05 979
a133dbce sago007 2016-03-26 10:05 980
    va_list lst;
a133dbce sago007 2016-03-26 10:05 981
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 982
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 983
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 984
a133dbce sago007 2016-03-26 10:05 985
    return FC_GetAscent(font, "%s", buffer);
a133dbce sago007 2016-03-26 10:05 986
}
a133dbce sago007 2016-03-26 10:05 987
a133dbce sago007 2016-03-26 10:05 988
int NFont::getDescent(const char character)
a133dbce sago007 2016-03-26 10:05 989
{
a133dbce sago007 2016-03-26 10:05 990
    return FC_GetDescent(font, "%c", character);
a133dbce sago007 2016-03-26 10:05 991
}
a133dbce sago007 2016-03-26 10:05 992
a133dbce sago007 2016-03-26 10:05 993
int NFont::getDescent() const
a133dbce sago007 2016-03-26 10:05 994
{
a133dbce sago007 2016-03-26 10:05 995
    return FC_GetDescent(font, NULL);
a133dbce sago007 2016-03-26 10:05 996
}
a133dbce sago007 2016-03-26 10:05 997
a133dbce sago007 2016-03-26 10:05 998
int NFont::getDescent(const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 999
{
a133dbce sago007 2016-03-26 10:05 1000
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 1001
        return FC_GetDescent(font, NULL);
a133dbce sago007 2016-03-26 10:05 1002
a133dbce sago007 2016-03-26 10:05 1003
    va_list lst;
a133dbce sago007 2016-03-26 10:05 1004
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 1005
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 1006
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 1007
a133dbce sago007 2016-03-26 10:05 1008
    return FC_GetDescent(font, "%s", buffer);
a133dbce sago007 2016-03-26 10:05 1009
}
a133dbce sago007 2016-03-26 10:05 1010
a133dbce sago007 2016-03-26 10:05 1011
int NFont::getSpacing() const
a133dbce sago007 2016-03-26 10:05 1012
{
a133dbce sago007 2016-03-26 10:05 1013
    return FC_GetSpacing(font);
a133dbce sago007 2016-03-26 10:05 1014
}
a133dbce sago007 2016-03-26 10:05 1015
a133dbce sago007 2016-03-26 10:05 1016
int NFont::getLineSpacing() const
a133dbce sago007 2016-03-26 10:05 1017
{
a133dbce sago007 2016-03-26 10:05 1018
    return FC_GetLineSpacing(font);
a133dbce sago007 2016-03-26 10:05 1019
}
a133dbce sago007 2016-03-26 10:05 1020
a133dbce sago007 2016-03-26 10:05 1021
Uint16 NFont::getBaseline() const
a133dbce sago007 2016-03-26 10:05 1022
{
a133dbce sago007 2016-03-26 10:05 1023
    return FC_GetBaseline(font);
a133dbce sago007 2016-03-26 10:05 1024
}
a133dbce sago007 2016-03-26 10:05 1025
a133dbce sago007 2016-03-26 10:05 1026
Uint16 NFont::getMaxWidth() const
a133dbce sago007 2016-03-26 10:05 1027
{
a133dbce sago007 2016-03-26 10:05 1028
    return FC_GetMaxWidth(font);
a133dbce sago007 2016-03-26 10:05 1029
}
a133dbce sago007 2016-03-26 10:05 1030
a133dbce sago007 2016-03-26 10:05 1031
NFont::Color NFont::getDefaultColor() const
a133dbce sago007 2016-03-26 10:05 1032
{
a133dbce sago007 2016-03-26 10:05 1033
    return FC_GetDefaultColor(font);
a133dbce sago007 2016-03-26 10:05 1034
}
a133dbce sago007 2016-03-26 10:05 1035
34c3d60c sago007 2016-12-23 16:31 1036
    
34c3d60c sago007 2016-12-23 16:31 1037
int NFont::getNumCacheLevels() const
34c3d60c sago007 2016-12-23 16:31 1038
{
34c3d60c sago007 2016-12-23 16:31 1039
    return FC_GetNumCacheLevels(font);
34c3d60c sago007 2016-12-23 16:31 1040
}
34c3d60c sago007 2016-12-23 16:31 1041
34c3d60c sago007 2016-12-23 16:31 1042
NFont_Image* NFont::getCacheLevel(int level) const
34c3d60c sago007 2016-12-23 16:31 1043
{
34c3d60c sago007 2016-12-23 16:31 1044
    return FC_GetGlyphCacheLevel(font, level);
34c3d60c sago007 2016-12-23 16:31 1045
}
34c3d60c sago007 2016-12-23 16:31 1046
a133dbce sago007 2016-03-26 10:05 1047
a133dbce sago007 2016-03-26 10:05 1048
a133dbce sago007 2016-03-26 10:05 1049
a133dbce sago007 2016-03-26 10:05 1050
a133dbce sago007 2016-03-26 10:05 1051
// Setters
a133dbce sago007 2016-03-26 10:05 1052
a133dbce sago007 2016-03-26 10:05 1053
void NFont::setFilterMode(NFont::FilterEnum filter)
a133dbce sago007 2016-03-26 10:05 1054
{
a133dbce sago007 2016-03-26 10:05 1055
    if(filter == NFont::LINEAR)
a133dbce sago007 2016-03-26 10:05 1056
        FC_SetFilterMode(font, FC_FILTER_LINEAR);
a133dbce sago007 2016-03-26 10:05 1057
    else
a133dbce sago007 2016-03-26 10:05 1058
        FC_SetFilterMode(font, FC_FILTER_NEAREST);
a133dbce sago007 2016-03-26 10:05 1059
}
a133dbce sago007 2016-03-26 10:05 1060
a133dbce sago007 2016-03-26 10:05 1061
void NFont::setSpacing(int LetterSpacing)
a133dbce sago007 2016-03-26 10:05 1062
{
a133dbce sago007 2016-03-26 10:05 1063
    FC_SetSpacing(font, LetterSpacing);
a133dbce sago007 2016-03-26 10:05 1064
}
a133dbce sago007 2016-03-26 10:05 1065
a133dbce sago007 2016-03-26 10:05 1066
void NFont::setLineSpacing(int LineSpacing)
a133dbce sago007 2016-03-26 10:05 1067
{
a133dbce sago007 2016-03-26 10:05 1068
    FC_SetLineSpacing(font, LineSpacing);
a133dbce sago007 2016-03-26 10:05 1069
}
a133dbce sago007 2016-03-26 10:05 1070
34c3d60c sago007 2016-12-23 16:31 1071
void NFont::setBaseline()
34c3d60c sago007 2016-12-23 16:31 1072
{
34c3d60c sago007 2016-12-23 16:31 1073
34c3d60c sago007 2016-12-23 16:31 1074
}
34c3d60c sago007 2016-12-23 16:31 1075
34c3d60c sago007 2016-12-23 16:31 1076
void NFont::setBaseline(Uint16 Baseline)
34c3d60c sago007 2016-12-23 16:31 1077
{
34c3d60c sago007 2016-12-23 16:31 1078
34c3d60c sago007 2016-12-23 16:31 1079
}
34c3d60c sago007 2016-12-23 16:31 1080
a133dbce sago007 2016-03-26 10:05 1081
void NFont::setDefaultColor(const Color& color)
a133dbce sago007 2016-03-26 10:05 1082
{
a133dbce sago007 2016-03-26 10:05 1083
    FC_SetDefaultColor(font, color.to_SDL_Color());
a133dbce sago007 2016-03-26 10:05 1084
}
a133dbce sago007 2016-03-26 10:05 1085
34c3d60c sago007 2016-12-23 16:31 1086
void NFont::enableTTFOwnership()
34c3d60c sago007 2016-12-23 16:31 1087
{
34c3d60c sago007 2016-12-23 16:31 1088
34c3d60c sago007 2016-12-23 16:31 1089
}
a133dbce sago007 2016-03-26 10:05 1090
a133dbce sago007 2016-03-26 10:05 1091
a133dbce sago007 2016-03-26 10:05 1092
a133dbce sago007 2016-03-26 10:05 1093
1970-01-01 00:00 1094