Progress on porting Firefox

Here’s the WIP patch I came up with for wayland_server to improve efficiency with Iceweasel; however the invalidation code doesn’t work quite right:

From 7264d6e283cccc5003321552d96f90ef9ad2782f Mon Sep 17 00:00:00 2001
From: waddlesplash <waddlesplash@gmail.com>
Date: Tue, 10 Dec 2024 15:30:51 -0500
Subject: [PATCH] WIP (doesn't work right): efficiency improvements.

---
 HaikuCompositor.cpp    | 15 ++++++++++-----
 HaikuSubcompositor.cpp |  5 ++++-
 2 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/HaikuCompositor.cpp b/HaikuCompositor.cpp
index 3ea87db..f1ec212 100644
--- a/HaikuCompositor.cpp
+++ b/HaikuCompositor.cpp
@@ -134,7 +134,6 @@ WaylandView::WaylandView(HaikuSurface *surface):
 	BView(BRect(), "WaylandView", B_FOLLOW_NONE, B_WILL_DRAW | B_TRANSPARENT_BACKGROUND),
 	fSurface(surface)
 {
-	SetDrawingMode(B_OP_ALPHA);
 	SetViewColor(B_TRANSPARENT_COLOR);
 }
 
@@ -276,10 +275,16 @@ void HaikuSurface::Invalidate()
 		return;
 	}
 	auto viewLocked = AppKitPtrs::LockedPtr(fView);
-	if (fSubsurface != NULL) {
-		viewLocked->Invalidate();
-	} else {
-		viewLocked->Invalidate(&fDirty);
+	viewLocked->Invalidate(&fDirty);
+	for (HaikuSubsurface *subsurface = SurfaceList().First(); subsurface != NULL; subsurface = SurfaceList().GetNext(subsurface)) {
+		HaikuSurface* surface = subsurface->Surface();
+		BView* subsurfaceView = surface->View();
+		BRegion subsurfaceFrame = subsurfaceView->Frame();
+		BRegion subsurfaceDirty = fDirty;
+		subsurfaceDirty.IntersectWith(&subsurfaceFrame);
+		subsurfaceDirty.OffsetBy(-subsurfaceView->LeftTop());
+		surface->fDirty.Include(&subsurfaceDirty);
+		surface->Invalidate();
 	}
 	fDirty.MakeEmpty();
 }
diff --git a/HaikuSubcompositor.cpp b/HaikuSubcompositor.cpp
index 9b34e01..c60dce5 100644
--- a/HaikuSubcompositor.cpp
+++ b/HaikuSubcompositor.cpp
@@ -87,9 +87,12 @@ HaikuSubsurface *HaikuSubsurface::Create(struct wl_client *client, uint32_t vers
 	subsurface->fParent = HaikuSurface::FromResource(parent);
 	subsurface->fParent->SurfaceList().Insert(subsurface);
 	haikuSurface->SetHook(new SubsurfaceHook());
-	
+
 	BView *parentView = subsurface->fParent->View();
 	if (parentView) {
+		parentView->SetDrawingMode(B_OP_ALPHA);
+		parentView->SetViewColor(B_TRANSPARENT_COLOR);
+
 		haikuSurface->AttachView(parentView);
 		haikuSurface->AttachViewsToEarlierSubsurfaces();
 	}
-- 
2.45.2