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