34 fl_view_renderer_software,
35 fl_view_renderer_get_type())
38static gboolean redraw_cb(gpointer
user_data) {
41 if (
self->compositor ==
nullptr) {
42 return G_SOURCE_REMOVE;
49 GtkWidget* render_widget = GTK_WIDGET(
self);
50 GtkAllocation allocation;
53 size_t width = allocation.width * scale_factor;
54 size_t height = allocation.height * scale_factor;
55 size_t frame_width, frame_height;
57 g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&
self->frame_mutex);
61 gboolean frame_size_matches =
width == frame_width &&
height == frame_height;
62 if (
self->sized_to_content && !frame_size_matches) {
63 gtk_widget_set_size_request(render_widget, frame_width / scale_factor,
64 frame_height / scale_factor);
66 if (GTK_IS_WINDOW(toplevel)) {
71 return G_SOURCE_REMOVE;
76 return G_SOURCE_REMOVE;
89 size_t frame_width, frame_height;
92 if (frame_width ==
width && frame_height ==
height) {
96 if (g_get_monotonic_time() > expiry_time) {
98 "Timed out waiting for software frame of size %zdx%zd (have "
104 g_mutex_unlock(&
self->frame_mutex);
106 g_mutex_lock(&
self->frame_mutex);
112 FlViewRendererSoftware*
self = FL_VIEW_RENDERER_SOFTWARE(widget);
114 GTK_WIDGET_CLASS(fl_view_renderer_software_parent_class)->realize(widget);
123 FlViewRendererSoftware*
self = FL_VIEW_RENDERER_SOFTWARE(widget);
129 if (
self->compositor ==
nullptr) {
136 g_mutex_lock(&
self->frame_mutex);
139 if (!
self->sized_to_content) {
146 g_mutex_unlock(&
self->frame_mutex);
153 FlViewRenderer* renderer,
156 FlViewRendererSoftware*
self = FL_VIEW_RENDERER_SOFTWARE(renderer);
160 if (
self->compositor ==
nullptr) {
164 g_mutex_lock(&
self->frame_mutex);
167 g_mutex_unlock(&
self->frame_mutex);
173 g_idle_add(redraw_cb, g_object_ref(
self));
177 FlViewRendererSoftware*
self = FL_VIEW_RENDERER_SOFTWARE(
object);
179 g_clear_object(&
self->engine);
180 g_clear_object(&
self->task_runner);
181 g_mutex_clear(&
self->frame_mutex);
183 G_OBJECT_CLASS(fl_view_renderer_software_parent_class)->dispose(
object);
187 FlViewRendererSoftware*
self = FL_VIEW_RENDERER_SOFTWARE(
object);
194 g_clear_object(&
self->compositor);
196 G_OBJECT_CLASS(fl_view_renderer_software_parent_class)->finalize(
object);
200 FlViewRendererSoftwareClass* klass) {
201 GObjectClass* object_class = G_OBJECT_CLASS(klass);
205 GtkWidgetClass* widget_class = GTK_WIDGET_CLASS(klass);
209 FlViewRendererClass* renderer_class = FL_VIEW_RENDERER_CLASS(klass);
214 g_mutex_init(&
self->frame_mutex);
220 g_return_val_if_fail(FL_IS_ENGINE(
engine),
nullptr);
222 FlViewRendererSoftware*
self = FL_VIEW_RENDERER_SOFTWARE(
223 g_object_new(fl_view_renderer_software_get_type(),
nullptr));
224 self->engine = FL_ENGINE(g_object_ref(
engine));
g_autoptr(FlEngine) engine
gboolean fl_compositor_software_render(FlCompositorSoftware *self, cairo_t *cr, gint scale_factor)
FlCompositorSoftware * fl_compositor_software_new()
void fl_compositor_software_get_frame_size(FlCompositorSoftware *self, size_t *width, size_t *height)
gboolean fl_compositor_software_composite_layers(FlCompositorSoftware *self, const FlutterLayer **layers, size_t layers_count)
FlTaskRunner * fl_engine_get_task_runner(FlEngine *self)
void fl_task_runner_stop_wait(FlTaskRunner *self)
void fl_task_runner_wait(FlTaskRunner *self, gint64 expiry_time)
const FlutterLayer size_t layers_count
const FlutterLayer ** layers
void fl_view_renderer_notify_frame(FlViewRenderer *self)
void fl_view_renderer_paint_background(FlViewRenderer *self, cairo_t *cr)
G_BEGIN_DECLS gboolean sized_to_content
static gboolean fl_view_renderer_software_draw(GtkWidget *widget, cairo_t *cr)
FlViewRendererSoftware * fl_view_renderer_software_new(FlEngine *engine, gboolean sized_to_content)
static void wait_for_frame(FlViewRendererSoftware *self, GdkWindow *window, gint scale_factor)
static void fl_view_renderer_software_class_init(FlViewRendererSoftwareClass *klass)
static void fl_view_renderer_software_realize(GtkWidget *widget)
static void fl_view_renderer_software_finalize(GObject *object)
static void fl_view_renderer_software_present_layers(FlViewRenderer *renderer, const FlutterLayer **layers, size_t layers_count)
static constexpr gint64 kRenderTimeoutMicroseconds
G_DEFINE_TYPE(FlViewRendererSoftware, fl_view_renderer_software, fl_view_renderer_get_type()) static gboolean redraw_cb(gpointer user_data)
static void fl_view_renderer_software_dispose(GObject *object)
static void fl_view_renderer_software_init(FlViewRendererSoftware *self)
void gtk_widget_queue_draw(GtkWidget *widget)
void gtk_window_resize(GtkWindow *window, gint width, gint height)
int gdk_window_get_width(GdkWindow *window)
void gtk_widget_get_allocation(GtkWidget *widget, GtkAllocation *allocation)
gint gdk_window_get_scale_factor(GdkWindow *window)
int gdk_window_get_height(GdkWindow *window)
GtkWidget * gtk_widget_get_toplevel(GtkWidget *widget)
GdkWindow * gtk_widget_get_window(GtkWidget *widget)
gint gtk_widget_get_scale_factor(GtkWidget *widget)
FlViewRenderer parent_instance
FlTaskRunner * task_runner
gboolean sized_to_content
FlCompositorSoftware * compositor