KWin
Loading...
Searching...
No Matches
effect.cpp
Go to the documentation of this file.
1/*
2 SPDX-FileCopyrightText: 2006 Lubos Lunak <l.lunak@kde.org>
3 SPDX-FileCopyrightText: 2009 Lucas Murray <lmurray@undefinedfire.com>
4 SPDX-FileCopyrightText: 2018 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
5
6 SPDX-License-Identifier: GPL-2.0-or-later
7*/
8
9#include "effect/effect.h"
11
12#include <KConfigGroup>
13
14#include <QMatrix4x4>
15#include <QVector3D>
16
17namespace KWin
18{
19
21{
23 mask &= ~Effect::PAINT_WINDOW_OPAQUE;
24 opaque = QRegion(); // cannot clip, will be transparent
25}
26
31
33{
34public:
36 : scale(1., 1., 1.)
37 , rotationAxis(0, 0, 1.)
38 , rotationAngle(0.)
39 {
40 }
41 QVector3D scale;
42 QVector3D translation;
43
44 QVector3D rotationAxis;
45 QVector3D rotationOrigin;
47};
48
50 : d(std::make_unique<PaintDataPrivate>())
51{
52}
53
54PaintData::~PaintData() = default;
55
56qreal PaintData::xScale() const
57{
58 return d->scale.x();
59}
60
61qreal PaintData::yScale() const
62{
63 return d->scale.y();
64}
65
66qreal PaintData::zScale() const
67{
68 return d->scale.z();
69}
70
71void PaintData::setScale(const QVector2D &scale)
72{
73 d->scale.setX(scale.x());
74 d->scale.setY(scale.y());
75}
76
77void PaintData::setScale(const QVector3D &scale)
78{
79 d->scale = scale;
80}
81void PaintData::setXScale(qreal scale)
82{
83 d->scale.setX(scale);
84}
85
86void PaintData::setYScale(qreal scale)
87{
88 d->scale.setY(scale);
89}
90
91void PaintData::setZScale(qreal scale)
92{
93 d->scale.setZ(scale);
94}
95
96const QVector3D &PaintData::scale() const
97{
98 return d->scale;
99}
100
101void PaintData::setXTranslation(qreal translate)
102{
103 d->translation.setX(translate);
104}
105
106void PaintData::setYTranslation(qreal translate)
107{
108 d->translation.setY(translate);
109}
110
111void PaintData::setZTranslation(qreal translate)
112{
113 d->translation.setZ(translate);
114}
115
116void PaintData::translate(qreal x, qreal y, qreal z)
117{
118 translate(QVector3D(x, y, z));
119}
120
121void PaintData::translate(const QVector3D &t)
122{
123 d->translation += t;
124}
125
127{
128 return d->translation.x();
129}
130
132{
133 return d->translation.y();
134}
135
137{
138 return d->translation.z();
139}
140
141const QVector3D &PaintData::translation() const
142{
143 return d->translation;
144}
145
147{
148 return d->rotationAngle;
149}
150
151QVector3D PaintData::rotationAxis() const
152{
153 return d->rotationAxis;
154}
155
157{
158 return d->rotationOrigin;
159}
160
162{
163 d->rotationAngle = angle;
164}
165
166void PaintData::setRotationAxis(Qt::Axis axis)
167{
168 switch (axis) {
169 case Qt::XAxis:
170 setRotationAxis(QVector3D(1, 0, 0));
171 break;
172 case Qt::YAxis:
173 setRotationAxis(QVector3D(0, 1, 0));
174 break;
175 case Qt::ZAxis:
176 setRotationAxis(QVector3D(0, 0, 1));
177 break;
178 }
179}
180
181void PaintData::setRotationAxis(const QVector3D &axis)
182{
183 d->rotationAxis = axis;
184}
185
186void PaintData::setRotationOrigin(const QVector3D &origin)
187{
188 d->rotationOrigin = origin;
189}
190
191QMatrix4x4 PaintData::toMatrix(qreal deviceScale) const
192{
193 QMatrix4x4 ret;
194 if (d->translation != QVector3D(0, 0, 0)) {
195 ret.translate(d->translation * deviceScale);
196 }
197 if (d->scale != QVector3D(1, 1, 1)) {
198 ret.scale(d->scale);
199 }
200
201 if (d->rotationAngle != 0) {
202 ret.translate(d->rotationOrigin * deviceScale);
203 ret.rotate(d->rotationAngle, d->rotationAxis);
204 ret.translate(-d->rotationOrigin * deviceScale);
205 }
206
207 return ret;
208}
209
211{
212public:
213 qreal opacity;
219};
220
222 : WindowPaintData(QMatrix4x4())
223{
224}
225
226WindowPaintData::WindowPaintData(const QMatrix4x4 &projectionMatrix)
227 : PaintData()
228 , d(std::make_unique<WindowPaintDataPrivate>())
229{
231 setOpacity(1.0);
232 setSaturation(1.0);
233 setBrightness(1.0);
234 setScreen(0);
236}
237
239 : PaintData()
240 , d(std::make_unique<WindowPaintDataPrivate>())
241{
242 setXScale(other.xScale());
243 setYScale(other.yScale());
244 setZScale(other.zScale());
245 translate(other.translation());
249 setOpacity(other.opacity());
250 setSaturation(other.saturation());
251 setBrightness(other.brightness());
252 setScreen(other.screen());
255}
256
258
260{
261 return d->opacity;
262}
263
265{
266 return d->saturation;
267}
268
270{
271 return d->brightness;
272}
273
275{
276 return d->screen;
277}
278
280{
281 d->opacity = opacity;
282}
283
284void WindowPaintData::setSaturation(qreal saturation) const
285{
286 d->saturation = saturation;
287}
288
289void WindowPaintData::setBrightness(qreal brightness)
290{
291 d->brightness = brightness;
292}
293
294void WindowPaintData::setScreen(int screen) const
295{
296 d->screen = screen;
297}
298
300{
301 return d->crossFadeProgress;
302}
303
305{
306 d->crossFadeProgress = std::clamp(factor, 0.0, 1.0);
307}
308
310{
311 d->opacity *= factor;
312 return d->opacity;
313}
314
316{
317 d->saturation *= factor;
318 return d->saturation;
319}
320
322{
323 d->brightness *= factor;
324 return d->brightness;
325}
326
327void WindowPaintData::setProjectionMatrix(const QMatrix4x4 &matrix)
328{
329 d->projectionMatrix = matrix;
330}
331
333{
334 return d->projectionMatrix;
335}
336
338{
339 return d->projectionMatrix;
340}
341
343{
344 this->setXScale(this->xScale() * scale);
345 this->setYScale(this->yScale() * scale);
346 this->setZScale(this->zScale() * scale);
347 return *this;
348}
349
351{
352 this->setXScale(this->xScale() * scale.x());
353 this->setYScale(this->yScale() * scale.y());
354 return *this;
355}
356
358{
359 this->setXScale(this->xScale() * scale.x());
360 this->setYScale(this->yScale() * scale.y());
361 this->setZScale(this->zScale() * scale.z());
362 return *this;
363}
364
366{
367 return this->operator+=(QVector3D(translation));
368}
369
371{
372 return this->operator+=(QVector3D(translation));
373}
374
375WindowPaintData &WindowPaintData::operator+=(const QVector2D &translation)
376{
377 return this->operator+=(QVector3D(translation));
378}
379
380WindowPaintData &WindowPaintData::operator+=(const QVector3D &translation)
381{
383 return *this;
384}
385
386Effect::Effect(QObject *parent)
387 : QObject(parent)
388{
389}
390
392{
393}
394
395void Effect::reconfigure(ReconfigureFlags)
396{
397}
398
400{
401}
402
404{
405}
406
408{
409 return false;
410}
411
412void Effect::prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime)
413{
414 effects->prePaintScreen(data, presentTime);
415}
416
417void Effect::paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion &region, Output *screen)
418{
419 effects->paintScreen(renderTarget, viewport, mask, region, screen);
420}
421
426
427void Effect::prePaintWindow(EffectWindow *w, WindowPrePaintData &data, std::chrono::milliseconds presentTime)
428{
429 effects->prePaintWindow(w, data, presentTime);
430}
431
432void Effect::paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, QRegion region, WindowPaintData &data)
433{
434 effects->paintWindow(renderTarget, viewport, w, mask, region, data);
435}
436
441
443{
444 return false;
445}
446
448{
449 return true;
450}
451
452QString Effect::debug(const QString &) const
453{
454 return QString();
455}
456
457void Effect::drawWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion &region, WindowPaintData &data)
458{
459 effects->drawWindow(renderTarget, viewport, w, mask, region, data);
460}
461
463 const QRect &r, Qt::AspectRatioMode aspect)
464{
465 QSizeF size = w->size();
466 size.scale(r.size(), aspect);
467 data.setXScale(size.width() / double(w->width()));
468 data.setYScale(size.height() / double(w->height()));
469 int width = int(w->width() * data.xScale());
470 int height = int(w->height() * data.yScale());
471 int x = r.x() + (r.width() - width) / 2;
472 int y = r.y() + (r.height() - height) / 2;
473 region = QRect(x, y, width, height);
474 data.setXTranslation(x - w->x());
475 data.setYTranslation(y - w->y());
476}
477
479{
480 return effects->cursorPos();
481}
482
483double Effect::animationTime(const KConfigGroup &cfg, const QString &key, int defaultTime)
484{
485 int time = cfg.readEntry(key, 0);
486 return time != 0 ? time : std::max(defaultTime * effects->animationTimeFactor(), 1.);
487}
488
489double Effect::animationTime(int defaultTime)
490{
491 // at least 1ms, otherwise 0ms times can break some things
492 return std::max(defaultTime * effects->animationTimeFactor(), 1.);
493}
494
496{
497 return 0;
498}
499
500bool Effect::touchDown(qint32 id, const QPointF &pos, std::chrono::microseconds time)
501{
502 return false;
503}
504
505bool Effect::touchMotion(qint32 id, const QPointF &pos, std::chrono::microseconds time)
506{
507 return false;
508}
509
510bool Effect::touchUp(qint32 id, std::chrono::microseconds time)
511{
512 return false;
513}
514
515bool Effect::perform(Feature feature, const QVariantList &arguments)
516{
517 return false;
518}
519
520bool Effect::tabletToolEvent(QTabletEvent *event)
521{
522 return false;
523}
524
525bool Effect::tabletToolButtonEvent(uint button, bool pressed, quint64 tabletToolId)
526{
527 return false;
528}
529
530bool Effect::tabletPadButtonEvent(uint button, bool pressed, void *tabletPadId)
531{
532 return false;
533}
534
535bool Effect::tabletPadStripEvent(int number, int position, bool isFinger, void *tabletPadId)
536{
537 return false;
538}
539
540bool Effect::tabletPadRingEvent(int number, int position, bool isFinger, void *tabletPadId)
541{
542 return false;
543}
544
546{
547 return true;
548}
549
553
557
559{
560 return true;
561}
562
564{
565 return true;
566}
567
568} // namespace KWin
569
570#include "moc_effect.cpp"
Base class for all KWin effects.
Definition effect.h:535
Representation of a window used by/for Effect classes.
void drawWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion &region, WindowPaintData &data)
void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion &region, Output *screen)
void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion &region, WindowPaintData &data)
void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime)
void prePaintWindow(EffectWindow *w, WindowPrePaintData &data, std::chrono::milliseconds presentTime)
void postPaintWindow(EffectWindow *w)
QVector3D translation
Definition effect.cpp:42
QVector3D rotationAxis
Definition effect.cpp:44
QVector3D rotationOrigin
Definition effect.cpp:45
void setRotationAngle(qreal angle)
Definition effect.cpp:161
virtual QString debug(const QString &parameter) const
Definition effect.cpp:452
virtual void paintWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, QRegion region, WindowPaintData &data)
Definition effect.cpp:432
void setYTranslation(qreal translate)
Definition effect.cpp:106
virtual void postPaintScreen()
Definition effect.cpp:422
virtual int requestedEffectChainPosition() const
Definition effect.cpp:495
virtual bool tabletPadStripEvent(int number, int position, bool isFinger, void *tabletPadId)
Definition effect.cpp:535
~EffectPluginFactory() override
Definition effect.cpp:554
void setProjectionMatrix(const QMatrix4x4 &matrix)
Definition effect.cpp:327
qreal crossFadeProgress() const
Definition effect.cpp:299
QVector3D rotationOrigin() const
Definition effect.cpp:156
static void setPositionTransformations(WindowPaintData &data, QRect &region, EffectWindow *w, const QRect &r, Qt::AspectRatioMode aspect)
Definition effect.cpp:462
virtual void drawWindow(const RenderTarget &renderTarget, const RenderViewport &viewport, EffectWindow *w, int mask, const QRegion &region, WindowPaintData &data)
Definition effect.cpp:457
virtual void prePaintWindow(EffectWindow *w, WindowPrePaintData &data, std::chrono::milliseconds presentTime)
Definition effect.cpp:427
const QVector3D & scale() const
Definition effect.cpp:96
virtual void prePaintScreen(ScreenPrePaintData &data, std::chrono::milliseconds presentTime)
Definition effect.cpp:412
virtual bool provides(Feature)
Definition effect.cpp:442
virtual bool touchDown(qint32 id, const QPointF &pos, std::chrono::microseconds time)
Definition effect.cpp:500
qreal saturation() const
Definition effect.cpp:264
qreal multiplySaturation(qreal factor)
Definition effect.cpp:315
void setXTranslation(qreal translate)
Definition effect.cpp:101
WindowPaintData & operator+=(const QPointF &translation)
Definition effect.cpp:365
virtual void paintScreen(const RenderTarget &renderTarget, const RenderViewport &viewport, int mask, const QRegion &region, Output *screen)
Definition effect.cpp:417
virtual bool tabletPadRingEvent(int number, int position, bool isFinger, void *tabletPadId)
Definition effect.cpp:540
virtual bool isSupported() const
Definition effect.cpp:563
static QPointF cursorPos()
Definition effect.cpp:478
~Effect() override
Definition effect.cpp:391
virtual bool touchMotion(qint32 id, const QPointF &pos, std::chrono::microseconds time)
Definition effect.cpp:505
virtual bool tabletToolButtonEvent(uint button, bool pressed, quint64 tabletToolId)
Definition effect.cpp:525
virtual bool isActive() const
Definition effect.cpp:447
void setScreen(int screen) const
Definition effect.cpp:294
qreal multiplyOpacity(qreal factor)
Definition effect.cpp:309
void setXScale(qreal scale)
Definition effect.cpp:81
virtual bool perform(Feature feature, const QVariantList &arguments)
Definition effect.cpp:515
QMatrix4x4 toMatrix(qreal deviceScale) const
Definition effect.cpp:191
void setOpacity(qreal opacity)
Definition effect.cpp:279
void setSaturation(qreal saturation) const
Definition effect.cpp:284
const QVector3D & translation() const
Definition effect.cpp:141
qreal yTranslation() const
Definition effect.cpp:131
virtual void reconfigure(ReconfigureFlags flags)
Definition effect.cpp:395
void setRotationAxis(const QVector3D &axis)
Definition effect.cpp:181
qreal yScale() const
Definition effect.cpp:61
virtual ~PaintData()
virtual void windowInputMouseEvent(QEvent *e)
Definition effect.cpp:399
Effect(QObject *parent=nullptr)
Definition effect.cpp:386
virtual bool blocksDirectScanout() const
Definition effect.cpp:545
void setBrightness(qreal brightness)
Definition effect.cpp:289
QMatrix4x4 projectionMatrix() const
Definition effect.cpp:332
qreal brightness() const
Definition effect.cpp:269
void setScale(const QVector2D &scale)
Definition effect.cpp:71
qreal multiplyBrightness(qreal factor)
Definition effect.cpp:321
virtual void postPaintWindow(EffectWindow *w)
Definition effect.cpp:437
virtual bool tabletPadButtonEvent(uint button, bool pressed, void *tabletPadId)
Definition effect.cpp:530
qreal zTranslation() const
Definition effect.cpp:136
static double animationTime(const KConfigGroup &cfg, const QString &key, int defaultTime)
Definition effect.cpp:483
qreal zScale() const
Definition effect.cpp:66
void setRotationOrigin(const QVector3D &origin)
Definition effect.cpp:186
void setYScale(qreal scale)
Definition effect.cpp:86
virtual void grabbedKeyboardEvent(QKeyEvent *e)
Definition effect.cpp:403
virtual bool borderActivated(ElectricBorder border)
Definition effect.cpp:407
QVector3D rotationAxis() const
Definition effect.cpp:151
qreal xScale() const
Definition effect.cpp:56
qreal xTranslation() const
Definition effect.cpp:126
qreal opacity() const
Definition effect.cpp:259
~WindowPaintData() override
WindowPaintData & operator*=(qreal scale)
Definition effect.cpp:342
virtual bool enabledByDefault() const
Definition effect.cpp:558
virtual bool tabletToolEvent(QTabletEvent *event)
Definition effect.cpp:520
virtual bool touchUp(qint32 id, std::chrono::microseconds time)
Definition effect.cpp:510
void translate(qreal x, qreal y=0.0, qreal z=0.0)
Definition effect.cpp:116
int screen() const
Definition effect.cpp:274
void setZTranslation(qreal translate)
Definition effect.cpp:111
qreal rotationAngle() const
Definition effect.cpp:146
void setZScale(qreal scale)
Definition effect.cpp:91
void setCrossFadeProgress(qreal factor)
Sets the cross fading factor to fade over with previously sized window. If 1.0 only the current windo...
Definition effect.cpp:304
QMatrix4x4 & rprojectionMatrix()
Definition effect.cpp:337
@ PAINT_WINDOW_TRANSFORMED
Definition effect.h:552
@ PAINT_WINDOW_TRANSLUCENT
Definition effect.h:548
ElectricBorder
Definition globals.h:60
EffectsHandler * effects