Skip to content

Commit 149ef70

Browse files
authored
[web] Implement sweep gradient (flutter#21873)
1 parent 2dc43ee commit 149ef70

File tree

12 files changed

+1056
-168
lines changed

12 files changed

+1056
-168
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -489,6 +489,7 @@ FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/recording_canvas.dart
489489
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/render_vertices.dart
490490
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/scene.dart
491491
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/scene_builder.dart
492+
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/shaders/normalized_gradient.dart
492493
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/shaders/shader.dart
493494
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/shaders/shader_builder.dart
494495
FILE: ../../../flutter/lib/web_ui/lib/src/engine/html/surface.dart

lib/web_ui/lib/src/engine.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ part 'engine/html/recording_canvas.dart';
8989
part 'engine/html/render_vertices.dart';
9090
part 'engine/html/scene.dart';
9191
part 'engine/html/scene_builder.dart';
92+
part 'engine/html/shaders/normalized_gradient.dart';
9293
part 'engine/html/shaders/shader.dart';
9394
part 'engine/html/shaders/shader_builder.dart';
9495
part 'engine/html/surface.dart';

lib/web_ui/lib/src/engine/bitmap_canvas.dart

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -227,8 +227,8 @@ class BitmapCanvas extends EngineCanvas {
227227
}
228228

229229
/// Sets the global paint styles to correspond to [paint].
230-
void _setUpPaint(SurfacePaintData paint) {
231-
_canvasPool.contextHandle.setUpPaint(paint);
230+
void _setUpPaint(SurfacePaintData paint, ui.Rect? shaderBounds) {
231+
_canvasPool.contextHandle.setUpPaint(paint, shaderBounds);
232232
}
233233

234234
void _tearDownPaint() {
@@ -352,7 +352,9 @@ class BitmapCanvas extends EngineCanvas {
352352
..lineTo(p2.dx, p2.dy);
353353
drawPath(path, paint);
354354
} else {
355-
_setUpPaint(paint);
355+
ui.Rect? shaderBounds = (paint.shader != null) ?
356+
ui.Rect.fromPoints(p1, p2) : null;
357+
_setUpPaint(paint, shaderBounds);
356358
_canvasPool.strokeLine(p1, p2);
357359
_tearDownPaint();
358360
}
@@ -363,7 +365,9 @@ class BitmapCanvas extends EngineCanvas {
363365
if (_useDomForRendering(paint)) {
364366
drawRect(_computeScreenBounds(_canvasPool._currentTransform), paint);
365367
} else {
366-
_setUpPaint(paint);
368+
ui.Rect? shaderBounds = (paint.shader != null) ?
369+
_computePictureBounds() : null;
370+
_setUpPaint(paint, shaderBounds);
367371
_canvasPool.fill();
368372
_tearDownPaint();
369373
}
@@ -380,7 +384,7 @@ class BitmapCanvas extends EngineCanvas {
380384
math.min(rect.left, rect.right), math.min(rect.top, rect.bottom)),
381385
paint);
382386
} else {
383-
_setUpPaint(paint);
387+
_setUpPaint(paint, rect);
384388
_canvasPool.drawRect(rect, paint.style);
385389
_tearDownPaint();
386390
}
@@ -423,15 +427,15 @@ class BitmapCanvas extends EngineCanvas {
423427
math.min(rect.left, rect.right), math.min(rect.top, rect.bottom)),
424428
paint);
425429
} else {
426-
_setUpPaint(paint);
427-
_canvasPool.drawRRect(rrect, paint.style);
430+
_setUpPaint(paint, rrect.outerRect);
431+
_canvasPool.drawRRect(rrect, paint.style);
428432
_tearDownPaint();
429433
}
430434
}
431435

432436
@override
433437
void drawDRRect(ui.RRect outer, ui.RRect inner, SurfacePaintData paint) {
434-
_setUpPaint(paint);
438+
_setUpPaint(paint, outer.outerRect);
435439
_canvasPool.drawDRRect(outer, inner, paint.style);
436440
_tearDownPaint();
437441
}
@@ -449,7 +453,7 @@ class BitmapCanvas extends EngineCanvas {
449453
element.style.borderRadius =
450454
'${(rect.width / 2.0)}px / ${(rect.height / 2.0)}px';
451455
} else {
452-
_setUpPaint(paint);
456+
_setUpPaint(paint, rect);
453457
_canvasPool.drawOval(rect, paint.style);
454458
_tearDownPaint();
455459
}
@@ -468,7 +472,8 @@ class BitmapCanvas extends EngineCanvas {
468472
paint);
469473
element.style.borderRadius = '50%';
470474
} else {
471-
_setUpPaint(paint);
475+
_setUpPaint(paint, paint.shader != null
476+
? ui.Rect.fromCircle(center: c, radius: radius) : null);
472477
_canvasPool.drawCircle(c, radius, paint.style);
473478
_tearDownPaint();
474479
}
@@ -490,7 +495,7 @@ class BitmapCanvas extends EngineCanvas {
490495
}
491496
_drawElement(svgElm, ui.Offset(0, 0), paint);
492497
} else {
493-
_setUpPaint(paint);
498+
_setUpPaint(paint, paint.shader != null ? path.getBounds() : null);
494499
_canvasPool.drawPath(path, paint.style);
495500
_tearDownPaint();
496501
}
@@ -813,7 +818,7 @@ class BitmapCanvas extends EngineCanvas {
813818
ctx.font = style.cssFontString;
814819
_cachedLastStyle = style;
815820
}
816-
_setUpPaint(paragraph._paint!.paintData);
821+
_setUpPaint(paragraph._paint!.paintData, null);
817822
double y = offset.dy + paragraph.alphabeticBaseline;
818823
final int len = lines.length;
819824
for (int i = 0; i < len; i++) {
@@ -920,7 +925,7 @@ class BitmapCanvas extends EngineCanvas {
920925
_drawPointsPaint.strokeWidth = paint.strokeWidth;
921926
_drawPointsPaint.maskFilter = paint.maskFilter;
922927

923-
_setUpPaint(_drawPointsPaint);
928+
_setUpPaint(_drawPointsPaint, null);
924929
_canvasPool.drawPoints(pointMode, points, paint.strokeWidth! / 2.0);
925930
_tearDownPaint();
926931
}
@@ -969,6 +974,11 @@ class BitmapCanvas extends EngineCanvas {
969974
math.max(topRight.y, math.max(bottomRight.y, bottomLeft.y))),
970975
);
971976
}
977+
978+
/// Computes paint bounds to completely cover picture.
979+
ui.Rect _computePictureBounds() {
980+
return ui.Rect.fromLTRB(0, 0, _bounds.width, _bounds.height);
981+
}
972982
}
973983

974984
String? _stringForBlendMode(ui.BlendMode? blendMode) {

lib/web_ui/lib/src/engine/canvas_pool.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ class ContextStateHandle {
763763
/// Sets paint properties on the current canvas.
764764
///
765765
/// [tearDownPaint] must be called after calling this method.
766-
void setUpPaint(SurfacePaintData paint) {
766+
void setUpPaint(SurfacePaintData paint, ui.Rect? shaderBounds) {
767767
if (assertionsEnabled) {
768768
assert(!_debugIsPaintSetUp);
769769
_debugIsPaintSetUp = true;
@@ -778,7 +778,7 @@ class ContextStateHandle {
778778
if (paint.shader != null) {
779779
final EngineGradient engineShader = paint.shader as EngineGradient;
780780
final Object paintStyle =
781-
engineShader.createPaintStyle(_canvasPool.context);
781+
engineShader.createPaintStyle(_canvasPool.context, shaderBounds);
782782
fillStyle = paintStyle;
783783
strokeStyle = paintStyle;
784784
} else if (paint.color != null) {

0 commit comments

Comments
 (0)