// // Free a hershey_font allocated by hershey_font_load or hershey_jhf_font_load. // void hershey_font_free( struct hershey_font *hf ) { // free all the paths of each glyph int c; for ( c=0; c<256; c++ ) { const struct hershey_glyph *hg; struct hershey_path *hp, *next; hg = hershey_font_glyph(hf, c); for ( hp=hg->paths, next=hp; hp; hp=next ) { next = hp->next; free(hp); } } // free the hf structure itself free(hf); }
int main( int argc, char **argv ) { const char *render_text = "HELLO"; // // Load a Hershey font with hershey_font_load(). // const char *fontname = "rowmans"; struct hershey_font *hf = hershey_font_load(fontname); if ( !hf ) { perror(fontname); return 1; } // // Render each character's line paths with hershey_font_glyph(). // int x_render_pos = 0; const char *p; for ( p=render_text; *p; p++ ) { // get the character c to be rendered int c = *p; // get the hershey_glyph for character c // and check whether there actually is a glyph for this character struct hershey_glyph *hg = hershey_font_glyph(hf, c); if ( hg->width == 0 ) continue; printf("# %c\n", c); // walk the paths-list for this glyph struct hershey_path *hp; for ( hp=hg->paths; hp; hp=hp->next ) { // begin draw path printf("\t"); int i; for ( i=0; i<hp->nverts; i++ ) { short x = hp->verts[i].x + x_render_pos; short y = hp->verts[i].y; printf(" {%d,%d}", x, y); } // end draw path printf("\n"); } // advance the x_render_pos by the width of this glyph x_render_pos += hg->width; } // // Destroy the hershey_font with hershey_font_free(). // hershey_font_free(hf); return 0; }
int main( int argc, char **argv ) { char *gnuplot_term_opts = "wxt"; int gnuplot_height = 100; int opt; while ((opt = getopt(argc, argv, "h:T:")) != -1) { switch (opt) { case 'h': gnuplot_height = strtoul(optarg, 0, 0); break; case 'T': gnuplot_term_opts = optarg; break; default: /* '?' */ usage(); return 1; } } opt = argc - optind; if ( opt < 1 || opt > 2 ) { usage(); return 1; } if ( opt == 2 ) sample_sheet_mode = 0; // load a hershey_font structure either by filename or fontname const char *fontname = argv[optind++]; struct hershey_font *hf; if ( strchr(fontname,'.') ) hf = hershey_jhf_font_load(fontname); else hf = hershey_font_load(fontname); if ( !hf ) { perror(fontname); return 1; } // render the text printf("#\n# gnuplot input file generated by hershey-font-gnuplot\n#\n\n"); printf("\n"); int terminal_width, terminal_height; char render_text_buf[256]; if ( sample_sheet_mode ) { int i; for ( i=0; i<256-32; i++ ) render_text_buf[i] = i+32; render_text = render_text_buf; terminal_width = 16 * gnuplot_height; terminal_height = 8 * gnuplot_height; } else { render_text = argv[optind++]; terminal_width = 16 * gnuplot_height; terminal_height = gnuplot_height; } printf("set terminal %s size %d,%d\n", gnuplot_term_opts, terminal_width, terminal_height); printf("\n"); printf("unset xtics\n"); printf("unset ytics\n"); printf("unset border\n"); printf("unset key\n"); if ( sample_sheet_mode ) { printf("set title \"%s\"\n", fontname ); printf("set size ratio 0.5\n"); printf("set xrange [0:%d]\n", 32*32); printf("set yrange [0:%d]\n", 8*64); } else { printf("set size ratio 0.125\n"); printf("set xrange [0:%d]\n", 16*16); printf("set yrange [0:%d]\n", 2*16); } printf("set style arrow 1 nohead\n" ); printf("set style line 1 lc rgb \"black\" lw 0.5\n" ); int x_render_pos = 0; int y_render_pos = 8; const char *p; for ( p=render_text; *p; p++ ) { // get the character c to be rendered int c = *((unsigned char *)p); // get the hershey_glyph for ASCII character c struct hershey_glyph *hg = hershey_font_glyph(hf, c); // check whether there actually is a glyph for this character if ( hg->width == 0 ) continue; // handle special placement for sample_sheet_mode if ( sample_sheet_mode ) { x_render_pos = (c % 32) * 32; y_render_pos = (c / 32) * 64; y_render_pos = 8*64 - y_render_pos; } printf("# [[ %c ]] glyph(%d) width=%u npaths=%u\n", c, c, hg->width, hg->npaths); // walk the paths-list for this glyph struct hershey_path *hp; short px, py; for ( hp=hg->paths; hp; hp=hp->next ) { // begin draw path printf("#\t\tpath: nverts=%d\n", hp->nverts); int i; for ( i=0; i<hp->nverts; i++ ) { short x = hp->verts[i].x + x_render_pos; short y = hp->verts[i].y + y_render_pos; if ( i > 0 ) printf("set arrow from %d,%d to %d,%d as 1 ls 1\n", px, py, x, y); px = x; py = y; } // end draw path } // advance the x_render_pos by the width of this glyph x_render_pos += hg->width; } printf("plot NaN notitle\n"); // destroy the hershey_font hershey_font_free(hf); return 0; }