95 |
gulong color; |
gulong color; |
96 |
gint width; |
gint width; |
97 |
float zoom_max; |
float zoom_max; |
98 |
|
gboolean dashed; |
99 |
|
guint dash_length; |
100 |
|
|
101 |
union { |
union { |
102 |
struct { |
struct { |
138 |
struct relation_chain_s *next; |
struct relation_chain_s *next; |
139 |
} relation_chain_t; |
} relation_chain_t; |
140 |
|
|
141 |
|
/* two of these hash tables are used, one for nodes and one for ways */ |
142 |
|
/* currently relations aren't used often enough to justify the use */ |
143 |
|
/* of a hash table */ |
144 |
|
|
145 |
|
/* the current hash table uses 16 bits. each table thus is */ |
146 |
|
/* 256 kbytes (2^16 * sizeof(void*)) in size */ |
147 |
|
#define ID2HASH(a) ((unsigned short)(a) ^ (unsigned short)((a)>>16)) |
148 |
|
|
149 |
|
typedef struct hash_item_s { |
150 |
|
union { |
151 |
|
node_t *node; |
152 |
|
way_t *way; |
153 |
|
relation_t *relation; |
154 |
|
} data; |
155 |
|
|
156 |
|
struct hash_item_s *next; |
157 |
|
} hash_item_t; |
158 |
|
|
159 |
|
typedef struct { |
160 |
|
hash_item_t *hash[65536]; |
161 |
|
} hash_table_t; |
162 |
|
|
163 |
typedef enum { |
typedef enum { |
164 |
ILLEGAL=0, NODE, WAY, RELATION, NODE_ID, WAY_ID, RELATION_ID |
ILLEGAL=0, NODE, WAY, RELATION, NODE_ID, WAY_ID, RELATION_ID |
165 |
} type_t; |
} type_t; |
172 |
node_t *node; |
node_t *node; |
173 |
way_t *way; |
way_t *way; |
174 |
relation_t *relation; |
relation_t *relation; |
175 |
|
void *ptr; |
176 |
item_id_t id; |
item_id_t id; |
177 |
}; |
}; |
178 |
|
|
182 |
typedef struct osm_s { |
typedef struct osm_s { |
183 |
bounds_t *bounds; // original bounds as they appear in the file |
bounds_t *bounds; // original bounds as they appear in the file |
184 |
user_t *user; |
user_t *user; |
185 |
|
|
186 |
node_t *node; |
node_t *node; |
187 |
|
hash_table_t *node_hash; |
188 |
|
|
189 |
way_t *way; |
way_t *way; |
190 |
|
hash_table_t *way_hash; |
191 |
|
|
192 |
|
// hashing relations doesn't yet make much sense as relations are quite rare |
193 |
relation_t *relation; |
relation_t *relation; |
194 |
|
|
195 |
} osm_t; |
} osm_t; |
196 |
|
|
197 |
#include <libxml/parser.h> |
#include <libxml/parser.h> |
249 |
/* ----------- edit functions ----------- */ |
/* ----------- edit functions ----------- */ |
250 |
node_t *osm_node_new(osm_t *osm, gint x, gint y); |
node_t *osm_node_new(osm_t *osm, gint x, gint y); |
251 |
void osm_node_attach(osm_t *osm, node_t *node); |
void osm_node_attach(osm_t *osm, node_t *node); |
252 |
|
void osm_node_restore(osm_t *osm, node_t *node); |
253 |
way_chain_t *osm_node_delete(osm_t *osm, struct icon_s **icon, node_t *node, |
way_chain_t *osm_node_delete(osm_t *osm, struct icon_s **icon, node_t *node, |
254 |
gboolean permanently, gboolean affect_ways); |
gboolean permanently, gboolean affect_ways); |
255 |
void osm_way_delete(osm_t *osm, struct icon_s **icon, way_t *way, |
void osm_way_delete(osm_t *osm, struct icon_s **icon, way_t *way, |
262 |
item_id_t osm_new_way_id(osm_t *osm); |
item_id_t osm_new_way_id(osm_t *osm); |
263 |
gboolean osm_way_ends_with_node(way_t *way, node_t *node); |
gboolean osm_way_ends_with_node(way_t *way, node_t *node); |
264 |
|
|
265 |
void osm_way_revert(way_t *way); |
void osm_way_reverse(way_t *way); |
266 |
|
guint osm_way_reverse_direction_sensitive_tags(way_t *way); |
267 |
|
|
268 |
void osm_node_remove_from_relation(osm_t *osm, node_t *node); |
void osm_node_remove_from_relation(osm_t *osm, node_t *node); |
269 |
void osm_way_remove_from_relation(osm_t *osm, way_t *way); |
void osm_way_remove_from_relation(osm_t *osm, way_t *way); |
274 |
|
|
275 |
tag_t *osm_tags_copy(tag_t *tag, gboolean update_creator); |
tag_t *osm_tags_copy(tag_t *tag, gboolean update_creator); |
276 |
|
|
277 |
|
char *osm_type_string(type_t type); |
278 |
|
char *osm_id_string(type_t type, void *object); |
279 |
|
char *osm_object_string(type_t type, void *object); |
280 |
|
tag_t *osm_object_get_tags(type_t type, void *object); |
281 |
|
|
282 |
|
relation_t *osm_relation_new(void); |
283 |
|
void osm_relation_free(relation_t *relation); |
284 |
|
void osm_relation_attach(osm_t *osm, relation_t *relation); |
285 |
|
void osm_relation_delete(osm_t *osm, relation_t *relation, |
286 |
|
gboolean permanently); |
287 |
|
gint osm_relation_members_num(relation_t *relation); |
288 |
|
|
289 |
#endif /* OSM_H */ |
#endif /* OSM_H */ |
290 |
|
|
291 |
|
// vim:et:ts=8:sw=2:sts=2:ai |