5527b6e483
We're going to round the workspace backgrounds in the new overview for gnome-shell 40. So far corner-rounding was only possible for StWidgets because the rounded clipping was done using cairo drawing. We now need rounded clipping for ClutterActors too because backgrounds are drawn using ClutterActors (or more specifically a ClutterContent). To implement that, first a ClutterOffscreenEffect subclass together with a fragment shader from GSK (see gskSetOutputColor() [1] in the GSK GL renderer code) was investigated, and while that was generic and worked quite well, it was extremely slow for the case of drawing wallpapers because of all the FBOs that had to be allocated. This is the new, more performant approach: Use the same fragment shader, but perform the rounded clipping right in MetaBackgroundContent while we're painting the wallpaper. This has almost no performance impact, with the downside of not being a generic solution. To allow for rounded clipping not only at the edges of the wallpaper, but using any given bounding rectangle, the API exposes not only the radius, but also a bounding rect. [1] https://gitlab.gnome.org/GNOME/gtk/-/blob/master/gsk/resources/glsl/preamble.fs.glsl Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1717>
75 lines
2.7 KiB
C
75 lines
2.7 KiB
C
/*
|
|
* meta-background-content.h: ClutterContent for painting the wallpaper
|
|
*
|
|
* Copyright 2010 Red Hat, Inc.
|
|
* Copyright 2020 Endless Foundation
|
|
*
|
|
* 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 META_BACKGROUND_CONTENT_H
|
|
#define META_BACKGROUND_CONTENT_H
|
|
|
|
#include <gdesktop-enums.h>
|
|
|
|
#include "clutter/clutter.h"
|
|
#include "meta/meta-background.h"
|
|
|
|
/**
|
|
* MetaBackgroundContent:
|
|
*
|
|
* This class handles tracking and painting the root window background.
|
|
* By integrating with #MetaWindowGroup we can avoid painting parts of
|
|
* the background that are obscured by other windows.
|
|
*/
|
|
|
|
#define META_TYPE_BACKGROUND_CONTENT (meta_background_content_get_type ())
|
|
|
|
META_EXPORT
|
|
G_DECLARE_FINAL_TYPE (MetaBackgroundContent,
|
|
meta_background_content,
|
|
META, BACKGROUND_CONTENT,
|
|
GObject)
|
|
|
|
|
|
META_EXPORT
|
|
ClutterContent *meta_background_content_new (MetaDisplay *display,
|
|
int monitor);
|
|
|
|
META_EXPORT
|
|
void meta_background_content_set_background (MetaBackgroundContent *self,
|
|
MetaBackground *background);
|
|
|
|
META_EXPORT
|
|
void meta_background_content_set_gradient (MetaBackgroundContent *self,
|
|
gboolean enabled,
|
|
int height,
|
|
double tone_start);
|
|
|
|
META_EXPORT
|
|
void meta_background_content_set_vignette (MetaBackgroundContent *self,
|
|
gboolean enabled,
|
|
double brightness,
|
|
double sharpness);
|
|
|
|
META_EXPORT
|
|
void meta_background_content_set_rounded_clip_radius (MetaBackgroundContent *self,
|
|
float radius);
|
|
|
|
META_EXPORT
|
|
void meta_background_content_set_rounded_clip_bounds (MetaBackgroundContent *self,
|
|
const graphene_rect_t *bounds);
|
|
|
|
#endif /* META_BACKGROUND_CONTENT_H */
|