Quad Pang
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
Stroke.cpp
Go to the documentation of this file.
00001 
00002 #include "Stroke.h"
00003 
00004 #define PT  CharPoint::PT
00005 #define STROKE  CharPoint::STROKE
00006 #define END CharPoint::END
00007 
00008 //const int Stroke::FONT_SIZE_MAX = 5;
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