21 : m_painter(std::make_unique<QPainter>())
31 return std::make_unique<ImageItem>(scene, parent);
36 return m_painter.get();
41 QImage *buffer = renderTarget.
image();
42 m_painter->begin(buffer);
43 m_painter->setWindow(viewport.
renderRect().toRect());
53 m_painter->setCompositionMode(QPainter::CompositionMode_Source);
54 for (
const QRect &rect : region) {
55 m_painter->fillRect(rect, Qt::transparent);
57 m_painter->setCompositionMode(QPainter::CompositionMode_SourceOver);
62 QRegion region = _region;
66 region &= boundingRect;
69 if (region.isEmpty()) {
74 m_painter->setClipRegion(region);
75 m_painter->setClipping(
true);
76 m_painter->setOpacity(data.
opacity());
96 for (
Item *childItem : sortedChildItems) {
97 if (childItem->z() >= 0) {
100 if (childItem->explicitVisible()) {
106 if (
auto surfaceItem = qobject_cast<SurfaceItem *>(item)) {
107 renderSurfaceItem(
painter, surfaceItem);
108 }
else if (
auto decorationItem = qobject_cast<DecorationItem *>(item)) {
109 renderDecorationItem(
painter, decorationItem);
110 }
else if (
auto imageItem = qobject_cast<ImageItem *>(item)) {
111 renderImageItem(
painter, imageItem);
114 for (Item *childItem : sortedChildItems) {
115 if (childItem->z() < 0) {
118 if (childItem->explicitVisible()) {
126void ItemRendererQPainter::renderSurfaceItem(QPainter *painter, SurfaceItem *surfaceItem)
const
128 const SurfacePixmap *surfaceTexture = surfaceItem->pixmap();
129 if (!surfaceTexture || !surfaceTexture->isValid()) {
133 QPainterSurfaceTexture *platformSurfaceTexture =
134 static_cast<QPainterSurfaceTexture *
>(surfaceTexture->texture());
135 if (!platformSurfaceTexture->isValid()) {
136 platformSurfaceTexture->create();
138 platformSurfaceTexture->update(surfaceItem->damage());
140 surfaceItem->resetDamage();
142 const OutputTransform surfaceToBufferTransform = surfaceItem->bufferTransform();
143 const QSizeF transformedSize = surfaceToBufferTransform.map(surfaceItem->destinationSize());
146 switch (surfaceToBufferTransform.kind()) {
150 painter->translate(transformedSize.height(), 0);
154 painter->translate(transformedSize.width(), transformedSize.height());
158 painter->translate(0, transformedSize.width());
162 painter->translate(transformedSize.width(), 0);
170 painter->translate(0, transformedSize.height());
175 painter->translate(transformedSize.height(), transformedSize.width());
181 const QRectF sourceBox = surfaceItem->bufferSourceBox();
182 const qreal xSourceBoxScale = sourceBox.width() / transformedSize.width();
183 const qreal ySourceBoxScale = sourceBox.height() / transformedSize.height();
185 const QList<QRectF> shape = surfaceItem->shape();
186 for (
const QRectF rect : shape) {
187 const QRectF target = surfaceToBufferTransform.map(rect, surfaceItem->size());
188 const QRectF source(sourceBox.x() + target.x() * xSourceBoxScale,
189 sourceBox.y() + target.y() * ySourceBoxScale,
190 target.width() * xSourceBoxScale,
191 target.height() * ySourceBoxScale);
193 painter->drawImage(target, platformSurfaceTexture->image(), source);
199void ItemRendererQPainter::renderDecorationItem(QPainter *painter, DecorationItem *decorationItem)
const
201 const auto renderer =
static_cast<const SceneQPainterDecorationRenderer *
>(decorationItem->renderer());
202 QRectF dtr, dlr, drr, dbr;
203 decorationItem->window()->layoutDecorationRects(dlr, dtr, drr, dbr);
211void ItemRendererQPainter::renderImageItem(QPainter *painter, ImageItem *imageItem)
const
213 painter->drawImage(imageItem->rect(), imageItem->image());
virtual void preprocess()
QList< Item * > sortedChildItems() const
QRectF boundingRect() const
QRegion mapToGlobal(const QRegion ®ion) const
void renderBackground(const RenderTarget &renderTarget, const RenderViewport &viewport, const QRegion ®ion) override
void renderItem(const RenderTarget &renderTarget, const RenderViewport &viewport, Item *item, int mask, const QRegion ®ion, const WindowPaintData &data) override
QPainter * painter() const override
~ItemRendererQPainter() override
std::unique_ptr< ImageItem > createImageItem(Scene *scene, Item *parent=nullptr) override
void beginFrame(const RenderTarget &renderTarget, const RenderViewport &viewport) override
QRectF renderRect() const
@ PAINT_SCREEN_TRANSFORMED
@ PAINT_WINDOW_TRANSFORMED
qreal yTranslation() const
qreal xTranslation() const