* 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 <string.h> | ||||
| #include <cucul.h> | #include <cucul.h> | ||||
| #include "toilet.h" | |||||
| #include "figlet.h" | #include "figlet.h" | ||||
| struct figfont | struct figfont | ||||
| @@ -40,17 +41,19 @@ struct figfont | |||||
| unsigned int *lookup; | unsigned int *lookup; | ||||
| }; | }; | ||||
| static struct figfont *open_font(char const *); | |||||
| static struct figfont *open_font(void); | |||||
| static void free_font(struct figfont *); | 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; | cucul_canvas_t *cv; | ||||
| struct figfont *font; | struct figfont *font; | ||||
| unsigned int x, i, c; | 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); | 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; | return cv; | ||||
| } | } | ||||
| static struct figfont *open_font(char const *fontname) | |||||
| static struct figfont *open_font(void) | |||||
| { | { | ||||
| char *data = NULL; | char *data = NULL; | ||||
| char path[2048]; | char path[2048]; | ||||
| @@ -84,14 +87,20 @@ static struct figfont *open_font(char const *fontname) | |||||
| FILE *f; | FILE *f; | ||||
| unsigned int i, j, size, comment_lines; | 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'; | path[2047] = '\0'; | ||||
| f = fopen(path, "r"); | f = fopen(path, "r"); | ||||
| if(!f) | 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)); | font = malloc(sizeof(struct figfont)); | ||||
| @@ -100,7 +109,7 @@ static struct figfont *open_font(char const *fontname) | |||||
| font->print_direction = 0; | font->print_direction = 0; | ||||
| font->full_layout = 0; | font->full_layout = 0; | ||||
| font->codetag_count = 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->height, &font->baseline, &font->max_length, | ||||
| &font->old_layout, &comment_lines, &font->print_direction, | &font->old_layout, &comment_lines, &font->print_direction, | ||||
| &font->full_layout, &font->codetag_count) < 6) | &font->full_layout, &font->codetag_count) < 6) | ||||
| @@ -168,7 +177,7 @@ static struct figfont *open_font(char const *fontname) | |||||
| /* Import buffer into canvas */ | /* Import buffer into canvas */ | ||||
| b = cucul_load_memory(data, i); | b = cucul_load_memory(data, i); | ||||
| font->image = cucul_import_canvas(b, "ansi"); | |||||
| font->image = cucul_import_canvas(b, "utf8"); | |||||
| cucul_free_buffer(b); | cucul_free_buffer(b); | ||||
| free(data); | free(data); | ||||
| @@ -14,6 +14,5 @@ | |||||
| /* | /* | ||||
| * This header defines functions for handling FIGlet fonts. | * 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 <stdlib.h> | ||||
| #include <cucul.h> | #include <cucul.h> | ||||
| #include "toilet.h" | |||||
| #include "render.h" | #include "render.h" | ||||
| #include "figlet.h" | #include "figlet.h" | ||||
| #include "filters.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); | static void version(void); | ||||
| #if defined(HAVE_GETOPT_H) | #if defined(HAVE_GETOPT_H) | ||||
| static void usage(void); | static void usage(void); | ||||
| @@ -50,9 +55,6 @@ int main(int argc, char *argv[]) | |||||
| int i; | int i; | ||||
| char const *export = "utf8"; | |||||
| char const *font = "mono9"; | |||||
| char const *dir = "/usr/share/figlet/"; | |||||
| unsigned int flag_gay = 0; | unsigned int flag_gay = 0; | ||||
| unsigned int flag_metal = 0; | unsigned int flag_metal = 0; | ||||
| unsigned int term_width = 80; | unsigned int term_width = 80; | ||||
| @@ -101,10 +103,10 @@ int main(int argc, char *argv[]) | |||||
| version(); | version(); | ||||
| return 0; | return 0; | ||||
| case 'f': /* --font */ | case 'f': /* --font */ | ||||
| font = optarg; | |||||
| toilet_font = optarg; | |||||
| break; | break; | ||||
| case 'd': /* --directory */ | case 'd': /* --directory */ | ||||
| dir = optarg; | |||||
| toilet_dir = optarg; | |||||
| break; | break; | ||||
| case 'g': /* --gay */ | case 'g': /* --gay */ | ||||
| flag_gay = 1; | flag_gay = 1; | ||||
| @@ -128,7 +130,7 @@ int main(int argc, char *argv[]) | |||||
| break; | break; | ||||
| } | } | ||||
| case 'i': /* --irc */ | case 'i': /* --irc */ | ||||
| export = "irc"; | |||||
| toilet_export = "irc"; | |||||
| break; | break; | ||||
| case '?': | case '?': | ||||
| printf(MOREINFO, argv[0]); | printf(MOREINFO, argv[0]); | ||||
| @@ -155,10 +157,10 @@ int main(int argc, char *argv[]) | |||||
| printf("20201\n"); | printf("20201\n"); | ||||
| return 0; | return 0; | ||||
| case 2: | case 2: | ||||
| printf("%s\n", dir); | |||||
| printf("%s\n", toilet_dir); | |||||
| return 0; | return 0; | ||||
| case 3: | case 3: | ||||
| printf("%s\n", font); | |||||
| printf("%s\n", toilet_font); | |||||
| return 0; | return 0; | ||||
| case 4: | case 4: | ||||
| printf("%u\n", term_width); | printf("%u\n", term_width); | ||||
| @@ -200,15 +202,18 @@ int main(int argc, char *argv[]) | |||||
| } | } | ||||
| /* Render string to canvas */ | /* Render string to canvas */ | ||||
| if(!strcasecmp(font, "mono9")) | |||||
| if(!strcasecmp(toilet_font, "mono9")) | |||||
| { | { | ||||
| cv = render_big(string, length); | cv = render_big(string, length); | ||||
| filter_autocrop(cv); | filter_autocrop(cv); | ||||
| } | } | ||||
| else if(!strcasecmp(font, "term")) | |||||
| else if(!strcasecmp(toilet_font, "term")) | |||||
| cv = render_tiny(string, length); | cv = render_tiny(string, length); | ||||
| else | else | ||||
| cv = render_figlet(string, length, font); | |||||
| cv = render_figlet(string, length); | |||||
| if(!cv) | |||||
| return -1; | |||||
| /* Do gay stuff with our string (léopard) */ | /* Do gay stuff with our string (léopard) */ | ||||
| if(flag_metal) | if(flag_metal) | ||||
| @@ -217,7 +222,7 @@ int main(int argc, char *argv[]) | |||||
| filter_gay(cv); | filter_gay(cv); | ||||
| /* Output char */ | /* Output char */ | ||||
| buffer = cucul_export_canvas(cv, export); | |||||
| buffer = cucul_export_canvas(cv, toilet_export); | |||||
| fwrite(cucul_get_buffer_data(buffer), | fwrite(cucul_get_buffer_data(buffer), | ||||
| cucul_get_buffer_size(buffer), 1, stdout); | cucul_get_buffer_size(buffer), 1, stdout); | ||||
| cucul_free_buffer(buffer); | 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; | |||||