summaryrefslogtreecommitdiff
path: root/navit/maptool/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'navit/maptool/misc.c')
-rw-r--r--navit/maptool/misc.c682
1 files changed, 333 insertions, 349 deletions
diff --git a/navit/maptool/misc.c b/navit/maptool/misc.c
index 0f0b375a8..226190658 100644
--- a/navit/maptool/misc.c
+++ b/navit/maptool/misc.c
@@ -48,406 +48,390 @@
#define phase1_coord_max 16384
struct rect world_bbox = {
- { WORLD_BOUNDINGBOX_MIN_X, WORLD_BOUNDINGBOX_MIN_Y},
- { WORLD_BOUNDINGBOX_MAX_X, WORLD_BOUNDINGBOX_MAX_Y},
+ { WORLD_BOUNDINGBOX_MIN_X, WORLD_BOUNDINGBOX_MIN_Y},
+ { WORLD_BOUNDINGBOX_MAX_X, WORLD_BOUNDINGBOX_MAX_Y},
};
void
-bbox_extend(struct coord *c, struct rect *r)
-{
- if (c->x < r->l.x)
- r->l.x=c->x;
- if (c->y < r->l.y)
- r->l.y=c->y;
- if (c->x > r->h.x)
- r->h.x=c->x;
- if (c->y > r->h.y)
- r->h.y=c->y;
+bbox_extend(struct coord *c, struct rect *r) {
+ if (c->x < r->l.x)
+ r->l.x=c->x;
+ if (c->y < r->l.y)
+ r->l.y=c->y;
+ if (c->x > r->h.x)
+ r->h.x=c->x;
+ if (c->y > r->h.y)
+ r->h.y=c->y;
}
void
-bbox(struct coord *c, int count, struct rect *r)
-{
- if (! count)
- return;
- r->l=*c;
- r->h=*c;
- while (--count) {
- c++;
- bbox_extend(c, r);
- }
+bbox(struct coord *c, int count, struct rect *r) {
+ if (! count)
+ return;
+ r->l=*c;
+ r->h=*c;
+ while (--count) {
+ c++;
+ bbox_extend(c, r);
+ }
}
int
-contains_bbox(int xl, int yl, int xh, int yh, struct rect *r)
-{
- if (r->h.x < xl || r->h.x > xh) {
- return 0;
- }
- if (r->l.x > xh || r->l.x < xl) {
- return 0;
- }
- if (r->h.y < yl || r->h.y > yh) {
- return 0;
- }
- if (r->l.y > yh || r->l.y < yl) {
- return 0;
- }
- return 1;
+contains_bbox(int xl, int yl, int xh, int yh, struct rect *r) {
+ if (r->h.x < xl || r->h.x > xh) {
+ return 0;
+ }
+ if (r->l.x > xh || r->l.x < xl) {
+ return 0;
+ }
+ if (r->h.y < yl || r->h.y > yh) {
+ return 0;
+ }
+ if (r->l.y > yh || r->l.y < yl) {
+ return 0;
+ }
+ return 1;
}
int
-bbox_contains_coord(struct rect *r, struct coord *c)
-{
- if (r->h.x < c->x)
- return 0;
- if (r->l.x > c->x)
- return 0;
- if (r->h.y < c->y)
- return 0;
- if (r->l.y > c->y)
- return 0;
- return 1;
+bbox_contains_coord(struct rect *r, struct coord *c) {
+ if (r->h.x < c->x)
+ return 0;
+ if (r->l.x > c->x)
+ return 0;
+ if (r->h.y < c->y)
+ return 0;
+ if (r->l.y > c->y)
+ return 0;
+ return 1;
}
int
-bbox_contains_bbox(struct rect *out, struct rect *in)
-{
- if (out->h.x < in->h.x)
- return 0;
- if (out->l.x > in->l.x)
- return 0;
- if (out->h.y < in->h.y)
- return 0;
- if (out->l.y > in->l.y)
- return 0;
- return 1;
+bbox_contains_bbox(struct rect *out, struct rect *in) {
+ if (out->h.x < in->h.x)
+ return 0;
+ if (out->l.x > in->l.x)
+ return 0;
+ if (out->h.y < in->h.y)
+ return 0;
+ if (out->l.y > in->l.y)
+ return 0;
+ return 1;
}
long long
-bbox_area(struct rect const *r)
-{
- return ((long long)r->h.x-r->l.x)*(r->h.y-r->l.y);
+bbox_area(struct rect const *r) {
+ return ((long long)r->h.x-r->l.x)*(r->h.y-r->l.y);
}
void
-phase1_map(GList *maps, FILE *out_ways, FILE *out_nodes)
-{
- struct map_rect *mr;
- struct item *item;
- int count;
- struct coord ca[phase1_coord_max];
- struct attr attr;
- struct item_bin *item_bin;
-
- while (maps) {
- mr=map_rect_new(maps->data, NULL);
- while ((item = map_rect_get_item(mr))) {
- count=item_coord_get(item, ca, item->type < type_line ? 1: phase1_coord_max);
- item_bin=init_item(item->type);
- item_bin_add_coord(item_bin, ca, count);
- while (item_attr_get(item, attr_any, &attr)) {
- if (attr.type >= attr_type_string_begin && attr.type <= attr_type_string_end) {
- attr.u.str=map_convert_string(maps->data, attr.u.str);
- if (attr.u.str) {
- item_bin_add_attr(item_bin, &attr);
- map_convert_free(attr.u.str);
- }
- } else
- item_bin_add_attr(item_bin, &attr);
- }
- if (item->type >= type_line)
- item_bin_write(item_bin, out_ways);
- else
- item_bin_write(item_bin, out_nodes);
- }
- map_rect_destroy(mr);
- maps=g_list_next(maps);
- }
+phase1_map(GList *maps, FILE *out_ways, FILE *out_nodes) {
+ struct map_rect *mr;
+ struct item *item;
+ int count;
+ struct coord ca[phase1_coord_max];
+ struct attr attr;
+ struct item_bin *item_bin;
+
+ while (maps) {
+ mr=map_rect_new(maps->data, NULL);
+ while ((item = map_rect_get_item(mr))) {
+ count=item_coord_get(item, ca, item->type < type_line ? 1: phase1_coord_max);
+ item_bin=init_item(item->type);
+ item_bin_add_coord(item_bin, ca, count);
+ while (item_attr_get(item, attr_any, &attr)) {
+ if (attr.type >= attr_type_string_begin && attr.type <= attr_type_string_end) {
+ attr.u.str=map_convert_string(maps->data, attr.u.str);
+ if (attr.u.str) {
+ item_bin_add_attr(item_bin, &attr);
+ map_convert_free(attr.u.str);
+ }
+ } else
+ item_bin_add_attr(item_bin, &attr);
+ }
+ if (item->type >= type_line)
+ item_bin_write(item_bin, out_ways);
+ else
+ item_bin_write(item_bin, out_nodes);
+ }
+ map_rect_destroy(mr);
+ maps=g_list_next(maps);
+ }
}
int
-item_order_by_type(enum item_type type)
-{
- int max=14;
- switch (type) {
- case type_town_label_1e7:
- case type_town_label_5e6:
- max=3;
- break;
- case type_town_label_2e6:
- case type_town_label_1e6:
- max=5;
- break;
- case type_town_label_5e5:
- case type_district_label_1e7:
- case type_district_label_5e6:
- case type_district_label_2e6:
- case type_district_label_1e6:
- case type_district_label_5e5:
- max=6;
- break;
- case type_town_label_2e5:
- case type_town_label_1e5:
- case type_district_label_2e5:
- case type_district_label_1e5:
- case type_street_n_lanes:
- case type_highway_city:
- case type_highway_land:
- case type_ramp:
- max=8;
- break;
- case type_town_label_5e4:
- case type_town_label_2e4:
- case type_town_label_1e4:
- case type_district_label_5e4:
- case type_district_label_2e4:
- case type_district_label_1e4:
- max=9;
- break;
- case type_poly_water_tiled:
- if(experimental)
- max=9;
- break;
- case type_street_4_land:
- case type_street_4_city:
- max=10;
- break;
- case type_town_label_5e3:
- case type_town_label_2e3:
- case type_town_label_1e3:
- case type_district_label_5e3:
- case type_district_label_2e3:
- case type_district_label_1e3:
- case type_street_3_city:
- case type_street_3_land:
- max=12;
- break;
- default:
- break;
- }
- return max;
+item_order_by_type(enum item_type type) {
+ int max=14;
+ switch (type) {
+ case type_town_label_1e7:
+ case type_town_label_5e6:
+ max=3;
+ break;
+ case type_town_label_2e6:
+ case type_town_label_1e6:
+ max=5;
+ break;
+ case type_town_label_5e5:
+ case type_district_label_1e7:
+ case type_district_label_5e6:
+ case type_district_label_2e6:
+ case type_district_label_1e6:
+ case type_district_label_5e5:
+ max=6;
+ break;
+ case type_town_label_2e5:
+ case type_town_label_1e5:
+ case type_district_label_2e5:
+ case type_district_label_1e5:
+ case type_street_n_lanes:
+ case type_highway_city:
+ case type_highway_land:
+ case type_ramp:
+ max=8;
+ break;
+ case type_town_label_5e4:
+ case type_town_label_2e4:
+ case type_town_label_1e4:
+ case type_district_label_5e4:
+ case type_district_label_2e4:
+ case type_district_label_1e4:
+ max=9;
+ break;
+ case type_poly_water_tiled:
+ if(experimental)
+ max=9;
+ break;
+ case type_street_4_land:
+ case type_street_4_city:
+ max=10;
+ break;
+ case type_town_label_5e3:
+ case type_town_label_2e3:
+ case type_town_label_1e3:
+ case type_district_label_5e3:
+ case type_district_label_2e3:
+ case type_district_label_1e3:
+ case type_street_3_city:
+ case type_street_3_land:
+ max=12;
+ break;
+ default:
+ break;
+ }
+ return max;
}
static void
-phase34_process_file(struct tile_info *info, FILE *in, FILE *reference)
-{
- struct item_bin *ib;
- struct attr_bin *a;
- int max;
-
- while ((ib=read_item(in))) {
- if (ib->type < 0x80000000)
- processed_nodes++;
- else
- processed_ways++;
- max=item_order_by_type(ib->type);
- a=item_bin_get_attr_bin(ib, attr_order, NULL);
- if(a) {
- int max2=((struct range *)(a+1))->max;
- if(max>max2)
- max=max2;
- }
- tile_write_item_minmax(info, ib, reference, 0, max);
- }
+phase34_process_file(struct tile_info *info, FILE *in, FILE *reference) {
+ struct item_bin *ib;
+ struct attr_bin *a;
+ int max;
+
+ while ((ib=read_item(in))) {
+ if (ib->type < 0x80000000)
+ processed_nodes++;
+ else
+ processed_ways++;
+ max=item_order_by_type(ib->type);
+ a=item_bin_get_attr_bin(ib, attr_order, NULL);
+ if(a) {
+ int max2=((struct range *)(a+1))->max;
+ if(max>max2)
+ max=max2;
+ }
+ tile_write_item_minmax(info, ib, reference, 0, max);
+ }
}
static void
-phase34_process_file_range(struct tile_info *info, FILE *in, FILE *reference)
-{
- struct item_bin *ib;
- int min,max;
-
- while ((ib=read_item_range(in, &min, &max))) {
- if (ib->type < 0x80000000)
- processed_nodes++;
- else
- processed_ways++;
- tile_write_item_minmax(info, ib, reference, min, max);
- }
+phase34_process_file_range(struct tile_info *info, FILE *in, FILE *reference) {
+ struct item_bin *ib;
+ int min,max;
+
+ while ((ib=read_item_range(in, &min, &max))) {
+ if (ib->type < 0x80000000)
+ processed_nodes++;
+ else
+ processed_ways++;
+ tile_write_item_minmax(info, ib, reference, min, max);
+ }
}
static int
-phase34(struct tile_info *info, struct zip_info *zip_info, FILE **in, FILE **reference, int in_count, int with_range)
-{
- int i;
-
- processed_nodes=processed_nodes_out=processed_ways=processed_relations=processed_tiles=0;
- bytes_read=0;
- sig_alrm(0);
- if (! info->write)
- tile_hash=g_hash_table_new(g_str_hash, g_str_equal);
- for (i = 0 ; i < in_count ; i++) {
- if (in[i]) {
- if (with_range)
- phase34_process_file_range(info, in[i], reference ? reference[i]:NULL);
- else
- phase34_process_file(info, in[i], reference ? reference[i]:NULL);
- }
- }
- if (! info->write)
- merge_tiles(info);
- sig_alrm(0);
- sig_alrm_end();
- write_tilesdir(info, zip_info, info->tilesdir_out);
-
- return 0;
+phase34(struct tile_info *info, struct zip_info *zip_info, FILE **in, FILE **reference, int in_count, int with_range) {
+ int i;
+
+ processed_nodes=processed_nodes_out=processed_ways=processed_relations=processed_tiles=0;
+ bytes_read=0;
+ sig_alrm(0);
+ if (! info->write)
+ tile_hash=g_hash_table_new(g_str_hash, g_str_equal);
+ for (i = 0 ; i < in_count ; i++) {
+ if (in[i]) {
+ if (with_range)
+ phase34_process_file_range(info, in[i], reference ? reference[i]:NULL);
+ else
+ phase34_process_file(info, in[i], reference ? reference[i]:NULL);
+ }
+ }
+ if (! info->write)
+ merge_tiles(info);
+ sig_alrm(0);
+ sig_alrm_end();
+ write_tilesdir(info, zip_info, info->tilesdir_out);
+
+ return 0;
}
void
-dump(FILE *in)
-{
- struct item_bin *ib;
- while ((ib=read_item(in))) {
- dump_itembin(ib);
- }
+dump(FILE *in) {
+ struct item_bin *ib;
+ while ((ib=read_item(in))) {
+ dump_itembin(ib);
+ }
}
int
-phase4(FILE **in, int in_count, int with_range, char *suffix, FILE *tilesdir_out, struct zip_info *zip_info)
-{
- struct tile_info info;
- info.write=0;
- info.maxlen=0;
- info.suffix=suffix;
- info.tiles_list=NULL;
- info.tilesdir_out=tilesdir_out;
- return phase34(&info, zip_info, in, NULL, in_count, with_range);
+phase4(FILE **in, int in_count, int with_range, char *suffix, FILE *tilesdir_out, struct zip_info *zip_info) {
+ struct tile_info info;
+ info.write=0;
+ info.maxlen=0;
+ info.suffix=suffix;
+ info.tiles_list=NULL;
+ info.tilesdir_out=tilesdir_out;
+ return phase34(&info, zip_info, in, NULL, in_count, with_range);
}
static int
-process_slice(FILE **in, FILE **reference, int in_count, int with_range, long long size, char *suffix, struct zip_info *zip_info)
-{
- struct tile_head *th;
- char *slice_data,*zip_data;
- int zipfiles=0;
- struct tile_info info;
- int i;
-
- slice_data=g_malloc(size);
- zip_data=slice_data;
- th=tile_head_root;
- while (th) {
- if (th->process) {
- th->zip_data=zip_data;
- zip_data+=th->total_size;
- }
- th=th->next;
- }
- for (i = 0 ; i < in_count ; i++) {
- if (in[i])
- fseek(in[i], 0, SEEK_SET);
- if (reference && reference[i]) {
- fseek(reference[i], 0, SEEK_SET);
- }
- }
- info.write=1;
- info.maxlen=zip_get_maxnamelen(zip_info);
- info.suffix=suffix;
- info.tiles_list=NULL;
- info.tilesdir_out=NULL;
- phase34(&info, zip_info, in, reference, in_count, with_range);
-
- for (th=tile_head_root;th;th=th->next) {
- if (!th->process)
- continue;
- 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);
- zipfiles++;
- } else {
- dbg_assert(fwrite(th->zip_data, th->total_size, 1, zip_get_index(zip_info))==1);
- }
- }
- g_free(slice_data);
-
- return zipfiles;
+process_slice(FILE **in, FILE **reference, int in_count, int with_range, long long size, char *suffix,
+ struct zip_info *zip_info) {
+ struct tile_head *th;
+ char *slice_data,*zip_data;
+ int zipfiles=0;
+ struct tile_info info;
+ int i;
+
+ slice_data=g_malloc(size);
+ zip_data=slice_data;
+ th=tile_head_root;
+ while (th) {
+ if (th->process) {
+ th->zip_data=zip_data;
+ zip_data+=th->total_size;
+ }
+ th=th->next;
+ }
+ for (i = 0 ; i < in_count ; i++) {
+ if (in[i])
+ fseek(in[i], 0, SEEK_SET);
+ if (reference && reference[i]) {
+ fseek(reference[i], 0, SEEK_SET);
+ }
+ }
+ info.write=1;
+ info.maxlen=zip_get_maxnamelen(zip_info);
+ info.suffix=suffix;
+ info.tiles_list=NULL;
+ info.tilesdir_out=NULL;
+ phase34(&info, zip_info, in, reference, in_count, with_range);
+
+ for (th=tile_head_root; th; th=th->next) {
+ if (!th->process)
+ continue;
+ 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);
+ zipfiles++;
+ } else {
+ dbg_assert(fwrite(th->zip_data, th->total_size, 1, zip_get_index(zip_info))==1);
+ }
+ }
+ g_free(slice_data);
+
+ return zipfiles;
}
int
-phase5(FILE **in, FILE **references, int in_count, int with_range, char *suffix, struct zip_info *zip_info)
-{
- long long size;
- int slices;
- int zipnum,written_tiles;
- struct tile_head *th,*th2;
- create_tile_hash();
-
- th=tile_head_root;
- size=0;
- slices=0;
- fprintf(stderr, "Maximum slice size "LONGLONG_FMT"\n", slice_size);
- while (th) {
- if (size + th->total_size > slice_size) {
- fprintf(stderr,"Slice %d is of size "LONGLONG_FMT"\n", slices, size);
- size=0;
- slices++;
- }
- size+=th->total_size;
- th=th->next;
- }
- if (size)
- fprintf(stderr,"Slice %d is of size "LONGLONG_FMT"\n", slices, size);
- th=tile_head_root;
- size=0;
- slices=0;
- while (th) {
- th2=tile_head_root;
- while (th2) {
- th2->process=0;
- th2=th2->next;
- }
- size=0;
- while (th && size+th->total_size < slice_size) {
- size+=th->total_size;
- th->process=1;
- th=th->next;
- }
- /* process_slice() modifies zip_info, but need to retain old info */
- zipnum=zip_get_zipnum(zip_info);
- written_tiles=process_slice(in, references, in_count, with_range, size, suffix, zip_info);
- zip_set_zipnum(zip_info, zipnum+written_tiles);
- slices++;
- }
- return 0;
+phase5(FILE **in, FILE **references, int in_count, int with_range, char *suffix, struct zip_info *zip_info) {
+ long long size;
+ int slices;
+ int zipnum,written_tiles;
+ struct tile_head *th,*th2;
+ create_tile_hash();
+
+ th=tile_head_root;
+ size=0;
+ slices=0;
+ fprintf(stderr, "Maximum slice size "LONGLONG_FMT"\n", slice_size);
+ while (th) {
+ if (size + th->total_size > slice_size) {
+ fprintf(stderr,"Slice %d is of size "LONGLONG_FMT"\n", slices, size);
+ size=0;
+ slices++;
+ }
+ size+=th->total_size;
+ th=th->next;
+ }
+ if (size)
+ fprintf(stderr,"Slice %d is of size "LONGLONG_FMT"\n", slices, size);
+ th=tile_head_root;
+ size=0;
+ slices=0;
+ while (th) {
+ th2=tile_head_root;
+ while (th2) {
+ th2->process=0;
+ th2=th2->next;
+ }
+ size=0;
+ while (th && size+th->total_size < slice_size) {
+ size+=th->total_size;
+ th->process=1;
+ th=th->next;
+ }
+ /* process_slice() modifies zip_info, but need to retain old info */
+ zipnum=zip_get_zipnum(zip_info);
+ written_tiles=process_slice(in, references, in_count, with_range, size, suffix, zip_info);
+ zip_set_zipnum(zip_info, zipnum+written_tiles);
+ slices++;
+ }
+ return 0;
}
void
-process_binfile(FILE *in, FILE *out)
-{
- struct item_bin *ib;
- while ((ib=read_item(in))) {
- item_bin_write(ib, out);
- }
+process_binfile(FILE *in, FILE *out) {
+ struct item_bin *ib;
+ while ((ib=read_item(in))) {
+ item_bin_write(ib, out);
+ }
}
void
-add_aux_tiles(char *name, struct zip_info *info)
-{
- char buffer[4096];
- char *s;
- FILE *in;
- FILE *tmp;
- in=fopen(name,"rb");
- if (!in)
- return;
- while (fscanf(in,"%s",buffer) == 1) {
- s=strchr(buffer,'/');
- if (s)
- s++;
- else
- s=buffer;
- tmp=fopen(buffer,"rb");
- if (tmp) {
- fseek(tmp, 0, SEEK_END);
- add_aux_tile(info, s, buffer, ftell(tmp));
- fclose(tmp);
- }
- }
- fclose(in);
+add_aux_tiles(char *name, struct zip_info *info) {
+ char buffer[4096];
+ char *s;
+ FILE *in;
+ FILE *tmp;
+ in=fopen(name,"rb");
+ if (!in)
+ return;
+ while (fscanf(in,"%s",buffer) == 1) {
+ s=strchr(buffer,'/');
+ if (s)
+ s++;
+ else
+ s=buffer;
+ tmp=fopen(buffer,"rb");
+ if (tmp) {
+ fseek(tmp, 0, SEEK_END);
+ add_aux_tile(info, s, buffer, ftell(tmp));
+ fclose(tmp);
+ }
+ }
+ fclose(in);
}