Mercurial > MadButterfly
view tools/mb_c_source.m4 @ 1395:a768d74e5f49
Fix the svg:use. For a svg:use, it is a group which include the content it reference. It means that we can not tween it to its origin object directly. Instead, we need to ungroup it and then use the result matrix to generate the tweened transformation matrix. Therefore, we need to concate its matrix to the referenced object.
Ad center object when the bbox-x is not available.
author | wycc |
---|---|
date | Sat, 02 Apr 2011 05:36:36 +0800 |
parents | 8679b03f72e8 |
children |
line wrap: on
line source
changequote(`[', `]')dnl include([foreach.m4])dnl divert([-1]) define([UNQUOTE], [$*]) define([QUOTE], [[[$*]]]) define([COUNT],[ifelse([$*],[],0,[$#])]) define([IMPORT],[define([$1],[$2$1(]$[]@[)])]) define([DECLARE_EMPTIES], [ define([ADD_LINEAR_PAINT]) define([ADD_RADIAL_PAINT]) define([COLOR_STOP]) define([REF_STOPS_RADIAL]) define([REF_STOPS_LINEAR]) define([ADD_PATH]) define([ADD_RECT]) define([ADD_COORD]) define([ADD_TEXT],) define([ADD_STEXT]) define([ADD_IMAGE],) define([PANGO_BEGIN_TEXT],) define([PANGO_END_TEXT],) define([PANGO_SIZE],) define([PANGO_STYLE],) define([PANGO_WEIGHT],) define([PANGO_FAMILY],) define([FILL_SHAPE]) define([STROKE_SHAPE]) define([FILL_SHAPE_WITH_PAINT]) define([STROKE_SHAPE_WITH_PAINT]) define([STROKE_WIDTH]) define([GROUP_HIDE],) define([RECT_HIDE],) define([PATH_HIDE],) define([COORD_TRANSLATE],) define([COORD_MATRIX],) define([SHAPE_TRANSLATE],) define([SHAPE_MATRIX],) define([STYLE_BLOCK]) define([ADD_SYMBOL],) define([SCENE]) ]) define([C_NL],[ ]) define([RM_C_NL], [ifelse(index([$1],C_NL), -1, [$1], [substr([$1], 0, index([$1],C_NL))[\n]RM_C_NL(substr([$1], eval(index([$1],C_NL) + 1)))])]) define([TO_CSTR], ["[]RM_C_NL(patsubst(patsubst(patsubst([$1], [\\], [[\\\\]]), [ ],[[\\t]]), ["], [[\\"]]))[]"]) dnl -------------------- Declare Local Variables -------------------- define([D_COLOR_STOP],[ {$6,$2,$3,$4,$5}]) define([D_ADD_LINEAR_PAINT],[dnl 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 const int n_$1_stops = COUNT($5); static const grad_stop_t $1_stops[[]] = {UNQUOTE($5)}; ])dnl ]) define([D_ADD_STEXT],[dnl define([$1_CNT], 0)dnl [ mb_style_blk_t *$1_blk; ]]) define([D_STYLE_BLOCK],[dnl define([$1_CNT], eval($1_CNT + 1))dnl ]) define([DECLARE_VARS], [divert([-1]) define([DIMPORT],[IMPORT(]QUOTE($[]1)[,[D_])]) DECLARE_EMPTIES DIMPORT([ADD_LINEAR_PAINT]) DIMPORT([ADD_RADIAL_PAINT]) DIMPORT([COLOR_STOP]) DIMPORT([ADD_STEXT]) DIMPORT([STYLE_BLOCK]) divert[]]) dnl -------------------- Setup Value for Member Variables -------------------- define([S_ADD_LINEAR_PAINT],[ obj->$1 = rdman_paint_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 = rdman_paint_radial_new(rdman, $2, $3, $4); 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_RADIAL],[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_REF_STOPS_LINEAR],[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_linear_stops(obj->$1, n_$2_stops, stops); ]]) define([S_ADD_RECT],[[ obj->$1 = rdman_shape_rect_new(rdman, $2, $3, $4, $5, $6, $7); rdman_add_shape(rdman, obj->$1, obj->$8); ]]) define([S_ADD_PATH],[[ { char _cmds[] = "$3"; float _pnts[] = {$4}; float _float_args[] = {$6}; obj->$1 = rdman_shape_path_new_from_binary(rdman, _cmds, _pnts, $5, _float_args, $7); rdman_add_shape(rdman, obj->$1, obj->$2); } ]]) define([S_ADD_COORD],[[ obj->$1 = rdman_coord_new(rdman, obj->$2); ]]) define([S_ADD_TEXT],[[ obj->$1 = rdman_shape_text_new(rdman, "$2", $3, $4, $5, cairo_get_font_face(rdman->cr)); rdman_add_shape(rdman, obj->$1, obj->$6); ]]) define([S_ADD_IMAGE],[[ obj->$1_paint_img = rdman_img_ldr_load_paint(rdman, "$2"); obj->$1 = rdman_shape_image_new(rdman, $3, $4, $5, $6); rdman_paint_fill(rdman, obj->$1_paint_img, obj->$1); rdman_add_shape(rdman, obj->$1, obj->$7); ]]) define([S_PANGO_BEGIN_TEXT],[[ { PangoAttribute *attr; PangoAttrList *attrs = pango_attr_list_new(); ]]) define([S_PANGO_END_TEXT],[[ obj->$1 = rdman_shape_text_new(rdman, "$2", $3, $4, $5, cairo_get_font_face(rdman->cr),attrs); rdman_add_shape(rdman, obj->$1, obj->$6); } ]]) define([S_PANGO_SIZE],[[ attr = pango_attr_size_new($1); attr->start_index = $2; attr->end_index = $3; pango_attr_list_insert(attrs,attr); ]]) define([S_PANGO_WEIGHT],[[ attr = pango_attr_weight_new($1); attr->start_index = $2; attr->end_index = $3; pango_attr_list_insert(attrs,attr); ]]) define([S_PANGO_FAMILY],[[ attr = pango_attr_family_new("$1"); attr->start_index = $2; attr->end_index = $3; pango_attr_list_insert(attrs,attr); ]]) define([S_PANGO_STYLE],[[ attr = pango_attr_style_new($1); attr->start_index = $2; attr->end_index = $3; pango_attr_list_insert(attrs,attr); ]]) 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 = rdman_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 = rdman_paint_color_new(rdman, $2, $3, $4, $5); rdman_paint_stroke(rdman, obj->$1_stroke, obj->$1); ]]) define([S_STROKE_WIDTH],[dnl [ obj->$1->stroke_width = $2; ]]) define([S_GROUP_HIDE],[dnl [ coord_hide(obj->$1); ]]) define([S_RECT_HIDE],[dnl [ sh_hide(obj->$1); ]]) define([S_PATH_HIDE],[dnl [ sh_hide(obj->$1); ]]) define([S_COORD_TRANSLATE],[dnl [ memset(obj->$1->matrix, 0, sizeof(obj->$1->matrix)); obj->$1->matrix[0] = 1; obj->$1->matrix[2] = $2; obj->$1->matrix[4] = 1; obj->$1->matrix[5] = $3; rdman_coord_changed(rdman, obj->$1); ]]) define([S_COORD_MATRIX],[dnl [ obj->$1->matrix[0] = $2; obj->$1->matrix[3] = $3; obj->$1->matrix[1] = $4; obj->$1->matrix[4] = $5; obj->$1->matrix[2] = $6; obj->$1->matrix[5] = $7; rdman_coord_changed(rdman, obj->$1); ]]) define([S_SHAPE_TRANSLATE],[dnl [ memset(obj->$1->matrix, 0, sizeof(obj->$1->matrix)); obj->$1->matrix[0] = 1; obj->$1->matrix[2] = $2; obj->$1->matrix[4] = 1; obj->$1->matrix[5] = $3; rdman_coord_changed(rdman, obj->$1); ]]) define([S_SHAPE_MATRIX],[dnl [ obj->$1->matrix[0] = $2; obj->$1->matrix[3] = $3; obj->$1->matrix[1] = $4; obj->$1->matrix[4] = $5; obj->$1->matrix[2] = $6; obj->$1->matrix[5] = $7; rdman_coord_changed(rdman, obj->$1); ]]) define([S_ADD_STEXT],[dnl [ obj->$1 = rdman_shape_stext_new(rdman, ]TO_CSTR([$2])[, $3, $4); rdman_add_shape(rdman, obj->$1, obj->$5); obj->$1_style_blks_num = ]$1_CNT[; obj->$1_style_blks = $1_blk = (mb_style_blk_t *)malloc(sizeof(mb_style_blk_t) * ]$1_CNT[); ]dnl define($1_IDX,0)dnl ]) define([S_STYLE_BLOCK],[dnl [ $1_blk->n_chars = $2; $1_blk->font_sz = $4; $1_blk->face = mb_font_face_query(rdman, ]TO_CSTR([$3])[, $5, $6); $1_blk++; ]dnl define([$1_IDX], eval($1_IDX + 1))dnl ifelse($1_IDX, $1_CNT, [ sh_stext_set_style(obj->$1, obj->$1_style_blks, ]$1_CNT[); ])dnl ]) define([SETUP_VARS],[divert([-1]) define([SIMPORT],[IMPORT(]QUOTE($[]1)[,[S_])]) DECLARE_EMPTIES SIMPORT([ADD_LINEAR_PAINT]) SIMPORT([ADD_RADIAL_PAINT]) SIMPORT([COLOR_STOP]) SIMPORT([REF_STOPS_RADIAL]) SIMPORT([REF_STOPS_LINEAR]) SIMPORT([ADD_PATH],) SIMPORT([ADD_RECT]) SIMPORT([ADD_COORD]) SIMPORT([ADD_TEXT]) SIMPORT([ADD_STEXT]) SIMPORT([ADD_IMAGE]) SIMPORT([PANGO_BEGIN_TEXT]) SIMPORT([PANGO_END_TEXT]) SIMPORT([PANGO_SIZE]) SIMPORT([PANGO_WEIGHT]) SIMPORT([PANGO_FAMILY]) SIMPORT([PANGO_STYLE]) SIMPORT([FILL_SHAPE]) SIMPORT([STROKE_SHAPE]) SIMPORT([FILL_SHAPE_WITH_PAINT]) SIMPORT([STROKE_SHAPE_WITH_PAINT]) SIMPORT([STROKE_WIDTH]) SIMPORT([GROUP_HIDE]) SIMPORT([RECT_HIDE]) SIMPORT([PATH_HIDE]) SIMPORT([COORD_TRANSLATE]) SIMPORT([COORD_MATRIX]) SIMPORT([SHAPE_TRANSLATE]) SIMPORT([SHAPE_MATRIX]) SIMPORT([STYLE_BLOCK]) divert[]]) dnl -------------------- Clear Member Variables -------------------- define([F_ADD_LINEAR_PAINT],[[ stops = paint_linear_stops(obj->$1, 0, NULL); free(stops); rdman_paint_free(rdman, obj->$1); ]]) define([F_ADD_RADIAL_PAINT],[[ stops = paint_radial_stops(obj->$1, 0, NULL); free(stops); rdman_paint_free(rdman, obj->$1); ]]) define([F_ADD_PATH],[[ rdman_shape_free(rdman, obj->$1); ]]) define([F_ADD_RECT],[[ rdman_shape_free(rdman, obj->$1); ]]) define([F_ADD_TEXT],[[ rdman_shape_free(rdman, obj->$1); ]]) define([F_ADD_IMAGE],[[ rdman_shape_free(rdman, obj->$1); rdman_paint_free(rdman, obj->$1_paint_img); ]]) define([F_PANGO_BEGIN_TEXT],[[ rdman_shape_free(rdman, obj->$1); ]]) define([F_PANGO_SIZE],[[ ]]) define([F_PANGO_STYLE],[[ ]]) define([F_PANGO_WEIGHT],[[ ]]) define([F_FILL_SHAPE],[[ rdman_paint_free(rdman, obj->$1_fill); ]]) define([F_STROKE_SHAPE],[[ rdman_paint_free(rdman, obj->$1_stroke); ]]) define([F_ADD_STEXT],[[ rdman_shape_free(rdman, obj->$1); ]]) define([CLEAR_VARS],[divert([-1]) define([FIMPORT],[IMPORT(]QUOTE($[]1)[,[F_])]) DECLARE_EMPTIES FIMPORT([ADD_LINEAR_PAINT]) FIMPORT([ADD_RADIAL_PAINT]) FIMPORT([ADD_PATH],) FIMPORT([ADD_RECT]) FIMPORT([ADD_TEXT]) FIMPORT([ADD_IMAGE]) FIMPORT([PANGO_BEGIN_TEXT]) FIMPORT([FILL_SHAPE]) FIMPORT([STROKE_SHAPE]) divert[]]) dnl -------------------- Macro to Reverse Calling -------------------- define([REVERSE_VARS],[divert([-1]) define([__REV_VAR],[]) define([PUSH_REV], [ pushdef([__REV_VAR]) define([__REV_VAR], ]QUOTE(QUOTE($[]1))[)]) define([POP_ALL_REV], [dnl ifelse(__REV_VAR, [], ,[UNQUOTE(__REV_VAR)[]dnl popdef([__REV_VAR])[]POP_ALL_REV[]])]) define([RIMPORT], [ define(]QUOTE($[]1)[, [PUSH_REV(]]QUOTE(QUOTE($[]1))[[(]QUOTE($[]@)[))]) ]) DECLARE_EMPTIES RIMPORT([ADD_LINEAR_PAINT]) RIMPORT([ADD_RADIAL_PAINT]) RIMPORT([COLOR_STOP]) RIMPORT([REF_STOPS_RADIAL]) RIMPORT([REF_STOPS_LINEAR]) RIMPORT([ADD_PATH]) RIMPORT([ADD_RECT]) RIMPORT([ADD_COORD]) RIMPORT([ADD_TEXT]) RIMPORT([ADD_IMAGE]) RIMPORT([PANGO_BEGIN_TEXT]) RIMPORT([FILL_SHAPE]) RIMPORT([STROKE_SHAPE]) RIMPORT([FILL_SHAPE_WITH_PAINT]) RIMPORT([STROKE_SHAPE_WITH_PAINT]) RIMPORT([STROKE_WIDTH]) RIMPORT([GROUP_HIDE]) RIMPORT([RECT_HIDE]) RIMPORT([PATH_HIDE]) RIMPORT([COORD_TRANSLATE]) RIMPORT([COORD_MATRIX]) RIMPORT([SHAPE_TRANSLATE]) RIMPORT([SHAPE_MATRIX]) divert[]dnl ]) dnl -------------------- Define Symbol Table -------------------- define([Y_ADD_SYMBOL],[[{"$2", MB_SPRITE_OFFSET($1)},]]) define([DECLARE_SYMS], [divert([-1]) define([YIMPORT],[IMPORT(]QUOTE($[]1)[,[Y_])]) DECLARE_EMPTIES YIMPORT([ADD_SYMBOL]) divert[]dnl ]) define([SC_SCENE], [[static const int scene_$1[] = {] foreach([GROUP_NAME], ($2), [[ MB_SPRITE_OFFSET(]GROUP_NAME[), ]])dnl [ 0 }; ]]) define([DEFINE_SCENES], [divert([-1]) define([SCIMPORT],[IMPORT(]QUOTE($[]1)[,[SC_])]) DECLARE_EMPTIES SCIMPORT([SCENE]) divert[]dnl ]) define([SCA_SCENE], [[ scene_$1, ]]) define([DEFINE_SCENES_ARRAY], [divert([-1]) define([SCAIMPORT],[IMPORT(]QUOTE($[]1)[,[SCA_])]) DECLARE_EMPTIES SCAIMPORT([SCENE]) divert[]dnl ]) dnl -------------------- C Template -------------------- define([MADBUTTERFLY],[dnl [#include <stdio.h> #include <stdlib.h> #include <string.h> #include <mb_types.h> #include <mb_redraw_man.h> #include <mb_shapes.h> #include <mb_paint.h> #include <mb_sprite.h> #include "$1.h" #ifdef MB_SPRITE_OFFSET #undef MB_SPRITE_OFFSET #endif #define MB_SPRITE_OFFSET(x) ((int)&((($1_t *)0)->x)) #ifndef MB_LSYM_GET_OBJ_WITH_NAME #define MB_LSYM_GET_OBJ_WITH_NAME #define MB_SPRITE_OFF_2_PTR(x, off) (((void *)(x)) + (off)) static mb_obj_t *mb_lsym_get_obj_with_name(mb_sprite_lsym_t *lsym, const char *sym) { int i; for(i = 0; i < lsym->num_entries; i++) { if(strcmp(lsym->entries[i].sym, sym) != 0) continue; return *(mb_obj_t **)MB_SPRITE_OFF_2_PTR(lsym, lsym->entries[i].offset); } return NULL; } #endif /* MB_LSYM_GET_OBJ_WITH_NAME */ static mb_sprite_lsym_entry_t $1_symbols[] = {]DECLARE_SYMS $2[ }; ]DEFINE_SCENES[]dnl $2[]dnl DEFINE_SCENES_ARRAY[]dnl static const int *$1_scenes[[]] = { $2[]dnl NULL };[ #define SCENES_NUM ((sizeof($1_scenes) / sizeof(const int *)) - 1) static int $1_goto_scene($1_t *sprite, int scene_no) { coord_t *coord; const int *p; const int *scene; if(scene_no >= SCENES_NUM || scene_no < -1) return 1; if(sprite->last_scene) { p = sprite->last_scene; while(*p != 0) { coord = *(coord_t **)MB_SPRITE_OFF_2_PTR(sprite, *p); coord_hide(coord); rdman_coord_changed(sprite->rdman, coord); p++; } } if(scene_no == -1) { sprite->last_scene = NULL; return 0; } scene = $1_scenes[scene_no]; p = scene; while(*p != 0) { coord = *(coord_t **)MB_SPRITE_OFF_2_PTR(sprite, *p); coord_show(coord); rdman_coord_changed(sprite->rdman, coord); p++; } sprite->last_scene = scene; return 0; } void $1_free($1_t *); $1_t *$1_new(redraw_man_t *rdman, coord_t *parent_coord) { $1_t *obj; mb_img_ldr_t *img_ldr = NULL; grad_stop_t *stops = NULL;]DECLARE_VARS $2[]dnl [ img_ldr = rdman_img_ldr(rdman); obj = ($1_t *)malloc(sizeof($1_t)); if(obj == NULL) return NULL; obj->lsym.sprite.free = (void (*)(mb_sprite_t *))$1_free; obj->lsym.sprite.goto_scene = (int (*)(mb_sprite_t *, int))$1_goto_scene; obj->lsym.sprite.get_obj_with_name = (mb_obj_t *(*)(mb_sprite_t *, const char *))mb_lsym_get_obj_with_name; obj->lsym.num_entries = sizeof($1_symbols) / sizeof(mb_sprite_lsym_entry_t); obj->lsym.entries = $1_symbols; obj->rdman = rdman; obj->last_scene = NULL; ]SETUP_VARS[ obj->root_coord = rdman_coord_new(rdman, parent_coord);] $2 [ return obj; } void $1_free($1_t *obj) { grad_stop_t *stops = NULL; redraw_man_t *rdman; rdman = obj->rdman; ]REVERSE_VARS[]dnl divert([-1])dnl $2[]dnl divert[]dnl CLEAR_VARS[]dnl POP_ALL_REV[ rdman_coord_subtree_free(rdman, obj->root_coord); free(obj); } ]dnl ]) divert[]dnl