00001 #include <string.h> 00002 00003 #include <gccore.h> 00004 00005 #include "text.h" 00006 #include "colordefines.h" 00007 00008 #include "font_raw_bin.h" 00009 00010 u32* font_gfx = (u32*)font_raw_bin; 00011 00012 sletter letter[0x80]; // 128 00013 00014 /*char *_itoa(int n, char *buf, int radix) 00015 { 00016 char *ret = buf; 00017 char tmp[33]; 00018 int i = 0, j, r; 00019 // validate the conversion number base. 00020 if ((radix >= 2) && (radix <= 36)) { 00021 if ((radix == 10) && (n < 0)) { 00022 // negative integer value. 00023 *buf++ = '-'; 00024 n = -n; 00025 } 00026 do { 00027 // calculate the current digit. 00028 r = (int)((unsigned int)n % radix); 00029 tmp[i++] = ((r < 10) ? (r + '0') : (r - 10 + 'a')); 00030 } while (((unsigned int&)n /= radix) != 0); 00031 // reverse the buffer string. 00032 for (--i, j = 0; (i >= 0); --i, ++j) buf[j] = tmp[i]; 00033 buf[j] = 0; 00034 } 00035 return (ret); 00036 } 00037 00038 void WriteText(int x, int y, const char *text, unsigned int *fb, int flags, bool halfsize) 00039 { 00040 00041 if(x == TEXT_RIGHT) 00042 x = (flags&TEXT_VERTICAL) ? 640-16: 640-(strlen(text)*16); 00043 else if(x == TEXT_CENTER) 00044 x = 160-((strlen(text)*16) >> 1); 00045 else if(x == TEXT_LEFT) 00046 x = 0; 00047 00048 if(y == TEXT_TOP) 00049 y=0; 00050 else if(y == TEXT_CENTER) 00051 y=(480 >> 1)-(25 >> 1); 00052 else if(y == TEXT_BOTTOM) 00053 y=(flags&TEXT_VERTICAL) ? 480-(strlen(text)*25) : 480-25; 00054 00055 int startx, starty; 00056 int pos = 0; 00057 unsigned int color1, color2; 00058 00059 // Character dimensions hard-coded to W x H = 16 x 25. 00060 // In order to shrink text size, must do sampling algorithm, e.g.: 00061 // average every 2x2 pixel grid into one pixel. 00062 00063 while(text[pos] != 0x0) 00064 { 00065 00066 startx = letter[(u32)text[pos]].x / 2; 00067 starty = letter[(u32)text[pos]].y; 00068 00069 for(int newy = 0; newy < (halfsize ? 24 : 25); newy++) 00070 { 00071 for(int newx = 0; newx < 16; newx++) 00072 { 00073 if (!halfsize) 00074 { 00075 color1 = font_gfx[(newx+startx)+(newy+starty)*160]; 00076 00077 if (color1 != COLOR_BLACK) 00078 { 00079 if (flags & TEXT_VERTICAL) 00080 fb[x + newx + (y + newy + pos * 25) * 320] = color1; 00081 else 00082 fb[(x+newx+pos*16)+(y+newy)*320] = color1; 00083 } 00084 } 00085 else // draw half-sized text 00086 { 00087 color1 = GetAverageColor(font_gfx[(newx+startx)+(newy+starty)*160], 00088 font_gfx[(newx+1+startx)+(newy+starty)*160]); 00089 color2 = GetAverageColor(font_gfx[(newx+startx)+(newy+1+starty)*160], 00090 font_gfx[(newx+1+startx)+(newy+1+starty)*160]); 00091 color1 = GetAverageColor(color1, color2); 00092 00093 int halfx = newx++ / 2; 00094 int halfy = newy / 2; 00095 00096 if (color1 != COLOR_BLACK) 00097 { 00098 if (flags & TEXT_VERTICAL) 00099 fb[x + halfx + (y + halfy + pos * 25) * 320] = color1; 00100 else 00101 fb[(x + halfx + pos * 16) + (y + halfy) * 320] = color1; 00102 } 00103 } 00104 } 00105 if (halfsize) 00106 ++newy; 00107 } 00108 pos++; 00109 } 00110 } 00111 00112 00113 int WriteNum(int x, int y, int num, unsigned int *fb, int flags, bool halfsize) 00114 { 00115 char buffer[20]; 00116 00117 if(flags&HEX) 00118 _itoa(num,buffer,16); 00119 else if(flags&BASE8) 00120 _itoa(num,buffer,8); 00121 else if(flags&BASE2) 00122 _itoa(num,buffer,2); 00123 else 00124 _itoa(num,buffer,10); 00125 00126 WriteText(x,y,buffer,fb,flags,halfsize); 00127 00128 return strlen(buffer); 00129 } 00130 00131 void SetupLetters() 00132 { 00133 letter[' '].x=0; 00134 letter[' '].y=0; 00135 00136 letter['a'].x=96; 00137 letter['a'].y=75; 00138 00139 letter['b'].x=128; 00140 letter['b'].y=75; 00141 00142 letter['c'].x=160; 00143 letter['c'].y=75; 00144 00145 letter['d'].x=192; 00146 letter['d'].y=75; 00147 00148 letter['e'].x=224; 00149 letter['e'].y=75; 00150 00151 letter['f'].x=256; 00152 letter['f'].y=75; 00153 00154 letter['g'].x=288; 00155 letter['g'].y=75; 00156 00157 letter['h'].x=0; 00158 letter['h'].y=100; 00159 00160 letter['i'].x=32; 00161 letter['i'].y=100; 00162 00163 letter['j'].x=64; 00164 letter['j'].y=100; 00165 00166 letter['k'].x=96; 00167 letter['k'].y=100; 00168 00169 letter['l'].x=128; 00170 letter['l'].y=100; 00171 00172 letter['m'].x=160; 00173 letter['m'].y=100; 00174 00175 letter['n'].x=192; 00176 letter['n'].y=100; 00177 00178 letter['o'].x=224; 00179 letter['o'].y=100; 00180 00181 letter['p'].x=256; 00182 letter['p'].y=100; 00183 00184 letter['q'].x=288; 00185 letter['q'].y=100; 00186 00187 letter['r'].x=0; 00188 letter['r'].y=125; 00189 00190 letter['s'].x=32; 00191 letter['s'].y=125; 00192 00193 letter['t'].x=64; 00194 letter['t'].y=125; 00195 00196 letter['u'].x=96; 00197 letter['u'].y=125; 00198 00199 letter['v'].x=128; 00200 letter['v'].y=125; 00201 00202 letter['w'].x=160; 00203 letter['w'].y=125; 00204 00205 letter['x'].x=192; 00206 letter['x'].y=125; 00207 00208 letter['y'].x=224; 00209 letter['y'].y=125; 00210 00211 letter['z'].x=256; 00212 letter['z'].y=125; 00213 00214 letter['!'].x=32; 00215 letter['!'].y=0; 00216 00217 letter['"'].x=64; 00218 letter['"'].y=0; 00219 00220 letter['#'].x=96; 00221 letter['#'].y=0; 00222 00223 letter['$'].x=128; 00224 letter['$'].y=0; 00225 00226 letter['%'].x=160; 00227 letter['%'].y=0; 00228 00229 letter['&'].x=192; 00230 letter['&'].y=0; 00231 00232 letter['\''].x=224; 00233 letter['\''].y=0; 00234 00235 letter['('].x=256; 00236 letter['('].y=0; 00237 00238 letter[')'].x=288; 00239 letter[')'].y=0; 00240 00241 letter['*'].x=0; 00242 letter['*'].y=25; 00243 00244 letter['+'].x=32; 00245 letter['+'].y=25; 00246 00247 letter[','].x=64; 00248 letter[','].y=25; 00249 00250 letter['-'].x=96; 00251 letter['-'].y=25; 00252 00253 letter['.'].x=128; 00254 letter['.'].y=25; 00255 00256 letter['/'].x=160; 00257 letter['/'].y=25; 00258 00259 letter['0'].x=192; 00260 letter['0'].y=25; 00261 00262 letter['1'].x=224; 00263 letter['1'].y=25; 00264 00265 letter['2'].x=256; 00266 letter['2'].y=25; 00267 00268 letter['3'].x=288; 00269 letter['3'].y=25; 00270 00271 letter['4'].x=0; 00272 letter['4'].y=50; 00273 00274 letter['5'].x=32; 00275 letter['5'].y=50; 00276 00277 letter['6'].x=64; 00278 letter['6'].y=50; 00279 00280 letter['7'].x=96; 00281 letter['7'].y=50; 00282 00283 letter['8'].x=128; 00284 letter['8'].y=50; 00285 00286 letter['9'].x=160; 00287 letter['9'].y=50; 00288 00289 letter[':'].x=192; 00290 letter[':'].y=50; 00291 00292 letter[';'].x=224; 00293 letter[';'].y=50; 00294 00295 letter['<'].x=256; 00296 letter['<'].y=50; 00297 00298 letter['='].x=288; 00299 letter['='].y=50; 00300 00301 letter['>'].x=0; 00302 letter['>'].y=75; 00303 00304 letter['?'].x=32; 00305 letter['?'].y=75; 00306 00307 letter['@'].x=64; 00308 letter['@'].y=75; 00309 } 00310 00311 #define BYTE1 0x000000FF 00312 #define BYTE2 0x0000FF00 00313 #define BYTE3 0x00FF0000 00314 #define BYTE4 0xFF000000 00315 00316 // COLOR_BLACK 0x00800080 00317 unsigned int GetAverageColor(unsigned int color1, unsigned int color2) 00318 { 00319 unsigned int color = 0x00000000; 00320 unsigned int color1byte, color2byte; 00321 00322 // average byte 1 00323 color1byte = color1 & BYTE1; 00324 color2byte = color2 & BYTE1; 00325 color1byte = (color1byte + color2byte) / 2; // use >> instead? 00326 color += color1byte; 00327 00328 // average byte 2 00329 color1byte = color1 & BYTE2; 00330 color2byte = color2 & BYTE2; 00331 color1byte = (color1byte + color2byte) / 2; // use >> instead? 00332 color += color1byte; 00333 00334 // average byte 3 00335 color1byte = color1 & BYTE3; 00336 color2byte = color2 & BYTE3; 00337 color1byte = (color1byte + color2byte) / 2; // use >> instead? 00338 color += color1byte; 00339 00340 // average byte 4 00341 color1byte = color1 & BYTE4; 00342 color2byte = color2 & BYTE4; 00343 color1byte = (color1byte + color2byte) / 2; // use >> instead? 00344 color += color1byte; 00345 00346 return color; 00347 }*/