summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorTom Black <[email protected]>2021-04-26 19:33:08 -0500
committerTom Black <[email protected]>2021-04-26 19:33:08 -0500
commit2f194a30ff9d6cdf281d35c3b7b93182436650d2 (patch)
tree793669c629a2222b01f6e11e8670448f7eba9c51
parent426f677cb4c1543c62f0a1eafba34777c6525646 (diff)
downloadruby2d-direct-draw.tar.gz
ruby2d-direct-draw.zip
Direct draw imagesdirect-draw
-rw-r--r--ext/ruby2d/ruby2d.c36
-rw-r--r--lib/ruby2d/image.rb23
-rw-r--r--test/render.rb8
3 files changed, 46 insertions, 21 deletions
diff --git a/ext/ruby2d/ruby2d.c b/ext/ruby2d/ruby2d.c
index c7db19d..bfc8a73 100644
--- a/ext/ruby2d/ruby2d.c
+++ b/ext/ruby2d/ruby2d.c
@@ -394,34 +394,36 @@ static R_VAL ruby2d_image_ext_init(R_VAL self, R_VAL path) {
/*
- * Ruby2D::Image#ext_render
+ * Ruby2D::Image#self.ext_draw
*/
#if MRUBY
-static R_VAL ruby2d_image_ext_render(mrb_state* mrb, R_VAL self) {
+static R_VAL ruby2d_image_ext_draw(mrb_state* mrb, R_VAL self) {
+ mrb_value a;
+ mrb_get_args(mrb, "o", &a);
#else
-static R_VAL ruby2d_image_ext_render(R_VAL self) {
+static R_VAL ruby2d_image_ext_draw(R_VAL self, R_VAL a) {
#endif
+ // `a` is the array representing the image
+
R2D_Image *img;
- r_data_get_struct(self, "@data", &image_data_type, R2D_Image, img);
+ r_data_get_struct(r_ary_entry(a, 0), "@data", &image_data_type, R2D_Image, img);
- img->x = NUM2DBL(r_iv_get(self, "@x"));
- img->y = NUM2DBL(r_iv_get(self, "@y"));
+ img->x = NUM2DBL(r_ary_entry(a, 1));
+ img->y = NUM2DBL(r_ary_entry(a, 2));
- R_VAL w = r_iv_get(self, "@width");
- R_VAL h = r_iv_get(self, "@height");
+ R_VAL w = r_ary_entry(a, 3);
+ R_VAL h = r_ary_entry(a, 4);
if (r_test(w)) img->width = NUM2INT(w);
if (r_test(h)) img->height = NUM2INT(h);
- R2D_RotateImage(img, NUM2DBL(r_iv_get(self, "@rotate")), R2D_CENTER);
+ R2D_RotateImage(img, NUM2DBL(r_ary_entry(a, 5)), R2D_CENTER);
- R_VAL c = r_iv_get(self, "@color");
- img->color.r = NUM2DBL(r_iv_get(c, "@r"));
- img->color.g = NUM2DBL(r_iv_get(c, "@g"));
- img->color.b = NUM2DBL(r_iv_get(c, "@b"));
- img->color.a = NUM2DBL(r_iv_get(c, "@a"));
+ img->color.r = NUM2DBL(r_ary_entry(a, 6));
+ img->color.g = NUM2DBL(r_ary_entry(a, 7));
+ img->color.b = NUM2DBL(r_ary_entry(a, 8));
+ img->color.a = NUM2DBL(r_ary_entry(a, 9));
R2D_DrawImage(img);
-
return R_NIL;
}
@@ -1210,8 +1212,8 @@ void Init_ruby2d() {
// Ruby2D::Image#ext_init
r_define_method(ruby2d_image_class, "ext_init", ruby2d_image_ext_init, r_args_req(1));
- // Ruby2D::Image#ext_render
- r_define_method(ruby2d_image_class, "ext_render", ruby2d_image_ext_render, r_args_none);
+ // Ruby2D::Image#self.ext_draw
+ r_define_class_method(ruby2d_image_class, "ext_draw", ruby2d_image_ext_draw, r_args_req(1));
// Ruby2D::Sprite
R_CLASS ruby2d_sprite_class = r_define_class(ruby2d_module, "Sprite");
diff --git a/lib/ruby2d/image.rb b/lib/ruby2d/image.rb
index 67ce1b1..ecaeb53 100644
--- a/lib/ruby2d/image.rb
+++ b/lib/ruby2d/image.rb
@@ -26,5 +26,28 @@ module Ruby2D
add
end
+ def draw(opts = {})
+ opts[:width] = opts[:width] || @width
+ opts[:height] = opts[:height] || @height
+ opts[:rotate] = opts[:rotate] || @rotate
+ unless opts[:color]
+ opts[:color] = [1.0, 1.0, 1.0, 1.0]
+ end
+
+ self.class.ext_draw([
+ self, opts[:x], opts[:y], opts[:width], opts[:height], opts[:rotate],
+ opts[:color][0], opts[:color][1], opts[:color][2], opts[:color][3]
+ ])
+ end
+
+ private
+
+ def render
+ self.class.ext_draw([
+ self, @x, @y, @width, @height, @rotate,
+ @color.r, @color.g, @color.b, @color.a
+ ])
+ end
+
end
end
diff --git a/test/render.rb b/test/render.rb
index 47667f0..c9ec808 100644
--- a/test/render.rb
+++ b/test/render.rb
@@ -1,15 +1,12 @@
require 'ruby2d'
-# set width: 1280, height: 770
-
-
Quad.new(x3: 125, x4: 25)
Rectangle.new(y: 125)
Square.new(y: 250)
Line.new(x1: 5, y1: 375, x2: 95, y2: 475, width: 5)
Triangle.new(x1: 325, y1: 0, x2: 375, y2: 100, x3: 275, y3: 100)
Circle.new(x: 400, y: 175)
-
+img = Image.new('media/image.png', x: 250, y: 250)
render do
@@ -72,6 +69,9 @@ render do
color: [0.8, 0.3, 0.7, 0.8]
)
+ img.draw(x: 375, y: 250)
+ img.draw(x: 500, y: 250, width: 90, height: 110, rotate: 10, color: [0.8, 0.5, 0.4, 0.7])
+
end
show