@@ -1837,7 +1837,7 @@ index 7d7ef5a5f9e6c092e643eb5c3feef239e90c0bb2..7c975244f26b3c2ec20d8174e5d84fc9
1837
1837
return new AndroidCompositorWidget(aOptions,
1838
1838
static_cast<nsBaseWidget*>(aWidget));
1839
1839
diff --git a/widget/headless/HeadlessCompositorWidget.cpp b/widget/headless/HeadlessCompositorWidget.cpp
1840
- index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..5f4080dacc1376cda7ec75ed0ed2823cd01d6001 100644
1840
+ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..b59419561951730ed8ddfbaeacf1502f5e4ccdd5 100644
1841
1841
--- a/widget/headless/HeadlessCompositorWidget.cpp
1842
1842
+++ b/widget/headless/HeadlessCompositorWidget.cpp
1843
1843
@@ -3,6 +3,7 @@
@@ -1848,23 +1848,24 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..5f4080dacc1376cda7ec75ed0ed2823c
1848
1848
#include "mozilla/widget/PlatformWidgetTypes.h"
1849
1849
#include "HeadlessCompositorWidget.h"
1850
1850
#include "VsyncDispatcher.h"
1851
- @@ -17,6 +18,32 @@ HeadlessCompositorWidget::HeadlessCompositorWidget(
1851
+ @@ -17,6 +18,33 @@ HeadlessCompositorWidget::HeadlessCompositorWidget(
1852
1852
mClientSize = aInitData.InitialClientSize();
1853
1853
}
1854
1854
1855
1855
+ void HeadlessCompositorWidget::SetSnapshotListener(HeadlessWidget::SnapshotListener&& listener) {
1856
1856
+ MOZ_ASSERT(NS_IsMainThread());
1857
1857
+
1858
- + layers::CompositorThread()->Dispatch(NewRunnableMethod<HeadlessWidget::SnapshotListener&&>(
1858
+ + layers::CompositorThread()->Dispatch(NewRunnableMethod<HeadlessWidget::SnapshotListener&&, LayoutDeviceIntSize >(
1859
1859
+ "HeadlessCompositorWidget::SetSnapshotListener", this,
1860
1860
+ &HeadlessCompositorWidget::SetSnapshotListenerOnCompositorThread,
1861
- + std::move(listener)));
1861
+ + std::move(listener), mClientSize ));
1862
1862
+ }
1863
1863
+
1864
- + void HeadlessCompositorWidget::SetSnapshotListenerOnCompositorThread(HeadlessWidget::SnapshotListener&& listener) {
1864
+ + void HeadlessCompositorWidget::SetSnapshotListenerOnCompositorThread(
1865
+ + HeadlessWidget::SnapshotListener&& listener, const LayoutDeviceIntSize& aClientSize) {
1865
1866
+ MOZ_ASSERT(NS_IsInCompositorThread());
1866
1867
+ mSnapshotListener = std::move(listener);
1867
- + UpdateDrawTarget();
1868
+ + UpdateDrawTarget(aClientSize );
1868
1869
+ PeriodicSnapshot();
1869
1870
+ }
1870
1871
+
@@ -1881,29 +1882,38 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..5f4080dacc1376cda7ec75ed0ed2823c
1881
1882
void HeadlessCompositorWidget::ObserveVsync(VsyncObserver* aObserver) {
1882
1883
if (RefPtr<CompositorVsyncDispatcher> cvd =
1883
1884
mWidget->GetCompositorVsyncDispatcher()) {
1884
- @@ -29,6 +56,51 @@ nsIWidget* HeadlessCompositorWidget::RealWidget() { return mWidget; }
1885
+ @@ -29,6 +57,60 @@ nsIWidget* HeadlessCompositorWidget::RealWidget() { return mWidget; }
1885
1886
void HeadlessCompositorWidget::NotifyClientSizeChanged(
1886
1887
const LayoutDeviceIntSize& aClientSize) {
1887
1888
mClientSize = aClientSize;
1888
- + UpdateDrawTarget();
1889
+ + layers::CompositorThread()->Dispatch(NewRunnableMethod<LayoutDeviceIntSize>(
1890
+ + "HeadlessCompositorWidget::UpdateDrawTarget", this,
1891
+ + &HeadlessCompositorWidget::UpdateDrawTarget,
1892
+ + aClientSize));
1889
1893
+ }
1890
1894
+
1891
- + void HeadlessCompositorWidget::UpdateDrawTarget() {
1895
+ + void HeadlessCompositorWidget::UpdateDrawTarget(const LayoutDeviceIntSize& aClientSize) {
1896
+ + MOZ_ASSERT(NS_IsInCompositorThread());
1892
1897
+ if (!mSnapshotListener) {
1893
1898
+ mDrawTarget = nullptr;
1894
1899
+ return;
1895
1900
+ }
1896
1901
+
1897
- + if (mClientSize .IsEmpty()) {
1902
+ + if (aClientSize .IsEmpty()) {
1898
1903
+ mDrawTarget = nullptr;
1899
1904
+ return;
1900
1905
+ }
1901
1906
+
1907
+ + RefPtr<gfx::DrawTarget> old = std::move(mDrawTarget);
1902
1908
+ gfx::SurfaceFormat format = gfx::SurfaceFormat::B8G8R8A8;
1903
- + gfx::IntSize size = mClientSize.ToUnknownSize();
1904
- + // TODO: this is called on Main thread, while Start/End drawing are on Compositor thread.
1909
+ + gfx::IntSize size = aClientSize.ToUnknownSize();
1905
1910
+ mDrawTarget = mozilla::gfx::Factory::CreateDrawTarget(
1906
1911
+ mozilla::gfx::BackendType::SKIA, size, format);
1912
+ + if (old) {
1913
+ + RefPtr<gfx::SourceSurface> snapshot = old->Snapshot();
1914
+ + if (snapshot)
1915
+ + mDrawTarget->CopySurface(snapshot.get(), old->GetRect(), gfx::IntPoint(0, 0));
1916
+ + }
1907
1917
+ }
1908
1918
+
1909
1919
+ void HeadlessCompositorWidget::PeriodicSnapshot() {
@@ -1934,7 +1944,7 @@ index b31a969b7ab3d0fc80912b110d91dfdf3e5991f4..5f4080dacc1376cda7ec75ed0ed2823c
1934
1944
1935
1945
LayoutDeviceIntSize HeadlessCompositorWidget::GetClientSize() {
1936
1946
diff --git a/widget/headless/HeadlessCompositorWidget.h b/widget/headless/HeadlessCompositorWidget.h
1937
- index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..e6d542ac3945a1845d604e1c24bf7505fcc40e13 100644
1947
+ index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..37b0320f3bde99ef7635c71452a3a4b75695bcc5 100644
1938
1948
--- a/widget/headless/HeadlessCompositorWidget.h
1939
1949
+++ b/widget/headless/HeadlessCompositorWidget.h
1940
1950
@@ -23,9 +23,13 @@ class HeadlessCompositorWidget final : public CompositorWidget,
@@ -1951,12 +1961,14 @@ index 7f91de9e67d7ffa02de3eef1d760e5cfd05e7ad6..e6d542ac3945a1845d604e1c24bf7505
1951
1961
uintptr_t GetWidgetKey() override;
1952
1962
1953
1963
LayoutDeviceIntSize GetClientSize() override;
1954
- @@ -42,9 +46,16 @@ class HeadlessCompositorWidget final : public CompositorWidget,
1964
+ @@ -42,9 +46,18 @@ class HeadlessCompositorWidget final : public CompositorWidget,
1955
1965
}
1956
1966
1957
1967
private:
1958
- + void SetSnapshotListenerOnCompositorThread(HeadlessWidget::SnapshotListener&& listener);
1959
- + void UpdateDrawTarget();
1968
+ + void SetSnapshotListenerOnCompositorThread(
1969
+ + HeadlessWidget::SnapshotListener&& listener,
1970
+ + const LayoutDeviceIntSize& aClientSize);
1971
+ + void UpdateDrawTarget(const LayoutDeviceIntSize& aClientSize);
1960
1972
+ void PeriodicSnapshot();
1961
1973
+
1962
1974
HeadlessWidget* mWidget;
0 commit comments