hackthelobby/libcaca/ruby/caca-font.c

100 lines
2.1 KiB
C

/*
* libcaca Ruby bindings
* Copyright (c) 2007-2012 Pascal Terjan <pterjan@linuxfr.org>
*
* This library 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://www.wtfpl.net/ for more details.
*/
#include <ruby.h>
#include <caca.h>
#include <errno.h>
#include "common.h"
VALUE cFont;
void font_free(void *font)
{
caca_free_font((caca_font_t *)font);
}
static VALUE font_alloc(VALUE klass)
{
VALUE obj;
obj = Data_Wrap_Struct(klass, 0, font_free, NULL);
return obj;
}
static VALUE font_initialize(VALUE self, VALUE name)
{
caca_font_t *font;
font = caca_load_font(StringValuePtr(name), 0);
if(font == NULL)
{
rb_raise(rb_eRuntimeError, "%s", strerror(errno));
}
_SELF = font;
return self;
}
static VALUE font_list(void)
{
VALUE ary;
char const* const* list;
list = caca_get_font_list();
ary = rb_ary_new();
while (*list != NULL)
{
rb_ary_push(ary, rb_str_new2(*list));
list++;
}
return ary;
}
static VALUE get_font_width(VALUE self)
{
return UINT2NUM(caca_get_font_width(_SELF));
}
static VALUE get_font_height(VALUE self)
{
return UINT2NUM(caca_get_font_height(_SELF));
}
static VALUE get_font_blocks(VALUE self)
{
VALUE ary;
uint32_t const *list;
list = caca_get_font_blocks(_SELF);
ary = rb_ary_new();
while (*list != 0L)
{
rb_ary_push(ary, ULONG2NUM(*list));
list++;
}
return ary;
}
void Init_caca_font(VALUE mCaca)
{
cFont = rb_define_class_under(mCaca, "Font", rb_cObject);
rb_define_alloc_func(cFont, font_alloc);
rb_define_method(cFont, "initialize", font_initialize, 1);
rb_define_method(cFont, "width", get_font_width, 0);
rb_define_method(cFont, "height", get_font_height, 0);
rb_define_method(cFont, "blocks", get_font_blocks, 0);
rb_define_singleton_method(cFont, "list", font_list, 0);
}