@@ -99,7 +99,7 @@ class GradientSweep extends EngineGradient {
9999 'float st = angle;' );
100100
101101 final String probeName =
102- _writeSharedGradientShader (builder, method, gradient, tileMode);
102+ _writeSharedGradientShader (builder, method, gradient, tileMode, false );
103103 method.addStatement ('${fragColor .name } = ${probeName } * scale + bias;' );
104104
105105 String shader = builder.build ();
@@ -273,7 +273,7 @@ class GradientLinear extends EngineGradient {
273273 'u_resolution.y - gl_FragCoord.y, 0, 1) * m_gradient;' );
274274 method.addStatement ('float st = localCoord.x;' );
275275 final String probeName =
276- _writeSharedGradientShader (builder, method, gradient, tileMode);
276+ _writeSharedGradientShader (builder, method, gradient, tileMode, true );
277277 method.addStatement ('${fragColor .name } = ${probeName } * scale + bias;' );
278278 String shader = builder.build ();
279279 return shader;
@@ -311,7 +311,7 @@ void _addColorStopsToCanvasGradient(html.CanvasGradient gradient,
311311String _writeSharedGradientShader (ShaderBuilder builder,
312312 ShaderMethod method,
313313 NormalizedGradient gradient,
314- ui.TileMode tileMode) {
314+ ui.TileMode tileMode, bool shiftOrigin ) {
315315 method.addStatement ('vec4 bias;' );
316316 method.addStatement ('vec4 scale;' );
317317 // Write uniforms for each threshold, bias and scale.
@@ -331,11 +331,18 @@ String _writeSharedGradientShader(ShaderBuilder builder,
331331 case ui.TileMode .decal:
332332 break ;
333333 case ui.TileMode .repeated:
334- method.addStatement ('float tiled_st = fract(st);' );
334+ // st represents our distance from center. Flutter maps the center to
335+ // center of gradient ramp so we need to add 0.5 to make sure repeated
336+ // pattern center is at origin.
337+ method.addStatement (shiftOrigin ?
338+ 'float tiled_st = fract(st + 0.5);'
339+ : 'float tiled_st = fract(st);' );
335340 probeName = 'tiled_st' ;
336341 break ;
337342 case ui.TileMode .mirror:
338- method.addStatement ('float t_1 = (st - 1.0);' );
343+ method.addStatement (shiftOrigin ?
344+ 'float t_1 = (st - 0.5);'
345+ : 'float t_1 = (st - 1.0);' );
339346 method.addStatement (
340347 'float tiled_st = abs((t_1 - 2.0 * floor(t_1 * 0.5)) - 1.0);' );
341348 probeName = 'tiled_st' ;
@@ -446,7 +453,7 @@ class GradientRadial extends EngineGradient {
446453 method.addStatement (''
447454 'float st = abs(dist / u_radius);' );
448455 final String probeName =
449- _writeSharedGradientShader (builder, method, gradient, tileMode);
456+ _writeSharedGradientShader (builder, method, gradient, tileMode, false );
450457 method.addStatement ('${fragColor .name } = ${probeName } * scale + bias;' );
451458 String shader = builder.build ();
452459 return shader;
0 commit comments