2008-05-07 14:43:13 +00:00
|
|
|
/********************************************************************
|
|
|
|
KWin - the KDE window manager
|
|
|
|
This file is part of the KDE project.
|
|
|
|
|
|
|
|
Copyright (C) 2008 Lubos Lunak <l.lunak@kde.org>
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*********************************************************************/
|
|
|
|
|
|
|
|
#ifndef KWIN_XRENDERUTILS_H
|
|
|
|
#define KWIN_XRENDERUTILS_H
|
|
|
|
|
2013-02-26 07:02:27 +00:00
|
|
|
// KWin
|
2014-03-16 14:49:21 +00:00
|
|
|
#include <kwinxrenderutils_export.h>
|
2013-02-26 07:02:27 +00:00
|
|
|
// Qt
|
2014-03-18 13:34:36 +00:00
|
|
|
#include <QExplicitlySharedDataPointer>
|
2013-02-26 07:02:27 +00:00
|
|
|
#include <QRegion>
|
|
|
|
#include <QVector>
|
|
|
|
// XCB
|
2013-02-06 06:58:33 +00:00
|
|
|
#include <xcb/xfixes.h>
|
2008-05-07 14:43:13 +00:00
|
|
|
|
2013-02-12 09:57:27 +00:00
|
|
|
class QColor;
|
2013-02-26 07:02:27 +00:00
|
|
|
class QPixmap;
|
2013-02-12 09:57:27 +00:00
|
|
|
|
2008-05-07 14:43:13 +00:00
|
|
|
/** @addtogroup kwineffects */
|
|
|
|
/** @{ */
|
|
|
|
|
|
|
|
namespace KWin
|
|
|
|
{
|
2008-06-06 09:11:52 +00:00
|
|
|
/**
|
2013-02-12 09:57:27 +00:00
|
|
|
* dumps a QColor into a xcb_render_color_t
|
2019-07-29 18:58:33 +00:00
|
|
|
*/
|
2014-03-16 14:49:21 +00:00
|
|
|
KWINXRENDERUTILS_EXPORT xcb_render_color_t preMultiply(const QColor &c, float opacity = 1.0);
|
2008-05-07 14:43:13 +00:00
|
|
|
|
|
|
|
/** @internal */
|
2014-03-16 14:49:21 +00:00
|
|
|
class KWINXRENDERUTILS_EXPORT XRenderPictureData
|
2008-05-07 14:43:13 +00:00
|
|
|
: public QSharedData
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
public:
|
2013-02-12 08:16:42 +00:00
|
|
|
explicit XRenderPictureData(xcb_render_picture_t pic = XCB_RENDER_PICTURE_NONE);
|
2011-01-30 14:34:42 +00:00
|
|
|
~XRenderPictureData();
|
2013-02-12 08:16:42 +00:00
|
|
|
xcb_render_picture_t value();
|
2011-01-30 14:34:42 +00:00
|
|
|
private:
|
2013-02-12 08:16:42 +00:00
|
|
|
xcb_render_picture_t picture;
|
2011-01-30 14:34:42 +00:00
|
|
|
Q_DISABLE_COPY(XRenderPictureData)
|
|
|
|
};
|
2008-05-07 14:43:13 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @short Wrapper around XRender Picture.
|
|
|
|
*
|
2008-05-08 10:08:10 +00:00
|
|
|
* This class wraps XRender's Picture, providing proper initialization,
|
|
|
|
* convenience constructors and freeing of resources.
|
|
|
|
* It should otherwise act exactly like the Picture type.
|
2019-07-29 18:58:33 +00:00
|
|
|
*/
|
2014-03-16 14:49:21 +00:00
|
|
|
class KWINXRENDERUTILS_EXPORT XRenderPicture
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
|
|
|
public:
|
2013-02-12 08:16:42 +00:00
|
|
|
explicit XRenderPicture(xcb_render_picture_t pic = XCB_RENDER_PICTURE_NONE);
|
2013-08-04 12:50:25 +00:00
|
|
|
explicit XRenderPicture(const QImage &img);
|
2013-02-12 08:16:42 +00:00
|
|
|
XRenderPicture(xcb_pixmap_t pix, int depth);
|
|
|
|
operator xcb_render_picture_t();
|
2011-01-30 14:34:42 +00:00
|
|
|
private:
|
2013-08-25 14:17:20 +00:00
|
|
|
void fromImage(const QImage &img);
|
2014-03-18 13:34:36 +00:00
|
|
|
QExplicitlySharedDataPointer< XRenderPictureData > d;
|
2011-01-30 14:34:42 +00:00
|
|
|
};
|
2008-05-07 14:43:13 +00:00
|
|
|
|
2014-03-16 14:49:21 +00:00
|
|
|
class KWINXRENDERUTILS_EXPORT XFixesRegion
|
2013-02-06 06:58:33 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
explicit XFixesRegion(const QRegion ®ion);
|
|
|
|
virtual ~XFixesRegion();
|
|
|
|
|
|
|
|
operator xcb_xfixes_region_t();
|
|
|
|
private:
|
|
|
|
xcb_xfixes_region_t m_region;
|
|
|
|
};
|
|
|
|
|
2008-05-07 14:43:13 +00:00
|
|
|
inline
|
2013-02-12 08:16:42 +00:00
|
|
|
XRenderPictureData::XRenderPictureData(xcb_render_picture_t pic)
|
2011-01-30 14:34:42 +00:00
|
|
|
: picture(pic)
|
|
|
|
{
|
|
|
|
}
|
2008-05-07 14:43:13 +00:00
|
|
|
|
|
|
|
inline
|
2013-02-12 08:16:42 +00:00
|
|
|
xcb_render_picture_t XRenderPictureData::value()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2008-05-07 14:43:13 +00:00
|
|
|
return picture;
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2008-05-07 14:43:13 +00:00
|
|
|
|
|
|
|
inline
|
2013-02-12 08:16:42 +00:00
|
|
|
XRenderPicture::XRenderPicture(xcb_render_picture_t pic)
|
2011-01-30 14:34:42 +00:00
|
|
|
: d(new XRenderPictureData(pic))
|
|
|
|
{
|
|
|
|
}
|
2008-05-07 14:43:13 +00:00
|
|
|
|
|
|
|
inline
|
2013-02-12 08:16:42 +00:00
|
|
|
XRenderPicture::operator xcb_render_picture_t()
|
2011-01-30 14:34:42 +00:00
|
|
|
{
|
2008-05-07 14:43:13 +00:00
|
|
|
return d->value();
|
2011-01-30 14:34:42 +00:00
|
|
|
}
|
2008-05-07 14:43:13 +00:00
|
|
|
|
2013-02-06 06:58:33 +00:00
|
|
|
inline
|
|
|
|
XFixesRegion::operator xcb_xfixes_region_t()
|
|
|
|
{
|
|
|
|
return m_region;
|
|
|
|
}
|
|
|
|
|
2009-05-12 14:12:46 +00:00
|
|
|
/**
|
|
|
|
* Static 1x1 picture used to deliver a black pixel with given opacity (for blending performance)
|
|
|
|
* Call and Use, the PixelPicture will stay, but may change it's opacity meanwhile. It's NOT threadsafe either
|
2019-07-29 18:58:33 +00:00
|
|
|
*/
|
2014-03-16 14:49:21 +00:00
|
|
|
KWINXRENDERUTILS_EXPORT XRenderPicture xRenderBlendPicture(double opacity);
|
2008-06-06 09:11:52 +00:00
|
|
|
/**
|
|
|
|
* Creates a 1x1 Picture filled with c
|
2019-07-29 18:58:33 +00:00
|
|
|
*/
|
2014-03-16 14:49:21 +00:00
|
|
|
KWINXRENDERUTILS_EXPORT XRenderPicture xRenderFill(const xcb_render_color_t &c);
|
|
|
|
KWINXRENDERUTILS_EXPORT XRenderPicture xRenderFill(const QColor &c);
|
2008-06-06 09:11:52 +00:00
|
|
|
|
2012-03-04 08:52:32 +00:00
|
|
|
/**
|
|
|
|
* Allows to render a window into a (transparent) pixmap
|
|
|
|
* NOTICE: the result can be queried as xRenderWindowOffscreenTarget()
|
|
|
|
* NOTICE: it may be 0
|
|
|
|
* NOTICE: when done call setXRenderWindowOffscreen(false) to continue normal render process
|
2019-07-29 18:58:33 +00:00
|
|
|
*/
|
2014-03-16 14:49:21 +00:00
|
|
|
KWINXRENDERUTILS_EXPORT void setXRenderOffscreen(bool b);
|
2012-03-04 08:52:32 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Allows to define a persistent effect member as render target
|
|
|
|
* The window (including shadows) is rendered into the top left corner
|
|
|
|
* NOTICE: do NOT call setXRenderOffscreen(true) in addition!
|
|
|
|
* NOTICE: do not forget to xRenderPopTarget once you're done to continue the normal render process
|
2019-07-29 18:58:33 +00:00
|
|
|
*/
|
2014-03-16 14:49:21 +00:00
|
|
|
KWINXRENDERUTILS_EXPORT void xRenderPushTarget(XRenderPicture *pic);
|
|
|
|
KWINXRENDERUTILS_EXPORT void xRenderPopTarget();
|
2012-03-04 08:52:32 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Whether windows are currently rendered into an offscreen target buffer
|
2019-07-29 18:58:33 +00:00
|
|
|
*/
|
2014-03-16 14:49:21 +00:00
|
|
|
KWINXRENDERUTILS_EXPORT bool xRenderOffscreen();
|
2012-03-04 08:52:32 +00:00
|
|
|
/**
|
|
|
|
* The offscreen buffer as set by the renderer because of setXRenderWindowOffscreen(true)
|
2019-07-29 18:58:33 +00:00
|
|
|
*/
|
2014-03-16 14:49:21 +00:00
|
|
|
KWINXRENDERUTILS_EXPORT xcb_render_picture_t xRenderOffscreenTarget();
|
2012-03-04 08:52:32 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* NOTICE: HANDS OFF!!!
|
|
|
|
* scene_setXRenderWindowOffscreenTarget() is ONLY to be used by the renderer - DO NOT TOUCH!
|
2019-07-29 18:58:33 +00:00
|
|
|
*/
|
2014-03-16 14:49:21 +00:00
|
|
|
KWINXRENDERUTILS_EXPORT void scene_setXRenderOffscreenTarget(xcb_render_picture_t pix);
|
2012-03-04 08:52:32 +00:00
|
|
|
/**
|
|
|
|
* scene_xRenderWindowOffscreenTarget() is used by the scene to figure the target set by an effect
|
2019-07-29 18:58:33 +00:00
|
|
|
*/
|
2014-03-16 14:49:21 +00:00
|
|
|
KWINXRENDERUTILS_EXPORT XRenderPicture *scene_xRenderOffscreenTarget();
|
2012-03-04 08:52:32 +00:00
|
|
|
|
2014-03-16 14:06:04 +00:00
|
|
|
namespace XRenderUtils
|
|
|
|
{
|
|
|
|
/**
|
|
|
|
* @internal
|
2019-07-29 18:58:33 +00:00
|
|
|
*/
|
2014-03-16 14:49:21 +00:00
|
|
|
KWINXRENDERUTILS_EXPORT void init(xcb_connection_t *connection, xcb_window_t rootWindow);
|
2014-03-16 14:06:04 +00:00
|
|
|
|
2014-08-28 18:19:26 +00:00
|
|
|
/**
|
|
|
|
* Returns the Xrender format that corresponds to the given visual ID.
|
2019-07-29 18:58:33 +00:00
|
|
|
*/
|
2014-08-28 18:19:26 +00:00
|
|
|
KWINXRENDERUTILS_EXPORT xcb_render_pictformat_t findPictFormat(xcb_visualid_t visual);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the xcb_render_directformat_t for the given Xrender format.
|
2019-07-29 18:58:33 +00:00
|
|
|
*/
|
2014-08-28 18:19:26 +00:00
|
|
|
KWINXRENDERUTILS_EXPORT const xcb_render_directformat_t *findPictFormatInfo(xcb_render_pictformat_t format);
|
|
|
|
|
2016-06-01 08:21:19 +00:00
|
|
|
/**
|
|
|
|
* @internal
|
2019-07-29 18:58:33 +00:00
|
|
|
*/
|
2016-06-01 08:21:19 +00:00
|
|
|
KWINXRENDERUTILS_EXPORT void cleanup();
|
|
|
|
|
2014-08-28 18:19:26 +00:00
|
|
|
} // namespace XRenderUtils
|
|
|
|
|
|
|
|
} // namespace KWin
|
2008-05-07 14:43:13 +00:00
|
|
|
|
|
|
|
/** @} */
|
|
|
|
|
|
|
|
#endif
|