mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2026-04-19 02:10:26 +00:00
Ensure AccumulatedVisualContext stays synchronized when CSS transform properties change. AccumulatedVisualContext copies transform and perspective matrices from the paintable tree at assignment time. When CSS properties that affect these matrices change (transform, rotate, scale, translate, perspective, transform-origin, perspective-origin), we must rebuild the AccumulatedVisualContext tree to reflect the new values. This adds a rebuild_accumulated_visual_contexts flag to style invalidation that triggers a full rebuild during the next paint. Note: The current invalidation strategy is inefficient - it rebuilds the entire tree even for single-element transform changes. This could be improved by patching the AccumulatedVisualContext node in-place with updated matrices, but only when the transform doesn't transition from/to none (which would change the tree structure). This optimization is left for future work.
36 lines
1.4 KiB
C++
36 lines
1.4 KiB
C++
/*
|
|
* Copyright (c) 2024, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibWeb/Forward.h>
|
|
|
|
namespace Web::CSS {
|
|
|
|
struct RequiredInvalidationAfterStyleChange {
|
|
bool repaint : 1 { false };
|
|
bool rebuild_stacking_context_tree : 1 { false };
|
|
bool relayout : 1 { false };
|
|
bool rebuild_layout_tree : 1 { false };
|
|
bool rebuild_accumulated_visual_contexts : 1 { false };
|
|
|
|
void operator|=(RequiredInvalidationAfterStyleChange const& other)
|
|
{
|
|
repaint |= other.repaint;
|
|
rebuild_stacking_context_tree |= other.rebuild_stacking_context_tree;
|
|
relayout |= other.relayout;
|
|
rebuild_layout_tree |= other.rebuild_layout_tree;
|
|
rebuild_accumulated_visual_contexts |= other.rebuild_accumulated_visual_contexts;
|
|
}
|
|
|
|
[[nodiscard]] bool is_none() const { return !repaint && !rebuild_stacking_context_tree && !relayout && !rebuild_layout_tree && !rebuild_accumulated_visual_contexts; }
|
|
[[nodiscard]] bool is_full() const { return repaint && rebuild_stacking_context_tree && relayout && rebuild_layout_tree; }
|
|
static RequiredInvalidationAfterStyleChange full() { return { true, true, true, true, false }; }
|
|
};
|
|
|
|
RequiredInvalidationAfterStyleChange compute_property_invalidation(CSS::PropertyID property_id, RefPtr<StyleValue const> const& old_value, RefPtr<StyleValue const> const& new_value);
|
|
|
|
}
|