![]() |
Louvre
v2.9.0-1
C++ library for Wayland compositors
|
A display rendering interface. More...
Public Types | |
enum | State |
Output state. More... | |
enum | SubPixel |
Subpixel geometry. More... | |
![]() | |
enum class | Type : Int32 |
Base factory object types. More... | |
Public Member Functions | |
LOutput (const void *params) noexcept | |
Constructor of the LOutput class. More... | |
~LOutput () | |
Destructor of the LOutput class. More... | |
State | state () const noexcept |
Gets the current state of the LOutput. More... | |
LPainter * | painter () const noexcept |
Gets access to the associated LPainter. More... | |
LSessionLockRole * | sessionLockRole () const noexcept |
Session Lock Surface. More... | |
const std::list< LExclusiveZone * > | exclusiveZones () const noexcept |
Retrieves all exclusive zones assigned to this output. More... | |
const LRect & | availableGeometry () const noexcept |
Retrieves the rect within the output that is not occupied by exclusive zones. More... | |
const LMargins & | exclusiveEdges () const noexcept |
Gets the sum of the space occupied by exclusive zones for each edge. More... | |
LFramebuffer * | framebuffer () const noexcept |
Returns a pointer to the associated framebuffer. More... | |
LTransform | transform () const noexcept |
Gets the framebuffer transform. More... | |
void | setTransform (LTransform transform) noexcept |
Sets the framebuffer transform. More... | |
Int32 | currentBuffer () const noexcept |
Returns the index of the current buffer. More... | |
UInt32 | buffersCount () const noexcept |
Returns the count of available buffers. More... | |
LTexture * | bufferTexture (UInt32 bufferIndex) noexcept |
Access the texture of a specific buffer. More... | |
bool | hasBufferDamageSupport () const noexcept |
Checks if the output supports buffer damage tracking. More... | |
void | setBufferDamage (const LRegion *damage) noexcept |
Specifies the damage generated during the last painGL() event. More... | |
const LRegion & | bufferDamage () const noexcept |
Retrieves the damage region set by setBufferDamage(). More... | |
SubPixel | subPixel () const noexcept |
Gets the layout of RGB subpixels for a single pixel on a display. More... | |
bool | setCustomScanoutBuffer (LTexture *texture) noexcept |
Sets a custom scanout buffer for a single frame. More... | |
bool | hasVSyncControlSupport () const noexcept |
Checks if VSync control is supported for this output. More... | |
bool | vSyncEnabled () const noexcept |
Checks if VSync is enabled (enabled by default). More... | |
bool | enableVSync (bool enabled) noexcept |
Turns VSync on or off. More... | |
Int32 | refreshRateLimit () const noexcept |
Gets the refresh rate limit in Hz when VSync is disabled. More... | |
void | setRefreshRateLimit (Int32 hz) noexcept |
Sets the refresh rate limit in Hz when VSync is disabled. More... | |
UInt32 | gammaSize () const noexcept |
Gets the size of the gamma table. More... | |
bool | setGamma (const LGammaTable *gamma) noexcept |
Sets the gamma correction table for the output. More... | |
const std::vector< LOutputMode * > & | modes () const noexcept |
Available modes. More... | |
const LOutputMode * | preferredMode () const noexcept |
Gets the preferred mode. More... | |
const LOutputMode * | currentMode () const noexcept |
Gets the current mode. More... | |
void | setMode (const LOutputMode *mode) noexcept |
Sets the output mode. More... | |
void | setScale (Float32 scale) noexcept |
Sets the output scale factor. More... | |
Float32 | scale () const noexcept |
Retrieves the current output scale factor. More... | |
Float32 | fractionalScale () const noexcept |
Gets the same scale set with setScale(). More... | |
bool | usingFractionalScale () const noexcept |
Checks if the scale factor set with setScale() is fractional. More... | |
bool | fractionalOversamplingEnabled () const noexcept |
Checks if oversampling is enabled. More... | |
void | enableFractionalOversampling (bool enabled) noexcept |
Toggles oversampling for fractional scales. More... | |
void | repaint () noexcept |
Unlocks the rendering thread. More... | |
bool | needsFullRepaint () const noexcept |
Indicates that the entire output needs repainting. More... | |
Int32 | dpi () noexcept |
Gets the dots per inch (DPI) of the output. More... | |
const LRect & | rect () const noexcept |
Gets the output rect. More... | |
const LPoint & | pos () const noexcept |
Gets the output position. More... | |
void | setPos (const LPoint &pos) noexcept |
Set the position of the output. More... | |
const LSize & | size () const noexcept |
Gets the output size in surface units. More... | |
const LSize & | sizeB () const noexcept |
Gets the output size in buffer units. More... | |
const LSize & | realBufferSize () const noexcept |
Retrieves the real destination buffer size. More... | |
const LSize & | physicalSize () const noexcept |
Gets the physical dimensions of the output. More... | |
const std::vector< LScreenshotRequest * > & | screenshotRequests () const noexcept |
Screen capture requests. More... | |
LContentType | contentType () const noexcept |
The content type hint set with setContentType(). More... | |
void | setContentType (LContentType type) noexcept |
Sets the content type hint. More... | |
const char * | name () const noexcept |
Gets the output name. More... | |
const char * | model () const noexcept |
Gets the output model name. More... | |
const char * | manufacturer () const noexcept |
Gets the manufacturer name of the output. More... | |
const char * | description () const noexcept |
Gets the description of the output. More... | |
const std::thread::id & | threadId () const noexcept |
Gets the ID of the rendering thread. More... | |
![]() | |
Type | factoryObjectType () const noexcept |
Gets the base factory object type. More... | |
![]() | |
LObject (const LObject &) noexcept | |
Copy constructor. More... | |
LObject & | operator= (const LObject &) noexcept |
Assignment operator (each object has its own individual LWeak reference count). More... | |
void | setUserData (UIntPtr data) const noexcept |
Store an unsigned integer value/pointer. More... | |
UIntPtr | userData () const noexcept |
Retrieves the stored unsigned integer value/pointer. More... | |
Virtual Methods | |
virtual void | initializeGL () |
Initialize Event. More... | |
virtual void | paintGL () |
Paint Event. More... | |
virtual void | resizeGL () |
Resize Event. More... | |
virtual void | moveGL () |
Move Event. More... | |
virtual void | uninitializeGL () |
Uninitialize Event. More... | |
virtual void | setGammaRequest (LClient *client, const LGammaTable *gamma) |
Set gamma table request. More... | |
virtual void | availableGeometryChanged () |
Notifies a change in availableGeometry(). More... | |
Additional Inherited Members | |
![]() | |
LObject () noexcept=default | |
Constructor of the LObject class. More... | |
virtual | ~LObject () noexcept |
Destructor of the LObject class. More... | |
void | notifyDestruction () noexcept |
Notifies the object destruction. More... | |
A display rendering interface.
The LOutput class is responsible for rendering content to a display. It is typically associated with a physical screen, but could also represent a toplevel window within Wayland desktop, depending on the selected graphic backend.
During compositor initialization, the graphic backend creates an LOutput for each available display through LCompositor::createObjectRequest().
These can be accessed via the LSeat::outputs() vector.
After the compositor has been initialized, the number of available outputs can change. These changes are notified through the LSeat::outputPlugged() and LSeat::outputUnplugged() events.
By default, all outputs are uninitialized. To initialize an output, use LCompositor::addOutput(), as done in the default implementation of LCompositor::initialized() and LSeat::outputPlugged().
When an output is successfully initialized, it is added to LCompositor::outputs() and a new output-specific rendering thread and shared OpenGL context are created, triggering the initializeGL() event.
To uninitialize an output, use LCompositor::removeOutput(). This will invoke the uninitializeGL() event, destroy the rendering thread and OpenGL context and remove the output from LCompositor::outputs().
The rendering thread loop remains blocked until repaint() is called, which unlocks the thread and asynchronously triggers the paintGL() event.
All painting operations must occur exclusively within a paintGL() event, as rendering elsewhere will not be visible on the screen.
Calling repaint() multiple times will only unlock the thread once. After or during a paintGL() event, repaint() must be called again to unlock the thread once more.
In Louvre, even if there is a main thread and each initialized LOutput has its own rendering thread, no single block of user code executes in parallel (unless you create custom threads, of course). For instance, all xxxGL() events never overlap with other events or requests being handled in separate threads.
You may be wondering why the need to use rendering threads then?
The answer is that calling rendering functions (in this case OpenGL functions) takes almost no time (except for glFinish()). Rendering commands are queued and processed later together with a page flip. For instance, if your monitor has a 60 Hz refresh rate (approximately 16 ms period), a paintGL() call may take 1 ms to be processed while the presentation on screen could take up to 15 ms (with V-Sync on). However, during those 15 ms, the main thread or other rendering threads can continue working. This allows Louvre compositors to maintain a constant high refresh rate compared to single-threaded designs.
Each output has its own OpenGL context and its own instance of LPainter, accessible via painter().
You can use LPainter methods to render colored rectangles or textures, use OpenGL directly with your own shaders/programs, or rely on the LScene class.
LScene can render views optimally by considering surface damage, opaque regions, and other factors to significantly improve performance.
Each LOutput has at least one mode. An LOutputMode contains information about the resolution and refresh rate at which the output can operate.
You can access the modes of an output using modes() and set the desired one with setMode().
By default, outputs use the preferredMode(), which typically has the highest refresh rate and resolution.
If you change an output's mode or scale while it is initialized, the resizeGL() event is triggered.
Outputs, like surfaces, can be positioned within the compositor-global coordinate space similarly to how a system settings panel operates.
You can adjust the position of an output using setPos(). This will later trigger the moveGL() event if the position changes.
Many screens nowadays are HiDPI, so it is commonly required to apply a scaling factor to prevent content from appearing tiny on the screen.
By default, all outputs have a scaling factor of 1, meaning no scaling is applied. To assign the scale factor use setScale(), which modifies the size returned by size() (same as rect().size()
).
In Louvre, you typically need to deal with two type of units: buffer units and surface units.
In buffer units, the scale factor is not taken into account, and the dimensions always have maximum granularity.
For example, if a screen has a resolution of 2000x1000px, its size in buffer units would be the same: 2000x1000px, which is returned by sizeB().
However, the compositor-global coordinate space uses surface units, which is equal to the buffer size divided by the applied scale factor.
Therefore, if a scale factor of 2 applied to the screen, its size in surface units would be 1000x500, which is returned by size() and rect().size()
.
Let's look at an example to make these concepts clearer:
Let's assume you have two displays, one with a resolution of 1000x500px and another with 2000x1000px (double the resolution), but both with a physical size of 22''. This means that the space occupied by 1px on the blue screen accommodates 4px on the pink screen.
If you were to see them in real life, side by side they would look like this:
If you assign the same scaling factor of 1 to both screens, their sizes in surface units would be the same as in buffer units.
Therefore, from the compositor-global coordinate space point of view they would be arranged like this:
And if you were to see them in real life, they would look like the following. In the pink screen, everything would appear tiny, half the size of the blue screen. And as you can see, if you were to drag an application window from one screen to another, it would look somewhat odd.
Now, let's imagine that you assign a scaling factor of 2 to the pink screen. In this case, the compositor-global coordiante space would look as follows:
And therefore, if you were to see them in real life now, the UI elements dimensions would appear consistently.
Therefore, in summary, the size of a screen in surface units is determined by dividing its buffer size by the applied scale factor.
Louvre also supports fractional scaling, albeit with some differences compared to integer scaling. For instance, if you assign a scale factor of 1.5 using setScale() to the pink screen, the resulting applied scale (obtained with scale()) will be ceil(1.5) = 2. However, the buffer dimensions of the screen will simulate being 2/1.5 times larger than its current mode (rounded), resulting in 2668 x 1334 for this case. Consequently, its size in surface coordinates would be 2668 x 1334 divided by 2. As a result, the compositor-global coordinate space would appear as follows:
This creates the illusion of rendering on a larger screen, the result of which is actually scaled to the real size, allowing for the desired scaling effect.
Rendering using fractional scaling, however, can introduce undesired visual effects like aliasing, especially noticeable when moving elements with textures containing fine details. For this reason, Louvre offers the option to render using oversampling, where all the screen content is rendered into a larger buffer, and then that rendered buffer is scaled down to the actual screen framebuffer. This method almost completely eliminates aliasing but has the disadvantage of consuming more computational power, potentially decreasing performance. Without oversampling the content is directly rendered on the screen, making it efficient but retaining aliasing artifacts.
Louvre allows you to toggle oversampling on and off instantly at any time using enableFractionalOversampling(). For example, you could enable it when displaying a desktop with floating windows and disable it when displaying a fullscreen window.
Clients supporting the fractional scaling protocol are instructed to scale their buffers directly to the fractional scale.
On the other hand, clients lacking support for the protocol are advised to use ceil(fractional scale), ensuring a consistently high-detail appearance.
Louvre supports applying transforms to outputs with setTransform().
Let's imagine that you physically rotate the pink monitor 90° clockwise while maintaining the same normal transform on both. What you would see is the following:
Given that you rotated the screen 90° clockwise, it is necessary to apply a transform that rotates the screen 90° counter-clockwise (LTransform::Rotated90). If you apply this to the pink screen, then you would see the following:
Note that when applying a transformation containing a 90° or 270° rotation to an output, the components of sizeB(), size() and rect().size()
are swapped (their width becomes the height, and the height becomes the width). The compositor-global coordiante space is structured in such a way that you can continue rendering in the same manner as if the screens were in their normal transform state. Therefore, there's no need to worry about rotating or flipping the elements you draw unless you decide not to use LPainter or LScene for rendering.
All outputs have VSync enabled by default. Disabling VSync may not always be supported, refer to hasVSyncControlSupport().
VSync can be toggled using enableVSync(). When VSync is disabled, Louvre limits the frame rate to double the refresh rate of the currentMode() by default. This setting can be changed with setRefreshRateLimit().
Clients using the Tearing Protocol can indicate their preference for each individual surface.
See LSurface::preferVSync() and LSurface::preferVSyncChanged() for more details.
enum State |
Output state.
enum SubPixel |
Subpixel geometry.
This enumeration provides information about how the physical pixels on an output are laid out.
|
noexcept |
Constructor of the LOutput class.
params | Internal parameters provided in LCompositor::createObjectRequest(). |
~LOutput | ( | ) |
Destructor of the LOutput class.
Invoked after LCompositor::onAnticipatedObjectDestruction().
|
noexcept |
Gets the current state of the LOutput.
This method returns the current state of the output.
|
noexcept |
|
noexcept |
Session Lock Surface.
When a client requests to lock the user session (see LSessionLockManager), it creates an LSessionLockRole surface for each initialized output whith a size equals to the output size().
If the session is locked and there is no LSessionLockRole assigned to this output, the compositor should still avoid rendering any user-related content.
nullptr
if the session is not locked or the locking client didn't create one.
|
noexcept |
Retrieves all exclusive zones assigned to this output.
The order of the list determines how zones anchored to the same edge are stacked. Zones listed first are positioned closer to the output's edge. Additionally, the order affects their predominance: zones listed later adjust their space to avoid occluding those listed earlier.
|
noexcept |
Retrieves the rect within the output that is not occupied by exclusive zones.
The available geometry defines the space within an output where, for example, LToplevelRole surfaces should be constrained to prevent occluding UI elements like a panel.
The rect is in output-local surface coordinates.
|
noexcept |
Gets the sum of the space occupied by exclusive zones for each edge.
This function provides margins that represent the total area taken up by the exclusive zones along each edge of the output.
|
noexcept |
Returns a pointer to the associated framebuffer.
|
noexcept |
Gets the framebuffer transform.
This method returns the current framebuffer transform applied with setTransform().
The default value is LTransform::Normal.
|
noexcept |
Sets the framebuffer transform.
This method sets the output transform, allowing you to adjust the orientation/flipping of the output.
If the specified transform includes a 90 or 270-degree rotation, the width and height of the output are swapped accordingly.
transform | The framebuffer transformation to apply. |
|
noexcept |
Returns the index of the current buffer.
Compositors commonly employ double or triple buffering. This involves rendering to one buffer while displaying another, prventing visual artifacts like tearing.
|
noexcept |
Returns the count of available buffers.
This method returns the number of buffers used by the output. It can be 2 or 3 depending on the graphic backend configuration.
Access the texture of a specific buffer.
This method allows access to the texture associated with a particular buffer index.
bufferIndex | The index of the buffer for which the texture is to be accessed. |
nullptr
if texture access is not supported.nullptr
is returned.
|
noexcept |
Checks if the output supports buffer damage tracking.
Some graphic backends/hardware can benefit from knowing which regions of the framebuffer have changed within a paintGL() event.
This method indicates whether buffer damage support is available.
true
if the graphical backend supports buffer damage tracking, false
otherwise.
|
noexcept |
Specifies the damage generated during the last painGL() event.
The bufferDamage() is automatically reset just before the subsequent paintGL() event.
When using LScene for rendering, damage calculation is handled automatically with this method being called inside LScene::handlePaintGL().
damage | The damaged region of the output in compositor-global coordinates. Providing an empty region indicates no damage, while passing nullptr implies the entire output is damaged. |
|
noexcept |
Retrieves the damage region set by setBufferDamage().
Before each paintGL() event, the compositor automatically clears the damage region and marks the entire output as damaged by adding rect().
|
noexcept |
Gets the layout of RGB subpixels for a single pixel on a display.
The layout of subpixels can impact the display of elements like fonts.
|
noexcept |
Sets a custom scanout buffer for a single frame.
This method allows you to replace the screen framebuffer during a single frame with a custom one, such as a fullscreen surface, preventing rendering using OpenGL and thus reducing GPU consumption and latency.
The graphic backend will check if the format is supported and if the dimensions match the current output mode. If that's the case, true
is returned, and the currentBuffer() index is not updated after this frame. Also, no painting operations should be performed as they will simply not make it to the screen.
While a custom buffer is being displayed:
The custom buffer is displayed during a single frame. To display it again, this method should be called in subsequent frames.
If not set during a frame, or nullptr
is passed as texture, the internal output framebuffers are restored, the currentBuffer() index continues to update as usual and needsFullRepaint() is set to true
for one frame.
texture | The texture to scan or nullptr to restore the internal output framebuffers. |
true
if the buffer is going to be displayed, false
if the internal output framebuffers will be displayed.
|
noexcept |
Checks if VSync control is supported for this output.
true
if VSync control is supported, false
if VSync is always enabled.
|
noexcept |
Checks if VSync is enabled (enabled by default).
true
if VSync is enabled, false
otherwise.
|
noexcept |
Turns VSync on or off.
enabled | true to enable VSync, false to disable. |
true
if VSync was successfully enabled or disabled, false
if VSync control is not supported (see hasVSyncControlSupport()).
|
noexcept |
Gets the refresh rate limit in Hz when VSync is disabled.
A value less than 0 indicates the limit is disabled.
A value equal to 0 indicates the limit is double the current output mode refresh rate (the default).
Any other positive value represents the limit in Hz.
|
noexcept |
Sets the refresh rate limit in Hz when VSync is disabled.
A value less than 0 indicates the limit is disabled.
A value equal to 0 indicates the limit is double the current output mode refresh rate (the default).
Any other positive value represents the limit in Hz.
hz | The refresh rate limit in Hz when VSync is disabled. |
|
noexcept |
Gets the size of the gamma table.
|
noexcept |
Sets the gamma correction table for the output.
This method allows to set the gamma correction table for the output.
gamma | A pointer to the LGammaTable with a size matching gammaSize(). Passing nullptr restores the default table (linear). |
true
if the gamma correction table was successfully set, false
otherwise.
|
noexcept |
Available modes.
This method returns a vector containing all the available output modes for the LOutput instance.
|
noexcept |
Gets the preferred mode.
This method returns the preferred mode for the output. It is generally the mode with the highest refresh rate and resolution.
Set by default. See setMode().
|
noexcept |
Gets the current mode.
This method returns the current output mode set with setMode().
|
noexcept |
Sets the output mode.
Use this method to assign a mode to the output, which must be one of the available modes listed in modes().
If the mode changes and the output is already initialized the resizeGL() event is triggered.
GL
events is not allowed, as it could potentially lead to a deadlock. In such cases, the method is simply ignored to prevent issues.
|
noexcept |
Sets the output scale factor.
Use this method to adjust the scale factor of the output. By default, outputs have a scale factor of 1.
Increasing the scale factor, such as setting it to 2, is often suitable for high-definition displays (when dpi() >= 200). It's common for clients to adapt their surface scales to match the scale of the output where they are displayed.
If the scale changes and the output is already initialized, the resizeGL() event will be triggered.
scale | The desired scale factor to set. |
|
noexcept |
Retrieves the current output scale factor.
This method returns the current scale factor assigned to the output using setScale(). The default scale factor is 1.
If the assigned scale is fractional this value is equal to ceil(scale).
|
noexcept |
|
noexcept |
Checks if the scale factor set with setScale() is fractional.
true
if the scale factor is fractional, false
otherwise.
|
noexcept |
Checks if oversampling is enabled.
Oversampling is enabled by default when a fractional scale is set using setScale().
It is always disabled when using an integer scale. You can disable oversampling using enableFractionalOversampling().
true
if oversampling is enabled, false
otherwise.
|
noexcept |
Toggles oversampling for fractional scales.
enabled | true to enable oversampling for fractional scales, false to disable. |
|
noexcept |
Unlocks the rendering thread.
Calling this method unlocks the output rendering thread, triggering a subsequent paintGL() event.
Regardless of the number of repaint() calls within the same frame, paintGL() is invoked only once.
To unlock the rendering thread again, repaint() must be called within or after a paintGL() event.
|
noexcept |
Indicates that the entire output needs repainting.
This hint from the graphic backend suggests that the entire output should be repainted, possibly because it doesn't support damage tracking or for other reasons.
|
noexcept |
Gets the dots per inch (DPI) of the output.
This method calculates and returns the dots per inch (DPI) of the output, considering its physical dimensions and the resolution provided by its current mode.
|
noexcept |
|
noexcept |
|
noexcept |
Set the position of the output.
This method allows you to assign the position of the output in compositor-global coordinates, with the upper-left corner as the origin.
If the position changes while the output is initialized, the moveGL() event is triggered.
pos | The new position of the output in compositor-global coordinates. |
|
noexcept |
Gets the output size in surface units.
This method provides the size of the output in surface units, based on its current mode and scale factor.
It is equivalent to the size given by the rect().
|
noexcept |
Gets the output size in buffer units.
This method returns the size of the output in buffer units, based on its current mode.
|
noexcept |
Retrieves the real destination buffer size.
This method returns the size in pixels of the destination framebuffer during a paintGL() event.
Unlike sizeB(), the width and height are not swapped if transform() includes a 90° rotation.
Additionally, when using oversampling and a fractional scale, it returns the actual size of the intermediary "oversampled" framebuffer, rather than the "fake" buffer size provided by sizeB().
|
noexcept |
Gets the physical dimensions of the output.
This method retrieves the physical dimensions of the output in millimeters.
|
noexcept |
Screen capture requests.
This vector contains all LScreenshotRequest s that should be handled during a paintGL() event.
|
noexcept |
The content type hint set with setContentType().
|
noexcept |
Sets the content type hint.
This hint is used by some hardware displays to properly adapt to the type of content being displayed.
For example, if the LContentTypeGame flag is set, a TV connected through an HDMI port may adapt to reduce latency.
The default value is LContentTypeNone.
Clients using the Content Type Hint protocol can also specify the type of content a given LSurface is displaying.
type | The content type hint to be set. |
|
noexcept |
Gets the output name.
This method retrieves the name of the output provided by the graphic backend, such as "HDMI-A-2."
|
noexcept |
Gets the output model name.
This method retrieves the model name of the output provided by the graphic backend.
|
noexcept |
Gets the manufacturer name of the output.
This method retrieves the manufacturer name of the output provided by the graphic backend.
|
noexcept |
Gets the description of the output.
This method retrieves the description of the output provided by the graphic backend.
|
noexcept |
Gets the ID of the rendering thread.
This method retrieves the ID of the output rendering thread.
|
virtual |
Initialize Event.
The initializeGL() event is invoked after the output is properly initialized.
|
virtual |
Paint Event.
The paintGL() event is invoked after unlocking the rendering thread with repaint().
All rendering operations performed here will be displayed later on screen after the backend performs a page flip.
|
virtual |
Resize Event.
The resizeGL() event is invoked when the output scale or mode changes.
|
virtual |
|
virtual |
Uninitialize Event.
The uninitializeGL() event is invoked after the output is removed from the compositor with LCompositor::removeOutput() or when the output is unplugged, see LSeat::outputUnplugged().
Here you should free your shaders, programs, textures, etc.
|
virtual |
Set gamma table request.
Clients using the wlr gamma control protocol can request to set the gamma table for an output.
The gamma table (when is not nullptr
) always have a size equal to gammaSize(), hence, it is not necessary to validate that.
client | Pointer to the client making the request. |
gamma | Pointer to the LGammaTable object containing the requested gamma table or nullptr to restore the default table. |
|
virtual |
Notifies a change in availableGeometry().
This event is triggered whenever one of the exclusiveZones() changes.
The default implementation adjusts and reconfigures mapped LToplevelRole surfaces to prevent occlusion of the exclusive zone on each edge.