blob: d355bfd5659960ad477f246f3dd1193b5751f32a [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FLUTTER_SHELL_PLATFORM_LINUX_FL_RENDERER_H_
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_RENDERER_H_
#include <EGL/egl.h>
#include <gtk/gtk.h>
#include "flutter/shell/platform/linux/public/flutter_linux/fl_dart_project.h"
G_BEGIN_DECLS
/**
* FlRendererError:
* Errors for #FlRenderer objects to set on failures.
*/
typedef enum {
FL_RENDERER_ERROR_FAILED,
} FlRendererError;
GQuark fl_renderer_error_quark(void) G_GNUC_CONST;
G_DECLARE_DERIVABLE_TYPE(FlRenderer, fl_renderer, FL, RENDERER, GObject)
/**
* FlRenderer:
*
* #FlRenderer is an abstract class that allows Flutter to draw pixels.
*/
struct _FlRendererClass {
GObjectClass parent_class;
// Virtual method called to get the visual that matches the given ID.
GdkVisual* (*get_visual)(FlRenderer* renderer,
GdkScreen* screen,
EGLint visual_id);
/**
* Virtual method called after a GDK window has been created.
* This is called once. Does not need to be implemented.
*/
void (*set_window)(FlRenderer* renderer, GdkWindow* window);
/**
* Virtual method to create a new EGL display.
*/
EGLDisplay (*create_display)(FlRenderer* renderer);
/**
* Virtual method called when Flutter needs surfaces to render to.
* @renderer: an #FlRenderer.
* @display: display to create surfaces on.
* @visible: (out): the visible surface that is created.
* @resource: (out): the resource surface that is created.
* @error: (allow-none): #GError location to store the error occurring, or
* %NULL to ignore.
*
* Returns: %TRUE if both surfaces were created, %FALSE if there was an error.
*/
gboolean (*create_surfaces)(FlRenderer* renderer,
EGLDisplay display,
EGLConfig config,
EGLSurface* visible,
EGLSurface* resource,
GError** error);
/**
* Virtual method called when the EGL window needs to be resized.
* Does not need to be implemented.
*/
void (*set_geometry)(FlRenderer* renderer,
GdkRectangle* geometry,
gint scale);
};
/**
* fl_renderer_setup:
* @renderer: an #FlRenderer.
* @error: (allow-none): #GError location to store the error occurring, or %NULL
* to ignore.
*
* Set up the renderer.
*
* Returns: %TRUE if successfully setup.
*/
gboolean fl_renderer_setup(FlRenderer* renderer, GError** error);
/**
* fl_renderer_get_visual:
* @renderer: an #FlRenderer.
* @screen: the screen being rendered on.
* @error: (allow-none): #GError location to store the error occurring, or %NULL
* to ignore.
*
* Gets the visual required to render on.
*
* Returns: a #GdkVisual.
*/
GdkVisual* fl_renderer_get_visual(FlRenderer* renderer,
GdkScreen* screen,
GError** error);
/**
* fl_renderer_set_window:
* @renderer: an #FlRenderer.
* @window: the GDK Window this renderer will render to.
*
* Set the window this renderer will use.
*/
void fl_renderer_set_window(FlRenderer* renderer, GdkWindow* window);
/**
* fl_renderer_start:
* @renderer: an #FlRenderer.
* @error: (allow-none): #GError location to store the error occurring, or %NULL
* to ignore.
*
* Start the renderer.
*
* Returns: %TRUE if successfully started.
*/
gboolean fl_renderer_start(FlRenderer* renderer, GError** error);
/**
* fl_renderer_set_geometry:
* @renderer: an #FlRenderer.
* @geometry: New size and position (unscaled) of the EGL window.
* @scale: Scale of the window.
*/
void fl_renderer_set_geometry(FlRenderer* renderer,
GdkRectangle* geometry,
gint scale);
/**
* fl_renderer_get_proc_address:
* @renderer: an #FlRenderer.
* @name: a function name.
*
* Gets the rendering API function that matches the given name.
*
* Returns: a function pointer.
*/
void* fl_renderer_get_proc_address(FlRenderer* renderer, const char* name);
/**
* fl_renderer_make_current:
* @renderer: an #FlRenderer.
* @error: (allow-none): #GError location to store the error occurring, or %NULL
* to ignore.
*
* Makes the rendering context current.
*
* Returns %TRUE if successful.
*/
gboolean fl_renderer_make_current(FlRenderer* renderer, GError** error);
/**
* fl_renderer_make_resource_current:
* @renderer: an #FlRenderer.
* @error: (allow-none): #GError location to store the error occurring, or %NULL
* to ignore.
*
* Makes the resource rendering context current.
*
* Returns %TRUE if successful.
*/
gboolean fl_renderer_make_resource_current(FlRenderer* renderer,
GError** error);
/**
* fl_renderer_clear_current:
* @renderer: an #FlRenderer.
* @error: (allow-none): #GError location to store the error occurring, or %NULL
* to ignore.
*
* Clears the current rendering context.
*
* Returns %TRUE if successful.
*/
gboolean fl_renderer_clear_current(FlRenderer* renderer, GError** error);
/**
* fl_renderer_get_fbo:
* @renderer: an #FlRenderer.
*
* Gets the frame buffer object to render to.
*
* Returns: a frame buffer object index.
*/
guint32 fl_renderer_get_fbo(FlRenderer* renderer);
/**
* fl_renderer_present:
* @renderer: an #FlRenderer.
* @error: (allow-none): #GError location to store the error occurring, or %NULL
* to ignore.
*
* Presents the current frame.
*
* Returns %TRUE if successful.
*/
gboolean fl_renderer_present(FlRenderer* renderer, GError** error);
G_END_DECLS
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_RENDERER_H_