From fda123249a00d1610ff9aedc85a01e46dfe10c3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Janouch?= Date: Fri, 7 Jan 2011 09:23:02 +0100 Subject: [PATCH] Export more cairo methods to Lua. --- src/ld-lua.c | 176 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 131 insertions(+), 45 deletions(-) diff --git a/src/ld-lua.c b/src/ld-lua.c index 67b9435..4cab71c 100644 --- a/src/ld-lua.c +++ b/src/ld-lua.c @@ -77,6 +77,7 @@ struct _LdLuaDrawData { LdLuaSymbol *symbol; cairo_t *cr; + unsigned save_count; }; static void ld_lua_finalize (GObject *gobject); @@ -91,16 +92,26 @@ static int process_registration (lua_State *L); static gchar *get_translation (lua_State *L, int index); static gboolean read_symbol_area (lua_State *L, int index, LdSymbolArea *area); -static void push_cairo_object (lua_State *L, cairo_t *cr); +static void push_cairo_object (lua_State *L, LdLuaDrawData *draw_data); static gdouble get_cairo_scale (cairo_t *cr); +static int ld_lua_cairo_save (lua_State *L); +static int ld_lua_cairo_restore (lua_State *L); static int ld_lua_cairo_get_line_width (lua_State *L); static int ld_lua_cairo_set_line_width (lua_State *L); static int ld_lua_cairo_move_to (lua_State *L); static int ld_lua_cairo_line_to (lua_State *L); +static int ld_lua_cairo_curve_to (lua_State *L); +static int ld_lua_cairo_arc (lua_State *L); +static int ld_lua_cairo_arc_negative (lua_State *L); +static int ld_lua_cairo_new_path (lua_State *L); +static int ld_lua_cairo_new_sub_path (lua_State *L); +static int ld_lua_cairo_close_path (lua_State *L); static int ld_lua_cairo_stroke (lua_State *L); static int ld_lua_cairo_stroke_preserve (lua_State *L); static int ld_lua_cairo_fill (lua_State *L); static int ld_lua_cairo_fill_preserve (lua_State *L); +static int ld_lua_cairo_clip (lua_State *L); +static int ld_lua_cairo_clip_preserve (lua_State *L); static luaL_Reg ld_lua_logdiag_lib[] = @@ -111,14 +122,24 @@ static luaL_Reg ld_lua_logdiag_lib[] = static luaL_Reg ld_lua_cairo_table[] = { + {"save", ld_lua_cairo_save}, + {"restore", ld_lua_cairo_restore}, {"get_line_width", ld_lua_cairo_get_line_width}, {"set_line_width", ld_lua_cairo_set_line_width}, {"move_to", ld_lua_cairo_move_to}, {"line_to", ld_lua_cairo_line_to}, + {"curve_to", ld_lua_cairo_curve_to}, + {"arc", ld_lua_cairo_arc}, + {"arc_negative", ld_lua_cairo_arc_negative}, + {"new_path", ld_lua_cairo_new_path}, + {"new_sub_path", ld_lua_cairo_new_sub_path}, + {"close_path", ld_lua_cairo_close_path}, {"stroke", ld_lua_cairo_stroke}, {"stroke_preserve", ld_lua_cairo_stroke_preserve}, {"fill", ld_lua_cairo_fill}, {"fill_preserve", ld_lua_cairo_fill_preserve}, + {"clip", ld_lua_cairo_clip}, + {"clip_preserve", ld_lua_cairo_clip_preserve}, {NULL, NULL} }; @@ -304,12 +325,16 @@ ld_lua_private_draw (LdLua *self, LdLuaSymbol *symbol, cairo_t *cr) data.symbol = symbol; data.cr = cr; + data.save_count = 0; if (lua_cpcall (self->priv->L, ld_lua_private_draw_cb, &data)) { g_warning ("Lua error: %s", lua_tostring (self->priv->L, -1)); lua_pop (self->priv->L, 1); } + + while (data.save_count--) + cairo_restore (cr); } static int @@ -329,7 +354,7 @@ ld_lua_private_draw_cb (lua_State *L) luaL_checktype (L, -1, LUA_TFUNCTION); /* Call the function do draw the symbol. */ - push_cairo_object (L, data->cr); + push_cairo_object (L, data); lua_pcall (L, 1, 0, 0); return 0; } @@ -541,7 +566,7 @@ read_symbol_area (lua_State *L, int index, LdSymbolArea *area) /* ===== Cairo ============================================================= */ static void -push_cairo_object (lua_State *L, cairo_t *cr) +push_cairo_object (lua_State *L, LdLuaDrawData *draw_data) { luaL_Reg *fn; @@ -556,7 +581,7 @@ push_cairo_object (lua_State *L, cairo_t *cr) */ for (fn = ld_lua_cairo_table; fn->name; fn++) { - lua_pushlightuserdata (L, cr); + lua_pushlightuserdata (L, draw_data); lua_pushcclosure (L, fn->func, 1); lua_setfield (L, -2, fn->name); } @@ -571,98 +596,159 @@ get_cairo_scale (cairo_t *cr) return dx; } -/* TODO: More functions. Possibly put it into another file - * and generate it automatically. - */ +#define LD_LUA_CAIRO_TRIVIAL(name) \ +static int \ +ld_lua_cairo_ ## name (lua_State *L) \ +{ \ + LdLuaDrawData *data; \ + data = lua_touserdata (L, lua_upvalueindex (1)); \ + cairo_ ## name (data->cr); \ + return 0; \ +} + +LD_LUA_CAIRO_TRIVIAL (new_path) +LD_LUA_CAIRO_TRIVIAL (new_sub_path) +LD_LUA_CAIRO_TRIVIAL (close_path) + +LD_LUA_CAIRO_TRIVIAL (stroke) +LD_LUA_CAIRO_TRIVIAL (stroke_preserve) +LD_LUA_CAIRO_TRIVIAL (fill) +LD_LUA_CAIRO_TRIVIAL (fill_preserve) +LD_LUA_CAIRO_TRIVIAL (clip) +LD_LUA_CAIRO_TRIVIAL (clip_preserve) + +static int +ld_lua_cairo_save (lua_State *L) +{ + LdLuaDrawData *data; + + data = lua_touserdata (L, lua_upvalueindex (1)); + if (data->save_count + 1) + { + data->save_count++; + cairo_save (data->cr); + } + return 0; +} + +static int +ld_lua_cairo_restore (lua_State *L) +{ + LdLuaDrawData *data; + + data = lua_touserdata (L, lua_upvalueindex (1)); + if (data->save_count) + { + data->save_count--; + cairo_restore (data->cr); + } + return 0; +} + static int ld_lua_cairo_get_line_width (lua_State *L) { - cairo_t *cr; + LdLuaDrawData *data; - cr = lua_touserdata (L, lua_upvalueindex (1)); - lua_pushnumber (L, cairo_get_line_width (cr) * get_cairo_scale (cr)); + data = lua_touserdata (L, lua_upvalueindex (1)); + lua_pushnumber (L, cairo_get_line_width (data->cr) + * get_cairo_scale (data->cr)); return 1; } static int ld_lua_cairo_set_line_width (lua_State *L) { - cairo_t *cr; - lua_Number width; + LdLuaDrawData *data; - cr = lua_touserdata (L, lua_upvalueindex (1)); - width = luaL_checknumber (L, 1); - cairo_set_line_width (cr, width / get_cairo_scale (cr)); + data = lua_touserdata (L, lua_upvalueindex (1)); + cairo_set_line_width (data->cr, luaL_checknumber (L, 1) + / get_cairo_scale (data->cr)); return 0; } static int ld_lua_cairo_move_to (lua_State *L) { - cairo_t *cr; + LdLuaDrawData *data; lua_Number x, y; - cr = lua_touserdata (L, lua_upvalueindex (1)); + data = lua_touserdata (L, lua_upvalueindex (1)); x = luaL_checknumber (L, 1); y = luaL_checknumber (L, 2); - cairo_move_to (cr, x, y); + cairo_move_to (data->cr, x, y); return 0; } static int ld_lua_cairo_line_to (lua_State *L) { - cairo_t *cr; + LdLuaDrawData *data; lua_Number x, y; - cr = lua_touserdata (L, lua_upvalueindex (1)); + data = lua_touserdata (L, lua_upvalueindex (1)); + x = luaL_checknumber (L, 1); y = luaL_checknumber (L, 2); - cairo_line_to (cr, x, y); + + cairo_line_to (data->cr, x, y); return 0; } static int -ld_lua_cairo_stroke (lua_State *L) +ld_lua_cairo_curve_to (lua_State *L) { - cairo_t *cr; + LdLuaDrawData *data; + lua_Number x1, y1, x2, y2, x3, y3; - cr = lua_touserdata (L, lua_upvalueindex (1)); - cairo_stroke (cr); + data = lua_touserdata (L, lua_upvalueindex (1)); + + x1 = luaL_checknumber (L, 1); + y1 = luaL_checknumber (L, 2); + x2 = luaL_checknumber (L, 3); + y2 = luaL_checknumber (L, 4); + x3 = luaL_checknumber (L, 5); + y3 = luaL_checknumber (L, 6); + + cairo_curve_to (data->cr, x1, y1, x2, y2, x3, y3); return 0; } static int -ld_lua_cairo_stroke_preserve (lua_State *L) +ld_lua_cairo_arc (lua_State *L) { - cairo_t *cr; + LdLuaDrawData *data; + lua_Number xc, yc, radius, angle1, angle2; - cr = lua_touserdata (L, lua_upvalueindex (1)); - cairo_stroke_preserve (cr); + data = lua_touserdata (L, lua_upvalueindex (1)); + + xc = luaL_checknumber (L, 1); + yc = luaL_checknumber (L, 2); + radius = luaL_checknumber (L, 3); + angle1 = luaL_checknumber (L, 4); + angle2 = luaL_checknumber (L, 5); + + cairo_arc (data->cr, xc, yc, radius, angle1, angle2); return 0; } static int -ld_lua_cairo_fill (lua_State *L) +ld_lua_cairo_arc_negative (lua_State *L) { - cairo_t *cr; + LdLuaDrawData *data; + lua_Number xc, yc, radius, angle1, angle2; - cr = lua_touserdata (L, lua_upvalueindex (1)); - cairo_fill (cr); + data = lua_touserdata (L, lua_upvalueindex (1)); + + xc = luaL_checknumber (L, 1); + yc = luaL_checknumber (L, 2); + radius = luaL_checknumber (L, 3); + angle1 = luaL_checknumber (L, 4); + angle2 = luaL_checknumber (L, 5); + + cairo_arc_negative (data->cr, xc, yc, radius, angle1, angle2); return 0; } -static int -ld_lua_cairo_fill_preserve (lua_State *L) -{ - cairo_t *cr; - - cr = lua_touserdata (L, lua_upvalueindex (1)); - cairo_fill_preserve (cr); - return 0; -} - - -