* Allow to open fonts that have Unicode data (requires libcucul 0.99.beta6
which is not yet released).
pull/1/head
| @@ -25,6 +25,7 @@ | |||
| #include <string.h> | |||
| #include <cucul.h> | |||
| #include "toilet.h" | |||
| #include "figlet.h" | |||
| struct figfont | |||
| @@ -40,17 +41,19 @@ struct figfont | |||
| unsigned int *lookup; | |||
| }; | |||
| static struct figfont *open_font(char const *); | |||
| static struct figfont *open_font(void); | |||
| static void free_font(struct figfont *); | |||
| cucul_canvas_t *render_figlet(uint32_t const *string, unsigned int length, | |||
| char const *fontname) | |||
| cucul_canvas_t *render_figlet(uint32_t const *string, unsigned int length) | |||
| { | |||
| cucul_canvas_t *cv; | |||
| struct figfont *font; | |||
| unsigned int x, i, c; | |||
| font = open_font(fontname); | |||
| font = open_font(); | |||
| if(!font) | |||
| return NULL; | |||
| cv = cucul_create_canvas(length * font->max_length, font->height); | |||
| @@ -75,7 +78,7 @@ cucul_canvas_t *render_figlet(uint32_t const *string, unsigned int length, | |||
| return cv; | |||
| } | |||
| static struct figfont *open_font(char const *fontname) | |||
| static struct figfont *open_font(void) | |||
| { | |||
| char *data = NULL; | |||
| char path[2048]; | |||
| @@ -84,14 +87,20 @@ static struct figfont *open_font(char const *fontname) | |||
| FILE *f; | |||
| unsigned int i, j, size, comment_lines; | |||
| /* Open font */ | |||
| snprintf(path, 2047, "/usr/share/figlet/%s.flf", fontname); | |||
| /* Open font: try .tlf, then .flf */ | |||
| snprintf(path, 2047, "%s/%s.tlf", toilet_dir, toilet_font); | |||
| path[2047] = '\0'; | |||
| f = fopen(path, "r"); | |||
| if(!f) | |||
| { | |||
| fprintf(stderr, "font `%s' not found\n", path); | |||
| return NULL; | |||
| snprintf(path, 2047, "%s/%s.flf", toilet_dir, toilet_font); | |||
| path[2047] = '\0'; | |||
| f = fopen(path, "r"); | |||
| if(!f) | |||
| { | |||
| fprintf(stderr, "font `%s' not found\n", path); | |||
| return NULL; | |||
| } | |||
| } | |||
| font = malloc(sizeof(struct figfont)); | |||
| @@ -100,7 +109,7 @@ static struct figfont *open_font(char const *fontname) | |||
| font->print_direction = 0; | |||
| font->full_layout = 0; | |||
| font->codetag_count = 0; | |||
| if(fscanf(f, "flf2a%c %u %u %u %i %u %u %u %u\n", &font->hardblank, | |||
| if(fscanf(f, "%*[ft]lf2a%c %u %u %u %i %u %u %u %u\n", &font->hardblank, | |||
| &font->height, &font->baseline, &font->max_length, | |||
| &font->old_layout, &comment_lines, &font->print_direction, | |||
| &font->full_layout, &font->codetag_count) < 6) | |||
| @@ -168,7 +177,7 @@ static struct figfont *open_font(char const *fontname) | |||
| /* Import buffer into canvas */ | |||
| b = cucul_load_memory(data, i); | |||
| font->image = cucul_import_canvas(b, "ansi"); | |||
| font->image = cucul_import_canvas(b, "utf8"); | |||
| cucul_free_buffer(b); | |||
| free(data); | |||
| @@ -14,6 +14,5 @@ | |||
| /* | |||
| * This header defines functions for handling FIGlet fonts. | |||
| */ | |||
| extern cucul_canvas_t *render_figlet(uint32_t const *, unsigned int, | |||
| char const *); | |||
| extern cucul_canvas_t *render_figlet(uint32_t const *, unsigned int); | |||
| @@ -31,10 +31,15 @@ | |||
| #include <stdlib.h> | |||
| #include <cucul.h> | |||
| #include "toilet.h" | |||
| #include "render.h" | |||
| #include "figlet.h" | |||
| #include "filters.h" | |||
| char const *toilet_export = "utf8"; | |||
| char const *toilet_font = "mono9"; | |||
| char const *toilet_dir = "/usr/share/figlet/"; | |||
| static void version(void); | |||
| #if defined(HAVE_GETOPT_H) | |||
| static void usage(void); | |||
| @@ -50,9 +55,6 @@ int main(int argc, char *argv[]) | |||
| int i; | |||
| char const *export = "utf8"; | |||
| char const *font = "mono9"; | |||
| char const *dir = "/usr/share/figlet/"; | |||
| unsigned int flag_gay = 0; | |||
| unsigned int flag_metal = 0; | |||
| unsigned int term_width = 80; | |||
| @@ -101,10 +103,10 @@ int main(int argc, char *argv[]) | |||
| version(); | |||
| return 0; | |||
| case 'f': /* --font */ | |||
| font = optarg; | |||
| toilet_font = optarg; | |||
| break; | |||
| case 'd': /* --directory */ | |||
| dir = optarg; | |||
| toilet_dir = optarg; | |||
| break; | |||
| case 'g': /* --gay */ | |||
| flag_gay = 1; | |||
| @@ -128,7 +130,7 @@ int main(int argc, char *argv[]) | |||
| break; | |||
| } | |||
| case 'i': /* --irc */ | |||
| export = "irc"; | |||
| toilet_export = "irc"; | |||
| break; | |||
| case '?': | |||
| printf(MOREINFO, argv[0]); | |||
| @@ -155,10 +157,10 @@ int main(int argc, char *argv[]) | |||
| printf("20201\n"); | |||
| return 0; | |||
| case 2: | |||
| printf("%s\n", dir); | |||
| printf("%s\n", toilet_dir); | |||
| return 0; | |||
| case 3: | |||
| printf("%s\n", font); | |||
| printf("%s\n", toilet_font); | |||
| return 0; | |||
| case 4: | |||
| printf("%u\n", term_width); | |||
| @@ -200,15 +202,18 @@ int main(int argc, char *argv[]) | |||
| } | |||
| /* Render string to canvas */ | |||
| if(!strcasecmp(font, "mono9")) | |||
| if(!strcasecmp(toilet_font, "mono9")) | |||
| { | |||
| cv = render_big(string, length); | |||
| filter_autocrop(cv); | |||
| } | |||
| else if(!strcasecmp(font, "term")) | |||
| else if(!strcasecmp(toilet_font, "term")) | |||
| cv = render_tiny(string, length); | |||
| else | |||
| cv = render_figlet(string, length, font); | |||
| cv = render_figlet(string, length); | |||
| if(!cv) | |||
| return -1; | |||
| /* Do gay stuff with our string (léopard) */ | |||
| if(flag_metal) | |||
| @@ -217,7 +222,7 @@ int main(int argc, char *argv[]) | |||
| filter_gay(cv); | |||
| /* Output char */ | |||
| buffer = cucul_export_canvas(cv, export); | |||
| buffer = cucul_export_canvas(cv, toilet_export); | |||
| fwrite(cucul_get_buffer_data(buffer), | |||
| cucul_get_buffer_size(buffer), 1, stdout); | |||
| cucul_free_buffer(buffer); | |||
| @@ -0,0 +1,21 @@ | |||
| /* | |||
| * TOIlet The Other Implementation’s letters | |||
| * Copyright (c) 2006 Sam Hocevar <sam@zoy.org> | |||
| * All Rights Reserved | |||
| * | |||
| * $Id$ | |||
| * | |||
| * This program is free software; you can redistribute it and/or | |||
| * modify it under the terms of the Do What The Fuck You Want To | |||
| * Public License, Version 2, as published by Sam Hocevar. See | |||
| * http://sam.zoy.org/wtfpl/COPYING for more details. | |||
| */ | |||
| /* | |||
| * This header defines global variables. | |||
| */ | |||
| extern char const *toilet_export; | |||
| extern char const *toilet_font; | |||
| extern char const *toilet_dir; | |||