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); }
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; } }
//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,¢er,tl,br); crd_zoomto(&ctl,baseZoom); crd_set2(&ctr,¢er,tr,br); crd_zoomto(&ctr,baseZoom); crd_set2(&cbl,¢er,bl,br); crd_zoomto(&cbl,baseZoom); crd_set2(&cbr,¢er,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); }