#include "afont.h" #include "gl.h" /* * Format of int vectors describing chars: * * ... -1 * * where is * * ... -1 * * where is two integers, each in [0..1000] * * A "line" with just one point is drawn as just one point. * * Character bounding box metrics: * * Min left edge: 0 * Max right edge: 1000 * Max top edge: 1000 * Baseline: 250 * Min bottom edge: 0 * x top: 700 * * Characters are scaled unevenly so this is a reasonable box. */ #define NOTYET 0, 1000, 1000, 0, -1, 0, 0, 1000, 1000, -1, 0, 500, 500, 0, 1000, 500, 500, 1000, 0, 500, -1, -1 static long int char_diamond[] = { 0, 625, 500, 875, 1000, 625, 500, 375, 0, 625, -1, -1 }; static long int char_blob[] = { 0, 1000, 1000, 0, -1, 0, 0, 1000, 1000, -1, 0, 500, 500, 0, 1000, 500, 500, 1000, 0, 500, -1, -1 }; static long int char_space[] = { -1 }; static long int char_exclam[] = { 500, 1000, 500, 300, -1, 500, 250, -1, -1 }; static long int char_dquote[] = { 350, 1000, 350, 700, -1, 650, 1000, 650, 700, -1, -1 }; static long int char_sharp[] = { 350, 1000, 350, 250, -1, 650, 1000, 650, 250, -1, 0, 750, 1000, 750, -1, 0, 500, 1000, 500, -1, -1 }; static long int char_dollar[] = { 1000, 938, 900, 1000, 200, 1000, 0, 875, 0, 750, 200, 625, 800, 625, 1000, 500, 1000, 375, 800, 250, 100, 250, 0, 312, -1, 500, 1000, 500, 250, -1, -1 }; static long int char_percent[] = { 0, 250, 1000, 1000, -1, 0, 1000, 400, 1000, 400, 800, 0, 800, 0, 1000, -1, 1000, 250, 600, 250, 600, 450, 1000, 450, 1000, 250, -1, -1 }; static long int char_and[] = { 1000, 250, 0, 850, 0, 900, 200, 1000, 400, 900, 400, 850, 0, 600, 0, 400, 200, 250, 700, 250, 1000, 500, -1, -1 }; static long int char_squote[] = { 525, 1000, 400, 850, -1, -1 }; static long int char_lparen[] = { 700, 1000, 400, 813, 400, 437, 700, 250, -1, -1 }; static long int char_rparen[] = { 400, 1000, 700, 813, 700, 437, 400, 250, -1, -1 }; static long int char_star[] = { 0, 500, 1000, 500, -1, 500, 250, 500, 750, -1, 150, 325, 850, 675, -1, 150, 675, 850, 325, -1, -1 }; static long int char_plus[] = { 0, 500, 1000, 500, -1, 500, 250, 500, 750, -1, -1 }; static long int char_comma[] = { 525, 300, 400, 150, -1, -1 }; static long int char_minus[] = { 0, 500, 1000, 500, -1, -1 }; static long int char_dot[] = { 500, 250, -1, -1 }; static long int char_slash[] = { 0, 250, 1000, 1000, -1, -1 }; static long int char_0[] = { 0, 250, 0, 1000, 1000, 1000, 1000, 250, 0, 250, -1, -1 }; static long int char_1[] = { 1000, 1000, 1000, 250, -1, -1 }; static long int char_2[] = { 0, 1000, 1000, 1000, 1000, 625, 0, 625, 0, 250, 1000, 250, -1, -1 }; static long int char_3[] = { 0, 1000, 1000, 1000, 1000, 250, 0, 250, -1, 0, 625, 1000, 625, -1, -1 }; static long int char_4[] = { 1000, 1000, 1000, 250, -1, 0, 1000, 0, 625, 1000, 625, -1, -1 }; static long int char_5[] = { 1000, 1000, 0, 1000, 0, 625, 1000, 625, 1000, 250, 0, 250, -1, -1 }; static long int char_6[] = { 1000, 1000, 0, 1000, 0, 250, 1000, 250, 1000, 625, 0, 625, -1, -1 }; static long int char_7[] = { 0, 1000, 1000, 1000, 1000, 250, -1, -1 }; static long int char_8[] = { 0, 250, 0, 1000, 1000, 1000, 1000, 250, 0, 250, -1, 0, 625, 1000, 625, -1, -1 }; static long int char_9[] = { 1000, 625, 0, 625, 0, 1000, 1000, 1000, 1000, 250, 0, 250, -1, -1 }; static long int char_colon[] = { 500, 350, -1, 500, 700, -1, -1 }; static long int char_semicolon[] = { 525, 400, 400, 250, -1, 500, 700, -1, -1 }; static long int char_less[] = { 1000, 250, 0, 500, 1000, 750, -1, -1 }; static long int char_equal[] = { 0, 360, 1000, 360, -1, 0, 590, 1000, 590, -1, -1 }; static long int char_greater[] = { 0, 250, 1000, 500, 0, 750, -1, -1 }; static long int char_question[] = { 0, 875, 200, 1000, 800, 1000, 1000, 875, 1000, 750, 500, 412, 500, 250, -1, 500, 100, -1, -1 }; static long int char_at[] = { 1000, 250, 200, 250, 0, 375, 0, 875, 200, 1000, 800, 1000, 1000, 875, 1000, 475, 900, 400, 800, 400, 700, 475, 700, 800, 600, 850, 400, 850, 300, 800, 300, 475, 400, 400, 600, 400, 700, 475, -1, -1 }; static long int char_A[] = { 0, 250, 500, 1000, 1000, 250, -1, 167, 500, 833, 500, -1, -1 }; static long int char_B[] = { 0, 250, 0, 1000, 800, 1000, 1000, 875, 1000, 750, 800, 625, 0, 625, -1, 800, 625, 1000, 500, 1000, 375, 800, 250, 0, 250, -1, -1 }; static long int char_C[] = { 1000, 875, 800, 1000, 200, 1000, 0, 875, 0, 375, 200, 250, 800, 250, 1000, 375, -1, -1 }; static long int char_D[] = { 800, 1000, 0, 1000, 0, 250, 800, 250, 1000, 375, 1000, 875, 800, 1000, -1, -1 }; static long int char_E[] = { 1000, 250, 0, 250, 0, 1000, 1000, 1000, -1, 0, 625, 666, 625, -1, -1 }; static long int char_F[] = { 0, 250, 0, 1000, 1000, 1000, -1, 0, 625, 666, 625, -1, -1 }; static long int char_G[] = { 1000, 875, 800, 1000, 200, 1000, 0, 875, 0, 375, 200, 250, 800, 250, 1000, 375, 1000, 550, 600, 550, -1, -1 }; static long int char_H[] = { 0, 250, 0, 1000, -1, 1000, 250, 1000, 1000, -1, 0, 625, 1000, 625, -1, -1 }; static long int char_I[] = { 500, 250, 500, 1000, -1, 250, 250, 750, 250, -1, 250, 1000, 750, 1000, -1, -1 }; static long int char_J[] = { 500, 1000, 1000, 1000, -1, 750, 1000, 750, 375, 550, 250, 200, 250, 0, 375, -1, -1 }; static long int char_K[] = { 0, 1000, 0, 250, -1, 1000, 1000, 0, 500, -1, 1000, 250, 250, 625, -1, -1 }; static long int char_L[] = { 0, 1000, 0, 250, 1000, 250, -1, -1 }; static long int char_M[] = { 0, 250, 0, 1000, 500, 700, 1000, 1000, 1000, 250, -1, -1 }; static long int char_N[] = { 0, 250, 0, 1000, 1000, 250, 1000, 1000, -1, -1 }; static long int char_O[] = { 800, 1000, 200, 1000, 0, 875, 0, 375, 200, 250, 800, 250, 1000, 375, 1000, 875, 800, 1000, -1, -1 }; static long int char_P[] = { 0, 250, 0, 1000, 800, 1000, 1000, 875, 1000, 750, 800, 625, 0, 625, -1, -1 }; static long int char_Q[] = { 1000, 250, 700, 437, -1, 800, 1000, 200, 1000, 0, 875, 0, 375, 200, 250, 700, 250, 1000, 437, 1000, 875, 800, 1000, -1, -1 }; static long int char_R[] = { 0, 250, 0, 1000, 800, 1000, 1000, 875, 1000, 750, 800, 625, 0, 625, -1, 1000, 250, 450, 625, -1, -1 }; static long int char_S[] = { 1000, 938, 900, 1000, 200, 1000, 0, 875, 0, 750, 200, 625, 800, 625, 1000, 500, 1000, 375, 800, 250, 100, 250, 0, 312, -1, -1 }; static long int char_T[] = { 0, 1000, 1000, 1000, -1, 500, 1000, 500, 250, -1, -1 }; static long int char_U[] = { 0, 1000, 0, 375, 200, 250, 800, 250, 1000, 375, 1000, 1000, -1, -1 }; static long int char_V[] = { 0, 1000, 500, 250, 1000, 1000, -1, -1 }; static long int char_W[] = { 0, 1000, 200, 250, 500, 700, 800, 250, 1000, 1000, -1, -1 }; static long int char_X[] = { 0, 1000, 1000, 250, -1, 0, 250, 1000, 1000, -1, -1 }; static long int char_Y[] = { 0, 1000, 500, 700, 1000, 1000, -1, 500, 700, 500, 250, -1, -1 }; static long int char_Z[] = { 0, 1000, 1000, 1000, 0, 250, 1000, 250, -1, -1 }; static long int char_lbracket[] = { 750, 1000, 250, 1000, 250, 250, 750, 250, -1, -1 }; static long int char_backslash[] = { 0, 1000, 1000, 250, -1, -1 }; static long int char_rbracket[] = { 250, 1000, 750, 1000, 750, 250, 250, 250, -1, -1 }; static long int char_hat[] = { 200, 875, 500, 1000, 800, 875, -1, -1 }; static long int char_underscore[] = { 0, 100, 1000, 100, -1, -1 }; static long int char_backquote[] = { 400, 1000, 525, 850, -1, -1 }; static long int char_a[] = { 200, 700, 800, 700, 1000, 575, 1000, 250, -1, 1000, 500, 200, 500, 0, 375, 200, 250, 800, 250, 1000, 375, -1, -1 }; static long int char_b[] = { 0, 375, 200, 250, 800, 250, 1000, 375, 1000, 575, 800, 700, 200, 700, 0, 575, -1, 0, 1000, 0, 250, -1, -1 }; static long int char_c[] = { 1000, 638, 900, 700, 200, 700, 0, 575, 0, 375, 200, 250, 900, 250, 1000, 312, -1, -1 }; static long int char_d[] = { 1000, 575, 800, 700, 200, 700, 0, 575, 0, 375, 200, 250, 800, 250, 1000, 375, -1, 1000, 1000, 1000, 250, -1, -1 }; static long int char_e[] = { 0, 475, 1000, 475, 1000, 575, 800, 700, 200, 700, 0, 575, 0, 375, 200, 250, 1000, 250, -1, -1 }; static long int char_f[] = { 450, 250, 450, 875, 650, 1000, 800, 1000, 900, 938, -1, 250, 700, 650, 700, -1, -1 }; static long int char_g[] = { 1000, 575, 800, 700, 200, 700, 0, 575, 0, 375, 200, 250, 800, 250, 1000, 375, -1, 1000, 700, 1000, 125, 800, 0, 200, 0, 0, 125, -1, -1 }; static long int char_h[] = { 1000, 250, 1000, 575, 800, 700, 200, 700, 0, 575, -1, 0, 1000, 0, 250, -1, -1 }; static long int char_i[] = { 250, 250, 750, 250, -1, 500, 250, 500, 700, 300, 700, -1, 500, 900, -1, -1 }; static long int char_j[] = { 600, 900, -1, 600, 700, 600, 125, 400, 0, 250, 0, 150, 62, -1, -1 }; static long int char_k[] = { 0, 1000, 0, 250, -1, 1000, 700, 0, 400, -1, 1000, 250, 250, 475, -1, -1 }; static long int char_l[] = { 250, 250, 750, 250, -1, 500, 250, 500, 1000, 300, 1000, -1, -1 }; static long int char_m[] = { 0, 700, 0, 250, -1, 0, 575, 200, 700, 300, 700, 500, 575, 500, 250, -1, 500, 575, 700, 700, 800, 700, 1000, 575, 1000, 250, -1, -1 }; static long int char_n[] = { 0, 700, 0, 250, -1, 0, 575, 200, 700, 800, 700, 1000, 575, 1000, 250, -1, -1 }; static long int char_o[] = { 800, 700, 200, 700, 0, 575, 0, 375, 200, 250, 800, 250, 1000, 375, 1000, 575, 800, 700, -1, -1 }; static long int char_p[] = { 0, 375, 200, 250, 800, 250, 1000, 375, 1000, 575, 800, 700, 200, 700, 0, 575, -1, 0, 700, 0, 0, -1, -1 }; static long int char_q[] = { 1000, 375, 800, 250, 200, 250, 0, 375, 0, 575, 200, 700, 800, 700, 1000, 575, -1, 1000, 700, 1000, 0, -1, -1 }; static long int char_r[] = { 0, 250, 0, 700, -1, 0, 575, 200, 700, 800, 700, 1000, 575, -1, -1 }; static long int char_s[] = { 1000, 638, 900, 700, 200, 700, 0, 587, 200, 475, 800, 475, 1000, 363, 800, 250, 100, 250, 0, 312, -1, -1 }; static long int char_t[] = { 400, 850, 400, 375, 600, 250, 750, 250, -1, 200, 700, 600, 700, -1, -1 }; static long int char_u[] = { 0, 700, 0, 375, 200, 250, 800, 250, 1000, 375, -1, 1000, 700, 1000, 250, -1, -1 }; static long int char_v[] = { 0, 700, 500, 250, 1000, 700, -1, -1 }; static long int char_w[] = { 0, 700, 200, 250, 500, 500, 800, 250, 1000, 700, -1, -1 }; static long int char_x[] = { 0, 700, 1000, 250, -1, 0, 250, 1000, 700, -1, -1 }; static long int char_y[] = { 0, 700, 500, 250, -1, 1000, 700, 223, 0, 200, 0, 100, 63, -1, -1 }; static long int char_z[] = { 0, 700, 1000, 700, 0, 250, 1000, 250, -1, -1 }; static long int char_lbrace[] = { 750, 1000, 700, 1000, 500, 875, 500, 750, 300, 625, 250, 625, -1, 300, 625, 500, 500, 500, 375, 700, 250, 750, 250, -1, -1 }; static long int char_vbar[] = { 500, 1000, 500, 725, -1, 500, 525, 500, 250, -1, -1 }; static long int char_rbrace[] = { 250, 1000, 300, 1000, 500, 875, 500, 750, 700, 625, 750, 625, -1, 700, 625, 500, 500, 500, 375, 300, 250, 250, 250, -1, -1 }; static long int char_tilde[] = { 0, 700, 175, 850, 350, 850, 650, 550, 825, 550, 1000, 700, -1, -1 }; static long int char_delete[] = { 0, 500, 1000, 500, -1, 400, 750, 0, 500, 400, 250, -1, -1 }; /* entry 1 can't be used; \1 indicates fractional spacing */ static long int *chars[256] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &char_diamond[0], &char_blob[0], &char_space[0], &char_exclam[0], &char_dquote[0], &char_sharp[0], &char_dollar[0], &char_percent[0], &char_and[0], &char_squote[0], &char_lparen[0], &char_rparen[0], &char_star[0], &char_plus[0], &char_comma[0], &char_minus[0], &char_dot[0], &char_slash[0], &char_0[0], &char_1[0], &char_2[0], &char_3[0], &char_4[0], &char_5[0], &char_6[0], &char_7[0], &char_8[0], &char_9[0], &char_colon[0], &char_semicolon[0], &char_less[0], &char_equal[0], &char_greater[0], &char_question[0], &char_at[0], &char_A[0], &char_B[0], &char_C[0], &char_D[0], &char_E[0], &char_F[0], &char_G[0], &char_H[0], &char_I[0], &char_J[0], &char_K[0], &char_L[0], &char_M[0], &char_N[0], &char_O[0], &char_P[0], &char_Q[0], &char_R[0], &char_S[0], &char_T[0], &char_U[0], &char_V[0], &char_W[0], &char_X[0], &char_Y[0], &char_Z[0], &char_lbracket[0], &char_backslash[0], &char_rbracket[0], &char_hat[0], &char_underscore[0], &char_backquote[0], &char_a[0], &char_b[0], &char_c[0], &char_d[0], &char_e[0], &char_f[0], &char_g[0], &char_h[0], &char_i[0], &char_j[0], &char_k[0], &char_l[0], &char_m[0], &char_n[0], &char_o[0], &char_p[0], &char_q[0], &char_r[0], &char_s[0], &char_t[0], &char_u[0], &char_v[0], &char_w[0], &char_x[0], &char_y[0], &char_z[0], &char_lbrace[0], &char_vbar[0], &char_rbrace[0], &char_tilde[0], &char_delete[0], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; #define CHARWIDTH 1500 #undef drawmode #define drawmode drawmode__ /* twits */ #define M_NONE 0 #define M_POINT 1 #define M_LINE 2 static int drawmode = M_NONE; static double font_stringwidth(const char *str) { double w; w = 0; while (*str) { if (*str == '\1') { w += str[1] / (double) str[2]; str += 3; } else { w += 1; str ++; } } return(w*ASPECT); } static void setmode(int newmode) { switch (drawmode) { case M_NONE: break; case M_POINT: endpoint(); break; case M_LINE: endline(); break; } switch (newmode) { case M_NONE: break; case M_POINT: bgnpoint(); break; case M_LINE: bgnline(); break; } drawmode = newmode; } static void font_drawchar(unsigned char ch) { long int *iv; iv = chars[0xff&(int)ch]; if (iv == 0) return; while (*iv >= 0) { if (iv[2] < 0) { setmode(M_POINT); v2i(iv); iv += 2; } else { setmode(M_LINE); while (*iv >= 0) { v2i(iv); iv += 2; } } iv ++; } setmode(M_NONE); } static void font_drawstring(const char *str) { scale(ASPECT/CHARWIDTH,.001,1.0); /* translate((Coord)0,(Coord)-250,(Coord)0); */ while (*str && (*str != '\n')) { if (*str == '\1') { translate((Coord)((CHARWIDTH*str[1])/(double)str[2]),(Coord)0,(Coord)0); str += 3; } else { font_drawchar(*str); translate((Coord)CHARWIDTH,(Coord)0,(Coord)0); str ++; } } } void font_leftstring(const char *str) { pushmatrix(); font_drawstring(str); popmatrix(); } void font_centrestring(const char *str) { pushmatrix(); translate((Coord)(-font_stringwidth(str)/2.0),(Coord)0,(Coord)0); font_drawstring(str); popmatrix(); } void font_rightstring(const char *str) { pushmatrix(); translate((Coord)-font_stringwidth(str),(Coord)0,(Coord)0); font_drawstring(str); popmatrix(); }