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

  rbpangoglyphitem.c -

  $Author: ggc $
  $Date: 2006/06/22 19:52:54 $

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

#include "rbpango.h"

#if PANGO_CHECK_VERSION(1,2,0)
#define _SELF(r) ((PangoGlyphItem*)RVAL2BOXED(r, PANGO_TYPE_GLYPH_ITEM))

/**********************************/
#ifndef HAVE_PANGO_GLYPH_ITEM_GET_TYPE
static PangoGlyphItem*
glyph_item_copy(ref)
    const PangoGlyphItem* ref;
{
  PangoGlyphItem* new_ref;
  g_return_val_if_fail (ref != NULL, NULL);
  new_ref = g_new(PangoGlyphItem, 1);
  *new_ref = *ref;
  return new_ref;
}

#  ifndef HAVE_PANGO_GLYPH_ITEM_FREE
void
pango_glyph_item_free(PangoGlyphItem* glyph_item)
{
    if (glyph_item->item)
        pango_item_free(glyph_item->item);
    if (glyph_item->glyphs)
        pango_glyph_string_free(glyph_item->glyphs);
    g_free(glyph_item);
}
#  endif

GType
pango_glyph_item_get_type(void)
{
    static GType our_type = 0;

    if (our_type == 0)
        our_type = g_boxed_type_register_static ("PangoGlyphItem",
                    (GBoxedCopyFunc)glyph_item_copy,
                    (GBoxedFreeFunc)pango_glyph_item_free);
    return our_type;
}
#endif
/**********************************/

static VALUE
glyph_item_get_item(self)
    VALUE self;
{
    PangoItem* item = _SELF(self)->item;
    return BOXED2RVAL(item, PANGO_TYPE_ITEM);
}

static VALUE
glyph_item_get_glyphs(self)
    VALUE self;
{
    PangoGlyphString* glyphs = _SELF(self)->glyphs;
    return BOXED2RVAL(glyphs, PANGO_TYPE_GLYPH_STRING);
}

static VALUE
glyph_item_split(self, text, split_index)
    VALUE self, text, split_index;
{
    return BOXED2RVAL(pango_glyph_item_split(_SELF(self), RVAL2CSTR(text),
                                             NUM2INT(split_index)), PANGO_TYPE_GLYPH_ITEM);
}

static VALUE
glyph_item_apply_attrs(self, text, attrs)
    VALUE self, text, attrs;
{
    GSList* list = pango_glyph_item_apply_attrs(_SELF(self), RVAL2CSTR(text),
                                                (PangoAttrList*)RVAL2BOXED(attrs, PANGO_TYPE_ATTR_LIST));

    VALUE ret = rb_ary_new();

    while (list) {
        rb_ary_push(ret, BOXED2RVAL(list->data, PANGO_TYPE_GLYPH_ITEM));
        pango_glyph_item_free(list->data); 
        list = list->next;
    }
   
    g_slist_free(list);
    return ret;
}

#if PANGO_CHECK_VERSION(1,6,0)
static VALUE
glyph_item_letter_space(self, text, log_attrs, letter_spacing)
    VALUE self, text, log_attrs, letter_spacing;
{
    pango_glyph_item_letter_space(_SELF(self), RVAL2CSTR(text),
                                  (PangoLogAttr*)RVAL2BOXED(log_attrs, PANGO_TYPE_LOG_ATTR),
                                  NUM2INT(letter_spacing));
    return self;
}
#endif
#endif

void
Init_pango_glyph_item()
{
#if PANGO_CHECK_VERSION(1,2,0)
    VALUE pItem = G_DEF_CLASS(PANGO_TYPE_GLYPH_ITEM, "GlyphItem", mPango);

    rb_define_method(pItem, "item", glyph_item_get_item, 0);
    rb_define_method(pItem, "glyphs", glyph_item_get_glyphs, 0);

    rb_define_method(pItem, "split", glyph_item_split, 2);
    rb_define_method(pItem, "appy_attrs", glyph_item_apply_attrs, 2);

#if PANGO_CHECK_VERSION(1,6,0)
    rb_define_method(pItem, "letter_space", glyph_item_letter_space, 3);
#endif
#endif
}

