# HG changeset patch # User Thinker K.F. Li # Date 1225789226 -28800 # Node ID c7e5b8779bb59d5eea66a799ad35b6485d4cfa91 # Parent 13c1d49c198b366c6d4e7496b87a4e9da931c5f6 Move header files into include/mb/ subdirectory and remove symlink 'mb'. diff -r 13c1d49c198b -r c7e5b8779bb5 Makefile.am --- a/Makefile.am Sun Nov 02 14:30:03 2008 +0800 +++ b/Makefile.am Tue Nov 04 17:00:26 2008 +0800 @@ -1,4 +1,4 @@ -SUBDIRS = src tools examples +SUBDIRS = src include tools examples pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = libmbfly.pc EXTRA_DIST = libmbfly.pc.in mb Doxyfile README.h diff -r 13c1d49c198b -r c7e5b8779bb5 config.mk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/config.mk Tue Nov 04 17:00:26 2008 +0800 @@ -0,0 +1,1 @@ +INCLUDES = -I$(top_srcdir)/include diff -r 13c1d49c198b -r c7e5b8779bb5 configure.ac --- a/configure.ac Sun Nov 02 14:30:03 2008 +0800 +++ b/configure.ac Tue Nov 04 17:00:26 2008 +0800 @@ -40,5 +40,6 @@ examples/calculator/Makefile examples/svg2code_ex/Makefile src/Makefile + include/Makefile tools/Makefile]) AC_OUTPUT diff -r 13c1d49c198b -r c7e5b8779bb5 examples/calculator/Makefile.am --- a/examples/calculator/Makefile.am Sun Nov 02 14:30:03 2008 +0800 +++ b/examples/calculator/Makefile.am Tue Nov 04 17:00:26 2008 +0800 @@ -1,3 +1,5 @@ +include $(top_srcdir)/config.mk + noinst_PROGRAMS = calc EXTRA_DIST = calculator_scr.svg diff -r 13c1d49c198b -r c7e5b8779bb5 examples/svg2code_ex/Makefile.am --- a/examples/svg2code_ex/Makefile.am Sun Nov 02 14:30:03 2008 +0800 +++ b/examples/svg2code_ex/Makefile.am Tue Nov 04 17:00:26 2008 +0800 @@ -1,3 +1,5 @@ +include $(top_srcdir)/config.mk + noinst_PROGRAMS = ex1 EXTRA_DIST = svg2code_ex.svg diff -r 13c1d49c198b -r c7e5b8779bb5 include/Makefile.am --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/Makefile.am Tue Nov 04 17:00:26 2008 +0800 @@ -0,0 +1,12 @@ +includedir = $(prefix)/include/mb +include_HEADERS = \ + mb/animate.h \ + mb/mb.h \ + mb/mb_timer.h \ + mb/mb_types.h \ + mb/observer.h \ + mb/paint.h \ + mb/redraw_man.h \ + mb/shapes.h \ + mb/tools.h \ + mb/X_supp.h diff -r 13c1d49c198b -r c7e5b8779bb5 include/mb/X_supp.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/mb/X_supp.h Tue Nov 04 17:00:26 2008 +0800 @@ -0,0 +1,34 @@ +#ifndef __X_SUPP_H_ +#define __X_SUPP_H_ + +#include +#include "mb_types.h" +#include "mb_timer.h" +#include "redraw_man.h" + +/*! \ingroup xkb + * @{ + */ +typedef struct _X_kb_info X_kb_info_t; + +struct _X_kb_event { + event_t event; + int keycode; + int sym; +}; +typedef struct _X_kb_event X_kb_event_t; + +/* @} */ + +typedef struct _X_MB_runtime X_MB_runtime_t; + +extern void X_MB_handle_connection(X_MB_runtime_t *rt); +extern X_MB_runtime_t *X_MB_new(const char *display_name, int w, int h); +extern void X_MB_free(X_MB_runtime_t *xmb_rt); + +extern subject_t *X_MB_kbevents(X_MB_runtime_t *xmb_rt); +extern redraw_man_t *X_MB_rdman(X_MB_runtime_t *xmb_rt); +extern mb_tman_t *X_MB_tman(X_MB_runtime_t *xmb_rt); +extern ob_factory_t *X_MB_ob_factory(X_MB_runtime_t *xmb_rt); + +#endif diff -r 13c1d49c198b -r c7e5b8779bb5 include/mb/animate.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/mb/animate.h Tue Nov 04 17:00:26 2008 +0800 @@ -0,0 +1,89 @@ +#ifndef __ANIMATE_H_ +#define __ANIMATE_H_ + +#include "mb_types.h" +#include "mb_timer.h" +#include "paint.h" + +/*! \page def_action How to Define An Action? + * + * A action must implement following 4 functions. + * \li start, + * \li step, + * \li stop, + * \li free, + * \li *_new(), and + * \li add *_new() to \ref animate.h . + * + * *_new() must invokes mb_word_add_action() to add new object + * as one of actions in the word specified as an argument of it. + * It also means *_new() must have an argument with type of + * (mb_word_t *). + */ + +/*! \defgroup anim Animation + * \brief Animation is a set of functions to make graph moving. + * @{ + */ +typedef struct _mb_progm mb_progm_t; +typedef struct _mb_word mb_word_t; +typedef struct _mb_action mb_action_t; + +struct _mb_progm_complete { + event_t event; + mb_progm_t *progm; +}; +typedef struct _mb_progm_complete mb_progm_complete_t; + +extern mb_progm_t *mb_progm_new(int max_words, redraw_man_t *rdman); +extern void mb_progm_free(mb_progm_t *progm); +extern mb_word_t *mb_progm_next_word(mb_progm_t *progm, + const mb_timeval_t *start, + const mb_timeval_t *playing); +extern void mb_progm_start(mb_progm_t *progm, mb_tman_t *tman, + mb_timeval_t *now); +extern void mb_progm_abort(mb_progm_t *progm); +extern subject_t *mb_progm_get_complete(mb_progm_t *progm); + +/*! \defgroup ani_actions Animation Actions + * @{ + */ +extern mb_action_t *mb_shift_new(co_aix x, co_aix y, coord_t *coord, + mb_word_t *word); +extern mb_action_t *mb_chgcolor_new(co_comp_t r, co_comp_t g, + co_comp_t b, co_comp_t a, + paint_t *paint, mb_word_t *word); +extern mb_action_t *mb_rotate_new(float angle1, float angle2, + coord_t *coord, mb_word_t *word); + +enum { VIS_VISIBLE, VIS_HIDDEN }; +extern mb_action_t *mb_visibility_new(int visib, coord_t *coord, + mb_word_t *word); +/* @} */ + +/*! \defgroup act_support Action Supports. + * @{ + */ +/*! \brief Basic class of animation actions. + * + * \sa \ref def_action + */ +struct _mb_action { + void (*start)(mb_action_t *act, + const mb_timeval_t *now, + const mb_timeval_t *playing_time, + redraw_man_t *rdman); + void (*step)(mb_action_t *act, const mb_timeval_t *now, + redraw_man_t *rdman); + void (*stop)(mb_action_t *act, const mb_timeval_t *now, + redraw_man_t *rdman); + void (*free)(mb_action_t *act); + mb_action_t *next; +}; + +extern void mb_word_add_action(mb_word_t *word, mb_action_t *act); +/* @} */ + +/* @} */ + +#endif /* __ANIMATE_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 include/mb/mb.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/mb/mb.h Tue Nov 04 17:00:26 2008 +0800 @@ -0,0 +1,10 @@ +#ifndef __MB_H_ +#define __MB_H_ + +#include "mb_types.h" +#include "redraw_man.h" +#include "X_supp.h" +#include "animate.h" +#include "shapes.h" + +#endif /* __MB_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 include/mb/mb_timer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/mb/mb_timer.h Tue Nov 04 17:00:26 2008 +0800 @@ -0,0 +1,78 @@ +#ifndef __MB_TIMER_H_ +#define __MB_TIMER_H_ + +#include +#include + +typedef uint32_t mbsec_t; +typedef uint32_t mbusec_t; +typedef struct _mb_timer mb_timer_t; +typedef struct _mb_tman mb_tman_t; +typedef struct timeval mb_timeval_t; + + +typedef void (*mb_tmo_hdlr)(const mb_timeval_t *tmo, + const mb_timeval_t *now, + void *arg); + +extern mb_tman_t *mb_tman_new(void); +extern void mb_tman_free(mb_tman_t *tman); +extern mb_timer_t *mb_tman_timeout(mb_tman_t *tman, + const mb_timeval_t *tmo, + mb_tmo_hdlr hdlr, void *arg); +extern int mb_tman_remove(mb_tman_t *tman, mb_timer_t *timer); +extern int mb_tman_next_timeout(mb_tman_t *tman, + const mb_timeval_t *now, + mb_timeval_t *tmo_after); +extern int mb_tman_handle_timeout(mb_tman_t *tman, mb_timeval_t *now); + +#define MB_TIMEVAL_SET(_tv, _sec, _usec) \ + do { \ + (_tv)->tv_sec = _sec; \ + (_tv)->tv_usec = _usec; \ + } while(0) +#define MB_TIMEVAL_CP(_tv1, _tv2) \ + do { \ + (_tv1)->tv_sec = (_tv2)->tv_sec; \ + (_tv1)->tv_usec = (_tv2)->tv_usec; \ + } while(0) +#define MB_TIMEVAL_SEC(_tv) ((_tv)->tv_sec) +#define MB_TIMEVAL_USEC(_tv) ((_tv)->tv_usec) +#define MB_TIMEVAL_LATER(a, b) \ + ((a)->tv_sec > (b)->tv_sec || \ + ((a)->tv_sec == (b)->tv_sec && \ + (a)->tv_usec > (b)->tv_usec)) +#define MB_TIMEVAL_LATER_INC(a, b) \ + ((a)->tv_sec > (b)->tv_sec || \ + ((a)->tv_sec == (b)->tv_sec && \ + (a)->tv_usec >= (b)->tv_usec)) +#define MB_TIMEVAL_EQ(a, b) \ + ((a)->tv_sec == (b)->tv_sec && \ + (a)->tv_usec == (b)->tv_usec) +#define MB_TIMEVAL_DIFF(a, b) \ + do { \ + (a)->tv_sec -= (b)->tv_sec; \ + if((a)->tv_usec < (b)->tv_usec) { \ + (a)->tv_sec--; \ + (a)->tv_usec += 1000000; \ + } \ + (a)->tv_usec -= (b)->tv_usec; \ + } while(0) +#define MB_TIMEVAL_ADD(a, b) \ + do { \ + (a)->tv_sec += (b)->tv_sec; \ + (a)->tv_usec += (b)->tv_usec; \ + if((a)->tv_usec >= 1000000) { \ + (a)->tv_sec++; \ + (a)->tv_usec -= 1000000; \ + } \ + } while(0) +#define MB_TIMEVAL_DIV(a, b) \ + (((a)->tv_sec * 1000000.0 + (a)->tv_usec) / \ + ((b)->tv_sec * 1000000.0 + (b)->tv_usec)) + + +extern void get_now(mb_timeval_t *tmo); + + +#endif /* __MB_TIMER_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 include/mb/mb_types.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/mb/mb_types.h Tue Nov 04 17:00:26 2008 +0800 @@ -0,0 +1,189 @@ +#ifndef __MB_TYPES_H_ +#define __MB_TYPES_H_ + +#include +#include "tools.h" +#include "observer.h" + +typedef float co_aix; +typedef struct _shape shape_t; +typedef struct _geo geo_t; +typedef struct _area area_t; +typedef struct _shnode shnode_t; +typedef struct _paint paint_t; + +struct _redraw_man; + +/*! \brief Base of paint types. + * + * Paints should be freed by users by calling rdman_paint_free() of + * the paint. + * + * \todo move member functions to a seperate structure and setup a + * singleton fro each paint type. + */ +struct _paint { + int flags; + void (*prepare)(paint_t *paint, cairo_t *cr); + void (*free)(struct _redraw_man *rdman, paint_t *paint); + STAILQ(shnode_t) members; + paint_t *pnt_next; /*!< \brief Collect all paints of a rdman. */ +}; + +#define PNTF_FREE 0x1 + +struct _shnode { + shape_t *shape; + shnode_t *next; +}; + +struct _area { + co_aix x, y; + co_aix w, h; +}; + +/*! \brief Geometry data of a shape or a group of shape. + */ +struct _geo { +#ifdef GEO_ORDER + unsigned int order; +#endif + unsigned int flags; + shape_t *shape; + geo_t *coord_next; /*!< \brief Link all member geos together. */ + + area_t *cur_area, *last_area; + area_t areas[2]; + + subject_t *mouse_event; +}; +#define GEF_DIRTY 0x1 +#define GEF_HIDDEN 0x2 /*!< The geo is hidden. */ +#define GEF_FREE 0x4 + +extern int is_overlay(area_t *r1, area_t *r2); +extern void area_init(area_t *area, int n_pos, co_aix pos[][2]); +extern void geo_init(geo_t *g); +extern void geo_from_positions(geo_t *g, int n_pos, co_aix pos[][2]); +extern void geo_mark_overlay(geo_t *g, int n_others, geo_t **others, + int *n_overlays, geo_t **overlays); +#define geo_get_shape(g) ((g)->shape) +#define geo_set_shape(g, sh) do {(g)->shape = sh;} while(0) +#define _geo_is_in(a, s, w) ((a) >= (s) && (a) < ((s) + (w))) +#define geo_pos_is_in(g, _x, _y) \ + (_geo_is_in(_x, (g)->cur_area->x, (g)->cur_area->w) && \ + _geo_is_in(_y, (g)->cur_area->y, (g)->cur_area->h)) + + +/*! \brief A coordination system. + * + * It have a transform function defined by matrix to transform + * coordination from source space to target space. + * Source space is where the contained is drawed, and target space + * is where the coordination of parent container of the element + * represented by this coord object. + * + * \dot + * digraph G { + * graph [rankdir=LR]; + * root -> child00 -> child10 -> child20 [label="children" color="blue"]; + * child00 -> child01 -> child02 [label="sibling"]; + * child10 -> child11 [label="sibling"]; + * } + * \enddot + */ +typedef struct _coord { + unsigned int order; + unsigned int flags; + co_aix opacity; + /*! Own one or inherit from an ancestor. + * Setup it when clean coords. + * \sa + * - \ref COF_OWN_CANVAS + * - \ref redraw + */ + cairo_t *canvas; + area_t *cur_area, *last_area; + area_t areas[2]; + + co_aix matrix[6]; + co_aix aggr_matrix[6]; + + struct _coord *parent; + STAILQ(struct _coord) children; + struct _coord *sibling; + unsigned int before_pmem; /*!< \brief The coord is before nth member + * of parent. */ + + int num_members; + STAILQ(geo_t) members; /*!< \brief All geo_t members in this coord. */ + + STAILQ(shape_t) shapes; /*!< \brief All shapes managed by the rdman. */ + + subject_t *mouse_event; +} coord_t; +#define COF_DIRTY 0x1 +#define COF_HIDDEN 0x2 /*!< A coord is hidden. */ +#define COF_OWN_CANVAS 0x4 /*!< A coord owns a canvas or inherit it + * from an ancestor. + */ +#define COF_SKIP_TRIVAL 0x8 /*!< temporary skip descendants + * when trivaling. + */ +#define COF_FREE 0x10 + +extern void coord_init(coord_t *co, coord_t *parent); +extern void coord_trans_pos(coord_t *co, co_aix *x, co_aix *y); +extern co_aix coord_trans_size(coord_t *co, co_aix size); +extern void compute_aggr_of_coord(coord_t *coord); +extern void update_aggr_matrix(coord_t *start); +extern coord_t *preorder_coord_subtree(coord_t *root, coord_t *last); +extern coord_t *postorder_coord_subtree(coord_t *root, coord_t *last); +extern void preorder_coord_skip_subtree(coord_t *subroot); +#define preorder_coord_skip_subtree(sub) \ + do { (sub)->flags |= COF_SKIP_TRIVAL; } while(0) +#define coord_hide(co) \ + do { \ + (co)->flags |= COF_HIDDEN; \ + } while(0) +#define coord_show(co) do { co->flags &= ~COF_HIDDEN; } while(0) +#define coord_get_mouse_event(coord) ((coord)->mouse_event) + + +/*! \brief A grahpic shape. + * + * \dot + * digraph G { + * "shape" -> "coord"; + * "shape" -> "geo"; + * "geo" -> "shape"; + * "coord" -> "shape" [label="members"] + * "shape" -> "shape" [label="sibling"]; + * } + * \enddot + */ +struct _shape { + int sh_type; + geo_t *geo; + coord_t *coord; + paint_t *fill, *stroke; + co_aix stroke_width; + int stroke_linecap:2; + int stroke_linejoin:2; + struct _shape *sh_next; /*!< Link all shapes of a rdman together. */ + void (*free)(shape_t *shape); +}; +enum { SHT_UNKNOW, SHT_PATH, SHT_TEXT, SHT_RECT }; + +#define sh_get_mouse_event_subject(sh) ((sh)->geo->mouse_event) +#define sh_hide(sh) \ + do { \ + (sh)->geo->flags |= GEF_HIDDEN; \ + } while(0) +#define sh_show(sh) \ + do { \ + (sh)->geo->flags &= ~GEF_HIDDEN; \ + } while(0) + + +#endif /* __MB_TYPES_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 include/mb/observer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/mb/observer.h Tue Nov 04 17:00:26 2008 +0800 @@ -0,0 +1,91 @@ +#ifndef __OBSERVER_H_ +#define __OBSERVER_H_ + +#include "tools.h" + +typedef struct _event event_t; +typedef struct _observer observer_t; +typedef struct _subject subject_t; +typedef struct _mouse_event mouse_event_t; +typedef struct _ob_factory ob_factory_t; +typedef void (*evt_handler)(event_t *event, void *arg); + +struct _event { + int type; /*!< event type (a.k.a. EVT_* */ + subject_t *tgt, *cur_tgt; +}; + +/*! \brief Observer of observer pattern. + * + * A target for receiving events. + */ +struct _observer { + evt_handler hdr; + void *arg; + observer_t *next; +}; + +/*! \brief Subject of observer pattern. + * + * Observer is a pattern to decouple caller and callee, + * especial for multiple callee. + * \see http://en.wikipedia.org/wiki/Observer_pattern + */ +struct _subject { + int obj_type; /*!< \brief type of object (a.k.a. OBJT_*). */ + void *obj; /*!< \brief the object this subject for. */ + int flags; + STAILQ(observer_t) observers; +}; +/*! \brief Flag that make a subject to propagate events to parents. */ +#define SUBF_STOP_PROPAGATE 0x1 +#define SUBF_BUSY 0x2 /*!< \brief in subject_notify() */ +#define SUBF_FREE 0x4 /*!< \brief in postponding subject_free() */ + +enum {OBJT_GEO, OBJT_COORD, OBJT_KB, OBJT_PROGM, OBJT_RDMAN}; + +struct _mouse_event { + event_t event; + int x, y; + unsigned int but_state; + unsigned int button; +}; + +#define MOUSE_BUT1 0x1 +#define MOUSE_BUT2 0x2 +#define MOUSE_BUT3 0x4 + +/*! \brief Observer factory. + * + * It provides functions for allocation of subject and observer objects, + * and strategy function for getting the subject of parent coord object. + */ +struct _ob_factory { + subject_t *(*subject_alloc)(ob_factory_t *factory); + void (*subject_free)(ob_factory_t *factory, subject_t *subject); + observer_t *(*observer_alloc)(ob_factory_t *factory); + void (*observer_free)(ob_factory_t *factory, observer_t *observer); + /*! This is a strategy function to get subjects of parents. */ + subject_t *(*get_parent_subject)(ob_factory_t *factory, + subject_t *cur_subject); +}; + +enum {EVT_MOUSE_OVER, EVT_MOUSE_OUT, EVT_MOUSE_MOVE, + EVT_MOUSE_BUT_PRESS, EVT_MOUSE_BUT_RELEASE, + EVT_KB_PRESS, EVT_KB_RELEASE, EVT_PROGM_COMPLETE, + EVT_RDMAN_REDRAW }; + +extern subject_t *subject_new(ob_factory_t *factory, + void *obj, int obj_type); +extern void subject_free(ob_factory_t *factory, subject_t *subject); +extern void subject_notify(ob_factory_t *factory, + subject_t *subject, event_t *evt); +extern observer_t *subject_add_observer(ob_factory_t *factory, + subject_t *subject, + evt_handler hdr, void *arg); +extern void subject_remove_observer(ob_factory_t *factory, + subject_t *subject, + observer_t *observer); + + +#endif /* __OBSERVER_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 include/mb/paint.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/mb/paint.h Tue Nov 04 17:00:26 2008 +0800 @@ -0,0 +1,57 @@ +#ifndef __PAINT_H_ +#define __PAINT_H_ + +#include +#include "mb_types.h" +#include "redraw_man.h" +#include "tools.h" + +typedef float co_comp_t; + +extern paint_t *rdman_paint_color_new(redraw_man_t *rdman, + co_comp_t r, co_comp_t g, + co_comp_t b, co_comp_t a); +extern void paint_color_set(paint_t *paint, + co_comp_t r, co_comp_t g, + co_comp_t b, co_comp_t a); +extern void paint_color_get(paint_t *paint, + co_comp_t *r, co_comp_t *g, + co_comp_t *b, co_comp_t *a); +#define paint_init(_paint, _prepare, _free) \ + do { \ + (_paint)->flags = 0; \ + (_paint)->prepare = _prepare; \ + (_paint)->free = _free; \ + STAILQ_INIT((_paint)->members); \ + (_paint)->pnt_next = NULL; \ + } while(0) \ + + +typedef struct _grad_stop { + co_aix offset; + co_comp_t r, g, b, a; +} grad_stop_t; + +extern paint_t *rdman_paint_linear_new(redraw_man_t *rdman, + co_aix x1, co_aix y1, + co_aix x2, co_aix y2); +extern grad_stop_t *paint_linear_stops(paint_t *paint, + int n_stops, + grad_stop_t *stops); +extern paint_t *rdman_paint_radial_new(redraw_man_t *rdman, + co_aix cx, co_aix cy, co_aix r); +extern grad_stop_t *paint_radial_stops(paint_t *paint, + int n_stops, + grad_stop_t *stops); + +#define grad_stop_init(stop, _offset, _r, _g, _b, _a) \ + do { \ + (stop)->offset = _offset; \ + (stop)->r = _r; \ + (stop)->g = _g; \ + (stop)->b = _b; \ + (stop)->a = _a; \ + } while(0) + + +#endif /* __PAINT_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 include/mb/redraw_man.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/mb/redraw_man.h Tue Nov 04 17:00:26 2008 +0800 @@ -0,0 +1,160 @@ +#ifndef __REDRAW_MAN_H_ +#define __REDRAW_MAN_H_ + +#include +#include "tools.h" +#include "mb_types.h" +#include "observer.h" + +typedef struct _redraw_man redraw_man_t; + +typedef void (*free_func_t)(redraw_man_t *rdman, void *obj); +struct _free_obj { + void *obj; + free_func_t free_func; +}; +typedef struct _free_obj free_obj_t; +struct _free_objs { + int num, max; + free_obj_t *objs; +}; +typedef struct _free_objs free_objs_t; + +DARRAY(coords, coord_t *); +DARRAY(geos, geo_t *); +DARRAY(areas, area_t *); + +/*! \brief Manage redrawing of shapes (graphic elements). + * + * Every coord_t and geo_t object is assigned with a unique + * incremental order. The order is a unsigned integer. + * Every time a new coord_t or geo_t object is added, it is + * assigned with a order number that 1 bigger than last one + * until reaching maximum of unsigned integer. + * When a maximum is meet, all coord_t or geo_t objects + * are reasigned with a new order number from 1. It means + * order numbers that have been assigned and then removed + * later are recycled. + * + * Dirty flag is clear when the transformation matrix of a coord + * object been recomputed or when a geo_t objects been redrawed. + */ +struct _redraw_man { + unsigned int next_coord_order; + int n_coords; + coord_t *root_coord; + + elmpool_t *geo_pool; + elmpool_t *coord_pool; + elmpool_t *shnode_pool; + elmpool_t *observer_pool; + elmpool_t *subject_pool; + elmpool_t *paint_color_pool; + + coords_t dirty_coords; + geos_t dirty_geos; + areas_t dirty_areas; + + geos_t gen_geos; + + STAILQ(shape_t) shapes; /*!< \brief All managed shapes. */ + STAILQ(paint_t) paints; /*!< \brief All managed paints. */ + + free_objs_t free_objs; + + cairo_t *cr; + cairo_t *backend; + + ob_factory_t ob_factory; + + subject_t *redraw; /*!< \brief Notified after redrawing. */ +}; + +extern int redraw_man_init(redraw_man_t *rdman, cairo_t *cr, + cairo_t *backend); +extern void redraw_man_destroy(redraw_man_t *rdman); +extern int rdman_find_overlaid_shapes(redraw_man_t *rdman, + geo_t *geo, + geo_t ***overlays); +extern int rdman_add_shape(redraw_man_t *rdman, + shape_t *shape, coord_t *coord); +/*! \brief Make a shape been managed by a redraw manager. */ +#define rdman_shape_man(rdman, shape) \ + STAILQ_INS_TAIL(rdman->shapes, shape_t, sh_next, shape) +extern int rdman_shape_free(redraw_man_t *rdman, shape_t *shape); + +#define rdman_paint_man(rdman, paint) \ + STAILQ_INS_TAIL(rdman->paints, paint_t, pnt_next, shape) +extern int rdman_paint_free(redraw_man_t *rdman, paint_t *paint); + +extern coord_t *rdman_coord_new(redraw_man_t *rdman, coord_t *parent); +extern int rdman_coord_free(redraw_man_t *rdman, coord_t *coord); +extern int rdman_coord_subtree_free(redraw_man_t *rdman, coord_t *subtree); +extern int rdman_coord_changed(redraw_man_t *rdman, coord_t *coord); +extern int rdman_shape_changed(redraw_man_t *rdman, shape_t *shape); +extern int rdman_redraw_changed(redraw_man_t *rdman); +extern int rdman_redraw_all(redraw_man_t *rdman); +extern int rdman_redraw_area(redraw_man_t *rdman, co_aix x, co_aix y, + co_aix w, co_aix h); +extern geo_t *rdman_geos(redraw_man_t *rdman, geo_t *last); +extern int rdman_force_clean(redraw_man_t *rdman); +extern shnode_t *shnode_new(redraw_man_t *rdman, shape_t *shape); +#define shnode_free(rdman, node) elmpool_elm_free((rdman)->shnode_pool, node) +#define shnode_list_free(rdman, q) \ + do { \ + shnode_t *__node, *__last; \ + __last = STAILQ_HEAD(q); \ + if(__last == NULL) break; \ + for(__node = STAILQ_NEXT(shnode_t, next, __last); \ + __node != NULL; \ + __node = STAILQ_NEXT(shnode_t, next, __node)) { \ + shnode_free(rdman, __last); \ + __last = __node; \ + } \ + shnode_free(rdman, __last); \ + } while(0) +#define _rdman_paint_child(rdman, paint, shape) \ + do { \ + shnode_t *__node; \ + if((shape)->fill != (paint) && \ + (shape)->stroke != (paint)) { \ + __node = shnode_new(rdman, shape); \ + STAILQ_INS_TAIL((paint)->members, \ + shnode_t, next, __node); \ + } \ + } while(0) +extern void _rdman_paint_real_remove_child(redraw_man_t *rdman, + paint_t *paint, + shape_t *shape); +#define _rdman_paint_remove_child(rdman, paint, shape) \ + do { \ + if((shape)->fill == (shape)->stroke && \ + (shape)->stroke == paint) \ + break; \ + _rdman_paint_real_remove_child(rdman, paint, shape); \ + } while(0) +#define rdman_paint_fill(rdman, paint, shape) \ + do { \ + if((shape)->fill == paint) \ + break; \ + _rdman_paint_remove_child(rdman, paint, shape); \ + _rdman_paint_child(rdman, paint, shape); \ + (shape)->fill = paint; \ + } while(0) +#define rdman_paint_stroke(rdman, paint, shape) \ + do { \ + if((shape)->stroke == paint) \ + break; \ + _rdman_paint_remove_child(rdman, paint, shape); \ + _rdman_paint_child(rdman, paint, shape); \ + (shape)->stroke = paint; \ + } while(0) +extern int rdman_paint_changed(redraw_man_t *rdman, paint_t *paint); + +extern shape_t *find_shape_at_pos(redraw_man_t *rdman, + co_aix x, co_aix y, int *in_stroke); +#define rdman_get_ob_factory(rdman) (&(rdman)->ob_factory) +#define rdman_get_redraw_subject(rdman) ((rdman)->redraw) + + +#endif /* __REDRAW_MAN_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 include/mb/shapes.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/mb/shapes.h Tue Nov 04 17:00:26 2008 +0800 @@ -0,0 +1,72 @@ +/*! \file + * \brief Declare interfaces of shapes. + * + * \todo Add ellipse shape. + * \todo Add circle shape. + */ +#ifndef __SHAPES_H_ +#define __SHAPES_H_ + +#include +#include "mb_types.h" +#include "redraw_man.h" + +/*! \page define_shape How to Define Shapes + * + * A shape implementation must include + * - rdman_shape_*_new() + * - clear memory for shape_t member. + * - assign *_free() to \ref shape_t::free. + * - make new object been managed by a redraw manager. + * - call rdman_shape_man() + * - *_free() + * - assigned to \ref shape_t::free. + * - *_transform() + * - *_draw() + * - first member variable of a shape type must be a shape_t. + * + * Must modify + * - event.c::draw_shape_path() + * - redraw_man.c::clean_shape() + * - redraw_man.c::draw_shape() + */ + +/*! \defgroup shapes Shapes + * @{ + */ + +/*! \defgroup shape_path Shape of Path + * @{ + */ +extern shape_t *rdman_shape_path_new(redraw_man_t *rdman, char *data); +extern void sh_path_transform(shape_t *shape); +extern void sh_path_draw(shape_t *shape, cairo_t *cr); +/* @} */ + +/*! \defgroup shape_text Shape of Text + * @{ + */ +extern shape_t *rdman_shape_text_new(redraw_man_t *rdman, + const char *txt, co_aix x, co_aix y, + co_aix font_size, + cairo_font_face_t *face); +extern void sh_text_set_text(shape_t *shape, const char *txt); +extern void sh_text_transform(shape_t *shape); +extern void sh_text_draw(shape_t *shape, cairo_t *cr); +/* @} */ + +/*! \defgroup shape_rect Shape of Rectangle + * @{ + */ +extern shape_t *rdman_shape_rect_new(redraw_man_t *rdman, + co_aix x, co_aix y, + co_aix w, co_aix h, + co_aix rx, co_aix ry); +extern void sh_rect_transform(shape_t *shape); +extern void sh_rect_draw(shape_t *shape, cairo_t *cr); +extern void sh_rect_set(shape_t *shape, co_aix x, co_aix y, + co_aix w, co_aix h, co_aix rx, co_aix ry); +/* @} */ +/* @} */ + +#endif /* __SHAPES_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 include/mb/tools.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/mb/tools.h Tue Nov 04 17:00:26 2008 +0800 @@ -0,0 +1,136 @@ +#ifndef __TOOLS_H_ +#define __TOOLS_H_ + +typedef struct _elmpool elmpool_t; + +extern elmpool_t *elmpool_new(int elm_sz, int inc_num); +extern void *elmpool_elm_alloc(elmpool_t *pool); +extern void elmpool_elm_free(elmpool_t *pool, void *elm); +extern void elmpool_free(elmpool_t *pool); + + +#define STAILQ(type) \ + struct { \ + type *head; \ + type *tail; \ + } +#define STAILQ_INIT(q) \ + do { \ + (q).head = (q).tail = NULL; \ + } while(0) +#define STAILQ_CLEAN(q) STAILQ_INIT(q) +#define STAILQ_HEAD(q) ((q).head) +#define STAILQ_TAIL(q) ((q).tail) +#define STAILQ_NEXT(type, field, elm) ((elm)->field) +#define STAILQ_INS(q, type, field, elm) \ + do { \ + (elm)->field = (q).head; \ + (q).head = elm; \ + if((q).tail == NULL) \ + (q).tail = elm; \ + } while(0) +#define STAILQ_INS_TAIL(q, type, field, elm) \ + do { \ + (elm)->field = NULL; \ + if((q).tail != NULL) \ + (q).tail->field = elm; \ + (q).tail = elm; \ + if((q).head == NULL) \ + (q).head = elm; \ + } while(0) +#define STAILQ_INS_AFTER(type, field, follow, elm) \ + do { \ + (follow)->field = (elm)->field; \ + (elm)->field = follow; \ + } while(0) +#define STAILQ_REMOVE(q, type, field, elm) \ + do { \ + if((elm) == (q).head) { \ + (q).head = (elm)->field; \ + if((q).head == NULL) \ + (q).tail = NULL; \ + } else { \ + type *_stailq_cur = (q).head; \ + while(_stailq_cur != NULL && \ + _stailq_cur->field != (elm)) \ + _stailq_cur = _stailq_cur->field; \ + if(_stailq_cur != NULL) { \ + _stailq_cur->field = (elm)->field; \ + if((q).tail == (elm)) \ + (q).tail = _stailq_cur; \ + } \ + } \ + } while(0) + +/*! \defgroup darray Dynamic Array + * + * DARRAY is a dynamic sized array/list, it's length is a variable. + * It is extended, automatically, if it is full and more elemnts are + * putted in. + * + * Users of DARRAY must declare a new type to store data. The way to + * declear a new type is to invoke DARRAY() with paramters of name of + * type and type of data to be stored in. The new storage type is named + * with foo_t where foo is the name you pass in. + * + * DARRAY_DEFINE() is inovked to define foo_add() function; foo is name + * of storage type. You can call foo_add() to add a data element + * into a storage object. + * + * Get ith element in a storage object, use + * \code + * obj->ds[i] + * \endcode + * + * To loop over elements in a storage object, us + * \code + * for(i = 0; i < obj->num; i++) { + * v = obj->ds[i]; + * ...... + * } + * \endcode + * @{ + */ +/*! \brief Declare a DARRAY storage type. + * + * \param name is name of storage type. + * \param type is type of data elements that will be stored in. + * + * Type of _t is defined by the macro. It is used to define a + * storage object to contain data elements. + */ +#define DARRAY(name, type) \ + struct _ ## name { \ + int max, num; \ + type *ds; \ + }; \ + typedef struct _ ## name name ## _t +#define DARRAY_DEFINE(name, type) \ + static int name ## _add(name ## _t *da, type v) { \ + type *new_ds; \ + int max; \ + if(da->num >= (da)->max) { \ + max = (da)->max + 32; \ + new_ds = realloc(da->ds, \ + max * sizeof(type)); \ + if(new_ds == NULL) return -1; \ + da->ds = new_ds; \ + da->max = max; \ + } \ + da->ds[da->num++] = v; \ + return 0; \ + } +#define DARRAY_CLEAN(da) do { (da)->num = 0; } while(0) +#define DARRAY_INIT(da) do { (da)->num = (da)->max = 0; (da)->ds = NULL; } +#define DARRAY_DESTROY(da) do { if((da)->ds) free((da)->ds); } while(0) +/* @} */ + +#include + +#define O_ALLOC(type) ((type *)malloc(sizeof(type))) + +#define OFFSET(type, mem) (((void *)&((type *)NULL)->mem) - NULL) +#define MEM2OBJ(var, type, mem) ((type *)((void *)var - OFFSET(type, mem))) +#define OFF2TYPE(obj, off, type) (*(type *)((void *)(obj) + (off))) + +#endif /* __TOOLS_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 mb --- a/mb Sun Nov 02 14:30:03 2008 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -src \ No newline at end of file diff -r 13c1d49c198b -r c7e5b8779bb5 src/Makefile.am --- a/src/Makefile.am Sun Nov 02 14:30:03 2008 +0800 +++ b/src/Makefile.am Tue Nov 04 17:00:26 2008 +0800 @@ -1,5 +1,4 @@ -includedir = $(prefix)/include/mb -include_HEADERS = animate.h mb.h mb_timer.h mb_types.h observer.h paint.h redraw_man.h shapes.h tools.h X_supp.h +include $(top_srcdir)/config.mk lib_LTLIBRARIES = libmbfly.la diff -r 13c1d49c198b -r c7e5b8779bb5 src/X_main.c --- a/src/X_main.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/X_main.c Tue Nov 04 17:00:26 2008 +0800 @@ -8,11 +8,11 @@ #include #include -#include "shapes.h" -#include "redraw_man.h" -#include "paint.h" -#include "mb_timer.h" -#include "animate.h" +#include "mb/shapes.h" +#include "mb/redraw_man.h" +#include "mb/paint.h" +#include "mb/mb_timer.h" +#include "mb/animate.h" #define OK 0 #define ERR -1 diff -r 13c1d49c198b -r c7e5b8779bb5 src/X_supp.c --- a/src/X_supp.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/X_supp.c Tue Nov 04 17:00:26 2008 +0800 @@ -5,9 +5,9 @@ #include #include #include -#include "redraw_man.h" -#include "mb_timer.h" -#include "X_supp.h" +#include "mb/redraw_man.h" +#include "mb/mb_timer.h" +#include "mb/X_supp.h" #define ERR -1 #define OK 0 diff -r 13c1d49c198b -r c7e5b8779bb5 src/X_supp.h --- a/src/X_supp.h Sun Nov 02 14:30:03 2008 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -#ifndef __X_SUPP_H_ -#define __X_SUPP_H_ - -#include -#include "mb_types.h" -#include "mb_timer.h" -#include "redraw_man.h" - -/*! \ingroup xkb - * @{ - */ -typedef struct _X_kb_info X_kb_info_t; - -struct _X_kb_event { - event_t event; - int keycode; - int sym; -}; -typedef struct _X_kb_event X_kb_event_t; - -/* @} */ - -typedef struct _X_MB_runtime X_MB_runtime_t; - -extern void X_MB_handle_connection(X_MB_runtime_t *rt); -extern X_MB_runtime_t *X_MB_new(const char *display_name, int w, int h); -extern void X_MB_free(X_MB_runtime_t *xmb_rt); - -extern subject_t *X_MB_kbevents(X_MB_runtime_t *xmb_rt); -extern redraw_man_t *X_MB_rdman(X_MB_runtime_t *xmb_rt); -extern mb_tman_t *X_MB_tman(X_MB_runtime_t *xmb_rt); -extern ob_factory_t *X_MB_ob_factory(X_MB_runtime_t *xmb_rt); - -#endif diff -r 13c1d49c198b -r c7e5b8779bb5 src/animate.c --- a/src/animate.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/animate.c Tue Nov 04 17:00:26 2008 +0800 @@ -68,10 +68,10 @@ #include #include #include -#include "mb_types.h" -#include "redraw_man.h" -#include "mb_timer.h" -#include "animate.h" +#include "mb/mb_types.h" +#include "mb/redraw_man.h" +#include "mb/mb_timer.h" +#include "mb/animate.h" #define STEP_INTERVAL 90000 diff -r 13c1d49c198b -r c7e5b8779bb5 src/animate.h --- a/src/animate.h Sun Nov 02 14:30:03 2008 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -#ifndef __ANIMATE_H_ -#define __ANIMATE_H_ - -#include "mb_types.h" -#include "mb_timer.h" -#include "paint.h" - -/*! \page def_action How to Define An Action? - * - * A action must implement following 4 functions. - * \li start, - * \li step, - * \li stop, - * \li free, - * \li *_new(), and - * \li add *_new() to \ref animate.h . - * - * *_new() must invokes mb_word_add_action() to add new object - * as one of actions in the word specified as an argument of it. - * It also means *_new() must have an argument with type of - * (mb_word_t *). - */ - -/*! \defgroup anim Animation - * \brief Animation is a set of functions to make graph moving. - * @{ - */ -typedef struct _mb_progm mb_progm_t; -typedef struct _mb_word mb_word_t; -typedef struct _mb_action mb_action_t; - -struct _mb_progm_complete { - event_t event; - mb_progm_t *progm; -}; -typedef struct _mb_progm_complete mb_progm_complete_t; - -extern mb_progm_t *mb_progm_new(int max_words, redraw_man_t *rdman); -extern void mb_progm_free(mb_progm_t *progm); -extern mb_word_t *mb_progm_next_word(mb_progm_t *progm, - const mb_timeval_t *start, - const mb_timeval_t *playing); -extern void mb_progm_start(mb_progm_t *progm, mb_tman_t *tman, - mb_timeval_t *now); -extern void mb_progm_abort(mb_progm_t *progm); -extern subject_t *mb_progm_get_complete(mb_progm_t *progm); - -/*! \defgroup ani_actions Animation Actions - * @{ - */ -extern mb_action_t *mb_shift_new(co_aix x, co_aix y, coord_t *coord, - mb_word_t *word); -extern mb_action_t *mb_chgcolor_new(co_comp_t r, co_comp_t g, - co_comp_t b, co_comp_t a, - paint_t *paint, mb_word_t *word); -extern mb_action_t *mb_rotate_new(float angle1, float angle2, - coord_t *coord, mb_word_t *word); - -enum { VIS_VISIBLE, VIS_HIDDEN }; -extern mb_action_t *mb_visibility_new(int visib, coord_t *coord, - mb_word_t *word); -/* @} */ - -/*! \defgroup act_support Action Supports. - * @{ - */ -/*! \brief Basic class of animation actions. - * - * \sa \ref def_action - */ -struct _mb_action { - void (*start)(mb_action_t *act, - const mb_timeval_t *now, - const mb_timeval_t *playing_time, - redraw_man_t *rdman); - void (*step)(mb_action_t *act, const mb_timeval_t *now, - redraw_man_t *rdman); - void (*stop)(mb_action_t *act, const mb_timeval_t *now, - redraw_man_t *rdman); - void (*free)(mb_action_t *act); - mb_action_t *next; -}; - -extern void mb_word_add_action(mb_word_t *word, mb_action_t *act); -/* @} */ - -/* @} */ - -#endif /* __ANIMATE_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 src/chgcolor.c --- a/src/chgcolor.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/chgcolor.c Tue Nov 04 17:00:26 2008 +0800 @@ -1,7 +1,7 @@ #include #include -#include "animate.h" -#include "paint.h" +#include "mb/animate.h" +#include "mb/paint.h" static float comp_mb_timeval_ratio(const mb_timeval_t *a, const mb_timeval_t *b) { diff -r 13c1d49c198b -r c7e5b8779bb5 src/coord.c --- a/src/coord.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/coord.c Tue Nov 04 17:00:26 2008 +0800 @@ -5,7 +5,7 @@ #include #include #include -#include "mb_types.h" +#include "mb/mb_types.h" #define ASSERT(x) diff -r 13c1d49c198b -r c7e5b8779bb5 src/event.c --- a/src/event.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/event.c Tue Nov 04 17:00:26 2008 +0800 @@ -1,9 +1,9 @@ #include #include #include -#include "mb_types.h" -#include "redraw_man.h" -#include "shapes.h" +#include "mb/mb_types.h" +#include "mb/redraw_man.h" +#include "mb/shapes.h" #define OK 0 #define ERR -1 diff -r 13c1d49c198b -r c7e5b8779bb5 src/geo.c --- a/src/geo.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/geo.c Tue Nov 04 17:00:26 2008 +0800 @@ -6,7 +6,7 @@ */ #include #include -#include "mb_types.h" +#include "mb/mb_types.h" static int is_scale_overlay(co_aix x1, co_aix w1, co_aix x2, co_aix w2) { if(x1 > x2) { diff -r 13c1d49c198b -r c7e5b8779bb5 src/mb.h --- a/src/mb.h Sun Nov 02 14:30:03 2008 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -#ifndef __MB_H_ -#define __MB_H_ - -#include "mb_types.h" -#include "redraw_man.h" -#include "X_supp.h" -#include "animate.h" -#include "shapes.h" - -#endif /* __MB_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 src/mb_timer.h --- a/src/mb_timer.h Sun Nov 02 14:30:03 2008 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -#ifndef __MB_TIMER_H_ -#define __MB_TIMER_H_ - -#include -#include - -typedef uint32_t mbsec_t; -typedef uint32_t mbusec_t; -typedef struct _mb_timer mb_timer_t; -typedef struct _mb_tman mb_tman_t; -typedef struct timeval mb_timeval_t; - - -typedef void (*mb_tmo_hdlr)(const mb_timeval_t *tmo, - const mb_timeval_t *now, - void *arg); - -extern mb_tman_t *mb_tman_new(void); -extern void mb_tman_free(mb_tman_t *tman); -extern mb_timer_t *mb_tman_timeout(mb_tman_t *tman, - const mb_timeval_t *tmo, - mb_tmo_hdlr hdlr, void *arg); -extern int mb_tman_remove(mb_tman_t *tman, mb_timer_t *timer); -extern int mb_tman_next_timeout(mb_tman_t *tman, - const mb_timeval_t *now, - mb_timeval_t *tmo_after); -extern int mb_tman_handle_timeout(mb_tman_t *tman, mb_timeval_t *now); - -#define MB_TIMEVAL_SET(_tv, _sec, _usec) \ - do { \ - (_tv)->tv_sec = _sec; \ - (_tv)->tv_usec = _usec; \ - } while(0) -#define MB_TIMEVAL_CP(_tv1, _tv2) \ - do { \ - (_tv1)->tv_sec = (_tv2)->tv_sec; \ - (_tv1)->tv_usec = (_tv2)->tv_usec; \ - } while(0) -#define MB_TIMEVAL_SEC(_tv) ((_tv)->tv_sec) -#define MB_TIMEVAL_USEC(_tv) ((_tv)->tv_usec) -#define MB_TIMEVAL_LATER(a, b) \ - ((a)->tv_sec > (b)->tv_sec || \ - ((a)->tv_sec == (b)->tv_sec && \ - (a)->tv_usec > (b)->tv_usec)) -#define MB_TIMEVAL_LATER_INC(a, b) \ - ((a)->tv_sec > (b)->tv_sec || \ - ((a)->tv_sec == (b)->tv_sec && \ - (a)->tv_usec >= (b)->tv_usec)) -#define MB_TIMEVAL_EQ(a, b) \ - ((a)->tv_sec == (b)->tv_sec && \ - (a)->tv_usec == (b)->tv_usec) -#define MB_TIMEVAL_DIFF(a, b) \ - do { \ - (a)->tv_sec -= (b)->tv_sec; \ - if((a)->tv_usec < (b)->tv_usec) { \ - (a)->tv_sec--; \ - (a)->tv_usec += 1000000; \ - } \ - (a)->tv_usec -= (b)->tv_usec; \ - } while(0) -#define MB_TIMEVAL_ADD(a, b) \ - do { \ - (a)->tv_sec += (b)->tv_sec; \ - (a)->tv_usec += (b)->tv_usec; \ - if((a)->tv_usec >= 1000000) { \ - (a)->tv_sec++; \ - (a)->tv_usec -= 1000000; \ - } \ - } while(0) -#define MB_TIMEVAL_DIV(a, b) \ - (((a)->tv_sec * 1000000.0 + (a)->tv_usec) / \ - ((b)->tv_sec * 1000000.0 + (b)->tv_usec)) - - -extern void get_now(mb_timeval_t *tmo); - - -#endif /* __MB_TIMER_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 src/mb_types.h --- a/src/mb_types.h Sun Nov 02 14:30:03 2008 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,189 +0,0 @@ -#ifndef __MB_TYPES_H_ -#define __MB_TYPES_H_ - -#include -#include "tools.h" -#include "observer.h" - -typedef float co_aix; -typedef struct _shape shape_t; -typedef struct _geo geo_t; -typedef struct _area area_t; -typedef struct _shnode shnode_t; -typedef struct _paint paint_t; - -struct _redraw_man; - -/*! \brief Base of paint types. - * - * Paints should be freed by users by calling rdman_paint_free() of - * the paint. - * - * \todo move member functions to a seperate structure and setup a - * singleton fro each paint type. - */ -struct _paint { - int flags; - void (*prepare)(paint_t *paint, cairo_t *cr); - void (*free)(struct _redraw_man *rdman, paint_t *paint); - STAILQ(shnode_t) members; - paint_t *pnt_next; /*!< \brief Collect all paints of a rdman. */ -}; - -#define PNTF_FREE 0x1 - -struct _shnode { - shape_t *shape; - shnode_t *next; -}; - -struct _area { - co_aix x, y; - co_aix w, h; -}; - -/*! \brief Geometry data of a shape or a group of shape. - */ -struct _geo { -#ifdef GEO_ORDER - unsigned int order; -#endif - unsigned int flags; - shape_t *shape; - geo_t *coord_next; /*!< \brief Link all member geos together. */ - - area_t *cur_area, *last_area; - area_t areas[2]; - - subject_t *mouse_event; -}; -#define GEF_DIRTY 0x1 -#define GEF_HIDDEN 0x2 /*!< The geo is hidden. */ -#define GEF_FREE 0x4 - -extern int is_overlay(area_t *r1, area_t *r2); -extern void area_init(area_t *area, int n_pos, co_aix pos[][2]); -extern void geo_init(geo_t *g); -extern void geo_from_positions(geo_t *g, int n_pos, co_aix pos[][2]); -extern void geo_mark_overlay(geo_t *g, int n_others, geo_t **others, - int *n_overlays, geo_t **overlays); -#define geo_get_shape(g) ((g)->shape) -#define geo_set_shape(g, sh) do {(g)->shape = sh;} while(0) -#define _geo_is_in(a, s, w) ((a) >= (s) && (a) < ((s) + (w))) -#define geo_pos_is_in(g, _x, _y) \ - (_geo_is_in(_x, (g)->cur_area->x, (g)->cur_area->w) && \ - _geo_is_in(_y, (g)->cur_area->y, (g)->cur_area->h)) - - -/*! \brief A coordination system. - * - * It have a transform function defined by matrix to transform - * coordination from source space to target space. - * Source space is where the contained is drawed, and target space - * is where the coordination of parent container of the element - * represented by this coord object. - * - * \dot - * digraph G { - * graph [rankdir=LR]; - * root -> child00 -> child10 -> child20 [label="children" color="blue"]; - * child00 -> child01 -> child02 [label="sibling"]; - * child10 -> child11 [label="sibling"]; - * } - * \enddot - */ -typedef struct _coord { - unsigned int order; - unsigned int flags; - co_aix opacity; - /*! Own one or inherit from an ancestor. - * Setup it when clean coords. - * \sa - * - \ref COF_OWN_CANVAS - * - \ref redraw - */ - cairo_t *canvas; - area_t *cur_area, *last_area; - area_t areas[2]; - - co_aix matrix[6]; - co_aix aggr_matrix[6]; - - struct _coord *parent; - STAILQ(struct _coord) children; - struct _coord *sibling; - unsigned int before_pmem; /*!< \brief The coord is before nth member - * of parent. */ - - int num_members; - STAILQ(geo_t) members; /*!< \brief All geo_t members in this coord. */ - - STAILQ(shape_t) shapes; /*!< \brief All shapes managed by the rdman. */ - - subject_t *mouse_event; -} coord_t; -#define COF_DIRTY 0x1 -#define COF_HIDDEN 0x2 /*!< A coord is hidden. */ -#define COF_OWN_CANVAS 0x4 /*!< A coord owns a canvas or inherit it - * from an ancestor. - */ -#define COF_SKIP_TRIVAL 0x8 /*!< temporary skip descendants - * when trivaling. - */ -#define COF_FREE 0x10 - -extern void coord_init(coord_t *co, coord_t *parent); -extern void coord_trans_pos(coord_t *co, co_aix *x, co_aix *y); -extern co_aix coord_trans_size(coord_t *co, co_aix size); -extern void compute_aggr_of_coord(coord_t *coord); -extern void update_aggr_matrix(coord_t *start); -extern coord_t *preorder_coord_subtree(coord_t *root, coord_t *last); -extern coord_t *postorder_coord_subtree(coord_t *root, coord_t *last); -extern void preorder_coord_skip_subtree(coord_t *subroot); -#define preorder_coord_skip_subtree(sub) \ - do { (sub)->flags |= COF_SKIP_TRIVAL; } while(0) -#define coord_hide(co) \ - do { \ - (co)->flags |= COF_HIDDEN; \ - } while(0) -#define coord_show(co) do { co->flags &= ~COF_HIDDEN; } while(0) -#define coord_get_mouse_event(coord) ((coord)->mouse_event) - - -/*! \brief A grahpic shape. - * - * \dot - * digraph G { - * "shape" -> "coord"; - * "shape" -> "geo"; - * "geo" -> "shape"; - * "coord" -> "shape" [label="members"] - * "shape" -> "shape" [label="sibling"]; - * } - * \enddot - */ -struct _shape { - int sh_type; - geo_t *geo; - coord_t *coord; - paint_t *fill, *stroke; - co_aix stroke_width; - int stroke_linecap:2; - int stroke_linejoin:2; - struct _shape *sh_next; /*!< Link all shapes of a rdman together. */ - void (*free)(shape_t *shape); -}; -enum { SHT_UNKNOW, SHT_PATH, SHT_TEXT, SHT_RECT }; - -#define sh_get_mouse_event_subject(sh) ((sh)->geo->mouse_event) -#define sh_hide(sh) \ - do { \ - (sh)->geo->flags |= GEF_HIDDEN; \ - } while(0) -#define sh_show(sh) \ - do { \ - (sh)->geo->flags &= ~GEF_HIDDEN; \ - } while(0) - - -#endif /* __MB_TYPES_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 src/observer.c --- a/src/observer.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/observer.c Tue Nov 04 17:00:26 2008 +0800 @@ -1,7 +1,7 @@ #include -#include "redraw_man.h" -#include "observer.h" -#include "tools.h" +#include "mb/redraw_man.h" +#include "mb/observer.h" +#include "mb/tools.h" #ifndef ASSERT #define ASSERT(x) diff -r 13c1d49c198b -r c7e5b8779bb5 src/observer.h --- a/src/observer.h Sun Nov 02 14:30:03 2008 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -#ifndef __OBSERVER_H_ -#define __OBSERVER_H_ - -#include "tools.h" - -typedef struct _event event_t; -typedef struct _observer observer_t; -typedef struct _subject subject_t; -typedef struct _mouse_event mouse_event_t; -typedef struct _ob_factory ob_factory_t; -typedef void (*evt_handler)(event_t *event, void *arg); - -struct _event { - int type; /*!< event type (a.k.a. EVT_* */ - subject_t *tgt, *cur_tgt; -}; - -/*! \brief Observer of observer pattern. - * - * A target for receiving events. - */ -struct _observer { - evt_handler hdr; - void *arg; - observer_t *next; -}; - -/*! \brief Subject of observer pattern. - * - * Observer is a pattern to decouple caller and callee, - * especial for multiple callee. - * \see http://en.wikipedia.org/wiki/Observer_pattern - */ -struct _subject { - int obj_type; /*!< \brief type of object (a.k.a. OBJT_*). */ - void *obj; /*!< \brief the object this subject for. */ - int flags; - STAILQ(observer_t) observers; -}; -/*! \brief Flag that make a subject to propagate events to parents. */ -#define SUBF_STOP_PROPAGATE 0x1 -#define SUBF_BUSY 0x2 /*!< \brief in subject_notify() */ -#define SUBF_FREE 0x4 /*!< \brief in postponding subject_free() */ - -enum {OBJT_GEO, OBJT_COORD, OBJT_KB, OBJT_PROGM, OBJT_RDMAN}; - -struct _mouse_event { - event_t event; - int x, y; - unsigned int but_state; - unsigned int button; -}; - -#define MOUSE_BUT1 0x1 -#define MOUSE_BUT2 0x2 -#define MOUSE_BUT3 0x4 - -/*! \brief Observer factory. - * - * It provides functions for allocation of subject and observer objects, - * and strategy function for getting the subject of parent coord object. - */ -struct _ob_factory { - subject_t *(*subject_alloc)(ob_factory_t *factory); - void (*subject_free)(ob_factory_t *factory, subject_t *subject); - observer_t *(*observer_alloc)(ob_factory_t *factory); - void (*observer_free)(ob_factory_t *factory, observer_t *observer); - /*! This is a strategy function to get subjects of parents. */ - subject_t *(*get_parent_subject)(ob_factory_t *factory, - subject_t *cur_subject); -}; - -enum {EVT_MOUSE_OVER, EVT_MOUSE_OUT, EVT_MOUSE_MOVE, - EVT_MOUSE_BUT_PRESS, EVT_MOUSE_BUT_RELEASE, - EVT_KB_PRESS, EVT_KB_RELEASE, EVT_PROGM_COMPLETE, - EVT_RDMAN_REDRAW }; - -extern subject_t *subject_new(ob_factory_t *factory, - void *obj, int obj_type); -extern void subject_free(ob_factory_t *factory, subject_t *subject); -extern void subject_notify(ob_factory_t *factory, - subject_t *subject, event_t *evt); -extern observer_t *subject_add_observer(ob_factory_t *factory, - subject_t *subject, - evt_handler hdr, void *arg); -extern void subject_remove_observer(ob_factory_t *factory, - subject_t *subject, - observer_t *observer); - - -#endif /* __OBSERVER_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 src/paint.c --- a/src/paint.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/paint.c Tue Nov 04 17:00:26 2008 +0800 @@ -1,7 +1,7 @@ #include #include #include -#include "paint.h" +#include "mb/paint.h" #define ASSERT(x) diff -r 13c1d49c198b -r c7e5b8779bb5 src/paint.h --- a/src/paint.h Sun Nov 02 14:30:03 2008 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -#ifndef __PAINT_H_ -#define __PAINT_H_ - -#include -#include "mb_types.h" -#include "redraw_man.h" -#include "tools.h" - -typedef float co_comp_t; - -extern paint_t *rdman_paint_color_new(redraw_man_t *rdman, - co_comp_t r, co_comp_t g, - co_comp_t b, co_comp_t a); -extern void paint_color_set(paint_t *paint, - co_comp_t r, co_comp_t g, - co_comp_t b, co_comp_t a); -extern void paint_color_get(paint_t *paint, - co_comp_t *r, co_comp_t *g, - co_comp_t *b, co_comp_t *a); -#define paint_init(_paint, _prepare, _free) \ - do { \ - (_paint)->flags = 0; \ - (_paint)->prepare = _prepare; \ - (_paint)->free = _free; \ - STAILQ_INIT((_paint)->members); \ - (_paint)->pnt_next = NULL; \ - } while(0) \ - - -typedef struct _grad_stop { - co_aix offset; - co_comp_t r, g, b, a; -} grad_stop_t; - -extern paint_t *rdman_paint_linear_new(redraw_man_t *rdman, - co_aix x1, co_aix y1, - co_aix x2, co_aix y2); -extern grad_stop_t *paint_linear_stops(paint_t *paint, - int n_stops, - grad_stop_t *stops); -extern paint_t *rdman_paint_radial_new(redraw_man_t *rdman, - co_aix cx, co_aix cy, co_aix r); -extern grad_stop_t *paint_radial_stops(paint_t *paint, - int n_stops, - grad_stop_t *stops); - -#define grad_stop_init(stop, _offset, _r, _g, _b, _a) \ - do { \ - (stop)->offset = _offset; \ - (stop)->r = _r; \ - (stop)->g = _g; \ - (stop)->b = _b; \ - (stop)->a = _a; \ - } while(0) - - -#endif /* __PAINT_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 src/redraw_man.c --- a/src/redraw_man.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/redraw_man.c Tue Nov 04 17:00:26 2008 +0800 @@ -2,11 +2,11 @@ #include #include #include -#include "mb_types.h" -#include "shapes.h" -#include "tools.h" -#include "redraw_man.h" -#include "observer.h" +#include "mb/mb_types.h" +#include "mb/shapes.h" +#include "mb/tools.h" +#include "mb/redraw_man.h" +#include "mb/observer.h" /* NOTE: bounding box should also consider width of stroke. @@ -1402,7 +1402,7 @@ /* Test cases */ #include -#include "paint.h" +#include "mb/paint.h" struct _sh_dummy { shape_t shape; diff -r 13c1d49c198b -r c7e5b8779bb5 src/redraw_man.h --- a/src/redraw_man.h Sun Nov 02 14:30:03 2008 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,160 +0,0 @@ -#ifndef __REDRAW_MAN_H_ -#define __REDRAW_MAN_H_ - -#include -#include "tools.h" -#include "mb_types.h" -#include "observer.h" - -typedef struct _redraw_man redraw_man_t; - -typedef void (*free_func_t)(redraw_man_t *rdman, void *obj); -struct _free_obj { - void *obj; - free_func_t free_func; -}; -typedef struct _free_obj free_obj_t; -struct _free_objs { - int num, max; - free_obj_t *objs; -}; -typedef struct _free_objs free_objs_t; - -DARRAY(coords, coord_t *); -DARRAY(geos, geo_t *); -DARRAY(areas, area_t *); - -/*! \brief Manage redrawing of shapes (graphic elements). - * - * Every coord_t and geo_t object is assigned with a unique - * incremental order. The order is a unsigned integer. - * Every time a new coord_t or geo_t object is added, it is - * assigned with a order number that 1 bigger than last one - * until reaching maximum of unsigned integer. - * When a maximum is meet, all coord_t or geo_t objects - * are reasigned with a new order number from 1. It means - * order numbers that have been assigned and then removed - * later are recycled. - * - * Dirty flag is clear when the transformation matrix of a coord - * object been recomputed or when a geo_t objects been redrawed. - */ -struct _redraw_man { - unsigned int next_coord_order; - int n_coords; - coord_t *root_coord; - - elmpool_t *geo_pool; - elmpool_t *coord_pool; - elmpool_t *shnode_pool; - elmpool_t *observer_pool; - elmpool_t *subject_pool; - elmpool_t *paint_color_pool; - - coords_t dirty_coords; - geos_t dirty_geos; - areas_t dirty_areas; - - geos_t gen_geos; - - STAILQ(shape_t) shapes; /*!< \brief All managed shapes. */ - STAILQ(paint_t) paints; /*!< \brief All managed paints. */ - - free_objs_t free_objs; - - cairo_t *cr; - cairo_t *backend; - - ob_factory_t ob_factory; - - subject_t *redraw; /*!< \brief Notified after redrawing. */ -}; - -extern int redraw_man_init(redraw_man_t *rdman, cairo_t *cr, - cairo_t *backend); -extern void redraw_man_destroy(redraw_man_t *rdman); -extern int rdman_find_overlaid_shapes(redraw_man_t *rdman, - geo_t *geo, - geo_t ***overlays); -extern int rdman_add_shape(redraw_man_t *rdman, - shape_t *shape, coord_t *coord); -/*! \brief Make a shape been managed by a redraw manager. */ -#define rdman_shape_man(rdman, shape) \ - STAILQ_INS_TAIL(rdman->shapes, shape_t, sh_next, shape) -extern int rdman_shape_free(redraw_man_t *rdman, shape_t *shape); - -#define rdman_paint_man(rdman, paint) \ - STAILQ_INS_TAIL(rdman->paints, paint_t, pnt_next, shape) -extern int rdman_paint_free(redraw_man_t *rdman, paint_t *paint); - -extern coord_t *rdman_coord_new(redraw_man_t *rdman, coord_t *parent); -extern int rdman_coord_free(redraw_man_t *rdman, coord_t *coord); -extern int rdman_coord_subtree_free(redraw_man_t *rdman, coord_t *subtree); -extern int rdman_coord_changed(redraw_man_t *rdman, coord_t *coord); -extern int rdman_shape_changed(redraw_man_t *rdman, shape_t *shape); -extern int rdman_redraw_changed(redraw_man_t *rdman); -extern int rdman_redraw_all(redraw_man_t *rdman); -extern int rdman_redraw_area(redraw_man_t *rdman, co_aix x, co_aix y, - co_aix w, co_aix h); -extern geo_t *rdman_geos(redraw_man_t *rdman, geo_t *last); -extern int rdman_force_clean(redraw_man_t *rdman); -extern shnode_t *shnode_new(redraw_man_t *rdman, shape_t *shape); -#define shnode_free(rdman, node) elmpool_elm_free((rdman)->shnode_pool, node) -#define shnode_list_free(rdman, q) \ - do { \ - shnode_t *__node, *__last; \ - __last = STAILQ_HEAD(q); \ - if(__last == NULL) break; \ - for(__node = STAILQ_NEXT(shnode_t, next, __last); \ - __node != NULL; \ - __node = STAILQ_NEXT(shnode_t, next, __node)) { \ - shnode_free(rdman, __last); \ - __last = __node; \ - } \ - shnode_free(rdman, __last); \ - } while(0) -#define _rdman_paint_child(rdman, paint, shape) \ - do { \ - shnode_t *__node; \ - if((shape)->fill != (paint) && \ - (shape)->stroke != (paint)) { \ - __node = shnode_new(rdman, shape); \ - STAILQ_INS_TAIL((paint)->members, \ - shnode_t, next, __node); \ - } \ - } while(0) -extern void _rdman_paint_real_remove_child(redraw_man_t *rdman, - paint_t *paint, - shape_t *shape); -#define _rdman_paint_remove_child(rdman, paint, shape) \ - do { \ - if((shape)->fill == (shape)->stroke && \ - (shape)->stroke == paint) \ - break; \ - _rdman_paint_real_remove_child(rdman, paint, shape); \ - } while(0) -#define rdman_paint_fill(rdman, paint, shape) \ - do { \ - if((shape)->fill == paint) \ - break; \ - _rdman_paint_remove_child(rdman, paint, shape); \ - _rdman_paint_child(rdman, paint, shape); \ - (shape)->fill = paint; \ - } while(0) -#define rdman_paint_stroke(rdman, paint, shape) \ - do { \ - if((shape)->stroke == paint) \ - break; \ - _rdman_paint_remove_child(rdman, paint, shape); \ - _rdman_paint_child(rdman, paint, shape); \ - (shape)->stroke = paint; \ - } while(0) -extern int rdman_paint_changed(redraw_man_t *rdman, paint_t *paint); - -extern shape_t *find_shape_at_pos(redraw_man_t *rdman, - co_aix x, co_aix y, int *in_stroke); -#define rdman_get_ob_factory(rdman) (&(rdman)->ob_factory) -#define rdman_get_redraw_subject(rdman) ((rdman)->redraw) - - -#endif /* __REDRAW_MAN_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 src/rotate.c --- a/src/rotate.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/rotate.c Tue Nov 04 17:00:26 2008 +0800 @@ -2,7 +2,7 @@ #include #include #include -#include "animate.h" +#include "mb/animate.h" static float comp_mb_timeval_ratio(const mb_timeval_t *a, const mb_timeval_t *b) { diff -r 13c1d49c198b -r c7e5b8779bb5 src/shape_path.c --- a/src/shape_path.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/shape_path.c Tue Nov 04 17:00:26 2008 +0800 @@ -3,8 +3,8 @@ #include #include #include -#include "mb_types.h" -#include "redraw_man.h" +#include "mb/mb_types.h" +#include "mb/redraw_man.h" /*! \brief Implement respective objects for SVG path tag. * diff -r 13c1d49c198b -r c7e5b8779bb5 src/shape_rect.c --- a/src/shape_rect.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/shape_rect.c Tue Nov 04 17:00:26 2008 +0800 @@ -1,8 +1,8 @@ #include #include #include -#include "mb_types.h" -#include "shapes.h" +#include "mb/mb_types.h" +#include "mb/shapes.h" typedef struct _sh_rect { shape_t shape; diff -r 13c1d49c198b -r c7e5b8779bb5 src/shape_text.c --- a/src/shape_text.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/shape_text.c Tue Nov 04 17:00:26 2008 +0800 @@ -3,8 +3,8 @@ #include #include #include -#include "mb_types.h" -#include "shapes.h" +#include "mb/mb_types.h" +#include "mb/shapes.h" #define ASSERT(x) #define OK 0 diff -r 13c1d49c198b -r c7e5b8779bb5 src/shapes.h --- a/src/shapes.h Sun Nov 02 14:30:03 2008 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -/*! \file - * \brief Declare interfaces of shapes. - * - * \todo Add ellipse shape. - * \todo Add circle shape. - */ -#ifndef __SHAPES_H_ -#define __SHAPES_H_ - -#include -#include "mb_types.h" -#include "redraw_man.h" - -/*! \page define_shape How to Define Shapes - * - * A shape implementation must include - * - rdman_shape_*_new() - * - clear memory for shape_t member. - * - assign *_free() to \ref shape_t::free. - * - make new object been managed by a redraw manager. - * - call rdman_shape_man() - * - *_free() - * - assigned to \ref shape_t::free. - * - *_transform() - * - *_draw() - * - first member variable of a shape type must be a shape_t. - * - * Must modify - * - event.c::draw_shape_path() - * - redraw_man.c::clean_shape() - * - redraw_man.c::draw_shape() - */ - -/*! \defgroup shapes Shapes - * @{ - */ - -/*! \defgroup shape_path Shape of Path - * @{ - */ -extern shape_t *rdman_shape_path_new(redraw_man_t *rdman, char *data); -extern void sh_path_transform(shape_t *shape); -extern void sh_path_draw(shape_t *shape, cairo_t *cr); -/* @} */ - -/*! \defgroup shape_text Shape of Text - * @{ - */ -extern shape_t *rdman_shape_text_new(redraw_man_t *rdman, - const char *txt, co_aix x, co_aix y, - co_aix font_size, - cairo_font_face_t *face); -extern void sh_text_set_text(shape_t *shape, const char *txt); -extern void sh_text_transform(shape_t *shape); -extern void sh_text_draw(shape_t *shape, cairo_t *cr); -/* @} */ - -/*! \defgroup shape_rect Shape of Rectangle - * @{ - */ -extern shape_t *rdman_shape_rect_new(redraw_man_t *rdman, - co_aix x, co_aix y, - co_aix w, co_aix h, - co_aix rx, co_aix ry); -extern void sh_rect_transform(shape_t *shape); -extern void sh_rect_draw(shape_t *shape, cairo_t *cr); -extern void sh_rect_set(shape_t *shape, co_aix x, co_aix y, - co_aix w, co_aix h, co_aix rx, co_aix ry); -/* @} */ -/* @} */ - -#endif /* __SHAPES_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 src/shift.c --- a/src/shift.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/shift.c Tue Nov 04 17:00:26 2008 +0800 @@ -1,7 +1,7 @@ #include #include #include -#include "animate.h" +#include "mb/animate.h" static float comp_mb_timeval_ratio(const mb_timeval_t *a, const mb_timeval_t *b) { diff -r 13c1d49c198b -r c7e5b8779bb5 src/timer.c --- a/src/timer.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/timer.c Tue Nov 04 17:00:26 2008 +0800 @@ -2,8 +2,8 @@ #include #include #include -#include "mb_timer.h" -#include "tools.h" +#include "mb/mb_timer.h" +#include "mb/tools.h" #define OK 0 diff -r 13c1d49c198b -r c7e5b8779bb5 src/timertool.c --- a/src/timertool.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/timertool.c Tue Nov 04 17:00:26 2008 +0800 @@ -5,7 +5,7 @@ #include #include #endif -#include "mb_timer.h" +#include "mb/mb_timer.h" #ifdef __FreeBSD__ diff -r 13c1d49c198b -r c7e5b8779bb5 src/tools.c --- a/src/tools.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/tools.c Tue Nov 04 17:00:26 2008 +0800 @@ -1,5 +1,5 @@ #include -#include "tools.h" +#include "mb/tools.h" /*! \brief Small fixed size data elements management. diff -r 13c1d49c198b -r c7e5b8779bb5 src/tools.h --- a/src/tools.h Sun Nov 02 14:30:03 2008 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,136 +0,0 @@ -#ifndef __TOOLS_H_ -#define __TOOLS_H_ - -typedef struct _elmpool elmpool_t; - -extern elmpool_t *elmpool_new(int elm_sz, int inc_num); -extern void *elmpool_elm_alloc(elmpool_t *pool); -extern void elmpool_elm_free(elmpool_t *pool, void *elm); -extern void elmpool_free(elmpool_t *pool); - - -#define STAILQ(type) \ - struct { \ - type *head; \ - type *tail; \ - } -#define STAILQ_INIT(q) \ - do { \ - (q).head = (q).tail = NULL; \ - } while(0) -#define STAILQ_CLEAN(q) STAILQ_INIT(q) -#define STAILQ_HEAD(q) ((q).head) -#define STAILQ_TAIL(q) ((q).tail) -#define STAILQ_NEXT(type, field, elm) ((elm)->field) -#define STAILQ_INS(q, type, field, elm) \ - do { \ - (elm)->field = (q).head; \ - (q).head = elm; \ - if((q).tail == NULL) \ - (q).tail = elm; \ - } while(0) -#define STAILQ_INS_TAIL(q, type, field, elm) \ - do { \ - (elm)->field = NULL; \ - if((q).tail != NULL) \ - (q).tail->field = elm; \ - (q).tail = elm; \ - if((q).head == NULL) \ - (q).head = elm; \ - } while(0) -#define STAILQ_INS_AFTER(type, field, follow, elm) \ - do { \ - (follow)->field = (elm)->field; \ - (elm)->field = follow; \ - } while(0) -#define STAILQ_REMOVE(q, type, field, elm) \ - do { \ - if((elm) == (q).head) { \ - (q).head = (elm)->field; \ - if((q).head == NULL) \ - (q).tail = NULL; \ - } else { \ - type *_stailq_cur = (q).head; \ - while(_stailq_cur != NULL && \ - _stailq_cur->field != (elm)) \ - _stailq_cur = _stailq_cur->field; \ - if(_stailq_cur != NULL) { \ - _stailq_cur->field = (elm)->field; \ - if((q).tail == (elm)) \ - (q).tail = _stailq_cur; \ - } \ - } \ - } while(0) - -/*! \defgroup darray Dynamic Array - * - * DARRAY is a dynamic sized array/list, it's length is a variable. - * It is extended, automatically, if it is full and more elemnts are - * putted in. - * - * Users of DARRAY must declare a new type to store data. The way to - * declear a new type is to invoke DARRAY() with paramters of name of - * type and type of data to be stored in. The new storage type is named - * with foo_t where foo is the name you pass in. - * - * DARRAY_DEFINE() is inovked to define foo_add() function; foo is name - * of storage type. You can call foo_add() to add a data element - * into a storage object. - * - * Get ith element in a storage object, use - * \code - * obj->ds[i] - * \endcode - * - * To loop over elements in a storage object, us - * \code - * for(i = 0; i < obj->num; i++) { - * v = obj->ds[i]; - * ...... - * } - * \endcode - * @{ - */ -/*! \brief Declare a DARRAY storage type. - * - * \param name is name of storage type. - * \param type is type of data elements that will be stored in. - * - * Type of _t is defined by the macro. It is used to define a - * storage object to contain data elements. - */ -#define DARRAY(name, type) \ - struct _ ## name { \ - int max, num; \ - type *ds; \ - }; \ - typedef struct _ ## name name ## _t -#define DARRAY_DEFINE(name, type) \ - static int name ## _add(name ## _t *da, type v) { \ - type *new_ds; \ - int max; \ - if(da->num >= (da)->max) { \ - max = (da)->max + 32; \ - new_ds = realloc(da->ds, \ - max * sizeof(type)); \ - if(new_ds == NULL) return -1; \ - da->ds = new_ds; \ - da->max = max; \ - } \ - da->ds[da->num++] = v; \ - return 0; \ - } -#define DARRAY_CLEAN(da) do { (da)->num = 0; } while(0) -#define DARRAY_INIT(da) do { (da)->num = (da)->max = 0; (da)->ds = NULL; } -#define DARRAY_DESTROY(da) do { if((da)->ds) free((da)->ds); } while(0) -/* @} */ - -#include - -#define O_ALLOC(type) ((type *)malloc(sizeof(type))) - -#define OFFSET(type, mem) (((void *)&((type *)NULL)->mem) - NULL) -#define MEM2OBJ(var, type, mem) ((type *)((void *)var - OFFSET(type, mem))) -#define OFF2TYPE(obj, off, type) (*(type *)((void *)(obj) + (off))) - -#endif /* __TOOLS_H_ */ diff -r 13c1d49c198b -r c7e5b8779bb5 src/visibility.c --- a/src/visibility.c Sun Nov 02 14:30:03 2008 +0800 +++ b/src/visibility.c Tue Nov 04 17:00:26 2008 +0800 @@ -1,6 +1,6 @@ #include #include -#include "animate.h" +#include "mb/animate.h" typedef struct _mb_visibility mb_visibility_t;