Skip to content

Commit

Permalink
Fix opacity interpolation. Add multiplication with maxOpacity in the …
Browse files Browse the repository at this point in the history
…expression and adapt unit tests
  • Loading branch information
mhugent committed Sep 12, 2021
1 parent 119147c commit 7edf3c5
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 10 deletions.
13 changes: 9 additions & 4 deletions src/core/vectortile/qgsmapboxglstyleconverter.cpp
Expand Up @@ -2119,8 +2119,8 @@ QgsProperty QgsMapBoxGlStyleConverter::parseInterpolateOpacityByZoom( const QVar
scaleExpression = QStringLiteral( "set_color_part(@symbol_color, 'alpha', %1)" )
.arg( interpolateExpression( stops.value( 0 ).toList().value( 0 ).toDouble(),
stops.last().toList().value( 0 ).toDouble(),
stops.value( 0 ).toList().value( 1 ),
stops.last().toList().value( 1 ), base, context, maxOpacity ) );
QString( "(%1) * %2" ).arg( parseValue( stops.value( 0 ).toList().value( 1 ), context ) ).arg( maxOpacity ),
QString( "(%1) * %2" ).arg( parseValue( stops.last().toList().value( 1 ), context ) ).arg( maxOpacity ), base, context ) );
}
else
{
Expand All @@ -2143,8 +2143,8 @@ QString QgsMapBoxGlStyleConverter::parseOpacityStops( double base, const QVarian
stops.value( i + 1 ).toList().value( 0 ).toString(),
interpolateExpression( stops.value( i ).toList().value( 0 ).toDouble(),
stops.value( i + 1 ).toList().value( 0 ).toDouble(),
stops.value( i ).toList().value( 1 ),
stops.value( i + 1 ).toList().value( 1 ), base, context, maxOpacity ) );
QString( "(%1) * %2" ).arg( parseValue( stops.value( i ).toList().value( 1 ), context ) ).arg( maxOpacity ),
QString( "(%1) * %2" ).arg( parseValue( stops.value( i + 1 ).toList().value( 1 ), context ) ).arg( maxOpacity ), base, context ) );
}

caseString += QStringLiteral( " WHEN @vector_tile_zoom >= %1 "
Expand Down Expand Up @@ -2539,6 +2539,11 @@ QString QgsMapBoxGlStyleConverter::interpolateExpression( double zoomMin, double
maxValueExpr = parseExpression( valueMax.toList(), context );
}

if ( minValueExpr == maxValueExpr )
{
return minValueExpr;
}

QString expression;
if ( base == 1 )
{
Expand Down
12 changes: 6 additions & 6 deletions tests/src/python/test_qgsmapboxglconverter.py
Expand Up @@ -236,28 +236,28 @@ def testInterpolateOpacityByZoom(self):
[150, 0.15],
[250, 0.2]]
}, 255, conversion_context).expressionString(),
"CASE WHEN @vector_tile_zoom < 0 THEN set_color_part(@symbol_color, 'alpha', 25.5) WHEN @vector_tile_zoom >= 0 AND @vector_tile_zoom < 150 THEN set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,0,150,25.5,38.25)) WHEN @vector_tile_zoom >= 150 AND @vector_tile_zoom < 250 THEN set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,150,250,38.25,51)) WHEN @vector_tile_zoom >= 250 THEN set_color_part(@symbol_color, 'alpha', 51) END")
"CASE WHEN @vector_tile_zoom < 0 THEN set_color_part(@symbol_color, 'alpha', 25.5) WHEN @vector_tile_zoom >= 0 AND @vector_tile_zoom < 150 THEN set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,0,150,(0.1) * 255,(0.15) * 255)) WHEN @vector_tile_zoom >= 150 AND @vector_tile_zoom < 250 THEN set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,150,250,(0.15) * 255,(0.2) * 255)) WHEN @vector_tile_zoom >= 250 THEN set_color_part(@symbol_color, 'alpha', 51) END")
self.assertEqual(QgsMapBoxGlStyleConverter.parseInterpolateOpacityByZoom({'base': 1,
'stops': [[0, 0.1],
[150, 0.15],
[250, 0.2]]
}, 100, conversion_context).expressionString(),
"CASE WHEN @vector_tile_zoom < 0 THEN set_color_part(@symbol_color, 'alpha', 10) WHEN @vector_tile_zoom >= 0 AND @vector_tile_zoom < 150 THEN set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,0,150,10,15)) WHEN @vector_tile_zoom >= 150 AND @vector_tile_zoom < 250 THEN set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,150,250,15,20)) WHEN @vector_tile_zoom >= 250 THEN set_color_part(@symbol_color, 'alpha', 20) END")
"CASE WHEN @vector_tile_zoom < 0 THEN set_color_part(@symbol_color, 'alpha', 10) WHEN @vector_tile_zoom >= 0 AND @vector_tile_zoom < 150 THEN set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,0,150,(0.1) * 100,(0.15) * 100)) WHEN @vector_tile_zoom >= 150 AND @vector_tile_zoom < 250 THEN set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,150,250,(0.15) * 100,(0.2) * 100)) WHEN @vector_tile_zoom >= 250 THEN set_color_part(@symbol_color, 'alpha', 20) END")
self.assertEqual(QgsMapBoxGlStyleConverter.parseInterpolateOpacityByZoom({'base': 1,
'stops': [[0, 0.1],
[150, 0.15]]
}, 255, conversion_context).expressionString(),
"set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,0,150,25.5,38.25))")
"set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,0,150,(0.1) * 255,(0.15) * 255))")
self.assertEqual(QgsMapBoxGlStyleConverter.parseInterpolateOpacityByZoom({'base': 2,
'stops': [[0, 0.1],
[150, 0.15]]
}, 255, conversion_context).expressionString(),
"set_color_part(@symbol_color, 'alpha', scale_exp(@vector_tile_zoom,0,150,25.5,38.25,2))")
"set_color_part(@symbol_color, 'alpha', scale_exp(@vector_tile_zoom,0,150,(0.1) * 255,(0.15) * 255,2))")
self.assertEqual(QgsMapBoxGlStyleConverter.parseInterpolateOpacityByZoom({'base': 2,
'stops': [[0, 0.1],
[150, 0.1]]
}, 255, conversion_context).expressionString(),
"set_color_part(@symbol_color, 'alpha', 25.5)")
"set_color_part(@symbol_color, 'alpha', (0.1) * 255)")

def testInterpolateListByZoom(self):
conversion_context = QgsMapBoxGlStyleConversionContext()
Expand All @@ -273,7 +273,7 @@ def testInterpolateListByZoom(self):
0.6
], QgsMapBoxGlStyleConverter.Opacity, conversion_context, 2)
self.assertEqual(prop.expressionString(),
"CASE WHEN @vector_tile_zoom < 10 THEN set_color_part(@symbol_color, 'alpha', 25.5) WHEN @vector_tile_zoom >= 10 AND @vector_tile_zoom < 15 THEN set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,10,15,25.5,76.5)) WHEN @vector_tile_zoom >= 15 AND @vector_tile_zoom < 18 THEN set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,15,18,76.5,153)) WHEN @vector_tile_zoom >= 18 THEN set_color_part(@symbol_color, 'alpha', 153) END")
"CASE WHEN @vector_tile_zoom < 10 THEN set_color_part(@symbol_color, 'alpha', 25.5) WHEN @vector_tile_zoom >= 10 AND @vector_tile_zoom < 15 THEN set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,10,15,(0.1) * 255,(0.3) * 255)) WHEN @vector_tile_zoom >= 15 AND @vector_tile_zoom < 18 THEN set_color_part(@symbol_color, 'alpha', scale_linear(@vector_tile_zoom,15,18,(0.3) * 255,(0.6) * 255)) WHEN @vector_tile_zoom >= 18 THEN set_color_part(@symbol_color, 'alpha', 153) END")

prop, default_color, default_val = QgsMapBoxGlStyleConverter.parseInterpolateListByZoom([
"interpolate",
Expand Down

0 comments on commit 7edf3c5

Please sign in to comment.