| 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 |
|