This repository has been archived on 2021-09-15. You can view files and clone it, but cannot push or open issues or pull requests.
DUT2Curling/lib/ruby-gtk2-2.0.2/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixdata.c

214 lines
6.6 KiB
C

/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
/*
* Copyright (C) 2011 Ruby-GNOME2 Project Team
* Copyright (C) 2002,2003 Masao Mutoh
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301 USA
*/
#include "rbgdk-pixbuf2private.h"
#define GDK_TYPE_PIXDATA (gdk_pixdata_get_type())
#define RG_TARGET_NAMESPACE cPixdata
#define _SELF(s) (RVAL2GDKPIXDATA(s))
static ID id_pixdata;
/*****************************************/
static GdkPixdata *
gdk_pixdata_copy(const GdkPixdata* src)
{
GdkPixdata* data;
g_return_val_if_fail (src != NULL, NULL);
data = g_new(GdkPixdata, 1);
*data = *src;
return data;
}
static GType
gdk_pixdata_get_type(void)
{
static GType our_type = 0;
if (our_type == 0)
our_type = g_boxed_type_register_static ("GdkPixdata",
(GBoxedCopyFunc)gdk_pixdata_copy,
(GBoxedFreeFunc)g_free);
return our_type;
}
/*****************************************/
static VALUE
rg_s_from_pixbuf(G_GNUC_UNUSED VALUE self, VALUE pixbuf, VALUE use_rle)
{
GdkPixdata pixdata;
gpointer rle_data = gdk_pixdata_from_pixbuf(&pixdata, RVAL2GDKPIXBUF(pixbuf), RVAL2CBOOL(use_rle));
VALUE ret = GDKPIXDATA2RVAL(&pixdata);
if (use_rle){
/* need to manage the returned value */
rb_ivar_set(ret, id_pixdata, Data_Wrap_Struct(rb_cData, NULL, g_free, rle_data));
}
return ret;
}
static VALUE
rg_to_pixbuf(VALUE self, VALUE copy_pixels)
{
GError* error = NULL;
GdkPixbuf* ret = gdk_pixbuf_from_pixdata(_SELF(self), RVAL2CBOOL(copy_pixels), &error);
if (error)
RAISE_GERROR(error);
return GOBJ2RVAL(ret);
}
static VALUE
rg_serialize(VALUE self)
{
guint stream_length;
guint i;
guint8* ret = gdk_pixdata_serialize(_SELF(self), &stream_length);
VALUE ary = rb_ary_new2(stream_length);
for (i = 0; i < stream_length; i++) {
rb_ary_push(ary, UINT2NUM(ret[i]));
}
return ary;
}
static VALUE
rg_s_deserialize(VALUE self, VALUE rbstream)
{
GdkPixdata pixdata;
long n;
guint8 *stream = RVAL2GUINT8S(rbstream, n);
GError *error = NULL;
/* TODO: Should we really be creating a new array here? As far as I can
tell, the data is copied. */
if (!gdk_pixdata_deserialize(&pixdata, n, stream, &error))
RAISE_GERROR(error);
/* need to manage the returned value */
rb_ivar_set(self, id_pixdata, Data_Wrap_Struct(rb_cData, NULL, g_free, stream));
return GDKPIXDATA2RVAL(&pixdata);
}
static VALUE
rg_to_csource(VALUE self, VALUE name, VALUE dump_type)
{
GString* str = gdk_pixdata_to_csource(_SELF(self), RVAL2CSTR(name), FIX2INT(dump_type));
VALUE ret = CSTR2RVAL(str->str);
g_string_free(str, TRUE);
return ret;
}
/* GdkPixdata */
static VALUE
rg_magic(VALUE self)
{
return UINT2NUM(_SELF(self)->magic);
}
static VALUE
rg_length(VALUE self)
{
gint32 length = _SELF(self)->length;
if(length > 0)
length -= GDK_PIXDATA_HEADER_LENGTH;
return INT2NUM(length);
}
static VALUE
rg_pixdata_type(VALUE self)
{
return UINT2NUM(_SELF(self)->pixdata_type);
}
static VALUE
rg_rowstride(VALUE self)
{
return INT2NUM(_SELF(self)->rowstride);
}
static VALUE
rg_width(VALUE self)
{
return INT2NUM(_SELF(self)->width);
}
static VALUE
rg_height(VALUE self)
{
return INT2NUM(_SELF(self)->height);
}
static VALUE
rg_pixel_data(VALUE self)
{
gint i;
guint8* ret = _SELF(self)->pixel_data;
gint32 length = _SELF(self)->length - GDK_PIXDATA_HEADER_LENGTH;
VALUE ary = rb_ary_new2(length);
for (i = 0; i < length; i++) {
rb_ary_push(ary, UINT2NUM(ret[i]));
}
return ary;
}
void
Init_gdk_pixdata(VALUE mGdk)
{
VALUE RG_TARGET_NAMESPACE = G_DEF_CLASS(GDK_TYPE_PIXDATA, "Pixdata", mGdk);
id_pixdata = rb_intern("pixdata");
RG_DEF_SMETHOD(from_pixbuf, 2);
RG_DEF_SMETHOD(deserialize, 1);
RG_DEF_METHOD(to_pixbuf, 1);
RG_DEF_METHOD(serialize, 0);
RG_DEF_METHOD(to_csource, 2);
RG_DEF_METHOD(magic, 0);
RG_DEF_METHOD(length, 0);
RG_DEF_METHOD(pixdata_type, 0);
RG_DEF_METHOD(rowstride, 0);
RG_DEF_METHOD(width, 0);
RG_DEF_METHOD(height, 0);
RG_DEF_METHOD(pixel_data, 0);
rb_define_const(RG_TARGET_NAMESPACE, "PIXBUF_MAGIC_NUMBER", INT2NUM(GDK_PIXBUF_MAGIC_NUMBER));
rb_define_const(RG_TARGET_NAMESPACE, "HEADER_LENGTH", INT2NUM(GDK_PIXDATA_HEADER_LENGTH));
/* GdkPixdataType */
rb_define_const(RG_TARGET_NAMESPACE, "COLOR_TYPE_RGB", INT2FIX(GDK_PIXDATA_COLOR_TYPE_RGB));
rb_define_const(RG_TARGET_NAMESPACE, "COLOR_TYPE_RGBA", INT2FIX(GDK_PIXDATA_COLOR_TYPE_RGBA));
rb_define_const(RG_TARGET_NAMESPACE, "COLOR_TYPE_MASK", INT2FIX(GDK_PIXDATA_COLOR_TYPE_MASK));
rb_define_const(RG_TARGET_NAMESPACE, "SAMPLE_WIDTH_8", INT2FIX(GDK_PIXDATA_SAMPLE_WIDTH_8));
rb_define_const(RG_TARGET_NAMESPACE, "SAMPLE_WIDTH_MASK", INT2FIX(GDK_PIXDATA_SAMPLE_WIDTH_MASK));
rb_define_const(RG_TARGET_NAMESPACE, "ENCODING_RAW", INT2FIX(GDK_PIXDATA_ENCODING_RAW));
rb_define_const(RG_TARGET_NAMESPACE, "ENCODING_RLE", INT2FIX(GDK_PIXDATA_ENCODING_RLE));
rb_define_const(RG_TARGET_NAMESPACE, "ENCODING_MASK", INT2FIX(GDK_PIXDATA_ENCODING_MASK));
/* GdkPixdataDumpType */
rb_define_const(RG_TARGET_NAMESPACE, "DUMP_PIXDATA_STREAM", INT2FIX(GDK_PIXDATA_DUMP_PIXDATA_STREAM));
rb_define_const(RG_TARGET_NAMESPACE, "DUMP_PIXDATA_STRUCT", INT2FIX(GDK_PIXDATA_DUMP_PIXDATA_STRUCT));
rb_define_const(RG_TARGET_NAMESPACE, "DUMP_MACROS", INT2FIX(GDK_PIXDATA_DUMP_MACROS));
rb_define_const(RG_TARGET_NAMESPACE, "DUMP_GTYPES", INT2FIX(GDK_PIXDATA_DUMP_GTYPES));
rb_define_const(RG_TARGET_NAMESPACE, "DUMP_CTYPES", INT2FIX(GDK_PIXDATA_DUMP_CTYPES));
rb_define_const(RG_TARGET_NAMESPACE, "DUMP_STATIC", INT2FIX(GDK_PIXDATA_DUMP_STATIC));
rb_define_const(RG_TARGET_NAMESPACE, "DUMP_CONST", INT2FIX(GDK_PIXDATA_DUMP_CONST));
rb_define_const(RG_TARGET_NAMESPACE, "DUMP_RLE_DECODER", INT2FIX(GDK_PIXDATA_DUMP_RLE_DECODER));
}