mirror of
https://github.com/flutter/flutter.git
synced 2026-01-17 11:02:24 +08:00
73 lines
2.2 KiB
C++
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;
|
|
}
|
|
}
|
|
}
|