Иерархическое рисование
Во время фазы рисования GTK получает единственный сигнал “render” на поверхностном элементе верхнего уровня. Обработчик сигнала создаст объект снимка (который является вспомогательным средством для создания графа сцены) и вызовет метод GtkWidget::snapshot() vfunc, который будет распространяться вниз по иерархии виджетов. Это позволяет каждому виджету запечатлеть своё содержимое в нужном месте и в нужное время, правильно обрабатывая такие вещи, как частичная прозрачность и перекрывающиеся виджеты.
Во время создания снимка каждого виджета GTK автоматически обрабатывает рендеринг CSS в соответствии с моделью CSS-блока. Сначала он создаёт снимок фона, затем границы, затем содержимого самого виджета и, наконец, контура.
Для того чтобы избежать излишней работы при генерации графов сцены, GTK кэширует узлы рендеринга. Каждый виджет хранит ссылку на свой узел рендеринга (который в свою очередь будет ссылаться на узлы рендеринга дочерних элементов, внуков и так далее) и повторно использует этот узел во время фазы рисования. Отключение виджета (путем вызова gtk_widget_queue_draw()) удаляет кэшированный узел рендеринга, заставляя виджет перегенерировать его в следующий раз, когда ему потребуется создать снимок.
© 2005–2020 The GNOME Project
Licensed under the GNU Lesser General Public License version 2.1 or later.
https://developer-old.gnome.org/gtk4/4.0/hierarchical-drawing.html