From 96f7710c25d296983649551ed2e0dc44db9614fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C5=99emysl=20Janouch?= Date: Sat, 8 Jan 2011 06:44:40 +0100 Subject: [PATCH] Introduce LdRectangle, LdPoint and LdPointArray. Remove LdCanvasRect and LdSymbolArea. --- CMakeLists.txt | 2 + src/ld-canvas.c | 72 +++---------- src/ld-library.c | 3 +- src/ld-lua-symbol-private.h | 4 +- src/ld-lua-symbol.c | 7 +- src/ld-lua.c | 5 +- src/ld-symbol-category.c | 3 +- src/ld-symbol.c | 57 +--------- src/ld-symbol.h | 33 +----- src/ld-types.c | 202 ++++++++++++++++++++++++++++++++++++ src/ld-types.h | 100 ++++++++++++++++++ src/ld-window-main.c | 3 +- 12 files changed, 344 insertions(+), 147 deletions(-) create mode 100644 src/ld-types.c create mode 100644 src/ld-types.h diff --git a/CMakeLists.txt b/CMakeLists.txt index fc9bfc6..493904f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -82,6 +82,7 @@ set (project_DOC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/docs/reference") set (logdiag_SOURCES src/logdiag.c src/ld-marshal.c + src/ld-types.c src/ld-window-main.c src/ld-diagram.c src/ld-diagram-object.c @@ -95,6 +96,7 @@ set (logdiag_SOURCES set (logdiag_HEADERS ${CMAKE_CURRENT_BINARY_DIR}/config.h src/ld-marshal.h + src/ld-types.h src/ld-window-main.h src/ld-diagram.h src/ld-diagram-object.h diff --git a/src/ld-canvas.c b/src/ld-canvas.c index 0acac75..aa6a1b3 100644 --- a/src/ld-canvas.c +++ b/src/ld-canvas.c @@ -15,6 +15,7 @@ #include "config.h" #include "ld-marshal.h" +#include "ld-types.h" #include "ld-diagram-object.h" #include "ld-diagram-symbol.h" #include "ld-diagram.h" @@ -83,8 +84,6 @@ struct _LdCanvasColor gdouble a; }; -typedef cairo_rectangle_t LdCanvasRect; - /* * LdCanvasPrivate: * @diagram: A diagram object assigned to this canvas as a model. @@ -138,7 +137,7 @@ struct _DrawData { LdCanvas *self; cairo_t *cr; - LdCanvasRect exposed_rect; + LdRectangle exposed_rect; gdouble scale; }; @@ -181,12 +180,6 @@ static void ld_canvas_color_set (LdCanvasColor *color, gdouble r, gdouble g, gdouble b, gdouble a); static void ld_canvas_color_apply (LdCanvasColor *color, cairo_t *cr); -static gboolean ld_canvas_rect_contains (LdCanvasRect *rect, - gdouble x, gdouble y); -static gboolean ld_canvas_rect_intersects (LdCanvasRect *first, - LdCanvasRect *second); -static void ld_canvas_rect_extend (LdCanvasRect *rect, gdouble border); - static void move_object_to_coords (LdCanvas *self, LdDiagramObject *object, gdouble x, gdouble y); static LdDiagramObject *get_object_at_coords (LdCanvas *self, @@ -195,11 +188,11 @@ static gboolean is_object_selected (LdCanvas *self, LdDiagramObject *object); static LdSymbol *resolve_diagram_symbol (LdCanvas *self, LdDiagramSymbol *diagram_symbol); static gboolean get_symbol_area (LdCanvas *self, LdDiagramSymbol *symbol, - LdCanvasRect *rect); + LdRectangle *rect); static gboolean get_symbol_clip_area (LdCanvas *self, LdDiagramSymbol *symbol, - LdCanvasRect *rect); + LdRectangle *rect); static gboolean get_object_area (LdCanvas *self, LdDiagramObject *object, - LdCanvasRect *rect); + LdRectangle *rect); static gboolean object_hit_test (LdCanvas *self, LdDiagramObject *object, gdouble x, gdouble y); static void queue_object_redraw (LdCanvas *self, LdDiagramObject *object); @@ -792,37 +785,6 @@ ld_canvas_color_apply (LdCanvasColor *color, cairo_t *cr) cairo_set_source_rgba (cr, color->r, color->g, color->b, color->a); } -static gboolean -ld_canvas_rect_contains (LdCanvasRect *rect, gdouble x, gdouble y) -{ - g_return_val_if_fail (rect != NULL, FALSE); - return (x >= rect->x && x <= rect->x + rect->width - && y >= rect->y && y <= rect->y + rect->height); -} - -static gboolean -ld_canvas_rect_intersects (LdCanvasRect *first, LdCanvasRect *second) -{ - g_return_val_if_fail (first != NULL, FALSE); - g_return_val_if_fail (second != NULL, FALSE); - - return !(first->x > second->x + second->width - || first->y > second->y + second->height - || first->x + first->width < second->x - || first->y + first->height < second->y); -} - -static void -ld_canvas_rect_extend (LdCanvasRect *rect, gdouble border) -{ - g_return_if_fail (rect != NULL); - - rect->x -= border; - rect->y -= border; - rect->width += 2 * border; - rect->height += 2 * border; -} - static void move_object_to_coords (LdCanvas *self, LdDiagramObject *object, gdouble x, gdouble y) @@ -870,12 +832,12 @@ resolve_diagram_symbol (LdCanvas *self, LdDiagramSymbol *diagram_symbol) } static gboolean -get_symbol_area (LdCanvas *self, LdDiagramSymbol *symbol, LdCanvasRect *rect) +get_symbol_area (LdCanvas *self, LdDiagramSymbol *symbol, LdRectangle *rect) { LdDiagramObject *object; gdouble object_x, object_y; LdSymbol *library_symbol; - LdSymbolArea area; + LdRectangle area; gdouble x1, x2; gdouble y1, y2; @@ -908,20 +870,20 @@ get_symbol_area (LdCanvas *self, LdDiagramSymbol *symbol, LdCanvasRect *rect) static gboolean get_symbol_clip_area (LdCanvas *self, LdDiagramSymbol *symbol, - LdCanvasRect *rect) + LdRectangle *rect) { - LdCanvasRect object_rect; + LdRectangle object_rect; if (!get_object_area (self, LD_DIAGRAM_OBJECT (symbol), &object_rect)) return FALSE; *rect = object_rect; - ld_canvas_rect_extend (rect, SYMBOL_CLIP_TOLERANCE); + ld_rectangle_extend (rect, SYMBOL_CLIP_TOLERANCE); return TRUE; } static gboolean -get_object_area (LdCanvas *self, LdDiagramObject *object, LdCanvasRect *rect) +get_object_area (LdCanvas *self, LdDiagramObject *object, LdRectangle *rect) { if (LD_IS_DIAGRAM_SYMBOL (object)) return get_symbol_area (self, LD_DIAGRAM_SYMBOL (object), rect); @@ -931,12 +893,12 @@ get_object_area (LdCanvas *self, LdDiagramObject *object, LdCanvasRect *rect) static gboolean object_hit_test (LdCanvas *self, LdDiagramObject *object, gdouble x, gdouble y) { - LdCanvasRect rect; + LdRectangle rect; if (!get_object_area (self, object, &rect)) return FALSE; - ld_canvas_rect_extend (&rect, OBJECT_BORDER_TOLERANCE); - return ld_canvas_rect_contains (&rect, x, y); + ld_rectangle_extend (&rect, OBJECT_BORDER_TOLERANCE); + return ld_rectangle_contains (&rect, x, y); } static void @@ -944,7 +906,7 @@ queue_object_redraw (LdCanvas *self, LdDiagramObject *object) { if (LD_IS_DIAGRAM_SYMBOL (object)) { - LdCanvasRect rect; + LdRectangle rect; if (!get_symbol_clip_area (self, LD_DIAGRAM_SYMBOL (object), &rect)) return; @@ -1151,7 +1113,7 @@ static void draw_symbol (LdDiagramSymbol *diagram_symbol, DrawData *data) { LdSymbol *symbol; - LdCanvasRect clip_rect; + LdRectangle clip_rect; gdouble x, y; symbol = resolve_diagram_symbol (data->self, diagram_symbol); @@ -1165,7 +1127,7 @@ draw_symbol (LdDiagramSymbol *diagram_symbol, DrawData *data) } if (!get_symbol_clip_area (data->self, diagram_symbol, &clip_rect) - || !ld_canvas_rect_intersects (&clip_rect, &data->exposed_rect)) + || !ld_rectangle_intersects (&clip_rect, &data->exposed_rect)) return; cairo_save (data->cr); diff --git a/src/ld-library.c b/src/ld-library.c index 73c40ef..5e4d502 100644 --- a/src/ld-library.c +++ b/src/ld-library.c @@ -2,7 +2,7 @@ * ld-library.c * * This file is a part of logdiag. - * Copyright Přemysl Janouch 2010. All rights reserved. + * Copyright Přemysl Janouch 2010 - 2011. All rights reserved. * * See the file LICENSE for licensing information. * @@ -15,6 +15,7 @@ #include "config.h" +#include "ld-types.h" #include "ld-symbol.h" #include "ld-symbol-category.h" #include "ld-library.h" diff --git a/src/ld-lua-symbol-private.h b/src/ld-lua-symbol-private.h index 73bed20..0e8800e 100644 --- a/src/ld-lua-symbol-private.h +++ b/src/ld-lua-symbol-private.h @@ -2,7 +2,7 @@ * ld-lua-symbol-private.h * * This file is a part of logdiag. - * Copyright Přemysl Janouch 2010. All rights reserved. + * Copyright Přemysl Janouch 2010 - 2011. All rights reserved. * * See the file LICENSE for licensing information. * @@ -28,7 +28,7 @@ struct _LdLuaSymbolPrivate LdLua *lua; gchar *name; gchar *human_name; - LdSymbolArea area; + LdRectangle area; }; diff --git a/src/ld-lua-symbol.c b/src/ld-lua-symbol.c index 5626761..a481cff 100644 --- a/src/ld-lua-symbol.c +++ b/src/ld-lua-symbol.c @@ -2,7 +2,7 @@ * ld-lua-symbol.c * * This file is a part of logdiag. - * Copyright Přemysl Janouch 2010. All rights reserved. + * Copyright Přemysl Janouch 2010 - 2011. All rights reserved. * * See the file LICENSE for licensing information. * @@ -12,6 +12,7 @@ #include "config.h" +#include "ld-types.h" #include "ld-symbol.h" #include "ld-symbol-category.h" #include "ld-library.h" @@ -35,7 +36,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_human_name (LdSymbol *symbol); -static void ld_lua_symbol_real_get_area (LdSymbol *symbol, LdSymbolArea *area); +static void ld_lua_symbol_real_get_area (LdSymbol *symbol, LdRectangle *area); static void ld_lua_symbol_real_draw (LdSymbol *symbol, cairo_t *cr); @@ -102,7 +103,7 @@ ld_lua_symbol_real_get_human_name (LdSymbol *symbol) } static void -ld_lua_symbol_real_get_area (LdSymbol *symbol, LdSymbolArea *area) +ld_lua_symbol_real_get_area (LdSymbol *symbol, LdRectangle *area) { LdLuaSymbol *self; diff --git a/src/ld-lua.c b/src/ld-lua.c index 4cab71c..746d2f9 100644 --- a/src/ld-lua.c +++ b/src/ld-lua.c @@ -15,6 +15,7 @@ #include "config.h" +#include "ld-types.h" #include "ld-symbol.h" #include "ld-library.h" @@ -90,7 +91,7 @@ static int ld_lua_private_unregister_cb (lua_State *L); static int ld_lua_logdiag_register (lua_State *L); 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 gboolean read_symbol_area (lua_State *L, int index, LdRectangle *area); static void push_cairo_object (lua_State *L, LdLuaDrawData *draw_data); static gdouble get_cairo_scale (cairo_t *cr); @@ -528,7 +529,7 @@ get_translation (lua_State *L, int index) * Return value: TRUE on success, FALSE on failure. */ static gboolean -read_symbol_area (lua_State *L, int index, LdSymbolArea *area) +read_symbol_area (lua_State *L, int index, LdRectangle *area) { lua_Number x1, x2, y1, y2; diff --git a/src/ld-symbol-category.c b/src/ld-symbol-category.c index 2ca2693..b9d70b1 100644 --- a/src/ld-symbol-category.c +++ b/src/ld-symbol-category.c @@ -2,7 +2,7 @@ * ld-symbol-category.c * * This file is a part of logdiag. - * Copyright Přemysl Janouch 2010. All rights reserved. + * Copyright Přemysl Janouch 2010 - 2011. All rights reserved. * * See the file LICENSE for licensing information. * @@ -12,6 +12,7 @@ #include "config.h" +#include "ld-types.h" #include "ld-symbol.h" #include "ld-symbol-category.h" #include "ld-library.h" diff --git a/src/ld-symbol.c b/src/ld-symbol.c index 45f11c9..24a7ab9 100644 --- a/src/ld-symbol.c +++ b/src/ld-symbol.c @@ -2,7 +2,7 @@ * ld-symbol.c * * This file is a part of logdiag. - * Copyright Přemysl Janouch 2010. All rights reserved. + * Copyright Přemysl Janouch 2010 - 2011. All rights reserved. * * See the file LICENSE for licensing information. * @@ -12,6 +12,7 @@ #include "config.h" +#include "ld-types.h" #include "ld-symbol.h" #include "ld-symbol-category.h" #include "ld-library.h" @@ -82,7 +83,7 @@ ld_symbol_class_init (LdSymbolClass *klass) */ pspec = g_param_spec_boxed ("area", "Area", "The area of this symbol.", - LD_TYPE_SYMBOL_AREA, G_PARAM_READABLE); + LD_TYPE_RECTANGLE, G_PARAM_READABLE); g_object_class_install_property (object_class, PROP_AREA, pspec); } @@ -108,7 +109,7 @@ ld_symbol_get_property (GObject *object, guint property_id, break; case PROP_AREA: { - LdSymbolArea area; + LdRectangle area; ld_symbol_get_area (self, &area); g_value_set_boxed (value, &area); @@ -171,7 +172,7 @@ ld_symbol_get_human_name (LdSymbol *self) * Get the area of the symbol. */ void -ld_symbol_get_area (LdSymbol *self, LdSymbolArea *area) +ld_symbol_get_area (LdSymbol *self, LdRectangle *area) { LdSymbolClass *klass; @@ -202,51 +203,3 @@ ld_symbol_draw (LdSymbol *self, cairo_t *cr) g_return_if_fail (klass->draw != NULL); klass->draw (self, cr); } - -/** - * ld_symbol_area_copy: - * @self: An #LdSymbolArea structure. - * - * Makes a copy of the structure. - * The result must be freed by ld_symbol_area_free(). - * - * Return value: A copy of @self. - **/ -LdSymbolArea * -ld_symbol_area_copy (const LdSymbolArea *self) -{ - LdSymbolArea *new_area; - - g_return_val_if_fail (self != NULL, NULL); - - new_area = g_slice_new (LdSymbolArea); - *new_area = *self; - return new_area; -} - -/** - * ld_symbol_area_free: - * @self: An #LdSymbolArea structure. - * - * Frees the structure created with ld_symbol_area_copy(). - **/ -void -ld_symbol_area_free (LdSymbolArea *self) -{ - g_return_if_fail (self != NULL); - - g_slice_free (LdSymbolArea, self); -} - -GType -ld_symbol_area_get_type (void) -{ - static GType our_type = 0; - - if (our_type == 0) - our_type = g_boxed_type_register_static - (g_intern_static_string ("LdSymbolArea"), - (GBoxedCopyFunc) ld_symbol_area_copy, - (GBoxedFreeFunc) ld_symbol_area_free); - return our_type; -} diff --git a/src/ld-symbol.h b/src/ld-symbol.h index 0290720..43ab4df 100644 --- a/src/ld-symbol.h +++ b/src/ld-symbol.h @@ -2,7 +2,7 @@ * ld-symbol.h * * This file is a part of logdiag. - * Copyright Přemysl Janouch 2010. All rights reserved. + * Copyright Přemysl Janouch 2010 - 2011. All rights reserved. * * See the file LICENSE for licensing information. * @@ -14,33 +14,6 @@ G_BEGIN_DECLS -#define LD_TYPE_SYMBOL_AREA (ld_symbol_area_get_type ()) - -typedef struct _LdSymbolArea LdSymbolArea; - -/** - * LdSymbolArea: - * @x: Left-top X coordinate. - * @y: Left-top Y coordinate. - * @width: Width of the area, must be positive. - * @height: Height of the area, must be positive. - * - * Defines the area of the symbol relative to the center of the symbol, - * which is at the (0, 0) coordinates. - */ -struct _LdSymbolArea -{ - gdouble x, y; - gdouble width, height; -}; - - -GType ld_symbol_area_get_type (void) G_GNUC_CONST; - -LdSymbolArea *ld_symbol_area_copy (const LdSymbolArea *self); -void ld_symbol_area_free (LdSymbolArea *self); - - #define LD_TYPE_SYMBOL (ld_symbol_get_type ()) #define LD_SYMBOL(obj) (G_TYPE_CHECK_INSTANCE_CAST \ ((obj), LD_TYPE_SYMBOL, LdSymbol)) @@ -79,7 +52,7 @@ struct _LdSymbolClass const gchar *(*get_name) (LdSymbol *self); const gchar *(*get_human_name) (LdSymbol *self); - void (*get_area) (LdSymbol *self, LdSymbolArea *area); + void (*get_area) (LdSymbol *self, LdRectangle *area); void (*draw) (LdSymbol *self, cairo_t *cr); }; @@ -88,7 +61,7 @@ GType ld_symbol_get_type (void) G_GNUC_CONST; const gchar *ld_symbol_get_name (LdSymbol *self); const gchar *ld_symbol_get_human_name (LdSymbol *self); -void ld_symbol_get_area (LdSymbol *self, LdSymbolArea *area); +void ld_symbol_get_area (LdSymbol *self, LdRectangle *area); void ld_symbol_draw (LdSymbol *self, cairo_t *cr); /* TODO: Interface for terminals. diff --git a/src/ld-types.c b/src/ld-types.c new file mode 100644 index 0000000..512bcef --- /dev/null +++ b/src/ld-types.c @@ -0,0 +1,202 @@ +/* + * ld-types.c + * + * This file is a part of logdiag. + * Copyright Přemysl Janouch 2010 - 2011. All rights reserved. + * + * See the file LICENSE for licensing information. + * + */ + +#include + +#include "config.h" + +#include "ld-types.h" + + +#define DEFINE_BOXED_TYPE(TypeName, type_name) \ +GType \ +type_name ## _get_type (void) \ +{ \ + static GType our_type = 0; \ + if (our_type == 0) \ + our_type = g_boxed_type_register_static \ + (g_intern_static_string (#TypeName), \ + (GBoxedCopyFunc) type_name ## _copy, \ + (GBoxedFreeFunc) type_name ## _free); \ + return our_type; \ +} + +DEFINE_BOXED_TYPE (LdPoint, ld_point) +DEFINE_BOXED_TYPE (LdPointArray, ld_point_array) +DEFINE_BOXED_TYPE (LdRectangle, ld_rectangle) + +#define DEFINE_BOXED_TRIVIAL_COPY(TypeName, type_name) \ +TypeName * \ +type_name ## _copy (const TypeName *self) \ +{ \ + TypeName *new_copy; \ + g_return_val_if_fail (self != NULL, NULL); \ + new_copy = g_slice_new (TypeName); \ + *new_copy = *self; \ + return new_copy; \ +} + +#define DEFINE_BOXED_TRIVIAL_FREE(TypeName, type_name) \ +void \ +type_name ## _free (TypeName *self) \ +{ \ + g_return_if_fail (self != NULL); \ + g_slice_free (TypeName, self); \ +} + +/** + * ld_point_copy: + * @self: An #LdPoint structure. + * + * Makes a copy of the structure. + * The result must be freed by ld_point_free(). + * + * Return value: A copy of @self. + */ +DEFINE_BOXED_TRIVIAL_COPY (LdPoint, ld_point) + +/** + * ld_point_free: + * @self: An #LdPoint structure. + * + * Frees the structure created with ld_point_copy(). + */ +DEFINE_BOXED_TRIVIAL_FREE (LdPoint, ld_point) + +/** + * ld_point_array_new: + * @num_points: The number of points the array can store. + * + * Create a new array of points and initialize. + * + * Return value: An #LdPointArray structure. + */ +LdPointArray * +ld_point_array_new (gint num_points) +{ + LdPointArray *new_array; + + g_return_val_if_fail (num_points >= 1, NULL); + + new_array = g_slice_new (LdPointArray); + new_array->num_points = num_points; + new_array->points = g_malloc0 (num_points * sizeof (LdPoint)); + return new_array; +} + +/** + * ld_point_array_copy: + * @self: An #LdPointArray structure. + * + * Makes a copy of the structure. + * The result must be freed by ld_point_array_free(). + * + * Return value: A copy of @self. + */ +LdPointArray * +ld_point_array_copy (const LdPointArray *self) +{ + LdPointArray *new_array; + + g_return_val_if_fail (self != NULL, NULL); + + new_array = g_slice_new (LdPointArray); + new_array->num_points = self->num_points; + new_array->points = g_memdup (self->points, + self->num_points * sizeof (LdPoint)); + return new_array; +} + +/** + * ld_point_array_free: + * @self: An #LdPointArray structure. + * + * Frees the structure created with ld_point_array_copy(). + */ +void +ld_point_array_free (LdPointArray *self) +{ + g_return_if_fail (self != NULL); + + g_free (self->points); + g_slice_free (LdPointArray, self); +} + +/** + * ld_rectangle_copy: + * @self: An #LdRectangle structure. + * + * Makes a copy of the structure. + * The result must be freed by ld_rectangle_free(). + * + * Return value: A copy of @self. + */ +DEFINE_BOXED_TRIVIAL_COPY (LdRectangle, ld_rectangle) + +/** + * ld_rectangle_free: + * @self: An #LdRectangle structure. + * + * Frees the structure created with ld_rectangle_copy(). + */ +DEFINE_BOXED_TRIVIAL_FREE (LdRectangle, ld_rectangle) + +/** + * ld_rectangle_contains: + * @self: An #LdRectangle structure. + * @x: The X coordinate of the point to be checked. + * @y: The Y coordinate of the point to be checked. + * + * Return value: TRUE if the rectangle contains the specified point. + */ +gboolean +ld_rectangle_contains (LdRectangle *self, gdouble x, gdouble y) +{ + g_return_val_if_fail (self != NULL, FALSE); + return (x >= self->x && x <= self->x + self->width + && y >= self->y && y <= self->y + self->height); +} + +/** + * ld_rectangle_intersects: + * @self: An #LdRectangle structure. + * @rect: An #LdRectangle to be checked for intersection. + * + * Return value: TRUE if the two rectangles intersect. + */ +gboolean +ld_rectangle_intersects (LdRectangle *self, LdRectangle *rect) +{ + g_return_val_if_fail (self != NULL, FALSE); + g_return_val_if_fail (rect != NULL, FALSE); + + return !(self->x > rect->x + rect->width + || self->y > rect->y + rect->height + || self->x + self->width < rect->x + || self->y + self->height < rect->y); +} + +/** + * ld_rectangle_extend: + * @self: An #LdRectangle structure. + * @border: The border by which the rectangle should be extended. + * + * Extend a rectangle on all sides. + */ +void +ld_rectangle_extend (LdRectangle *self, gdouble border) +{ + g_return_if_fail (self != NULL); + + self->x -= border; + self->y -= border; + self->width += 2 * border; + self->height += 2 * border; +} diff --git a/src/ld-types.h b/src/ld-types.h new file mode 100644 index 0000000..6837f74 --- /dev/null +++ b/src/ld-types.h @@ -0,0 +1,100 @@ +/* + * ld-types.h + * + * This file is a part of logdiag. + * Copyright Přemysl Janouch 2010 - 2011. All rights reserved. + * + * See the file LICENSE for licensing information. + * + */ + +#ifndef __LD_TYPES_H__ +#define __LD_TYPES_H__ + +G_BEGIN_DECLS + + +/** + * SECTION:ld-types + * @short_description: Simple data types. + * + * #LdPoint defines coordinates of a point. + * + * #LdRectangle defines the position and size of a rectangle. + */ + +#define LD_TYPE_POINT (ld_point_get_type ()) +#define LD_TYPE_POINT_ARRAY (ld_point_array_get_type ()) +#define LD_TYPE_RECTANGLE (ld_rectangle_get_type ()) + +typedef struct _LdPoint LdPoint; +typedef struct _LdPointArray LdPointArray; +typedef struct _LdRectangle LdRectangle; + + +/** + * LdPoint: + * @x: The X coordinate. + * @y: The Y coordinate. + * + * Defines a point. + */ +struct _LdPoint +{ + gdouble x, y; +}; + +GType ld_point_get_type (void) G_GNUC_CONST; + +LdPoint *ld_point_copy (const LdPoint *self); +void ld_point_free (LdPoint *self); + + +/** + * LdPointArray: + * @points: An array of #LdPoint structures. + * @num_points: Count of points in @points. + * + * Moves quickly. + */ +struct _LdPointArray +{ + LdPoint *points; + gint num_points; +}; + +GType ld_point_array_get_type (void) G_GNUC_CONST; + +LdPointArray *ld_point_array_new (gint num_points); +LdPointArray *ld_point_array_copy (const LdPointArray *self); +void ld_point_array_free (LdPointArray *self); + + +/** + * LdRectangle: + * @x: Left-top X coordinate. + * @y: Left-top Y coordinate. + * @width: Width of the area, must be positive. + * @height: Height of the area, must be positive. + * + * Defines a rectangle. + */ +struct _LdRectangle +{ + gdouble x, y; + gdouble width, height; +}; + +GType ld_rectangle_get_type (void) G_GNUC_CONST; + +LdRectangle *ld_rectangle_copy (const LdRectangle *self); +void ld_rectangle_free (LdRectangle *self); +gboolean ld_rectangle_contains (LdRectangle *self, gdouble x, gdouble y); +gboolean ld_rectangle_intersects (LdRectangle *self, LdRectangle *rect); +void ld_rectangle_extend (LdRectangle *self, gdouble border); + + +G_END_DECLS + +#endif /* ! __LD_TYPES_H__ */ + diff --git a/src/ld-window-main.c b/src/ld-window-main.c index 366dbf0..d22f400 100644 --- a/src/ld-window-main.c +++ b/src/ld-window-main.c @@ -14,6 +14,7 @@ #include "ld-window-main.h" +#include "ld-types.h" #include "ld-symbol.h" #include "ld-symbol-category.h" #include "ld-library.h" @@ -610,7 +611,7 @@ on_category_toggle (GtkToggleButton *toggle_button, gpointer user_data) for (symbol_iter = children; symbol_iter; symbol_iter = symbol_iter->next) { - LdSymbolArea area; + LdRectangle area; item->symbol = LD_SYMBOL (symbol_iter->data); g_object_ref (item->symbol);