/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
/************************************************

  rbpangoanalysis.c -

  $Author: mutoh $
  $Date: 2005/09/17 17:09:13 $

  Copyright (C) 2003-2005 Masao Mutoh
************************************************/

#include "rbpango.h"

#define _SELF(s) ((PangoAnalysis*)RVAL2BOXED(s, PANGO_TYPE_ANALYSIS))

/**********************************/
static PangoAnalysis*
ana_copy(const PangoAnalysis* val)
{
    PangoAnalysis* new_val;
    g_return_val_if_fail (val != NULL, NULL);
    new_val = g_new(PangoAnalysis, 1);
    *new_val = *val;
    return new_val;
}
                                                                                     
GType
pango_analysis_get_type(void)
{
    static GType our_type = 0;
                                                                                     
    if (our_type == 0)
        our_type = g_boxed_type_register_static ("PangoAnalysis",
                    (GBoxedCopyFunc)ana_copy,
                    (GBoxedFreeFunc)g_free);
    return our_type;
}
/**********************************/

static VALUE
ana_initialize(self)
    VALUE self;
{
    PangoAnalysis ana = { NULL, NULL, NULL, 0 };
    G_INITIALIZE(self, &ana);
    return Qnil;
}

#if PANGO_CHECK_VERSION(1,4,0)
static VALUE
ana_set_shape_engine(self, engine)
    VALUE self, engine;
{
    _SELF(self)->shape_engine = PANGO_ENGINE_SHAPE(RVAL2GOBJ(engine));
    return self;
}
static VALUE
ana_get_shape_engine(self)
    VALUE self;
{
    VALUE ret;
    if (_SELF(self)->shape_engine){
        const gchar* gname = G_OBJECT_TYPE_NAME(_SELF(self)->shape_engine);
        gchar* name = g_strdup(gname);
        name[0] = g_ascii_toupper(name[0]);
        G_DEF_CLASS3(gname, name, mPango);
        ret = GOBJ2RVAL(_SELF(self)->shape_engine);
    } else {
        ret = Qnil;
    }
    return ret;
}

static VALUE
ana_set_lang_engine(self, engine)
    VALUE self, engine;
{
    _SELF(self)->lang_engine = PANGO_ENGINE_LANG(RVAL2GOBJ(engine));
    return self;
}
static VALUE
ana_get_lang_engine(self)
    VALUE self;
{
    VALUE ret;
    if (_SELF(self)->lang_engine){
        const gchar* gname = G_OBJECT_TYPE_NAME(_SELF(self)->lang_engine);
        gchar* name = g_strdup(gname);
        name[0] = g_ascii_toupper(name[0]);
        G_DEF_CLASS3(name, name, mPango);
        ret = GOBJ2RVAL(_SELF(self)->lang_engine);
    } else {
        ret = Qnil;
    }
    return ret;
}
#endif

static VALUE
ana_set_font(self, font)
    VALUE self, font;
{
    _SELF(self)->font = PANGO_FONT(RVAL2GOBJ(font));
    return self;
}

static VALUE
ana_get_font(self)
    VALUE self;
{
    return GOBJ2RVAL(_SELF(self)->font);
}

static VALUE
ana_set_level(self, level)
    VALUE self, level;
{
    _SELF(self)->level = NUM2UINT(level);
    return self;
}

static VALUE
ana_get_level(self)
    VALUE self;
{
    return UINT2NUM(_SELF(self)->level);
}

static VALUE
ana_set_language(self, lang)
    VALUE self, lang;
{
    _SELF(self)->language = RVAL2BOXED(lang, PANGO_TYPE_LANGUAGE);
    return self;
}

static VALUE
ana_get_language(self)
    VALUE self;
{
    return BOXED2RVAL(_SELF(self)->language, PANGO_TYPE_LANGUAGE);
}

static VALUE
ana_set_extra_attrs(self, attrs)
    VALUE self, attrs;
{
    gint i;
    gint len = RARRAY(attrs)->len;
    GSList* gattrs = NULL;

    for (i = 0; i < len; i++){
        gattrs = g_slist_append(gattrs, RVAL2ATTR(RARRAY(attrs)->ptr[i]));
    }

    _SELF(self)->extra_attrs = gattrs;
    return self;
}

static VALUE
ana_get_extra_attrs(self)
    VALUE self;
{
    VALUE ary = rb_ary_new();
    GSList* list = _SELF(self)->extra_attrs;

    while (list) {
        rb_ary_push(ary, ATTR2RVAL(list->data));
        list = list->next;
    }
    return ary;
}

void
Init_pango_analysis()
{
    VALUE pana = G_DEF_CLASS(PANGO_TYPE_ANALYSIS, "Analysis", mPango);
    
    rb_define_method(pana, "initialize", ana_initialize, 0);
#if PANGO_CHECK_VERSION(1,4,0)
    rb_define_method(pana, "set_shape_engine", ana_set_shape_engine, 1);
    rb_define_method(pana, "shape_engine", ana_get_shape_engine, 0);
    rb_define_method(pana, "set_lang_engine", ana_set_lang_engine, 1);
    rb_define_method(pana, "lang_engine", ana_get_lang_engine, 0);
#endif
    rb_define_method(pana, "set_font", ana_set_font, 1);
    rb_define_method(pana, "font", ana_get_font, 0);
    rb_define_method(pana, "set_level", ana_set_level, 1);
    rb_define_method(pana, "level", ana_get_level, 0);
    rb_define_method(pana, "set_language", ana_set_language, 1);
    rb_define_method(pana, "language", ana_get_language, 0);

    rb_define_method(pana, "set_extra_attrs", ana_set_extra_attrs, 1);
    rb_define_method(pana, "extra_attrs", ana_get_extra_attrs, 0);

    G_DEF_SETTERS(pana);
}
