summaryrefslogtreecommitdiff
path: root/navit/maptool/ch.c
diff options
context:
space:
mode:
Diffstat (limited to 'navit/maptool/ch.c')
-rw-r--r--navit/maptool/ch.c822
1 files changed, 391 insertions, 431 deletions
diff --git a/navit/maptool/ch.c b/navit/maptool/ch.c
index b1b0b1bf6..29c3f81ee 100644
--- a/navit/maptool/ch.c
+++ b/navit/maptool/ch.c
@@ -33,32 +33,32 @@
#endif
struct ch_edge {
- int flags;
- int weight;
- struct item_id target,middle;
+ int flags;
+ int weight;
+ struct item_id target,middle;
};
struct node {
- int first_edge;
- int dummy;
+ int first_edge;
+ int dummy;
} *nodes;
int node_count;
struct edge {
- unsigned target:26;
- unsigned scedge1:6;
- unsigned weight:28;
- unsigned type:2;
- unsigned flags:2;
- unsigned int edge_count;
- unsigned scedge2:6;
- unsigned scmiddle:26;
+ unsigned target:26;
+ unsigned scedge1:6;
+ unsigned weight:28;
+ unsigned type:2;
+ unsigned flags:2;
+ unsigned int edge_count;
+ unsigned scedge2:6;
+ unsigned scmiddle:26;
} *edges;
int edge_count;
struct newnode {
- int newnode;
+ int newnode;
} *newnodes;
int newnode_count;
@@ -66,7 +66,7 @@ int newnode_count;
GHashTable *newnode_hash;
struct edge_hash_item {
- int first,last;
+ int first,last;
};
@@ -80,471 +80,431 @@ GHashTable *sgr_nodes_hash;
static int ch_levels=14;
-static int
-road_speed(enum item_type type)
-{
- switch (type) {
- case type_street_0:
- case type_street_1_city:
- case type_living_street:
- case type_street_service:
- case type_track_gravelled:
- case type_track_unpaved:
- return 10;
- case type_street_2_city:
- case type_track_paved:
- return 30;
- case type_street_3_city:
- return 40;
- case type_street_4_city:
- return 50;
- case type_highway_city:
- return 80;
- case type_street_1_land:
- return 60;
- case type_street_2_land:
- return 65;
- case type_street_3_land:
- return 70;
- case type_street_4_land:
- return 80;
- case type_street_n_lanes:
- return 120;
- case type_highway_land:
- return 120;
- case type_ramp:
- return 40;
- case type_roundabout:
- return 10;
- case type_ferry:
- return 40;
- default:
- return 0;
- }
+static int road_speed(enum item_type type) {
+ switch (type) {
+ case type_street_0:
+ case type_street_1_city:
+ case type_living_street:
+ case type_street_service:
+ case type_track_gravelled:
+ case type_track_unpaved:
+ return 10;
+ case type_street_2_city:
+ case type_track_paved:
+ return 30;
+ case type_street_3_city:
+ return 40;
+ case type_street_4_city:
+ return 50;
+ case type_highway_city:
+ return 80;
+ case type_street_1_land:
+ return 60;
+ case type_street_2_land:
+ return 65;
+ case type_street_3_land:
+ return 70;
+ case type_street_4_land:
+ return 80;
+ case type_street_n_lanes:
+ return 120;
+ case type_highway_land:
+ return 120;
+ case type_ramp:
+ return 40;
+ case type_roundabout:
+ return 10;
+ case type_ferry:
+ return 40;
+ default:
+ return 0;
+ }
}
-static void
-coord_slice_free(void *data)
-{
- g_slice_free(struct coord, data);
+static void coord_slice_free(void *data) {
+ g_slice_free(struct coord, data);
}
-static GHashTable *
-coord_hash_new(void)
-{
- return g_hash_table_new_full(coord_hash, coord_equal, coord_slice_free, NULL);
+static GHashTable *coord_hash_new(void) {
+ return g_hash_table_new_full(coord_hash, coord_equal, coord_slice_free, NULL);
}
-static void
-item_id_slice_free(void *data)
-{
- g_slice_free(struct item_id, data);
+static void item_id_slice_free(void *data) {
+ g_slice_free(struct item_id, data);
}
-static void
-add_node_to_hash(FILE *idx, GHashTable *hash, struct coord *c, int *nodes)
-{
- if (! g_hash_table_lookup(hash, c)) {
- struct coord *ct=g_slice_new(struct coord);
- *ct=*c;
- fwrite(c, sizeof(*c), 1, idx);
- (*nodes)++;
- g_hash_table_insert(hash, ct, GINT_TO_POINTER(*nodes));
- }
+static void add_node_to_hash(FILE *idx, GHashTable *hash, struct coord *c, int *nodes) {
+ if (! g_hash_table_lookup(hash, c)) {
+ struct coord *ct=g_slice_new(struct coord);
+ *ct=*c;
+ fwrite(c, sizeof(*c), 1, idx);
+ (*nodes)++;
+ g_hash_table_insert(hash, ct, GINT_TO_POINTER(*nodes));
+ }
}
-static void
-edge_hash_slice_free(void *data)
-{
- g_slice_free(struct edge_hash_item, data);
+static void edge_hash_slice_free(void *data) {
+ g_slice_free(struct edge_hash_item, data);
}
-static guint
-edge_hash_hash(gconstpointer key)
-{
- const struct edge_hash_item *itm=key;
- return itm->first*2654435761UL+itm->last;
+static guint edge_hash_hash(gconstpointer key) {
+ const struct edge_hash_item *itm=key;
+ return itm->first*2654435761UL+itm->last;
}
-static gboolean
-edge_hash_equal(gconstpointer a, gconstpointer b)
-{
- const struct edge_hash_item *itm_a=a;
- const struct edge_hash_item *itm_b=b;
- return (itm_a->first == itm_b->first && itm_a->last == itm_b->last);
+static gboolean edge_hash_equal(gconstpointer a, gconstpointer b) {
+ const struct edge_hash_item *itm_a=a;
+ const struct edge_hash_item *itm_b=b;
+ return (itm_a->first == itm_b->first && itm_a->last == itm_b->last);
}
-static void
-ch_generate_ddsg(FILE *in, FILE *ref, FILE *idx, FILE *ddsg)
-{
- GHashTable *hash=coord_hash_new();
- struct item_bin *ib;
- int nodes=0,edges=0;
-
- while ((ib=read_item(in))) {
- int ccount=ib->clen/2;
- struct coord *c=(struct coord *)(ib+1);
- if (road_speed(ib->type)) {
- add_node_to_hash(idx, hash, &c[0], &nodes);
- add_node_to_hash(idx, hash, &c[ccount-1], &nodes);
- edges++;
- }
- }
- edge_hash=g_hash_table_new_full(edge_hash_hash, edge_hash_equal, edge_hash_slice_free, item_id_slice_free);
- fseek(in, 0, SEEK_SET);
- fprintf(ddsg,"d\n");
- fprintf(ddsg,"%d %d\n", nodes, edges);
- while ((ib=read_item(in))) {
- int i,ccount=ib->clen/2;
- struct coord *c=(struct coord *)(ib+1);
- int n1,n2,speed=road_speed(ib->type);
- struct item_id road_id;
- double l;
- fread(&road_id, sizeof(road_id), 1, ref);
- if (speed) {
- struct edge_hash_item *hi=g_slice_new(struct edge_hash_item);
- struct item_id *id=g_slice_new(struct item_id);
- *id=road_id;
- dbg_assert((n1=GPOINTER_TO_INT(g_hash_table_lookup(hash, &c[0]))) != 0);
- dbg_assert((n2=GPOINTER_TO_INT(g_hash_table_lookup(hash, &c[ccount-1]))) != 0);
- l=0;
- for (i = 0 ; i < ccount-1 ; i++) {
- l+=sqrt(sq(c[i+1].x-c[i].x)+sq(c[i+1].y-c[i].y));
- }
- fprintf(ddsg,"%d %d %d 0\n", n1-1, n2-1, (int)(l*36/speed));
- hi->first=n1-1;
- hi->last=n2-1;
- g_hash_table_insert(edge_hash, hi, id);
- }
- }
- g_hash_table_destroy(hash);
+static void ch_generate_ddsg(FILE *in, FILE *ref, FILE *idx, FILE *ddsg) {
+ GHashTable *hash=coord_hash_new();
+ struct item_bin *ib;
+ int nodes=0,edges=0;
+
+ while ((ib=read_item(in))) {
+ int ccount=ib->clen/2;
+ struct coord *c=(struct coord *)(ib+1);
+ if (road_speed(ib->type)) {
+ add_node_to_hash(idx, hash, &c[0], &nodes);
+ add_node_to_hash(idx, hash, &c[ccount-1], &nodes);
+ edges++;
+ }
+ }
+ edge_hash=g_hash_table_new_full(edge_hash_hash, edge_hash_equal, edge_hash_slice_free, item_id_slice_free);
+ fseek(in, 0, SEEK_SET);
+ fprintf(ddsg,"d\n");
+ fprintf(ddsg,"%d %d\n", nodes, edges);
+ while ((ib=read_item(in))) {
+ int i,ccount=ib->clen/2;
+ struct coord *c=(struct coord *)(ib+1);
+ int n1,n2,speed=road_speed(ib->type);
+ struct item_id road_id;
+ double l;
+
+ if (fread(&road_id, sizeof(road_id), 1, ref) == 0) {
+ dbg(lvl_warning, "fread failed");
+ continue;
+ }
+ if (speed) {
+ struct edge_hash_item *hi=g_slice_new(struct edge_hash_item);
+ struct item_id *id=g_slice_new(struct item_id);
+ *id=road_id;
+ dbg_assert((n1=GPOINTER_TO_INT(g_hash_table_lookup(hash, &c[0]))) != 0);
+ dbg_assert((n2=GPOINTER_TO_INT(g_hash_table_lookup(hash, &c[ccount-1]))) != 0);
+ l=0;
+ for (i = 0 ; i < ccount-1 ; i++) {
+ l+=sqrt(sq(c[i+1].x-c[i].x)+sq(c[i+1].y-c[i].y));
+ }
+ fprintf(ddsg,"%d %d %d 0\n", n1-1, n2-1, (int)(l*36/speed));
+ hi->first=n1-1;
+ hi->last=n2-1;
+ g_hash_table_insert(edge_hash, hi, id);
+ }
+ }
+ g_hash_table_destroy(hash);
}
-static void
-ch_generate_sgr(char *suffix)
-{
+static void ch_generate_sgr(char *suffix) {
#ifndef HAVE_API_WIN32_CE
- char command[1024];
- sprintf(command,"./contraction-hierarchies-20080621/main -s -p -f ddsg_%s.tmp -o hcn_%s.tmp -l hcn_log_%s.tmp -x 190 -y 1 -e 600 -p 1000 -k 1,3.3,2,10,3,10,5",suffix,suffix,suffix);
- printf("%s\n",command);
- system(command);
- sprintf(command,"./contraction-hierarchies-20080621/main -c -f ddsg_%s.tmp -h hcn_%s.tmp -k 1,3.3,2,10,3,10,5 -C ch_%s.tmp -O 1 -z sgr_%s.tmp",suffix,suffix,suffix,suffix);
- printf("%s\n",command);
- system(command);
+ char command[1024];
+ int system_result;
+ sprintf(command,
+ "./contraction-hierarchies-20080621/main -s -p -f ddsg_%s.tmp -o hcn_%s.tmp -l hcn_log_%s.tmp -x 190 -y 1 -e 600 -p 1000 -k 1,3.3,2,10,3,10,5",
+ suffix,suffix,suffix);
+ printf("%s\n",command);
+ system_result = system(command);
+ if (system_result == -1) {
+ dbg(lvl_warning, "Running main failed");
+ }
+ sprintf(command,
+ "./contraction-hierarchies-20080621/main -c -f ddsg_%s.tmp -h hcn_%s.tmp -k 1,3.3,2,10,3,10,5 -C ch_%s.tmp -O 1 -z sgr_%s.tmp",
+ suffix,suffix,suffix,suffix);
+ printf("%s\n",command);
+ system_result = system(command);
+ if (system_result == -1) {
+ dbg(lvl_warning, "Running main failed");
+ }
#endif
}
-static void
-ch_process_node(FILE *out, int node, int resolve)
-{
- int first_edge_id=nodes[node].first_edge;
- int last_edge_id=nodes[node+1].first_edge;
- int edge_id;
- struct ch_edge ch_edge;
- struct item_bin *item_bin;
- struct edge_hash_item fwd,rev;
- int oldnode;
- memset(&ch_edge, 0, sizeof(ch_edge));
- item_bin=init_item(type_ch_node);
- oldnode=GPOINTER_TO_INT(g_hash_table_lookup(newnode_hash, GINT_TO_POINTER(node)));
-#if 0
- dbg(lvl_debug,"0x%x,0x%x\n",node_index[oldnode].x,node_index[oldnode].y);
-#endif
- item_bin_add_coord(item_bin, &node_index[oldnode], 1);
- fwd.first=oldnode;
- rev.last=oldnode;
- for (edge_id = first_edge_id ; edge_id < last_edge_id ; edge_id++) {
- if (resolve) {
- struct edge *edge=&edges[edge_id];
- int oldnode=GPOINTER_TO_INT(g_hash_table_lookup(newnode_hash, GINT_TO_POINTER((int)edge->target)));
- struct item_id *id;
- ch_edge.weight=edge->weight;
- fwd.last=oldnode;
- rev.first=oldnode;
- ch_edge.flags=edge->flags & 3;
- if (edge->scmiddle == 67108863) {
- id=g_hash_table_lookup(edge_hash, &fwd);
- if (!id) {
- ch_edge.flags|=8;
- id=g_hash_table_lookup(edge_hash, &rev);
- }
- if (id == NULL) {
- fprintf(stderr,"Shortcut %d Weight %d\n",edge->scmiddle,edge->weight);
- fprintf(stderr,"Neither %d-%d nor %d-%d exists\n",fwd.first,fwd.last,rev.first,rev.last);
- exit(1);
- } else {
- ch_edge.middle=*id;
-#if 0
- dbg(lvl_debug,"middle street id for is "ITEM_ID_FMT"\n",ITEM_ID_ARGS(*id));
-#endif
- }
- } else {
- ch_edge.flags|=4;
- id=g_hash_table_lookup(sgr_nodes_hash, GINT_TO_POINTER((int)edge->scmiddle));
- dbg_assert(id != NULL);
- ch_edge.middle=*id;
-#if 0
- dbg(lvl_debug,"middle node id for is "ITEM_ID_FMT"\n",ITEM_ID_ARGS(*id));
-#endif
- }
- id=g_hash_table_lookup(sgr_nodes_hash, GINT_TO_POINTER((int)edge->target));
-#if 0
- dbg(lvl_debug,"id for %d is "ITEM_ID_FMT"\n",edge->target,ITEM_ID_ARGS(*id));
-#endif
- if (id == NULL) {
- fprintf(stderr,"Failed to look up target %d\n",edge->target);
- } else {
- ch_edge.target=*id;
- }
- }
- item_bin_add_attr_data(item_bin,attr_ch_edge,&ch_edge,sizeof(ch_edge));
- }
- item_bin_write(item_bin, out);
+static void ch_process_node(FILE *out, int node, int resolve) {
+ int first_edge_id=nodes[node].first_edge;
+ int last_edge_id=nodes[node+1].first_edge;
+ int edge_id;
+ struct ch_edge ch_edge;
+ struct item_bin *item_bin;
+ struct edge_hash_item fwd,rev;
+ int oldnode;
+ memset(&ch_edge, 0, sizeof(ch_edge));
+ item_bin=init_item(type_ch_node);
+ oldnode=GPOINTER_TO_INT(g_hash_table_lookup(newnode_hash, GINT_TO_POINTER(node)));
+ item_bin_add_coord(item_bin, &node_index[oldnode], 1);
+ fwd.first=oldnode;
+ rev.last=oldnode;
+ for (edge_id = first_edge_id ; edge_id < last_edge_id ; edge_id++) {
+ if (resolve) {
+ struct edge *edge=&edges[edge_id];
+ int oldnode=GPOINTER_TO_INT(g_hash_table_lookup(newnode_hash, GINT_TO_POINTER((int)edge->target)));
+ struct item_id *id;
+ ch_edge.weight=edge->weight;
+ fwd.last=oldnode;
+ rev.first=oldnode;
+ ch_edge.flags=edge->flags & 3;
+ if (edge->scmiddle == 67108863) {
+ id=g_hash_table_lookup(edge_hash, &fwd);
+ if (!id) {
+ ch_edge.flags|=8;
+ id=g_hash_table_lookup(edge_hash, &rev);
+ }
+ if (id == NULL) {
+ fprintf(stderr,"Shortcut %d Weight %d\n",edge->scmiddle,edge->weight);
+ fprintf(stderr,"Neither %d-%d nor %d-%d exists\n",fwd.first,fwd.last,rev.first,rev.last);
+ exit(1);
+ } else {
+ ch_edge.middle=*id;
+ }
+ } else {
+ ch_edge.flags|=4;
+ id=g_hash_table_lookup(sgr_nodes_hash, GINT_TO_POINTER((int)edge->scmiddle));
+ dbg_assert(id != NULL);
+ ch_edge.middle=*id;
+ }
+ id=g_hash_table_lookup(sgr_nodes_hash, GINT_TO_POINTER((int)edge->target));
+ if (id == NULL) {
+ fprintf(stderr,"Failed to look up target %d\n",edge->target);
+ } else {
+ ch_edge.target=*id;
+ }
+ }
+ item_bin_add_attr_data(item_bin,attr_ch_edge,&ch_edge,sizeof(ch_edge));
+ }
+ item_bin_write(item_bin, out);
}
-static void
-ch_process_nodes(FILE *out, int pos, int count, int resolve)
-{
- int i;
- printf("count %d sum=%d newnode_count=%d\n",count,pos,newnode_count);
- for (i = 0 ; i < count ; i++)
- ch_process_node(out, pos+i, resolve);
+static void ch_process_nodes(FILE *out, int pos, int count, int resolve) {
+ int i;
+ printf("count %d sum=%d newnode_count=%d\n",count,pos,newnode_count);
+ for (i = 0 ; i < count ; i++)
+ ch_process_node(out, pos+i, resolve);
}
-static void
-ch_process(FILE **files, int depth, int resolve)
-{
- int count=newnode_count;
- int pos=0;
+static void ch_process(FILE **files, int depth, int resolve) {
+ int count=newnode_count;
+ int pos=0;
- while (depth > 0 && pos < newnode_count) {
- count=(count+1)/2;
- ch_process_nodes(files[depth], pos, count, resolve);
- pos+=count;
- depth--;
- }
- ch_process_nodes(files[depth], pos, newnode_count-pos, resolve);
+ while (depth > 0 && pos < newnode_count) {
+ count=(count+1)/2;
+ ch_process_nodes(files[depth], pos, count, resolve);
+ pos+=count;
+ depth--;
+ }
+ ch_process_nodes(files[depth], pos, newnode_count-pos, resolve);
}
-static void
-ch_setup(char *suffix)
-{
- int i;
- if (!sgr) {
- int *data,size,offset=0;
- char *filename=tempfile_name(suffix,"sgr");
- printf("filename=%s\n",filename);
- sgr=file_create(filename,0);
- g_free(filename);
- dbg_assert(sgr != NULL);
- file_mmap(sgr);
-
- size=sizeof(int);
- data=(int *)file_data_read(sgr, offset, size);
- node_count=*data;
- offset+=size;
-
- size=node_count*sizeof(struct node);
- nodes=(struct node *)file_data_read(sgr, offset, size);
- offset+=size;
-
- size=sizeof(int);
- data=(int *)file_data_read(sgr, offset, size);
- edge_count=*data;
- offset+=size;
-
- size=edge_count*sizeof(struct edge);
- edges=(struct edge *)file_data_read(sgr, offset, size);
- offset+=size;
-
- size=sizeof(int);
- data=(int *)file_data_read(sgr, offset, size);
- newnode_count=*data;
- offset+=size;
-
- size=edge_count*sizeof(struct newnode);
- newnodes=(struct newnode *)file_data_read(sgr, offset, size);
- offset+=size;
-
- newnode_hash=g_hash_table_new(NULL, NULL);
-
- for (i = 0 ; i < newnode_count ; i++) {
- g_hash_table_insert(newnode_hash, GINT_TO_POINTER(newnodes[i].newnode), GINT_TO_POINTER(i));
- }
- }
- if (!ddsg_node_index) {
- char *filename=tempfile_name(suffix,"ddsg_coords");
- ddsg_node_index=file_create(filename,0);
- g_free(filename);
- dbg_assert(ddsg_node_index != NULL);
- file_mmap(ddsg_node_index);
- node_index=(struct coord *)file_data_read(ddsg_node_index, 0, file_size(ddsg_node_index));
- }
+static void ch_setup(char *suffix) {
+ int i;
+ if (!sgr) {
+ int *data,size,offset=0;
+ char *filename=tempfile_name(suffix,"sgr");
+ printf("filename=%s\n",filename);
+ sgr=file_create(filename,0);
+ g_free(filename);
+ dbg_assert(sgr != NULL);
+ file_mmap(sgr);
+
+ size=sizeof(int);
+ data=(int *)file_data_read(sgr, offset, size);
+ node_count=*data;
+ offset+=size;
+
+ size=node_count*sizeof(struct node);
+ nodes=(struct node *)file_data_read(sgr, offset, size);
+ offset+=size;
+
+ size=sizeof(int);
+ data=(int *)file_data_read(sgr, offset, size);
+ edge_count=*data;
+ offset+=size;
+
+ size=edge_count*sizeof(struct edge);
+ edges=(struct edge *)file_data_read(sgr, offset, size);
+ offset+=size;
+
+ size=sizeof(int);
+ data=(int *)file_data_read(sgr, offset, size);
+ newnode_count=*data;
+ offset+=size;
+
+ size=edge_count*sizeof(struct newnode);
+ newnodes=(struct newnode *)file_data_read(sgr, offset, size);
+ offset+=size;
+
+ newnode_hash=g_hash_table_new(NULL, NULL);
+
+ for (i = 0 ; i < newnode_count ; i++) {
+ g_hash_table_insert(newnode_hash, GINT_TO_POINTER(newnodes[i].newnode), GINT_TO_POINTER(i));
+ }
+ }
+ if (!ddsg_node_index) {
+ char *filename=tempfile_name(suffix,"ddsg_coords");
+ ddsg_node_index=file_create(filename,0);
+ g_free(filename);
+ dbg_assert(ddsg_node_index != NULL);
+ file_mmap(ddsg_node_index);
+ node_index=(struct coord *)file_data_read(ddsg_node_index, 0, file_size(ddsg_node_index));
+ }
}
-static void
-ch_create_tempfiles(char *suffix, FILE **files, int count, int mode)
-{
- char name[256];
- int i;
+static void ch_create_tempfiles(char *suffix, FILE **files, int count, int mode) {
+ char name[256];
+ int i;
- for (i = 0 ; i <= count ; i++) {
- sprintf(name,"graph_%d",i);
- files[i]=tempfile(suffix, name, mode);
- }
+ for (i = 0 ; i <= count ; i++) {
+ sprintf(name,"graph_%d",i);
+ files[i]=tempfile(suffix, name, mode);
+ }
}
-static void
-ch_close_tempfiles(FILE **files, int count)
-{
- int i;
+static void ch_close_tempfiles(FILE **files, int count) {
+ int i;
- for (i = 0 ; i <= count ; i++) {
- fclose(files[i]);
- }
+ for (i = 0 ; i <= count ; i++) {
+ fclose(files[i]);
+ }
}
#if 0
-static void
-ch_remove_tempfiles(char *suffix, int count)
-{
- char name[256];
- int i;
-
- for (i = 0 ; i <= count ; i++) {
- sprintf(name,"graph_%d",i);
- tempfile_unlink(suffix, name);
- }
+static void ch_remove_tempfiles(char *suffix, int count) {
+ char name[256];
+ int i;
+
+ for (i = 0 ; i <= count ; i++) {
+ sprintf(name,"graph_%d",i);
+ tempfile_unlink(suffix, name);
+ }
}
#endif
-static void
-ch_copy_to_tiles(char *suffix, int count, struct tile_info *info, FILE *ref)
-{
- char name[256];
- int i;
- FILE *f;
- struct item_bin *item_bin;
-
- for (i = count ; i >= 0 ; i--) {
- sprintf(name,"graph_%d",i);
- f=tempfile(suffix, name, 0);
- while ((item_bin = read_item(f))) {
- tile_write_item_minmax(info, item_bin, ref, i, i);
- }
- fclose(f);
- }
+static void ch_copy_to_tiles(char *suffix, int count, struct tile_info *info, FILE *ref) {
+ char name[256];
+ int i;
+ FILE *f;
+ struct item_bin *item_bin;
+
+ for (i = count ; i >= 0 ; i--) {
+ sprintf(name,"graph_%d",i);
+ f=tempfile(suffix, name, 0);
+ while ((item_bin = read_item(f))) {
+ tile_write_item_minmax(info, item_bin, ref, i, i);
+ }
+ fclose(f);
+ }
}
-void
-ch_generate_tiles(char *map_suffix, char *suffix, FILE *tilesdir_out, struct zip_info *zip_info)
-{
- struct tile_info info;
- FILE *in,*ref,*ddsg_coords,*ddsg;
- FILE **graphfiles;
- info.write=0;
- info.maxlen=0;
- info.suffix=suffix;
- info.tiles_list=NULL;
- info.tilesdir_out=tilesdir_out;
- graphfiles=g_alloca(sizeof(FILE*)*(ch_levels+1));
-
- ch_create_tempfiles(suffix, graphfiles, ch_levels, 1);
- in=tempfile(map_suffix,"ways_split",0);
- ref=tempfile(map_suffix,"ways_split_ref",0);
- ddsg_coords=tempfile(suffix,"ddsg_coords",1);
- ddsg=tempfile(suffix,"ddsg",1);
- ch_generate_ddsg(in, ref, ddsg_coords, ddsg);
- fclose(in);
- fclose(ref);
- fclose(ddsg_coords);
- fclose(ddsg);
- ch_generate_sgr(suffix);
- ch_setup(suffix);
- ch_process(graphfiles, ch_levels, 0);
- ch_close_tempfiles(graphfiles, ch_levels);
-
- tile_hash=g_hash_table_new(g_str_hash, g_str_equal);
- ch_copy_to_tiles(suffix, ch_levels, &info, NULL);
- merge_tiles(&info);
-
- write_tilesdir(&info, zip_info, tilesdir_out);
+void ch_generate_tiles(char *map_suffix, char *suffix, FILE *tilesdir_out, struct zip_info *zip_info) {
+ struct tile_info info;
+ FILE *in,*ref,*ddsg_coords,*ddsg;
+ FILE **graphfiles;
+ info.write=0;
+ info.maxlen=0;
+ info.suffix=suffix;
+ info.tiles_list=NULL;
+ info.tilesdir_out=tilesdir_out;
+ graphfiles=g_alloca(sizeof(FILE*)*(ch_levels+1));
+
+ ch_create_tempfiles(suffix, graphfiles, ch_levels, 1);
+ in=tempfile(map_suffix,"ways_split",0);
+ ref=tempfile(map_suffix,"ways_split_ref",0);
+ ddsg_coords=tempfile(suffix,"ddsg_coords",1);
+ ddsg=tempfile(suffix,"ddsg",1);
+ ch_generate_ddsg(in, ref, ddsg_coords, ddsg);
+ fclose(in);
+ fclose(ref);
+ fclose(ddsg_coords);
+ fclose(ddsg);
+ ch_generate_sgr(suffix);
+ ch_setup(suffix);
+ ch_process(graphfiles, ch_levels, 0);
+ ch_close_tempfiles(graphfiles, ch_levels);
+
+ tile_hash=g_hash_table_new(g_str_hash, g_str_equal);
+ ch_copy_to_tiles(suffix, ch_levels, &info, NULL);
+ merge_tiles(&info);
+
+ write_tilesdir(&info, zip_info, tilesdir_out);
}
-void
-ch_assemble_map(char *map_suffix, char *suffix, struct zip_info *zip_info)
-{
- struct tile_info info;
- struct tile_head *th;
- FILE **graphfiles=g_alloca(sizeof(FILE*)*(ch_levels+1));
- FILE *ref;
- struct item_id id;
- int nodeid=0;
-
- info.write=1;
- info.maxlen=zip_get_maxnamelen(zip_info);
- info.suffix=suffix;
- info.tiles_list=NULL;
- info.tilesdir_out=NULL;
- ref=tempfile(suffix,"sgr_ref",1);
-
- create_tile_hash();
-
- th=tile_head_root;
- while (th) {
- th->zip_data=NULL;
- th->process=1;
- th=th->next;
- }
-
- ch_setup(suffix);
- ch_copy_to_tiles(suffix, ch_levels, &info, ref);
- fclose(ref);
- ref=tempfile(suffix,"sgr_ref",0);
- sgr_nodes_hash=g_hash_table_new_full(NULL, NULL, NULL, item_id_slice_free);
- while (fread(&id, sizeof(id), 1, ref)) {
- struct item_id *id2=g_slice_new(struct item_id);
- *id2=id;
-#if 0
- dbg(lvl_debug,"%d is "ITEM_ID_FMT"\n",nodeid,ITEM_ID_ARGS(*id2));
-#endif
- g_hash_table_insert(sgr_nodes_hash, GINT_TO_POINTER(nodeid), id2);
- nodeid++;
- }
- th=tile_head_root;
- while (th) {
- th->zip_data=malloc(th->total_size);
- th->total_size_used=0;
- th=th->next;
- }
- ch_create_tempfiles(suffix, graphfiles, ch_levels, 1);
- ch_process(graphfiles, ch_levels, 1);
- ch_close_tempfiles(graphfiles, ch_levels);
-
- g_hash_table_destroy(newnode_hash);
- g_hash_table_destroy(edge_hash);
- g_hash_table_destroy(sgr_nodes_hash);
-
- ch_copy_to_tiles(suffix, ch_levels, &info, NULL);
- write_tilesdir(&info, zip_info, NULL);
-
- th=tile_head_root;
- while (th) {
- if (th->name[0]) {
- if (th->total_size != th->total_size_used) {
- fprintf(stderr,"Size error '%s': %d vs %d\n", th->name, th->total_size, th->total_size_used);
- exit(1);
- }
- write_zipmember(zip_info, th->name, zip_get_maxnamelen(zip_info), th->zip_data, th->total_size);
- } else {
- fwrite(th->zip_data, th->total_size, 1, zip_get_index(zip_info));
- }
- g_free(th->zip_data);
- th=th->next;
+void ch_assemble_map(char *map_suffix, char *suffix, struct zip_info *zip_info) {
+ struct tile_info info;
+ struct tile_head *th;
+ FILE **graphfiles=g_alloca(sizeof(FILE*)*(ch_levels+1));
+ FILE *ref;
+ struct item_id id;
+ int nodeid=0;
+
+ info.write=1;
+ info.maxlen=zip_get_maxnamelen(zip_info);
+ info.suffix=suffix;
+ info.tiles_list=NULL;
+ info.tilesdir_out=NULL;
+ ref=tempfile(suffix,"sgr_ref",1);
+
+ create_tile_hash();
+
+ th=tile_head_root;
+ while (th) {
+ th->zip_data=NULL;
+ th->process=1;
+ th=th->next;
+ }
+
+ ch_setup(suffix);
+ ch_copy_to_tiles(suffix, ch_levels, &info, ref);
+ fclose(ref);
+ ref=tempfile(suffix,"sgr_ref",0);
+ sgr_nodes_hash=g_hash_table_new_full(NULL, NULL, NULL, item_id_slice_free);
+ while (fread(&id, sizeof(id), 1, ref)) {
+ struct item_id *id2=g_slice_new(struct item_id);
+ *id2=id;
+ g_hash_table_insert(sgr_nodes_hash, GINT_TO_POINTER(nodeid), id2);
+ nodeid++;
+ }
+ th=tile_head_root;
+ while (th) {
+ th->zip_data=g_malloc(th->total_size);
+ th->total_size_used=0;
+ th=th->next;
+ }
+ ch_create_tempfiles(suffix, graphfiles, ch_levels, 1);
+ ch_process(graphfiles, ch_levels, 1);
+ ch_close_tempfiles(graphfiles, ch_levels);
+
+ g_hash_table_destroy(newnode_hash);
+ g_hash_table_destroy(edge_hash);
+ g_hash_table_destroy(sgr_nodes_hash);
+
+ ch_copy_to_tiles(suffix, ch_levels, &info, NULL);
+ write_tilesdir(&info, zip_info, NULL);
+
+ th=tile_head_root;
+ while (th) {
+ if (th->name[0]) {
+ if (th->total_size != th->total_size_used) {
+ fprintf(stderr,"Size error '%s': %d vs %d\n", th->name, th->total_size, th->total_size_used);
+ exit(1);
+ }
+ write_zipmember(zip_info, th->name, zip_get_maxnamelen(zip_info), th->zip_data, th->total_size);
+ } else {
+ fwrite(th->zip_data, th->total_size, 1, zip_get_index(zip_info));
}
+ g_free(th->zip_data);
+ th=th->next;
+ }
}