diff --git a/lib/services/map_tile_cache_service.dart b/lib/services/map_tile_cache_service.dart index 07584132..df45c4ca 100644 --- a/lib/services/map_tile_cache_service.dart +++ b/lib/services/map_tile_cache_service.dart @@ -12,12 +12,15 @@ enum MapRasterSourcePreset { osmAuto('osm_auto'), osmStandard('osm_standard'), osmDark('osm_dark'), + osmDarkHC('osm_darkHC'), stamenTerrain('stamen_terrain'), alidadeSmoothDark('alidade_smooth_dark'), outdoors('outdoors'), osmBright('osm_bright'), outdoorsDark('outdoors_dark'), - osmBrightDark('osm_bright_dark'); + outdoorsDarkHC('outdoors_darkHC'), + osmBrightDark('osm_bright_dark'), + osmBrightDarkHC('osm_bright_darkHC'); const MapRasterSourcePreset(this.id); @@ -101,6 +104,12 @@ class MapRasterSourceCatalog { label: 'OpenStreetMap Dark', description: 'Standard OpenStreetMap tiles with an inverted dark filter', ); + static const MapRasterSourceDefinition osmDarkHC = MapRasterSourceDefinition( + id: 'osm_darkHC', + label: 'OpenStreetMap Dark High Contrast', + description: + 'Standard OpenStreetMap tiles with an inverted high contrast dark filter', + ); static const MapRasterSourceDefinition stamenTerrain = MapRasterSourceDefinition( id: 'stamen_terrain', @@ -139,6 +148,14 @@ class MapRasterSourceCatalog { isStadia: true, allowsBulkDownload: true, ); + static const MapRasterSourceDefinition outdoorsDarkHC = + MapRasterSourceDefinition( + id: 'outdoors', + label: 'Outdoors Dark High Contrast', + description: 'High contrast dark version of the Outdoors map style', + isStadia: true, + allowsBulkDownload: true, + ); static const MapRasterSourceDefinition osmBrightDark = MapRasterSourceDefinition( id: 'osm_bright', @@ -147,6 +164,14 @@ class MapRasterSourceCatalog { isStadia: true, allowsBulkDownload: true, ); + static const MapRasterSourceDefinition osmBrightDarkHC = + MapRasterSourceDefinition( + id: 'osm_bright', + label: 'OSM Bright Dark High Contrast', + description: 'High contrast dark version of the OSM Bright map style', + isStadia: true, + allowsBulkDownload: true, + ); static MapRasterSourceDefinition fromPreset(MapRasterSourcePreset preset) { switch (preset) { @@ -156,16 +181,22 @@ class MapRasterSourceCatalog { return osmStandard; case MapRasterSourcePreset.osmDark: return osmDark; + case MapRasterSourcePreset.osmDarkHC: + return osmDarkHC; case MapRasterSourcePreset.alidadeSmoothDark: return alidadeSmoothDark; case MapRasterSourcePreset.outdoors: return outdoors; case MapRasterSourcePreset.outdoorsDark: return outdoorsDark; + case MapRasterSourcePreset.outdoorsDarkHC: + return outdoorsDarkHC; case MapRasterSourcePreset.osmBright: return osmBright; case MapRasterSourcePreset.osmBrightDark: return osmBrightDark; + case MapRasterSourcePreset.osmBrightDarkHC: + return osmBrightDarkHC; case MapRasterSourcePreset.stamenTerrain: return stamenTerrain; } @@ -335,8 +366,11 @@ class MapTileCacheService extends ChangeNotifier { ) { switch (MapRasterSourcePreset.fromId(settings.mapRasterSourceId)) { case MapRasterSourcePreset.osmDark: + case MapRasterSourcePreset.osmDarkHC: case MapRasterSourcePreset.outdoorsDark: + case MapRasterSourcePreset.outdoorsDarkHC: case MapRasterSourcePreset.osmBrightDark: + case MapRasterSourcePreset.osmBrightDarkHC: return true; case MapRasterSourcePreset.osmAuto: return brightness == Brightness.dark; @@ -349,6 +383,25 @@ class MapTileCacheService extends ChangeNotifier { } } + static bool _isHighContrastDarkPreset(MapRasterSourcePreset preset) { + switch (preset) { + case MapRasterSourcePreset.osmDarkHC: + case MapRasterSourcePreset.outdoorsDarkHC: + case MapRasterSourcePreset.osmBrightDarkHC: + return true; + case MapRasterSourcePreset.osmAuto: + case MapRasterSourcePreset.osmStandard: + case MapRasterSourcePreset.osmDark: + case MapRasterSourcePreset.stamenTerrain: + case MapRasterSourcePreset.alidadeSmoothDark: + case MapRasterSourcePreset.outdoors: + case MapRasterSourcePreset.outdoorsDark: + case MapRasterSourcePreset.osmBright: + case MapRasterSourcePreset.osmBrightDark: + return false; + } + } + static const ColorFilter _darkMapFilter = ColorFilter.matrix([ -0.0850, -0.2861, @@ -371,6 +424,28 @@ class MapTileCacheService extends ChangeNotifier { 1, 0, ]); + static const ColorFilter _darkHCMapFilter = ColorFilter.matrix([ + 0.7634200013, + -1.9008999332, + -0.1915199924, + 0, + 338.15, + -0.5665799987, + -0.5720999709, + -0.1915199924, + 0, + 338.15, + -0.5665799987, + -1.9008999332, + 1.1384799335, + 0, + 338.15, + 0, + 0, + 0, + 1, + 0, + ]); CacheManager get _concreteCacheManager => cacheManager as CacheManager; @@ -393,7 +468,13 @@ class MapTileCacheService extends ChangeNotifier { ); if (shouldApplyDarkFilter) { - layer = ColorFiltered(colorFilter: _darkMapFilter, child: layer); + final activePreset = MapRasterSourcePreset.fromId( + appSettingsService.settings.mapRasterSourceId, + ); + final filter = _isHighContrastDarkPreset(activePreset) + ? _darkHCMapFilter + : _darkMapFilter; + layer = ColorFiltered(colorFilter: filter, child: layer); } if (opacity < 1) {