17#include <KDecoration2/DecoratedClient> 
   18#include <KDecoration2/Decoration> 
   25    , m_imageSizesDirty(true)
 
   27    connect(
client->decoration(), &KDecoration2::Decoration::damaged,
 
   30    connect(
client->decoration(), &KDecoration2::Decoration::bordersChanged,
 
 
   46        addDamage(m_client->window()->rect().toAlignedRect());
 
   48    m_imageSizesDirty = 
true;
 
 
   75    return m_devicePixelRatio;
 
 
   80    if (m_devicePixelRatio != dpr) {
 
   81        m_devicePixelRatio = dpr;
 
 
   88    client()->decoration()->paint(painter, rect);
 
 
   94    , m_decoration(decoration)
 
   99            this, &DecorationItem::handleOutputChanged);
 
  101    connect(decoration->client(), &KDecoration2::DecoratedClient::sizeChanged,
 
  102            this, &DecorationItem::handleDecorationGeometryChanged);
 
  103    connect(decoration, &KDecoration2::Decoration::bordersChanged,
 
  104            this, &DecorationItem::handleDecorationGeometryChanged);
 
  110    handleOutputChanged();
 
 
  115    QRectF left, top, right, bottom;
 
  117    return {left, top, right, bottom};
 
 
  125    QRectF left, top, right, bottom;
 
  131    const QMargins roundingPad = QMargins(1, 1, 1, 1);
 
  132    QRegion roundedLeft = left.toAlignedRect().marginsRemoved(roundingPad);
 
  133    QRegion roundedTop = top.toAlignedRect().marginsRemoved(roundingPad);
 
  134    QRegion roundedRight = right.toAlignedRect().marginsRemoved(roundingPad);
 
  135    QRegion roundedBottom = bottom.toAlignedRect().marginsRemoved(roundingPad);
 
  137    return roundedLeft | roundedTop | roundedRight | roundedBottom;
 
 
  142    const QRegion damage = m_renderer->damage();
 
  143    if (!damage.isEmpty()) {
 
  144        m_renderer->render(damage);
 
  145        m_renderer->resetDamage();
 
 
  149void DecorationItem::handleOutputChanged()
 
  155    m_output = m_window->
output();
 
  158        handleOutputScaleChanged();
 
  163void DecorationItem::handleOutputScaleChanged()
 
  165    const qreal dpr = m_output->scale();
 
  166    if (m_renderer->devicePixelRatio() != dpr) {
 
  167        m_renderer->setDevicePixelRatio(dpr);
 
  172void DecorationItem::handleDecorationGeometryChanged()
 
  180    return m_renderer.get();
 
 
  189                     const qreal devicePixelRatio, 
bool rotated)
 
  191    const QRectF &r = partRect;
 
  194    const int x0 = r.x();
 
  195    const int y0 = r.y();
 
  196    const int x1 = r.x() + r.width();
 
  197    const int y1 = r.y() + r.height();
 
  201        const int u0 = textureOffset.y() + p;
 
  202        const int v0 = textureOffset.x() + p;
 
  203        const int u1 = textureOffset.y() + p + std::round(r.width() * devicePixelRatio);
 
  204        const int v1 = textureOffset.x() + p + std::round(r.height() * devicePixelRatio);
 
  211        const int u0 = textureOffset.x() + p;
 
  212        const int v0 = textureOffset.y() + p;
 
  213        const int u1 = textureOffset.x() + p + std::round(r.width() * devicePixelRatio);
 
  214        const int v1 = textureOffset.y() + p + std::round(r.height() * devicePixelRatio);
 
 
  230    QRectF left, top, right, bottom;
 
  231    const qreal devicePixelRatio = m_renderer->effectiveDevicePixelRatio();
 
  236    const int topHeight = std::round(top.height() * devicePixelRatio);
 
  237    const int bottomHeight = std::round(bottom.height() * devicePixelRatio);
 
  238    const int leftWidth = std::round(left.width() * devicePixelRatio);
 
  240    const QPoint topPosition(0, 0);
 
  241    const QPoint bottomPosition(0, topPosition.y() + topHeight + (2 * texturePad));
 
  242    const QPoint leftPosition(0, bottomPosition.y() + bottomHeight + (2 * texturePad));
 
  243    const QPoint rightPosition(0, leftPosition.y() + leftWidth + (2 * texturePad));
 
  246    if (left.isValid()) {
 
  247        list.append(
buildQuad(left, leftPosition, devicePixelRatio, 
true));
 
  250        list.append(
buildQuad(top, topPosition, devicePixelRatio, 
false));
 
  252    if (right.isValid()) {
 
  253        list.append(
buildQuad(right, rightPosition, devicePixelRatio, 
true));
 
  255    if (bottom.isValid()) {
 
  256        list.append(
buildQuad(bottom, bottomPosition, devicePixelRatio, 
false));
 
 
  263#include "moc_decorationitem.cpp" 
WorkspaceScene * scene() const
static Compositor * self()
KDecoration2::DecoratedClient * decoratedClient()
void preprocess() override
WindowQuadList buildQuads() const override
DecorationRenderer * renderer() const
QList< QRectF > shape() const override final
DecorationItem(KDecoration2::Decoration *decoration, Window *window, Scene *scene, Item *parent=nullptr)
QRegion opaque() const override final
static const int TexturePad
void renderToPainter(QPainter *painter, const QRect &rect)
void damaged(const QRegion ®ion)
DecorationRenderer(Decoration::DecoratedClientImpl *client)
Decoration::DecoratedClientImpl * client() const
void addDamage(const QRegion ®ion)
qreal devicePixelRatio() const
qreal effectiveDevicePixelRatio() const
void setDevicePixelRatio(qreal dpr)
void setSize(const QSizeF &size)
void scheduleRepaint(const QRectF ®ion)
Decoration::DecoratedClientImpl * decoratedClient() const
QMargins frameMargins() const
void layoutDecorationRects(QRectF &left, QRectF &top, QRectF &right, QRectF &bottom) const
Class representing one area of a window.
virtual std::unique_ptr< DecorationRenderer > createDecorationRenderer(Decoration::DecoratedClientImpl *)=0
WindowQuad buildQuad(const QRectF &partRect, const QPoint &textureOffset, const qreal devicePixelRatio, bool rotated)