opt: RepaintBoundary (#1840)

* opt: RepaintBoundary

* fix [skip ci]

* opt time width

* opt: video position

* update

---------

Co-authored-by: dom <githubaccount56556@proton.me>
This commit is contained in:
My-Responsitories
2026-02-20 21:04:34 +08:00
committed by GitHub
parent a63ca93762
commit d7d9655f81
12 changed files with 226 additions and 128 deletions

View File

@@ -65,7 +65,4 @@ class RenderCustomHeightWidget extends RenderProxyBox {
void paint(PaintingContext context, Offset offset) {
context.paintChild(child!, offset + _offset);
}
@override
bool get isRepaintBoundary => true;
}

View File

@@ -95,7 +95,4 @@ class _RenderDecoratedBox extends RenderProxyBox {
@override
bool hitTestSelf(Offset position) => true;
@override
bool get isRepaintBoundary => true;
}

View File

@@ -259,9 +259,6 @@ class _RenderToolTip extends RenderBox
child = childParentData.nextSibling;
}
}
@override
bool get isRepaintBoundary => true;
}
class Triangle extends LeafRenderObjectWidget {
@@ -328,14 +325,11 @@ class RenderTriangle extends RenderBox {
..style = PaintingStyle.fill;
final path = Path()
..moveTo(0, 0)
..lineTo(size.width, 0)
..lineTo(size.width / 2, size.height)
..moveTo(offset.dx, offset.dy)
..lineTo(offset.dx + size.width, offset.dy)
..lineTo(offset.dx + size.width / 2, size.height + offset.dy)
..close();
context.canvas.drawPath(path, paint);
}
@override
bool get isRepaintBoundary => true;
}

View File

@@ -121,6 +121,7 @@ class RenderMaskedIcon extends RenderProxyBox {
final canvas = context.canvas;
var rectOffset = offset;
Size size = this.size;
final exceedWidth = size.width > _iconSize;
final exceedHeight = size.height > _iconSize;
@@ -128,14 +129,14 @@ class RenderMaskedIcon extends RenderProxyBox {
final dx = exceedWidth ? (size.width - _iconSize) / 2.0 : 0.0;
final dy = exceedHeight ? (size.height - _iconSize) / 2.0 : 0.0;
size = Size.square(_iconSize);
offset = Offset(dx, dy);
rectOffset += Offset(dx, dy);
} else if (size.width < _iconSize && size.height < _iconSize) {
size = Size.square(_iconSize);
}
final strokeWidth = size.width / 12;
var rect = offset & size;
var rect = rectOffset & size;
final sqrt2Width = strokeWidth * sqrt2; // rotate pi / 4
@@ -155,7 +156,7 @@ class RenderMaskedIcon extends RenderProxyBox {
canvas
..save()
..clipPath(path, doAntiAlias: false);
super.paint(context, .zero);
super.paint(context, offset);
canvas.restore();
@@ -174,7 +175,4 @@ class RenderMaskedIcon extends RenderProxyBox {
linePaint,
);
}
@override
bool get isRepaintBoundary => true;
}

View File

@@ -440,5 +440,5 @@ class RenderImageGrid extends RenderBox
}
@override
bool get isRepaintBoundary => true;
bool get isRepaintBoundary => true; // gif repaint
}

View File

@@ -226,13 +226,14 @@ abstract class MarqueeRender extends RenderBox
if (_distance > 0) {
updateSize();
_ticker.initIfNeeded(_onTick);
markNeedsCompositingBitsUpdate();
} else {
_ticker.cancel();
}
}
@override
bool get isRepaintBoundary => true;
bool get isRepaintBoundary => _ticker._ticker != null;
void paintCenter(PaintingContext context, Offset offset) {
if (_direction == Axis.horizontal) {

View File

@@ -123,17 +123,17 @@ class RenderProgressBar extends BaseRenderProgressBar<Segment> {
for (final segment in segments) {
paint.color = segment.color;
final segmentStart = segment.start * size.width;
final segmentEnd = segment.end * size.width;
final segmentStart = offset.dx + segment.start * size.width;
final segmentEnd = offset.dx + segment.end * size.width;
if (segmentEnd > segmentStart ||
(segmentEnd == segmentStart && segmentStart > 0)) {
canvas.drawRect(
Rect.fromLTRB(
segmentStart,
0,
offset.dy,
segmentEnd == segmentStart ? segmentStart + 2 : segmentEnd,
size.height,
size.height + offset.dy,
),
paint,
);
@@ -225,6 +225,12 @@ class RenderViewPointProgressBar
final canvas = context.canvas;
final paint = Paint()..style = PaintingStyle.fill;
if (offset != .zero) {
canvas
..save()
..translate(offset.dx, offset.dy);
}
assert(segments.isSortedBy((i) => i.end));
canvas.drawRect(
@@ -276,6 +282,7 @@ class RenderViewPointProgressBar
}
prevEnd = segmentEnd + _dividerWidth;
}
if (offset != .zero) canvas.restore();
}
ValueSetter<Duration>? _onSeek;
@@ -371,7 +378,4 @@ class BaseRenderProgressBar<T extends BaseSegment> extends RenderBox {
void performLayout() {
size = constraints.constrainDimensions(constraints.maxWidth, height);
}
@override
bool get isRepaintBoundary => true;
}

View File

@@ -119,7 +119,9 @@ class RenderProgressBar extends RenderBox {
@override
void paint(PaintingContext context, Offset offset) {
final size = this.size;
final canvas = context.canvas;
final canvas = context.canvas
..save()
..translate(offset.dx, offset.dy);
final paint = Paint()..style = .fill;
canvas.clipRect(
@@ -147,8 +149,6 @@ class RenderProgressBar extends RenderBox {
..drawRect(left, paint..color = _color)
..drawRect(right, paint..color = _backgroundColor);
}
canvas.restore();
}
@override
bool get isRepaintBoundary => true;
}