File: rb_cairo_rectangle.c

package info (click to toggle)
ruby-cairo 1.17.13-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,532 kB
  • sloc: ruby: 11,997; ansic: 10,183; sh: 48; makefile: 4
file content (94 lines) | stat: -rw-r--r-- 2,852 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/* -*- c-file-style: "gnu"; indent-tabs-mode: nil -*- */
/*
 * Ruby Cairo Binding
 *
 * Copyright 2005-2022 Sutou Kouhei <kou@cozmixng.org>
 *
 * This file is made available under the same terms as Ruby
 *
*/

#include "rb_cairo.h"

VALUE rb_cCairo_Rectangle;

#define _SELF  ((cairo_rectangle_int_t *)RTYPEDDATA_DATA (self))

#if CAIRO_CHECK_VERSION(1, 10, 0)
static const rb_data_type_t cr_rectangle_type = {
  "Cairo::Rectangle",
  {
    NULL,
    ruby_xfree,
  },
  NULL,
  NULL,
  RUBY_TYPED_FREE_IMMEDIATELY,
};

static VALUE
cr_rectangle_allocate (VALUE klass)
{
  return TypedData_Wrap_Struct (klass, &cr_rectangle_type, NULL);
}

static VALUE
cr_rectangle_initialize (VALUE self, VALUE x, VALUE y,
                         VALUE width, VALUE height)
{
  cairo_rectangle_int_t *rectangle;

  rectangle = ALLOC (cairo_rectangle_int_t);
  RTYPEDDATA_DATA (self) = rectangle;

  rectangle->x = NUM2INT (x);
  rectangle->y = NUM2INT (y);
  rectangle->width = NUM2INT (width);
  rectangle->height = NUM2INT (height);

  return Qnil;
}

#  define DEFINE_RECTANGLE_ACCESSOR(name)               \
static VALUE                                            \
cr_rectangle_get_ ## name (VALUE self)                  \
{                                                       \
  return INT2NUM (_SELF->name);                         \
}                                                       \
                                                        \
static VALUE                                            \
cr_rectangle_set_ ## name (VALUE self, VALUE value)     \
{                                                       \
  _SELF->name = NUM2INT (value);                        \
  return self;                                          \
}

DEFINE_RECTANGLE_ACCESSOR(x)
DEFINE_RECTANGLE_ACCESSOR(y)
DEFINE_RECTANGLE_ACCESSOR(width)
DEFINE_RECTANGLE_ACCESSOR(height)

#  undef DEFINE_RECTANGLE_ACCESSOR
#endif

void
Init_cairo_rectangle (void)
{
#if CAIRO_CHECK_VERSION(1, 10, 0)
  rb_cCairo_Rectangle =
    rb_define_class_under (rb_mCairo, "Rectangle", rb_cObject);
  rb_define_alloc_func (rb_cCairo_Rectangle, cr_rectangle_allocate);

  rb_define_method (rb_cCairo_Rectangle, "initialize",
                    cr_rectangle_initialize, 4);

  rb_define_method (rb_cCairo_Rectangle, "x",  cr_rectangle_get_x, 0);
  rb_define_method (rb_cCairo_Rectangle, "x=", cr_rectangle_set_x, 1);
  rb_define_method (rb_cCairo_Rectangle, "y",  cr_rectangle_get_y, 0);
  rb_define_method (rb_cCairo_Rectangle, "y=", cr_rectangle_set_y, 1);
  rb_define_method (rb_cCairo_Rectangle, "width",  cr_rectangle_get_width, 0);
  rb_define_method (rb_cCairo_Rectangle, "width=", cr_rectangle_set_width, 1);
  rb_define_method (rb_cCairo_Rectangle, "height",  cr_rectangle_get_height, 0);
  rb_define_method (rb_cCairo_Rectangle, "height=", cr_rectangle_set_height, 1);
#endif
}