Contents of /trunk/src/osm.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 103 - (show annotations)
Tue Mar 3 12:12:53 2009 UTC (15 years, 2 months ago) by harbaum
File MIME type: text/plain
File size: 7684 byte(s)
Canvas code cleanups
1 /*
2 * Copyright (C) 2008 Till Harbaum <till@harbaum.org>.
3 *
4 * This file is part of OSM2Go.
5 *
6 * OSM2Go is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * OSM2Go is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with OSM2Go. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #ifndef OSM_H
21 #define OSM_H
22
23 #include <math.h>
24
25 #define OSM_FLAG_DIRTY (1<<0)
26 #define OSM_FLAG_DELETED (1<<1)
27 #define OSM_FLAG_NEW (1<<2)
28 #define OSM_FLAG_HIDDEN (1<<3)
29
30 typedef gulong item_id_t;
31 #define G_TYPE_ITEM_ID_T G_TYPE_ULONG
32
33 #define ID_ILLEGAL ((item_id_t)0)
34
35 /* icon stuff is required since nodes may held a icon reference */
36 struct icon_s;
37
38 typedef struct bounds_s {
39 pos_t ll_min, ll_max;
40 lpos_t min, max;
41 lpos_t center;
42 float scale;
43 } bounds_t;
44
45 typedef struct user_s {
46 char *name;
47 struct user_s *next;
48 } user_t;
49
50 typedef struct tag_s {
51 char *key, *value;
52 struct tag_s *next;
53 } tag_t;
54
55 typedef struct node_s {
56 item_id_t id;
57 pos_t pos;
58 lpos_t lpos;
59 user_t *user;
60 gboolean visible;
61 time_t time;
62 tag_t *tag;
63 int ways;
64 int flags;
65 float zoom_max;
66
67 /* icon */
68 GdkPixbuf *icon_buf;
69
70 /* a link to the visual representation on screen */
71 struct map_item_chain_s *map_item_chain;
72
73 struct node_s *next;
74 } node_t;
75
76 typedef struct node_chain {
77 node_t *node;
78 struct node_chain *next;
79 } node_chain_t;
80
81 #define OSM_DRAW_FLAG_AREA (1<<0)
82 #define OSM_DRAW_FLAG_BG (1<<1)
83
84 typedef struct way_s {
85 item_id_t id;
86 user_t *user;
87 gboolean visible;
88 time_t time;
89 tag_t *tag;
90 node_chain_t *node_chain;
91 int flags;
92
93 /* visual representation from elemstyle */
94 struct {
95 guint flags;
96 gulong color;
97 gint width;
98 float zoom_max;
99 gboolean dashed;
100 guint dash_length;
101
102 union {
103 struct {
104 gulong color;
105 gint width;
106 } bg;
107
108 struct {
109 gulong color;
110 } area;
111 };
112 } draw;
113
114 /* a link to the visual representation on screen */
115 struct map_item_chain_s *map_item_chain;
116
117 struct way_s *next;
118 } way_t;
119
120 typedef struct way_chain {
121 way_t *way;
122 struct way_chain *next;
123 } way_chain_t;
124
125 typedef struct relation_s {
126 item_id_t id;
127 user_t *user;
128 gboolean visible;
129 time_t time;
130 tag_t *tag;
131 struct member_s *member;
132 int flags;
133
134 struct relation_s *next;
135 } relation_t;
136
137 typedef struct relation_chain_s {
138 relation_t *relation;
139 struct relation_chain_s *next;
140 } relation_chain_t;
141
142 /* two of these hash tables are used, one for nodes and one for ways */
143 /* currently relations aren't used often enough to justify the use */
144 /* of a hash table */
145
146 /* the current hash table uses 16 bits. each table thus is */
147 /* 256 kbytes (2^16 * sizeof(void*)) in size */
148 #define ID2HASH(a) ((unsigned short)(a) ^ (unsigned short)((a)>>16))
149
150 typedef struct hash_item_s {
151 union {
152 node_t *node;
153 way_t *way;
154 relation_t *relation;
155 } data;
156
157 struct hash_item_s *next;
158 } hash_item_t;
159
160 typedef struct {
161 hash_item_t *hash[65536];
162 } hash_table_t;
163
164 typedef enum {
165 ILLEGAL=0, NODE, WAY, RELATION, NODE_ID, WAY_ID, RELATION_ID
166 } type_t;
167
168 typedef struct member_s {
169 type_t type;
170 char *role;
171
172 union {
173 node_t *node;
174 way_t *way;
175 relation_t *relation;
176 void *ptr;
177 item_id_t id;
178 };
179
180 struct member_s *next;
181 } member_t;
182
183 typedef struct osm_s {
184 bounds_t *bounds; // original bounds as they appear in the file
185 user_t *user;
186
187 node_t *node;
188 hash_table_t *node_hash;
189
190 way_t *way;
191 hash_table_t *way_hash;
192
193 // hashing relations doesn't yet make much sense as relations are quite rare
194 relation_t *relation;
195
196 } osm_t;
197
198 #include <libxml/parser.h>
199 #include <libxml/tree.h>
200
201 osm_t *osm_parse(char *filename);
202 gboolean osm_sanity_check(GtkWidget *parent, osm_t *osm);
203 tag_t *osm_parse_osm_tag(osm_t *osm, xmlDocPtr doc, xmlNode *a_node);
204 node_chain_t *osm_parse_osm_way_nd(osm_t *osm, xmlDocPtr doc, xmlNode *a_node);
205 member_t *osm_parse_osm_relation_member(osm_t *osm, xmlDocPtr doc, xmlNode *a_node);
206 void osm_dump(osm_t *osm);
207 void osm_free(struct icon_s **icon, osm_t *osm);
208
209 char *osm_node_get_value(node_t *node, char *key);
210 gboolean osm_node_has_tag(node_t *node);
211
212 void osm_node_dump(node_t *node);
213
214 void osm_way_free(way_t *way);
215 void osm_way_dump(way_t *way);
216 char *osm_way_get_value(way_t *way, char *key);
217 gboolean osm_node_has_value(node_t *node, char *str);
218 gboolean osm_way_has_value(way_t *way, char *str);
219 void osm_way_append_node(way_t *way, node_t *node);
220
221 gboolean osm_node_in_way(way_t *way, node_t *node);
222
223 void osm_node_chain_free(node_chain_t *node_chain);
224 int osm_node_chain_length(node_chain_t *node_chain);
225 void osm_node_free(struct icon_s **icon, node_t *node);
226
227 void osm_members_free(member_t *member);
228 void osm_member_free(member_t *member);
229
230 void osm_tag_free(tag_t *tag);
231 void osm_tags_free(tag_t *tag);
232 char *osm_tag_get_by_key(tag_t *tag, char *key);
233 gboolean osm_is_creator_tag(tag_t *tag);
234 gboolean osm_tag_key_and_value_present(tag_t *haystack, tag_t *tag);
235 gboolean osm_tag_key_other_value_present(tag_t *haystack, tag_t *tag);
236
237 char *osm_generate_xml_node(osm_t *osm, node_t *node);
238 char *osm_generate_xml_way(osm_t *osm, way_t *way);
239 char *osm_generate_xml_relation(osm_t *osm, relation_t *relation);
240
241 node_t *osm_get_node_by_id(osm_t *osm, item_id_t id);
242 way_t *osm_get_way_by_id(osm_t *osm, item_id_t id);
243 relation_t *osm_get_relation_by_id(osm_t *osm, item_id_t id);
244
245 guint osm_way_number_of_nodes(way_t *way);
246 relation_chain_t *osm_node_to_relation(osm_t *osm, node_t *node);
247 relation_chain_t *osm_way_to_relation(osm_t *osm, way_t *way);
248 way_chain_t *osm_node_to_way(osm_t *osm, node_t *node);
249
250 /* ----------- edit functions ----------- */
251 node_t *osm_node_new(osm_t *osm, gint x, gint y);
252 void osm_node_attach(osm_t *osm, node_t *node);
253 void osm_node_restore(osm_t *osm, node_t *node);
254 way_chain_t *osm_node_delete(osm_t *osm, struct icon_s **icon, node_t *node,
255 gboolean permanently, gboolean affect_ways);
256 void osm_way_delete(osm_t *osm, struct icon_s **icon, way_t *way,
257 gboolean permanently);
258
259 way_t *osm_way_new(void);
260 void osm_way_attach(osm_t *osm, way_t *way);
261
262 gboolean osm_position_within_bounds(osm_t *osm, gint x, gint y);
263 item_id_t osm_new_way_id(osm_t *osm);
264 gboolean osm_way_ends_with_node(way_t *way, node_t *node);
265
266 void osm_way_reverse(way_t *way);
267 guint osm_way_reverse_direction_sensitive_tags(way_t *way);
268 guint osm_way_reverse_direction_sensitive_roles(osm_t *osm, way_t *way);
269
270 void osm_node_remove_from_relation(osm_t *osm, node_t *node);
271 void osm_way_remove_from_relation(osm_t *osm, way_t *way);
272
273 node_t *osm_way_get_last_node(way_t *way);
274 node_t *osm_way_get_first_node(way_t *way);
275 void osm_way_rotate(way_t *way, gint offset);
276
277 tag_t *osm_tags_copy(tag_t *tag, gboolean update_creator);
278
279 char *osm_type_string(type_t type);
280 char *osm_id_string(type_t type, void *object);
281 char *osm_object_string(type_t type, void *object);
282 tag_t *osm_object_get_tags(type_t type, void *object);
283
284 relation_t *osm_relation_new(void);
285 void osm_relation_free(relation_t *relation);
286 void osm_relation_attach(osm_t *osm, relation_t *relation);
287 void osm_relation_delete(osm_t *osm, relation_t *relation,
288 gboolean permanently);
289 gint osm_relation_members_num(relation_t *relation);
290
291 #endif /* OSM_H */
292
293 // vim:et:ts=8:sw=2:sts=2:ai