11using namespace std::chrono_literals;
83 for (QRectF
rect : region) {
85 result += QRectF(r.x() * xScale, r.y() * yScale, r.width() * xScale, r.height() * yScale).toAlignedRect();
90static QRegion expandRegion(
const QRegion ®ion,
const QMargins &padding)
92 if (region.isEmpty()) {
97 for (
const QRect &rect : region) {
98 ret += rect.marginsAdded(padding);
107 const auto diff = std::chrono::steady_clock::now() - *
m_lastDamage;
124 QRegion delegateDamage = logicalDamage;
125 const qreal delegateScale = delegate->scale();
126 if (xScale != delegateScale || yScale != delegateScale) {
128 const int xPadding = std::ceil(0.5 / xScale);
129 const int yPadding = std::ceil(0.5 / yScale);
130 delegateDamage = expandRegion(delegateDamage, QMargins(xPadding, yPadding, xPadding, yPadding));
227 const QList<QRectF> region =
shape();
229 quads.reserve(region.count());
235 for (
const QRectF
rect : region) {
243 quad[0] =
WindowVertex(
rect.topLeft(), QPointF{bufferTopLeft.x() / m_bufferSize.width(), bufferTopLeft.y() / m_bufferSize.height()});
244 quad[1] =
WindowVertex(
rect.topRight(), QPointF{bufferTopRight.x() / m_bufferSize.width(), bufferTopRight.y() / m_bufferSize.height()});
245 quad[2] =
WindowVertex(
rect.bottomRight(), QPointF{bufferBottomRight.x() / m_bufferSize.width(), bufferBottomRight.y() / m_bufferSize.height()});
246 quad[3] =
WindowVertex(
rect.bottomLeft(), QPointF{bufferBottomLeft.x() / m_bufferSize.width(), bufferBottomLeft.y() / m_bufferSize.height()});
266 const auto diff = std::chrono::steady_clock::now() - *
m_lastDamage;
279 , m_texture(std::move(texture))
316 return m_texture.get();
331 return m_isDiscarded;
336 m_isDiscarded =
true;
341#include "moc_surfaceitem.cpp"
virtual bool hasAlphaChannel() const =0
virtual QSize size() const =0
GraphicsBuffer * buffer() const
WindowQuadList quads() const
void setSize(const QSizeF &size)
void scheduleRepaint(const QRectF ®ion)
virtual QList< QRectF > shape() const
QMatrix4x4 transform() const
QList< SceneDelegate * > delegates() const
OutputTransform bufferTransform() const
SurfaceItem(Scene *scene, Item *parent=nullptr)
virtual ContentType contentType() const
SurfacePixmap * previousPixmap() const
std::unique_ptr< SurfacePixmap > m_pixmap
virtual std::unique_ptr< SurfacePixmap > createPixmap()=0
void setDestinationSize(const QSizeF &size)
void setBufferTransform(OutputTransform transform)
void preprocess() override
WindowQuadList buildQuads() const override
void setBufferSize(const QSize &size)
QRectF bufferSourceBox() const
SurfacePixmap * pixmap() const
void addDamage(const QRegion ®ion)
std::chrono::nanoseconds m_frameTimeEstimation
int m_referencePixmapCounter
OutputTransform m_surfaceToBufferTransform
void setBufferSourceBox(const QRectF &box)
std::unique_ptr< SurfacePixmap > m_previousPixmap
QSizeF destinationSize() const
void unreferencePreviousPixmap()
std::deque< std::chrono::nanoseconds > m_lastDamageTimeDiffs
std::optional< std::chrono::steady_clock::time_point > m_lastDamage
OutputTransform m_bufferToSurfaceTransform
void referencePreviousPixmap()
QRegion mapFromBuffer(const QRegion ®ion) const
std::chrono::nanoseconds frameTimeEstimation() const
GraphicsBufferOrigin m_bufferOrigin
GraphicsBufferRef m_bufferRef
GraphicsBuffer * buffer() const
SurfacePixmap(std::unique_ptr< SurfaceTexture > &&texture, QObject *parent=nullptr)
SurfaceTexture * texture() const
GraphicsBufferOrigin bufferOrigin() const
void setBufferOrigin(GraphicsBufferOrigin origin)
void setBuffer(GraphicsBuffer *buffer)
bool hasAlphaChannel() const
virtual ~SurfaceTexture()
Class representing one area of a window.
KWIN_EXPORT QPointF snapToPixelGridF(const QPointF &point)