| // Copyright 2014 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. |
| |
| #include "my_texture.h" |
| |
| // An object that generates a texture for Flutter. |
| struct _MyTexture { |
| FlPixelBufferTexture parent_instance; |
| |
| // Dimensions of texture. |
| uint32_t width; |
| uint32_t height; |
| |
| // Buffer used to store texture. |
| uint8_t* buffer; |
| }; |
| |
| G_DEFINE_TYPE(MyTexture, my_texture, fl_pixel_buffer_texture_get_type()) |
| |
| // Implements GObject::dispose. |
| static void my_texture_dispose(GObject* object) { |
| MyTexture* self = MY_TEXTURE(object); |
| |
| free(self->buffer); |
| |
| G_OBJECT_CLASS(my_texture_parent_class)->dispose(object); |
| } |
| |
| // Implements FlPixelBufferTexture::copy_pixels. |
| static gboolean my_texture_copy_pixels(FlPixelBufferTexture* texture, |
| const uint8_t** out_buffer, |
| uint32_t* width, uint32_t* height, |
| GError** error) { |
| MyTexture* self = MY_TEXTURE(texture); |
| *out_buffer = self->buffer; |
| *width = self->width; |
| *height = self->height; |
| return TRUE; |
| } |
| |
| static void my_texture_class_init(MyTextureClass* klass) { |
| G_OBJECT_CLASS(klass)->dispose = my_texture_dispose; |
| FL_PIXEL_BUFFER_TEXTURE_CLASS(klass)->copy_pixels = my_texture_copy_pixels; |
| } |
| |
| static void my_texture_init(MyTexture* self) {} |
| |
| MyTexture* my_texture_new(uint32_t width, uint32_t height, uint8_t r, uint8_t g, |
| uint8_t b) { |
| MyTexture* self = MY_TEXTURE(g_object_new(my_texture_get_type(), nullptr)); |
| self->width = width; |
| self->height = height; |
| self->buffer = static_cast<uint8_t*>(malloc(self->width * self->height * 4)); |
| my_texture_set_color(self, r, g, b); |
| return self; |
| } |
| |
| // Draws the texture with the requested color. |
| void my_texture_set_color(MyTexture* self, uint8_t r, uint8_t g, uint8_t b) { |
| g_return_if_fail(MY_IS_TEXTURE(self)); |
| |
| for (size_t y = 0; y < self->height; y++) { |
| for (size_t x = 0; x < self->width; x++) { |
| uint8_t* pixel = self->buffer + (y * self->width * 4) + (x * 4); |
| pixel[0] = r; |
| pixel[1] = g; |
| pixel[2] = b; |
| pixel[3] = 255; |
| } |
| } |
| } |