00001
00002 #include "Stroke.h"
00003
00004 #define PT CharPoint::PT
00005 #define STROKE CharPoint::STROKE
00006 #define END CharPoint::END
00007
00008
00009 GLuint Stroke::mFontBases[FONT_SIZE_MAX + 1] = { 0, 0, 0, 0, 0, 0};
00010
00011 CP Adata[] = {
00012 { 0, 0, PT}, {0, 9, PT}, {1, 10, PT}, {4, 10, PT},
00013 {5, 9, PT}, {5, 0, STROKE}, {0, 5, PT}, {5, 5, END}
00014 };
00015
00016 CP Bdata[] = {
00017 {0, 0, PT}, {0, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 6, PT},
00018 {4, 5, PT}, {0, 5, STROKE}, {4, 5, PT}, {5, 4, PT}, {5, 1, PT},
00019 {4, 0, PT}, {0, 0, END}
00020 };
00021
00022 CP Cdata[] = {
00023 {5, 1, PT}, {4, 0, PT}, {1, 0, PT}, {0, 1, PT}, {0, 9, PT},
00024 {1, 10, PT}, {4, 10, PT}, {5, 9, END}
00025 };
00026
00027 CP Ddata[] = {
00028 { 0, 0, PT}, {0, 10, PT}, {1, 10, PT}, {4, 10, PT},
00029 {5, 9, PT}, {5, 1, PT}, {4, 0, PT}, {0, 0, END}
00030 };
00031
00032 CP Edata[] = {
00033 {5, 0, PT}, {0, 0, PT}, {0, 10, PT}, {5, 10, STROKE},
00034 {0, 5, PT}, {4, 5, END}
00035 };
00036
00037 CP Fdata[] = {
00038 {0, 0, PT}, {0, 10, PT}, {5, 10, STROKE},
00039 {0, 5, PT}, {4, 5, END}
00040 };
00041
00042 CP Gdata[] = {
00043 {2.5, 5, PT}, {5, 5, PT},
00044 {5, 1, PT}, {4, 0, PT}, {1, 0, PT}, {0, 1, PT},
00045 {0, 1, PT}, {0, 9, PT}, {1, 10, PT}, {4, 10, PT},
00046 {5, 9, END}
00047 };
00048
00049 CP Hdata[] = {
00050 { 0, 0, PT}, {0, 10, STROKE},
00051 {5, 0, PT}, {5, 10, STROKE}, {0, 5, PT}, {5, 5, END}
00052 };
00053
00054 CP Idata[] = {
00055 { 2.5, 0, PT}, {2.5, 10, END}
00056 };
00057
00058 CP Jdata[] = {
00059 {5, 10, PT}, {5, 1, PT}, {4, 0, PT}, {1, 0, PT}, {0, 1, PT},
00060 {0, 2, END}
00061 };
00062
00063 CP Kdata[] = {
00064 { 0, 0, PT}, {0, 10, STROKE},
00065 {0, 5, PT}, {4, 5, PT}, {5, 4, PT}, {5, 0, STROKE},
00066 {3, 5, PT}, {5, 7, PT}, {5, 10, END}
00067 };
00068
00069 CP Ldata[] = {
00070 {5, 0, PT}, {0, 0, PT}, {0, 10, END}
00071 };
00072
00073 CP Mdata[] = {
00074 { 0, 0, PT}, {0, 10, PT},
00075 {2.5, 5, PT}, {5, 10, PT}, {5, 0, END}
00076 };
00077
00078 CP Ndata[] = {
00079 { 0, 0, PT}, {0, 10, PT},
00080 {5, 0, PT}, {5, 10, END}
00081 };
00082
00083 CP Odata[] = {
00084 { 0, 1, PT}, {0, 9, PT}, {1, 10, PT}, {4, 10, PT},
00085 {5, 9, PT}, {5, 1, PT}, {4, 0, PT}, {1, 0, PT}, {0, 1, END}
00086 };
00087
00088 CP Qdata[] = {
00089 { 0, 1, PT}, {0, 9, PT}, {1, 10, PT}, {4, 10, PT},
00090 {5, 9, PT}, {5, 1, PT}, {4, 0, PT}, {1, 0, PT}, {0, 1, STROKE},
00091 {6, -1, PT}, {3, 3, END}
00092 };
00093
00094 CP Pdata[] = {
00095 {0, 0, PT}, {0, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 6, PT},
00096 {4, 5, PT}, {0, 5, END}
00097 };
00098
00099 CP Rdata[] = {
00100 {0, 0, PT}, {0, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 6, PT},
00101 {4, 5, PT}, {0, 5, STROKE}, {3, 5, PT}, {5, 0, END}
00102 };
00103
00104 CP Sdata[] = {
00105 {0, 1, PT}, {1, 0, PT}, {4, 0, PT}, {5, 1, PT}, {5, 4, PT},
00106 {4, 5, PT}, {1, 5, PT}, {0, 6, PT}, {0, 9, PT}, {1, 10, PT},
00107 {4, 10, PT}, {5, 9, END}
00108 };
00109
00110 CP Tdata[] = {
00111 {0, 10, PT}, {5, 10, STROKE}, {2.5, 0, PT}, {2.5, 10, END}
00112 };
00113
00114 CP Udata[] = {
00115 {0, 10, PT}, {0, 1, PT}, {1, 0, PT}, {4, 0, PT}, {5, 1, PT},
00116 {5, 10, END}
00117 };
00118
00119 CP Vdata[] = {
00120 {0, 10, PT}, {2.5, 0, PT},
00121 {5, 10, END}
00122 };
00123
00124 CP Wdata[] = {
00125 {0, 10, PT}, {1, 0, PT}, {2.5, 10, PT},
00126 {4, 0, PT}, {5, 10, END}
00127 };
00128
00129 CP Xdata[] = {
00130 {0, 10, PT}, {5, 0, STROKE}, {5, 10, PT},
00131 {0, 0, END}
00132 };
00133
00134 CP Ydata[] = {
00135 {5, 10, PT}, {2.5, 5, PT}, {0, 10, STROKE}, {2.5, 5, PT}, {2.5, 0, END}
00136 };
00137
00138 CP Zdata[] = {
00139 {0, 10, PT}, {5, 10, PT}, {0, 0, PT}, {5, 0, END}
00140 };
00141
00142
00143 CP DOTdata[] = {
00144 {2, 0, PT}, {3, 1, STROKE}, {3, 0, PT}, {2, 1, END}
00145 };
00146
00147
00148 CP DOT2data[] = {
00149 {2, 1, PT}, {3, 2, STROKE}, {3, 1, PT}, {2, 2, STROKE},
00150 {2, 9, PT}, {3, 8, STROKE}, {3, 9, PT}, {2, 8, END},
00151 };
00152
00153
00154 CP N0data[] = {
00155 { 0, 1, PT}, {0, 9, PT}, {1, 10, PT}, {4, 10, PT},
00156 {5, 9, PT}, {5, 1, PT}, {4, 0, PT}, {1, 0, PT}, {0, 1, STROKE},
00157 {0.5, 0.5, PT}, {4.5, 9.5, END}
00158 };
00159
00160 CP N1data[] = {
00161 {0, 7, PT}, {2.5, 10, PT}, {2.5, 0, END}
00162 };
00163
00164 CP N2data[] = {
00165 {0, 9, PT}, {1, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 6, PT},
00166 {4, 5, PT}, {1, 5, PT}, {0, 4, PT}, {0, 1, PT}, {1, 0, PT}, {5, 0, END}
00167 };
00168
00169
00170 CP N3data[] = {
00171 {0, 9, PT}, {1, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 6, PT},
00172 {4, 5, PT}, {1, 5, STROKE}, {4, 5, PT}, {5, 4, PT}, {5, 1, PT}, {4, 0, PT},
00173 {1, 0, PT}, {0, 1, END}
00174 };
00175
00176
00177
00178 CP N4data[] = {
00179 {0, 10, PT}, {0, 6, PT}, {1, 5, PT}, {5, 5, STROKE}, {5, 10, PT},
00180 {5, 0, END}
00181 };
00182
00183 CP N5data[] = {
00184 {5, 10, PT}, {0, 10, PT}, {0, 5, PT}, {4, 5, PT},
00185 {5, 4, PT}, {5, 1, PT}, {4, 0, PT}, {0, 0, END}
00186 };
00187
00188 CP N6data[] = {
00189 {0, 5, PT}, {4, 5, PT}, {5, 4, PT}, {5, 1, PT},
00190 {4, 0, PT}, {1, 0, PT}, {0, 1, PT}, {0, 9, PT},
00191 {1, 10, PT}, {4, 10, PT}, {5, 9, END}
00192 };
00193
00194
00195 CP N7data[] = {
00196 {0, 10, PT}, {5, 10, PT}, {2.5, 0, END}
00197 };
00198
00199 CP N8data[] = {
00200 {4, 5, PT}, {1, 5, PT}, {0, 6, PT}, {0, 9, PT},
00201 {1, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 6, PT},
00202 {4, 5, PT}, {5, 4, PT}, {5, 1, PT}, {4, 0, PT}, {1, 0, PT},
00203 {0, 1, PT}, {0, 4, PT}, {1, 5, END}
00204 };
00205
00206
00207 CP N9data[] = {
00208 {5, 5, PT}, {1, 5, PT}, {0, 6, PT}, {0, 9, PT},
00209 {1, 10, PT}, {4, 10, PT}, {5, 9, PT}, {5, 1, PT},
00210 {4, 0, PT}, {1, 0, PT}, {0, 1, END}
00211 };
00212
00213 CP KAPAdata[] = {
00214 { 0, 0, PT}, {2, 10, PT}, {5, 0, END}
00215 };
00216
00217 Stroke::Stroke(int fsize)
00218 : mbInitialized(false)
00219 {
00220 SetFontSize(fsize);
00221 }
00222
00223 void Stroke::SetFontSize(int fsize)
00224 {
00225 mFontSize = fsize;
00226 mProportion = (double)fsize / 10;
00227 }
00228
00229 int Stroke::FontWidth() const
00230 {
00231 return (int)(mProportion * 8);
00232 }
00233
00236 void Stroke::DrawLetter(CP *l)
00237 {
00238 glBegin(GL_LINE_STRIP);
00239 while (1) {
00240 switch (l->type) {
00241 case PT:
00242 glVertex2f(l->x * mProportion, l->y * mProportion);
00243 break;
00244 case STROKE:
00245 glVertex2f(l->x * mProportion, l->y * mProportion);
00246 glEnd();
00247 glBegin(GL_LINE_STRIP);
00248 break;
00249 case END:
00250 glVertex2f(l->x * mProportion, l->y * mProportion);
00251 glEnd();
00252 glTranslatef(8.0 * mProportion, 0.0, 0.0);
00253 return;
00254 }
00255 l++;
00256 }
00257 }
00258
00259 bool Stroke::Init()
00260 {
00261 if (mbInitialized)
00262 return true;
00263
00264 if (mFontBases[mFontSize])
00265 {
00266 mBase = mFontBases[mFontSize];
00267 }
00268 else
00269 {
00270 mBase = glGenLists (128);
00271 if (mBase == 0)
00272 return false;
00273
00274 mFontBases[mFontSize] = mBase;
00275 glListBase(mBase);
00276 glNewList(mBase+'A', GL_COMPILE); DrawLetter(Adata); glEndList();
00277 glNewList(mBase+'B', GL_COMPILE); DrawLetter(Bdata); glEndList();
00278 glNewList(mBase+'C', GL_COMPILE); DrawLetter(Cdata); glEndList();
00279 glNewList(mBase+'D', GL_COMPILE); DrawLetter(Ddata); glEndList();
00280 glNewList(mBase+'E', GL_COMPILE); DrawLetter(Edata); glEndList();
00281 glNewList(mBase+'F', GL_COMPILE); DrawLetter(Fdata); glEndList();
00282 glNewList(mBase+'G', GL_COMPILE); DrawLetter(Gdata); glEndList();
00283 glNewList(mBase+'H', GL_COMPILE); DrawLetter(Hdata); glEndList();
00284 glNewList(mBase+'I', GL_COMPILE); DrawLetter(Idata); glEndList();
00285 glNewList(mBase+'J', GL_COMPILE); DrawLetter(Jdata); glEndList();
00286 glNewList(mBase+'K', GL_COMPILE); DrawLetter(Kdata); glEndList();
00287 glNewList(mBase+'M', GL_COMPILE); DrawLetter(Mdata); glEndList();
00288 glNewList(mBase+'N', GL_COMPILE); DrawLetter(Ndata); glEndList();
00289 glNewList(mBase+'L', GL_COMPILE); DrawLetter(Ldata); glEndList();
00290 glNewList(mBase+'O', GL_COMPILE); DrawLetter(Odata); glEndList();
00291 glNewList(mBase+'P', GL_COMPILE); DrawLetter(Pdata); glEndList();
00292 glNewList(mBase+'Q', GL_COMPILE); DrawLetter(Qdata); glEndList();
00293 glNewList(mBase+'R', GL_COMPILE); DrawLetter(Rdata); glEndList();
00294 glNewList(mBase+'S', GL_COMPILE); DrawLetter(Sdata); glEndList();
00295 glNewList(mBase+'T', GL_COMPILE); DrawLetter(Tdata); glEndList();
00296 glNewList(mBase+'U', GL_COMPILE); DrawLetter(Udata); glEndList();
00297 glNewList(mBase+'V', GL_COMPILE); DrawLetter(Vdata); glEndList();
00298 glNewList(mBase+'W', GL_COMPILE); DrawLetter(Wdata); glEndList();
00299 glNewList(mBase+'X', GL_COMPILE); DrawLetter(Xdata); glEndList();
00300 glNewList(mBase+'Y', GL_COMPILE); DrawLetter(Ydata); glEndList();
00301 glNewList(mBase+'Z', GL_COMPILE); DrawLetter(Zdata); glEndList();
00302
00303 glNewList(mBase+'.', GL_COMPILE); DrawLetter(DOTdata); glEndList();
00304 glNewList(mBase+':', GL_COMPILE); DrawLetter(DOT2data); glEndList();
00305 glNewList(mBase+' ', GL_COMPILE); glTranslatef(8.0 * mProportion, 0.0, 0.0); glEndList();
00306 glNewList(mBase+'0', GL_COMPILE); DrawLetter(N0data); glEndList();
00307 glNewList(mBase+'1', GL_COMPILE); DrawLetter(N1data); glEndList();
00308 glNewList(mBase+'2', GL_COMPILE); DrawLetter(N2data); glEndList();
00309 glNewList(mBase+'3', GL_COMPILE); DrawLetter(N3data); glEndList();
00310 glNewList(mBase+'4', GL_COMPILE); DrawLetter(N4data); glEndList();
00311 glNewList(mBase+'5', GL_COMPILE); DrawLetter(N5data); glEndList();
00312 glNewList(mBase+'6', GL_COMPILE); DrawLetter(N6data); glEndList();
00313 glNewList(mBase+'7', GL_COMPILE); DrawLetter(N7data); glEndList();
00314 glNewList(mBase+'8', GL_COMPILE); DrawLetter(N8data); glEndList();
00315 glNewList(mBase+'9', GL_COMPILE); DrawLetter(N9data); glEndList();
00316 glNewList(mBase+'^', GL_COMPILE); DrawLetter(KAPAdata); glEndList();
00317 }
00318
00319 return mbInitialized = true;
00320 }
00321
00322 void Stroke::DrawChar(char c)
00323 {
00324 glLineWidth(2.0);
00325 glCallList(mBase + c);
00326 glLineWidth(1.0);
00327 }
00328
00329 void Stroke::DrawString(const char *s)
00330 {
00331 GLsizei len = (GLsizei)strlen(s);
00332 glLineWidth(2.0);
00333 glListBase(mBase);
00334 glCallLists(len, GL_BYTE, (GLbyte *)s);
00335 glLineWidth(1.0);
00336 }
00337