Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 9a4f415

Browse files
authored
[web] Fix linear gradient tiling offset. (#23691)
1 parent 30f7e9f commit 9a4f415

2 files changed

Lines changed: 14 additions & 7 deletions

File tree

lib/web_ui/dev/goldens_lock.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
repository: https://github.com/flutter/goldens.git
2-
revision: ca17cd88e5cc8155672e0b58bb7c0424a9612950
2+
revision: ee03ff97af36cbf9bd2627ef4e32f5a45676f96f

lib/web_ui/lib/src/engine/html/shaders/shader.dart

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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,
311311
String _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

Comments
 (0)