diff --git a/src/core/output.cpp b/src/core/output.cpp index bba5aea4a8..c393e32948 100644 --- a/src/core/output.cpp +++ b/src/core/output.cpp @@ -142,6 +142,19 @@ QRectF OutputTransform::map(const QRectF &rect, const QSizeF &bounds) const return dest; } +QSizeF OutputTransform::map(const QSizeF &size) const +{ + switch (m_kind) { + case Kind::Normal: + case Kind::Rotated180: + case Kind::Flipped: + case Kind::Flipped180: + return size; + default: + return size.transposed(); + } +} + Output::Output(QObject *parent) : QObject(parent) { diff --git a/src/core/output.h b/src/core/output.h index 54625b170b..8d570445eb 100644 --- a/src/core/output.h +++ b/src/core/output.h @@ -75,6 +75,11 @@ public: */ OutputTransform inverted() const; + /** + * Applies the output transform to the given @a size. + */ + QSizeF map(const QSizeF &size) const; + /** * Applies the output transform to the given @a rect within a buffer with dimensions @a bounds. */ diff --git a/src/wayland/surface_interface.cpp b/src/wayland/surface_interface.cpp index 262f9493df..54412323ca 100644 --- a/src/wayland/surface_interface.cpp +++ b/src/wayland/surface_interface.cpp @@ -486,12 +486,13 @@ QRectF SurfaceInterfacePrivate::computeBufferSourceBox() const return QRectF(0, 0, bufferSize.width(), bufferSize.height()); } + const QSizeF bounds = current.bufferTransform.map(bufferSize); const QRectF box(current.viewport.sourceGeometry.x() * current.bufferScale, current.viewport.sourceGeometry.y() * current.bufferScale, current.viewport.sourceGeometry.width() * current.bufferScale, current.viewport.sourceGeometry.height() * current.bufferScale); - return current.bufferTransform.inverted().map(box, bufferSize); + return current.bufferTransform.inverted().map(box, bounds); } void SurfaceState::mergeInto(SurfaceState *target)