Skip to content

Commit ac7e29a

Browse files
authored
Revert "remove forced compositing from opacity" (#105489)
1 parent 2ab56de commit ac7e29a

File tree

3 files changed

+30
-38
lines changed

3 files changed

+30
-38
lines changed

packages/flutter/lib/src/rendering/proxy_box.dart

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import 'package:flutter/services.dart';
1313
import 'package:vector_math/vector_math_64.dart';
1414

1515
import 'box.dart';
16-
import 'debug.dart';
1716
import 'layer.dart';
1817
import 'layout_helper.dart';
1918
import 'object.dart';
@@ -885,6 +884,16 @@ class RenderOpacity extends RenderProxyBox {
885884
_alpha = ui.Color.getAlphaFromOpacity(opacity),
886885
super(child);
887886

887+
@override
888+
bool get alwaysNeedsCompositing => child != null && (_alpha > 0);
889+
890+
@override
891+
OffsetLayer updateCompositedLayer({required covariant OpacityLayer? oldLayer}) {
892+
final OpacityLayer updatedLayer = oldLayer ?? OpacityLayer();
893+
updatedLayer.alpha = _alpha;
894+
return updatedLayer;
895+
}
896+
888897
int _alpha;
889898

890899
/// The fraction to scale the child's alpha value.
@@ -905,9 +914,13 @@ class RenderOpacity extends RenderProxyBox {
905914
if (_opacity == value) {
906915
return;
907916
}
917+
final bool didNeedCompositing = alwaysNeedsCompositing;
908918
final bool wasVisible = _alpha != 0;
909919
_opacity = value;
910920
_alpha = ui.Color.getAlphaFromOpacity(_opacity);
921+
if (didNeedCompositing != alwaysNeedsCompositing) {
922+
markNeedsCompositingBitsUpdate();
923+
}
911924
markNeedsPaint();
912925
if (wasVisible != (_alpha != 0) && !alwaysIncludeSemantics) {
913926
markNeedsSemanticsUpdate();
@@ -937,40 +950,19 @@ class RenderOpacity extends RenderProxyBox {
937950

938951
@override
939952
void paint(PaintingContext context, Offset offset) {
940-
if (child == null) {
941-
return;
942-
}
943-
if (_alpha == 0) {
944-
// No need to keep the layer. We'll create a new one if necessary.
945-
layer = null;
946-
return;
947-
}
948-
if (_alpha == 255) {
949-
layer = null;
950-
return super.paint(context, offset);
951-
}
952-
// Due to https://github.com/flutter/flutter/issues/48417 this will always need to be
953-
// composited on the web.
954-
if (needsCompositing || kIsWeb) {
953+
if (child != null) {
954+
if (_alpha == 0) {
955+
// No need to keep the layer. We'll create a new one if necessary.
956+
layer = null;
957+
return;
958+
}
959+
assert(needsCompositing);
955960
layer = context.pushOpacity(offset, _alpha, super.paint, oldLayer: layer as OpacityLayer?);
956961
assert(() {
957-
layer?.debugCreator = debugCreator;
962+
layer!.debugCreator = debugCreator;
958963
return true;
959964
}());
960-
return;
961-
}
962-
963-
// debugDisableOpacityLayers is used by the SceneBuilder to remove opacity layers, but
964-
// if the framework is not asked to composite will also need to remove the opacity here.
965-
if (kDebugMode && debugDisableOpacityLayers) {
966-
super.paint(context, offset);
967-
return;
968965
}
969-
final Color color = Color.fromRGBO(0, 0, 0, opacity);
970-
final Canvas canvas = context.canvas;
971-
canvas.saveLayer(size != null ? offset & size : null, Paint()..color = color);
972-
super.paint(context, offset);
973-
canvas.restore();
974966
}
975967

976968
@override

packages/flutter/test/rendering/proxy_box_test.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ void main() {
197197

198198
expect(data.lengthInBytes, equals(20 * 20 * 4));
199199
expect(data.elementSizeInBytes, equals(1));
200-
expect(getPixel(0, 0), equals(0x0000007F));
200+
expect(getPixel(0, 0), equals(0x00000080));
201201
expect(getPixel(image.width - 1, 0 ), equals(0xffffffff));
202202

203203
final OffsetLayer layer = boundary.debugLayer! as OffsetLayer;
@@ -206,7 +206,7 @@ void main() {
206206
expect(image.width, equals(20));
207207
expect(image.height, equals(20));
208208
data = (await image.toByteData())!;
209-
expect(getPixel(0, 0), equals(0x0000007F));
209+
expect(getPixel(0, 0), equals(0x00000080));
210210
expect(getPixel(image.width - 1, 0 ), equals(0xffffffff));
211211

212212
// non-zero offsets.
@@ -215,7 +215,7 @@ void main() {
215215
expect(image.height, equals(30));
216216
data = (await image.toByteData())!;
217217
expect(getPixel(0, 0), equals(0x00000000));
218-
expect(getPixel(10, 10), equals(0x0000007F));
218+
expect(getPixel(10, 10), equals(0x00000080));
219219
expect(getPixel(image.width - 1, 0), equals(0x00000000));
220220
expect(getPixel(image.width - 1, 10), equals(0xffffffff));
221221

@@ -225,7 +225,7 @@ void main() {
225225
expect(image.height, equals(60));
226226
data = (await image.toByteData())!;
227227
expect(getPixel(0, 0), equals(0x00000000));
228-
expect(getPixel(20, 20), equals(0x0000007F));
228+
expect(getPixel(20, 20), equals(0x00000080));
229229
expect(getPixel(image.width - 1, 0), equals(0x00000000));
230230
expect(getPixel(image.width - 1, 20), equals(0xffffffff));
231231
}, skip: isBrowser); // https://github.com/flutter/flutter/issues/49857
@@ -240,13 +240,13 @@ void main() {
240240
expect(renderOpacity.needsCompositing, false);
241241
});
242242

243-
test('RenderOpacity does not composite if it is opaque', () {
243+
test('RenderOpacity does composite if it is opaque', () {
244244
final RenderOpacity renderOpacity = RenderOpacity(
245245
child: RenderSizedBox(const Size(1.0, 1.0)), // size doesn't matter
246246
);
247247

248248
layout(renderOpacity, phase: EnginePhase.composite);
249-
expect(renderOpacity.needsCompositing, false);
249+
expect(renderOpacity.needsCompositing, true);
250250
});
251251

252252
test('RenderOpacity reuses its layer', () {

packages/flutter/test/widgets/debug_test.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,8 @@ void main() {
285285
child: Placeholder(),
286286
),
287287
const Opacity(
288-
opacity: 0.9, // ensure compositing is used.
289-
child: RepaintBoundary(child: Placeholder()),
288+
opacity: 1.0,
289+
child: Placeholder(),
290290
),
291291
ImageFiltered(
292292
imageFilter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),

0 commit comments

Comments
 (0)