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