// Minimal example of Smolhershey usage to output PostScript, omitting // error checking and cleanup. Copyright 02024 Kragen Javier Sitaker. // See smolhershey.md for license. // This will segfault if run on a system where the font is not // installed. #include #include "smolhershey.h" // This is the callback that Smolhershey will invoke for each line // that needs to be drawn. void draw_postscript_line(sh_point start, sh_point end, void *userdata) { // These PostScript commands add a new line segment to the current // path, which will be drawn when `stroke` is invoked at the end of // the file. printf("%d %d moveto %d %d lineto\n", start.x, start.y, end.x, end.y); } int main() { // Stack-allocate an 8-kilobyte buffer for the font file contents // and a pointer array for use in rendering the font. Smolhershey // leaves all memory applications up to the caller; it never // allocates anything dynamically itself. u8 buf[8192], *glyph_pointers[97]; // One extra for EOF // This is the other data structure the caller needs to allocate. sh_font my_font = { .lines = glyph_pointers, .n = 97 }; // Read in the font with stdio. Since it’s plain ASCII text, "rb" // would be undesirable. `fread` returns the number of items read, // which tells `sh_load_font` how big the file is. FILE *f = fopen("/usr/share/hershey-fonts/timesr.jhf", "r"); sh_load_font(&my_font, buf, fread(buf, 1, sizeof buf, f)); // This graphics context specifies what font to use, what function // to call for each line, and what the current point is. It’s // important to create it with an initializer `= { ... }` to ensure // that the current point is zero-initialized. sh_gc gc = { .font = &my_font, .draw_line = draw_postscript_line }; // This is PostScript code to move the origin onto the page, flip // the Y-axis (because Hershey coordinates increase downwards), and // make line ends rounded and lines thick. puts("%!\n100 400 translate 1 -1 scale 1 setlinecap 1.5 setlinewidth"); // As long as you don’t change gc.cp, the characters from `sh_show` // get displayed one after the other. for (char *p = "hello, world"; *p; p++) sh_show(&gc, *p - ' '); // Finally, emit the PostScript commands to draw the built-up path // and end the page. puts("stroke showpage"); } /* The program’s output is the following PostScript file: %! 100 400 translate 1 -1 scale 5 -12 moveto 5 9 lineto 6 -12 moveto 6 9 lineto 6 -2 moveto 8 -4 lineto 8 -4 moveto 11 -5 lineto 11 -5 moveto 13 -5 lineto 13 -5 moveto 16 -4 lineto 16 -4 moveto 17 -2 lineto 17 -2 moveto 17 9 lineto 13 -5 moveto 15 -4 lineto 15 -4 moveto 16 -2 lineto 16 -2 moveto 16 9 lineto 2 -12 moveto 6 -12 lineto 2 9 moveto 9 9 lineto 13 9 moveto 20 9 lineto 26 1 moveto 38 1 lineto 38 1 moveto 38 -1 lineto 38 -1 moveto 37 -3 lineto 37 -3 moveto 36 -4 lineto 36 -4 moveto 34 -5 lineto 34 -5 moveto 31 -5 lineto 31 -5 moveto 28 -4 lineto 28 -4 moveto 26 -2 lineto 26 -2 moveto 25 1 lineto 25 1 moveto 25 3 lineto 25 3 moveto 26 6 lineto 26 6 moveto 28 8 lineto 28 8 moveto 31 9 lineto 31 9 moveto 33 9 lineto 33 9 moveto 36 8 lineto 36 8 moveto 38 6 lineto 37 1 moveto 37 -2 lineto 37 -2 moveto 36 -4 lineto 31 -5 moveto 29 -4 lineto 29 -4 moveto 27 -2 lineto 27 -2 moveto 26 1 lineto 26 1 moveto 26 3 lineto 26 3 moveto 27 6 lineto 27 6 moveto 29 8 lineto 29 8 moveto 31 9 lineto 46 -12 moveto 46 9 lineto 47 -12 moveto 47 9 lineto 43 -12 moveto 47 -12 lineto 43 9 moveto 50 9 lineto 57 -12 moveto 57 9 lineto 58 -12 moveto 58 9 lineto 54 -12 moveto 58 -12 lineto 54 9 moveto 61 9 lineto 72 -5 moveto 69 -4 lineto 69 -4 moveto 67 -2 lineto 67 -2 moveto 66 1 lineto 66 1 moveto 66 3 lineto 66 3 moveto 67 6 lineto 67 6 moveto 69 8 lineto 69 8 moveto 72 9 lineto 72 9 moveto 74 9 lineto 74 9 moveto 77 8 lineto 77 8 moveto 79 6 lineto 79 6 moveto 80 3 lineto 80 3 moveto 80 1 lineto 80 1 moveto 79 -2 lineto 79 -2 moveto 77 -4 lineto 77 -4 moveto 74 -5 lineto 74 -5 moveto 72 -5 lineto 72 -5 moveto 70 -4 lineto 70 -4 moveto 68 -2 lineto 68 -2 moveto 67 1 lineto 67 1 moveto 67 3 lineto 67 3 moveto 68 6 lineto 68 6 moveto 70 8 lineto 70 8 moveto 72 9 lineto 74 9 moveto 76 8 lineto 76 8 moveto 78 6 lineto 78 6 moveto 79 3 lineto 79 3 moveto 79 1 lineto 79 1 moveto 78 -2 lineto 78 -2 moveto 76 -4 lineto 76 -4 moveto 74 -5 lineto 88 5 moveto 87 6 lineto 87 6 moveto 86 5 lineto 86 5 moveto 87 4 lineto 87 4 moveto 88 5 lineto 88 5 moveto 88 7 lineto 88 7 moveto 86 9 lineto 111 -5 moveto 115 9 lineto 112 -5 moveto 115 6 lineto 119 -5 moveto 115 9 lineto 119 -5 moveto 123 9 lineto 120 -5 moveto 123 6 lineto 127 -5 moveto 123 9 lineto 108 -5 moveto 115 -5 lineto 124 -5 moveto 130 -5 lineto 140 -5 moveto 137 -4 lineto 137 -4 moveto 135 -2 lineto 135 -2 moveto 134 1 lineto 134 1 moveto 134 3 lineto 134 3 moveto 135 6 lineto 135 6 moveto 137 8 lineto 137 8 moveto 140 9 lineto 140 9 moveto 142 9 lineto 142 9 moveto 145 8 lineto 145 8 moveto 147 6 lineto 147 6 moveto 148 3 lineto 148 3 moveto 148 1 lineto 148 1 moveto 147 -2 lineto 147 -2 moveto 145 -4 lineto 145 -4 moveto 142 -5 lineto 142 -5 moveto 140 -5 lineto 140 -5 moveto 138 -4 lineto 138 -4 moveto 136 -2 lineto 136 -2 moveto 135 1 lineto 135 1 moveto 135 3 lineto 135 3 moveto 136 6 lineto 136 6 moveto 138 8 lineto 138 8 moveto 140 9 lineto 142 9 moveto 144 8 lineto 144 8 moveto 146 6 lineto 146 6 moveto 147 3 lineto 147 3 moveto 147 1 lineto 147 1 moveto 146 -2 lineto 146 -2 moveto 144 -4 lineto 144 -4 moveto 142 -5 lineto 156 -5 moveto 156 9 lineto 157 -5 moveto 157 9 lineto 157 1 moveto 158 -2 lineto 158 -2 moveto 160 -4 lineto 160 -4 moveto 162 -5 lineto 162 -5 moveto 165 -5 lineto 165 -5 moveto 166 -4 lineto 166 -4 moveto 166 -3 lineto 166 -3 moveto 165 -2 lineto 165 -2 moveto 164 -3 lineto 164 -3 moveto 165 -4 lineto 153 -5 moveto 157 -5 lineto 153 9 moveto 160 9 lineto 173 -12 moveto 173 9 lineto 174 -12 moveto 174 9 lineto 170 -12 moveto 174 -12 lineto 170 9 moveto 177 9 lineto 194 -12 moveto 194 9 lineto 195 -12 moveto 195 9 lineto 194 -2 moveto 192 -4 lineto 192 -4 moveto 190 -5 lineto 190 -5 moveto 188 -5 lineto 188 -5 moveto 185 -4 lineto 185 -4 moveto 183 -2 lineto 183 -2 moveto 182 1 lineto 182 1 moveto 182 3 lineto 182 3 moveto 183 6 lineto 183 6 moveto 185 8 lineto 185 8 moveto 188 9 lineto 188 9 moveto 190 9 lineto 190 9 moveto 192 8 lineto 192 8 moveto 194 6 lineto 188 -5 moveto 186 -4 lineto 186 -4 moveto 184 -2 lineto 184 -2 moveto 183 1 lineto 183 1 moveto 183 3 lineto 183 3 moveto 184 6 lineto 184 6 moveto 186 8 lineto 186 8 moveto 188 9 lineto 191 -12 moveto 195 -12 lineto 194 9 moveto 198 9 lineto stroke showpage */