diff --git a/contrib/mapcache_detail/mapcache_detail.c b/contrib/mapcache_detail/mapcache_detail.c index 9a33baad..371fe130 100644 --- a/contrib/mapcache_detail/mapcache_detail.c +++ b/contrib/mapcache_detail/mapcache_detail.c @@ -1269,6 +1269,7 @@ int main(int argc, char * argv[]) mapcache_extent_i db_region_bbox; int dbx_has_inv = FALSE; int dby_has_inv = FALSE; + int file_zoom_level; // Select cache according to zoom level for ( cid=0 ; cid < caches->nelts ; cid++ ) { @@ -1292,10 +1293,22 @@ int main(int argc, char * argv[]) // Compute region bounding box expressed in tiles and in DB files for the // current zoom level - mapcache_grid_get_xy(&ctx, grid, region_bbox.minx, region_bbox.miny, iz, - &(til_region_bbox.minx), &(til_region_bbox.miny)); - mapcache_grid_get_xy(&ctx, grid, region_bbox.maxx, region_bbox.maxy, iz, - &(til_region_bbox.maxx), &(til_region_bbox.maxy)); + file_zoom_level = iz; + if (cache->top > 0) file_zoom_level = cache->top; + mapcache_grid_get_xy(&ctx, grid, region_bbox.minx, region_bbox.miny, + file_zoom_level, &(til_region_bbox.minx), &(til_region_bbox.miny)); + mapcache_grid_get_xy(&ctx, grid, region_bbox.maxx, region_bbox.maxy, + file_zoom_level, &(til_region_bbox.maxx), &(til_region_bbox.maxy)); + if (til_region_bbox.minx > til_region_bbox.maxx) { + int swap = til_region_bbox.maxx; + til_region_bbox.maxx = til_region_bbox.minx; + til_region_bbox.minx = swap; + } + if (til_region_bbox.miny > til_region_bbox.maxy) { + int swap = til_region_bbox.maxy; + til_region_bbox.maxy = til_region_bbox.miny; + til_region_bbox.miny = swap; + } dbx_has_inv = strstr(cache->dbfile,"{inv_x}") || strstr(cache->dbfile,"{inv_div_x}") @@ -1304,10 +1317,6 @@ int main(int argc, char * argv[]) || strstr(cache->dbfile,"{inv_div_y}") || strstr(cache->dbfile,"{inv_top_y}"); if (cache->top > 0) { - mapcache_grid_get_xy(&ctx, grid, region_bbox.minx, region_bbox.miny, - cache->top, &(til_region_bbox.minx), &(til_region_bbox.miny)); - mapcache_grid_get_xy(&ctx, grid, region_bbox.maxx, region_bbox.maxy, - cache->top, &(til_region_bbox.maxx), &(til_region_bbox.maxy)); if (dbx_has_inv) { db_region_bbox.minx = grid->levels[cache->top]->maxx-1 - til_region_bbox.maxx; db_region_bbox.maxx = grid->levels[cache->top]->maxx-1 - til_region_bbox.minx; @@ -1360,7 +1369,6 @@ int main(int argc, char * argv[]) apr_finfo_t fileinfo; mapcache_extent_i til_file_bbox; mapcache_extent file_bbox; - int file_zoom_level; mapcache_extent temp_bbox; mapcache_extent region_in_file_bbox; #ifdef USE_CLIPPERS @@ -1434,23 +1442,21 @@ int main(int argc, char * argv[]) // Compute file bounding box expressed in tiles if (cache->top > 0) { - file_zoom_level = cache->top; if (dbx_has_inv) { - til_file_bbox.minx = grid->levels[file_zoom_level]->maxx-1 - ix; + til_file_bbox.minx = grid->levels[cache->top]->maxx-1 - ix; til_file_bbox.maxx = til_file_bbox.minx; } else { til_file_bbox.minx = ix; til_file_bbox.maxx = til_file_bbox.minx; } if (dby_has_inv) { - til_file_bbox.miny = grid->levels[file_zoom_level]->maxy-1 - iy; + til_file_bbox.miny = grid->levels[cache->top]->maxy-1 - iy; til_file_bbox.maxy = til_file_bbox.miny; } else { til_file_bbox.miny = iy; til_file_bbox.maxy = til_file_bbox.miny; } } else if ((cache->xcount > 0) && (cache->ycount > 0)) { - file_zoom_level = iz; if (dbx_has_inv) { til_file_bbox.maxx = grid->levels[iz]->maxx-1 - ix * cache->xcount; til_file_bbox.minx = til_file_bbox.maxx + cache->xcount + 1; @@ -1474,7 +1480,6 @@ int main(int argc, char * argv[]) til_file_bbox.maxy = grid->levels[iz]->maxy - 1; } } else { - file_zoom_level = iz; til_file_bbox.minx = 0; til_file_bbox.miny = 0; til_file_bbox.maxx = grid->levels[iz]->maxx - 1; @@ -1493,6 +1498,16 @@ int main(int argc, char * argv[]) if (GC_HAS_ERROR(&ctx)) goto failure; file_bbox.maxx = temp_bbox.maxx; file_bbox.maxy = temp_bbox.maxy; + if (file_bbox.minx > file_bbox.maxx) { + int swap = file_bbox.maxx; + file_bbox.maxx = file_bbox.minx; + file_bbox.minx = swap; + } + if (file_bbox.miny > file_bbox.maxy) { + int swap = file_bbox.maxy; + file_bbox.maxy = file_bbox.miny; + file_bbox.miny = swap; + } // Compute part of region of interest within file bounding box #ifdef USE_CLIPPERS @@ -1559,6 +1574,16 @@ int main(int argc, char * argv[]) mapcache_grid_get_xy(&ctx, grid, region_in_file_bbox.maxx-res, region_in_file_bbox.maxy-res, iz, &(til_region_in_file_bbox.maxx), &(til_region_in_file_bbox.maxy)); + if (til_region_in_file_bbox.minx > til_region_in_file_bbox.maxx) { + int swap = til_region_in_file_bbox.maxx; + til_region_in_file_bbox.maxx = til_region_in_file_bbox.minx; + til_region_in_file_bbox.minx = swap; + } + if (til_region_in_file_bbox.miny > til_region_in_file_bbox.maxy) { + int swap = til_region_in_file_bbox.maxy; + til_region_in_file_bbox.maxy = til_region_in_file_bbox.miny; + til_region_in_file_bbox.miny = swap; + } if ((cache->xcount > 0) && (cache->ycount > 0)) { if (til_region_in_file_bbox.maxx>(til_file_bbox.minx+cache->xcount-1)) {