diff options
| author | Tom Black <[email protected]> | 2021-04-26 19:33:08 -0500 |
|---|---|---|
| committer | Tom Black <[email protected]> | 2021-04-26 19:33:08 -0500 |
| commit | 2f194a30ff9d6cdf281d35c3b7b93182436650d2 (patch) | |
| tree | 793669c629a2222b01f6e11e8670448f7eba9c51 | |
| parent | 426f677cb4c1543c62f0a1eafba34777c6525646 (diff) | |
| download | ruby2d-2f194a30ff9d6cdf281d35c3b7b93182436650d2.tar.gz ruby2d-2f194a30ff9d6cdf281d35c3b7b93182436650d2.zip | |
Direct draw imagesdirect-draw
| -rw-r--r-- | ext/ruby2d/ruby2d.c | 36 | ||||
| -rw-r--r-- | lib/ruby2d/image.rb | 23 | ||||
| -rw-r--r-- | test/render.rb | 8 |
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 |
