toilet/src/figlet.c
2010-02-08 23:34:05 +00:00

83 lines
2.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* TOIlet The Other Implementations letters
* Copyright (c) 2006 Sam Hocevar <sam@hocevar.net>
* All Rights Reserved
*
* $Id$
*
* 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 functions for handling FIGlet fonts.
*/
#include "config.h"
#if defined(HAVE_INTTYPES_H)
# include <inttypes.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <caca.h>
#include "toilet.h"
#include "render.h"
#define STD_GLYPHS (127 - 32)
#define EXT_GLYPHS (STD_GLYPHS + 7)
static int feed_figlet(context_t *, uint32_t, uint32_t);
static int flush_figlet(context_t *);
static int end_figlet(context_t *);
int init_figlet(context_t *cx)
{
char path[2048];
snprintf(path, 2047, "%s/%s", cx->dir, cx->font);
if(caca_canvas_set_figfont(cx->cv, path))
{
snprintf(path, 2047, "./%s", cx->font);
if(caca_canvas_set_figfont(cx->cv, path))
{
fprintf(stderr, "error: could not load font %s\n", cx->font);
return -1;
}
}
cx->feed = feed_figlet;
cx->flush = flush_figlet;
cx->end = end_figlet;
return 0;
}
static int feed_figlet(context_t *cx, uint32_t ch, uint32_t attr)
{
return caca_put_figchar(cx->cv, ch);
}
static int flush_figlet(context_t *cx)
{
/* We copy cx->cv into cx->torender instead of swapping pointers
* because that would lose the figfont information. */
/* FIXME: use caca_copy_canvas() or whatever when it's implemented. */
int ret = caca_flush_figlet(cx->cv);
cx->torender = caca_create_canvas(caca_get_canvas_width(cx->cv),
caca_get_canvas_height(cx->cv));
caca_blit(cx->torender, 0, 0, cx->cv, NULL);
caca_set_canvas_size(cx->cv, 0, 0);
return ret;
}
static int end_figlet(context_t *cx)
{
return caca_canvas_set_figfont(cx->cv, NULL);
}