flutter/examples/texture/linux/my_texture.cc
Robert Ancell 9760bb0cf0
Add an example showing how to use textures (#122779)
There didn't seem to be any examples on how to do this.

I've only shown the Linux implementation, others may want to follow this
PR up with support for other platforms.
2023-07-03 13:54:18 +12:00

73 lines
2.2 KiB
C++

// 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;
}
}
}