Esempio n. 1
0
static void
map_rect_destroy_binfile(struct map_rect_priv *mr)
{
	while (pop_tile(mr));
	file_data_free(mr->m->fi, (unsigned char *)(mr->tiles[0].start));
	g_free(mr->url);
        g_free(mr);
}
Esempio n. 2
0
static struct item *
map_rect_get_item_binfile(struct map_rect_priv *mr)
{
	struct tile *t;
	struct minmax *mima;
	for (;;) {
		t=mr->t;
		if (! t)
			return NULL;
		t->pos=t->pos_next;
		if (t->pos >= t->end) {
			if (pop_tile(mr))
				continue;
			return NULL;
		}
		mr->item.id_hi=t->zipfile_num;
		mr->item.id_lo=t->pos-t->start;
		mr->label=0;
		memset(mr->label_attr, 0, sizeof(mr->label_attr));
		setup_pos(mr);
		if ((mr->item.type == type_submap) && (!mr->country_id)) {
			struct coord_rect r;
			r.lu.x=le32_to_cpu(t->pos_coord[0]);
			r.lu.y=le32_to_cpu(t->pos_coord[3]);
			r.rl.x=le32_to_cpu(t->pos_coord[2]);
			r.rl.y=le32_to_cpu(t->pos_coord[1]);
			mima=(struct minmax *)(t->pos_attr+2);
			minmax_to_cpu(mima);
			if (!mr->m->eoc || !selection_contains(mr->sel, &r, mima)) {
				continue;
			}
			dbg(1,"pushing zipfile %d from %d\n", le32_to_cpu(t->pos_attr[5]), t->zipfile_num);
			push_zipfile_tile(mr, le32_to_cpu(t->pos_attr[5]));
			continue;
				
		}
		if (mr->country_id)
		{
			if (mr->item.type == type_countryindex) {
				map_parse_country_binfile(mr);
			}
			if (item_is_town(mr->item))
			{
				return &mr->item;
			} else {
				continue;
			}
		}
		return &mr->item;
	}
}
Esempio n. 3
0
//int counter=0;
void make_tiles() {
	//int baseZoom = clamp(round(center.zoom), 0, 18);
	int baseZoom = clamp((int)floor(center.zoom+0.5), 0, 18);

	double tl[2]= {0,0};
	double tr[2]= {(double)veiwport[0],0};
	double bl[2]= {0,(double)veiwport[1]};
	double br[2]= {(double)veiwport[0],(double)veiwport[1]};

	int minCol;
	int maxCol;
	int minRow;
	int maxRow;
	int row_count;
	int col;

	crd_t ctl;
	crd_t ctr;
	crd_t cbl;
	crd_t cbr;
	crd_set2(&ctl,&center,tl,br);
	crd_zoomto(&ctl,baseZoom);
	crd_set2(&ctr,&center,tr,br);
	crd_zoomto(&ctr,baseZoom);
	crd_set2(&cbl,&center,bl,br);
	crd_zoomto(&cbl,baseZoom);
	crd_set2(&cbr,&center,br,br);
	crd_zoomto(&cbr,baseZoom);

	minCol = (int)floor(_mind(_mind(ctl.column,ctr.column),_mind(cbl.column,cbr.column)));
	maxCol = (int)floor(_maxd(_maxd(ctl.column,ctr.column),_maxd(cbl.column,cbr.column)));
	minRow = (int)floor(_mind(_mind(ctl.row,ctr.row),_mind(cbl.row,cbr.row)));
	maxRow = (int)floor(_maxd(_maxd(ctl.row,ctr.row),_maxd(cbl.row,cbr.row)));

	minCol -= 1;//FIXME: calc veiwport area
	maxCol += 1;

	row_count = (int)floor(pow(2.0, baseZoom))-1;
	minCol = _maxi(0,minCol);
	minRow = _maxi(0,minRow);
	maxCol = _mini(maxCol,row_count);
	maxRow = _mini(maxRow,row_count);

	tiles_draw_count = 0;
	col = minCol;
	for (; col <= maxCol; ++col) {
		int row = minRow;
		for (; row <= maxRow; ++row) {
			Tile tile = {baseZoom,col,row};
			//print_tile(&tile);
			Tile* ret = find_tile(tiles,&tile);
			if (ret==0) {
				Tile* newtile = (Tile*)malloc(sizeof(Tile));
				newtile->z = tile.z;
				newtile->x = tile.x;
				newtile->y = tile.y;
				getImageTile(newtile);
				push_list(tiles,newtile);
				//fprintf(stderr,"push tiles count: %ld\n",tiles->count);
				ret = newtile;

				if (tiles->count > 256){
					pop_tile(tiles);// TODO: remove tile in tiles_get
					//fprintf(stderr,"pop tiles count: %ld\n",tiles->count);
				}
				//++counter;
			}
			tiles_draw[tiles_draw_count++] = ret;
		}
	}

	//fprintf(stderr,"tiles count: %d tiles_draw_count: %d\n",counter,tiles_draw_count);
}