/* * TOIlet The Other Implementation’s letters * Copyright (c) 2006 Sam Hocevar * All Rights Reserved * * This program is free software. It comes without any warranty, to * the extent permitted by applicable law. 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 file contains text to canvas rendering functions. */ #include "config.h" #if defined(HAVE_INTTYPES_H) # include #endif #include #include #include #include #include "toilet.h" #include "render.h" #include "filter.h" static int render_flush(context_t *); int render_init(context_t *cx) { cx->x = cx->y = 0; cx->w = cx->h = 0; cx->lines = 0; cx->cv = caca_create_canvas(0, 0); if(!strcasecmp(cx->font, "term")) return init_tiny(cx); return init_figlet(cx); } int render_stdin(context_t *cx) { caca_canvas_t *cv; char *line; int i, len; /* FIXME: we can't read longer lines */ len = 1024; line = malloc(len); cv = caca_create_canvas(0, 0); /* Read from stdin */ while(!feof(stdin)) { if(!fgets(line, len, stdin)) break; caca_set_canvas_size(cv, 0, 0); caca_import_canvas_from_memory(cv, line, strlen(line), "utf8"); for(i = 0; i < caca_get_canvas_width(cv); i++) { uint32_t ch = caca_get_char(cv, i, 0); uint32_t at = caca_get_attr(cv, i, 0); cx->feed(cx, ch, at); if(caca_utf32_is_fullwidth(ch)) i++; } render_flush(cx); } free(line); return 0; } int render_list(context_t *cx, int argc, char *argv[]) { caca_canvas_t *cv; int i, j, len; char *parser = NULL; cv = caca_create_canvas(0, 0); for(j = 0; j < argc; ) { char *cr; if(!parser) { if(j) cx->feed(cx, ' ', 0); parser = argv[j]; } cr = strchr(parser, '\n'); if(cr) len = (cr - parser) + 1; else len = strlen(parser); caca_set_canvas_size(cv, 0, 0); caca_import_canvas_from_memory(cv, parser, len, "utf8"); for(i = 0; i < caca_get_canvas_width(cv); i++) { uint32_t ch = caca_get_char(cv, i, 0); uint32_t at = caca_get_attr(cv, i, 0); cx->feed(cx, ch, at); if(caca_utf32_is_fullwidth(ch)) i++; } if(cr) { parser += len; render_flush(cx); } else { parser = NULL; j++; } } render_flush(cx); caca_free_canvas(cv); return 0; } int render_end(context_t *cx) { cx->end(cx); caca_free_canvas(cx->cv); return 0; } /* XXX: Following functions are local */ static int render_flush(context_t *cx) { size_t len; void *buffer; /* Flush current line */ cx->flush(cx); /* Apply optional effects to our string */ filter_do(cx); /* Output line */ buffer = caca_export_canvas_to_memory(cx->torender, cx->export, &len); if(!buffer) return -1; fwrite(buffer, len, 1, stdout); free(buffer); caca_free_canvas(cx->torender); return 0; }