As it turns out, font selection is almost as trivial to implement as the persistent count file, above.
We had to add a -r option (for "render"), and a little bit of logic to determine which font was being specified:
case 'r':
if (!strcmp (optarg, "8x8")) {
optr = render_8x8;
} else if (!strcmp (optarg, "7seg")) {
optr = render_7segment;
} else {
// error message
exit (EXIT_FAILURE);
}
break;
The specified font is selected by storing a function pointer to the font-rendering function in the optr variable. Once that's done, it's a simple matter of storing the function pointer into a new field (called render) within the OCB:
typedef struct my_ocb_s
{
iofunc_ocb_t base;
unsigned char *output;
int size;
void (*render) (char *string,
unsigned char *bitmap,
int x, int y);
} my_ocb_t;
Then, in io_read(), we replaced the hard-coded call to render_7segment():
render_7segment (string, input, optx, opty);
with a call through the OCB's new pointer:
(*ocb -> render) (string, input, optx, opty);
Fairly painless. Of course, we needed to create a new font and font-rendering module, which probably took more time to do than the actual modifications. See the source in 8x8.c for the details of the new font.