git repos / blockattack-game

blame: source/code/Libs/NFont.cpp

normal view · raw

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