Class for various sizes
Public Class methods
Create a new Geometry object from givem value which can be of following types:
| Array |
Must be an array with values for x, y, width and height |
| Hash |
Must be a hash with values for x, y, width and height |
| String |
Must be a string of following format: XxY+WIDTH+HEIGHT |
| Geometry |
Copy geometry from a Geometry object |
Or just pass one argument for x, y, width and height.
Creating a geometry with zero width or height will raise a StandardError.
geom = Subtlext::Geometry.new(0, 0, 50, 50)
=> #<Subtlext::Geometry:xxx>
geom = Subtlext::Geometry.new([ 0, 0, 50, 50 ])
=> #<Subtlext::Geometry:xxx>
geom = Subtlext::Geometry.new({ :x => 0, :y => 0, :width => 50, :height => 50 })
=> #<Subtlext::Geometry:xxx>
geom = Subtlext::Geometry.new("0x0+100+100")
=> #<Subtlext::Geometry:xxx>
geom = Subtlext::Geometry.new(Subtlext::Geometry.new(0, 0, 50, 50))
=> #<Subtlext::Geometry:xxx>
VALUE
subextGeometryInit(int argc,
VALUE *argv,
VALUE self)
{
VALUE value = Qnil, data[4] = { Qnil };
rb_scan_args(argc, argv, "13", &data[0], &data[1], &data[2], &data[3]);
value = data[0];
/* Check object type */
switch(rb_type(value))
{
case T_FIXNUM: break;
case T_ARRAY:
if(4 == FIX2INT(rb_funcall(value, rb_intern("size"), 0, NULL)))
{
int i;
for(i = 0; 4 > i; i++)
data[i] = rb_ary_entry(value, i);
}
break;
case T_HASH:
{
int i;
const char *syms[] = { "x", "y", "width", "height" };
for(i = 0; 4 > i; i++)
data[i] = rb_hash_lookup(value, CHAR2SYM(syms[i]));
}
break;
case T_STRING:
{
XRectangle geom = { 0 };
sscanf(RSTRING_PTR(value), "%hdx%hd+%hu+%hu",
&geom.x, &geom.y, &geom.width, &geom.height);
/* Convert values */
data[0] = INT2FIX(geom.x);
data[1] = INT2FIX(geom.y);
data[2] = INT2FIX(geom.width);
data[3] = INT2FIX(geom.height);
}
break;
case T_OBJECT:
{
VALUE klass = rb_const_get(mod, rb_intern("Geometry"));
/* Check object instance */
if(rb_obj_is_instance_of(value, klass))
{
data[0] = rb_iv_get(value, "@x");
data[1] = rb_iv_get(value, "@y");
data[2] = rb_iv_get(value, "@width");
data[3] = rb_iv_get(value, "@height");
}
}
break;
default: rb_raise(rb_eArgError, "Unexpected value-type `%s'",
rb_obj_classname(value));
}
/* Set values */
if(FIXNUM_P(data[0]) && FIXNUM_P(data[1]) && FIXNUM_P(data[2]) &&
FIXNUM_P(data[3]) && 0 < FIX2INT(data[2]) && 0 < FIX2INT(data[3]))
{
rb_iv_set(self, "@x", data[0]);
rb_iv_set(self, "@y", data[1]);
rb_iv_set(self, "@width", data[2]);
rb_iv_set(self, "@height", data[3]);
}
else rb_raise(rb_eStandardError, "Invalid geometry");
return self;
}
Public Instance methods
Whether both objects have the same values (based on geometry).
object1 == object2 => true
VALUE
subextGeometryEqual(VALUE self,
VALUE other)
{
return GeometryEqual(self, other);
}
Whether both objects have the same values and types (based on geometry).
object1.eql? object2 => true
VALUE
subextGeometryEqualTyped(VALUE self,
VALUE other)
{
return GeometryEqual(self, other);
}
Convert this object to hash.
puts object.hash => 1746246187916025425
static VALUE
SubtlextHash(VALUE self)
{
VALUE str = Qnil, id = rb_intern("to_str");
/* Convert to string */
if(rb_respond_to(self, id))
str = rb_funcall(self, id, 0, Qnil);
return T_STRING == rb_type(str) ? INT2FIX(rb_str_hash(str)) : Qnil;
}
Convert this Geometry object to an array with one fixnum for x, y, width and height.
geom.to_a => [0, 0, 50, 50]
VALUE
subextGeometryToArray(VALUE self)
{
VALUE ary = Qnil, x = Qnil, y = Qnil, width = Qnil, height = Qnil;
/* Check ruby object */
GET_ATTR(self, "@x", x);
GET_ATTR(self, "@y", y);
GET_ATTR(self, "@width", width);
GET_ATTR(self, "@height", height);
/* Create new array */
ary = rb_ary_new2(4);
/* Set values */
rb_ary_push(ary, x);
rb_ary_push(ary, y);
rb_ary_push(ary, width);
rb_ary_push(ary, height);
return ary;
}
Convert this Geometry object to hash with one symbol/fixnum pair for x, y, height and width.
geom.to_hash
=> { :x => 0, :y => 0, :width => 50, :height => 50 }
VALUE
subextGeometryToHash(VALUE self)
{
VALUE klass = Qnil, hash = Qnil;
VALUE x = Qnil, y = Qnil, width = Qnil, height = Qnil;
/* Check ruby object */
GET_ATTR(self, "@x", x);
GET_ATTR(self, "@y", y);
GET_ATTR(self, "@width", width);
GET_ATTR(self, "@height", height);
/* Create new hash */
klass = rb_const_get(rb_mKernel, rb_intern("Hash"));
hash = rb_funcall(klass, rb_intern("new"), 0, NULL);
/* Set values */
rb_hash_aset(hash, CHAR2SYM("x"), x);
rb_hash_aset(hash, CHAR2SYM("y"), y);
rb_hash_aset(hash, CHAR2SYM("width"), width);
rb_hash_aset(hash, CHAR2SYM("height"), height);
return hash;
}
Convert this Geometry object to string.
puts geom => "0x0+50+50"
VALUE
subextGeometryToString(VALUE self)
{
char buf[256] = { 0 };
VALUE x = Qnil, y = Qnil, width = Qnil, height = Qnil;
/* Check ruby object */
GET_ATTR(self, "@x", x);
GET_ATTR(self, "@y", y);
GET_ATTR(self, "@width", width);
GET_ATTR(self, "@height", height);
snprintf(buf, sizeof(buf), "%dx%d+%d+%d", (int)FIX2INT(x),
(int)FIX2INT(y), (int)FIX2INT(width), (int)FIX2INT(height));
return rb_str_new2(buf);
}