author | Francesco Abbate <francesco.bbt@gmail.com> | 2010年07月20日 21:58:52 +0200 |
---|---|---|
committer | Francesco Abbate <francesco.bbt@gmail.com> | 2010年07月20日 21:58:52 +0200 |
commit | 9cc9699acd1723024c8ba5c82eed9d317115428d (patch) | |
tree | 9ca317bc38196af30a29db9bdff23b975a50fb52 | |
parent | 9f5ff91f0bc36ecf48d1ae30c3670eaef336703a (diff) | |
download | gsl-shell-9cc9699acd1723024c8ba5c82eed9d317115428d.tar.gz |
-rw-r--r-- | agg-plot/Makefile | 2 | ||||
-rw-r--r-- | agg-plot/canvas-window-cpp.h | 80 | ||||
-rw-r--r-- | agg-plot/canvas-window.cpp | 149 | ||||
-rw-r--r-- | agg-plot/canvas-window.h | 6 | ||||
-rw-r--r-- | agg-plot/colors.cpp | 3 | ||||
-rw-r--r-- | agg-plot/colors.h | 7 | ||||
-rw-r--r-- | agg-plot/lua-draw.cpp | 5 | ||||
-rw-r--r-- | agg-plot/lua-plot.cpp | 4 | ||||
-rw-r--r-- | gs-types.c | 70 | ||||
-rw-r--r-- | gs-types.h | 4 | ||||
-rw-r--r-- | lua-gsl.c | 6 |
diff --git a/agg-plot/Makefile b/agg-plot/Makefile index e6dc8572..f32978d1 100644 --- a/agg-plot/Makefile +++ b/agg-plot/Makefile @@ -44,7 +44,7 @@ endif INCLUDES += $(AGG_INCLUDES) -I$(GSH_BASE_DIR) -I$(LUADIR)/src -AGGPLOT_SRC_FILES = $(PLATSUP_SRC_FILES) utils.cpp units.cpp colors.cpp lua-draw.cpp lua-plot.cpp agg-parse-trans.cpp xwin-show.cpp canvas-window.cpp +AGGPLOT_SRC_FILES = $(PLATSUP_SRC_FILES) utils.cpp units.cpp colors.cpp lua-draw.cpp lua-plot.cpp agg-parse-trans.cpp xwin-show.cpp canvas-window.cpp plot-window.cpp AGGPLOT_OBJ_FILES := $(AGGPLOT_SRC_FILES:%.cpp=%.o) diff --git a/agg-plot/canvas-window-cpp.h b/agg-plot/canvas-window-cpp.h new file mode 100644 index 00000000..21a54da0 --- /dev/null +++ b/agg-plot/canvas-window-cpp.h @@ -0,0 +1,80 @@ +#ifndef CANVAS_WINDOW_CPP_H +#define CANVAS_WINDOW_CPP_H + +#include "platform/agg_platform_support.h" +#include "agg_trans_affine.h" +#include "agg_color_rgba.h" + +#include "defs.h" +#include "canvas-window.h" +#include "vertex-source.h" +#include "canvas.h" +#include "utils.h" + +extern void platform_support_prepare (); +extern void platform_support_lock (agg::platform_support *app); +extern void platform_support_unlock (agg::platform_support *app); +extern bool platform_support_is_mapped (agg::platform_support *app); + +class canvas_window : public agg::platform_support { +protected: + canvas *m_canvas; + agg::rgba m_bgcolor; + + agg::trans_affine m_user_trans; + agg::trans_affine m_canvas_trans; + +public: + + enum win_status_e { not_ready, starting, running, error, closed }; + + int id; + enum win_status_e status; + + canvas_window(agg::rgba& bgcol) : + agg::platform_support(agg::pix_format_bgr24, true), + m_canvas(NULL), m_bgcolor(bgcol), m_user_trans(), m_canvas_trans(), + id(-1), status(not_ready) + { }; + + virtual ~canvas_window() + { + if (m_canvas) + delete m_canvas; + }; + + virtual void on_init(); + virtual void on_resize(int sx, int sy); + virtual void on_draw(); + + void start(); + + void lock() { platform_support_lock(this); }; + void unlock() { platform_support_unlock(this); }; + + void start_new_thread (lua_State *L); + + bool draw(vertex_source *obj, agg::rgba8 *color) + { + if (! m_canvas) + return false; + + m_canvas->draw(*obj, *color); + return true; + }; + + void set_user_transform(agg::trans_affine& mtx) + { + m_user_trans = mtx; + }; + + void set_global_transform(agg::trans_affine& mtx) + { + mtx = m_user_trans; + trans_affine_compose (mtx, m_canvas_trans); + } + + static canvas_window *check (lua_State *L, int index); +}; + +#endif diff --git a/agg-plot/canvas-window.cpp b/agg-plot/canvas-window.cpp index 7610c062..c8c79290 100644 --- a/agg-plot/canvas-window.cpp +++ b/agg-plot/canvas-window.cpp @@ -4,12 +4,12 @@ extern "C" { #include "lauxlib.h" } -#include "platform/agg_platform_support.h" #include "defs.h" +#include "canvas-window.h" +#include "canvas-window-cpp.h" #include "resource-manager.h" #include "gsl-shell.h" -#include "canvas-window.h" #include "agg-parse-trans.h" #include "lua-cpp-utils.h" #include "lua-utils.h" @@ -19,16 +19,8 @@ extern "C" { #include "canvas.h" #include "trans.h" -extern void platform_support_prepare (); -extern void platform_support_lock (agg::platform_support *app); -extern void platform_support_unlock (agg::platform_support *app); -extern bool platform_support_is_mapped (agg::platform_support *app); - - __BEGIN_DECLS -static void * win_thread_function (void *_win); - static int canvas_window_new (lua_State *L); static int canvas_window_free (lua_State *L); static int canvas_window_index (lua_State *L); @@ -37,6 +29,9 @@ static int canvas_window_clear (lua_State *L); static int canvas_window_update (lua_State *L); static int canvas_window_set_box_trans (lua_State *L); +static void * canvas_thread_function (void *_win); +static int canvas_window_index_protected (lua_State *L); + static const struct luaL_Reg canvas_win_functions[] = { {"window", canvas_window_new}, {NULL, NULL} @@ -58,61 +53,12 @@ static const struct luaL_Reg canvas_window_methods_protected[] = { __END_DECLS -class canvas_window : public agg::platform_support { -private: - canvas *m_canvas; - agg::rgba m_bgcolor; - - agg::trans_affine m_user_trans; - agg::trans_affine m_canvas_trans; - -public: - - enum win_status_e { not_ready, starting, running, error, closed }; - - int id; - enum win_status_e status; - - canvas_window(agg::rgba& bgcol) : - agg::platform_support(agg::pix_format_bgr24, true), - m_canvas(NULL), m_bgcolor(bgcol), m_user_trans(), m_canvas_trans(), - id(-1), status(not_ready) - { }; - - virtual ~canvas_window() - { - if (m_canvas) - delete m_canvas; - }; - - virtual void on_init(); - virtual void on_resize(int sx, int sy); - - void start(); - void clear() { if (m_canvas) m_canvas->clear(); }; - - bool draw(vertex_source *obj, agg::rgba8 *color) - { - if (! m_canvas) - return false; - - m_canvas->draw(*obj, *color); - return true; - }; - - void set_user_transform(agg::trans_affine& mtx) - { - m_user_trans = mtx; - }; - - void set_global_transform(agg::trans_affine& mtx) - { - mtx = m_user_trans; - trans_affine_compose (mtx, m_canvas_trans); - } - - static canvas_window *check (lua_State *L, int index); -}; +void +canvas_window::on_draw() +{ + if (m_canvas) + m_canvas->clear(); +} void canvas_window::on_resize(int sx, int sy) @@ -149,11 +95,38 @@ canvas_window::start() GSL_SHELL_UNLOCK(); } - platform_support_unlock (this); + this->unlock(); +} + +void +canvas_window::start_new_thread (lua_State *L) +{ + this->id = mlua_window_ref(L, lua_gettop (L)); + + pthread_attr_t attr[1]; + pthread_t win_thread[1]; + + pthread_attr_init (attr); + pthread_attr_setdetachstate (attr, PTHREAD_CREATE_DETACHED); + + this->lock(); + + if (pthread_create(win_thread, attr, canvas_thread_function, (void*) this)) + { + mlua_window_unref(L, this->id); + + pthread_attr_destroy (attr); + this->status = canvas_window::error; + + luaL_error(L, "error creating thread"); + } + + pthread_attr_destroy (attr); + this->status = canvas_window::starting; } void * -win_thread_function (void *_win) +canvas_thread_function (void *_win) { platform_support_prepare(); @@ -165,7 +138,7 @@ win_thread_function (void *_win) canvas_window * canvas_window::check (lua_State *L, int index) { - return (canvas_window *) gs_check_userdata (L, index, GS_AGG_WINDOW); + return (canvas_window *) gs_check_userdata (L, index, GS_CANVAS_WINDOW); } int @@ -181,30 +154,9 @@ canvas_window_new (lua_State *L) const double bs = (double) agg::rgba8::base_mask; agg::rgba color(c8->r / bs, c8->g / bs, c8->b / bs, c8->a / bs); - canvas_window *win = new(L, GS_AGG_WINDOW) canvas_window(color); - - win->id = mlua_window_ref(L, lua_gettop (L)); - - pthread_attr_t attr[1]; - pthread_t win_thread[1]; - - pthread_attr_init (attr); - pthread_attr_setdetachstate (attr, PTHREAD_CREATE_DETACHED); - - platform_support_lock (win); - - if (pthread_create(win_thread, attr, win_thread_function, (void*) win)) - { - mlua_window_unref(L, win->id); + canvas_window *win = new(L, GS_CANVAS_WINDOW) canvas_window(color); - pthread_attr_destroy (attr); - win->status = canvas_window::error; - - luaL_error(L, "error creating thread"); - } - - pthread_attr_destroy (attr); - win->status = canvas_window::starting; + win->start_new_thread (L); return 1; } @@ -262,7 +214,7 @@ int canvas_window_clear (lua_State *L) { canvas_window *win = canvas_window::check (L, 1); - win->clear(); + win->on_draw(); return 0; } @@ -274,16 +226,16 @@ canvas_window_update (lua_State *L) return 0; } -static int +int canvas_window_index_protected (lua_State *L) { canvas_window *win = canvas_window::check(L, lua_upvalueindex(2)); - platform_support_lock (win); + win->lock(); if (win->status != canvas_window::running) { - platform_support_unlock (win); + win->unlock(); return luaL_error (L, "window is not active"); } @@ -294,17 +246,18 @@ canvas_window_index_protected (lua_State *L) if (lua_pcall (L, narg, LUA_MULTRET, 0) != 0) { - platform_support_unlock (win); + win->unlock(); return lua_error (L); } - platform_support_unlock (win); + win->unlock(); return lua_gettop (L); } int canvas_window_index (lua_State *L) { + canvas_window *win = canvas_window::check(L, 1); const char *key = luaL_checkstring (L, 2); const struct luaL_Reg *r = mlua_find_method (canvas_window_methods, key); @@ -347,7 +300,7 @@ canvas_window_set_box_trans (lua_State *L) void canvas_window_register (lua_State *L) { - luaL_newmetatable (L, GS_METATABLE(GS_AGG_WINDOW)); + luaL_newmetatable (L, GS_METATABLE(GS_CANVAS_WINDOW)); luaL_register (L, NULL, canvas_window_methods); lua_pop (L, 1); diff --git a/agg-plot/canvas-window.h b/agg-plot/canvas-window.h index bfb3e6a1..9c572e4e 100644 --- a/agg-plot/canvas-window.h +++ b/agg-plot/canvas-window.h @@ -1,14 +1,12 @@ #ifndef CANVAS_WINDOW_H #define CANVAS_WINDOW_H -__BEGIN_DECLS -#include "lua.h" -__END_DECLS - #include "defs.h" __BEGIN_DECLS +#include "lua.h" + extern void canvas_window_register (lua_State *L); __END_DECLS diff --git a/agg-plot/colors.cpp b/agg-plot/colors.cpp index 1b16be47..a9b31413 100644 --- a/agg-plot/colors.cpp +++ b/agg-plot/colors.cpp @@ -74,3 +74,6 @@ color_arg_lookup (lua_State *L, int index) return c; } + +agg::rgba colors::white(1, 1, 1); +agg::rgba colors::black(0, 0, 0); diff --git a/agg-plot/colors.h b/agg-plot/colors.h index 6e9263d6..def5a92d 100644 --- a/agg-plot/colors.h +++ b/agg-plot/colors.h @@ -12,4 +12,11 @@ extern agg::rgba8 * rgba8_push_lookup (lua_State *L, const char *color_str); extern agg::rgba8 * rgba8_push_default (lua_State *L); extern agg::rgba8 * color_arg_lookup (lua_State *L, int index); +namespace colors { + + extern agg::rgba white; + extern agg::rgba black; + +}; + #endif diff --git a/agg-plot/lua-draw.cpp b/agg-plot/lua-draw.cpp index 48e9580f..16ae5ea3 100644 --- a/agg-plot/lua-draw.cpp +++ b/agg-plot/lua-draw.cpp @@ -61,7 +61,7 @@ static struct path_cmd_reg cmd_table[] = { {CMD_ERROR, NULL, NULL} }; -static const struct luaL_Reg plot_functions[] = { +static const struct luaL_Reg draw_functions[] = { {"path", agg_path_new}, {"text", agg_text_new}, {"rgba", agg_rgba_new}, @@ -399,4 +399,7 @@ draw_register (lua_State *L) lua_setfield (L, -2, "__index"); luaL_register (L, NULL, rgba_methods); lua_pop (L, 1); + + /* gsl module registration */ + luaL_register (L, NULL, draw_functions); } diff --git a/agg-plot/lua-plot.cpp b/agg-plot/lua-plot.cpp index 0d59a5e7..e80a76fe 100644 --- a/agg-plot/lua-plot.cpp +++ b/agg-plot/lua-plot.cpp @@ -35,10 +35,6 @@ static int agg_plot_units_set (lua_State *L); static int agg_plot_units_get (lua_State *L); static const struct luaL_Reg plot_functions[] = { - {"path", agg_path_new}, - {"text", agg_text_new}, - {"rgba", agg_rgba_new}, - {"rgb", agg_rgb_new}, {"plot", agg_plot_new}, {NULL, NULL} }; diff --git a/gs-types.c b/gs-types.c index 9e0b9b6c..31dc26e3 100644 --- a/gs-types.c +++ b/gs-types.c @@ -26,31 +26,48 @@ static int gs_type_string (lua_State *L); #define GS_DRAW_PATH_NAME_DEF "GSL.path" #define GS_DRAW_TEXT_NAME_DEF "GSL.text" #define GS_RGBA_COLOR_NAME_DEF "GSL.rgba" -#define GS_AGG_WINDOW_NAME_DEF "GSL.window" +#define GS_CANVAS_WINDOW_NAME_DEF "GSL.canvas" +#define GS_PLOT_WINDOW_NAME_DEF "GSL.pltcanvas" #endif +#define MYCAT2x(a,b) a ## _ ## b +#define MYCAT2(a,b) MYCAT2x(a,b) +#define MYCAT3x(a,b,c) a ## _ ## b ## _ ## c +#define MYCAT3(a,b,c) MYCAT3x(a,b,c) + +#define MY_EXPAND(NM,DESCR) {MYCAT2(GS,NM), MYCAT3(GS,NM,NAME_DEF), DESCR, NULL} +#define MY_EXPAND_DER(NM,DESCR,SUB) {MYCAT2(GS,NM), MYCAT3(GS,NM,NAME_DEF), DESCR, &gs_type_table[MYCAT2(GS,SUB)]} + const struct gs_type gs_type_table[] = { - {GS_MATRIX, GS_MATRIX_NAME_DEF, "real matrix"}, - {GS_CMATRIX, GS_CMATRIX_NAME_DEF, "complex matrix"}, - {GS_RNG, GS_RNG_NAME_DEF, "random number generator"}, - {GS_NLINFIT, GS_NLINFIT_NAME_DEF, "real values non-linear solver"}, - {GS_CNLINFIT, GS_CNLINFIT_NAME_DEF, "complex values non-linear solver"}, - {GS_ODESOLV, GS_ODESOLV_NAME_DEF, "real values ODE solver"}, - {GS_CODESOLV, GS_CODESOLV_NAME_DEF, "complex values ODE solver"}, - {GS_HALFCMPL_R2, GS_HALFCMPL_R2_NAME_DEF, "half complex array (radix2)"}, - {GS_HALFCMPL_MR, GS_HALFCMPL_MR_NAME_DEF, "half complex array (mixed radix)"}, - {GS_FDFMULTIMIN, GS_FDFMULTIMIN_NAME_DEF, "fdf multimin solver"}, - {GS_FMULTIMIN, GS_FMULTIMIN_NAME_DEF, "f multimin solver"}, - {GS_BSPLINE, GS_BSPLINE_NAME_DEF, "B-spline"}, + MY_EXPAND(MATRIX, "real matrix"), + MY_EXPAND(CMATRIX, "complex matrix"), + MY_EXPAND(RNG, "random number generator"), + MY_EXPAND(NLINFIT, "real values non-linear solver"), + MY_EXPAND(CNLINFIT, "complex values non-linear solver"), + MY_EXPAND(ODESOLV, "real values ODE solver"), + MY_EXPAND(CODESOLV, "complex values ODE solver"), + MY_EXPAND(HALFCMPL_R2, "half complex array (radix2)"), + MY_EXPAND(HALFCMPL_MR, "half complex array (mixed radix)"), + MY_EXPAND(FDFMULTIMIN, "fdf multimin solver"), + MY_EXPAND(FMULTIMIN, "f multimin solver"), + MY_EXPAND(BSPLINE, "B-spline"), #ifdef AGG_PLOT_ENABLED - {GS_DRAW_PLOT, GS_DRAW_PLOT_NAME_DEF, "plot"}, - {GS_DRAW_PATH, GS_DRAW_PATH_NAME_DEF, "geometric line"}, - {GS_DRAW_TEXT, GS_DRAW_TEXT_NAME_DEF, "graphical text"}, - {GS_RGBA_COLOR, GS_RGBA_COLOR_NAME_DEF, "color"}, - {GS_AGG_WINDOW, GS_AGG_WINDOW_NAME_DEF, "graphical window"}, + MY_EXPAND(DRAW_PLOT, "plot"), + MY_EXPAND(DRAW_PATH, "geometric line"), + MY_EXPAND(DRAW_TEXT, "graphical text"), + MY_EXPAND(RGBA_COLOR, "color"), + MY_EXPAND(PLOT_WINDOW, "plot window"), + MY_EXPAND_DER(CANVAS_WINDOW, "graphical window", PLOT_WINDOW), #endif }; +#undef MYCAT2 +#undef MYCAT2x +#undef MYCAT3 +#undef MYCAT3x +#undef MY_EXPAND +#undef MY_EXPAND_DER + const struct luaL_Reg gs_type_functions[] = { {"gsltype", gs_type_string}, {NULL, NULL} @@ -136,13 +153,20 @@ gs_is_userdata (lua_State *L, int index, int typeid) if (lua_getmetatable(L, index)) { - const char *mt = metatable_name (typeid); + const struct gs_type *inf; - lua_getfield(L, LUA_REGISTRYINDEX, mt); - if (lua_rawequal(L, -1, -2)) + for (inf = &gs_type_table[typeid]; inf != NULL; inf = inf->derived_class) { - lua_pop (L, 2); - return p; + const char *mt = metatable_name (inf->tp); + + lua_getfield(L, LUA_REGISTRYINDEX, mt); + if (lua_rawequal(L, -1, -2)) + { + lua_pop (L, 2); + return p; + } + + lua_pop (L, 1); } } diff --git a/gs-types.h b/gs-types.h index a4a713db..c054b9a7 100644 --- a/gs-types.h +++ b/gs-types.h @@ -26,7 +26,8 @@ enum gs_type_e { GS_DRAW_PATH, GS_DRAW_TEXT, GS_RGBA_COLOR, - GS_AGG_WINDOW, + GS_PLOT_WINDOW, + GS_CANVAS_WINDOW, #endif GS_INVALID_TYPE, }; @@ -40,6 +41,7 @@ struct gs_type { enum gs_type_e tp; const char * mt_name; const char * fullname; + const struct gs_type *derived_class; }; extern const char * full_type_name (lua_State *L, int narg); @@ -45,9 +45,10 @@ #include "bspline.h" #ifdef AGG_PLOT_ENABLED -#include "lua-plot.h" +/* #include "lua-plot.h" */ #include "lua-draw.h" #include "canvas-window.h" +#include "plot-window.h" #endif static const struct luaL_Reg gsl_methods_dummy[] = {{NULL, NULL}}; @@ -82,9 +83,10 @@ luaopen_gsl (lua_State *L) mlinear_register (L); bspline_register (L); #ifdef AGG_PLOT_ENABLED - plot_register (L); + /* plot_register (L); */ draw_register (L); canvas_window_register (L); + plot_window_register (L); #endif #ifdef LNUM_COMPLEX |