Read terminals from Lua scripts and export them.
Also add a missing part of LdSymbol API.
This commit is contained in:
		
							parent
							
								
									7ce03bac9d
								
							
						
					
					
						commit
						edd64aa132
					
				| @ -22,6 +22,7 @@ G_BEGIN_DECLS | |||||||
|  * @name: Name of this symbol. |  * @name: Name of this symbol. | ||||||
|  * @human_name: Localized human name of this symbol. |  * @human_name: Localized human name of this symbol. | ||||||
|  * @area: Area of this symbol. |  * @area: Area of this symbol. | ||||||
|  |  * @terminals: Terminals of this symbol. | ||||||
|  */ |  */ | ||||||
| struct _LdLuaSymbolPrivate | struct _LdLuaSymbolPrivate | ||||||
| { | { | ||||||
| @ -29,6 +30,7 @@ struct _LdLuaSymbolPrivate | |||||||
| 	gchar *name; | 	gchar *name; | ||||||
| 	gchar *human_name; | 	gchar *human_name; | ||||||
| 	LdRectangle area; | 	LdRectangle area; | ||||||
|  | 	LdPointArray *terminals; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -37,6 +37,7 @@ static void ld_lua_symbol_finalize (GObject *gobject); | |||||||
| static const gchar *ld_lua_symbol_real_get_name (LdSymbol *symbol); | static const gchar *ld_lua_symbol_real_get_name (LdSymbol *symbol); | ||||||
| static const gchar *ld_lua_symbol_real_get_human_name (LdSymbol *symbol); | static const gchar *ld_lua_symbol_real_get_human_name (LdSymbol *symbol); | ||||||
| static void ld_lua_symbol_real_get_area (LdSymbol *symbol, LdRectangle *area); | static void ld_lua_symbol_real_get_area (LdSymbol *symbol, LdRectangle *area); | ||||||
|  | static const LdPointArray *ld_lua_symbol_real_get_terminals (LdSymbol *symbol); | ||||||
| static void ld_lua_symbol_real_draw (LdSymbol *symbol, cairo_t *cr); | static void ld_lua_symbol_real_draw (LdSymbol *symbol, cairo_t *cr); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @ -53,6 +54,7 @@ ld_lua_symbol_class_init (LdLuaSymbolClass *klass) | |||||||
| 	klass->parent_class.get_name = ld_lua_symbol_real_get_name; | 	klass->parent_class.get_name = ld_lua_symbol_real_get_name; | ||||||
| 	klass->parent_class.get_human_name = ld_lua_symbol_real_get_human_name; | 	klass->parent_class.get_human_name = ld_lua_symbol_real_get_human_name; | ||||||
| 	klass->parent_class.get_area = ld_lua_symbol_real_get_area; | 	klass->parent_class.get_area = ld_lua_symbol_real_get_area; | ||||||
|  | 	klass->parent_class.get_terminals = ld_lua_symbol_real_get_terminals; | ||||||
| 	klass->parent_class.draw = ld_lua_symbol_real_draw; | 	klass->parent_class.draw = ld_lua_symbol_real_draw; | ||||||
| 
 | 
 | ||||||
| 	g_type_class_add_private (klass, sizeof (LdLuaSymbolPrivate)); | 	g_type_class_add_private (klass, sizeof (LdLuaSymbolPrivate)); | ||||||
| @ -83,6 +85,9 @@ ld_lua_symbol_finalize (GObject *gobject) | |||||||
| 	if (self->priv->human_name) | 	if (self->priv->human_name) | ||||||
| 		g_free (self->priv->human_name); | 		g_free (self->priv->human_name); | ||||||
| 
 | 
 | ||||||
|  | 	if (self->priv->terminals) | ||||||
|  | 		ld_point_array_free (self->priv->terminals); | ||||||
|  | 
 | ||||||
| 	/* Chain up to the parent class. */ | 	/* Chain up to the parent class. */ | ||||||
| 	G_OBJECT_CLASS (ld_lua_symbol_parent_class)->finalize (gobject); | 	G_OBJECT_CLASS (ld_lua_symbol_parent_class)->finalize (gobject); | ||||||
| } | } | ||||||
| @ -114,6 +119,17 @@ ld_lua_symbol_real_get_area (LdSymbol *symbol, LdRectangle *area) | |||||||
| 	*area = self->priv->area; | 	*area = self->priv->area; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static const LdPointArray * | ||||||
|  | ld_lua_symbol_real_get_terminals (LdSymbol *symbol) | ||||||
|  | { | ||||||
|  | 	LdLuaSymbol *self; | ||||||
|  | 
 | ||||||
|  | 	g_return_val_if_fail (LD_IS_LUA_SYMBOL (symbol), NULL); | ||||||
|  | 
 | ||||||
|  | 	self = LD_LUA_SYMBOL (symbol); | ||||||
|  | 	return self->priv->terminals; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void | static void | ||||||
| ld_lua_symbol_real_draw (LdSymbol *symbol, cairo_t *cr) | ld_lua_symbol_real_draw (LdSymbol *symbol, cairo_t *cr) | ||||||
| { | { | ||||||
|  | |||||||
							
								
								
									
										59
									
								
								src/ld-lua.c
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								src/ld-lua.c
									
									
									
									
									
								
							| @ -92,6 +92,8 @@ static int ld_lua_logdiag_register (lua_State *L); | |||||||
| static int process_registration (lua_State *L); | static int process_registration (lua_State *L); | ||||||
| static gchar *get_translation (lua_State *L, int index); | static gchar *get_translation (lua_State *L, int index); | ||||||
| static gboolean read_symbol_area (lua_State *L, int index, LdRectangle *area); | static gboolean read_symbol_area (lua_State *L, int index, LdRectangle *area); | ||||||
|  | static gboolean read_terminals (lua_State *L, int index, | ||||||
|  | 	LdPointArray **terminals); | ||||||
| 
 | 
 | ||||||
| static void push_cairo_object (lua_State *L, LdLuaDrawData *draw_data); | static void push_cairo_object (lua_State *L, LdLuaDrawData *draw_data); | ||||||
| static gdouble get_cairo_scale (cairo_t *cr); | static gdouble get_cairo_scale (cairo_t *cr); | ||||||
| @ -474,8 +476,8 @@ process_registration (lua_State *L) | |||||||
| 
 | 
 | ||||||
| 	if (!read_symbol_area (L, 3, &symbol->priv->area)) | 	if (!read_symbol_area (L, 3, &symbol->priv->area)) | ||||||
| 		return luaL_error (L, "Malformed symbol area array."); | 		return luaL_error (L, "Malformed symbol area array."); | ||||||
| 
 | 	if (!read_terminals (L, 4, &symbol->priv->terminals)) | ||||||
| 	/* TODO: Read and set the terminals. */ | 		return luaL_error (L, "Malformed terminals array."); | ||||||
| 
 | 
 | ||||||
| 	lua_getfield (L, LUA_REGISTRYINDEX, LD_LUA_SYMBOLS_INDEX); | 	lua_getfield (L, LUA_REGISTRYINDEX, LD_LUA_SYMBOLS_INDEX); | ||||||
| 	lua_pushlightuserdata (L, symbol); | 	lua_pushlightuserdata (L, symbol); | ||||||
| @ -561,9 +563,62 @@ read_symbol_area (lua_State *L, int index, LdRectangle *area) | |||||||
| 	area->width = ABS (x2 - x1); | 	area->width = ABS (x2 - x1); | ||||||
| 	area->height = ABS (y2 - y1); | 	area->height = ABS (y2 - y1); | ||||||
| 
 | 
 | ||||||
|  | 	lua_pop (L, 4); | ||||||
| 	return TRUE; | 	return TRUE; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /*
 | ||||||
|  |  * read_terminals: | ||||||
|  |  * @L: A Lua state. | ||||||
|  |  * @index: Stack index of the table. | ||||||
|  |  * @area: Where the point array will be returned. | ||||||
|  |  * | ||||||
|  |  * Read symbol terminals from a Lua table. | ||||||
|  |  * | ||||||
|  |  * Return value: TRUE on success, FALSE on failure. | ||||||
|  |  */ | ||||||
|  | static gboolean | ||||||
|  | read_terminals (lua_State *L, int index, LdPointArray **terminals) | ||||||
|  | { | ||||||
|  | 	LdPointArray *points; | ||||||
|  | 	size_t num_points; | ||||||
|  | 	unsigned i = 0; | ||||||
|  | 
 | ||||||
|  | 	num_points = lua_objlen (L, index); | ||||||
|  | 	points = ld_point_array_new (num_points); | ||||||
|  | 
 | ||||||
|  | 	lua_pushnil (L); | ||||||
|  | 	while (lua_next (L, index) != 0) | ||||||
|  | 	{ | ||||||
|  | 		g_assert (i < num_points); | ||||||
|  | 
 | ||||||
|  | 		if (!lua_istable (L, -1) || lua_objlen (L, -1) != 2) | ||||||
|  | 			goto read_terminals_fail; | ||||||
|  | 
 | ||||||
|  | 		lua_rawgeti (L, -1, 1); | ||||||
|  | 		if (!lua_isnumber (L, -1)) | ||||||
|  | 			goto read_terminals_fail; | ||||||
|  | 		points->points[i].x = lua_tonumber (L, -1); | ||||||
|  | 		lua_pop (L, 1); | ||||||
|  | 
 | ||||||
|  | 		lua_rawgeti (L, -1, 2); | ||||||
|  | 		if (!lua_isnumber (L, -1)) | ||||||
|  | 			goto read_terminals_fail; | ||||||
|  | 		points->points[i].y = lua_tonumber (L, -1); | ||||||
|  | 
 | ||||||
|  | 		lua_pop (L, 2); | ||||||
|  | 		i++; | ||||||
|  | 	} | ||||||
|  | 	*terminals = points; | ||||||
|  | 	return TRUE; | ||||||
|  | 
 | ||||||
|  | read_terminals_fail: | ||||||
|  | 	ld_point_array_free (points); | ||||||
|  | 	*terminals = NULL; | ||||||
|  | 	return FALSE; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| /* ===== Cairo ============================================================= */ | /* ===== Cairo ============================================================= */ | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
|  | |||||||
| @ -35,7 +35,8 @@ enum | |||||||
| 	PROP_0, | 	PROP_0, | ||||||
| 	PROP_NAME, | 	PROP_NAME, | ||||||
| 	PROP_HUMAN_NAME, | 	PROP_HUMAN_NAME, | ||||||
| 	PROP_AREA | 	PROP_AREA, | ||||||
|  | 	PROP_TERMINALS | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| static void ld_symbol_get_property (GObject *object, guint property_id, | static void ld_symbol_get_property (GObject *object, guint property_id, | ||||||
| @ -85,6 +86,16 @@ ld_symbol_class_init (LdSymbolClass *klass) | |||||||
| 		"The area of this symbol.", | 		"The area of this symbol.", | ||||||
| 		LD_TYPE_RECTANGLE, G_PARAM_READABLE); | 		LD_TYPE_RECTANGLE, G_PARAM_READABLE); | ||||||
| 	g_object_class_install_property (object_class, PROP_AREA, pspec); | 	g_object_class_install_property (object_class, PROP_AREA, pspec); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * LdSymbol:terminals: | ||||||
|  |  * | ||||||
|  |  * A point array that specifies terminals of this symbol. | ||||||
|  |  */ | ||||||
|  | 	pspec = g_param_spec_boxed ("terminals", "Terminals", | ||||||
|  | 		"A point array that specifies terminals of this symbol.", | ||||||
|  | 		LD_TYPE_POINT_ARRAY, G_PARAM_READABLE); | ||||||
|  | 	g_object_class_install_property (object_class, PROP_TERMINALS, pspec); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void | static void | ||||||
| @ -115,6 +126,9 @@ ld_symbol_get_property (GObject *object, guint property_id, | |||||||
| 			g_value_set_boxed (value, &area); | 			g_value_set_boxed (value, &area); | ||||||
| 		} | 		} | ||||||
| 		break; | 		break; | ||||||
|  | 	case PROP_TERMINALS: | ||||||
|  | 		g_value_set_boxed (value, ld_symbol_get_terminals (self)); | ||||||
|  | 		break; | ||||||
| 	default: | 	default: | ||||||
| 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); | 		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); | ||||||
| 	} | 	} | ||||||
| @ -184,6 +198,26 @@ ld_symbol_get_area (LdSymbol *self, LdRectangle *area) | |||||||
| 	klass->get_area (self, area); | 	klass->get_area (self, area); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * ld_symbol_get_terminals: | ||||||
|  |  * @self: A symbol object. | ||||||
|  |  * | ||||||
|  |  * Get a list of symbol terminals. | ||||||
|  |  * | ||||||
|  |  * Return value: An #LdPointArray structure. | ||||||
|  |  */ | ||||||
|  | const LdPointArray * | ||||||
|  | ld_symbol_get_terminals (LdSymbol *self) | ||||||
|  | { | ||||||
|  | 	LdSymbolClass *klass; | ||||||
|  | 
 | ||||||
|  | 	g_return_val_if_fail (LD_IS_SYMBOL (self), NULL); | ||||||
|  | 
 | ||||||
|  | 	klass = LD_SYMBOL_GET_CLASS (self); | ||||||
|  | 	g_return_val_if_fail (klass->get_terminals != NULL, NULL); | ||||||
|  | 	return klass->get_terminals (self); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * ld_symbol_draw: |  * ld_symbol_draw: | ||||||
|  * @self: A symbol object. |  * @self: A symbol object. | ||||||
|  | |||||||
| @ -44,6 +44,7 @@ struct _LdSymbol | |||||||
|  * @get_name: Get the name of the symbol. |  * @get_name: Get the name of the symbol. | ||||||
|  * @get_human_name: Get the localized human name of the symbol. |  * @get_human_name: Get the localized human name of the symbol. | ||||||
|  * @get_area: Get the area of the symbol. |  * @get_area: Get the area of the symbol. | ||||||
|  |  * @get_terminals: Get a list of symbol terminals. | ||||||
|  * @draw: Draw the symbol on a Cairo surface. |  * @draw: Draw the symbol on a Cairo surface. | ||||||
|  */ |  */ | ||||||
| struct _LdSymbolClass | struct _LdSymbolClass | ||||||
| @ -53,6 +54,7 @@ struct _LdSymbolClass | |||||||
| 	const gchar *(*get_name) (LdSymbol *self); | 	const gchar *(*get_name) (LdSymbol *self); | ||||||
| 	const gchar *(*get_human_name) (LdSymbol *self); | 	const gchar *(*get_human_name) (LdSymbol *self); | ||||||
| 	void (*get_area) (LdSymbol *self, LdRectangle *area); | 	void (*get_area) (LdSymbol *self, LdRectangle *area); | ||||||
|  | 	const LdPointArray *(*get_terminals) (LdSymbol *self); | ||||||
| 	void (*draw) (LdSymbol *self, cairo_t *cr); | 	void (*draw) (LdSymbol *self, cairo_t *cr); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -62,12 +64,9 @@ GType ld_symbol_get_type (void) G_GNUC_CONST; | |||||||
| const gchar *ld_symbol_get_name (LdSymbol *self); | const gchar *ld_symbol_get_name (LdSymbol *self); | ||||||
| const gchar *ld_symbol_get_human_name (LdSymbol *self); | const gchar *ld_symbol_get_human_name (LdSymbol *self); | ||||||
| void ld_symbol_get_area (LdSymbol *self, LdRectangle *area); | void ld_symbol_get_area (LdSymbol *self, LdRectangle *area); | ||||||
|  | const LdPointArray *ld_symbol_get_terminals (LdSymbol *self); | ||||||
| void ld_symbol_draw (LdSymbol *self, cairo_t *cr); | void ld_symbol_draw (LdSymbol *self, cairo_t *cr); | ||||||
| 
 | 
 | ||||||
| /* TODO: Interface for terminals.
 |  | ||||||
|  *       Something like a list of gdouble pairs (-> a new structure). |  | ||||||
|  */ |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| G_END_DECLS | G_END_DECLS | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user