@@ -1269,6 +1269,7 @@ int main(int argc, char * argv[])
12691269 mapcache_extent_i db_region_bbox ;
12701270 int dbx_has_inv = FALSE;
12711271 int dby_has_inv = FALSE;
1272+ int file_zoom_level ;
12721273
12731274 // Select cache according to zoom level
12741275 for ( cid = 0 ; cid < caches -> nelts ; cid ++ ) {
@@ -1292,10 +1293,22 @@ int main(int argc, char * argv[])
12921293
12931294 // Compute region bounding box expressed in tiles and in DB files for the
12941295 // current zoom level
1295- mapcache_grid_get_xy (& ctx , grid , region_bbox .minx , region_bbox .miny , iz ,
1296- & (til_region_bbox .minx ), & (til_region_bbox .miny ));
1297- mapcache_grid_get_xy (& ctx , grid , region_bbox .maxx , region_bbox .maxy , iz ,
1298- & (til_region_bbox .maxx ), & (til_region_bbox .maxy ));
1296+ file_zoom_level = iz ;
1297+ if (cache -> top > 0 ) file_zoom_level = cache -> top ;
1298+ mapcache_grid_get_xy (& ctx , grid , region_bbox .minx , region_bbox .miny ,
1299+ file_zoom_level , & (til_region_bbox .minx ), & (til_region_bbox .miny ));
1300+ mapcache_grid_get_xy (& ctx , grid , region_bbox .maxx , region_bbox .maxy ,
1301+ file_zoom_level , & (til_region_bbox .maxx ), & (til_region_bbox .maxy ));
1302+ if (til_region_bbox .minx > til_region_bbox .maxx ) {
1303+ int swap = til_region_bbox .maxx ;
1304+ til_region_bbox .maxx = til_region_bbox .minx ;
1305+ til_region_bbox .minx = swap ;
1306+ }
1307+ if (til_region_bbox .miny > til_region_bbox .maxy ) {
1308+ int swap = til_region_bbox .maxy ;
1309+ til_region_bbox .maxy = til_region_bbox .miny ;
1310+ til_region_bbox .miny = swap ;
1311+ }
12991312
13001313 dbx_has_inv = strstr (cache -> dbfile ,"{inv_x}" )
13011314 || strstr (cache -> dbfile ,"{inv_div_x}" )
@@ -1304,10 +1317,6 @@ int main(int argc, char * argv[])
13041317 || strstr (cache -> dbfile ,"{inv_div_y}" )
13051318 || strstr (cache -> dbfile ,"{inv_top_y}" );
13061319 if (cache -> top > 0 ) {
1307- mapcache_grid_get_xy (& ctx , grid , region_bbox .minx , region_bbox .miny ,
1308- cache -> top , & (til_region_bbox .minx ), & (til_region_bbox .miny ));
1309- mapcache_grid_get_xy (& ctx , grid , region_bbox .maxx , region_bbox .maxy ,
1310- cache -> top , & (til_region_bbox .maxx ), & (til_region_bbox .maxy ));
13111320 if (dbx_has_inv ) {
13121321 db_region_bbox .minx = grid -> levels [cache -> top ]-> maxx - 1 - til_region_bbox .maxx ;
13131322 db_region_bbox .maxx = grid -> levels [cache -> top ]-> maxx - 1 - til_region_bbox .minx ;
@@ -1360,7 +1369,6 @@ int main(int argc, char * argv[])
13601369 apr_finfo_t fileinfo ;
13611370 mapcache_extent_i til_file_bbox ;
13621371 mapcache_extent file_bbox ;
1363- int file_zoom_level ;
13641372 mapcache_extent temp_bbox ;
13651373 mapcache_extent region_in_file_bbox ;
13661374#ifdef USE_CLIPPERS
@@ -1434,23 +1442,21 @@ int main(int argc, char * argv[])
14341442
14351443 // Compute file bounding box expressed in tiles
14361444 if (cache -> top > 0 ) {
1437- file_zoom_level = cache -> top ;
14381445 if (dbx_has_inv ) {
1439- til_file_bbox .minx = grid -> levels [file_zoom_level ]-> maxx - 1 - ix ;
1446+ til_file_bbox .minx = grid -> levels [cache -> top ]-> maxx - 1 - ix ;
14401447 til_file_bbox .maxx = til_file_bbox .minx ;
14411448 } else {
14421449 til_file_bbox .minx = ix ;
14431450 til_file_bbox .maxx = til_file_bbox .minx ;
14441451 }
14451452 if (dby_has_inv ) {
1446- til_file_bbox .miny = grid -> levels [file_zoom_level ]-> maxy - 1 - iy ;
1453+ til_file_bbox .miny = grid -> levels [cache -> top ]-> maxy - 1 - iy ;
14471454 til_file_bbox .maxy = til_file_bbox .miny ;
14481455 } else {
14491456 til_file_bbox .miny = iy ;
14501457 til_file_bbox .maxy = til_file_bbox .miny ;
14511458 }
14521459 } else if ((cache -> xcount > 0 ) && (cache -> ycount > 0 )) {
1453- file_zoom_level = iz ;
14541460 if (dbx_has_inv ) {
14551461 til_file_bbox .maxx = grid -> levels [iz ]-> maxx - 1 - ix * cache -> xcount ;
14561462 til_file_bbox .minx = til_file_bbox .maxx + cache -> xcount + 1 ;
@@ -1474,7 +1480,6 @@ int main(int argc, char * argv[])
14741480 til_file_bbox .maxy = grid -> levels [iz ]-> maxy - 1 ;
14751481 }
14761482 } else {
1477- file_zoom_level = iz ;
14781483 til_file_bbox .minx = 0 ;
14791484 til_file_bbox .miny = 0 ;
14801485 til_file_bbox .maxx = grid -> levels [iz ]-> maxx - 1 ;
@@ -1493,6 +1498,16 @@ int main(int argc, char * argv[])
14931498 if (GC_HAS_ERROR (& ctx )) goto failure ;
14941499 file_bbox .maxx = temp_bbox .maxx ;
14951500 file_bbox .maxy = temp_bbox .maxy ;
1501+ if (file_bbox .minx > file_bbox .maxx ) {
1502+ int swap = file_bbox .maxx ;
1503+ file_bbox .maxx = file_bbox .minx ;
1504+ file_bbox .minx = swap ;
1505+ }
1506+ if (file_bbox .miny > file_bbox .maxy ) {
1507+ int swap = file_bbox .maxy ;
1508+ file_bbox .maxy = file_bbox .miny ;
1509+ file_bbox .miny = swap ;
1510+ }
14961511
14971512 // Compute part of region of interest within file bounding box
14981513#ifdef USE_CLIPPERS
@@ -1559,6 +1574,16 @@ int main(int argc, char * argv[])
15591574 mapcache_grid_get_xy (& ctx , grid , region_in_file_bbox .maxx - res ,
15601575 region_in_file_bbox .maxy - res , iz , & (til_region_in_file_bbox .maxx ),
15611576 & (til_region_in_file_bbox .maxy ));
1577+ if (til_region_in_file_bbox .minx > til_region_in_file_bbox .maxx ) {
1578+ int swap = til_region_in_file_bbox .maxx ;
1579+ til_region_in_file_bbox .maxx = til_region_in_file_bbox .minx ;
1580+ til_region_in_file_bbox .minx = swap ;
1581+ }
1582+ if (til_region_in_file_bbox .miny > til_region_in_file_bbox .maxy ) {
1583+ int swap = til_region_in_file_bbox .maxy ;
1584+ til_region_in_file_bbox .maxy = til_region_in_file_bbox .miny ;
1585+ til_region_in_file_bbox .miny = swap ;
1586+ }
15621587 if ((cache -> xcount > 0 ) && (cache -> ycount > 0 )) {
15631588 if (til_region_in_file_bbox .maxx > (til_file_bbox .minx + cache -> xcount - 1 ))
15641589 {
0 commit comments