KWin
Loading...
Searching...
No Matches
renderviewport.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2023 Xaver Hugl <xaver.hugl@gmail.com>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
7#include "core/pixelgrid.h"
8#include "core/rendertarget.h"
9#include "effect/globals.h"
10
11namespace KWin
12{
13
14static QMatrix4x4 createProjectionMatrix(const RenderTarget &renderTarget, const QRect &rect)
15{
16 QMatrix4x4 ret;
17
18 ret.scale(1, -1); // flip the y axis back
19 ret *= renderTarget.transform().toMatrix();
20 ret.scale(1, -1); // undo ortho() flipping the y axis
21
22 ret.ortho(rect);
23 return ret;
24}
25
26RenderViewport::RenderViewport(const QRectF &renderRect, double scale, const RenderTarget &renderTarget)
27 : m_transform(renderTarget.transform())
28 , m_transformBounds(m_transform.map(renderTarget.size()))
29 , m_renderRect(renderRect)
30 , m_deviceRenderRect(snapToPixelGrid(scaledRect(renderRect, scale)))
31 , m_projectionMatrix(createProjectionMatrix(renderTarget, m_deviceRenderRect))
32 , m_scale(scale)
33{
34}
35
37{
38 return m_projectionMatrix;
39}
40
42{
43 return m_renderRect;
44}
45
47{
48 return m_scale;
49}
50
51QRectF RenderViewport::mapToRenderTarget(const QRectF &logicalGeometry) const
52{
53 const QRectF deviceGeometry = scaledRect(logicalGeometry, m_scale)
54 .translated(-m_deviceRenderRect.topLeft());
55 return m_transform.map(deviceGeometry, m_transformBounds);
56}
57
58QRect RenderViewport::mapToRenderTarget(const QRect &logicalGeometry) const
59{
60 const QRect deviceGeometry = snapToPixelGrid(scaledRect(logicalGeometry, m_scale))
61 .translated(-m_deviceRenderRect.topLeft());
62 return m_transform.map(deviceGeometry, m_transformBounds);
63}
64
65QPoint RenderViewport::mapToRenderTarget(const QPoint &logicalGeometry) const
66{
67 const QPoint devicePoint = snapToPixelGrid(QPointF(logicalGeometry) * m_scale) - m_deviceRenderRect.topLeft();
68 return m_transform.map(devicePoint, m_transformBounds);
69}
70
71QPointF RenderViewport::mapToRenderTarget(const QPointF &logicalGeometry) const
72{
73 const QPointF devicePoint = logicalGeometry * m_scale - m_deviceRenderRect.topLeft();
74 return m_transform.map(devicePoint, m_transformBounds);
75}
76
77QRegion RenderViewport::mapToRenderTarget(const QRegion &logicalGeometry) const
78{
79 QRegion ret;
80 for (const auto &rect : logicalGeometry) {
81 ret += mapToRenderTarget(rect);
82 }
83 return ret;
84}
85
86QRectF RenderViewport::mapToRenderTargetTexture(const QRectF &logicalGeometry) const
87{
88 return scaledRect(logicalGeometry, m_scale)
89 .translated(-m_deviceRenderRect.topLeft());
90}
91
92QRect RenderViewport::mapToRenderTargetTexture(const QRect &logicalGeometry) const
93{
94 return snapToPixelGrid(scaledRect(logicalGeometry, m_scale))
95 .translated(-m_deviceRenderRect.topLeft());
96}
97
98QPoint RenderViewport::mapToRenderTargetTexture(const QPoint &logicalGeometry) const
99{
100 return snapToPixelGrid(QPointF(logicalGeometry) * m_scale) - m_deviceRenderRect.topLeft();
101}
102
103QPointF RenderViewport::mapToRenderTargetTexture(const QPointF &logicalGeometry) const
104{
105 return logicalGeometry * m_scale - m_deviceRenderRect.topLeft();
106}
107
108QRegion RenderViewport::mapToRenderTargetTexture(const QRegion &logicalGeometry) const
109{
110 QRegion ret;
111 for (const auto &rect : logicalGeometry) {
112 ret += mapToRenderTargetTexture(rect);
113 }
114 return ret;
115}
116}
QSizeF map(const QSizeF &size) const
Definition output.cpp:242
QRectF mapToRenderTargetTexture(const QRectF &logicalGeometry) const
QMatrix4x4 projectionMatrix() const
RenderViewport(const QRectF &renderRect, double scale, const RenderTarget &renderTarget)
QRectF renderRect() const
QRectF mapToRenderTarget(const QRectF &logicalGeometry) const
KWIN_EXPORT QPoint snapToPixelGrid(const QPointF &point)
Definition pixelgrid.h:16
KWIN_EXPORT QRectF scaledRect(const QRectF &rect, qreal scale)
Definition globals.h:243