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