@@ -98,13 +98,23 @@ class GradientSweep extends EngineGradient {
98
98
final double centerX = (center.dx - shaderBounds.left) / (shaderBounds.width);
99
99
final double centerY = (center.dy - shaderBounds.top) / (shaderBounds.height);
100
100
gl.setUniform2f (tileOffset, 2 * (shaderBounds.width * (centerX - 0.5 )),
101
- 2 * (shaderBounds.height * (centerY - 0.5 )));
101
+ 2 * (shaderBounds.height * (0.5 - centerY )));
102
102
final Object angleRange = gl.getUniformLocation (glProgram.program, 'angle_range' );
103
103
gl.setUniform2f (angleRange, startAngle, endAngle);
104
104
normalizedGradient.setupUniforms (gl, glProgram);
105
+
105
106
final Object gradientMatrix =
106
107
gl.getUniformLocation (glProgram.program, 'm_gradient' );
107
- gl.setUniformMatrix4fv (gradientMatrix, false , matrix4 ?? Matrix4 .identity ().storage);
108
+ final Matrix4 gradientTransform = Matrix4 .identity ();
109
+ if (matrix4 != null ) {
110
+ final Matrix4 m4 = Matrix4 .zero ()
111
+ ..copyInverse (Matrix4 .fromFloat32List (matrix4! ));
112
+ gradientTransform.translate (- center.dx, - center.dy);
113
+ gradientTransform.multiply (m4);
114
+ gradientTransform.translate (center.dx, center.dy);
115
+ }
116
+ gl.setUniformMatrix4fv (gradientMatrix, false , gradientTransform.storage);
117
+
108
118
final Object result = () {
109
119
if (createDataUrl) {
110
120
return glRenderer! .drawRectToImageUrl (
@@ -149,7 +159,7 @@ class GradientSweep extends EngineGradient {
149
159
// Sweep gradient
150
160
method.addStatement ('vec2 center = 0.5 * (u_resolution + u_tile_offset);' );
151
161
method.addStatement (
152
- 'vec4 localCoord = vec4(gl_FragCoord.x - center.x, center.y - gl_FragCoord.y, 0, 1) * m_gradient ;' );
162
+ 'vec4 localCoord = m_gradient * vec4(gl_FragCoord.x - center.x, center.y - gl_FragCoord.y, 0, 1);' );
153
163
method.addStatement (
154
164
'float angle = atan(-localCoord.y, -localCoord.x) + ${math .pi };' );
155
165
method.addStatement ('float sweep = angle_range.y - angle_range.x;' );
@@ -317,14 +327,12 @@ class GradientLinear extends EngineGradient {
317
327
// with flipped y axis.
318
328
// We flip y axis, translate to center, multiply matrix and translate
319
329
// and flip back so it is applied correctly.
320
- final Matrix4 m4 = Matrix4 .fromFloat32List (matrix4 ! .matrix);
321
- gradientTransform. scale ( 1 , - 1 );
322
- gradientTransform. translate (
323
- - shaderBounds. center.dx, - shaderBounds. center.dy);
330
+ final Matrix4 m4 = Matrix4 .zero ()
331
+ .. copyInverse ( Matrix4 . fromFloat32List (matrix4 ! .matrix) );
332
+ final ui. Offset center = shaderBounds.center;
333
+ gradientTransform. translate ( - center.dx, - center.dy);
324
334
gradientTransform.multiply (m4);
325
- gradientTransform.translate (
326
- shaderBounds.center.dx, shaderBounds.center.dy);
327
- gradientTransform.scale (1 , - 1 );
335
+ gradientTransform.translate (center.dx, center.dy);
328
336
}
329
337
330
338
gradientTransform.multiply (rotationZ);
@@ -465,6 +473,12 @@ String _writeSharedGradientShader(ShaderBuilder builder, ShaderMethod method,
465
473
sourcePrefix: 'threshold' ,
466
474
biasName: 'bias' ,
467
475
scaleName: 'scale' );
476
+ if (tileMode == ui.TileMode .decal) {
477
+ method.addStatement ('if (st < 0.0 || st > 1.0) {' );
478
+ method.addStatement (' ${builder .fragmentColor .name } = vec4(0, 0, 0, 0);' );
479
+ method.addStatement (' return;' );
480
+ method.addStatement ('}' );
481
+ }
468
482
return probeName;
469
483
}
470
484
@@ -483,7 +497,7 @@ class GradientRadial extends EngineGradient {
483
497
@override
484
498
Object createPaintStyle (DomCanvasRenderingContext2D ? ctx,
485
499
ui.Rect ? shaderBounds, double density) {
486
- if (tileMode == ui.TileMode .clamp || tileMode == ui.TileMode .decal) {
500
+ if (matrix4 == null && ( tileMode == ui.TileMode .clamp || tileMode == ui.TileMode .decal) ) {
487
501
return _createCanvasGradient (ctx, shaderBounds, density);
488
502
} else {
489
503
return _createGlGradient (ctx, shaderBounds, density);
@@ -533,15 +547,24 @@ class GradientRadial extends EngineGradient {
533
547
final double centerX = (center.dx - shaderBounds.left) / (shaderBounds.width);
534
548
final double centerY = (center.dy - shaderBounds.top) / (shaderBounds.height);
535
549
gl.setUniform2f (tileOffset, 2 * (shaderBounds.width * (centerX - 0.5 )),
536
- 2 * (shaderBounds.height * (centerY - 0.5 )));
550
+ 2 * (shaderBounds.height * (0.5 - centerY )));
537
551
final Object radiusUniform = gl.getUniformLocation (glProgram.program, 'u_radius' );
538
552
gl.setUniform1f (radiusUniform, radius);
539
553
normalizedGradient.setupUniforms (gl, glProgram);
540
554
541
555
final Object gradientMatrix =
542
556
gl.getUniformLocation (glProgram.program, 'm_gradient' );
543
- gl.setUniformMatrix4fv (gradientMatrix, false ,
544
- matrix4 == null ? Matrix4 .identity ().storage : matrix4! );
557
+
558
+ final Matrix4 gradientTransform = Matrix4 .identity ();
559
+
560
+ if (matrix4 != null ) {
561
+ final Matrix4 m4 = Matrix4 .zero ()
562
+ ..copyInverse (Matrix4 .fromFloat32List (matrix4! ));
563
+ gradientTransform.translate (- center.dx, - center.dy);
564
+ gradientTransform.multiply (m4);
565
+ gradientTransform.translate (center.dx, center.dy);
566
+ }
567
+ gl.setUniformMatrix4fv (gradientMatrix, false , gradientTransform.storage);
545
568
546
569
final Object result = () {
547
570
if (createDataUrl) {
@@ -587,7 +610,7 @@ class GradientRadial extends EngineGradient {
587
610
// Sweep gradient
588
611
method.addStatement ('vec2 center = 0.5 * (u_resolution + u_tile_offset);' );
589
612
method.addStatement (
590
- 'vec4 localCoord = vec4(gl_FragCoord.x - center.x, center.y - gl_FragCoord.y, 0, 1) * m_gradient ;' );
613
+ 'vec4 localCoord = m_gradient * vec4(gl_FragCoord.x - center.x, center.y - gl_FragCoord.y, 0, 1);' );
591
614
method.addStatement ('float dist = length(localCoord);' );
592
615
method.addStatement (
593
616
'float st = abs(dist / u_radius);' );
@@ -666,7 +689,7 @@ class GradientConical extends GradientRadial {
666
689
// Sweep gradient
667
690
method.addStatement ('vec2 center = 0.5 * (u_resolution + u_tile_offset);' );
668
691
method.addStatement (
669
- 'vec4 localCoord = vec4(gl_FragCoord.x - center.x, center.y - gl_FragCoord.y, 0, 1) * m_gradient ;' );
692
+ 'vec4 localCoord = m_gradient * vec4(gl_FragCoord.x - center.x, center.y - gl_FragCoord.y, 0, 1);' );
670
693
method.addStatement ('float dist = length(localCoord);' );
671
694
final String f = (focalRadius /
672
695
(math.min (shaderBounds.width, shaderBounds.height) / 2.0 ))
0 commit comments