aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ld-library.c7
-rw-r--r--src/ld-lua.c105
-rw-r--r--src/ld-lua.h46
3 files changed, 124 insertions, 34 deletions
diff --git a/src/ld-library.c b/src/ld-library.c
index d035644..ba12d5d 100644
--- a/src/ld-library.c
+++ b/src/ld-library.c
@@ -15,6 +15,7 @@
#include "ld-library.h"
#include "ld-symbol-category.h"
#include "ld-symbol.h"
+#include "ld-lua.h"
/**
@@ -31,7 +32,7 @@
*/
struct _LdLibraryPrivate
{
- gpointer script_state;
+ LdLua *lua;
};
G_DEFINE_TYPE (LdLibrary, ld_library, G_TYPE_OBJECT);
@@ -68,8 +69,7 @@ ld_library_init (LdLibrary *self)
self->priv = G_TYPE_INSTANCE_GET_PRIVATE
(self, LD_TYPE_LIBRARY, LdLibraryPrivate);
- /* TODO */
- self->priv->script_state = NULL;
+ self->priv->lua = ld_lua_new ();
self->categories = g_hash_table_new_full (g_str_hash, g_str_equal,
(GDestroyNotify) g_free, (GDestroyNotify) g_object_unref);
@@ -82,6 +82,7 @@ ld_library_finalize (GObject *gobject)
self = LD_LIBRARY (gobject);
+ g_object_unref (self->priv->lua);
g_hash_table_destroy (self->categories);
/* Chain up to the parent class. */
diff --git a/src/ld-lua.c b/src/ld-lua.c
index 9bf0e76..e5b6c78 100644
--- a/src/ld-lua.c
+++ b/src/ld-lua.c
@@ -16,12 +16,17 @@
#include "config.h"
#include "ld-library.h"
+#include "ld-symbol-category.h"
#include "ld-lua.h"
-/* TODO */
-/* A virtual superclass can be made for this. */
-
+/**
+ * SECTION:ld-lua
+ * @short_description: Lua symbol engine.
+ * @see_also: #LdSymbol
+ *
+ * #LdLua is a symbol engine that uses Lua scripts to manage symbols.
+ */
/* Lua state belongs to the library.
* One Lua file should be able to register multiple symbols.
*/
@@ -36,12 +41,25 @@
*
*/
-static void *
-ld_lua_alloc (void *ud, void *ptr, size_t osize, size_t nsize);
+/*
+ * LdLuaPrivate:
+ * @L: Lua state.
+ *
+ * The library contains the real function for rendering.
+ */
+struct _LdLuaPrivate
+{
+ lua_State *L;
+};
+G_DEFINE_TYPE (LdLua, ld_lua, G_TYPE_OBJECT);
+
+static void ld_lua_finalize (GObject *gobject);
+
+static void *ld_lua_alloc (void *ud, void *ptr, size_t osize, size_t nsize);
-static int
-ld_lua_logdiag_register (lua_State *L);
+
+static int ld_lua_logdiag_register (lua_State *L);
static luaL_Reg ld_lua_logdiag_lib[] =
{
@@ -50,18 +68,12 @@ static luaL_Reg ld_lua_logdiag_lib[] =
};
-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_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_move_to (lua_State *L);
+static int ld_lua_cairo_line_to (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 luaL_Reg ld_lua_cairo_table[] =
{
@@ -74,15 +86,30 @@ static luaL_Reg ld_lua_cairo_table[] =
{NULL, NULL}
};
+
/* ===== Generic =========================================================== */
-lua_State *
-ld_lua_init (void)
+static void
+ld_lua_class_init (LdLuaClass *klass)
+{
+ GObjectClass *object_class;
+
+ object_class = G_OBJECT_CLASS (klass);
+ object_class->finalize = ld_lua_finalize;
+
+ g_type_class_add_private (klass, sizeof (LdLuaPrivate));
+}
+
+static void
+ld_lua_init (LdLua *self)
{
lua_State *L;
- L = lua_newstate (ld_lua_alloc, NULL);
- g_return_val_if_fail (L != NULL, NULL);
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE
+ (self, LD_TYPE_LUA, LdLuaPrivate);
+
+ L = self->priv->L = lua_newstate (ld_lua_alloc, NULL);
+ g_return_if_fail (L != NULL);
/* TODO: lua_atpanic () */
@@ -100,10 +127,29 @@ ld_lua_init (void)
luaL_register (L, "logdiag", ld_lua_logdiag_lib);
}
-void
-ld_lua_destroy (lua_State *L)
+static void
+ld_lua_finalize (GObject *gobject)
{
- lua_close (L);
+ LdLua *self;
+
+ self = LD_LUA (gobject);
+ lua_close (self->priv->L);
+
+ /* Chain up to the parent class. */
+ G_OBJECT_CLASS (ld_lua_parent_class)->finalize (gobject);
+}
+
+/**
+ * ld_lua_new:
+ * @library: A library object.
+ * @filename: The file from which the symbol will be loaded.
+ *
+ * Load a symbol from a file into the library.
+ */
+LdLua *
+ld_lua_new (void)
+{
+ return g_object_new (LD_TYPE_LUA, NULL);
}
static void *
@@ -134,6 +180,7 @@ ld_lua_logdiag_register (lua_State *L)
/* TODO: Push a function. */
lua_call (L, 1, 0);
#endif /* 0 */
+ return 0;
}
/* ===== Cairo ============================================================= */
@@ -147,6 +194,11 @@ push_cairo_object (lua_State *L, cairo_t *cr)
lua_newtable (L);
/* Add methods. */
+ /* XXX: The light user data pointer gets invalid after the end of
+ * "render" function invocation. If the script stores the "cr" object
+ * in some global variable and then tries to reuse it the next time,
+ * the application will go SIGSEGV.
+ */
for (fn = ld_lua_cairo_table; fn->name; fn++)
{
lua_pushlightuserdata (L, cr);
@@ -155,6 +207,7 @@ push_cairo_object (lua_State *L, cairo_t *cr)
}
}
+/* TODO: Implement the functions. */
static int
ld_lua_cairo_move_to (lua_State *L)
{
diff --git a/src/ld-lua.h b/src/ld-lua.h
index 2c41579..512143e 100644
--- a/src/ld-lua.h
+++ b/src/ld-lua.h
@@ -14,11 +14,47 @@
G_BEGIN_DECLS
-lua_State *
-ld_lua_init (void);
-
-void
-ld_lua_destroy (lua_State *L);
+#define LD_TYPE_LUA (ld_lua_get_type ())
+#define LD_LUA(obj) (G_TYPE_CHECK_INSTANCE_CAST \
+ ((obj), LD_TYPE_LUA, LdLua))
+#define LD_LUA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST \
+ ((klass), LD_TYPE_LUA, LdLuaClass))
+#define LD_IS_LUA(obj) (G_TYPE_CHECK_INSTANCE_TYPE \
+ ((obj), LD_TYPE_LUA))
+#define LD_IS_LUA_CLASS(klass) (G_TYPE_CHECK_INSTANCE_TYPE \
+ ((klass), LD_TYPE_LUA))
+#define LD_LUA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS \
+ ((obj), LD_LUA, LdLuaClass))
+
+typedef struct _LdLua LdLua;
+typedef struct _LdLuaPrivate LdLuaPrivate;
+typedef struct _LdLuaClass LdLuaClass;
+
+
+struct _LdLua
+{
+/*< private >*/
+ GObject parent_instance;
+ LdLuaPrivate *priv;
+
+/*< public >*/
+ gchar *name;
+};
+
+/* TODO: A virtual superclass, so other engines can be used. */
+struct _LdLuaClass
+{
+ GObjectClass parent_class;
+};
+
+
+GType ld_lua_get_type (void) G_GNUC_CONST;
+
+LdLua *ld_lua_new (void);
+/* TODO: Implement the following: */
+gboolean ld_lua_check_file (LdLua *lua, const gchar *filename);
+gboolean ld_lua_load_file_to_category (LdLua *lua, const gchar *filename,
+ LdSymbolCategory *category);
G_END_DECLS