// 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_PUBLIC_FLUTTER_LINUX_FL_PIXEL_BUFFER_TEXTURE_H_ #define FLUTTER_SHELL_PLATFORM_LINUX_PUBLIC_FLUTTER_LINUX_FL_PIXEL_BUFFER_TEXTURE_H_ #if !defined(__FLUTTER_LINUX_INSIDE__) && !defined(FLUTTER_LINUX_COMPILATION) #error "Only can be included directly." #endif #include #include "fl_texture.h" G_BEGIN_DECLS G_MODULE_EXPORT G_DECLARE_DERIVABLE_TYPE(FlPixelBufferTexture, fl_pixel_buffer_texture, FL, PIXEL_BUFFER_TEXTURE, GObject) /** * FlPixelBufferTexture: * * #FlPixelBufferTexture represents an OpenGL texture generated from a pixel * buffer. * * The following example shows how to implement an #FlPixelBufferTexture. * ![ * struct _MyTexture { * FlPixelBufferTexture parent_instance; * * uint8_t *buffer; // your pixel buffer. * } * * G_DEFINE_TYPE(MyTexture, * my_texture, * fl_pixel_buffer_texture_get_type ()) * * static gboolean * my_texture_copy_pixels (FlPixelBufferTexture* texture, * const uint8_t** out_buffer, * uint32_t* width, * uint32_t* height, * GError** error) { * // This method is called on Render Thread. Be careful with your * // cross-thread operation. * * // @width and @height are initially stored the canvas size in Flutter. * * // You must prepare your pixel buffer in RGBA format. * // So you may do some format conversion first if your original pixel * // buffer is not in RGBA format. * manage_your_pixel_buffer_here (); * * if (your_operations_are_successfully_finished) { * // Directly return pointer to your pixel buffer here. * // Flutter takes content of your pixel buffer after this function * // is finished. So you must make the buffer live long enough until * // next tick of Render Thread. * // If it is hard to manage lifetime of your pixel buffer, you should * // take look into #FlTextureGL. * * *out_buffer = buffer; * *width = real_width_of_buffer; * *height = real_height_of_buffer; * return TRUE; * } else { * // set @error to report failure. * return FALSE; * } * } * * static void my_texture_class_init(MyTextureClass* klass) { * FL_PIXEL_BUFFER_TEXTURE_CLASS(klass)->copy_pixels = * my_texture_copy_pixels; * } * * static void my_texture_init(MyTexture* self) {} * ]| */ struct _FlPixelBufferTextureClass { GObjectClass parent_class; /** * FlPixelBufferTexture::copy_pixels: * @texture: an #FlPixelBufferTexture. * @buffer: (out): pixel data. * @width: (inout): width of the texture in pixels. * @height: (inout): height of the texture in pixels. * @error: (allow-none): #GError location to store the error occurring, or * %NULL to ignore. * * Retrieve pixel buffer in RGBA format. * * As this method is usually invoked from the render thread, you must * take care of proper synchronization. It also needs to be ensured that * the returned buffer is not released prior to unregistering this texture. * * Returns: %TRUE on success. */ gboolean (*copy_pixels)(FlPixelBufferTexture* texture, const uint8_t** buffer, uint32_t* width, uint32_t* height, GError** error); }; G_END_DECLS #endif // FLUTTER_SHELL_PLATFORM_LINUX_PUBLIC_FLUTTER_LINUX_FL_PIXEL_BUFFER_TEXTURE_H_