add High Contrast filter for maps

This commit is contained in:
ericz
2026-07-30 19:26:33 +02:00
parent 98f6cf3745
commit 36f12ebded
+83 -2
View File
@@ -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) {