1 #include "VariableWidthSpriteFont.h"
2 #include <string>
3 #include <string.h>
4 #include "color.h"
5
6
7
VariableWidthSpriteFontRenderer(IAGSEngine * engine)8 VariableWidthSpriteFontRenderer::VariableWidthSpriteFontRenderer(IAGSEngine *engine)
9 {
10 _engine = engine;
11 }
12
13
~VariableWidthSpriteFontRenderer(void)14 VariableWidthSpriteFontRenderer::~VariableWidthSpriteFontRenderer(void)
15 {
16 }
17
18
19
20
SupportsExtendedCharacters(int fontNumber)21 bool VariableWidthSpriteFontRenderer::SupportsExtendedCharacters(int fontNumber) { return false; }
22
GetTextWidth(const char * text,int fontNumber)23 int VariableWidthSpriteFontRenderer::GetTextWidth(const char *text, int fontNumber)
24 {
25 int total = 0;
26 VariableWidthFont *font = getFontFor(fontNumber);
27 for(int i = 0; i < strlen(text); i++)
28 {
29 if (font->characters.count(text[i]) > 0)
30 {
31 total += font->characters[text[i]].Width;
32 if (text[i] != ' ') total += font->Spacing;
33 }
34 }
35 return total;
36 }
37
GetTextHeight(const char * text,int fontNumber)38 int VariableWidthSpriteFontRenderer::GetTextHeight(const char *text, int fontNumber)
39 {
40 VariableWidthFont *font = getFontFor(fontNumber);
41 for(int i = 0; i < strlen(text); i++)
42 {
43 if (font->characters.count(text[i]) > 0)
44 {
45 return font->characters[text[i]].Height;
46 }
47 }
48 return 0;
49 }
50
SetSpacing(int fontNum,int spacing)51 void VariableWidthSpriteFontRenderer::SetSpacing(int fontNum, int spacing)
52 {
53 VariableWidthFont *font = getFontFor(fontNum);
54 font->Spacing = spacing;
55
56
57 }
58
EnsureTextValidForFont(char * text,int fontNumber)59 void VariableWidthSpriteFontRenderer::EnsureTextValidForFont(char *text, int fontNumber)
60 {
61 VariableWidthFont *font = getFontFor(fontNumber);
62 std::string s(text);
63
64 for(int i = s.length() - 1; i >= 0 ; i--)
65 {
66 if (font->characters.count(s[i]) == 0)
67 {
68 s.erase(i,1);
69 }
70 }
71 text = strcpy(text,s.c_str());
72
73 }
74
SetGlyph(int fontNum,int charNum,int x,int y,int width,int height)75 void VariableWidthSpriteFontRenderer::SetGlyph(int fontNum, int charNum, int x, int y, int width, int height)
76 {
77 VariableWidthFont *font = getFontFor(fontNum);
78 font->SetGlyph(charNum, x, y, width, height);
79 }
80
81
SetSprite(int fontNum,int spriteNum)82 void VariableWidthSpriteFontRenderer::SetSprite(int fontNum, int spriteNum)
83 {
84 VariableWidthFont *font = getFontFor(fontNum);
85 font->SpriteNumber = spriteNum;
86 }
87
getFontFor(int fontNum)88 VariableWidthFont *VariableWidthSpriteFontRenderer::getFontFor(int fontNum){
89 VariableWidthFont *font;
90 for (int i = 0; i < _fonts.size(); i ++)
91 {
92 font = _fonts.at(i);
93 if (font->FontReplaced == fontNum) return font;
94 }
95 //not found
96 font = new VariableWidthFont;
97 font->FontReplaced = fontNum;
98 _fonts.push_back(font);
99 return font;
100 }
101
RenderText(const char * text,int fontNumber,BITMAP * destination,int x,int y,int colour)102 void VariableWidthSpriteFontRenderer::RenderText(const char *text, int fontNumber, BITMAP *destination, int x, int y, int colour)
103 {
104 VariableWidthFont *font = getFontFor(fontNumber);
105 int totalWidth = 0;
106 for(int i = 0; i < strlen(text); i++)
107 {
108 char c = text[i];
109
110 BITMAP *src = _engine->GetSpriteGraphic(font->SpriteNumber);
111 Draw(src, destination, x + totalWidth, y, font->characters[c].X, font->characters[c].Y, font->characters[c].Width, font->characters[c].Height);
112 totalWidth += font->characters[c].Width;
113 if (text[i] != ' ') totalWidth += font->Spacing;
114 }
115
116 }
117
118
Draw(BITMAP * src,BITMAP * dest,int destx,int desty,int srcx,int srcy,int width,int height)119 void VariableWidthSpriteFontRenderer::Draw(BITMAP *src, BITMAP *dest, int destx, int desty, int srcx, int srcy, int width, int height)
120 {
121
122 int srcWidth, srcHeight, destWidth, destHeight, srcColDepth, destColDepth;
123
124 unsigned char **srccharbuffer = _engine->GetRawBitmapSurface (src); //8bit
125 unsigned short **srcshortbuffer = (unsigned short**)srccharbuffer; //16bit;
126 unsigned int **srclongbuffer = (unsigned int**)srccharbuffer; //32bit
127
128 unsigned char **destcharbuffer = _engine->GetRawBitmapSurface (dest); //8bit
129 unsigned short **destshortbuffer = (unsigned short**)destcharbuffer; //16bit;
130 unsigned int **destlongbuffer = (unsigned int**)destcharbuffer; //32bit
131
132 int transColor = _engine->GetBitmapTransparentColor(src);
133
134 _engine->GetBitmapDimensions(src, &srcWidth, &srcHeight, &srcColDepth);
135 _engine->GetBitmapDimensions(dest, &destWidth, &destHeight, &destColDepth);
136
137 if (srcy + height > srcHeight || srcx + width > srcWidth || srcx < 0 || srcy < 0) return;
138
139 if (width + destx > destWidth) width = destWidth - destx;
140 if (height + desty > destHeight) height = destHeight - desty;
141
142 int startx = MAX(0, (-1 * destx));
143 int starty = MAX(0, (-1 * desty));
144
145
146 int srca, srcr, srcg, srcb, desta, destr, destg, destb, finalr, finalg, finalb, finala, col;
147
148 for(int x = startx; x < width; x ++)
149 {
150
151 for(int y = starty; y < height; y ++)
152 {
153 int srcyy = y + srcy;
154 int srcxx = x + srcx;
155 int destyy = y + desty;
156 int destxx = x + destx;
157 if (destColDepth == 8)
158 {
159 if (srccharbuffer[srcyy][srcxx] != transColor) destcharbuffer[destyy][destxx] = srccharbuffer[srcyy][srcxx];
160 }
161 else if (destColDepth == 16)
162 {
163 if (srcshortbuffer[srcyy][srcxx] != transColor) destshortbuffer[destyy][destxx] = srcshortbuffer[srcyy][srcxx];
164 }
165 else if (destColDepth == 32)
166 {
167 //if (srclongbuffer[srcyy][srcxx] != transColor) destlongbuffer[destyy][destxx] = srclongbuffer[srcyy][srcxx];
168
169 srca = (geta32(srclongbuffer[srcyy][srcxx]));
170
171 if (srca != 0) {
172
173 srcr = getr32(srclongbuffer[srcyy][srcxx]);
174 srcg = getg32(srclongbuffer[srcyy][srcxx]);
175 srcb = getb32(srclongbuffer[srcyy][srcxx]);
176
177 destr = getr32(destlongbuffer[destyy][destxx]);
178 destg = getg32(destlongbuffer[destyy][destxx]);
179 destb = getb32(destlongbuffer[destyy][destxx]);
180 desta = geta32(destlongbuffer[destyy][destxx]);
181
182
183 finalr = srcr;
184 finalg = srcg;
185 finalb = srcb;
186
187
188 finala = 255-(255-srca)*(255-desta)/255;
189 finalr = srca*finalr/finala + desta*destr*(255-srca)/finala/255;
190 finalg = srca*finalg/finala + desta*destg*(255-srca)/finala/255;
191 finalb = srca*finalb/finala + desta*destb*(255-srca)/finala/255;
192 col = makeacol32(finalr, finalg, finalb, finala);
193 destlongbuffer[destyy][destxx] = col;
194 }
195
196 }
197 }
198 }
199
200 _engine->ReleaseBitmapSurface(src);
201 _engine->ReleaseBitmapSurface(dest);
202
203
204
205 }
206
207