コード例 #1
0
ファイル: tile.c プロジェクト: greg42/navit
void
index_submap_add(struct tile_info *info, struct tile_head *th)
{
	int tlen=tile_len(th->name);
	int len=tlen;
	char *index_tile;
	struct rect r;
	struct item_bin *item_bin;

	index_tile=g_alloca(len+1+strlen(info->suffix));
	strcpy(index_tile, th->name);
	if (len > 6)
		len=6;
	else
		len=0;
	index_tile[len]=0;
	strcat(index_tile, info->suffix);
	tile_bbox(th->name, &r, overlap);

	item_bin=init_item(type_submap);
	item_bin_add_coord_rect(item_bin, &r);
	item_bin_add_attr_range(item_bin, attr_order, (tlen > 4)?tlen-4 : 0, 255);
	item_bin_add_attr_int(item_bin, attr_zipfile_ref, th->zipnum);
	tile_write_item_to_tile(info, item_bin, NULL, index_tile);
}
コード例 #2
0
ファイル: tile.c プロジェクト: noradtux/navit-webos
void
merge_tiles(struct tile_info *info)
{
    struct tile_head *th;
    char basetile[1024];
    char subtile[1024];
    GList *tiles_list_sorted,*last;
    int i,i_min,len,size_all,size[5],size_min,work_done;
    long long zip_size;

    do {
        tiles_list_sorted=get_tiles_list();
        fprintf(stderr,"PROGRESS: sorting %d tiles\n", g_list_length(tiles_list_sorted));
        tiles_list_sorted=g_list_sort(tiles_list_sorted, (GCompareFunc)strcmp);
        fprintf(stderr,"PROGRESS: sorting %d tiles done\n", g_list_length(tiles_list_sorted));
        last=g_list_last(tiles_list_sorted);
        zip_size=0;
        while (last) {
            th=g_hash_table_lookup(tile_hash, last->data);
            zip_size+=th->total_size;
            last=g_list_previous(last);
        }
        last=g_list_last(tiles_list_sorted);
        work_done=0;
        while (last) {
            processed_tiles++;
            len=tile_len(last->data);
            if (len >= 1) {
                strcpy(basetile,last->data);
                basetile[len-1]='\0';
                strcat(basetile, info->suffix);
                strcpy(subtile,last->data);
                for (i = 0 ; i < 4 ; i++) {
                    subtile[len-1]='a'+i;
                    size[i]=tile_data_size(subtile);
                }
                size[4]=tile_data_size(basetile);
                size_all=size[0]+size[1]+size[2]+size[3]+size[4];
                if (size_all < 65536 && size_all > 0 && size_all != size[4]) {
                    for (i = 0 ; i < 4 ; i++) {
                        subtile[len-1]='a'+i;
                        work_done+=merge_tile(basetile, subtile);
                    }
                } else {
                    for (;;) {
                        size_min=size_all;
                        i_min=-1;
                        for (i = 0 ; i < 4 ; i++) {
                            if (size[i] && size[i] < size_min) {
                                size_min=size[i];
                                i_min=i;
                            }
                        }
                        if (i_min == -1)
                            break;
                        if (size[4]+size_min >= 65536)
                            break;
                        subtile[len-1]='a'+i_min;
                        work_done+=merge_tile(basetile, subtile);
                        size[4]+=size[i_min];
                        size[i_min]=0;
                    }
                }
            }
            last=g_list_previous(last);
        }
        g_list_free(tiles_list_sorted);
        fprintf(stderr,"PROGRESS: merged %d tiles\n", work_done);
    } while (work_done);
}