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
a133dbce sago007 2016-03-26 10:05 420
#ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 421
NFont::NFont(TTF_Font* ttf)
a133dbce sago007 2016-03-26 10:05 422
{
a133dbce sago007 2016-03-26 10:05 423
    init();
a133dbce sago007 2016-03-26 10:05 424
    load(ttf, FC_GetDefaultColor(font));
a133dbce sago007 2016-03-26 10:05 425
}
a133dbce sago007 2016-03-26 10:05 426
NFont::NFont(TTF_Font* ttf, const NFont::Color& color)
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, color);
a133dbce sago007 2016-03-26 10:05 430
}
a133dbce sago007 2016-03-26 10:05 431
NFont::NFont(const char* filename_ttf, Uint32 pointSize)
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(filename_ttf, pointSize);
a133dbce sago007 2016-03-26 10:05 435
}
a133dbce sago007 2016-03-26 10:05 436
NFont::NFont(const char* filename_ttf, Uint32 pointSize, const NFont::Color& color, int style)
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, color, style);
a133dbce sago007 2016-03-26 10:05 440
}
a133dbce sago007 2016-03-26 10:05 441
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 442
{
a133dbce sago007 2016-03-26 10:05 443
    init();
a133dbce sago007 2016-03-26 10:05 444
    load(file_rwops_ttf, own_rwops, pointSize, color, style);
a133dbce sago007 2016-03-26 10:05 445
}
a133dbce sago007 2016-03-26 10:05 446
a133dbce sago007 2016-03-26 10:05 447
#else
a133dbce sago007 2016-03-26 10:05 448
a133dbce sago007 2016-03-26 10:05 449
NFont::NFont(NFont_Target* renderer, TTF_Font* ttf)
a133dbce sago007 2016-03-26 10:05 450
{
a133dbce sago007 2016-03-26 10:05 451
    init();
a133dbce sago007 2016-03-26 10:05 452
    load(renderer, ttf, FC_GetDefaultColor(font));
a133dbce sago007 2016-03-26 10:05 453
}
a133dbce sago007 2016-03-26 10:05 454
NFont::NFont(NFont_Target* renderer, TTF_Font* ttf, const NFont::Color& color)
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, color);
a133dbce sago007 2016-03-26 10:05 458
}
a133dbce sago007 2016-03-26 10:05 459
NFont::NFont(NFont_Target* renderer, const char* filename_ttf, Uint32 pointSize)
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, filename_ttf, pointSize);
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, const NFont::Color& color, int style)
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, color, style);
a133dbce sago007 2016-03-26 10:05 468
}
a133dbce sago007 2016-03-26 10:05 469
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 470
{
a133dbce sago007 2016-03-26 10:05 471
    init();
a133dbce sago007 2016-03-26 10:05 472
    load(renderer, file_rwops_ttf, own_rwops, pointSize, color, style);
a133dbce sago007 2016-03-26 10:05 473
}
a133dbce sago007 2016-03-26 10:05 474
#endif
a133dbce sago007 2016-03-26 10:05 475
a133dbce sago007 2016-03-26 10:05 476
a133dbce sago007 2016-03-26 10:05 477
NFont::~NFont()
a133dbce sago007 2016-03-26 10:05 478
{
a133dbce sago007 2016-03-26 10:05 479
    FC_FreeFont(font);
a133dbce sago007 2016-03-26 10:05 480
}
a133dbce sago007 2016-03-26 10:05 481
a133dbce sago007 2016-03-26 10:05 482
void NFont::init()
a133dbce sago007 2016-03-26 10:05 483
{
a133dbce sago007 2016-03-26 10:05 484
    font = FC_CreateFont();
a133dbce sago007 2016-03-26 10:05 485
a133dbce sago007 2016-03-26 10:05 486
    if(buffer == NULL)
a133dbce sago007 2016-03-26 10:05 487
        buffer = new char[NFONT_BUFFER_SIZE];
a133dbce sago007 2016-03-26 10:05 488
}
a133dbce sago007 2016-03-26 10:05 489
a133dbce sago007 2016-03-26 10:05 490
a133dbce sago007 2016-03-26 10:05 491
a133dbce sago007 2016-03-26 10:05 492
a133dbce sago007 2016-03-26 10:05 493
a133dbce sago007 2016-03-26 10:05 494
a133dbce sago007 2016-03-26 10:05 495
void NFont::setLoadingString(const char* str)
a133dbce sago007 2016-03-26 10:05 496
{
a133dbce sago007 2016-03-26 10:05 497
    FC_SetLoadingString(font, str);
a133dbce sago007 2016-03-26 10:05 498
}
a133dbce sago007 2016-03-26 10:05 499
a133dbce sago007 2016-03-26 10:05 500
#ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 501
bool NFont::load(TTF_Font* ttf)
a133dbce sago007 2016-03-26 10:05 502
#else
a133dbce sago007 2016-03-26 10:05 503
bool NFont::load(NFont_Target* renderer, TTF_Font* ttf)
a133dbce sago007 2016-03-26 10:05 504
#endif
a133dbce sago007 2016-03-26 10:05 505
{
a133dbce sago007 2016-03-26 10:05 506
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 507
    return load(ttf, FC_GetDefaultColor(font));
a133dbce sago007 2016-03-26 10:05 508
    #else
a133dbce sago007 2016-03-26 10:05 509
    return load(renderer, ttf, Color(0,0,0,255));
a133dbce sago007 2016-03-26 10:05 510
    #endif
a133dbce sago007 2016-03-26 10:05 511
}
a133dbce sago007 2016-03-26 10:05 512
a133dbce sago007 2016-03-26 10:05 513
#ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 514
bool NFont::load(TTF_Font* ttf, const NFont::Color& color)
a133dbce sago007 2016-03-26 10:05 515
#else
a133dbce sago007 2016-03-26 10:05 516
bool NFont::load(NFont_Target* renderer, TTF_Font* ttf, const NFont::Color& color)
a133dbce sago007 2016-03-26 10:05 517
#endif
a133dbce sago007 2016-03-26 10:05 518
{
a133dbce sago007 2016-03-26 10:05 519
    if(ttf == NULL)
a133dbce sago007 2016-03-26 10:05 520
        return false;
a133dbce sago007 2016-03-26 10:05 521
a133dbce sago007 2016-03-26 10:05 522
    #ifndef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 523
    if(renderer == NULL)
a133dbce sago007 2016-03-26 10:05 524
        return false;
a133dbce sago007 2016-03-26 10:05 525
    #endif
a133dbce sago007 2016-03-26 10:05 526
a133dbce sago007 2016-03-26 10:05 527
    FC_ClearFont(font);
a133dbce sago007 2016-03-26 10:05 528
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 529
    return FC_LoadFontFromTTF(font, ttf, color.to_SDL_Color());
a133dbce sago007 2016-03-26 10:05 530
    #else
a133dbce sago007 2016-03-26 10:05 531
    return FC_LoadFontFromTTF(font, renderer, ttf, color.to_SDL_Color());
a133dbce sago007 2016-03-26 10:05 532
    #endif
a133dbce sago007 2016-03-26 10:05 533
}
a133dbce sago007 2016-03-26 10:05 534
a133dbce sago007 2016-03-26 10:05 535
#ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 536
bool NFont::load(const char* filename_ttf, Uint32 pointSize)
a133dbce sago007 2016-03-26 10:05 537
#else
a133dbce sago007 2016-03-26 10:05 538
bool NFont::load(NFont_Target* renderer, const char* filename_ttf, Uint32 pointSize)
a133dbce sago007 2016-03-26 10:05 539
#endif
a133dbce sago007 2016-03-26 10:05 540
{
a133dbce sago007 2016-03-26 10:05 541
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 542
    return load(filename_ttf, pointSize, Color(0,0,0,255));
a133dbce sago007 2016-03-26 10:05 543
    #else
a133dbce sago007 2016-03-26 10:05 544
    return load(renderer, filename_ttf, pointSize, Color(0,0,0,255));
a133dbce sago007 2016-03-26 10:05 545
    #endif
a133dbce sago007 2016-03-26 10:05 546
}
a133dbce sago007 2016-03-26 10:05 547
a133dbce sago007 2016-03-26 10:05 548
#ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 549
bool NFont::load(const char* filename_ttf, Uint32 pointSize, const NFont::Color& color, int style)
a133dbce sago007 2016-03-26 10:05 550
#else
a133dbce sago007 2016-03-26 10:05 551
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 552
#endif
a133dbce sago007 2016-03-26 10:05 553
{
a133dbce sago007 2016-03-26 10:05 554
    FC_ClearFont(font);
a133dbce sago007 2016-03-26 10:05 555
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 556
    return FC_LoadFont(font, filename_ttf, pointSize, color.to_SDL_Color(), style);
a133dbce sago007 2016-03-26 10:05 557
    #else
a133dbce sago007 2016-03-26 10:05 558
    return FC_LoadFont(font, renderer, filename_ttf, pointSize, color.to_SDL_Color(), style);
a133dbce sago007 2016-03-26 10:05 559
    #endif
a133dbce sago007 2016-03-26 10:05 560
}
a133dbce sago007 2016-03-26 10:05 561
a133dbce sago007 2016-03-26 10:05 562
#ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 563
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 564
#else
a133dbce sago007 2016-03-26 10:05 565
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 566
#endif
a133dbce sago007 2016-03-26 10:05 567
{
a133dbce sago007 2016-03-26 10:05 568
    FC_ClearFont(font);
a133dbce sago007 2016-03-26 10:05 569
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 570
    return FC_LoadFont_RW(font, file_rwops_ttf, own_rwops, pointSize, color.to_SDL_Color(), style);
a133dbce sago007 2016-03-26 10:05 571
    #else
a133dbce sago007 2016-03-26 10:05 572
    return FC_LoadFont_RW(font, renderer, file_rwops_ttf, own_rwops, pointSize, color.to_SDL_Color(), style);
a133dbce sago007 2016-03-26 10:05 573
    #endif
a133dbce sago007 2016-03-26 10:05 574
}
a133dbce sago007 2016-03-26 10:05 575
a133dbce sago007 2016-03-26 10:05 576
a133dbce sago007 2016-03-26 10:05 577
a133dbce sago007 2016-03-26 10:05 578
void NFont::free()
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
}
a133dbce sago007 2016-03-26 10:05 582
a133dbce sago007 2016-03-26 10:05 583
a133dbce sago007 2016-03-26 10:05 584
a133dbce sago007 2016-03-26 10:05 585
NFont::Rectf NFont::draw(NFont_Target* dest, float x, float y, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 586
{
a133dbce sago007 2016-03-26 10:05 587
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 588
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 589
a133dbce sago007 2016-03-26 10:05 590
    va_list lst;
a133dbce sago007 2016-03-26 10:05 591
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 592
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 593
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 594
a133dbce sago007 2016-03-26 10:05 595
    return FC_Draw(font, dest, x, y, "%s", buffer);
a133dbce sago007 2016-03-26 10:05 596
}
a133dbce sago007 2016-03-26 10:05 597
a133dbce sago007 2016-03-26 10:05 598
/*static int getIndexPastWidth(const char* text, int width, const int* charWidth)
a133dbce sago007 2016-03-26 10:05 599
{
a133dbce sago007 2016-03-26 10:05 600
    int charnum;
a133dbce sago007 2016-03-26 10:05 601
    int len = strlen(text);
a133dbce sago007 2016-03-26 10:05 602
a133dbce sago007 2016-03-26 10:05 603
    for (int index = 0; index < len; index++)
a133dbce sago007 2016-03-26 10:05 604
    {
a133dbce sago007 2016-03-26 10:05 605
        char c = text[index];
a133dbce sago007 2016-03-26 10:05 606
        charnum = (unsigned char)(c) - 33;
a133dbce sago007 2016-03-26 10:05 607
a133dbce sago007 2016-03-26 10:05 608
        // spaces and nonprintable characters
a133dbce sago007 2016-03-26 10:05 609
        if (c == ' ' || charnum > 222)
a133dbce sago007 2016-03-26 10:05 610
        {
a133dbce sago007 2016-03-26 10:05 611
            width -= charWidth[0];
a133dbce sago007 2016-03-26 10:05 612
        }
a133dbce sago007 2016-03-26 10:05 613
        else
a133dbce sago007 2016-03-26 10:05 614
            width -= charWidth[charnum];
a133dbce sago007 2016-03-26 10:05 615
a133dbce sago007 2016-03-26 10:05 616
        if(width <= 0)
a133dbce sago007 2016-03-26 10:05 617
            return index;
a133dbce sago007 2016-03-26 10:05 618
    }
a133dbce sago007 2016-03-26 10:05 619
    return 0;
a133dbce sago007 2016-03-26 10:05 620
}*/
a133dbce sago007 2016-03-26 10:05 621
a133dbce sago007 2016-03-26 10:05 622
a133dbce sago007 2016-03-26 10:05 623
a133dbce sago007 2016-03-26 10:05 624
/*static list<string> explode(const string& str, char delimiter)
a133dbce sago007 2016-03-26 10:05 625
{
a133dbce sago007 2016-03-26 10:05 626
    list<string> result;
a133dbce sago007 2016-03-26 10:05 627
a133dbce sago007 2016-03-26 10:05 628
    size_t oldPos = 0;
a133dbce sago007 2016-03-26 10:05 629
    size_t pos = str.find_first_of(delimiter);
a133dbce sago007 2016-03-26 10:05 630
    while(pos != string::npos)
a133dbce sago007 2016-03-26 10:05 631
    {
a133dbce sago007 2016-03-26 10:05 632
        result.push_back(str.substr(oldPos, pos - oldPos));
a133dbce sago007 2016-03-26 10:05 633
        oldPos = pos+1;
a133dbce sago007 2016-03-26 10:05 634
        pos = str.find_first_of(delimiter, oldPos);
a133dbce sago007 2016-03-26 10:05 635
    }
a133dbce sago007 2016-03-26 10:05 636
a133dbce sago007 2016-03-26 10:05 637
    result.push_back(str.substr(oldPos, string::npos));
a133dbce sago007 2016-03-26 10:05 638
a133dbce sago007 2016-03-26 10:05 639
    return result;
a133dbce sago007 2016-03-26 10:05 640
}*/
a133dbce sago007 2016-03-26 10:05 641
a133dbce sago007 2016-03-26 10:05 642
NFont::Rectf NFont::drawBox(NFont_Target* dest, const Rectf& box, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 643
{
a133dbce sago007 2016-03-26 10:05 644
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 645
        return Rectf(box.x, box.y, 0, 0);
a133dbce sago007 2016-03-26 10:05 646
a133dbce sago007 2016-03-26 10:05 647
    va_list lst;
a133dbce sago007 2016-03-26 10:05 648
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 649
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 650
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 651
a133dbce sago007 2016-03-26 10:05 652
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 653
    return FC_DrawBox(font, dest, box.to_GPU_Rect(), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 654
    #else
a133dbce sago007 2016-03-26 10:05 655
    return FC_DrawBox(font, dest, box.to_SDL_Rect(), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 656
    #endif
a133dbce sago007 2016-03-26 10:05 657
}
a133dbce sago007 2016-03-26 10:05 658
a133dbce sago007 2016-03-26 10:05 659
static FC_AlignEnum translate_enum_NFont_to_FC(NFont::AlignEnum align)
a133dbce sago007 2016-03-26 10:05 660
{
a133dbce sago007 2016-03-26 10:05 661
    switch(align)
a133dbce sago007 2016-03-26 10:05 662
    {
a133dbce sago007 2016-03-26 10:05 663
    case NFont::LEFT:
a133dbce sago007 2016-03-26 10:05 664
        return FC_ALIGN_LEFT;
a133dbce sago007 2016-03-26 10:05 665
    case NFont::CENTER:
a133dbce sago007 2016-03-26 10:05 666
        return FC_ALIGN_CENTER;
a133dbce sago007 2016-03-26 10:05 667
    case NFont::RIGHT:
a133dbce sago007 2016-03-26 10:05 668
        return FC_ALIGN_RIGHT;
a133dbce sago007 2016-03-26 10:05 669
    default:
a133dbce sago007 2016-03-26 10:05 670
        return FC_ALIGN_LEFT;
a133dbce sago007 2016-03-26 10:05 671
    }
a133dbce sago007 2016-03-26 10:05 672
}
a133dbce sago007 2016-03-26 10:05 673
a133dbce sago007 2016-03-26 10:05 674
NFont::Rectf NFont::drawBox(NFont_Target* dest, const Rectf& box, AlignEnum align, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 675
{
a133dbce sago007 2016-03-26 10:05 676
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 677
        return Rectf(box.x, box.y, 0, 0);
a133dbce sago007 2016-03-26 10:05 678
a133dbce sago007 2016-03-26 10:05 679
    va_list lst;
a133dbce sago007 2016-03-26 10:05 680
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 681
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 682
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 683
a133dbce sago007 2016-03-26 10:05 684
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 685
    return FC_DrawBoxAlign(font, dest, box.to_GPU_Rect(), translate_enum_NFont_to_FC(align), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 686
    #else
a133dbce sago007 2016-03-26 10:05 687
    return FC_DrawBoxAlign(font, dest, box.to_SDL_Rect(), translate_enum_NFont_to_FC(align), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 688
    #endif
a133dbce sago007 2016-03-26 10:05 689
}
a133dbce sago007 2016-03-26 10:05 690
a133dbce sago007 2016-03-26 10:05 691
NFont::Rectf NFont::drawBox(NFont_Target* dest, const Rectf& box, const Scale& scale, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 692
{
a133dbce sago007 2016-03-26 10:05 693
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 694
        return Rectf(box.x, box.y, 0, 0);
a133dbce sago007 2016-03-26 10:05 695
a133dbce sago007 2016-03-26 10:05 696
    va_list lst;
a133dbce sago007 2016-03-26 10:05 697
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 698
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 699
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 700
a133dbce sago007 2016-03-26 10:05 701
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 702
    return FC_DrawBoxScale(font, dest, box.to_GPU_Rect(), FC_MakeScale(scale.x, scale.y), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 703
    #else
a133dbce sago007 2016-03-26 10:05 704
    return FC_DrawBoxScale(font, dest, box.to_SDL_Rect(), FC_MakeScale(scale.x, scale.y), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 705
    #endif
a133dbce sago007 2016-03-26 10:05 706
}
a133dbce sago007 2016-03-26 10:05 707
a133dbce sago007 2016-03-26 10:05 708
NFont::Rectf NFont::drawBox(NFont_Target* dest, const Rectf& box, const Color& color, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 709
{
a133dbce sago007 2016-03-26 10:05 710
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 711
        return Rectf(box.x, box.y, 0, 0);
a133dbce sago007 2016-03-26 10:05 712
a133dbce sago007 2016-03-26 10:05 713
    va_list lst;
a133dbce sago007 2016-03-26 10:05 714
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 715
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 716
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 717
a133dbce sago007 2016-03-26 10:05 718
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 719
    return FC_DrawBoxColor(font, dest, box.to_GPU_Rect(), color.to_SDL_Color(), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 720
    #else
a133dbce sago007 2016-03-26 10:05 721
    return FC_DrawBoxColor(font, dest, box.to_SDL_Rect(), color.to_SDL_Color(), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 722
    #endif
a133dbce sago007 2016-03-26 10:05 723
}
a133dbce sago007 2016-03-26 10:05 724
a133dbce sago007 2016-03-26 10:05 725
NFont::Rectf NFont::drawBox(NFont_Target* dest, const Rectf& box, const Effect& effect, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 726
{
a133dbce sago007 2016-03-26 10:05 727
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 728
        return Rectf(box.x, box.y, 0, 0);
a133dbce sago007 2016-03-26 10:05 729
a133dbce sago007 2016-03-26 10:05 730
    va_list lst;
a133dbce sago007 2016-03-26 10:05 731
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 732
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 733
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 734
a133dbce sago007 2016-03-26 10:05 735
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 736
    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 737
    #else
a133dbce sago007 2016-03-26 10:05 738
    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 739
    #endif
a133dbce sago007 2016-03-26 10:05 740
}
a133dbce sago007 2016-03-26 10:05 741
a133dbce sago007 2016-03-26 10:05 742
NFont::Rectf NFont::drawColumn(NFont_Target* dest, float x, float y, Uint16 width, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 743
{
a133dbce sago007 2016-03-26 10:05 744
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 745
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 746
a133dbce sago007 2016-03-26 10:05 747
    va_list lst;
a133dbce sago007 2016-03-26 10:05 748
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 749
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 750
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 751
a133dbce sago007 2016-03-26 10:05 752
    return FC_DrawColumn(font, dest, x, y, width, "%s", buffer);
a133dbce sago007 2016-03-26 10:05 753
}
a133dbce sago007 2016-03-26 10:05 754
a133dbce sago007 2016-03-26 10:05 755
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 756
{
a133dbce sago007 2016-03-26 10:05 757
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 758
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 759
a133dbce sago007 2016-03-26 10:05 760
    va_list lst;
a133dbce sago007 2016-03-26 10:05 761
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 762
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 763
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 764
a133dbce sago007 2016-03-26 10:05 765
    return FC_DrawColumnAlign(font, dest, x, y, width, translate_enum_NFont_to_FC(align), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 766
}
a133dbce sago007 2016-03-26 10:05 767
a133dbce sago007 2016-03-26 10:05 768
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 769
{
a133dbce sago007 2016-03-26 10:05 770
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 771
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 772
a133dbce sago007 2016-03-26 10:05 773
    va_list lst;
a133dbce sago007 2016-03-26 10:05 774
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 775
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 776
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 777
a133dbce sago007 2016-03-26 10:05 778
    return FC_DrawColumnScale(font, dest, x, y, width, FC_MakeScale(scale.x, scale.y), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 779
}
a133dbce sago007 2016-03-26 10:05 780
a133dbce sago007 2016-03-26 10:05 781
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 782
{
a133dbce sago007 2016-03-26 10:05 783
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 784
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 785
a133dbce sago007 2016-03-26 10:05 786
    va_list lst;
a133dbce sago007 2016-03-26 10:05 787
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 788
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 789
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 790
a133dbce sago007 2016-03-26 10:05 791
    return FC_DrawColumnColor(font, dest, x, y, width, color.to_SDL_Color(), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 792
}
a133dbce sago007 2016-03-26 10:05 793
a133dbce sago007 2016-03-26 10:05 794
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 795
{
a133dbce sago007 2016-03-26 10:05 796
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 797
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 798
a133dbce sago007 2016-03-26 10:05 799
    va_list lst;
a133dbce sago007 2016-03-26 10:05 800
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 801
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 802
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 803
a133dbce sago007 2016-03-26 10:05 804
    #ifdef NFONT_USE_SDL_GPU
a133dbce sago007 2016-03-26 10:05 805
    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 806
    #else
a133dbce sago007 2016-03-26 10:05 807
    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 808
    #endif
a133dbce sago007 2016-03-26 10:05 809
}
a133dbce sago007 2016-03-26 10:05 810
a133dbce sago007 2016-03-26 10:05 811
a133dbce sago007 2016-03-26 10:05 812
a133dbce sago007 2016-03-26 10:05 813
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 814
{
a133dbce sago007 2016-03-26 10:05 815
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 816
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 817
a133dbce sago007 2016-03-26 10:05 818
    va_list lst;
a133dbce sago007 2016-03-26 10:05 819
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 820
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 821
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 822
a133dbce sago007 2016-03-26 10:05 823
    return FC_DrawScale(font, dest, x, y, FC_MakeScale(scale.x, scale.y), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 824
}
a133dbce sago007 2016-03-26 10:05 825
a133dbce sago007 2016-03-26 10:05 826
NFont::Rectf NFont::draw(NFont_Target* dest, float x, float y, AlignEnum align, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 827
{
a133dbce sago007 2016-03-26 10:05 828
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 829
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 830
a133dbce sago007 2016-03-26 10:05 831
    va_list lst;
a133dbce sago007 2016-03-26 10:05 832
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 833
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 834
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 835
a133dbce sago007 2016-03-26 10:05 836
    return FC_DrawAlign(font, dest, x, y, translate_enum_NFont_to_FC(align), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 837
}
a133dbce sago007 2016-03-26 10:05 838
a133dbce sago007 2016-03-26 10:05 839
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 840
{
a133dbce sago007 2016-03-26 10:05 841
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 842
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 843
a133dbce sago007 2016-03-26 10:05 844
    va_list lst;
a133dbce sago007 2016-03-26 10:05 845
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 846
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 847
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 848
a133dbce sago007 2016-03-26 10:05 849
    return FC_DrawColor(font, dest, x, y, color.to_SDL_Color(), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 850
}
a133dbce sago007 2016-03-26 10:05 851
a133dbce sago007 2016-03-26 10:05 852
a133dbce sago007 2016-03-26 10:05 853
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 854
{
a133dbce sago007 2016-03-26 10:05 855
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 856
        return Rectf(x, y, 0, 0);
a133dbce sago007 2016-03-26 10:05 857
a133dbce sago007 2016-03-26 10:05 858
    va_list lst;
a133dbce sago007 2016-03-26 10:05 859
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 860
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 861
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 862
a133dbce sago007 2016-03-26 10:05 863
    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 864
}
a133dbce sago007 2016-03-26 10:05 865
a133dbce sago007 2016-03-26 10:05 866
a133dbce sago007 2016-03-26 10:05 867
a133dbce sago007 2016-03-26 10:05 868
a133dbce sago007 2016-03-26 10:05 869
// Getters
a133dbce sago007 2016-03-26 10:05 870
a133dbce sago007 2016-03-26 10:05 871
a133dbce sago007 2016-03-26 10:05 872
NFont::FilterEnum NFont::getFilterMode() const
a133dbce sago007 2016-03-26 10:05 873
{
a133dbce sago007 2016-03-26 10:05 874
    FC_FilterEnum f = FC_GetFilterMode(font);
a133dbce sago007 2016-03-26 10:05 875
    if(f == FC_FILTER_LINEAR)
a133dbce sago007 2016-03-26 10:05 876
        return NFont::LINEAR;
a133dbce sago007 2016-03-26 10:05 877
    return NFont::NEAREST;
a133dbce sago007 2016-03-26 10:05 878
}
a133dbce sago007 2016-03-26 10:05 879
a133dbce sago007 2016-03-26 10:05 880
Uint16 NFont::getHeight() const
a133dbce sago007 2016-03-26 10:05 881
{
a133dbce sago007 2016-03-26 10:05 882
    return FC_GetLineHeight(font);
a133dbce sago007 2016-03-26 10:05 883
}
a133dbce sago007 2016-03-26 10:05 884
a133dbce sago007 2016-03-26 10:05 885
Uint16 NFont::getHeight(const char* formatted_text, ...) const
a133dbce sago007 2016-03-26 10:05 886
{
a133dbce sago007 2016-03-26 10:05 887
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 888
        return 0;
a133dbce sago007 2016-03-26 10:05 889
a133dbce sago007 2016-03-26 10:05 890
    va_list lst;
a133dbce sago007 2016-03-26 10:05 891
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 892
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 893
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 894
a133dbce sago007 2016-03-26 10:05 895
    return FC_GetHeight(font, "%s", buffer);
a133dbce sago007 2016-03-26 10:05 896
}
a133dbce sago007 2016-03-26 10:05 897
a133dbce sago007 2016-03-26 10:05 898
Uint16 NFont::getWidth(const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 899
{
a133dbce sago007 2016-03-26 10:05 900
    if (formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 901
        return 0;
a133dbce sago007 2016-03-26 10:05 902
a133dbce sago007 2016-03-26 10:05 903
    va_list lst;
a133dbce sago007 2016-03-26 10:05 904
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 905
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 906
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 907
a133dbce sago007 2016-03-26 10:05 908
    return FC_GetWidth(font, "%s", buffer);
a133dbce sago007 2016-03-26 10:05 909
}
a133dbce sago007 2016-03-26 10:05 910
a133dbce sago007 2016-03-26 10:05 911
a133dbce sago007 2016-03-26 10:05 912
NFont::Rectf NFont::getCharacterOffset(Uint16 position_index, int column_width, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 913
{
a133dbce sago007 2016-03-26 10:05 914
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 915
        return Rectf(0,0,0,0);
a133dbce sago007 2016-03-26 10:05 916
a133dbce sago007 2016-03-26 10:05 917
    va_list lst;
a133dbce sago007 2016-03-26 10:05 918
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 919
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 920
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 921
a133dbce sago007 2016-03-26 10:05 922
    return FC_GetCharacterOffset(font, position_index, column_width, "%s", buffer);
a133dbce sago007 2016-03-26 10:05 923
}
a133dbce sago007 2016-03-26 10:05 924
a133dbce sago007 2016-03-26 10:05 925
// 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 926
Uint16 NFont::getPositionFromOffset(float x, float y, int column_width, NFont::AlignEnum align, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 927
{
a133dbce sago007 2016-03-26 10:05 928
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 929
        return 0;
a133dbce sago007 2016-03-26 10:05 930
a133dbce sago007 2016-03-26 10:05 931
    va_list lst;
a133dbce sago007 2016-03-26 10:05 932
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 933
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 934
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 935
a133dbce sago007 2016-03-26 10:05 936
    return FC_GetPositionFromOffset(font, x, y, column_width, translate_enum_NFont_to_FC(align), "%s", buffer);
a133dbce sago007 2016-03-26 10:05 937
}
a133dbce sago007 2016-03-26 10:05 938
a133dbce sago007 2016-03-26 10:05 939
a133dbce sago007 2016-03-26 10:05 940
Uint16 NFont::getColumnHeight(Uint16 width, const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 941
{
a133dbce sago007 2016-03-26 10:05 942
    if(formatted_text == NULL || width == 0)
a133dbce sago007 2016-03-26 10:05 943
        return 0;
a133dbce sago007 2016-03-26 10:05 944
a133dbce sago007 2016-03-26 10:05 945
    va_list lst;
a133dbce sago007 2016-03-26 10:05 946
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 947
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 948
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 949
a133dbce sago007 2016-03-26 10:05 950
    return FC_GetColumnHeight(font, width, "%s", buffer);
a133dbce sago007 2016-03-26 10:05 951
}
a133dbce sago007 2016-03-26 10:05 952
a133dbce sago007 2016-03-26 10:05 953
int NFont::getAscent(const char character)
a133dbce sago007 2016-03-26 10:05 954
{
a133dbce sago007 2016-03-26 10:05 955
    return FC_GetAscent(font, "%c", character);
a133dbce sago007 2016-03-26 10:05 956
}
a133dbce sago007 2016-03-26 10:05 957
a133dbce sago007 2016-03-26 10:05 958
int NFont::getAscent() const
a133dbce sago007 2016-03-26 10:05 959
{
a133dbce sago007 2016-03-26 10:05 960
    return FC_GetAscent(font, NULL);
a133dbce sago007 2016-03-26 10:05 961
}
a133dbce sago007 2016-03-26 10:05 962
a133dbce sago007 2016-03-26 10:05 963
int NFont::getAscent(const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 964
{
a133dbce sago007 2016-03-26 10:05 965
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 966
        return FC_GetAscent(font, NULL);
a133dbce sago007 2016-03-26 10:05 967
a133dbce sago007 2016-03-26 10:05 968
    va_list lst;
a133dbce sago007 2016-03-26 10:05 969
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 970
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 971
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 972
a133dbce sago007 2016-03-26 10:05 973
    return FC_GetAscent(font, "%s", buffer);
a133dbce sago007 2016-03-26 10:05 974
}
a133dbce sago007 2016-03-26 10:05 975
a133dbce sago007 2016-03-26 10:05 976
int NFont::getDescent(const char character)
a133dbce sago007 2016-03-26 10:05 977
{
a133dbce sago007 2016-03-26 10:05 978
    return FC_GetDescent(font, "%c", character);
a133dbce sago007 2016-03-26 10:05 979
}
a133dbce sago007 2016-03-26 10:05 980
a133dbce sago007 2016-03-26 10:05 981
int NFont::getDescent() const
a133dbce sago007 2016-03-26 10:05 982
{
a133dbce sago007 2016-03-26 10:05 983
    return FC_GetDescent(font, NULL);
a133dbce sago007 2016-03-26 10:05 984
}
a133dbce sago007 2016-03-26 10:05 985
a133dbce sago007 2016-03-26 10:05 986
int NFont::getDescent(const char* formatted_text, ...)
a133dbce sago007 2016-03-26 10:05 987
{
a133dbce sago007 2016-03-26 10:05 988
    if(formatted_text == NULL)
a133dbce sago007 2016-03-26 10:05 989
        return FC_GetDescent(font, NULL);
a133dbce sago007 2016-03-26 10:05 990
a133dbce sago007 2016-03-26 10:05 991
    va_list lst;
a133dbce sago007 2016-03-26 10:05 992
    va_start(lst, formatted_text);
a133dbce sago007 2016-03-26 10:05 993
    vsnprintf(buffer, NFONT_BUFFER_SIZE, formatted_text, lst);
a133dbce sago007 2016-03-26 10:05 994
    va_end(lst);
a133dbce sago007 2016-03-26 10:05 995
a133dbce sago007 2016-03-26 10:05 996
    return FC_GetDescent(font, "%s", buffer);
a133dbce sago007 2016-03-26 10:05 997
}
a133dbce sago007 2016-03-26 10:05 998
a133dbce sago007 2016-03-26 10:05 999
int NFont::getSpacing() const
a133dbce sago007 2016-03-26 10:05 1000
{
a133dbce sago007 2016-03-26 10:05 1001
    return FC_GetSpacing(font);
a133dbce sago007 2016-03-26 10:05 1002
}
a133dbce sago007 2016-03-26 10:05 1003
a133dbce sago007 2016-03-26 10:05 1004
int NFont::getLineSpacing() const
a133dbce sago007 2016-03-26 10:05 1005
{
a133dbce sago007 2016-03-26 10:05 1006
    return FC_GetLineSpacing(font);
a133dbce sago007 2016-03-26 10:05 1007
}
a133dbce sago007 2016-03-26 10:05 1008
a133dbce sago007 2016-03-26 10:05 1009
Uint16 NFont::getBaseline() const
a133dbce sago007 2016-03-26 10:05 1010
{
a133dbce sago007 2016-03-26 10:05 1011
    return FC_GetBaseline(font);
a133dbce sago007 2016-03-26 10:05 1012
}
a133dbce sago007 2016-03-26 10:05 1013
a133dbce sago007 2016-03-26 10:05 1014
Uint16 NFont::getMaxWidth() const
a133dbce sago007 2016-03-26 10:05 1015
{
a133dbce sago007 2016-03-26 10:05 1016
    return FC_GetMaxWidth(font);
a133dbce sago007 2016-03-26 10:05 1017
}
a133dbce sago007 2016-03-26 10:05 1018
a133dbce sago007 2016-03-26 10:05 1019
NFont::Color NFont::getDefaultColor() const
a133dbce sago007 2016-03-26 10:05 1020
{
a133dbce sago007 2016-03-26 10:05 1021
    return FC_GetDefaultColor(font);
a133dbce sago007 2016-03-26 10:05 1022
}
a133dbce sago007 2016-03-26 10:05 1023
34c3d60c sago007 2016-12-23 16:31 1024
    
34c3d60c sago007 2016-12-23 16:31 1025
int NFont::getNumCacheLevels() const
34c3d60c sago007 2016-12-23 16:31 1026
{
34c3d60c sago007 2016-12-23 16:31 1027
    return FC_GetNumCacheLevels(font);
34c3d60c sago007 2016-12-23 16:31 1028
}
34c3d60c sago007 2016-12-23 16:31 1029
34c3d60c sago007 2016-12-23 16:31 1030
NFont_Image* NFont::getCacheLevel(int level) const
34c3d60c sago007 2016-12-23 16:31 1031
{
34c3d60c sago007 2016-12-23 16:31 1032
    return FC_GetGlyphCacheLevel(font, level);
34c3d60c sago007 2016-12-23 16:31 1033
}
34c3d60c sago007 2016-12-23 16:31 1034
a133dbce sago007 2016-03-26 10:05 1035
a133dbce sago007 2016-03-26 10:05 1036
a133dbce sago007 2016-03-26 10:05 1037
a133dbce sago007 2016-03-26 10:05 1038
a133dbce sago007 2016-03-26 10:05 1039
// Setters
a133dbce sago007 2016-03-26 10:05 1040
a133dbce sago007 2016-03-26 10:05 1041
void NFont::setFilterMode(NFont::FilterEnum filter)
a133dbce sago007 2016-03-26 10:05 1042
{
a133dbce sago007 2016-03-26 10:05 1043
    if(filter == NFont::LINEAR)
a133dbce sago007 2016-03-26 10:05 1044
        FC_SetFilterMode(font, FC_FILTER_LINEAR);
a133dbce sago007 2016-03-26 10:05 1045
    else
a133dbce sago007 2016-03-26 10:05 1046
        FC_SetFilterMode(font, FC_FILTER_NEAREST);
a133dbce sago007 2016-03-26 10:05 1047
}
a133dbce sago007 2016-03-26 10:05 1048
a133dbce sago007 2016-03-26 10:05 1049
void NFont::setSpacing(int LetterSpacing)
a133dbce sago007 2016-03-26 10:05 1050
{
a133dbce sago007 2016-03-26 10:05 1051
    FC_SetSpacing(font, LetterSpacing);
a133dbce sago007 2016-03-26 10:05 1052
}
a133dbce sago007 2016-03-26 10:05 1053
a133dbce sago007 2016-03-26 10:05 1054
void NFont::setLineSpacing(int LineSpacing)
a133dbce sago007 2016-03-26 10:05 1055
{
a133dbce sago007 2016-03-26 10:05 1056
    FC_SetLineSpacing(font, LineSpacing);
a133dbce sago007 2016-03-26 10:05 1057
}
a133dbce sago007 2016-03-26 10:05 1058
34c3d60c sago007 2016-12-23 16:31 1059
void NFont::setBaseline()
34c3d60c sago007 2016-12-23 16:31 1060
{
34c3d60c sago007 2016-12-23 16:31 1061
34c3d60c sago007 2016-12-23 16:31 1062
}
34c3d60c sago007 2016-12-23 16:31 1063
a133dbce sago007 2016-03-26 10:05 1064
void NFont::setDefaultColor(const Color& color)
a133dbce sago007 2016-03-26 10:05 1065
{
a133dbce sago007 2016-03-26 10:05 1066
    FC_SetDefaultColor(font, color.to_SDL_Color());
a133dbce sago007 2016-03-26 10:05 1067
}
a133dbce sago007 2016-03-26 10:05 1068
34c3d60c sago007 2016-12-23 16:31 1069
void NFont::enableTTFOwnership()
34c3d60c sago007 2016-12-23 16:31 1070
{
34c3d60c sago007 2016-12-23 16:31 1071
34c3d60c sago007 2016-12-23 16:31 1072
}
a133dbce sago007 2016-03-26 10:05 1073
a133dbce sago007 2016-03-26 10:05 1074
a133dbce sago007 2016-03-26 10:05 1075
a133dbce sago007 2016-03-26 10:05 1076
1970-01-01 00:00 1077