File indexing completed on 2024-05-12 05:32:08
0001 /* 0002 SPDX-FileCopyrightText: 2021 Vlad Zahorodnii <vlad.zahorodnii@kde.org> 0003 0004 SPDX-License-Identifier: GPL-2.0-or-later 0005 */ 0006 0007 #pragma once 0008 0009 #include "core/graphicsbuffer.h" 0010 #include "core/output.h" 0011 #include "scene/item.h" 0012 0013 #include <deque> 0014 0015 namespace KWin 0016 { 0017 0018 class SurfacePixmap; 0019 class Window; 0020 0021 /** 0022 * The SurfaceItem class represents a surface with some contents. 0023 */ 0024 class KWIN_EXPORT SurfaceItem : public Item 0025 { 0026 Q_OBJECT 0027 0028 public: 0029 QSizeF destinationSize() const; 0030 void setDestinationSize(const QSizeF &size); 0031 0032 QRectF bufferSourceBox() const; 0033 void setBufferSourceBox(const QRectF &box); 0034 0035 OutputTransform bufferTransform() const; 0036 void setBufferTransform(OutputTransform transform); 0037 0038 QSize bufferSize() const; 0039 void setBufferSize(const QSize &size); 0040 0041 QRegion mapFromBuffer(const QRegion ®ion) const; 0042 0043 void addDamage(const QRegion ®ion); 0044 void resetDamage(); 0045 QRegion damage() const; 0046 0047 void discardPixmap(); 0048 void updatePixmap(); 0049 void destroyPixmap(); 0050 0051 SurfacePixmap *pixmap() const; 0052 SurfacePixmap *previousPixmap() const; 0053 0054 void referencePreviousPixmap(); 0055 void unreferencePreviousPixmap(); 0056 0057 virtual ContentType contentType() const; 0058 0059 virtual void freeze(); 0060 0061 std::chrono::nanoseconds frameTimeEstimation() const; 0062 0063 Q_SIGNALS: 0064 void damaged(); 0065 0066 protected: 0067 explicit SurfaceItem(Scene *scene, Item *parent = nullptr); 0068 0069 virtual std::unique_ptr<SurfacePixmap> createPixmap() = 0; 0070 void preprocess() override; 0071 WindowQuadList buildQuads() const override; 0072 0073 QRegion m_damage; 0074 OutputTransform m_bufferToSurfaceTransform; 0075 OutputTransform m_surfaceToBufferTransform; 0076 QRectF m_bufferSourceBox; 0077 QSize m_bufferSize; 0078 QSizeF m_destinationSize; 0079 std::unique_ptr<SurfacePixmap> m_pixmap; 0080 std::unique_ptr<SurfacePixmap> m_previousPixmap; 0081 int m_referencePixmapCounter = 0; 0082 std::deque<std::chrono::nanoseconds> m_lastDamageTimeDiffs; 0083 std::optional<std::chrono::steady_clock::time_point> m_lastDamage; 0084 std::chrono::nanoseconds m_frameTimeEstimation = std::chrono::days(1000); 0085 }; 0086 0087 class KWIN_EXPORT SurfaceTexture 0088 { 0089 public: 0090 virtual ~SurfaceTexture(); 0091 0092 virtual bool isValid() const = 0; 0093 }; 0094 0095 class KWIN_EXPORT SurfacePixmap : public QObject 0096 { 0097 Q_OBJECT 0098 0099 public: 0100 explicit SurfacePixmap(std::unique_ptr<SurfaceTexture> &&texture, QObject *parent = nullptr); 0101 0102 GraphicsBuffer *buffer() const; 0103 void setBuffer(GraphicsBuffer *buffer); 0104 0105 GraphicsBufferOrigin bufferOrigin() const; 0106 void setBufferOrigin(GraphicsBufferOrigin origin); 0107 0108 SurfaceTexture *texture() const; 0109 0110 bool hasAlphaChannel() const; 0111 QSize size() const; 0112 0113 bool isDiscarded() const; 0114 void markAsDiscarded(); 0115 0116 virtual void create() = 0; 0117 virtual void update(); 0118 0119 virtual bool isValid() const = 0; 0120 0121 protected: 0122 GraphicsBufferRef m_bufferRef; 0123 GraphicsBufferOrigin m_bufferOrigin = GraphicsBufferOrigin::TopLeft; 0124 QSize m_size; 0125 bool m_hasAlphaChannel = false; 0126 0127 private: 0128 std::unique_ptr<SurfaceTexture> m_texture; 0129 bool m_isDiscarded = false; 0130 }; 0131 0132 } // namespace KWin