Skip to content

Commit

Permalink
[WPE][Skia] Implement HeadlessViewBackend
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=269350

Reviewed by Nikolas Zimmermann.

This allows to run ref tests with skia when using the old libwpe API.

* Tools/wpe/backends/HeadlessViewBackend.h:
* Tools/wpe/backends/fdo/HeadlessViewBackendFdo.cpp:
(WPEToolingBackends::HeadlessViewBackend::HeadlessViewBackend):
(WPEToolingBackends::HeadlessViewBackend::~HeadlessViewBackend):
(WPEToolingBackends::HeadlessViewBackend::snapshot):
(WPEToolingBackends::HeadlessViewBackend::updateSnapshot):

Canonical link: https://commits.webkit.org/274613@main
  • Loading branch information
carlosgcampos committed Feb 14, 2024
1 parent b9a2ac2 commit 046aebe
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 6 deletions.
4 changes: 4 additions & 0 deletions Tools/wpe/backends/HeadlessViewBackend.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,11 @@ class HeadlessViewBackend final : public ViewBackend {
#endif

PlatformViewBackend m_exportable { nullptr };
#if defined(USE_SKIA) && USE_SKIA
sk_sp<SkImage> m_snapshot;
#else
PlatformImage m_snapshot { nullptr };
#endif

#if defined(USE_GLIB) && USE_GLIB
struct {
Expand Down
33 changes: 27 additions & 6 deletions Tools/wpe/backends/fdo/HeadlessViewBackendFdo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@
#include <wpe/unstable/fdo-shm.h>
#endif

#if defined(USE_SKIA) && USE_SKIA
#include <skia/core/SkPixmap.h>
#endif

namespace WPEToolingBackends {

struct HeadlessInstance {
Expand Down Expand Up @@ -103,7 +107,18 @@ HeadlessViewBackend::HeadlessViewBackend(uint32_t width, uint32_t height)
cairo_surface_mark_dirty(m_snapshot);
}
#elif defined(USE_SKIA) && USE_SKIA
// FIXME: Add Skia implementation
{
auto info = SkImageInfo::MakeN32Premul(m_width, m_height);
size_t stride = info.minRowBytes();
uint8_t* buffer = new uint8_t[stride * m_height];
memset(buffer, 0, stride * m_height);

SkPixmap pixmap(info, buffer, stride);
m_snapshot = SkImages::RasterFromPixmap(pixmap, [](const void*, void* data) {
auto* buffer = static_cast<uint8_t*>(data);
delete[] buffer;
}, buffer);
}
#endif

#if WPE_CHECK_VERSION(1, 11, 1)
Expand All @@ -129,8 +144,6 @@ HeadlessViewBackend::~HeadlessViewBackend()
#if defined(USE_CAIRO) && USE_CAIRO
if (m_snapshot)
cairo_surface_destroy(m_snapshot);
#elif defined(USE_SKIA) && USE_SKIA
// FIXME: Add Skia implementation
#endif

if (m_exportable)
Expand All @@ -149,8 +162,7 @@ PlatformImage HeadlessViewBackend::snapshot()
#if defined(USE_CAIRO) && USE_CAIRO
return cairo_surface_reference(m_snapshot);
#elif defined(USE_SKIA) && USE_SKIA
// FIXME: Add Skia implementation
return nullptr;
return m_snapshot.get();
#endif
}

Expand All @@ -166,6 +178,10 @@ void HeadlessViewBackend::updateSnapshot(PlatformBuffer exportedBuffer)

#if defined(USE_CAIRO) && USE_CAIRO
uint32_t bufferStride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, m_width);
#elif defined(USE_SKIA) && USE_SKIA
auto info = SkImageInfo::MakeN32Premul(m_width, m_height);
uint32_t bufferStride = info.minRowBytes();
#endif
uint8_t* buffer = new uint8_t[bufferStride * m_height];
memset(buffer, 0, bufferStride * m_height);

Expand All @@ -189,6 +205,7 @@ void HeadlessViewBackend::updateSnapshot(PlatformBuffer exportedBuffer)
wl_shm_buffer_end_access(shmBuffer);
}

#if defined(USE_CAIRO) && USE_CAIRO
if (m_snapshot)
cairo_surface_destroy(m_snapshot);

Expand All @@ -203,7 +220,11 @@ void HeadlessViewBackend::updateSnapshot(PlatformBuffer exportedBuffer)
});
cairo_surface_mark_dirty(m_snapshot);
#elif defined(USE_SKIA) && USE_SKIA
// FIXME: Add Skia implementation
SkPixmap pixmap(info, buffer, bufferStride);
m_snapshot = SkImages::RasterFromPixmap(pixmap, [](const void*, void* data) {
auto* buffer = static_cast<uint8_t*>(data);
delete[] buffer;
}, buffer);
#endif

#else
Expand Down

0 comments on commit 046aebe

Please sign in to comment.