changeset 64:c668c5c3ceae

M4 macro for C binding.
author Thinker K.F. Li <thinker@branda.to>
date Wed, 13 Aug 2008 02:07:40 +0800
parents f4b792afa74e
children 35c2b7ba140b
files tools/mb_c_header.m4 tools/mb_c_source.m4 tools/svg2code.py
diffstat 3 files changed, 102 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/tools/mb_c_header.m4	Tue Aug 12 14:21:09 2008 +0800
+++ b/tools/mb_c_header.m4	Wed Aug 13 02:07:40 2008 +0800
@@ -20,8 +20,12 @@
 define([COLOR_STOP],[ ])
 
 define([REF_STOPS],)
-define([FILL_SHAPE],)
-define([STROKE_SHAPE],)
+define([FILL_SHAPE],[[
+    paint_t *$1_fill;
+]])
+define([STROKE_SHAPE],[[
+    paint_t *$1_stroke;
+]])
 define([FILL_SHAPE_WITH_PAINT],)
 define([STROKE_SHAPE_WITH_PAINT],)
 
@@ -32,6 +36,7 @@
 [typedef struct $1 $1_t;]
 
 struct [$1] {
+    coord_t *root_coord;
 $2[]dnl
 };
 
--- a/tools/mb_c_source.m4	Tue Aug 12 14:21:09 2008 +0800
+++ b/tools/mb_c_source.m4	Wed Aug 13 02:07:40 2008 +0800
@@ -2,56 +2,117 @@
 include([foreach.m4])dnl
 divert([-1])
 
-define([COUNT],[pushdef([COUNT_N])define([COUNT_N],0)dnl
-foreach([x],[($1)],[define([COUNT_N],incr(COUNT_N))])COUNT_N[]dnl
-popdef([COUNT_N])[]])
+define([UNQUOTE], [$*])
+
+define([QUOTE], [[[$*]]])
 
-define([STOP_FIELDS],[dnl
-ifelse(COUNT($2),0,,[dnl
-[    int n_$1_stops;
-    grad_stop_t *$1_stop;
-]])dnl
-])
+define([COUNT],[ifelse([$*],[],0,[$#])])
 
-define([IMPORT],[define([$1],[$2$1(][$][@)])])
+define([IMPORT],[define([$1],[$2$1(]$[]@[)])])
 
-define([D_COLOR_STOP],[{$2,$3,$4,$5,$6},])
+define([D_COLOR_STOP],[
+	{$6,$2,$3,$4,$5}])
 
 define([D_ADD_LINEAR_PAINT],[dnl
-ifelse(COUNT([$6]),0,,[dnl
-    static int n_$1_stops = COUNT([$6]);
-    static grad_stop_t $1_stops[[]] = {$6};
+ifelse(COUNT($6),0,,[dnl
+    static const int n_$1_stops = COUNT($6);
+    static const grad_stop_t $1_stops[[]] = {UNQUOTE($6)};
 ])dnl
 ])
 
 define([D_ADD_RADIAL_PAINT],[dnl
-ifelse(COUNT([$5]),0,,[dnl
-    static int n_$1_stops = COUNT([$5]);
+ifelse(COUNT($5),0,,[dnl
+    static const int n_$1_stops = COUNT($5);
+    static const grad_stop_t $1_stops[[]] = {UNQUOTE($5)};
 ])dnl
 ])
 
-define([D_REF_STOPS],[]);
-
 define([DECLARE_VARS], [divert([-1])
-IMPORT([ADD_LINEAR_PAINT], [D_])
-IMPORT([ADD_RADIAL_PAINT],[D_])
-IMPORT([REF_STOPS],[D_])
-IMPORT([COLOR_STOP],[D_])
+define([DIMPORT],[IMPORT(]QUOTE($[]1)[,[D_])])
+DIMPORT([ADD_LINEAR_PAINT])
+DIMPORT([ADD_RADIAL_PAINT])
+DIMPORT([COLOR_STOP])
+define([REF_STOPS],)
+define([ADD_PATH],)
+define([ADD_RECT])
+define([ADD_COORD])
+define([FILL_SHAPE])
+define([STROKE_SHAPE])
+define([FILL_SHAPE_WITH_PAINT])
+define([STROKE_SHAPE_WITH_PAINT])
 divert[]])
 
 define([S_ADD_LINEAR_PAINT],[
     obj->$1 = mb_linear_new(rdman, $2, $3, $4, $5);
+ifelse(COUNT($6),0,,[dnl
+    stops = (grad_stop_t *)malloc(sizeof(grad_stop_t) * n_$1_stops);
+    memcpy(stops, $1_stops, sizeof(grad_stop_t) * n_$1_stops);
+    paint_linear_stops(obj->$1, n_$1_stops, stops);
+])dnl
 ])
+
 define([S_ADD_RADIAL_PAINT],[
     obj->$1 = mb_radial_new(rdman, $2, $3, $4);
-])
-define([S_REF_STOPS],[dnl
+ifelse(COUNT($5),0,,[
+    stops = (grad_stop_t *)malloc(sizeof(grad_stop_t) * n_$1_stops);
+    memcpy(stops, $1_stops, sizeof(grad_stop_t) * n_$1_stops);
+    paint_radial_stops(obj->$1, n_$1_stops, stops);
+])dnl
 ])
 
+define([S_COLOR_STOP],[])
+define([S_REF_STOPS],[dnl
+[    stops = (grad_stop_t *)malloc(sizeof(grad_stop_t) * n_$2_stops);
+    memcpy(stops, $2_stops, sizeof(grad_stop_t) * n_$2_stops);
+    paint_radial_stops(obj->$1, n_$2_stops, stops);
+]])
+
+define([S_ADD_RECT],[[
+    obj->$1 = sh_rect_new($2, $3, $4, $5, 0, 0);
+    rdman_add_shape(rdman, obj->$1, obj->$6);
+]])
+
+define([S_ADD_PATH],[[
+    obj->$1 = sh_path_new("$2");
+    rdman_add_shape(rdman, obj->$1, obj->$3);
+]])
+
+define([S_ADD_COORD],[[
+    obj->$1 = (coord_t *)malloc(sizeof(coord_t));
+    coord_init(obj->$1, obj->$2);
+]])
+
+define([S_FILL_SHAPE_WITH_PAINT],[dnl
+[    rdman_paint_fill(rdman, obj->$2, obj->$1);
+]])
+
+define([S_STROKE_SHAPE_WITH_PAINT],[dnl
+[    rdman_paint_stroke(rdman, obj->$2, obj->$1);
+]])
+
+define([S_FILL_SHAPE],[dnl
+[    obj->$1_fill = paint_color_new(rdman, $2, $3, $4, $5);
+    rdman_paint_fill(rdman, obj->$1_fill, obj->$1);
+]])
+
+define([S_STROKE_SHAPE],[dnl
+[    obj->$1_stroke = paint_color_new(rdman, $2, $3, $4, $5);
+    rdman_paint_stroke(rdman, obj->$1_stroke, obj->$1);
+]])
+
 define([SETUP_VARS],[divert([-1])
-IMPORT([ADD_LINEAR_PAINT],[S_])
-IMPORT([ADD_RADIAL_PAINT],[S_])
-IMPORT([REF_STOPS],[S_])
+define([SIMPORT],[IMPORT(]QUOTE($[]1)[,[S_])])
+SIMPORT([ADD_LINEAR_PAINT])
+SIMPORT([ADD_RADIAL_PAINT])
+SIMPORT([COLOR_STOP])
+SIMPORT([REF_STOPS])
+SIMPORT([ADD_PATH],)
+SIMPORT([ADD_RECT])
+SIMPORT([ADD_COORD])
+SIMPORT([FILL_SHAPE])
+SIMPORT([STROKE_SHAPE])
+SIMPORT([FILL_SHAPE_WITH_PAINT])
+SIMPORT([STROKE_SHAPE_WITH_PAINT])
 divert[]])
 
 define([MADBUTTERFLY],[dnl
@@ -63,12 +124,14 @@
 #include "$1.h"
 
 $1_t *$1_new(redraw_mant_t *rdman) {
-    $1_t *obj;]DECLARE_VARS
+    $1_t *obj;
+    grad_stop_t *stops = NULL;]DECLARE_VARS
 $2[]dnl
 [
     obj = ($1_t *)malloc(sizeof($1_t));
     if(obj == NULL) return NULL;
 ]SETUP_VARS
+    obj->root_coord = rdman->root_coord;
 $2
 [    return obj;
 }]
--- a/tools/svg2code.py	Tue Aug 12 14:21:09 2008 +0800
+++ b/tools/svg2code.py	Wed Aug 13 02:07:40 2008 +0800
@@ -6,6 +6,7 @@
 xlinkns='http://www.w3.org/1999/xlink'
 
 def translate_stops(parent, codefo, parent_id):
+    stops = []
     for node in parent.childNodes:
         if node.localName == 'stop' and node.namespaceURI == svgns:
             style = node.getAttribute('style')
@@ -26,10 +27,11 @@
 
             opacity = style_map['stop-opacity']
             offset = node.getAttribute('offset')
-            print >> codefo, '[COLOR_STOP([%s], %f, %f, %f, %f, %f)],' % (
-                parent_id, r, g, b, float(opacity), float(offset))
+            stops.append('[COLOR_STOP([%s], %f, %f, %f, %f, %f)]' % (
+                parent_id, r, g, b, float(opacity), float(offset)))
             pass
         pass
+    print >> codefo, '%sdnl' % (', '.join(stops))
     pass
 
 def translate_linearGradient(linear, codefo, doc):