Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
4bad545
Fix ClipOp.none handling. Fix exactCullRect computation
ferhatb Feb 26, 2021
63bb29b
Change exact cull rect computation. Fix non-homogenous matrix failure.
ferhatb Mar 1, 2021
1f3bb2e
Merge remote-tracking branch 'upstream/master' into persistupdate
ferhatb Mar 1, 2021
ffb462f
Fix more localTransformInverse overrides
ferhatb Mar 2, 2021
d4acab5
Fix test override
ferhatb Mar 2, 2021
7ac0975
Merge remote-tracking branch 'upstream/master' into persistupdate
ferhatb Mar 2, 2021
0de1eb0
Update canvaskit test since we handle perspective transform correctly…
ferhatb Mar 2, 2021
0f0abb4
Merge remote-tracking branch 'upstream/master' into persistupdate
ferhatb Mar 9, 2021
4628f2e
Merge remote-tracking branch 'upstream/master' into persistupdate
ferhatb Mar 17, 2021
2a0d9df
revert persist transform changed
ferhatb Mar 18, 2021
e8545ab
Merge remote-tracking branch 'upstream/master' into persistupdate
ferhatb Mar 18, 2021
e829a20
update test to use pushOffset
ferhatb Mar 18, 2021
375a7e8
Add test
ferhatb Mar 19, 2021
eea3722
Merge remote-tracking branch 'upstream/master' into persistupdate
ferhatb Mar 19, 2021
0e092a2
Merge remote-tracking branch 'upstream/master' into persistupdate
ferhatb Mar 19, 2021
8e1b634
protect against malformed matrix
ferhatb Mar 19, 2021
28f41af
Merge remote-tracking branch 'upstream/master' into persistupdate
ferhatb Mar 22, 2021
e3d15fc
Merge remote-tracking branch 'upstream/master' into persistupdate
ferhatb Mar 23, 2021
4cdb703
Merge remote-tracking branch 'upstream/master' into persistupdate
ferhatb Mar 23, 2021
363b3ab
Merge remote-tracking branch 'upstream/master' into persistupdate
ferhatb Mar 24, 2021
6008a8e
Merge remote-tracking branch 'upstream/master' into persistupdate
ferhatb Mar 24, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 10 additions & 4 deletions lib/web_ui/lib/src/engine/util.dart
Original file line number Diff line number Diff line change
Expand Up @@ -278,22 +278,28 @@ void transformLTRB(Matrix4 transform, Float32List ltrb) {

_tempPointMatrix.multiplyTranspose(transform);

// Handle non-homogenous matrices.
double w = transform[15];
if (w == 0.0) {
w = 1.0;
}

ltrb[0] = math.min(
math.min(
math.min(_tempPointData[0], _tempPointData[1]), _tempPointData[2]),
_tempPointData[3]);
_tempPointData[3]) / w;
ltrb[1] = math.min(
math.min(
math.min(_tempPointData[4], _tempPointData[5]), _tempPointData[6]),
_tempPointData[7]);
_tempPointData[7]) / w;
ltrb[2] = math.max(
math.max(
math.max(_tempPointData[0], _tempPointData[1]), _tempPointData[2]),
_tempPointData[3]);
_tempPointData[3]) / w;
ltrb[3] = math.max(
math.max(
math.max(_tempPointData[4], _tempPointData[5]), _tempPointData[6]),
_tempPointData[7]);
_tempPointData[7]) / w;
}

/// Returns true if [rect] contains every point that is also contained by the
Expand Down
4 changes: 2 additions & 2 deletions lib/web_ui/test/canvaskit/layer_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ void testMain() {
ui.window.platformDispatcher as EnginePlatformDispatcher;

final CkPicture picture =
paintPicture(ui.Rect.fromLTRB(0, 0, 30, 30), (CkCanvas canvas) {
canvas.drawRect(ui.Rect.fromLTRB(0, 0, 30, 30),
paintPicture(ui.Rect.fromLTRB(0, 0, 60, 60), (CkCanvas canvas) {
canvas.drawRect(ui.Rect.fromLTRB(0, 0, 60, 60),
CkPaint()..style = ui.PaintingStyle.fill);
});

Expand Down
67 changes: 64 additions & 3 deletions lib/web_ui/test/engine/surface/scene_builder_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ void testMain() {
await webOnlyInitializeEngine();
});

group('SceneBuilder', () {
group('SceneBuilder', ()
{
test('pushOffset implements surface lifecycle', () {
testLayerLifeCycle((SceneBuilder sceneBuilder, EngineLayer oldLayer) {
return sceneBuilder.pushOffset(10, 20, oldLayer: oldLayer);
Expand Down Expand Up @@ -328,6 +329,65 @@ void testMain() {
}
});

test('does not skip painting picture when picture is '
'inside transform with offset', () async {
final Picture picture = _drawPicture();
// Picture should not be clipped out since transform will offset it to 500,500
final SurfaceSceneBuilder builder = SurfaceSceneBuilder();
builder.pushOffset(0, 0);
builder.pushClipRect(const Rect.fromLTRB(0, 0, 1000, 1000)) as PersistedContainerSurface;
builder.pushTransform((Matrix4.identity()..scale(0.5, 0.5)).toFloat64());
builder.addPicture(Offset(1000, 1000), picture);
builder.pop();
builder.pop();
builder.pop();
html.HtmlElement content = builder.build().webOnlyRootElement;
expect(content.querySelectorAll('flt-picture').single.children, isNotEmpty);
});

test('does not skip painting picture when picture is '
'inside transform', () async {
final Picture picture = _drawPicture();
// Picture should not be clipped out since transform will offset it to 500,500
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

copy-pasta?

final SurfaceSceneBuilder builder = SurfaceSceneBuilder();
builder.pushOffset(0, 0);
builder.pushClipRect(const Rect.fromLTRB(0, 0, 1000, 1000)) as PersistedContainerSurface;
builder.pushTransform((Matrix4.identity()..scale(0.5, 0.5)).toFloat64());
builder.pushOffset(1000, 1000);
builder.addPicture(Offset.zero, picture);
builder.pop();
builder.pop();
builder.pop();
html.HtmlElement content = builder.build().webOnlyRootElement;
expect(content.querySelectorAll('flt-picture').single.children, isNotEmpty);
});

test(
'skips painting picture when picture fully clipped out with'
' transform and offset', () async {
final Picture picture = _drawPicture();
// Picture should be clipped out since transform will offset it to 500,500
final SurfaceSceneBuilder builder = SurfaceSceneBuilder();
builder.pushOffset(50, 50);
builder.pushClipRect(
const Rect.fromLTRB(0, 0, 1000, 1000)) as PersistedContainerSurface;
builder.pushTransform((Matrix4.identity()
..scale(2, 2)).toFloat64());
builder.pushOffset(500, 500);
builder.addPicture(Offset.zero, picture);
builder.pop();
builder.pop();
builder.pop();
builder.pop();
html.HtmlElement content = builder
.build()
.webOnlyRootElement;
expect(content
.querySelectorAll('flt-picture')
.single
.children, isEmpty);
});

test('releases old canvas when picture is fully clipped out after addRetained', () async {
final Picture picture = _drawPicture();

Expand Down Expand Up @@ -416,8 +476,8 @@ void testMain() {
paragraph.layout(ParagraphConstraints(width: 1000));
canvas.drawParagraph(paragraph, Offset.zero);
final EngineLayer newLayer = useOffset
? builder.pushOffset(0, 0, oldLayer: oldLayer)
: builder.pushOpacity(100, oldLayer: oldLayer);
? builder.pushOffset(0, 0, oldLayer: oldLayer)
: builder.pushOpacity(100, oldLayer: oldLayer);
builder.addPicture(Offset.zero, recorder.endRecording());
builder.pop();
return newLayer;
Expand Down Expand Up @@ -758,6 +818,7 @@ class MockPersistedPicture extends PersistedPicture {
int get bitmapPixelCount => 0;
}

/// Draw 4 circles within 50, 50, 120, 120 bounds
Picture _drawPicture() {
const double offsetX = 50;
const double offsetY = 50;
Expand Down