diff --git a/lib/src/layer/tile_layer/tile_range_calculator.dart b/lib/src/layer/tile_layer/tile_range_calculator.dart deleted file mode 100644 index 27b5fe814..000000000 --- a/lib/src/layer/tile_layer/tile_range_calculator.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'dart:ui'; - -import 'package:flutter_map/flutter_map.dart'; -import 'package:flutter_map/src/layer/tile_layer/tile_range.dart'; -import 'package:flutter_map/src/misc/extensions.dart'; -import 'package:latlong2/latlong.dart'; -import 'package:meta/meta.dart'; - -/// The [TileRangeCalculator] helps to calculate the bounds in pixel. -@immutable -class TileRangeCalculator { - /// The tile size in pixels. - final int tileDimension; - - /// Create a new [TileRangeCalculator] instance. - const TileRangeCalculator({required this.tileDimension}); - - /// Calculates the visible pixel bounds at the [tileZoom] zoom level when - /// viewing the map from the [viewingZoom] centered at the [center]. The - /// resulting tile range is expanded by panBuffer. - DiscreteTileRange calculate({ - // The map camera used to calculate the bounds. - required MapCamera camera, - // The zoom level at which the bounds should be calculated. - required int tileZoom, - // The center from which the map is viewed, defaults to [camera.center]. - LatLng? center, - // The zoom from which the map is viewed, defaults to [camera.zoom]. - double? viewingZoom, - }) { - return DiscreteTileRange.fromPixelBounds( - zoom: tileZoom, - tileDimension: tileDimension, - pixelBounds: _calculatePixelBounds( - camera, - center ?? camera.center, - viewingZoom ?? camera.zoom, - tileZoom, - ), - ); - } - - Rect _calculatePixelBounds( - MapCamera camera, - LatLng center, - double viewingZoom, - int tileZoom, - ) { - final tileZoomDouble = tileZoom.toDouble(); - final scale = camera.getZoomScale(viewingZoom, tileZoomDouble); - final pixelCenter = camera.projectAtZoom(center, tileZoomDouble).floor(); - - if (camera.pitch != 0) { - // The visible ground relative to the center, in pixels at the viewing - // zoom, is the same at any center and zoom. - final fromCenter = - camera.pixelBounds.shift(-camera.projectAtZoom(camera.center)); - return Rect.fromLTRB( - fromCenter.left / scale, - fromCenter.top / scale, - fromCenter.right / scale, - fromCenter.bottom / scale, - ).shift(pixelCenter); - } - - final halfSize = camera.size / (scale * 2); - - return Rect.fromPoints( - pixelCenter - halfSize.bottomRight(Offset.zero), - pixelCenter + halfSize.bottomRight(Offset.zero), - ); - } -} diff --git a/test/full_coverage_test.dart b/test/full_coverage_test.dart index 1f422fc07..f0d161b62 100644 --- a/test/full_coverage_test.dart +++ b/test/full_coverage_test.dart @@ -25,6 +25,8 @@ import 'package:flutter_map/src/layer/tile_layer/tile_bounds/tile_bounds.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_bounds/tile_bounds_at_zoom.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_builder.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_coordinates.dart'; +import 'package:flutter_map/src/layer/tile_layer/tile_cover.dart'; +import 'package:flutter_map/src/layer/tile_layer/tile_cover_calculator.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_display.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_image.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_image_manager.dart'; @@ -37,7 +39,6 @@ import 'package:flutter_map/src/layer/tile_layer/tile_provider/file/stub_tile_pr import 'package:flutter_map/src/layer/tile_layer/tile_provider/network/image_provider/image_provider.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_provider/network/tile_provider.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_range.dart'; -import 'package:flutter_map/src/layer/tile_layer/tile_range_calculator.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_scale_calculator.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_update_event.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_update_transformer.dart'; diff --git a/test/layer/tile_layer/tile_cover_calculator_test.dart b/test/layer/tile_layer/tile_cover_calculator_test.dart index cc02122aa..b6e953418 100644 --- a/test/layer/tile_layer/tile_cover_calculator_test.dart +++ b/test/layer/tile_layer/tile_cover_calculator_test.dart @@ -4,7 +4,7 @@ import 'dart:ui'; import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_cover.dart'; import 'package:flutter_map/src/layer/tile_layer/tile_cover_calculator.dart'; -import 'package:flutter_map/src/layer/tile_layer/tile_range_calculator.dart'; +import 'package:flutter_map/src/layer/tile_layer/tile_range.dart'; import 'package:flutter_map/src/misc/extensions.dart'; import 'package:latlong2/latlong.dart'; import 'package:test/test.dart'; @@ -46,6 +46,32 @@ void main() { viewingZoom: viewingZoom, ); + /// The tiles at [tileZoom] that the tile layer of the release the fork + /// starts from loads for an unpitched [camera], viewed from [center] at + /// [viewingZoom]. + DiscreteTileRange unpitchedRange( + MapCamera camera, + int tileZoom, { + int tileDimension = 256, + LatLng? center, + double? viewingZoom, + }) { + final scale = + camera.getZoomScale(viewingZoom ?? camera.zoom, tileZoom.toDouble()); + final pixelCenter = camera + .projectAtZoom(center ?? camera.center, tileZoom.toDouble()) + .floor(); + final halfSize = camera.size / (scale * 2); + return DiscreteTileRange.fromPixelBounds( + zoom: tileZoom, + tileDimension: tileDimension, + pixelBounds: Rect.fromPoints( + pixelCenter - halfSize.bottomRight(Offset.zero), + pixelCenter + halfSize.bottomRight(Offset.zero), + ), + ); + } + /// For each screen position on a grid, the tile of [tiles] that contains the /// ground there, and the scale there. List<(Offset, TileCoordinates?, double)> sample( @@ -101,8 +127,8 @@ void main() { ]) { final c = camera(center: center, zoom: zoom); final tileZoom = zoom.round(); - final range = TileRangeCalculator(tileDimension: tileDimension) - .calculate(camera: c, tileZoom: tileZoom); + final range = + unpitchedRange(c, tileZoom, tileDimension: tileDimension); expect( cover(c, tileDimension: tileDimension).coordinates.toSet(), range.coordinates.toSet(), @@ -115,12 +141,7 @@ void main() { test('equals the range at an overridden center and zoom', () { final c = camera(); const center = LatLng(45.6, -122.5); - final range = const TileRangeCalculator(tileDimension: 256).calculate( - camera: c, - tileZoom: 15, - center: center, - viewingZoom: 15.3, - ); + final range = unpitchedRange(c, 15, center: center, viewingZoom: 15.3); expect( cover(c, center: center, viewingZoom: 15.3).coordinates.toSet(), range.coordinates.toSet(), @@ -129,8 +150,7 @@ void main() { test('equals the range above the maximum native zoom', () { final c = camera(zoom: 16.3); - final range = const TileRangeCalculator(tileDimension: 256) - .calculate(camera: c, tileZoom: 14); + final range = unpitchedRange(c, 14); expect( cover(c, maxNativeZoom: 14).coordinates.toSet(), range.coordinates.toSet(), @@ -139,16 +159,14 @@ void main() { test('of an empty viewport equals the range', () { final c = camera(nonRotatedSize: Size.zero); - final range = const TileRangeCalculator(tileDimension: 256) - .calculate(camera: c, tileZoom: 14); + final range = unpitchedRange(c, 14); expect(cover(c).coordinates.toSet(), range.coordinates.toSet()); }); }); test('rotated, contains only tiles that the viewport touches', () { final c = camera(rotation: 45); - final range = const TileRangeCalculator(tileDimension: 256) - .calculate(camera: c, tileZoom: 14); + final range = unpitchedRange(c, 14); final tiles = cover(c); final touched = { for (final (screen, tile, _) in sample(c, tiles, step: 1))