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);