diff options
author | Samuel Rødal <samuel.rodal@nokia.com> | 2012-03-07 13:52:50 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.p.agocs@nokia.com> | 2012-03-07 15:51:39 +0100 |
commit | 48e56862235f160ca08c713ac09c7b5764fc790a (patch) | |
tree | aecb3c9d03cbde136c6716198b2ceef075e1a2f5 /tests | |
parent | 609b8a18d0fb10cbee4a71a68ccee25a29fb071b (diff) |
Added testing of QBackingStore backend in wayland plugin.
Change-Id: I4db26cbee88f329a926914ff878e6efa9b0c8395
Reviewed-by: Laszlo Agocs <laszlo.p.agocs@nokia.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/client/client.pro | 4 | ||||
-rw-r--r-- | tests/auto/client/mockcompositor.h | 5 | ||||
-rw-r--r-- | tests/auto/client/mockshm.cpp | 36 | ||||
-rw-r--r-- | tests/auto/client/mocksurface.cpp | 45 | ||||
-rw-r--r-- | tests/auto/client/mocksurface.h | 9 | ||||
-rw-r--r-- | tests/auto/client/tst_client.cpp | 47 |
6 files changed, 110 insertions, 36 deletions
diff --git a/tests/auto/client/client.pro b/tests/auto/client/client.pro index 5d1f43d69..12dad3550 100644 --- a/tests/auto/client/client.pro +++ b/tests/auto/client/client.pro @@ -31,4 +31,6 @@ SOURCES += tst_client.cpp \ mockshm.cpp \ mocksurface.cpp \ mockoutput.cpp -HEADERS += mockcompositor.h mocksurface.h +HEADERS += mockcompositor.h \ + mockshm.h \ + mocksurface.h diff --git a/tests/auto/client/mockcompositor.h b/tests/auto/client/mockcompositor.h index 18de0e6cb..2d1e41836 100644 --- a/tests/auto/client/mockcompositor.h +++ b/tests/auto/client/mockcompositor.h @@ -46,8 +46,9 @@ #include <qglobal.h> #include <wayland-server.h> -#include <QRect> +#include <QImage> #include <QMutex> +#include <QRect> #include <QSharedPointer> #include <QVariant> #include <QVector> @@ -119,6 +120,8 @@ class MockSurface public: Impl::Surface *handle() const { return m_surface; } + QImage image; + private: MockSurface(Impl::Surface *surface); friend class Impl::Compositor; diff --git a/tests/auto/client/mockshm.cpp b/tests/auto/client/mockshm.cpp index 9deceebbb..5c0ba38a3 100644 --- a/tests/auto/client/mockshm.cpp +++ b/tests/auto/client/mockshm.cpp @@ -40,32 +40,28 @@ ****************************************************************************/ #include "mockcompositor.h" - -#include <QImage> +#include "mockshm.h" namespace Impl { -class ShmBuffer +ShmBuffer::ShmBuffer(wl_buffer *buffer) + : m_buffer(buffer) { -public: - ShmBuffer(wl_buffer *buffer) - : m_buffer(buffer) - { - refresh(); - } + refresh(); +} - void refresh() - { - m_image = QImage(static_cast<uint8_t *>(wl_shm_buffer_get_data(m_buffer)), - m_buffer->width, m_buffer->height, - wl_shm_buffer_get_stride(m_buffer), - QImage::Format_ARGB32_Premultiplied); - } +void ShmBuffer::refresh() +{ + m_image = QImage(static_cast<uint8_t *>(wl_shm_buffer_get_data(m_buffer)), + m_buffer->width, m_buffer->height, + wl_shm_buffer_get_stride(m_buffer), + QImage::Format_ARGB32_Premultiplied); +} -private: - wl_buffer *m_buffer; - QImage m_image; -}; +QImage ShmBuffer::image() const +{ + return m_image; +} static void shm_buffer_created(wl_buffer *buffer) { diff --git a/tests/auto/client/mocksurface.cpp b/tests/auto/client/mocksurface.cpp index 38fc955e5..68c18bac6 100644 --- a/tests/auto/client/mocksurface.cpp +++ b/tests/auto/client/mocksurface.cpp @@ -41,6 +41,7 @@ #include "mocksurface.h" #include "mockcompositor.h" +#include "mockshm.h" namespace Impl { @@ -57,39 +58,54 @@ static void surface_destroy(wl_client *, wl_resource *surfaceResource) wl_resource_destroy(surfaceResource, surface->compositor()->time()); } -void surface_attach(wl_client *client, wl_resource *surface, +void surface_attach(wl_client *client, wl_resource *surfaceResource, wl_resource *buffer, int x, int y) { Q_UNUSED(client); - Q_UNUSED(surface); - Q_UNUSED(buffer); Q_UNUSED(x); Q_UNUSED(y); - //resolve<Surface>(surface)->attach(buffer ? reinterpret_cast<wl_buffer *>(buffer->data) : 0); + + Surface *surface = static_cast<Surface *>(surfaceResource->data); + surface->m_buffer = buffer ? static_cast<wl_buffer *>(buffer->data) : 0; + + if (!buffer) + surface->m_mockSurface->image = QImage(); } -void surface_damage(wl_client *client, wl_resource *surface, +void surface_damage(wl_client *client, wl_resource *surfaceResource, int32_t x, int32_t y, int32_t width, int32_t height) { Q_UNUSED(client); - Q_UNUSED(surface); Q_UNUSED(x); Q_UNUSED(y); Q_UNUSED(width); Q_UNUSED(height); - //resolve<Surface>(surface)->damage(QRect(x, y, width, height)); + + Surface *surface = static_cast<Surface *>(surfaceResource->data); + wl_buffer *buffer = surface->m_buffer; + + if (!buffer) + return; + + if (wl_buffer_is_shm(buffer)) + surface->m_mockSurface->image = static_cast<ShmBuffer *>(buffer->user_data)->image(); + + wl_resource *frameCallback; + wl_list_for_each(frameCallback, &surface->m_frameCallbackList, link) { + wl_callback_send_done(frameCallback, surface->m_compositor->time()); + wl_resource_destroy(frameCallback, surface->m_compositor->time()); + } + + wl_list_init(&surface->m_frameCallbackList); } void surface_frame(wl_client *client, - wl_resource *surface, + wl_resource *surfaceResource, uint32_t callback) { - Q_UNUSED(client); - Q_UNUSED(surface); - Q_UNUSED(callback); -// Surface *surface = resolve<Surface>(resource); -// wl_resource *frame_callback = wl_client_add_object(client, &wl_callback_interface, 0, callback, surface); -// wl_list_insert(&surface->m_frame_callback_list, &frame_callback->link); + Surface *surface = static_cast<Surface *>(surfaceResource->data); + wl_resource *frameCallback = wl_client_add_object(client, &wl_callback_interface, 0, callback, surface); + wl_list_insert(&surface->m_frameCallbackList, &frameCallback->link); } void surface_set_opaque_region(wl_client *client, wl_resource *surfaceResource, @@ -130,6 +146,7 @@ Surface::Surface(wl_client *client, uint32_t id, Compositor *compositor) wl_client_add_resource(client, &m_surface.resource); + wl_list_init(&m_frameCallbackList); } Surface::~Surface() diff --git a/tests/auto/client/mocksurface.h b/tests/auto/client/mocksurface.h index 69ae80248..da77b3638 100644 --- a/tests/auto/client/mocksurface.h +++ b/tests/auto/client/mocksurface.h @@ -59,9 +59,18 @@ public: private: wl_surface m_surface; + wl_buffer *m_buffer; Compositor *m_compositor; QSharedPointer<MockSurface> m_mockSurface; + + wl_list m_frameCallbackList; + + friend void surface_attach(wl_client *client, wl_resource *surface, + wl_resource *buffer, int x, int y); + friend void surface_damage(wl_client *client, wl_resource *surface, + int32_t x, int32_t y, int32_t width, int32_t height); + friend void surface_frame(wl_client *client, wl_resource *surface, uint32_t callback); }; } diff --git a/tests/auto/client/tst_client.cpp b/tests/auto/client/tst_client.cpp index 9b63337c5..b6d434f8a 100644 --- a/tests/auto/client/tst_client.cpp +++ b/tests/auto/client/tst_client.cpp @@ -41,6 +41,9 @@ #include "mockcompositor.h" +#include <QBackingStore> +#include <QPainter> + #include <QtTest/QtTest> static const QSize screenSize(1600, 1200); @@ -123,10 +126,18 @@ public slots: compositor->processWaylandEvents(); } + void cleanup() + { + // make sure the surfaces from the last test are properly cleaned up + // and don't show up as false positives in the next test + QTRY_VERIFY(!compositor->surface()); + } + private slots: void screen(); void createDestroyWindow(); void events(); + void backingStore(); private: MockCompositor *compositor; @@ -192,6 +203,42 @@ void tst_WaylandClient::events() QTRY_COMPARE(window.mouseReleaseEventCount, 1); } +void tst_WaylandClient::backingStore() +{ + TestWindow window; + window.show(); + + QSharedPointer<MockSurface> surface; + QTRY_VERIFY(surface = compositor->surface()); + + QRect rect(QPoint(), window.size()); + + QBackingStore backingStore(&window); + backingStore.resize(rect.size()); + + backingStore.beginPaint(rect); + + QColor color = Qt::magenta; + + QPainter p(backingStore.paintDevice()); + p.fillRect(rect, color); + p.end(); + + backingStore.endPaint(); + + QVERIFY(surface->image.isNull()); + + backingStore.flush(rect); + + QTRY_COMPARE(surface->image.size(), rect.size()); + QTRY_COMPARE(surface->image.pixel(0, 0), color.rgba()); + + window.hide(); + + // hiding the window should detach the buffer + QTRY_VERIFY(surface->image.isNull()); +} + int main(int argc, char **argv) { setenv("XDG_RUNTIME_DIR", ".", 1); |