00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include <ctype.h>
00016 #include "win_ttf.h"
00017
00018
00019 u_int32 win_ttf::refcount = 0;
00020
00021 TTF_Font *win_ttf::ttf = NULL;
00022
00023
00024 win_ttf::win_ttf (const char *color, const string & file) : win_font ()
00025 {
00026 switch (color[0])
00027 {
00028 case 'r':
00029 Color.r = 255; Color.g = 173; Color.b = 123;
00030 break;
00031 case 'b':
00032 Color.r = 139; Color.g = 185; Color.b = 238;
00033 break;
00034 case 'g':
00035 Color.r = 205; Color.g = 254; Color.b = 148;
00036 break;
00037 case 'y':
00038 Color.r = 255; Color.g = 238; Color.b = 123;
00039 break;
00040 case 'v':
00041 Color.r = 222; Color.g = 133; Color.b = 230;
00042 break;
00043 default:
00044 Color.r = 255; Color.g = 255; Color.b = 255;
00045 break;
00046 }
00047
00048 refcount++;
00049
00050 if (load (file))
00051 {
00052 u_int16 real_height_ = TTF_FontAscent (ttf);
00053 height_ = screen::dbl_mode () ? (real_height_+3) >> 1 : real_height_+1;
00054 cursor = &operator[]('_');
00055 length_ = cursor->length ();
00056 }
00057
00058 else win_font::load ((char *) color);
00059 }
00060
00061 win_ttf::~win_ttf ()
00062 {
00063 refcount--;
00064 cursor = NULL;
00065 if (refcount == 0 && ttf != NULL)
00066 TTF_CloseFont (ttf);
00067 }
00068
00069 bool win_ttf::load (const string & file)
00070 {
00071 string path;
00072
00073
00074 u_int32 size = screen::dbl_mode () ? 22 : 12;
00075
00076
00077 if (ttf != NULL) return true;
00078
00079
00080 if (file != "" && file[0] == '/')
00081 {
00082 path = file;
00083 }
00084 else
00085 {
00086
00087 path = WIN_DIRECTORY;
00088
00089
00090 path += WIN_FONT_DIRECTORY;
00091
00092
00093 path += file == "" ? "avatar.ttf" : file;
00094 }
00095
00096
00097 ttf = TTF_OpenFont (path.c_str (), size);
00098
00099 if (ttf == NULL)
00100 {
00101 printf ("*** error loading font '%s':\n %s\n", path.c_str (), TTF_GetError ());
00102 return false;
00103 }
00104
00105
00106 while (TTF_FontAscent (ttf) > (screen::dbl_mode () ? 24 : 13)) {
00107 TTF_CloseFont (ttf);
00108 TTF_OpenFont (path.c_str (), --size);
00109 }
00110
00111 return true;
00112 }
00113
00114 bool win_ttf::in_table(u_int16 tmp)
00115 {
00116 if (win_font::in_table (tmp) == true) return true;
00117
00118
00119 if (tmp > 0x80 || isprint (tmp)) {
00120 operator[](tmp);
00121 return true;
00122 }
00123 return false;
00124 }
00125
00126 image & win_ttf::operator[](u_int16 glyph)
00127 {
00128 static u_int16 unichar[2] = { 0, 0 };
00129 unichar[0] = glyph;
00130
00131 static SDL_Color bg = { 0x00, 0x00, 0x00, 0 };
00132 static SDL_Color white = { 0xff, 0xff, 0xff, 0 };
00133 if (win_font::in_table (glyph)) return *(glyphs[glyph]);
00134 if (ttf == NULL) return *(glyphs[' ']);
00135
00136 SDL_Surface *s = TTF_RenderUNICODE_Shaded (ttf, unichar, Color, bg);
00137 if (s == NULL) return *(glyphs[' ']);
00138
00139 image tmp (s, bg);
00140 image *glph = new image (tmp.length(), height_, false);
00141 glph->fillrect (0, 0, tmp.length()+1, height_+1, screen::trans_col(), NULL);
00142
00143 s = TTF_RenderUNICODE_Solid (ttf, unichar, bg);
00144 if (s != NULL)
00145 {
00146 image shadow (s, white);
00147 shadow.draw (1, 1+height_-shadow.height(), 0, 0, shadow.length(), shadow.height(), NULL, glph);
00148 }
00149 else
00150 {
00151 fprintf (stderr, "%s\n", TTF_GetError ());
00152 }
00153
00154 tmp.draw (0, height_-tmp.height(), 0, 0, tmp.length(), tmp.height(), NULL, glph);
00155 glyphs[glyph] = glph;
00156
00157 return *glph;
00158 }
00159