From a6458eb2f316d233b71c5b6a435cb9f74836d51f Mon Sep 17 00:00:00 2001 From: Maxim Date: Fri, 24 Apr 2026 21:09:14 +0900 Subject: [PATCH] fix: Apply text opacity to outline in ML There's no mention of this in Maplibre docs but from my testing it seems that Maplibre applies text opacity to the outline also. This commit applies this logic when converting Maplibre style into Galileo style rules. It also modifies `WithOpacity` expression to blend alpha value insted of replacing it, as it seems to be closer to what Maplibre does. --- galileo-maplibre/src/layer/vector_tile.rs | 24 +++++++++++++++-------- galileo/src/expr/mod.rs | 2 +- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/galileo-maplibre/src/layer/vector_tile.rs b/galileo-maplibre/src/layer/vector_tile.rs index 9e7fe81b..2005e45a 100644 --- a/galileo-maplibre/src/layer/vector_tile.rs +++ b/galileo-maplibre/src/layer/vector_tile.rs @@ -96,15 +96,18 @@ fn get_background(layers: &[&MaplibreStyleLayer]) -> ColorExpr { get_color_value( &layer.paint.background_color, - &layer.paint.background_opacity, + Some(&layer.paint.background_opacity), ) .map(Into::into) .unwrap_or(DEFAULT_TILE_BACKGROUND) } -fn get_color_value(color: &MlStyleValue, opacity: &MlStyleValue) -> Option { +fn get_color_value( + color: &MlStyleValue, + opacity: Option<&MlStyleValue>, +) -> Option { let galileo_color = get_galileo_value(color)?; - let galileo_opacity = get_galileo_value(opacity); + let galileo_opacity = opacity.map(|v| get_galileo_value(v).unwrap_or(1.0.into())); Some(match galileo_opacity { Some(v) => Expr::WithOpacity(WithOpacityExpr { @@ -245,9 +248,13 @@ fn symbol_rule(symbol: &SymbolLayer, tile_schema: &TileSchema) -> Option Option Option { let fill_color = &fill.paint.fill_color; let fill_opacity = &fill.paint.fill_opacity; - let color = get_color_value(fill_color, fill_opacity)?; + let color = get_color_value(fill_color, Some(fill_opacity))?; if !fill.paint.fill_antialias { log::debug!( @@ -443,7 +451,7 @@ fn line_rule(line: &LineLayer, tile_schema: &TileSchema) -> Option { let stroke_color = &line.paint.line_color; let stroke_opacity = &line.paint.line_opacity; - let color = get_color_value(stroke_color, stroke_opacity) + let color = get_color_value(stroke_color, Some(stroke_opacity)) .unwrap_or(Color::TRANSPARENT.into()) .into(); let stroke_width = &line.paint.line_width; diff --git a/galileo/src/expr/mod.rs b/galileo/src/expr/mod.rs index 4d8a82d1..60e29923 100644 --- a/galileo/src/expr/mod.rs +++ b/galileo/src/expr/mod.rs @@ -258,7 +258,7 @@ impl WithOpacityExpr { return ExprValue::Null; }; - ExprValue::Color(color.with_alpha_float(opacity)) + ExprValue::Color(color.with_alpha_float(color.a() as f64 / 255.0 * opacity)) } }