Mercurial > MadButterfly
changeset 733:163f0d9e6382
Add binding for linear and radial paints for JS
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Fri, 20 Aug 2010 09:34:49 +0800 |
parents | 6879aa403306 |
children | 5ac257be7bc0 |
files | nodejs/mbfly_njs.cc nodejs/mbfly_njs.h nodejs/mbfly_njs.m4 nodejs/paints.cc nodejs/paints.m4 nodejs/testcase.js |
diffstat | 6 files changed, 147 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/nodejs/mbfly_njs.cc Fri Aug 20 08:34:34 2010 +0800 +++ b/nodejs/mbfly_njs.cc Fri Aug 20 09:34:49 2010 +0800 @@ -94,6 +94,8 @@ #define xnjsmb_auto_rect_new export_xnjsmb_auto_rect_new #define xnjsmb_auto_paint_color_new export_xnjsmb_auto_paint_color_new #define xnjsmb_auto_paint_image_new export_xnjsmb_auto_paint_image_new +#define xnjsmb_auto_paint_linear_new export_xnjsmb_auto_paint_linear_new +#define xnjsmb_auto_paint_radial_new export_xnjsmb_auto_paint_radial_new #include "mbfly_njs-inc.h"
--- a/nodejs/mbfly_njs.h Fri Aug 20 08:34:34 2010 +0800 +++ b/nodejs/mbfly_njs.h Fri Aug 20 09:34:49 2010 +0800 @@ -53,8 +53,16 @@ const char **err); paint_t *xnjsmb_paint_image_new(njs_runtime_t *rt, mb_img_data_t *img, const char **err); +paint_t *xnjsmb_paint_linear_new(njs_runtime_t *rt, + float x1, float y1, float x2, float y2, + const char **err); +paint_t *xnjsmb_paint_radial_new(njs_runtime_t *rt, + float cx, float cy, float r, + const char **err); v8::Handle<v8::Value> export_xnjsmb_auto_paint_color_new(paint_t *paint); v8::Handle<v8::Value> export_xnjsmb_auto_paint_image_new(paint_t *paint); +v8::Handle<v8::Value> export_xnjsmb_auto_paint_linear_new(paint_t *sh); +v8::Handle<v8::Value> export_xnjsmb_auto_paint_radial_new(paint_t *sh); /* From font.cc */ void xnjsmb_font_init_mb_rt_temp(v8::Handle<v8::FunctionTemplate> mb_rt_temp);
--- a/nodejs/mbfly_njs.m4 Fri Aug 20 08:34:34 2010 +0800 +++ b/nodejs/mbfly_njs.m4 Fri Aug 20 09:34:49 2010 +0800 @@ -31,6 +31,14 @@ METHOD([paint_image_new], [xnjsmb_paint_image_new], (OBJ([img], [img_data], [mb_img_data_t]), ERR), 1, [OBJ([paint_image], [paint_t])], + (([MOD], [xnjsmb_mb_rt_objs_mod]))), + METHOD([paint_linear_new], [xnjsmb_paint_linear_new], + (NUMBER(x1), NUMBER(y1), NUMBER(x2), NUMBER(y2), ERR), 4, + [OBJ([paint_linear], [paint_t])], + (([MOD], [xnjsmb_mb_rt_objs_mod]))), + METHOD([paint_radial_new], [xnjsmb_paint_radial_new], + (NUMBER(cx), NUMBER(cy), NUMBER(r), ERR), 3, + [OBJ([paint_linear], [paint_t])], (([MOD], [xnjsmb_mb_rt_objs_mod])))], ((CTOR, ([_X_njs_MB_new], (SELF, STR(display_name), INT(width), INT(height)), 3)))dnl )
--- a/nodejs/paints.cc Fri Aug 20 08:34:34 2010 +0800 +++ b/nodejs/paints.cc Fri Aug 20 09:34:49 2010 +0800 @@ -66,6 +66,72 @@ rdman_paint_changed(rdman, paint); } +/*! \brief Set stops for linear paint for Javascript code. + */ +static void +xnjsmb_paint_linear_set_stops(paint_t *paint, Handle<Value> stops) { + Array *stops_o; + Array *stop_o; + int nstops; + grad_stop_t *grad_stops, *old_grad_stops; + int i; + + stops_o = Array::Cast(*stops); + nstops = stops_o->Length(); + grad_stops = (grad_stop_t *)malloc(sizeof(grad_stop_t) * nstops); + ASSERT(grad_stops != NULL); + + for(i = 0; i < nstops; i++) { + stop_o = Array::Cast(*stops_o->Get(i)); + ASSERT(stop_o->Length() == 5); + grad_stop_init(grad_stops + i, + stop_o->Get(0)->ToNumber()->Value(), /* off */ + stop_o->Get(1)->ToNumber()->Value(), /* r */ + stop_o->Get(2)->ToNumber()->Value(), /* g */ + stop_o->Get(3)->ToNumber()->Value(), /* b */ + stop_o->Get(4)->ToNumber()->Value()); /* a */ + } + + old_grad_stops = paint_linear_stops(paint, nstops, grad_stops); + if(old_grad_stops) + free(old_grad_stops); /* The stops, here, were allocated for + * previous calling of this + * function. */ +} + +/*! \brief Set stops for radial paint for Javascript code. + */ +static void +xnjsmb_paint_radial_set_stops(paint_t *paint, Handle<Value> stops) { + Array *stops_o; + Array *stop_o; + int nstops; + grad_stop_t *grad_stops, *old_grad_stops; + int i; + + stops_o = Array::Cast(*stops); + nstops = stops_o->Length(); + grad_stops = (grad_stop_t *)malloc(sizeof(grad_stop_t) * nstops); + ASSERT(grad_stops != NULL); + + for(i = 0; i < nstops; i++) { + stop_o = Array::Cast(*stops_o->Get(i)); + ASSERT(stop_o->Length() == 5); + grad_stop_init(grad_stops + i, + stop_o->Get(0)->ToNumber()->Value(), /* off */ + stop_o->Get(1)->ToNumber()->Value(), /* r */ + stop_o->Get(2)->ToNumber()->Value(), /* g */ + stop_o->Get(3)->ToNumber()->Value(), /* b */ + stop_o->Get(4)->ToNumber()->Value()); /* a */ + } + + old_grad_stops = paint_linear_stops(paint, nstops, grad_stops); + if(old_grad_stops) + free(old_grad_stops); /* The stops, here, were allocated for + * previous calling of this + * function. */ +} + #include "paints-inc.h" /*! \defgroup xnjsmb_paints_cons Constructor of paints @@ -105,6 +171,40 @@ return paint; } +paint_t * +xnjsmb_paint_linear_new(njs_runtime_t *rt, + float x1, float y1, float x2, float y2, + const char **err) { + paint_t *paint; + redraw_man_t *rdman; + + rdman = X_njs_MB_rdman(rt); + paint = rdman_paint_linear_new(rdman, x1, y1, x2, y2); + if(paint == NULL) { + *err = "can not allocate a paint_linear_t"; + return NULL; + } + + return paint; +} + +paint_t * +xnjsmb_paint_radial_new(njs_runtime_t *rt, + float cx, float cy, float r, + const char **err) { + paint_t *paint; + redraw_man_t *rdman; + + rdman = X_njs_MB_rdman(rt); + paint = rdman_paint_radial_new(rdman, cx, cy, r); + if(paint == NULL) { + *err = "can not allocate a paint_radial_t"; + return NULL; + } + + return paint; +} + /* @} */ /*! \defgroup xnjsmb_paints_export Exported wrapper maker for paints @@ -131,6 +231,24 @@ return ret; } + +Handle<Value> +export_xnjsmb_auto_paint_linear_new(paint_t *paint) { + Handle<Value> ret; + + ret = xnjsmb_auto_paint_linear_new(paint); + + return ret; +} + +Handle<Value> +export_xnjsmb_auto_paint_radial_new(paint_t *paint) { + Handle<Value> ret; + + ret = xnjsmb_auto_paint_radial_new(paint); + + return ret; +} /* @} */ /*! \brief Initialize paints for mbfly.
--- a/nodejs/paints.m4 Fri Aug 20 08:34:34 2010 +0800 +++ b/nodejs/paints.m4 Fri Aug 20 09:34:49 2010 +0800 @@ -15,3 +15,13 @@ STRUCT([paint_image], [paint_t], [], [], (([INHERIT], [paint]))) + +STRUCT([paint_linear], [paint_t], [], + [METHOD([set_stops], [xnjsmb_paint_linear_set_stops], + (ARRAY([stops])), 1, [])], + (([INHERIT], [paint]))) + +STRUCT([paint_radial], [paint_t], [], + [METHOD([set_stops], [xnjsmb_paint_radial_set_stops], + (ARRAY([stops])), 1, [])], + (([INHERIT], [paint])))
--- a/nodejs/testcase.js Fri Aug 20 08:34:34 2010 +0800 +++ b/nodejs/testcase.js Fri Aug 20 09:34:49 2010 +0800 @@ -57,7 +57,7 @@ var deg = (i++) * 0.1; coord[2] = (i % 40) * 5; mb_rt.redraw_changed(); - //mb_rt.flush(); + mb_rt.flush(); }, 20); setTimeout(function() { sys.puts("timeout"); }, 1000);