git repos / blockattack-game

blame: source/code/Libs/NFont.cpp

normal view · raw

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